* Returns TX_PACKETISER_RES_FAILURE on failure (e.g. allocation error),
* TX_PACKETISER_RES_NO_PKT if no packets were sent (e.g. because nothing wants
* to send anything), and TX_PACKETISER_RES_SENT_PKT if packets were sent.
+ *
+ * If an ACK-eliciting packet was sent, 1 is written to *sent_ack_eliciting,
+ * otherwise *sent_ack_eliciting is unchanged.
*/
#define TX_PACKETISER_RES_FAILURE 0
#define TX_PACKETISER_RES_NO_PKT 1
#define TX_PACKETISER_RES_SENT_PKT 2
int ossl_quic_tx_packetiser_generate(OSSL_QUIC_TX_PACKETISER *txp,
- uint32_t archetype);
+ uint32_t archetype,
+ int *sent_ack_eliciting);
/*
* Returns 1 if one or more packets would be generated if
int cc_can_send,
int is_last_in_dgram,
int dgram_contains_initial,
- int chosen_for_conn_close);
+ int chosen_for_conn_close,
+ int *sent_ack_eliciting);
static size_t txp_determine_pn_len(OSSL_QUIC_TX_PACKETISER *txp);
static int txp_determine_ppl_from_pl(OSSL_QUIC_TX_PACKETISER *txp,
size_t pl,
size_t max_ppl,
size_t pkt_overhead,
QUIC_PKT_HDR *phdr,
- int chosen_for_conn_close);
+ int chosen_for_conn_close,
+ int *sent_ack_eliciting);
OSSL_QUIC_TX_PACKETISER *ossl_quic_tx_packetiser_new(const OSSL_QUIC_TX_PACKETISER_ARGS *args)
{
* any ELs which do.
*/
int ossl_quic_tx_packetiser_generate(OSSL_QUIC_TX_PACKETISER *txp,
- uint32_t archetype)
+ uint32_t archetype,
+ int *sent_ack_eliciting)
{
uint32_t enc_level, conn_close_enc_level = QUIC_ENC_LEVEL_NUM;
int have_pkt_for_el[QUIC_ENC_LEVEL_NUM], is_last_in_dgram, cc_can_send;
rc = txp_generate_for_el(txp, enc_level, archetype, cc_can_send,
is_last_in_dgram,
have_pkt_for_el[QUIC_ENC_LEVEL_INITIAL],
- enc_level == conn_close_enc_level);
+ enc_level == conn_close_enc_level,
+ sent_ack_eliciting);
if (rc != TXP_ERR_SUCCESS) {
/*
int cc_can_send,
int is_last_in_dgram,
int dgram_contains_initial,
- int chosen_for_conn_close)
+ int chosen_for_conn_close,
+ int *sent_ack_eliciting)
{
int must_pad = dgram_contains_initial && is_last_in_dgram;
size_t min_dpl, min_pl, min_ppl, cmpl, cmppl, running_total;
return txp_generate_for_el_actual(txp, enc_level, archetype, min_ppl, cmppl,
pkt_overhead, &phdr,
- chosen_for_conn_close);
+ chosen_for_conn_close,
+ sent_ack_eliciting);
}
/* Determine how many bytes we should use for the encoded PN. */
size_t max_ppl,
size_t pkt_overhead,
QUIC_PKT_HDR *phdr,
- int chosen_for_conn_close)
+ int chosen_for_conn_close,
+ int *sent_ack_eliciting)
{
int rc = TXP_ERR_SUCCESS;
struct archetype_data a;
--probe_info->pto[pn_space];
}
+ if (have_ack_eliciting)
+ *sent_ack_eliciting = 1;
+
/* Done. */
tx_helper_cleanup(&h);
return rc;
static int run_script(const struct script_op *script)
{
- int testresult = 0, have_helper = 0;
+ int testresult = 0, have_helper = 0, sent_ack_eliciting = 0;
struct helper h;
const struct script_op *op;
for (op = script; op->opcode != OPK_END; ++op) {
switch (op->opcode) {
case OPK_TXP_GENERATE:
- if (!TEST_int_eq(ossl_quic_tx_packetiser_generate(h.txp, (int)op->arg0),
+ if (!TEST_int_eq(ossl_quic_tx_packetiser_generate(h.txp, (int)op->arg0,
+ &sent_ack_eliciting),
TX_PACKETISER_RES_SENT_PKT))
goto err;
ossl_qtx_flush_net(h.args.qtx);
break;
case OPK_TXP_GENERATE_NONE:
- if (!TEST_int_eq(ossl_quic_tx_packetiser_generate(h.txp, (int)op->arg0),
+ if (!TEST_int_eq(ossl_quic_tx_packetiser_generate(h.txp, (int)op->arg0,
+ &sent_ack_eliciting),
TX_PACKETISER_RES_NO_PKT))
goto err;