]> git.kaiwu.me - nginx.git/commitdiff
QUIC: cleanup send context properly.
authorVladimir Homutov <vl@nginx.com>
Mon, 26 Oct 2020 21:14:24 +0000 (00:14 +0300)
committerVladimir Homutov <vl@nginx.com>
Mon, 26 Oct 2020 21:14:24 +0000 (00:14 +0300)
The patch resets ctx->frames queue, which may contain frames.  It was possible
that congestion or amplification limits prevented all frames to be sent.

Retransmitted frames could be accounted twice as inflight: first time in
ngx_quic_congestion_lost() called from ngx_quic_resend_frames(), and later
from ngx_quic_discard_ctx().

src/event/ngx_event_quic.c

index dcdea293cf76c004a26e446a4db106b4fbf895fb..5cffeaebca3b56a24b83e5ca55aa0194bb80a872 100644 (file)
@@ -2254,6 +2254,15 @@ ngx_quic_discard_ctx(ngx_connection_t *c, enum ssl_encryption_level_t level)
         ngx_quic_free_frame(c, f);
     }
 
+    while (!ngx_queue_empty(&ctx->frames)) {
+        q = ngx_queue_head(&ctx->frames);
+        ngx_queue_remove(q);
+
+        f = ngx_queue_data(q, ngx_quic_frame_t, queue);
+        ngx_quic_congestion_ack(c, f);
+        ngx_quic_free_frame(c, f);
+    }
+
     ctx->send_ack = 0;
 }
 
@@ -5677,6 +5686,7 @@ ngx_quic_congestion_lost(ngx_connection_t *c, ngx_quic_frame_t *f)
     cg = &qc->congestion;
 
     cg->in_flight -= f->plen;
+    f->plen = 0;
 
     timer = f->last - cg->recovery_start;