changeset 8616:64405f970f6f quic

QUIC: avoided retransmission of stale ack frames. Acknowledgments are regenerated using the most recent data available.
author Vladimir Homutov <vl@nginx.com>
date Wed, 28 Oct 2020 14:22:51 +0300
parents 27e305834078
children 69dc750cf66f
files src/event/ngx_event_quic.c
diffstat 1 files changed, 14 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/event/ngx_event_quic.c
+++ b/src/event/ngx_event_quic.c
@@ -4843,6 +4843,8 @@ ngx_quic_resend_frames(ngx_connection_t 
     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,12 +4855,21 @@ ngx_quic_resend_frames(ngx_connection_t 
         q = ngx_queue_next(q);
 
         ngx_queue_remove(&f->queue);
-        ngx_queue_insert_tail(&ctx->frames, &f->queue);
+
+        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;
+
+        default:
+            ngx_queue_insert_tail(&ctx->frames, &f->queue);
+        }
 
     } while (q != ngx_queue_sentinel(&ctx->sent));
 
-    ngx_quic_congestion_lost(c, start);
-
     if (qc->closing) {
         return;
     }