From 7c88302b0120c22339a283947409b17bd349b075 Mon Sep 17 00:00:00 2001 From: Hugo Landau Date: Tue, 6 Jun 2023 16:25:12 +0100 Subject: [PATCH] QUIC Send Stream State: Transition to DATA_SENT Reviewed-by: Tomas Mraz Reviewed-by: Matt Caswell Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/21135) --- ssl/quic/quic_fifd.c | 3 +++ ssl/quic/quic_stream_map.c | 12 +++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/ssl/quic/quic_fifd.c b/ssl/quic/quic_fifd.c index e5ebc14adc7..58f86653771 100644 --- a/ssl/quic/quic_fifd.c +++ b/ssl/quic/quic_fifd.c @@ -92,6 +92,9 @@ static void on_acked(void *arg) fifd->confirm_frame(OSSL_QUIC_FRAME_TYPE_RESET_STREAM, chunks[i].stream_id, pkt, fifd->confirm_frame_arg); + + if (ossl_quic_sstream_is_totally_acked(sstream)) + fifd->sstream_updated(chunks[i].stream_id, fifd->sstream_updated_arg); } /* GCR */ diff --git a/ssl/quic/quic_stream_map.c b/ssl/quic/quic_stream_map.c index 83ef08de640..2d1b9b580e9 100644 --- a/ssl/quic/quic_stream_map.c +++ b/ssl/quic/quic_stream_map.c @@ -295,7 +295,7 @@ static int qsm_ready_for_gc(QUIC_STREAM_MAP *qsm, QUIC_STREAM *qs) assert(!qs->deleted || !ossl_quic_stream_has_send(qs) || ossl_quic_stream_send_is_reset(qs) - || ossl_quic_sstream_get_final_size(qs->sstream, NULL)); + || ossl_quic_stream_send_get_final_size(qs, NULL)); return qs->deleted @@ -303,10 +303,8 @@ static int qsm_ready_for_gc(QUIC_STREAM_MAP *qsm, QUIC_STREAM *qs) || recv_stream_fully_drained || qs->acked_stop_sending) && (!ossl_quic_stream_has_send(qs) - || (!ossl_quic_stream_send_is_reset(qs) - && ossl_quic_sstream_is_totally_acked(qs->sstream)) - || (ossl_quic_stream_send_is_reset(qs) - && qs->send_state == QUIC_SSTREAM_STATE_RESET_RECVD)); + || qs->send_state == QUIC_SSTREAM_STATE_DATA_RECVD + || qs->send_state == QUIC_SSTREAM_STATE_RESET_RECVD); } void ossl_quic_stream_map_update_state(QUIC_STREAM_MAP *qsm, QUIC_STREAM *s) @@ -324,6 +322,10 @@ void ossl_quic_stream_map_update_state(QUIC_STREAM_MAP *qsm, QUIC_STREAM *s) allowed_by_stream_limit = (stream_ordinal < stream_limit); } + if (s->send_state == QUIC_SSTREAM_STATE_DATA_SENT + && ossl_quic_sstream_is_totally_acked(s->sstream)) + ossl_quic_stream_map_notify_totally_acked(qsm, s); + if (!s->ready_for_gc) { s->ready_for_gc = qsm_ready_for_gc(qsm, s); if (s->ready_for_gc) -- 2.47.2