Introduce QUIC version T051
This version is a minor upgrade to T050 that brings in features that have been added to draft-27 and draft-29. This will allow us to remove multiple codepaths when we deprecate T050 and draft-25.
Introduce QUIC version T051, protected by gfe2_reloadable_flag_quic_enable_version_t051
PiperOrigin-RevId: 324040649
Change-Id: I3501bf03939f29bd17416510f43bc85d30832e29
diff --git a/quic/core/crypto/crypto_utils.cc b/quic/core/crypto/crypto_utils.cc
index 033fcfd..3be4286 100644
--- a/quic/core/crypto/crypto_utils.cc
+++ b/quic/core/crypto/crypto_utils.cc
@@ -138,26 +138,30 @@
const uint8_t kT050Salt[] = {0x7f, 0xf5, 0x79, 0xe5, 0xac, 0xd0, 0x72,
0x91, 0x55, 0x80, 0x30, 0x4c, 0x43, 0xa2,
0x36, 0x7c, 0x60, 0x48, 0x83, 0x10};
+// Salt to use for initial obfuscators in version T051.
+const uint8_t kT051Salt[] = {0x7a, 0x4e, 0xde, 0xf4, 0xe7, 0xcc, 0xee,
+ 0x5f, 0xa4, 0x50, 0x6c, 0x19, 0x12, 0x4f,
+ 0xc8, 0xcc, 0xda, 0x6e, 0x03, 0x3d};
const uint8_t* InitialSaltForVersion(const ParsedQuicVersion& version,
size_t* out_len) {
- static_assert(SupportedVersions().size() == 7u,
+ static_assert(SupportedVersions().size() == 8u,
"Supported versions out of sync with initial encryption salts");
if (version == ParsedQuicVersion::Draft29()) {
*out_len = QUICHE_ARRAYSIZE(kDraft29InitialSalt);
return kDraft29InitialSalt;
- }
- if (version == ParsedQuicVersion::Draft27() ||
- version == ParsedQuicVersion::Draft25() ||
- version == ParsedQuicVersion::ReservedForNegotiation()) {
+ } else if (version == ParsedQuicVersion::Draft27() ||
+ version == ParsedQuicVersion::Draft25() ||
+ version == ParsedQuicVersion::ReservedForNegotiation()) {
*out_len = QUICHE_ARRAYSIZE(kDraft25InitialSalt);
return kDraft25InitialSalt;
- }
- if (version == ParsedQuicVersion::T050()) {
+ } else if (version == ParsedQuicVersion::T051()) {
+ *out_len = QUICHE_ARRAYSIZE(kT051Salt);
+ return kT051Salt;
+ } else if (version == ParsedQuicVersion::T050()) {
*out_len = QUICHE_ARRAYSIZE(kT050Salt);
return kT050Salt;
- }
- if (version == ParsedQuicVersion::Q050()) {
+ } else if (version == ParsedQuicVersion::Q050()) {
*out_len = QUICHE_ARRAYSIZE(kQ050Salt);
return kQ050Salt;
}
@@ -190,20 +194,26 @@
const uint8_t kT050RetryIntegrityKey[] = {0xc9, 0x2d, 0x32, 0x3d, 0x9c, 0xe3,
0x0d, 0xa0, 0x88, 0xb9, 0xb7, 0xbb,
0xdc, 0xcd, 0x50, 0xc8};
+const uint8_t kT051RetryIntegrityKey[] = {0x2e, 0xb9, 0x61, 0xa6, 0x79, 0x56,
+ 0xf8, 0x79, 0x53, 0x14, 0xda, 0xfb,
+ 0x2e, 0xbc, 0x83, 0xd7};
// Nonces used by Google versions of QUIC. When introducing a new version,
// generate a new nonce by running `openssl rand -hex 12`.
const uint8_t kT050RetryIntegrityNonce[] = {0x26, 0xe4, 0xd6, 0x23, 0x83, 0xd5,
0xc7, 0x60, 0xea, 0x02, 0xb4, 0x1f};
+const uint8_t kT051RetryIntegrityNonce[] = {0xb5, 0x0e, 0x4e, 0x53, 0x4c, 0xfc,
+ 0x0b, 0xbb, 0x85, 0xf2, 0xf9, 0xca};
bool RetryIntegrityKeysForVersion(const ParsedQuicVersion& version,
quiche::QuicheStringPiece* key,
quiche::QuicheStringPiece* nonce) {
+ static_assert(SupportedVersions().size() == 8u,
+ "Supported versions out of sync with retry integrity keys");
if (!version.HasRetryIntegrityTag()) {
QUIC_BUG << "Attempted to get retry integrity keys for invalid version "
<< version;
return false;
- }
- if (version == ParsedQuicVersion::Draft29()) {
+ } else if (version == ParsedQuicVersion::Draft29()) {
*key = quiche::QuicheStringPiece(
reinterpret_cast<const char*>(kDraft29RetryIntegrityKey),
QUICHE_ARRAYSIZE(kDraft29RetryIntegrityKey));
@@ -211,9 +221,8 @@
reinterpret_cast<const char*>(kDraft29RetryIntegrityNonce),
QUICHE_ARRAYSIZE(kDraft29RetryIntegrityNonce));
return true;
- }
- if (version == ParsedQuicVersion::Draft25() ||
- version == ParsedQuicVersion::Draft27()) {
+ } else if (version == ParsedQuicVersion::Draft25() ||
+ version == ParsedQuicVersion::Draft27()) {
*key = quiche::QuicheStringPiece(
reinterpret_cast<const char*>(kDraft25RetryIntegrityKey),
QUICHE_ARRAYSIZE(kDraft25RetryIntegrityKey));
@@ -221,8 +230,15 @@
reinterpret_cast<const char*>(kDraft25RetryIntegrityNonce),
QUICHE_ARRAYSIZE(kDraft25RetryIntegrityNonce));
return true;
- }
- if (version == ParsedQuicVersion::T050()) {
+ } else if (version == ParsedQuicVersion::T051()) {
+ *key = quiche::QuicheStringPiece(
+ reinterpret_cast<const char*>(kT051RetryIntegrityKey),
+ QUICHE_ARRAYSIZE(kT051RetryIntegrityKey));
+ *nonce = quiche::QuicheStringPiece(
+ reinterpret_cast<const char*>(kT051RetryIntegrityNonce),
+ QUICHE_ARRAYSIZE(kT051RetryIntegrityNonce));
+ return true;
+ } else if (version == ParsedQuicVersion::T050()) {
*key = quiche::QuicheStringPiece(
reinterpret_cast<const char*>(kT050RetryIntegrityKey),
QUICHE_ARRAYSIZE(kT050RetryIntegrityKey));
diff --git a/quic/core/http/quic_spdy_stream_test.cc b/quic/core/http/quic_spdy_stream_test.cc
index 64ef39a..bc09fc0 100644
--- a/quic/core/http/quic_spdy_stream_test.cc
+++ b/quic/core/http/quic_spdy_stream_test.cc
@@ -90,8 +90,7 @@
session()->connection()->client_connection_id());
}
}
- if (session()->connection()->version().handshake_protocol ==
- PROTOCOL_TLS1_3) {
+ if (session()->version().UsesTls()) {
TransportParameters transport_parameters;
EXPECT_TRUE(
session()->config()->FillTransportParameters(&transport_parameters));
@@ -109,12 +108,14 @@
ENCRYPTION_FORWARD_SECURE,
std::make_unique<NullEncrypter>(session()->perspective()));
session()->OnConfigNegotiated();
- if (session()->connection()->version().handshake_protocol ==
- PROTOCOL_TLS1_3) {
+ if (session()->version().UsesTls()) {
session()->OnOneRttKeysAvailable();
} else {
session()->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
}
+ if (session()->version().HasHandshakeDone()) {
+ EXPECT_CALL(*this, HasPendingRetransmission());
+ }
session()->DiscardOldEncryptionKey(ENCRYPTION_INITIAL);
}
diff --git a/quic/core/quic_dispatcher_test.cc b/quic/core/quic_dispatcher_test.cc
index a5f5f91..0dcf035 100644
--- a/quic/core/quic_dispatcher_test.cc
+++ b/quic/core/quic_dispatcher_test.cc
@@ -1086,7 +1086,7 @@
TEST_P(QuicDispatcherTestOneVersion,
RejectDeprecatedVersionsWithVersionNegotiation) {
- static_assert(quic::SupportedVersions().size() == 7u,
+ static_assert(quic::SupportedVersions().size() == 8u,
"Please add deprecated versions to this test");
QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
CreateTimeWaitListManager();
diff --git a/quic/core/quic_version_manager.cc b/quic/core/quic_version_manager.cc
index dc1d074..57db3c9 100644
--- a/quic/core/quic_version_manager.cc
+++ b/quic/core/quic_version_manager.cc
@@ -21,12 +21,13 @@
GetQuicReloadableFlag(quic_disable_version_draft_27)),
disable_version_draft_25_(
GetQuicReloadableFlag(quic_disable_version_draft_25)),
- disable_version_q050_(GetQuicReloadableFlag(quic_disable_version_q050)),
+ enable_version_t051_(GetQuicReloadableFlag(quic_enable_version_t051)),
disable_version_t050_(GetQuicReloadableFlag(quic_disable_version_t050)),
+ disable_version_q050_(GetQuicReloadableFlag(quic_disable_version_q050)),
disable_version_q046_(GetQuicReloadableFlag(quic_disable_version_q046)),
disable_version_q043_(GetQuicReloadableFlag(quic_disable_version_q043)),
allowed_supported_versions_(std::move(supported_versions)) {
- static_assert(SupportedVersions().size() == 7u,
+ static_assert(SupportedVersions().size() == 8u,
"Supported versions out of sync");
RefilterSupportedVersions();
}
@@ -56,7 +57,7 @@
}
void QuicVersionManager::MaybeRefilterSupportedVersions() {
- static_assert(SupportedVersions().size() == 7u,
+ static_assert(SupportedVersions().size() == 8u,
"Supported versions out of sync");
if (disable_version_draft_29_ !=
GetQuicReloadableFlag(quic_disable_version_draft_29) ||
@@ -64,10 +65,11 @@
GetQuicReloadableFlag(quic_disable_version_draft_27) ||
disable_version_draft_25_ !=
GetQuicReloadableFlag(quic_disable_version_draft_25) ||
- disable_version_q050_ !=
- GetQuicReloadableFlag(quic_disable_version_q050) ||
+ enable_version_t051_ != GetQuicReloadableFlag(quic_enable_version_t051) ||
disable_version_t050_ !=
GetQuicReloadableFlag(quic_disable_version_t050) ||
+ disable_version_q050_ !=
+ GetQuicReloadableFlag(quic_disable_version_q050) ||
disable_version_q046_ !=
GetQuicReloadableFlag(quic_disable_version_q046) ||
disable_version_q043_ !=
@@ -78,8 +80,9 @@
GetQuicReloadableFlag(quic_disable_version_draft_27);
disable_version_draft_25_ =
GetQuicReloadableFlag(quic_disable_version_draft_25);
- disable_version_q050_ = GetQuicReloadableFlag(quic_disable_version_q050);
+ enable_version_t051_ = GetQuicReloadableFlag(quic_enable_version_t051);
disable_version_t050_ = GetQuicReloadableFlag(quic_disable_version_t050);
+ disable_version_q050_ = GetQuicReloadableFlag(quic_disable_version_q050);
disable_version_q046_ = GetQuicReloadableFlag(quic_disable_version_q046);
disable_version_q043_ = GetQuicReloadableFlag(quic_disable_version_q043);
diff --git a/quic/core/quic_version_manager.h b/quic/core/quic_version_manager.h
index 0360485..9eb69ed 100644
--- a/quic/core/quic_version_manager.h
+++ b/quic/core/quic_version_manager.h
@@ -58,10 +58,12 @@
bool disable_version_draft_27_;
// quic_disable_version_draft_25 flag
bool disable_version_draft_25_;
- // quic_disable_version_q050 flag
- bool disable_version_q050_;
+ // quic_enable_version_t051 flag
+ bool enable_version_t051_;
// quic_disable_version_t050 flag
bool disable_version_t050_;
+ // quic_disable_version_q050 flag
+ bool disable_version_q050_;
// quic_disable_version_q046 flag
bool disable_version_q046_;
// quic_disable_version_q043 flag
diff --git a/quic/core/quic_version_manager_test.cc b/quic/core/quic_version_manager_test.cc
index 5f95871..eec910c 100644
--- a/quic/core/quic_version_manager_test.cc
+++ b/quic/core/quic_version_manager_test.cc
@@ -18,7 +18,7 @@
class QuicVersionManagerTest : public QuicTest {};
TEST_F(QuicVersionManagerTest, QuicVersionManager) {
- static_assert(SupportedVersions().size() == 7u,
+ static_assert(SupportedVersions().size() == 8u,
"Supported versions out of sync");
for (const ParsedQuicVersion& version : AllSupportedVersions()) {
QuicEnableVersion(version);
@@ -29,6 +29,7 @@
QuicVersionManager manager(AllSupportedVersions());
ParsedQuicVersionVector expected_parsed_versions;
+ expected_parsed_versions.push_back(ParsedQuicVersion::T051());
expected_parsed_versions.push_back(ParsedQuicVersion::T050());
expected_parsed_versions.push_back(ParsedQuicVersion::Q050());
expected_parsed_versions.push_back(ParsedQuicVersion::Q046());
@@ -40,47 +41,52 @@
manager.GetSupportedVersions());
EXPECT_EQ(CurrentSupportedVersionsWithQuicCrypto(),
manager.GetSupportedVersionsWithQuicCrypto());
- EXPECT_THAT(manager.GetSupportedAlpns(),
- ElementsAre("h3-T050", "h3-Q050", "h3-Q046", "h3-Q043"));
+ EXPECT_THAT(
+ manager.GetSupportedAlpns(),
+ ElementsAre("h3-T051", "h3-T050", "h3-Q050", "h3-Q046", "h3-Q043"));
+ int offset = 0;
QuicEnableVersion(ParsedQuicVersion::Draft29());
- expected_parsed_versions.insert(expected_parsed_versions.begin(),
+ expected_parsed_versions.insert(expected_parsed_versions.begin() + offset,
ParsedQuicVersion::Draft29());
EXPECT_EQ(expected_parsed_versions, manager.GetSupportedVersions());
- EXPECT_EQ(expected_parsed_versions.size() - 2,
+ EXPECT_EQ(expected_parsed_versions.size() - 3 - offset,
manager.GetSupportedVersionsWithQuicCrypto().size());
EXPECT_EQ(FilterSupportedVersions(AllSupportedVersions()),
manager.GetSupportedVersions());
EXPECT_EQ(CurrentSupportedVersionsWithQuicCrypto(),
manager.GetSupportedVersionsWithQuicCrypto());
EXPECT_THAT(manager.GetSupportedAlpns(),
- ElementsAre("h3-29", "h3-T050", "h3-Q050", "h3-Q046", "h3-Q043"));
-
- QuicEnableVersion(ParsedQuicVersion::Draft27());
- expected_parsed_versions.insert(expected_parsed_versions.begin() + 1,
- ParsedQuicVersion::Draft27());
- EXPECT_EQ(expected_parsed_versions, manager.GetSupportedVersions());
- EXPECT_EQ(expected_parsed_versions.size() - 3,
- manager.GetSupportedVersionsWithQuicCrypto().size());
- EXPECT_EQ(FilterSupportedVersions(AllSupportedVersions()),
- manager.GetSupportedVersions());
- EXPECT_EQ(CurrentSupportedVersionsWithQuicCrypto(),
- manager.GetSupportedVersionsWithQuicCrypto());
- EXPECT_THAT(manager.GetSupportedAlpns(),
- ElementsAre("h3-29", "h3-27", "h3-T050", "h3-Q050", "h3-Q046",
+ ElementsAre("h3-29", "h3-T051", "h3-T050", "h3-Q050", "h3-Q046",
"h3-Q043"));
+ offset++;
+ QuicEnableVersion(ParsedQuicVersion::Draft27());
+ expected_parsed_versions.insert(expected_parsed_versions.begin() + offset,
+ ParsedQuicVersion::Draft27());
+ EXPECT_EQ(expected_parsed_versions, manager.GetSupportedVersions());
+ EXPECT_EQ(expected_parsed_versions.size() - 3 - offset,
+ manager.GetSupportedVersionsWithQuicCrypto().size());
+ EXPECT_EQ(FilterSupportedVersions(AllSupportedVersions()),
+ manager.GetSupportedVersions());
+ EXPECT_EQ(CurrentSupportedVersionsWithQuicCrypto(),
+ manager.GetSupportedVersionsWithQuicCrypto());
+ EXPECT_THAT(manager.GetSupportedAlpns(),
+ ElementsAre("h3-29", "h3-27", "h3-T051", "h3-T050", "h3-Q050",
+ "h3-Q046", "h3-Q043"));
+
+ offset++;
QuicEnableVersion(ParsedQuicVersion::Draft25());
- expected_parsed_versions.insert(expected_parsed_versions.begin() + 2,
+ expected_parsed_versions.insert(expected_parsed_versions.begin() + offset,
ParsedQuicVersion::Draft25());
EXPECT_EQ(expected_parsed_versions, manager.GetSupportedVersions());
- EXPECT_EQ(expected_parsed_versions.size() - 4,
+ EXPECT_EQ(expected_parsed_versions.size() - 3 - offset,
manager.GetSupportedVersionsWithQuicCrypto().size());
EXPECT_EQ(CurrentSupportedVersionsWithQuicCrypto(),
manager.GetSupportedVersionsWithQuicCrypto());
EXPECT_THAT(manager.GetSupportedAlpns(),
- ElementsAre("h3-29", "h3-27", "h3-25", "h3-T050", "h3-Q050",
- "h3-Q046", "h3-Q043"));
+ ElementsAre("h3-29", "h3-27", "h3-25", "h3-T051", "h3-T050",
+ "h3-Q050", "h3-Q046", "h3-Q043"));
}
} // namespace
diff --git a/quic/core/quic_versions.cc b/quic/core/quic_versions.cc
index 1ba151c..fbd6c0f 100644
--- a/quic/core/quic_versions.cc
+++ b/quic/core/quic_versions.cc
@@ -40,7 +40,7 @@
}
void SetVersionFlag(const ParsedQuicVersion& version, bool should_enable) {
- static_assert(SupportedVersions().size() == 7u,
+ static_assert(SupportedVersions().size() == 8u,
"Supported versions out of sync");
const bool enable = should_enable;
const bool disable = !should_enable;
@@ -50,6 +50,8 @@
SetQuicReloadableFlag(quic_disable_version_draft_27, disable);
} else if (version == ParsedQuicVersion::Draft25()) {
SetQuicReloadableFlag(quic_disable_version_draft_25, disable);
+ } else if (version == ParsedQuicVersion::T051()) {
+ SetQuicReloadableFlag(quic_enable_version_t051, enable);
} else if (version == ParsedQuicVersion::T050()) {
SetQuicReloadableFlag(quic_disable_version_t050, disable);
} else if (version == ParsedQuicVersion::Q050()) {
@@ -177,19 +179,25 @@
bool ParsedQuicVersion::HasHandshakeDone() const {
DCHECK(IsKnown());
- return HasIetfQuicFrames() && handshake_protocol == PROTOCOL_TLS1_3;
+ // HANDSHAKE_DONE is supported in T051 and all IETF drafts since draft-25.
+ return UsesTls() && transport_version > QUIC_VERSION_50;
}
bool ParsedQuicVersion::HasVarIntTransportParams() const {
DCHECK(IsKnown());
- // Variable-length integer transport parameters were added in draft-27.
- return transport_version > QUIC_VERSION_IETF_DRAFT_25;
+ // Variable-length integer transport parameters are supported in T051 and
+ // all IETF drafts since draft-27.
+ return UsesTls() && transport_version > QUIC_VERSION_50 &&
+ transport_version != QUIC_VERSION_IETF_DRAFT_25;
}
bool ParsedQuicVersion::AuthenticatesHandshakeConnectionIds() const {
DCHECK(IsKnown());
- // Authentication of handshake connection IDs was added in draft-28.
- return transport_version > QUIC_VERSION_IETF_DRAFT_27;
+ // Authentication of handshake connection IDs is supported in T051 and
+ // all IETF drafts since draft-28.
+ return UsesTls() && transport_version > QUIC_VERSION_50 &&
+ transport_version != QUIC_VERSION_IETF_DRAFT_25 &&
+ transport_version != QUIC_VERSION_IETF_DRAFT_27;
}
bool ParsedQuicVersion::UsesTls() const {
@@ -233,7 +241,7 @@
}
QuicVersionLabel CreateQuicVersionLabel(ParsedQuicVersion parsed_version) {
- static_assert(SupportedVersions().size() == 7u,
+ static_assert(SupportedVersions().size() == 8u,
"Supported versions out of sync");
if (parsed_version == ParsedQuicVersion::Draft29()) {
return MakeVersionLabel(0xff, 0x00, 0x00, 29);
@@ -241,6 +249,8 @@
return MakeVersionLabel(0xff, 0x00, 0x00, 27);
} else if (parsed_version == ParsedQuicVersion::Draft25()) {
return MakeVersionLabel(0xff, 0x00, 0x00, 25);
+ } else if (parsed_version == ParsedQuicVersion::T051()) {
+ return MakeVersionLabel('T', '0', '5', '1');
} else if (parsed_version == ParsedQuicVersion::T050()) {
return MakeVersionLabel('T', '0', '5', '0');
} else if (parsed_version == ParsedQuicVersion::Q050()) {
@@ -423,6 +433,10 @@
if (!GetQuicReloadableFlag(quic_disable_version_draft_25)) {
filtered_versions.push_back(version);
}
+ } else if (version == ParsedQuicVersion::T051()) {
+ if (GetQuicReloadableFlag(quic_enable_version_t051)) {
+ filtered_versions.push_back(version);
+ }
} else if (version == ParsedQuicVersion::T050()) {
if (!GetQuicReloadableFlag(quic_disable_version_t050)) {
filtered_versions.push_back(version);
@@ -527,12 +541,13 @@
return #x
std::string QuicVersionToString(QuicTransportVersion transport_version) {
- static_assert(SupportedTransportVersions().size() == 6u,
+ static_assert(SupportedTransportVersions().size() == 7u,
"Supported versions out of sync");
switch (transport_version) {
RETURN_STRING_LITERAL(QUIC_VERSION_43);
RETURN_STRING_LITERAL(QUIC_VERSION_46);
RETURN_STRING_LITERAL(QUIC_VERSION_50);
+ RETURN_STRING_LITERAL(QUIC_VERSION_51);
RETURN_STRING_LITERAL(QUIC_VERSION_IETF_DRAFT_25);
RETURN_STRING_LITERAL(QUIC_VERSION_IETF_DRAFT_27);
RETURN_STRING_LITERAL(QUIC_VERSION_IETF_DRAFT_29);
@@ -554,7 +569,7 @@
}
std::string ParsedQuicVersionToString(ParsedQuicVersion version) {
- static_assert(SupportedVersions().size() == 7u,
+ static_assert(SupportedVersions().size() == 8u,
"Supported versions out of sync");
if (version == UnsupportedQuicVersion()) {
return "0";
diff --git a/quic/core/quic_versions.h b/quic/core/quic_versions.h
index aaceba1..7ea590a 100644
--- a/quic/core/quic_versions.h
+++ b/quic/core/quic_versions.h
@@ -117,6 +117,7 @@
// Version 49 added client connection IDs, long header lengths, and the IETF
// header format from draft-ietf-quic-invariants-06
QUIC_VERSION_50 = 50, // Header protection and initial obfuscators.
+ QUIC_VERSION_51 = 51, // draft-29 features but with GoogleQUIC frames.
QUIC_VERSION_IETF_DRAFT_25 = 70, // draft-ietf-quic-transport-25.
QUIC_VERSION_IETF_DRAFT_27 = 71, // draft-ietf-quic-transport-27.
// Number 72 used to represent draft-ietf-quic-transport-28.
@@ -135,10 +136,11 @@
// This array contains QUIC transport versions which we currently support.
// DEPRECATED. Use SupportedVersions() instead.
-constexpr std::array<QuicTransportVersion, 6> SupportedTransportVersions() {
+constexpr std::array<QuicTransportVersion, 7> SupportedTransportVersions() {
return {QUIC_VERSION_IETF_DRAFT_29,
QUIC_VERSION_IETF_DRAFT_27,
QUIC_VERSION_IETF_DRAFT_25,
+ QUIC_VERSION_51,
QUIC_VERSION_50,
QUIC_VERSION_46,
QUIC_VERSION_43};
@@ -197,6 +199,7 @@
return transport_version == QUIC_VERSION_UNSUPPORTED;
case PROTOCOL_QUIC_CRYPTO:
return transport_version != QUIC_VERSION_UNSUPPORTED &&
+ transport_version != QUIC_VERSION_51 &&
transport_version != QUIC_VERSION_IETF_DRAFT_25 &&
transport_version != QUIC_VERSION_IETF_DRAFT_27 &&
transport_version != QUIC_VERSION_IETF_DRAFT_29;
@@ -259,6 +262,10 @@
return ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25);
}
+ static constexpr ParsedQuicVersion T051() {
+ return ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_51);
+ }
+
static constexpr ParsedQuicVersion T050() {
return ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50);
}
@@ -415,12 +422,12 @@
return {PROTOCOL_TLS1_3, PROTOCOL_QUIC_CRYPTO};
}
-constexpr std::array<ParsedQuicVersion, 7> SupportedVersions() {
+constexpr std::array<ParsedQuicVersion, 8> SupportedVersions() {
return {
ParsedQuicVersion::Draft29(), ParsedQuicVersion::Draft27(),
- ParsedQuicVersion::Draft25(), ParsedQuicVersion::T050(),
- ParsedQuicVersion::Q050(), ParsedQuicVersion::Q046(),
- ParsedQuicVersion::Q043(),
+ ParsedQuicVersion::Draft25(), ParsedQuicVersion::T051(),
+ ParsedQuicVersion::T050(), ParsedQuicVersion::Q050(),
+ ParsedQuicVersion::Q046(), ParsedQuicVersion::Q043(),
};
}
@@ -604,7 +611,7 @@
// * GOAWAY is moved to HTTP layer.
QUIC_EXPORT_PRIVATE constexpr bool VersionUsesHttp3(
QuicTransportVersion transport_version) {
- return transport_version >= QUIC_VERSION_IETF_DRAFT_25;
+ return transport_version > QUIC_VERSION_51;
}
// Returns whether the transport_version supports the variable length integer
diff --git a/quic/core/quic_versions_test.cc b/quic/core/quic_versions_test.cc
index 64f0706..a79be65 100644
--- a/quic/core/quic_versions_test.cc
+++ b/quic/core/quic_versions_test.cc
@@ -520,28 +520,27 @@
// yet a typo was made in doing the #defines and it was caught
// only in some test far removed from here... Better safe than sorry.
TEST_F(QuicVersionsTest, CheckTransportVersionNumbersForTypos) {
- static_assert(SupportedTransportVersions().size() == 6u,
+ static_assert(SupportedTransportVersions().size() == 7u,
"Supported versions out of sync");
EXPECT_EQ(QUIC_VERSION_43, 43);
EXPECT_EQ(QUIC_VERSION_46, 46);
EXPECT_EQ(QUIC_VERSION_50, 50);
+ EXPECT_EQ(QUIC_VERSION_51, 51);
EXPECT_EQ(QUIC_VERSION_IETF_DRAFT_25, 70);
EXPECT_EQ(QUIC_VERSION_IETF_DRAFT_27, 71);
EXPECT_EQ(QUIC_VERSION_IETF_DRAFT_29, 73);
}
TEST_F(QuicVersionsTest, AlpnForVersion) {
- static_assert(SupportedVersions().size() == 7u,
+ static_assert(SupportedVersions().size() == 8u,
"Supported versions out of sync");
- ParsedQuicVersion parsed_version_q050 = ParsedQuicVersion::Q050();
- ParsedQuicVersion parsed_version_t050 = ParsedQuicVersion::T050();
- ParsedQuicVersion parsed_version_draft_25 = ParsedQuicVersion::Draft25();
- ParsedQuicVersion parsed_version_draft_27 = ParsedQuicVersion::Draft27();
-
- EXPECT_EQ("h3-Q050", AlpnForVersion(parsed_version_q050));
- EXPECT_EQ("h3-T050", AlpnForVersion(parsed_version_t050));
- EXPECT_EQ("h3-25", AlpnForVersion(parsed_version_draft_25));
- EXPECT_EQ("h3-27", AlpnForVersion(parsed_version_draft_27));
+ EXPECT_EQ("h3-Q043", AlpnForVersion(ParsedQuicVersion::Q043()));
+ EXPECT_EQ("h3-Q046", AlpnForVersion(ParsedQuicVersion::Q046()));
+ EXPECT_EQ("h3-Q050", AlpnForVersion(ParsedQuicVersion::Q050()));
+ EXPECT_EQ("h3-T050", AlpnForVersion(ParsedQuicVersion::T050()));
+ EXPECT_EQ("h3-T051", AlpnForVersion(ParsedQuicVersion::T051()));
+ EXPECT_EQ("h3-25", AlpnForVersion(ParsedQuicVersion::Draft25()));
+ EXPECT_EQ("h3-27", AlpnForVersion(ParsedQuicVersion::Draft27()));
EXPECT_EQ("h3-29", AlpnForVersion(ParsedQuicVersion::Draft29()));
}