QUIC TXP: Refactor status output to use an extensible structure
authorHugo Landau <hlandau@openssl.org>
Tue, 23 May 2023 11:23:05 +0000 (12:23 +0100)
committerPauli <pauli@openssl.org>
Thu, 15 Jun 2023 23:26:27 +0000 (09:26 +1000)
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)

include/internal/quic_txp.h
ssl/quic/quic_channel.c
ssl/quic/quic_txp.c
test/quic_txp_test.c

index b8740f5440573d6271b2a224e36c729988f16050..db95b293078e9fcfb48ae6ad043e4ce5e3cfdb2f 100644 (file)
@@ -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
index 16b52861a8df763a0f83c3b6d7c86af435bca757..596dc2c36ea6e86976c44de6af570998923c9b8d 100644 (file)
@@ -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;
         }
index 24a123d1169fc8c2448eb65f09c491b325996a54..8626ac457655854df712e2cbdc5847a413a9d8a5 100644 (file)
@@ -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);
index 7842486a3f0a8bb0b044b5311627b1d2299caa5d..8da1b05128c1cca40dc95c9a3b1c8d83887cbb00 100644 (file)
@@ -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;