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.
This commit is contained in:
Roman Arutyunyan 2020-12-10 14:54:53 +00:00
parent 6f9efd423e
commit 4fd02c5839

View File

@ -3024,14 +3024,9 @@ ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
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, ngx_quic_ack_frame_t *ack,
} else {
qc->min_rtt = ngx_min(qc->min_rtt, latest_rtt);
ack_delay = ack->delay * (1 << qc->ctp.ack_delay_exponent) / 1000;
if (level == ssl_encryption_application) {
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;