]> git.kaiwu.me - nginx.git/commitdiff
QUIC: set idle timer when sending an ack-eliciting packet.
authorRoman Arutyunyan <arut@nginx.com>
Thu, 18 Feb 2021 09:22:28 +0000 (12:22 +0300)
committerRoman Arutyunyan <arut@nginx.com>
Thu, 18 Feb 2021 09:22:28 +0000 (12:22 +0300)
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.

src/event/quic/ngx_event_quic.c

index f99b0f8540d1e3b817943a58e8dc8aa388f54b85..0484909cf44f8cca08636c4d75c3d16662f00b7f 100644 (file)
@@ -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);