]> git.kaiwu.me - nginx.git/commitdiff
Fixed packet retransmission.
authorRoman Arutyunyan <arut@nginx.com>
Fri, 24 Apr 2020 14:20:37 +0000 (17:20 +0300)
committerRoman Arutyunyan <arut@nginx.com>
Fri, 24 Apr 2020 14:20:37 +0000 (17:20 +0300)
Previously frames in ctx->sent queue could be lost.

src/event/ngx_event_quic.c

index ef8e237d2c13b529e3fdb5e6e1fc090fd925d75d..16b3a91fca9f47f23485fb789d974bb46397a853 100644 (file)
@@ -2586,11 +2586,18 @@ ngx_quic_retransmit(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
     }
 
     q = ngx_queue_head(&ctx->sent);
-    start = ngx_queue_data(q, ngx_quic_frame_t, queue);
-    pn = start->pnum;
-    f = start;
 
     do {
+        start = ngx_queue_data(q, ngx_quic_frame_t, queue);
+
+        wait = start->last + qc->tp.max_ack_delay - now;
+
+        if ((ngx_msec_int_t) wait > 0) {
+            break;
+        }
+
+        pn = start->pnum;
+
         ngx_queue_init(&range);
 
         /* send frames with same packet number to the wire */
@@ -2614,12 +2621,6 @@ ngx_quic_retransmit(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
 
         } while (q != ngx_queue_sentinel(&ctx->sent));
 
-        wait = start->last + qc->tp.max_ack_delay - now;
-
-        if ((ngx_msec_int_t) wait > 0) {
-            break;
-        }
-
         /* NGX_DONE is impossible here, such frames don't get into this queue */
         if (ngx_quic_send_frames(c, &range) != NGX_OK) {
             return NGX_ERROR;