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.
diff --git a/include/haproxy/quic_tp-t.h b/include/haproxy/quic_tp-t.h
index 5180dfc..77b05e3 100644
--- a/include/haproxy/quic_tp-t.h
+++ b/include/haproxy/quic_tp-t.h
@@ -29,6 +29,7 @@
 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 b96c9f9..1924602 100644
--- a/include/haproxy/quic_tp.h
+++ b/include/haproxy/quic_tp.h
@@ -43,9 +43,35 @@
 	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 @@
 	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 f7f8d7d..f83ed86 100644
--- a/src/quic_tp.c
+++ b/src/quic_tp.c
@@ -191,6 +191,7 @@
 		/* 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 7c31434..5fae59b 100644
--- a/src/xprt_quic.c
+++ b/src/xprt_quic.c
@@ -264,7 +264,7 @@
 
 		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) {