Provide constexpr equivalent to AllSupportedVersions
diff --git a/quic/core/quic_versions.cc b/quic/core/quic_versions.cc index 372d5d0..9a0f469 100644 --- a/quic/core/quic_versions.cc +++ b/quic/core/quic_versions.cc
@@ -206,7 +206,15 @@ } ParsedQuicVersionVector AllSupportedVersions() { - ParsedQuicVersionVector supported_versions; + const auto& supported_versions = SupportedVersions(); + return ParsedQuicVersionVector(supported_versions.begin(), + supported_versions.end()); +} + +constexpr std::array<ParsedQuicVersion, NumSupportedVersions()> +SupportedVersions() { + std::array<ParsedQuicVersion, NumSupportedVersions()> supported_versions{}; + size_t index = 0; for (HandshakeProtocol protocol : kSupportedHandshakeProtocols) { for (QuicTransportVersion version : kSupportedTransportVersions) { if (protocol == PROTOCOL_TLS1_3 && @@ -216,7 +224,8 @@ // We explicitly removed support for T048 and T049 to reduce test load. continue; } - supported_versions.push_back(ParsedQuicVersion(protocol, version)); + supported_versions[index] = ParsedQuicVersion(protocol, version); + index++; } } return supported_versions;
diff --git a/quic/core/quic_versions.h b/quic/core/quic_versions.h index 5b09ad6..44a2fa5 100644 --- a/quic/core/quic_versions.h +++ b/quic/core/quic_versions.h
@@ -15,6 +15,7 @@ #ifndef QUICHE_QUIC_CORE_QUIC_VERSIONS_H_ #define QUICHE_QUIC_CORE_QUIC_VERSIONS_H_ +#include <array> #include <string> #include <vector> @@ -143,6 +144,10 @@ : handshake_protocol(other.handshake_protocol), transport_version(other.transport_version) {} + constexpr ParsedQuicVersion() + : handshake_protocol(PROTOCOL_UNSUPPORTED), + transport_version(QUIC_VERSION_UNSUPPORTED) {} + ParsedQuicVersion& operator=(const ParsedQuicVersion& other) { if (this != &other) { handshake_protocol = other.handshake_protocol; @@ -218,13 +223,13 @@ // skipped as necessary). // // See go/new-quic-version for more details on how to roll out new versions. -static const QuicTransportVersion kSupportedTransportVersions[] = { +static const constexpr QuicTransportVersion kSupportedTransportVersions[] = { QUIC_VERSION_99, QUIC_VERSION_50, QUIC_VERSION_49, QUIC_VERSION_48, QUIC_VERSION_46, QUIC_VERSION_43, }; // This vector contains all crypto handshake protocols that are supported. -static const HandshakeProtocol kSupportedHandshakeProtocols[] = { +static const constexpr HandshakeProtocol kSupportedHandshakeProtocols[] = { PROTOCOL_QUIC_CRYPTO, PROTOCOL_TLS1_3}; typedef std::vector<QuicTransportVersion> QuicTransportVersionVector; @@ -232,10 +237,42 @@ // Returns a vector of QUIC versions in kSupportedTransportVersions. QUIC_EXPORT_PRIVATE QuicTransportVersionVector AllSupportedTransportVersions(); -// Returns a vector of QUIC versions that is the cartesian product of -// kSupportedTransportVersions and kSupportedHandshakeProtocols. +// DEPRECATED: Use SupportedVersions() instead. +// Returns a vector of all ParsedQuicVersions that are valid. QUIC_EXPORT_PRIVATE ParsedQuicVersionVector AllSupportedVersions(); +// Returns whether |transport_version| uses CRYPTO frames for the handshake +// instead of stream 1. +QUIC_EXPORT_PRIVATE inline constexpr bool QuicVersionUsesCryptoFrames( + QuicTransportVersion transport_version) { + return transport_version >= QUIC_VERSION_48; +} + +// Returns the size of the array/vector for +// SupportedVersions/AllSupportedVersions. +constexpr size_t NumSupportedVersions() { + size_t count = 0; + for (HandshakeProtocol protocol : kSupportedHandshakeProtocols) { + for (QuicTransportVersion version : kSupportedTransportVersions) { + if (protocol == PROTOCOL_TLS1_3 && + (!QuicVersionUsesCryptoFrames(version) || + version <= QUIC_VERSION_49)) { + // The TLS handshake is only deployable if CRYPTO frames are also used. + // We explicitly removed support for T048 and T049 to reduce test load. + continue; + } + count++; + } + } + return count; +} + +// Returns an array of all ParsedQuicVersions that are valid. This is a +// constexpr equivalent of AllSupportedVersions. +QUIC_EXPORT_PRIVATE constexpr std::array<ParsedQuicVersion, + NumSupportedVersions()> +SupportedVersions(); + // Returns a vector of QUIC versions that is the cartesian product of // kSupportedTransportVersions and kSupportedHandshakeProtocols, with any // versions disabled by flags excluded. @@ -390,13 +427,6 @@ return transport_version >= QUIC_VERSION_49; } -// Returns whether |transport_version| uses CRYPTO frames for the handshake -// instead of stream 1. -QUIC_EXPORT_PRIVATE inline bool QuicVersionUsesCryptoFrames( - QuicTransportVersion transport_version) { - return transport_version >= QUIC_VERSION_48; -} - // Returns whether |transport_version| makes use of IETF QUIC // frames or not. QUIC_EXPORT_PRIVATE inline bool VersionHasIetfQuicFrames(