changeset 8662:b9ac4752d0e6 quic

QUIC: send and process ack_delay for Initial and Handshake levels. Previously, this only worked for Application level because before quic-transport-30, there were the following constraints: Because the receiver doesn't use the ACK Delay for Initial and Handshake packets, a sender SHOULD send a value of 0. When adjusting an RTT sample using peer-reported acknowledgement delays, an endpoint ... MUST ignore the ACK Delay field of the ACK frame for packets sent in the Initial and Handshake packet number space.
author Roman Arutyunyan <arut@nginx.com>
date Thu, 10 Dec 2020 14:54:53 +0000
parents 49efd27dace6
children 1823e2152fc4
files src/event/ngx_event_quic.c
diffstat 1 files changed, 6 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/event/ngx_event_quic.c
+++ b/src/event/ngx_event_quic.c
@@ -3024,14 +3024,9 @@ ngx_quic_send_ack(ngx_connection_t *c, n
 
     qc = ngx_quic_get_connection(c);
 
-    if (ctx->level == ssl_encryption_application) {
-        ack_delay = ngx_current_msec - ctx->largest_received;
-        ack_delay *= 1000;
-        ack_delay >>= qc->ctp.ack_delay_exponent;
-
-    } else {
-        ack_delay = 0;
-    }
+    ack_delay = ngx_current_msec - ctx->largest_received;
+    ack_delay *= 1000;
+    ack_delay >>= qc->ctp.ack_delay_exponent;
 
     frame = ngx_quic_alloc_frame(c);
     if (frame == NULL) {
@@ -3379,13 +3374,10 @@ ngx_quic_rtt_sample(ngx_connection_t *c,
     } else {
         qc->min_rtt = ngx_min(qc->min_rtt, latest_rtt);
 
-
-        if (level == ssl_encryption_application) {
-            ack_delay = ack->delay * (1 << qc->ctp.ack_delay_exponent) / 1000;
+        ack_delay = ack->delay * (1 << qc->ctp.ack_delay_exponent) / 1000;
+
+        if (c->ssl->handshaked) {
             ack_delay = ngx_min(ack_delay, qc->ctp.max_ack_delay);
-
-        } else {
-            ack_delay = 0;
         }
 
         adjusted_rtt = latest_rtt;