From 4f5777a41594d2acd74b1a54a3f23fbb1c83140c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20L=C3=A9caille?= Date: Mon, 20 Jun 2022 19:39:26 +0200 Subject: [PATCH] MINOR: quic: Dump version_information transport parameter Implement quic_tp_version_info_dump() to dump such a transport parameter (only remote). Call it from quic_transport_params_dump() which dump all the transport parameters. Can be backported to 2.6 as it's useful for debugging. --- include/haproxy/quic_tp-t.h | 1 + include/haproxy/quic_tp.h | 27 +++++++++++++++++++++++++++ src/quic_tp.c | 1 + src/xprt_quic.c | 2 +- 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/include/haproxy/quic_tp-t.h b/include/haproxy/quic_tp-t.h index 5180dfcd83..77b05e32a6 100644 --- a/include/haproxy/quic_tp-t.h +++ b/include/haproxy/quic_tp-t.h @@ -29,6 +29,7 @@ struct tp_preferred_address { struct tp_version_information { uint32_t choosen; const uint32_t *others; + size_t nb_others; const struct quic_version *negotiated_version; }; diff --git a/include/haproxy/quic_tp.h b/include/haproxy/quic_tp.h index b96c9f9c70..192460217b 100644 --- a/include/haproxy/quic_tp.h +++ b/include/haproxy/quic_tp.h @@ -43,9 +43,35 @@ static inline void quic_tp_cid_dump(struct buffer *buf, chunk_appendf(buf, ")"); } +static inline void quic_tp_version_info_dump(struct buffer *b, + const struct tp_version_information *tp, int local) +{ + if (!tp->choosen) + return; + + chunk_appendf(b, "\n\tversion_information:(choosen=0x%08x", tp->choosen); + if (tp->nb_others) { + int i = 0; + const uint32_t *ver; + chunk_appendf(b, ",others="); + for (ver = tp->others; i < tp->nb_others; i++, ver++) { + if (i != 0) + chunk_appendf(b, ","); + if (local) + chunk_appendf(b, "0x%08x", *ver); + else + chunk_appendf(b, "0x%08x", ntohl(*ver)); + } + chunk_appendf(b, ")\n"); + } +} + static inline void quic_transport_params_dump(struct buffer *b, + const struct quic_conn *qc, const struct quic_transport_params *p) { + int local = p == &qc->rx.params; + chunk_appendf(b, "\n\toriginal_destination_connection_id:"); quic_tp_cid_dump(b, &p->original_destination_connection_id); chunk_appendf(b, "\n\tinitial_source_connection_id:"); @@ -70,6 +96,7 @@ static inline void quic_transport_params_dump(struct buffer *b, chunk_appendf(b, "\n\tdisable_active_migration? %s", p->disable_active_migration ? "yes" : "no"); chunk_appendf(b, "\n\twith_stateless_reset_token? %s", p->with_stateless_reset_token ? "yes" : "no"); chunk_appendf(b, "\n\twith_preferred_address? %s", p->with_preferred_address ? "yes" : "no"); + quic_tp_version_info_dump(b, &p->version_information, local); } #endif /* USE_QUIC */ diff --git a/src/quic_tp.c b/src/quic_tp.c index f7f8d7ddd6..f83ed86811 100644 --- a/src/quic_tp.c +++ b/src/quic_tp.c @@ -191,6 +191,7 @@ static int quic_transport_param_dec_version_info(struct tp_version_information * /* TODO: not supported */ return 0; + tp->nb_others = (end - (const unsigned char *)tp->others) / sizeof *tp->others; for (ver = tp->others; ver < (const uint32_t *)end; ver++) { if (!tp->negotiated_version) { int i; diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 7c31434605..5fae59b3be 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -264,7 +264,7 @@ static void quic_trace(enum trace_level level, uint64_t mask, const struct trace if (mask & QUIC_EV_TRANSP_PARAMS) { const struct quic_transport_params *p = a2; - quic_transport_params_dump(&trace_buf, p); + quic_transport_params_dump(&trace_buf, qc, p); } if (mask & QUIC_EV_CONN_ADDDATA) {