# HG changeset patch # User Roman Arutyunyan # Date 1607612093 0 # Node ID b9ac4752d0e68b7ec5e6fa79944483f6232c1eb9 # Parent 49efd27dace6cfd94040e87769e78940592f3fb6 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. diff -r 49efd27dace6 -r b9ac4752d0e6 src/event/ngx_event_quic.c --- a/src/event/ngx_event_quic.c Wed Dec 09 16:15:24 2020 +0000 +++ b/src/event/ngx_event_quic.c Thu Dec 10 14:54:53 2020 +0000 @@ -3024,14 +3024,9 @@ 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 @@ } 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;