summaryrefslogtreecommitdiff
path: root/ssl/quic/quic_stream_map.c
diff options
context:
space:
mode:
authorHugo Landau <hlandau@openssl.org>2023-04-18 19:30:55 +0100
committerHugo Landau <hlandau@openssl.org>2023-05-12 14:47:12 +0100
commit90cecc406f58b229ffa9c8e8473eaa6924c4a5d5 (patch)
treec02a56da8c5bccb7b033be06e55ec825773ed6ca /ssl/quic/quic_stream_map.c
parenta6b6ea17376572e3c0227b98f21dedc48215aa9a (diff)
downloadopenssl-new-90cecc406f58b229ffa9c8e8473eaa6924c4a5d5.tar.gz
QUIC RXDP/QSM: Enforce MAX_STREAMS
Also use accept queue popping by the application as the retirement event, i.e., as the cue to increase the limit. Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/20765)
Diffstat (limited to 'ssl/quic/quic_stream_map.c')
-rw-r--r--ssl/quic/quic_stream_map.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/ssl/quic/quic_stream_map.c b/ssl/quic/quic_stream_map.c
index 06bf1cfa34..a9c616ea9f 100644
--- a/ssl/quic/quic_stream_map.c
+++ b/ssl/quic/quic_stream_map.c
@@ -102,7 +102,9 @@ static int cmp_stream(const QUIC_STREAM *a, const QUIC_STREAM *b)
int ossl_quic_stream_map_init(QUIC_STREAM_MAP *qsm,
uint64_t (*get_stream_limit_cb)(int uni, void *arg),
- void *get_stream_limit_cb_arg)
+ void *get_stream_limit_cb_arg,
+ QUIC_RXFC *max_streams_bidi_rxfc,
+ QUIC_RXFC *max_streams_uni_rxfc)
{
qsm->map = lh_QUIC_STREAM_new(hash_stream, cmp_stream);
qsm->active_list.prev = qsm->active_list.next = &qsm->active_list;
@@ -114,6 +116,8 @@ int ossl_quic_stream_map_init(QUIC_STREAM_MAP *qsm,
qsm->get_stream_limit_cb = get_stream_limit_cb;
qsm->get_stream_limit_cb_arg = get_stream_limit_cb_arg;
+ qsm->max_streams_bidi_rxfc = max_streams_bidi_rxfc;
+ qsm->max_streams_uni_rxfc = max_streams_uni_rxfc;
return 1;
}
@@ -294,11 +298,24 @@ void ossl_quic_stream_map_push_accept_queue(QUIC_STREAM_MAP *qsm,
++qsm->num_accept;
}
+static QUIC_RXFC *qsm_get_max_streams_rxfc(QUIC_STREAM_MAP *qsm, QUIC_STREAM *s)
+{
+ return ossl_quic_stream_is_bidi(s)
+ ? qsm->max_streams_bidi_rxfc
+ : qsm->max_streams_uni_rxfc;
+}
+
void ossl_quic_stream_map_remove_from_accept_queue(QUIC_STREAM_MAP *qsm,
- QUIC_STREAM *s)
+ QUIC_STREAM *s,
+ OSSL_TIME rtt)
{
+ QUIC_RXFC *max_streams_rxfc;
+
list_remove(&qsm->accept_list, &s->accept_node);
--qsm->num_accept;
+
+ 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)