Bring back the ParsedQuicVersionIsValid DCHECK
This DCHECK was originally added as part of cl/289536281 and subsequently removed in cl/289938397 to unbreak Chromium. This CL brings it back in a way that no longer breaks Chromium.
Confirmed that this works in Chromium:
https://chromium-review.googlesource.com/c/chromium/src/+/2008309
gfe-relnote: n/a, no behavior change apart from added DCHECK
PiperOrigin-RevId: 290353213
Change-Id: Id22e311b4162706f44ad7436eefacb4cc286afdd
diff --git a/quic/core/quic_versions.cc b/quic/core/quic_versions.cc
index f8acb5b..10d3c61 100644
--- a/quic/core/quic_versions.cc
+++ b/quic/core/quic_versions.cc
@@ -258,22 +258,6 @@
return supported_versions;
}
-bool ParsedQuicVersionIsValid(HandshakeProtocol handshake_protocol,
- QuicTransportVersion transport_version) {
- switch (handshake_protocol) {
- case PROTOCOL_UNSUPPORTED:
- return transport_version == QUIC_VERSION_UNSUPPORTED;
- case PROTOCOL_QUIC_CRYPTO:
- return transport_version != QUIC_VERSION_UNSUPPORTED;
- case PROTOCOL_TLS1_3:
- // The TLS handshake is only deployable if CRYPTO frames are also used.
- // We explicitly removed support for T048 and T049 to reduce test load.
- return QuicVersionUsesCryptoFrames(transport_version) &&
- transport_version > QUIC_VERSION_49;
- }
- return false;
-}
-
ParsedQuicVersionVector AllSupportedVersions() {
return ParsedQuicVersionVector(kSupportedVersions.begin(),
kSupportedVersions.end());
diff --git a/quic/core/quic_versions.h b/quic/core/quic_versions.h
index cb35d6d..e1165a1 100644
--- a/quic/core/quic_versions.h
+++ b/quic/core/quic_versions.h
@@ -137,13 +137,33 @@
QUIC_EXPORT_PRIVATE std::string HandshakeProtocolToString(
HandshakeProtocol handshake_protocol);
+// Returns whether |transport_version| uses CRYPTO frames for the handshake
+// instead of stream 1.
+QUIC_EXPORT_PRIVATE constexpr bool QuicVersionUsesCryptoFrames(
+ QuicTransportVersion transport_version) {
+ return transport_version >= QUIC_VERSION_48;
+}
+
// Returns whether this combination of handshake protocol and transport
// version is allowed. For example, {PROTOCOL_TLS1_3, QUIC_VERSION_43} is NOT
// allowed as TLS requires crypto frames which v43 does not support. Note that
// UnsupportedQuicVersion is a valid version.
-QUIC_EXPORT_PRIVATE bool ParsedQuicVersionIsValid(
+QUIC_EXPORT_PRIVATE constexpr bool ParsedQuicVersionIsValid(
HandshakeProtocol handshake_protocol,
- QuicTransportVersion transport_version);
+ QuicTransportVersion transport_version) {
+ switch (handshake_protocol) {
+ case PROTOCOL_UNSUPPORTED:
+ return transport_version == QUIC_VERSION_UNSUPPORTED;
+ case PROTOCOL_QUIC_CRYPTO:
+ return transport_version != QUIC_VERSION_UNSUPPORTED;
+ case PROTOCOL_TLS1_3:
+ // The TLS handshake is only deployable if CRYPTO frames are also used.
+ // We explicitly removed support for T048 and T049 to reduce test load.
+ return QuicVersionUsesCryptoFrames(transport_version) &&
+ transport_version > QUIC_VERSION_49;
+ }
+ return false;
+}
// A parsed QUIC version label which determines that handshake protocol
// and the transport version.
@@ -154,12 +174,20 @@
constexpr ParsedQuicVersion(HandshakeProtocol handshake_protocol,
QuicTransportVersion transport_version)
: handshake_protocol(handshake_protocol),
- transport_version(transport_version) {}
+ transport_version(transport_version) {
+ DCHECK(ParsedQuicVersionIsValid(handshake_protocol, transport_version))
+ << QuicVersionToString(transport_version) << " "
+ << HandshakeProtocolToString(handshake_protocol);
+ }
constexpr ParsedQuicVersion(const ParsedQuicVersion& other)
: ParsedQuicVersion(other.handshake_protocol, other.transport_version) {}
ParsedQuicVersion& operator=(const ParsedQuicVersion& other) {
+ DCHECK(ParsedQuicVersionIsValid(other.handshake_protocol,
+ other.transport_version))
+ << QuicVersionToString(other.transport_version) << " "
+ << HandshakeProtocolToString(other.handshake_protocol);
if (this != &other) {
handshake_protocol = other.handshake_protocol;
transport_version = other.transport_version;
@@ -423,13 +451,13 @@
}
// Returns true if |transport_version| uses IETF invariant headers.
-QUIC_EXPORT_PRIVATE inline bool VersionHasIetfInvariantHeader(
+QUIC_EXPORT_PRIVATE constexpr bool VersionHasIetfInvariantHeader(
QuicTransportVersion transport_version) {
return transport_version > QUIC_VERSION_43;
}
// Returns true if |transport_version| supports MESSAGE frames.
-QUIC_EXPORT_PRIVATE inline bool VersionSupportsMessageFrames(
+QUIC_EXPORT_PRIVATE constexpr bool VersionSupportsMessageFrames(
QuicTransportVersion transport_version) {
return transport_version >= QUIC_VERSION_46;
}
@@ -443,28 +471,21 @@
// * HEADERS frames are compressed using QPACK.
// * DATA frame has frame headers.
// * GOAWAY is moved to HTTP layer.
-QUIC_EXPORT_PRIVATE inline bool VersionUsesHttp3(
+QUIC_EXPORT_PRIVATE constexpr bool VersionUsesHttp3(
QuicTransportVersion transport_version) {
return transport_version == QUIC_VERSION_99;
}
// Returns whether the transport_version supports the variable length integer
// length field as defined by IETF QUIC draft-13 and later.
-QUIC_EXPORT_PRIVATE inline bool QuicVersionHasLongHeaderLengths(
+QUIC_EXPORT_PRIVATE constexpr bool QuicVersionHasLongHeaderLengths(
QuicTransportVersion transport_version) {
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(
+QUIC_EXPORT_PRIVATE constexpr bool VersionHasIetfQuicFrames(
QuicTransportVersion transport_version) {
return transport_version >= QUIC_VERSION_99;
}