]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
QUIC CFQ Fixes
authorHugo Landau <hlandau@openssl.org>
Wed, 12 Oct 2022 16:44:40 +0000 (17:44 +0100)
committerHugo Landau <hlandau@openssl.org>
Mon, 7 Nov 2022 18:18:34 +0000 (18:18 +0000)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/19206)

include/internal/quic_cfq.h
include/internal/quic_txpim.h
ssl/quic/quic_cfq.c
ssl/quic/quic_txpim.c
test/quic_cfq_test.c

index d5ac37ae43d868470163770f64cfb958eda2bc8a..c7239d87df04a5ce3a4eaf1a2abff0fdc67a39c9 100644 (file)
@@ -37,19 +37,19 @@ struct quic_cfq_item_st {
 #define QUIC_CFQ_STATE_TX       1
 
 /* Returns the frame type of a CFQ item. */
-uint64_t ossl_quic_cfq_item_get_frame_type(QUIC_CFQ_ITEM *item);
+uint64_t ossl_quic_cfq_item_get_frame_type(const QUIC_CFQ_ITEM *item);
 
 /* Returns a pointer to the encoded buffer of a CFQ item. */
-const unsigned char *ossl_quic_cfq_item_get_encoded(QUIC_CFQ_ITEM *item);
+const unsigned char *ossl_quic_cfq_item_get_encoded(const QUIC_CFQ_ITEM *item);
 
 /* Returns the length of the encoded buffer in bytes. */
-size_t ossl_quic_cfq_item_get_encoded_len(QUIC_CFQ_ITEM *item);
+size_t ossl_quic_cfq_item_get_encoded_len(const QUIC_CFQ_ITEM *item);
 
 /* Returns the CFQ item state, a QUIC_CFQ_STATE_* value. */
-int ossl_quic_cfq_item_get_state(QUIC_CFQ_ITEM *item);
+int ossl_quic_cfq_item_get_state(const QUIC_CFQ_ITEM *item);
 
 /* Returns the PN space for the CFQ item. */
-uint32_t ossl_quic_cfq_item_get_pn_space(QUIC_CFQ_ITEM *item);
+uint32_t ossl_quic_cfq_item_get_pn_space(const QUIC_CFQ_ITEM *item);
 
 /*
  * QUIC Control Frame Queue
@@ -126,7 +126,8 @@ void ossl_quic_cfq_release(QUIC_CFQ *cfq, QUIC_CFQ_ITEM *item);
  * Gets the highest priority CFQ item in the given PN space awaiting
  * transmission. If there are none, returns NULL.
  */
-QUIC_CFQ_ITEM *ossl_quic_cfq_get_priority_head(QUIC_CFQ *cfq, uint32_t pn_space);
+QUIC_CFQ_ITEM *ossl_quic_cfq_get_priority_head(const QUIC_CFQ *cfq,
+                                               uint32_t pn_space);
 
 /*
  * Given a CFQ item, gets the next CFQ item awaiting transmission in priority
@@ -134,7 +135,7 @@ QUIC_CFQ_ITEM *ossl_quic_cfq_get_priority_head(QUIC_CFQ *cfq, uint32_t pn_space)
  * ossl_quic_cfq_get_priority_head(), returns the next-lower priority item.
  * Returns NULL if the given item is the last item in priority order.
  */
-QUIC_CFQ_ITEM *ossl_quic_cfq_item_get_priority_next(QUIC_CFQ_ITEM *item,
+QUIC_CFQ_ITEM *ossl_quic_cfq_item_get_priority_next(const QUIC_CFQ_ITEM *item,
                                                     uint32_t pn_space);
 
 #endif
index 087d13363fb84588cd081b88958b36f245ef1bdf..bcc64943944e88bd227b9faa502be97fb70ee9f8 100644 (file)
@@ -99,18 +99,18 @@ void ossl_quic_txpim_pkt_add_cfq_item(QUIC_TXPIM_PKT *fpkt,
  *
  * The chunks are sorted by (stream_id, start) in ascending order.
  */
-const QUIC_TXPIM_CHUNK *ossl_quic_txpim_pkt_get_chunks(QUIC_TXPIM_PKT *fpkt);
+const QUIC_TXPIM_CHUNK *ossl_quic_txpim_pkt_get_chunks(const QUIC_TXPIM_PKT *fpkt);
 
 /*
  * Returns the number of entries in the array returned by
  * ossl_quic_txpim_pkt_get_chunks().
  */
-size_t ossl_quic_txpim_pkt_get_num_chunks(QUIC_TXPIM_PKT *fpkt);
+size_t ossl_quic_txpim_pkt_get_num_chunks(const QUIC_TXPIM_PKT *fpkt);
 
 /*
  * Returns the number of QUIC_TXPIM_PKTs allocated by the given TXPIM that have
  * yet to be returned to the TXPIM.
  */
-size_t ossl_quic_txpim_get_in_use(QUIC_TXPIM *txpim);
+size_t ossl_quic_txpim_get_in_use(const QUIC_TXPIM *txpim);
 
 #endif
index 0b0651289a52c32f50aa401eb26d04a2f898647f..54acbedce8810ac6df6c8f7977e11c61b410cc92 100644 (file)
@@ -20,38 +20,38 @@ struct quic_cfq_item_ex_st {
     uint64_t                frame_type;
     size_t                  encoded_len;
     uint32_t                priority, pn_space;
-    char                    state;
+    int                     state;
 };
 
-uint64_t ossl_quic_cfq_item_get_frame_type(QUIC_CFQ_ITEM *item)
+uint64_t ossl_quic_cfq_item_get_frame_type(const QUIC_CFQ_ITEM *item)
 {
     QUIC_CFQ_ITEM_EX *ex = (QUIC_CFQ_ITEM_EX *)item;
 
     return ex->frame_type;
 }
 
-const unsigned char *ossl_quic_cfq_item_get_encoded(QUIC_CFQ_ITEM *item)
+const unsigned char *ossl_quic_cfq_item_get_encoded(const QUIC_CFQ_ITEM *item)
 {
     QUIC_CFQ_ITEM_EX *ex = (QUIC_CFQ_ITEM_EX *)item;
 
     return ex->encoded;
 }
 
-size_t ossl_quic_cfq_item_get_encoded_len(QUIC_CFQ_ITEM *item)
+size_t ossl_quic_cfq_item_get_encoded_len(const QUIC_CFQ_ITEM *item)
 {
     QUIC_CFQ_ITEM_EX *ex = (QUIC_CFQ_ITEM_EX *)item;
 
     return ex->encoded_len;
 }
 
-int ossl_quic_cfq_item_get_state(QUIC_CFQ_ITEM *item)
+int ossl_quic_cfq_item_get_state(const QUIC_CFQ_ITEM *item)
 {
     QUIC_CFQ_ITEM_EX *ex = (QUIC_CFQ_ITEM_EX *)item;
 
     return ex->state;
 }
 
-uint32_t ossl_quic_cfq_item_get_pn_space(QUIC_CFQ_ITEM *item)
+uint32_t ossl_quic_cfq_item_get_pn_space(const QUIC_CFQ_ITEM *item)
 {
     QUIC_CFQ_ITEM_EX *ex = (QUIC_CFQ_ITEM_EX *)item;
 
@@ -161,6 +161,7 @@ static void list_insert_sorted(QUIC_CFQ_ITEM_LIST *l, QUIC_CFQ_ITEM_EX *n,
 QUIC_CFQ *ossl_quic_cfq_new(void)
 {
     QUIC_CFQ *cfq = OPENSSL_zalloc(sizeof(*cfq));
+
     if (cfq == NULL)
         return NULL;
 
@@ -297,6 +298,7 @@ void ossl_quic_cfq_mark_lost(QUIC_CFQ *cfq, QUIC_CFQ_ITEM *item,
 void ossl_quic_cfq_release(QUIC_CFQ *cfq, QUIC_CFQ_ITEM *item)
 {
     QUIC_CFQ_ITEM_EX *ex = (QUIC_CFQ_ITEM_EX *)item;
+
     switch (ex->state) {
     case QUIC_CFQ_STATE_NEW:
         list_remove(&cfq->new_list, ex);
@@ -314,19 +316,20 @@ void ossl_quic_cfq_release(QUIC_CFQ *cfq, QUIC_CFQ_ITEM *item)
     }
 }
 
-QUIC_CFQ_ITEM *ossl_quic_cfq_get_priority_head(QUIC_CFQ *cfq, uint32_t pn_space)
+QUIC_CFQ_ITEM *ossl_quic_cfq_get_priority_head(const QUIC_CFQ *cfq,
+                                               uint32_t pn_space)
 {
     QUIC_CFQ_ITEM_EX *item = cfq->new_list.head;
 
     for (; item != NULL && item->pn_space != pn_space; item = item->next);
 
     if (item == NULL)
-        return NULL; /* ubsan */
+        return NULL;
 
     return &item->public;
 }
 
-QUIC_CFQ_ITEM *ossl_quic_cfq_item_get_priority_next(QUIC_CFQ_ITEM *item,
+QUIC_CFQ_ITEM *ossl_quic_cfq_item_get_priority_next(const QUIC_CFQ_ITEM *item,
                                                     uint32_t pn_space)
 {
     QUIC_CFQ_ITEM_EX *ex = (QUIC_CFQ_ITEM_EX *)item;
index 9693758769995c20fb14de87581989d1ed835b85..3a7662292b9aa34154fbcf35baddeb9e28f01a54 100644 (file)
@@ -34,6 +34,7 @@ struct quic_txpim_st {
 QUIC_TXPIM *ossl_quic_txpim_new(void)
 {
     QUIC_TXPIM *txpim = OPENSSL_zalloc(sizeof(*txpim));
+
     if (txpim == NULL)
         return NULL;
 
@@ -198,7 +199,7 @@ static int compare(const void *a, const void *b)
     return 0;
 }
 
-const QUIC_TXPIM_CHUNK *ossl_quic_txpim_pkt_get_chunks(QUIC_TXPIM_PKT *fpkt)
+const QUIC_TXPIM_CHUNK *ossl_quic_txpim_pkt_get_chunks(const QUIC_TXPIM_PKT *fpkt)
 {
     QUIC_TXPIM_PKT_EX *ex = (QUIC_TXPIM_PKT_EX *)fpkt;
 
@@ -214,14 +215,14 @@ const QUIC_TXPIM_CHUNK *ossl_quic_txpim_pkt_get_chunks(QUIC_TXPIM_PKT *fpkt)
     return ex->chunks;
 }
 
-size_t ossl_quic_txpim_pkt_get_num_chunks(QUIC_TXPIM_PKT *fpkt)
+size_t ossl_quic_txpim_pkt_get_num_chunks(const QUIC_TXPIM_PKT *fpkt)
 {
     QUIC_TXPIM_PKT_EX *ex = (QUIC_TXPIM_PKT_EX *)fpkt;
 
     return ex->num_chunks;
 }
 
-size_t ossl_quic_txpim_get_in_use(QUIC_TXPIM *txpim)
+size_t ossl_quic_txpim_get_in_use(const QUIC_TXPIM *txpim)
 {
     return txpim->in_use;
 }
index 76a1091fd2d0fe1d00f688a101ed199ab3ef52d6..dbc4eb4b7ee9d3acae9f7d391bf93772e47a94a6 100644 (file)
@@ -43,7 +43,7 @@ static const uint64_t ref_frame_type[] = {
     OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID,
     OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID,
     OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID,
-    OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID,
+    OSSL_QUIC_FRAME_TYPE_RETIRE_CONN_ID,
 };
 
 static const uint32_t expect[QUIC_PN_SPACE_NUM][11] = {
@@ -123,8 +123,8 @@ static int test_cfq(void)
                             QUIC_CFQ_STATE_NEW)
             || !TEST_uint_eq(ossl_quic_cfq_item_get_pn_space(item),
                              ref_pn_space[i])
-            || !TEST_uint_eq(ossl_quic_cfq_item_get_frame_type(item),
-                             ref_frame_type[i])
+            || !TEST_uint64_t_eq(ossl_quic_cfq_item_get_frame_type(item),
+                                 ref_frame_type[i])
             || !TEST_ptr_eq(ossl_quic_cfq_item_get_encoded(item),
                             ref_buf + i)
             || !TEST_size_t_eq(ossl_quic_cfq_item_get_encoded_len(item),