diff --git a/include/haproxy/quic_loss.h b/include/haproxy/quic_loss.h index 6105ceaeb..cc48f0df5 100644 --- a/include/haproxy/quic_loss.h +++ b/include/haproxy/quic_loss.h @@ -42,8 +42,8 @@ static inline void quic_loss_init(struct quic_loss *ql) } /* Update QUIC loss information with new measurement and - * on ACK frame receipt which MUST be min(ack->ack_delay, max_ack_delay) for - * non handshake packets. + * on ACK frame receipt which MUST be min(ack->ack_delay, max_ack_delay) + * before the handshake is confirmed. */ static inline void quic_loss_srtt_update(struct quic_loss *ql, unsigned int rtt, unsigned int ack_delay, diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 0a1ef8e0f..f81d044a7 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -2208,7 +2208,9 @@ static int qc_parse_pkt_frms(struct quic_rx_packet *pkt, struct ssl_sock_ctx *ct unsigned int ack_delay; ack_delay = !quic_application_pktns(qel->pktns, qc) ? 0 : - MS_TO_TICKS(QUIC_MIN(quic_ack_delay_ms(&frm.ack, qc), qc->max_ack_delay)); + HA_ATOMIC_LOAD(&qc->state) >= QUIC_HS_ST_CONFIRMED ? + MS_TO_TICKS(QUIC_MIN(quic_ack_delay_ms(&frm.ack, qc), qc->max_ack_delay)) : + MS_TO_TICKS(quic_ack_delay_ms(&frm.ack, qc)); quic_loss_srtt_update(&qc->path->loss, rtt_sample, ack_delay, qc); } break;