From acbb56eac65588de7509994e5762f1adf9fa8a5f Mon Sep 17 00:00:00 2001 From: Frederic Lecaille Date: Wed, 17 Jan 2024 17:17:26 +0100 Subject: [PATCH] MINOR: quic-be: Correct Version Information transp. param encoding According to the RFC, a QUIC client must encode the QUIC version it supports into the "Available Versions" of "Version Information" transport parameter order by descending preference. This is done defining and new variables pointers to the corresponding version of array elements. A client announces its available versions as follows: v1, v2, draft29. --- include/haproxy/quic_conn-t.h | 3 +++ src/quic_conn.c | 4 ++++ src/quic_tp.c | 17 +++++++++++++++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/include/haproxy/quic_conn-t.h b/include/haproxy/quic_conn-t.h index 7c6f116a1..a8ffd9e7a 100644 --- a/include/haproxy/quic_conn-t.h +++ b/include/haproxy/quic_conn-t.h @@ -228,6 +228,9 @@ struct quic_version { extern const struct quic_version quic_versions[]; extern const size_t quic_versions_nb; extern const struct quic_version *preferred_version; +extern const struct quic_version *quic_version_draft_29; +extern const struct quic_version *quic_version_1; +extern const struct quic_version *quic_version_2; /* unused: 0x01 */ /* Flag the packet number space as requiring an ACK frame to be sent. */ diff --git a/src/quic_conn.c b/src/quic_conn.c index 16e155d7d..81ae7ce54 100644 --- a/src/quic_conn.c +++ b/src/quic_conn.c @@ -119,6 +119,10 @@ const struct quic_version quic_versions[] = { }, }; +const struct quic_version *quic_version_draft_29 = &quic_versions[0]; +const struct quic_version *quic_version_1 = &quic_versions[1]; +const struct quic_version *quic_version_2 = &quic_versions[2]; + /* Function pointers, can be used to compute a hash from first generated CID and to derive new CIDs */ uint64_t (*quic_hash64_from_cid)(const unsigned char *cid, int size, const unsigned char *secret, size_t secretlen) = NULL; void (*quic_newcid_from_hash64)(unsigned char *cid, int size, uint64_t hash, const unsigned char *secret, size_t secretlen) = NULL; diff --git a/src/quic_tp.c b/src/quic_tp.c index 35a514f0e..2d27a42e9 100644 --- a/src/quic_tp.c +++ b/src/quic_tp.c @@ -513,8 +513,21 @@ static int quic_transport_param_enc_version_info(unsigned char **buf, memcpy(*buf, &ver, sizeof ver); *buf += sizeof ver; /* For servers: all supported version, chosen included */ - for (i = 0; i < quic_versions_nb; i++) { - ver = htonl(quic_versions[i].num); + if (server) { + for (i = 0; i < quic_versions_nb; i++) { + ver = htonl(quic_versions[i].num); + memcpy(*buf, &ver, sizeof ver); + *buf += sizeof ver; + } + } + else { + ver = htonl(quic_version_1->num); + memcpy(*buf, &ver, sizeof ver); + *buf += sizeof ver; + ver = htonl(quic_version_2->num); + memcpy(*buf, &ver, sizeof ver); + *buf += sizeof ver; + ver = htonl(quic_version_draft_29->num); memcpy(*buf, &ver, sizeof ver); *buf += sizeof ver; }