]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: quic-be: qc_send_mux() adaptation for 0-RTT
authorFrederic Lecaille <flecaille@haproxy.com>
Sat, 2 Aug 2025 08:33:05 +0000 (10:33 +0200)
committerFrederic Lecaille <flecaille@haproxy.com>
Thu, 6 Nov 2025 09:34:27 +0000 (10:34 +0100)
When entering this function, a selection is done about the encryption level
to be used to send data. For a client, the early data encryption level
is used to send 0-RTT if this encryption level is initialized.

The Initial encryption is also registered to the send list for clients if there
is Initial crypto data to send. This allow Initial and 0-RTT packets to
be coalesced by datagrams.

src/quic_tx.c

index 24859ea29f2ca4c2e4d8cbeedc65bc22e3827fb9..e20656df8b43c1ffa1fd69704eb31894e439ad1c 100644 (file)
@@ -516,6 +516,8 @@ enum quic_tx_err qc_send_mux(struct quic_conn *qc, struct list *frms,
        struct list send_list = LIST_HEAD_INIT(send_list);
        enum quic_tx_err ret = QUIC_TX_ERR_NONE;
        int max_dgram = 0, sent;
+       struct quic_enc_level *qel = !qc_is_back(qc) ? qc->ael :
+               qc->eel ? qc->eel : qc->ael;
 
        TRACE_ENTER(QUIC_EV_CONN_TXPKT, qc);
 
@@ -525,6 +527,10 @@ enum quic_tx_err qc_send_mux(struct quic_conn *qc, struct list *frms,
                return QUIC_TX_ERR_FATAL;
        }
 
+       /* The QUIC client may need to send Initial CRYPTO data before early data. */
+       if (qc_is_back(qc) && qel == qc->eel && qel_need_sending(qc->iel, qc))
+               qel_register_send(&send_list, qc->iel, &qc->iel->pktns->tx.frms);
+
        /* Try to send post handshake frames first unless on 0-RTT. */
        if ((qc->flags & QUIC_FL_CONN_NEED_POST_HANDSHAKE_FRMS) &&
            qc->state >= QUIC_HS_ST_COMPLETE) {
@@ -539,7 +545,7 @@ enum quic_tx_err qc_send_mux(struct quic_conn *qc, struct list *frms,
        }
 
        TRACE_STATE("preparing data (from MUX)", QUIC_EV_CONN_TXPKT, qc);
-       qel_register_send(&send_list, qc->ael, frms);
+       qel_register_send(&send_list, qel, frms);
        sent = qc_send(qc, 0, &send_list, max_dgram);
 
        if (pacer && qc->path->cc.algo->check_app_limited)