QUIC QSM: Allow bidi and uni incoming streams to be tracked separately
authorHugo Landau <hlandau@openssl.org>
Fri, 2 Feb 2024 12:21:11 +0000 (12:21 +0000)
committerHugo Landau <hlandau@openssl.org>
Sat, 10 Feb 2024 11:37:14 +0000 (11:37 +0000)
Reviewed-by: Neil Horman <nhorman@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/23495)

include/internal/quic_stream_map.h
ssl/quic/quic_stream_map.c

index 9d860f6d1f46181fdf2f145858c9d0118076fe87..41d2eb345d9f9924e1922a5bd269d4eed7392897 100644 (file)
@@ -520,7 +520,7 @@ struct quic_stream_map_st {
     QUIC_STREAM_LIST_NODE   accept_list;
     QUIC_STREAM_LIST_NODE   ready_for_gc_list;
     size_t                  rr_stepping, rr_counter;
-    size_t                  num_accept, num_shutdown_flush;
+    size_t                  num_accept_bidi, num_accept_uni, num_shutdown_flush;
     QUIC_STREAM             *rr_cur;
     uint64_t                (*get_stream_limit_cb)(int uni, void *arg);
     void                    *get_stream_limit_cb_arg;
@@ -806,8 +806,11 @@ void ossl_quic_stream_map_remove_from_accept_queue(QUIC_STREAM_MAP *qsm,
                                                    QUIC_STREAM *s,
                                                    OSSL_TIME rtt);
 
-/* Returns the length of the accept queue. */
-size_t ossl_quic_stream_map_get_accept_queue_len(QUIC_STREAM_MAP *qsm);
+/* Returns the length of the accept queue for the given stream type. */
+size_t ossl_quic_stream_map_get_accept_queue_len(QUIC_STREAM_MAP *qsm, int is_uni);
+
+/* Returns the total length of the accept queues for all stream types. */
+size_t ossl_quic_stream_map_get_total_accept_queue_len(QUIC_STREAM_MAP *qsm);
 
 /*
  * Shutdown Flush and GC
index f8278c9913239c537863e6b06b42e4081b5cd515..89b97c0a6b86b1d0593bbe9874749032d04ad330 100644 (file)
@@ -103,7 +103,8 @@ int ossl_quic_stream_map_init(QUIC_STREAM_MAP *qsm,
     qsm->rr_counter  = 0;
     qsm->rr_cur      = NULL;
 
-    qsm->num_accept         = 0;
+    qsm->num_accept_bidi    = 0;
+    qsm->num_accept_uni     = 0;
     qsm->num_shutdown_flush = 0;
 
     qsm->get_stream_limit_cb        = get_stream_limit_cb;
@@ -737,7 +738,10 @@ void ossl_quic_stream_map_push_accept_queue(QUIC_STREAM_MAP *qsm,
                                             QUIC_STREAM *s)
 {
     list_insert_tail(&qsm->accept_list, &s->accept_node);
-    ++qsm->num_accept;
+    if (ossl_quic_stream_is_bidi(s))
+        ++qsm->num_accept_bidi;
+    else
+        ++qsm->num_accept_uni;
 }
 
 static QUIC_RXFC *qsm_get_max_streams_rxfc(QUIC_STREAM_MAP *qsm, QUIC_STREAM *s)
@@ -754,15 +758,24 @@ void ossl_quic_stream_map_remove_from_accept_queue(QUIC_STREAM_MAP *qsm,
     QUIC_RXFC *max_streams_rxfc;
 
     list_remove(&qsm->accept_list, &s->accept_node);
-    --qsm->num_accept;
+    if (ossl_quic_stream_is_bidi(s))
+        --qsm->num_accept_bidi;
+    else
+        --qsm->num_accept_uni;
 
     if ((max_streams_rxfc = qsm_get_max_streams_rxfc(qsm, s)) != NULL)
         ossl_quic_rxfc_on_retire(max_streams_rxfc, 1, rtt);
 }
 
-size_t ossl_quic_stream_map_get_accept_queue_len(QUIC_STREAM_MAP *qsm)
+size_t ossl_quic_stream_map_get_accept_queue_len(QUIC_STREAM_MAP *qsm, int is_uni)
+{
+    return is_uni ? qsm->num_accept_uni : qsm->num_accept_bidi;
+}
+
+size_t ossl_quic_stream_map_get_total_accept_queue_len(QUIC_STREAM_MAP *qsm)
 {
-    return qsm->num_accept;
+    return ossl_quic_stream_map_get_accept_queue_len(qsm, /*is_uni=*/0)
+        + ossl_quic_stream_map_get_accept_queue_len(qsm, /*is_uni=*/1);
 }
 
 void ossl_quic_stream_map_gc(QUIC_STREAM_MAP *qsm)