]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: quic-be: helper functions to save/restore transport params (0-RTT)
authorFrederic Lecaille <flecaille@haproxy.com>
Thu, 31 Jul 2025 13:24:20 +0000 (15:24 +0200)
committerFrederic Lecaille <flecaille@haproxy.com>
Mon, 4 Aug 2025 16:48:09 +0000 (18:48 +0200)
Define quic_early_transport_params new struct for QUIC transport parameters
in relation with 0-RTT. This parameters must be saved during a first session to
be reused for 0-RTT next sessions.

qc_early_transport_params_cpy() copies the 0-RTT transport parameters to be
saved during a first connection to a backend. The copy is made from
a quic_transport_params struct to a quic_ealy_transport_params struct.

On the contrary, qc_early_transport_params_reuse() copies the transport parameters
to be reused for a 0-RTT session from a previous one. The copy is made
from a quic_early_transport_params strcut to a quic_transport_params struct.

Also add QUIC_EV_EARLY_TRANSP_PARAMS trace event to dump such 0-RTT
transport parameters from traces.

include/haproxy/quic_tp-t.h
include/haproxy/quic_tp.h
include/haproxy/quic_trace-t.h
src/quic_tp.c
src/quic_trace.c

index 3c9ae384669844b704d4131fbebea48189787ae5..e716f7530592894aedf8fb3cb2bcd58ee8db5375 100644 (file)
@@ -115,6 +115,18 @@ struct quic_transport_params {
        struct tp_version_information version_information;
 };
 
+/* Transport parameters to be saved for 0-RTT sessions. */
+struct quic_early_transport_params {
+       uint64_t max_udp_payload_size;
+       uint64_t active_connection_id_limit;
+       uint64_t initial_max_data;
+       uint64_t initial_max_stream_data_bidi_local;
+       uint64_t initial_max_stream_data_bidi_remote;
+       uint64_t initial_max_stream_data_uni;
+       uint64_t initial_max_streams_bidi;
+       uint64_t initial_max_streams_uni;
+};
+
 /* Return type for QUIC TP decode function */
 enum quic_tp_dec_err {
        QUIC_TP_DEC_ERR_NONE = 0,  /* no error */
index 651e95cdbfcfde05f28a3bd93b82978d7eb379c8..299de987268e1312977b9a8e9e9dcdc5df414164 100644 (file)
@@ -19,6 +19,12 @@ int quic_transport_params_encode(unsigned char *buf,
 int quic_transport_params_store(struct quic_conn *conn, int server,
                                 const unsigned char *buf,
                                 const unsigned char *end);
+void qc_early_transport_params_cpy(struct quic_conn *qc,
+                                   struct quic_early_transport_params *e,
+                                   struct quic_transport_params *p);
+void qc_early_transport_params_reuse(struct quic_conn *qc,
+                                     struct quic_transport_params *p,
+                                     const struct quic_early_transport_params *e);
 
 int qc_lstnr_params_init(struct quic_conn *qc,
                          const struct quic_transport_params *listener_params,
@@ -123,5 +129,23 @@ static inline void quic_transport_params_dump(struct buffer *b,
        quic_tp_version_info_dump(b, &p->version_information, local);
 }
 
+static inline void quic_early_transport_params_dump(struct buffer *b,
+                                                    const struct quic_conn *qc,
+                                                    const struct quic_early_transport_params *p)
+{
+       chunk_appendf(b, " mudp_payload_sz=%llu", (ull)p->max_udp_payload_size);
+       chunk_appendf(b, " act_cid_limit=%llu\n", (ull)p->active_connection_id_limit);
+
+       chunk_appendf(b, "    md=%llu", (ull)p->initial_max_data);
+       chunk_appendf(b, " msd_bidi_l=%llu",
+                     (ull)p->initial_max_stream_data_bidi_local);
+       chunk_appendf(b, " msd_bidi_r=%llu",
+                     (ull)p->initial_max_stream_data_bidi_remote);
+       chunk_appendf(b, " msd_uni=%llu",
+                     (ull)p->initial_max_stream_data_uni);
+       chunk_appendf(b, " ms_bidi=%llu", (ull)p->initial_max_streams_bidi);
+       chunk_appendf(b, " ms_uni=%llu\n", (ull)p->initial_max_streams_uni);
+}
+
 #endif /* USE_QUIC */
 #endif /* _HAPROXY_QUIC_TP_H */
index 4fd4a33cbadd9fca785919483e843f33f7d5a191..4e7f6a509a571fce8b3fac9a92c93a167f819fde 100644 (file)
@@ -100,5 +100,6 @@ struct quic_rx_crypto_frm {
 #define           QUIC_EV_CONN_SSL_COMPAT (1ULL << 51)
 #define           QUIC_EV_CONN_BIND_TID  (1ULL << 52)
 #define           QUIC_EV_CONN_RELEASE_RCD (1ULL << 53)
+#define           QUIC_EV_EARLY_TRANSP_PARAMS (1ULL << 54)
 
 #endif /* _HAPROXY_QUIC_TRACE_T_H */
index bc33664d495510c35749f67ceb5fcccf49b40cd0..92dd57436e6a3f73c9a333686290b2ca1092af9d 100644 (file)
@@ -862,3 +862,36 @@ void qc_srv_params_init(struct quic_conn *qc,
        rx_params->initial_source_connection_id.len = scidlen;
        TRACE_PROTO("\nRX(local) transp. params.", QUIC_EV_TRANSP_PARAMS, qc, rx_params);
 }
+
+/* Copy the 0-RTT transport parameters to be saved from <p> to <e> */
+void qc_early_transport_params_cpy(struct quic_conn *qc,
+                                   struct quic_early_transport_params *e,
+                                   struct quic_transport_params *p)
+{
+       e->max_udp_payload_size = p->max_udp_payload_size;
+       e->initial_max_data = p->initial_max_data;
+       e->initial_max_stream_data_bidi_local = p->initial_max_stream_data_bidi_local;
+       e->initial_max_stream_data_bidi_remote = p->initial_max_stream_data_bidi_remote;
+       e->initial_max_stream_data_uni = p->initial_max_stream_data_uni;
+       e->initial_max_streams_bidi = p->initial_max_streams_bidi;
+       e->initial_max_streams_uni = p->initial_max_streams_uni;
+       e->active_connection_id_limit = p->active_connection_id_limit;
+       TRACE_PROTO("\nTX(remote) saved early transp. params.", QUIC_EV_EARLY_TRANSP_PARAMS, qc, e);
+}
+
+/* Copy <e> 0-RTT transport parameters to <p> transport parameter for <qc> connection. */
+void qc_early_transport_params_reuse(struct quic_conn *qc,
+                                     struct quic_transport_params *p,
+                                     const struct quic_early_transport_params *e)
+{
+       p->max_udp_payload_size = e->max_udp_payload_size;
+       p->initial_max_data = e->initial_max_data;
+       p->initial_max_stream_data_bidi_local = e->initial_max_stream_data_bidi_local;
+       p->initial_max_stream_data_bidi_remote = e->initial_max_stream_data_bidi_remote;
+       p->initial_max_stream_data_uni = e->initial_max_stream_data_uni;
+       p->initial_max_streams_bidi = e->initial_max_streams_bidi;
+       p->initial_max_streams_uni = e->initial_max_streams_uni;
+       p->active_connection_id_limit = e->active_connection_id_limit;
+       TRACE_PROTO("\nTX(remote) reuse early transp. params.", QUIC_EV_EARLY_TRANSP_PARAMS, qc, e);
+       TRACE_PROTO("\nTX(remote) transp. params.", QUIC_EV_TRANSP_PARAMS, qc, p);
+}
index c8fe5524b61bb6fd8568ca34a3d0dc996c7248b9..196d0e9b10d335ce04b793b8e7b1f838f46954ff 100644 (file)
@@ -69,6 +69,7 @@ static const struct trace_event quic_trace_events[] = {
        { .mask = QUIC_EV_CONN_FRMLIST,  .name = "frm_list",         .desc = "frame list"},
        { .mask = QUIC_EV_STATELESS_RST, .name = "stateless_reset",  .desc = "stateless reset sent"},
        { .mask = QUIC_EV_TRANSP_PARAMS, .name = "transport_params", .desc = "transport parameters"},
+       { .mask = QUIC_EV_EARLY_TRANSP_PARAMS, .name = "early_transport_params", .desc = "early transport parameters"},
        { .mask = QUIC_EV_CONN_IDLE_TIMER, .name = "idle_timer",     .desc = "idle timer task"},
        { .mask = QUIC_EV_CONN_SUB,      .name = "xprt_sub",         .desc = "RX/TX subscription or unsubscription to QUIC xprt"},
        { .mask = QUIC_EV_CONN_RCV,      .name = "conn_recv",        .desc = "RX on connection" },
@@ -140,6 +141,13 @@ static void quic_trace(enum trace_level level, uint64_t mask, const struct trace
                                quic_transport_params_dump(&trace_buf, qc, p);
                }
 
+               if (mask & QUIC_EV_EARLY_TRANSP_PARAMS) {
+                       const struct quic_early_transport_params *p = a2;
+
+                       if (p)
+                               quic_early_transport_params_dump(&trace_buf, qc, p);
+               }
+
                if (mask & QUIC_EV_CONN_ADDDATA) {
                        const enum ssl_encryption_level_t *level = a2;
                        const size_t *len = a3;