diff --git a/include/haproxy/xprt_quic-t.h b/include/haproxy/xprt_quic-t.h index 6ee7f4298..9af3cc6b0 100644 --- a/include/haproxy/xprt_quic-t.h +++ b/include/haproxy/xprt_quic-t.h @@ -598,6 +598,7 @@ enum qc_mux_state { #define QUIC_FL_CONN_TLS_ALERT (1U << 9) /* gap here */ #define QUIC_FL_CONN_HALF_OPEN_CNT_DECREMENTED (1U << 11) /* The half-open connection counter was decremented */ +#define QUIC_FL_CONN_HANDSHAKE_SPEED_UP (1U << 12) /* Handshake speeding up was done */ #define QUIC_FL_CONN_NOTIFY_CLOSE (1U << 27) /* MUX notified about quic-conn imminent closure (idle-timeout or CONNECTION_CLOSE emission/reception) */ #define QUIC_FL_CONN_EXP_TIMER (1U << 28) /* timer has expired, quic-conn can be freed */ #define QUIC_FL_CONN_CLOSING (1U << 29) diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 4fd187296..108a6e03b 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -2651,7 +2651,8 @@ static int qc_parse_pkt_frms(struct quic_rx_packet *pkt, struct ssl_sock_ctx *ct TRACE_PROTO("Already received CRYPTO data", QUIC_EV_CONN_RXPKT, qc, pkt, &cfdebug); if (qc_is_listener(ctx->qc) && - qel == &qc->els[QUIC_TLS_ENC_LEVEL_INITIAL]) + qel == &qc->els[QUIC_TLS_ENC_LEVEL_INITIAL] && + !(qc->flags & QUIC_FL_CONN_HANDSHAKE_SPEED_UP)) fast_retrans = 1; break; } @@ -2810,7 +2811,9 @@ static int qc_parse_pkt_frms(struct quic_rx_packet *pkt, struct ssl_sock_ctx *ct struct quic_enc_level *iqel = &qc->els[QUIC_TLS_ENC_LEVEL_INITIAL]; struct quic_enc_level *hqel = &qc->els[QUIC_TLS_ENC_LEVEL_HANDSHAKE]; + TRACE_PROTO("speeding up handshake completion", QUIC_EV_CONN_PRSHPKT, qc); qc_prep_hdshk_fast_retrans(qc, &iqel->pktns->tx.frms, &hqel->pktns->tx.frms); + qc->flags |= QUIC_FL_CONN_HANDSHAKE_SPEED_UP; } /* The server must switch from INITIAL to HANDSHAKE handshake state when it