]> git.kaiwu.me - nginx.git/commitdiff
QUIC: avoided retransmission of stale ack frames.
authorVladimir Homutov <vl@nginx.com>
Wed, 28 Oct 2020 11:22:51 +0000 (14:22 +0300)
committerVladimir Homutov <vl@nginx.com>
Wed, 28 Oct 2020 11:22:51 +0000 (14:22 +0300)
Acknowledgments are regenerated using the most recent data available.

src/event/ngx_event_quic.c

index 9cdc41e9ce68ba35269144de5530da63a3d782fa..9b83ed083cbe209dc215e47e1a4d40411009f3c7 100644 (file)
@@ -4843,6 +4843,8 @@ ngx_quic_resend_frames(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
                    "quic resend packet pnum:%uL", start->pnum);
 
+    ngx_quic_congestion_lost(c, start);
+
     do {
         f = ngx_queue_data(q, ngx_quic_frame_t, queue);
 
@@ -4853,11 +4855,20 @@ ngx_quic_resend_frames(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
         q = ngx_queue_next(q);
 
         ngx_queue_remove(&f->queue);
-        ngx_queue_insert_tail(&ctx->frames, &f->queue);
 
-    } while (q != ngx_queue_sentinel(&ctx->sent));
+        switch (f->type) {
+        case NGX_QUIC_FT_ACK:
+        case NGX_QUIC_FT_ACK_ECN:
+            /* force generation of most recent acknowledgment */
+            ctx->send_ack = NGX_QUIC_MAX_ACK_GAP;
+            ngx_quic_free_frame(c, f);
+            break;
 
-    ngx_quic_congestion_lost(c, start);
+        default:
+            ngx_queue_insert_tail(&ctx->frames, &f->queue);
+        }
+
+    } while (q != ngx_queue_sentinel(&ctx->sent));
 
     if (qc->closing) {
         return;