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; }