diff --git a/include/haproxy/quic_tp-t.h b/include/haproxy/quic_tp-t.h index 3c9ae3846..e716f7530 100644 --- a/include/haproxy/quic_tp-t.h +++ b/include/haproxy/quic_tp-t.h @@ -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 */ diff --git a/include/haproxy/quic_tp.h b/include/haproxy/quic_tp.h index 651e95cdb..299de9872 100644 --- a/include/haproxy/quic_tp.h +++ b/include/haproxy/quic_tp.h @@ -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 */ diff --git a/include/haproxy/quic_trace-t.h b/include/haproxy/quic_trace-t.h index 4fd4a33cb..4e7f6a509 100644 --- a/include/haproxy/quic_trace-t.h +++ b/include/haproxy/quic_trace-t.h @@ -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 */ diff --git a/src/quic_tp.c b/src/quic_tp.c index bc33664d4..92dd57436 100644 --- a/src/quic_tp.c +++ b/src/quic_tp.c @@ -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
to transport parameter for