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