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 */
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,
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 */
#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 */
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);
+}
{ .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" },
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;