summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHugo Landau <hlandau@openssl.org>2023-05-23 12:23:05 +0100
committerPauli <pauli@openssl.org>2023-06-16 09:26:27 +1000
commita3a51d6ec38a8c2fd88e7c64c2f21632e55cbbdf (patch)
tree9137e77960adfbce0c63d39ebbec2ed068eabfea
parent81b400cf900c530e170a1488222191c5568f6b2d (diff)
QUIC TXP: Refactor status output to use an extensible structure
Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Paul Dale <pauli@openssl.org> (Merged from https://github.com/openssl/openssl/pull/21029)
-rw-r--r--include/internal/quic_txp.h11
-rw-r--r--ssl/quic/quic_channel.c6
-rw-r--r--ssl/quic/quic_txp.c19
-rw-r--r--test/quic_txp_test.c7
4 files changed, 25 insertions, 18 deletions
diff --git a/include/internal/quic_txp.h b/include/internal/quic_txp.h
index b8740f5440..db95b29307 100644
--- a/include/internal/quic_txp.h
+++ b/include/internal/quic_txp.h
@@ -84,15 +84,20 @@ void ossl_quic_tx_packetiser_free(OSSL_QUIC_TX_PACKETISER *txp);
* 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.
+ * *status is filled with status information about the generated packet, if any.
+ * See QUIC_TXP_STATUS for details.
*/
#define TX_PACKETISER_RES_FAILURE 0
#define TX_PACKETISER_RES_NO_PKT 1
#define TX_PACKETISER_RES_SENT_PKT 2
+
+typedef struct quic_txp_status_st {
+ int sent_ack_eliciting; /* Was an ACK-eliciting packet sent? */
+} QUIC_TXP_STATUS;
+
int ossl_quic_tx_packetiser_generate(OSSL_QUIC_TX_PACKETISER *txp,
uint32_t archetype,
- int *sent_ack_eliciting);
+ QUIC_TXP_STATUS *status);
/*
* Returns 1 if one or more packets would be generated if
diff --git a/ssl/quic/quic_channel.c b/ssl/quic/quic_channel.c
index 16b52861a8..596dc2c36e 100644
--- a/ssl/quic/quic_channel.c
+++ b/ssl/quic/quic_channel.c
@@ -1640,7 +1640,7 @@ undesirable:
/* Try to generate packets and if possible, flush them to the network. */
static int ch_tx(QUIC_CHANNEL *ch)
{
- int sent_ack_eliciting = 0;
+ QUIC_TXP_STATUS status;
if (ch->state == QUIC_CHANNEL_STATE_TERMINATING_CLOSING) {
/*
@@ -1664,7 +1664,7 @@ static int ch_tx(QUIC_CHANNEL *ch)
*/
switch (ossl_quic_tx_packetiser_generate(ch->txp,
TX_PACKETISER_ARCHETYPE_NORMAL,
- &sent_ack_eliciting)) {
+ &status)) {
case TX_PACKETISER_RES_SENT_PKT:
ch->have_sent_any_pkt = 1; /* Packet was sent */
@@ -1673,7 +1673,7 @@ static int ch_tx(QUIC_CHANNEL *ch)
* sending an ack-eliciting packet if no other ack-eliciting packets
* have been sent since last receiving and processing a packet.'
*/
- if (sent_ack_eliciting && !ch->have_sent_ack_eliciting_since_rx) {
+ if (status.sent_ack_eliciting && !ch->have_sent_ack_eliciting_since_rx) {
ch_update_idle(ch);
ch->have_sent_ack_eliciting_since_rx = 1;
}
diff --git a/ssl/quic/quic_txp.c b/ssl/quic/quic_txp.c
index 24a123d116..8626ac4576 100644
--- a/ssl/quic/quic_txp.c
+++ b/ssl/quic/quic_txp.c
@@ -352,7 +352,7 @@ static int txp_generate_for_el(OSSL_QUIC_TX_PACKETISER *txp, uint32_t enc_level,
int is_last_in_dgram,
int dgram_contains_initial,
int chosen_for_conn_close,
- int *sent_ack_eliciting);
+ QUIC_TXP_STATUS *status);
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,
@@ -368,7 +368,7 @@ static int txp_generate_for_el_actual(OSSL_QUIC_TX_PACKETISER *txp,
size_t pkt_overhead,
QUIC_PKT_HDR *phdr,
int chosen_for_conn_close,
- int *sent_ack_eliciting);
+ QUIC_TXP_STATUS *status);
OSSL_QUIC_TX_PACKETISER *ossl_quic_tx_packetiser_new(const OSSL_QUIC_TX_PACKETISER_ARGS *args)
{
@@ -538,13 +538,15 @@ int ossl_quic_tx_packetiser_has_pending(OSSL_QUIC_TX_PACKETISER *txp,
*/
int ossl_quic_tx_packetiser_generate(OSSL_QUIC_TX_PACKETISER *txp,
uint32_t archetype,
- int *sent_ack_eliciting)
+ QUIC_TXP_STATUS *status)
{
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;
size_t num_el_in_dgram = 0, pkts_done = 0;
int rc;
+ status->sent_ack_eliciting = 0;
+
/*
* If CC says we cannot send we still may be able to send any queued probes.
*/
@@ -580,7 +582,7 @@ int ossl_quic_tx_packetiser_generate(OSSL_QUIC_TX_PACKETISER *txp,
is_last_in_dgram,
have_pkt_for_el[QUIC_ENC_LEVEL_INITIAL],
enc_level == conn_close_enc_level,
- sent_ack_eliciting);
+ status);
if (rc != TXP_ERR_SUCCESS) {
/*
@@ -934,7 +936,7 @@ static int txp_generate_for_el(OSSL_QUIC_TX_PACKETISER *txp, uint32_t enc_level,
int is_last_in_dgram,
int dgram_contains_initial,
int chosen_for_conn_close,
- int *sent_ack_eliciting)
+ QUIC_TXP_STATUS *status)
{
int must_pad = dgram_contains_initial && is_last_in_dgram;
size_t min_dpl, min_pl, min_ppl, cmpl, cmppl, running_total;
@@ -1047,7 +1049,7 @@ static int txp_generate_for_el(OSSL_QUIC_TX_PACKETISER *txp, uint32_t enc_level,
return txp_generate_for_el_actual(txp, enc_level, archetype, min_ppl, cmppl,
pkt_overhead, &phdr,
chosen_for_conn_close,
- sent_ack_eliciting);
+ status);
}
/* Determine how many bytes we should use for the encoded PN. */
@@ -1896,7 +1898,7 @@ static int txp_generate_for_el_actual(OSSL_QUIC_TX_PACKETISER *txp,
size_t pkt_overhead,
QUIC_PKT_HDR *phdr,
int chosen_for_conn_close,
- int *sent_ack_eliciting)
+ QUIC_TXP_STATUS *status)
{
int rc = TXP_ERR_SUCCESS;
struct archetype_data a;
@@ -2314,8 +2316,7 @@ static int txp_generate_for_el_actual(OSSL_QUIC_TX_PACKETISER *txp,
--probe_info->pto[pn_space];
}
- if (have_ack_eliciting)
- *sent_ack_eliciting = 1;
+ status->sent_ack_eliciting = 1;
/* Done. */
tx_helper_cleanup(&h);
diff --git a/test/quic_txp_test.c b/test/quic_txp_test.c
index 7842486a3f..8da1b05128 100644
--- a/test/quic_txp_test.c
+++ b/test/quic_txp_test.c
@@ -1227,7 +1227,8 @@ static void skip_padding(struct helper *h)
static int run_script(const struct script_op *script)
{
- int testresult = 0, have_helper = 0, sent_ack_eliciting = 0;
+ int testresult = 0, have_helper = 0;
+ QUIC_TXP_STATUS status;
struct helper h;
const struct script_op *op;
@@ -1239,7 +1240,7 @@ static int run_script(const struct script_op *script)
switch (op->opcode) {
case OPK_TXP_GENERATE:
if (!TEST_int_eq(ossl_quic_tx_packetiser_generate(h.txp, (int)op->arg0,
- &sent_ack_eliciting),
+ &status),
TX_PACKETISER_RES_SENT_PKT))
goto err;
@@ -1248,7 +1249,7 @@ static int run_script(const struct script_op *script)
break;
case OPK_TXP_GENERATE_NONE:
if (!TEST_int_eq(ossl_quic_tx_packetiser_generate(h.txp, (int)op->arg0,
- &sent_ack_eliciting),
+ &status),
TX_PACKETISER_RES_NO_PKT))
goto err;