QUIC Send Stream State: Transition to DATA_SENT
authorHugo Landau <hlandau@openssl.org>
Tue, 6 Jun 2023 15:25:12 +0000 (16:25 +0100)
committerPauli <pauli@openssl.org>
Sun, 16 Jul 2023 22:17:57 +0000 (08:17 +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/21135)

ssl/quic/quic_fifd.c
ssl/quic/quic_stream_map.c

index e5ebc14adc78642491b921bd5e030638bf0c9be5..58f866537711f30f092c11d6f72f658133b4199f 100644 (file)
@@ -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 */
index 83ef08de64036a0dd283adb45a5acd5fdcd934de..2d1b9b580e92fca833ea8f4e22bffd2f61ff5581 100644 (file)
@@ -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)