changeset 8708:98bacfc65c61 quic

QUIC: set idle timer when sending an ack-eliciting packet. As per quic-transport-34: An endpoint also restarts its idle timer when sending an ack-eliciting packet if no other ack-eliciting packets have been sent since last receiving and processing a packet. Previously, the timer was set for any packet.
author Roman Arutyunyan <arut@nginx.com>
date Thu, 18 Feb 2021 12:22:28 +0300
parents ffcaf0aad9f2
children 81bb3a690c10
files src/event/quic/ngx_event_quic.c
diffstat 1 files changed, 10 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/event/quic/ngx_event_quic.c
+++ b/src/event/quic/ngx_event_quic.c
@@ -4948,17 +4948,21 @@ static ngx_int_t
 ngx_quic_output(ngx_connection_t *c)
 {
     off_t                   max;
-    size_t                  len, min;
+    size_t                  len, min, in_flight;
     ssize_t                 n;
     u_char                 *p;
     ngx_uint_t              i, pad;
     ngx_quic_send_ctx_t    *ctx;
+    ngx_quic_congestion_t  *cg;
     ngx_quic_connection_t  *qc;
     static u_char           dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
 
     c->log->action = "sending frames";
 
     qc = ngx_quic_get_connection(c);
+    cg = &qc->congestion;
+
+    in_flight = cg->in_flight;
 
     for ( ;; ) {
         p = dst;
@@ -5003,11 +5007,11 @@ ngx_quic_output(ngx_connection_t *c)
         if (n == NGX_ERROR) {
             return NGX_ERROR;
         }
-
-        if (!qc->send_timer_set && !qc->closing) {
-            qc->send_timer_set = 1;
-            ngx_add_timer(c->read, qc->tp.max_idle_timeout);
-        }
+    }
+
+    if (in_flight != cg->in_flight && !qc->send_timer_set && !qc->closing) {
+        qc->send_timer_set = 1;
+        ngx_add_timer(c->read, qc->tp.max_idle_timeout);
     }
 
     ngx_quic_set_lost_timer(c);