gfe-relnote: In QUIC, add VersionHasIetfInvariantHeader and VersionSupportsMessageFrames. No functional change expected. Not protected.
PiperOrigin-RevId: 250714233
Change-Id: I9f540d239b84285f83fe5774866ebd345ce09532
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc
index 0a0326c..68655c8 100644
--- a/quic/core/http/end_to_end_test.cc
+++ b/quic/core/http/end_to_end_test.cc
@@ -472,9 +472,11 @@
// Client supports IETF QUIC, while it is not supported by server.
bool ClientSupportsIetfQuicNotSupportedByServer() {
- return client_supported_versions_[0].transport_version > QUIC_VERSION_43 &&
- FilterSupportedVersions(GetParam().server_supported_versions)[0]
- .transport_version <= QUIC_VERSION_43;
+ return VersionHasIetfInvariantHeader(
+ client_supported_versions_[0].transport_version) &&
+ !VersionHasIetfInvariantHeader(
+ FilterSupportedVersions(GetParam().server_supported_versions)[0]
+ .transport_version);
}
// Returns true when client starts with an unsupported version, and client
@@ -485,7 +487,7 @@
}
bool SupportsIetfQuicWithTls(ParsedQuicVersion version) {
- return version.transport_version > QUIC_VERSION_43 &&
+ return VersionHasIetfInvariantHeader(version.transport_version) &&
version.handshake_protocol == PROTOCOL_TLS1_3;
}
@@ -1662,7 +1664,8 @@
}
TEST_P(EndToEndTest, 0ByteConnectionId) {
- if (GetParam().negotiated_version.transport_version > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(
+ GetParam().negotiated_version.transport_version)) {
// SetBytesForConnectionIdToSend only applies to Google QUIC encoding.
ASSERT_TRUE(Initialize());
return;
@@ -1684,7 +1687,8 @@
}
TEST_P(EndToEndTestWithTls, 8ByteConnectionId) {
- if (GetParam().negotiated_version.transport_version > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(
+ GetParam().negotiated_version.transport_version)) {
// SetBytesForConnectionIdToSend only applies to Google QUIC encoding.
ASSERT_TRUE(Initialize());
return;
@@ -1702,7 +1706,8 @@
}
TEST_P(EndToEndTestWithTls, 15ByteConnectionId) {
- if (GetParam().negotiated_version.transport_version > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(
+ GetParam().negotiated_version.transport_version)) {
// SetBytesForConnectionIdToSend only applies to Google QUIC encoding.
ASSERT_TRUE(Initialize());
return;
@@ -2253,7 +2258,7 @@
QuicFramer framer(server_supported_versions_, QuicTime::Zero(),
Perspective::IS_SERVER, kQuicDefaultConnectionIdLength);
std::unique_ptr<QuicEncryptedPacket> packet;
- if (client_connection->transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(client_connection->transport_version())) {
packet = framer.BuildIetfStatelessResetPacket(connection_id,
stateless_reset_token);
} else {
@@ -2302,7 +2307,7 @@
testing::NiceMock<MockQuicConnectionDebugVisitor> visitor;
client_->client()->client_session()->connection()->set_debug_visitor(
&visitor);
- if (client_connection->transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(client_connection->transport_version())) {
packet = framer.BuildIetfStatelessResetPacket(incorrect_connection_id,
stateless_reset_token);
EXPECT_CALL(visitor, OnIncorrectConnectionId(incorrect_connection_id))
@@ -2320,7 +2325,7 @@
client_->client()->network_helper()->GetLatestClientAddress(), nullptr);
server_thread_->Resume();
- if (client_connection->transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(client_connection->transport_version())) {
// The request should fail. IETF stateless reset does not include connection
// ID.
EXPECT_EQ("", client_->SendSynchronousRequest("/foo"));
@@ -2377,7 +2382,7 @@
std::unique_ptr<QuicEncryptedPacket> packet(
QuicFramer::BuildVersionNegotiationPacket(
incorrect_connection_id, EmptyQuicConnectionId(),
- client_connection->transport_version() > QUIC_VERSION_43,
+ VersionHasIetfInvariantHeader(client_connection->transport_version()),
server_supported_versions_));
testing::NiceMock<MockQuicConnectionDebugVisitor> visitor;
client_connection->set_debug_visitor(&visitor);
@@ -3285,8 +3290,10 @@
client_.reset(CreateQuicClient(client_writer_));
EXPECT_EQ("", client_->SendSynchronousRequest("/foo"));
- if (client_->client()->client_session()->connection()->transport_version() >
- QUIC_VERSION_43 ||
+ if (VersionHasIetfInvariantHeader(client_->client()
+ ->client_session()
+ ->connection()
+ ->transport_version()) ||
GetQuicReloadableFlag(quic_terminate_gquic_connection_as_ietf)) {
EXPECT_EQ(QUIC_HANDSHAKE_FAILED, client_->connection_error());
} else {
@@ -3486,7 +3493,7 @@
EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed());
QuicSession* client_session = client_->client()->client_session();
QuicConnection* client_connection = client_session->connection();
- if (client_connection->transport_version() <= QUIC_VERSION_44) {
+ if (!VersionSupportsMessageFrames(client_connection->transport_version())) {
return;
}
@@ -3762,9 +3769,9 @@
// This test ensures ZERO_RTT_PROTECTED connection close could close a client
// which has switched to forward secure.
connect_to_server_on_initialize_ =
- negotiated_version_.transport_version <= QUIC_VERSION_43;
+ !VersionHasIetfInvariantHeader(negotiated_version_.transport_version);
ASSERT_TRUE(Initialize());
- if (negotiated_version_.transport_version <= QUIC_VERSION_43) {
+ if (!VersionHasIetfInvariantHeader(negotiated_version_.transport_version)) {
// Only runs for IETF QUIC header.
return;
}
@@ -3823,9 +3830,9 @@
// This test ensures ZERO_RTT_PROTECTED connection close is sent to a client
// which has ZERO_RTT_PROTECTED encryption level.
connect_to_server_on_initialize_ =
- negotiated_version_.transport_version <= QUIC_VERSION_43;
+ !VersionHasIetfInvariantHeader(negotiated_version_.transport_version);
ASSERT_TRUE(Initialize());
- if (negotiated_version_.transport_version <= QUIC_VERSION_43) {
+ if (!VersionHasIetfInvariantHeader(negotiated_version_.transport_version)) {
// Only runs for IETF QUIC header.
return;
}
diff --git a/quic/core/http/quic_spdy_client_session_test.cc b/quic/core/http/quic_spdy_client_session_test.cc
index b718278..847de2b 100644
--- a/quic/core/http/quic_spdy_client_session_test.cc
+++ b/quic/core/http/quic_spdy_client_session_test.cc
@@ -560,7 +560,7 @@
ParsedQuicVersionVector versions = {GetParam()};
bool version_flag = false;
QuicConnectionIdIncluded scid_included = CONNECTION_ID_ABSENT;
- if (GetParam().transport_version > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(GetParam().transport_version)) {
version_flag = true;
source_connection_id = destination_connection_id;
scid_included = CONNECTION_ID_PRESENT;
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 226a4cc..35f0752 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -332,7 +332,8 @@
next_mtu_probe_at_(kPacketsBetweenMtuProbesBase),
largest_received_packet_size_(0),
write_error_occurred_(false),
- no_stop_waiting_frames_(transport_version() > QUIC_VERSION_43),
+ no_stop_waiting_frames_(
+ VersionHasIetfInvariantHeader(transport_version())),
consecutive_num_packets_with_no_retransmittable_frames_(0),
max_consecutive_num_packets_with_no_retransmittable_frames_(
kMaxConsecutiveNonRetransmittablePackets),
@@ -685,7 +686,7 @@
MaybeEnableSessionDecidesWhatToWrite();
no_stop_waiting_frames_ =
- received_version.transport_version > QUIC_VERSION_43;
+ VersionHasIetfInvariantHeader(received_version.transport_version);
// TODO(satyamshekhar): Store the packet number of this packet and close the
// connection if we ever received a packet with incorrect version and whose
@@ -771,7 +772,7 @@
QUIC_DLOG(INFO) << ENDPOINT << "Negotiated version: "
<< ParsedQuicVersionToString(version());
- no_stop_waiting_frames_ = transport_version() > QUIC_VERSION_43;
+ no_stop_waiting_frames_ = VersionHasIetfInvariantHeader(transport_version());
version_negotiation_state_ = NEGOTIATION_IN_PROGRESS;
RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
@@ -2173,7 +2174,7 @@
if (version_negotiation_state_ != NEGOTIATED_VERSION) {
if (perspective_ == Perspective::IS_CLIENT) {
DCHECK(!header.version_flag || header.form != GOOGLE_QUIC_PACKET);
- if (framer_.transport_version() <= QUIC_VERSION_43) {
+ if (!VersionHasIetfInvariantHeader(framer_.transport_version())) {
// If the client gets a packet without the version flag from the server
// it should stop sending version since the version negotiation is done.
// IETF QUIC stops sending version once encryption level switches to
@@ -2727,7 +2728,7 @@
break;
default:
// We can't send an error as the socket is presumably borked.
- if (transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(transport_version())) {
QUIC_CODE_COUNT(quic_tear_down_local_connection_on_write_error_ietf);
} else {
QUIC_CODE_COUNT(
@@ -2749,7 +2750,7 @@
// loop here.
// TODO(ianswett): This is actually an internal error, not an
// encryption failure.
- if (transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(transport_version())) {
QUIC_CODE_COUNT(
quic_tear_down_local_connection_on_serialized_packet_ietf);
} else {
@@ -2777,7 +2778,7 @@
const std::string& error_details) {
// The packet creator or generator encountered an unrecoverable error: tear
// down local connection state immediately.
- if (transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(transport_version())) {
QUIC_CODE_COUNT(
quic_tear_down_local_connection_on_unrecoverable_error_ietf);
} else {
@@ -3999,7 +4000,7 @@
MessageStatus QuicConnection::SendMessage(QuicMessageId message_id,
QuicMemSliceSpan message) {
- if (transport_version() <= QUIC_VERSION_44) {
+ if (!VersionSupportsMessageFrames(transport_version())) {
QUIC_BUG << "MESSAGE frame is not supported for version "
<< transport_version();
return MESSAGE_STATUS_UNSUPPORTED;
@@ -4059,7 +4060,7 @@
}
if (framer_.HasEncrypterOfEncryptionLevel(ENCRYPTION_ZERO_RTT)) {
if (encryption_level_ != ENCRYPTION_ZERO_RTT) {
- if (transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(transport_version())) {
QUIC_CODE_COUNT(quic_wrong_encryption_level_connection_close_ietf);
} else {
QUIC_CODE_COUNT(quic_wrong_encryption_level_connection_close);
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 554f71a..fb3d21b 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -883,11 +883,12 @@
{AckResponse::kDefer, AckResponse::kImmediate}) {
for (bool no_stop_waiting : {true, false}) {
// After version 43, never use STOP_WAITING.
- params.push_back(TestParams(
- all_supported_versions[i], ack_response,
- all_supported_versions[i].transport_version <= QUIC_VERSION_43
- ? no_stop_waiting
- : true));
+ params.push_back(
+ TestParams(all_supported_versions[i], ack_response,
+ !VersionHasIetfInvariantHeader(
+ all_supported_versions[i].transport_version)
+ ? no_stop_waiting
+ : true));
}
}
}
@@ -948,7 +949,7 @@
}
QuicFramerPeer::SetLastSerializedServerConnectionId(
QuicConnectionPeer::GetFramer(&connection_), connection_id_);
- if (version().transport_version > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(version().transport_version)) {
EXPECT_TRUE(QuicConnectionPeer::GetNoStopWaitingFrames(&connection_));
} else {
QuicConnectionPeer::SetNoStopWaitingFrames(&connection_,
@@ -1126,7 +1127,7 @@
header.destination_connection_id = connection_id_;
header.packet_number_length = packet_number_length_;
header.destination_connection_id_included = connection_id_included_;
- if ((peer_framer_.transport_version() > QUIC_VERSION_43 ||
+ if ((VersionHasIetfInvariantHeader(peer_framer_.transport_version()) ||
GetQuicRestartFlag(quic_do_not_override_connection_id)) &&
peer_framer_.perspective() == Perspective::IS_SERVER) {
header.destination_connection_id_included = CONNECTION_ID_ABSENT;
@@ -1347,7 +1348,7 @@
QuicPacketHeader ConstructPacketHeader(uint64_t number,
EncryptionLevel level) {
QuicPacketHeader header;
- if (peer_framer_.transport_version() > QUIC_VERSION_43 &&
+ if (VersionHasIetfInvariantHeader(peer_framer_.transport_version()) &&
level < ENCRYPTION_FORWARD_SECURE) {
// Set long header type accordingly.
header.version_flag = true;
@@ -1371,7 +1372,7 @@
header.destination_connection_id = connection_id_;
header.destination_connection_id_included = connection_id_included_;
}
- if (peer_framer_.transport_version() > QUIC_VERSION_43 &&
+ if (VersionHasIetfInvariantHeader(peer_framer_.transport_version()) &&
peer_framer_.perspective() == Perspective::IS_SERVER) {
header.destination_connection_id_included = CONNECTION_ID_ABSENT;
if (header.version_flag) {
@@ -1420,12 +1421,12 @@
peer_framer_.perspective() == Perspective::IS_SERVER) {
header.source_connection_id = connection_id_;
header.destination_connection_id_included = CONNECTION_ID_ABSENT;
- if (peer_framer_.transport_version() <= QUIC_VERSION_43) {
+ if (!VersionHasIetfInvariantHeader(peer_framer_.transport_version())) {
header.source_connection_id_included = CONNECTION_ID_PRESENT;
}
} else {
header.destination_connection_id = connection_id_;
- if (peer_framer_.transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(peer_framer_.transport_version())) {
header.destination_connection_id_included = CONNECTION_ID_ABSENT;
}
}
@@ -2589,13 +2590,13 @@
QuicPacketNumber retransmission;
// Packet 1 is short header for IETF QUIC because the encryption level
// switched to ENCRYPTION_FORWARD_SECURE in SendStreamDataToPeer.
- EXPECT_CALL(
- *send_algorithm_,
- OnPacketSent(_, _, _,
- GetParam().version.transport_version > QUIC_VERSION_43
- ? packet_size
- : packet_size - kQuicVersionSize,
- _))
+ EXPECT_CALL(*send_algorithm_,
+ OnPacketSent(_, _, _,
+ VersionHasIetfInvariantHeader(
+ GetParam().version.transport_version)
+ ? packet_size
+ : packet_size - kQuicVersionSize,
+ _))
.WillOnce(SaveArg<2>(&retransmission));
ProcessAckPacket(&frame);
@@ -2742,7 +2743,7 @@
}
TEST_P(QuicConnectionTest, LeastUnackedLower) {
- if (GetParam().version.transport_version > QUIC_VERSION_43 ||
+ if (VersionHasIetfInvariantHeader(GetParam().version.transport_version) ||
connection_.SupportsMultiplePacketNumberSpaces()) {
return;
}
@@ -3564,13 +3565,13 @@
EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _));
// Packet 1 is short header for IETF QUIC because the encryption level
// switched to ENCRYPTION_FORWARD_SECURE in SendStreamDataToPeer.
- EXPECT_CALL(
- *send_algorithm_,
- OnPacketSent(_, _, _,
- GetParam().version.transport_version > QUIC_VERSION_43
- ? packet_size
- : packet_size - kQuicVersionSize,
- _));
+ EXPECT_CALL(*send_algorithm_,
+ OnPacketSent(_, _, _,
+ VersionHasIetfInvariantHeader(
+ GetParam().version.transport_version)
+ ? packet_size
+ : packet_size - kQuicVersionSize,
+ _));
ProcessAckPacket(&frame);
}
@@ -5493,7 +5494,7 @@
TEST_P(QuicConnectionTest, LoopThroughSendingPacketsWithTruncation) {
set_perspective(Perspective::IS_SERVER);
- if (GetParam().version.transport_version <= QUIC_VERSION_43) {
+ if (!VersionHasIetfInvariantHeader(GetParam().version.transport_version)) {
// For IETF QUIC, encryption level will be switched to FORWARD_SECURE in
// SendStreamDataWithString.
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
@@ -5519,7 +5520,7 @@
EXPECT_EQ(payload.size(),
connection_.SendStreamDataWithString(3, payload, 1350, NO_FIN)
.bytes_consumed);
- if (connection_.transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(connection_.transport_version())) {
// Short header packets sent from server omit connection ID already, and
// stream offset size increases from 0 to 2.
EXPECT_EQ(non_truncated_packet_size, writer_->last_packet_size() - 2);
@@ -6642,7 +6643,7 @@
}
TEST_P(QuicConnectionTest, PublicReset) {
- if (GetParam().version.transport_version > QUIC_VERSION_43 ||
+ if (VersionHasIetfInvariantHeader(GetParam().version.transport_version) ||
connection_.SupportsMultiplePacketNumberSpaces()) {
return;
}
@@ -6659,7 +6660,7 @@
}
TEST_P(QuicConnectionTest, IetfStatelessReset) {
- if (GetParam().version.transport_version <= QUIC_VERSION_43 ||
+ if (!VersionHasIetfInvariantHeader(GetParam().version.transport_version) ||
connection_.SupportsMultiplePacketNumberSpaces()) {
return;
}
@@ -6725,7 +6726,7 @@
}
TEST_P(QuicConnectionTest, MissingPacketsBeforeLeastUnacked) {
- if (GetParam().version.transport_version > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(GetParam().version.transport_version)) {
return;
}
// Set the packet number of the ack packet to be least unacked (4).
@@ -6740,7 +6741,7 @@
SetQuicReloadableFlag(quic_enable_version_99, false);
connection_.SetSupportedVersions(CurrentSupportedVersions());
set_perspective(Perspective::IS_SERVER);
- if (GetParam().version.transport_version > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(GetParam().version.transport_version)) {
peer_framer_.set_version_for_tests(
ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_99));
} else {
@@ -6793,7 +6794,7 @@
SetQuicReloadableFlag(quic_enable_version_99, false);
connection_.SetSupportedVersions(CurrentSupportedVersions());
set_perspective(Perspective::IS_SERVER);
- if (GetParam().version.transport_version > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(GetParam().version.transport_version)) {
peer_framer_.set_version_for_tests(
ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_99));
} else {
@@ -6853,7 +6854,7 @@
SetQuicReloadableFlag(quic_enable_version_99, false);
connection_.SetSupportedVersions(CurrentSupportedVersions());
set_perspective(Perspective::IS_SERVER);
- if (GetParam().version.transport_version > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(GetParam().version.transport_version)) {
peer_framer_.set_version_for_tests(
ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_99));
} else {
@@ -6907,7 +6908,7 @@
std::unique_ptr<QuicEncryptedPacket> encrypted(
QuicFramer::BuildVersionNegotiationPacket(
connection_id_, EmptyQuicConnectionId(),
- connection_.transport_version() > QUIC_VERSION_43,
+ VersionHasIetfInvariantHeader(connection_.transport_version()),
AllSupportedVersions()));
std::unique_ptr<QuicReceivedPacket> received(
ConstructReceivedPacket(*encrypted, QuicTime::Zero()));
@@ -6945,7 +6946,7 @@
connection_.ProcessUdpPacket(
kSelfAddress, kPeerAddress,
QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false));
- if (GetParam().version.transport_version > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(GetParam().version.transport_version)) {
// IETF QUIC stops sending version when switch to FORWARD_SECURE.
EXPECT_NE(ENCRYPTION_FORWARD_SECURE, connection_.encryption_level());
ASSERT_TRUE(QuicPacketCreatorPeer::SendVersionInPacket(creator_));
@@ -6963,7 +6964,7 @@
std::unique_ptr<QuicEncryptedPacket> encrypted(
QuicFramer::BuildVersionNegotiationPacket(
connection_id_, EmptyQuicConnectionId(),
- connection_.transport_version() > QUIC_VERSION_43,
+ VersionHasIetfInvariantHeader(connection_.transport_version()),
AllSupportedVersions()));
std::unique_ptr<QuicReceivedPacket> received(
ConstructReceivedPacket(*encrypted, QuicTime::Zero()));
@@ -7015,8 +7016,9 @@
// For IETF QUIC, version is not included as the encryption level switches to
// FORWARD_SECURE in SendStreamDataWithString.
size_t save_on_version =
- GetParam().version.transport_version > QUIC_VERSION_43 ? 0
- : kQuicVersionSize;
+ VersionHasIetfInvariantHeader(GetParam().version.transport_version)
+ ? 0
+ : kQuicVersionSize;
EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - save_on_version,
stats.bytes_sent);
EXPECT_EQ(5u, stats.packets_sent);
@@ -7034,12 +7036,12 @@
peer_framer_.perspective() == Perspective::IS_SERVER) {
header.source_connection_id = connection_id_;
header.destination_connection_id_included = CONNECTION_ID_ABSENT;
- if (peer_framer_.transport_version() <= QUIC_VERSION_43) {
+ if (!VersionHasIetfInvariantHeader(peer_framer_.transport_version())) {
header.source_connection_id_included = CONNECTION_ID_PRESENT;
}
} else {
header.destination_connection_id = connection_id_;
- if (peer_framer_.transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(peer_framer_.transport_version())) {
header.destination_connection_id_included = CONNECTION_ID_ABSENT;
}
}
@@ -7143,7 +7145,7 @@
TEST_P(QuicConnectionTest, OnPacketHeaderDebugVisitor) {
QuicPacketHeader header;
header.packet_number = QuicPacketNumber(1);
- if (GetParam().version.transport_version > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(GetParam().version.transport_version)) {
header.form = IETF_QUIC_LONG_HEADER_PACKET;
}
@@ -8198,7 +8200,7 @@
}
TEST_P(QuicConnectionTest, SendMessage) {
- if (connection_.transport_version() <= QUIC_VERSION_44 ||
+ if (!VersionSupportsMessageFrames(connection_.transport_version()) ||
connection_.SupportsMultiplePacketNumberSpaces()) {
return;
}
@@ -8350,7 +8352,7 @@
// This test mimics a problematic scenario where an IETF QUIC connection
// receives a Google QUIC packet and continue processing it using Google QUIC
// wire format.
- if (version().transport_version <= QUIC_VERSION_43) {
+ if (!VersionHasIetfInvariantHeader(version().transport_version)) {
return;
}
set_perspective(Perspective::IS_SERVER);
diff --git a/quic/core/quic_crypto_stream.cc b/quic/core/quic_crypto_stream.cc
index f394b3d..a38cb82 100644
--- a/quic/core/quic_crypto_stream.cc
+++ b/quic/core/quic_crypto_stream.cc
@@ -56,8 +56,8 @@
PACKET_0BYTE_CONNECTION_ID,
/*include_version=*/true,
/*include_diversification_nonce=*/true,
- version > QUIC_VERSION_43 ? PACKET_4BYTE_PACKET_NUMBER
- : PACKET_1BYTE_PACKET_NUMBER,
+ VersionHasIetfInvariantHeader(version) ? PACKET_4BYTE_PACKET_NUMBER
+ : PACKET_1BYTE_PACKET_NUMBER,
VARIABLE_LENGTH_INTEGER_LENGTH_1, VARIABLE_LENGTH_INTEGER_LENGTH_2,
/*offset=*/0);
}
diff --git a/quic/core/quic_dispatcher.cc b/quic/core/quic_dispatcher.cc
index 0e6a71d..1611287 100644
--- a/quic/core/quic_dispatcher.cc
+++ b/quic/core/quic_dispatcher.cc
@@ -634,10 +634,10 @@
if (connection->termination_packets() != nullptr &&
!connection->termination_packets()->empty()) {
action = QuicTimeWaitListManager::SEND_TERMINATION_PACKETS;
- } else if (connection->transport_version() > QUIC_VERSION_43 ||
+ } else if (VersionHasIetfInvariantHeader(connection->transport_version()) ||
GetQuicReloadableFlag(quic_terminate_gquic_connection_as_ietf)) {
if (!connection->IsHandshakeConfirmed()) {
- if (connection->transport_version() <= QUIC_VERSION_43) {
+ if (!VersionHasIetfInvariantHeader(connection->transport_version())) {
QUIC_CODE_COUNT(gquic_add_to_time_wait_list_with_handshake_failed);
} else {
QUIC_CODE_COUNT(quic_v44_add_to_time_wait_list_with_handshake_failed);
@@ -647,7 +647,7 @@
// QUIC_HANDSHAKE_FAILED and adds the connection to the time wait list.
StatelesslyTerminateConnection(
connection->connection_id(),
- connection->transport_version() > QUIC_VERSION_43
+ VersionHasIetfInvariantHeader(connection->transport_version())
? IETF_QUIC_LONG_HEADER_PACKET
: GOOGLE_QUIC_PACKET,
/*version_flag=*/true, connection->version(), QUIC_HANDSHAKE_FAILED,
@@ -662,8 +662,9 @@
QUIC_CODE_COUNT(quic_v44_add_to_time_wait_list_with_stateless_reset);
}
time_wait_list_manager_->AddConnectionIdToTimeWait(
- it->first, connection->transport_version() > QUIC_VERSION_43, action,
- connection->encryption_level(), connection->termination_packets());
+ it->first, VersionHasIetfInvariantHeader(connection->transport_version()),
+ action, connection->encryption_level(),
+ connection->termination_packets());
session_map_.erase(it);
}
diff --git a/quic/core/quic_dispatcher_test.cc b/quic/core/quic_dispatcher_test.cc
index df29bca..538c8d9 100644
--- a/quic/core/quic_dispatcher_test.cc
+++ b/quic/core/quic_dispatcher_test.cc
@@ -1073,7 +1073,8 @@
QuicConnectionId connection_id = TestConnectionId(1);
EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, QuicStringPiece("hq"), _))
.Times(0);
- if (CurrentSupportedVersions()[0].transport_version > QUIC_VERSION_43 &&
+ if (VersionHasIetfInvariantHeader(
+ CurrentSupportedVersions()[0].transport_version) &&
!QuicUtils::VariableLengthConnectionIdAllowedForVersion(
CurrentSupportedVersions()[0].transport_version)) {
// This IETF packet has invalid connection ID length.
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc
index 6048133..04b824a 100644
--- a/quic/core/quic_framer.cc
+++ b/quic/core/quic_framer.cc
@@ -520,7 +520,7 @@
size_t QuicFramer::GetMessageFrameSize(QuicTransportVersion version,
bool last_frame_in_packet,
QuicByteCount length) {
- QUIC_BUG_IF(version <= QUIC_VERSION_44)
+ QUIC_BUG_IF(!VersionSupportsMessageFrames(version))
<< "Try to serialize MESSAGE frame in " << version;
return kQuicFrameTypeSize +
(last_frame_in_packet ? 0 : QuicDataWriter::GetVarInt62Len(length)) +
@@ -1484,7 +1484,7 @@
bool packet_has_ietf_packet_header = false;
if (infer_packet_header_type_from_version_) {
packet_has_ietf_packet_header =
- version_.transport_version > QUIC_VERSION_43;
+ VersionHasIetfInvariantHeader(version_.transport_version);
} else if (!reader.IsDoneReading()) {
uint8_t type = reader.PeekByte();
packet_has_ietf_packet_header = QuicUtils::IsIetfPacketHeader(type);
@@ -2054,7 +2054,7 @@
bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header,
QuicDataWriter* writer,
size_t* length_field_offset) {
- if (transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(transport_version())) {
return AppendIetfPacketHeader(header, writer, length_field_offset);
}
QUIC_DVLOG(1) << ENDPOINT << "Appending header: " << header;
@@ -5220,7 +5220,7 @@
bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header,
const QuicStopWaitingFrame& frame,
QuicDataWriter* writer) {
- DCHECK_GE(QUIC_VERSION_43, version_.transport_version);
+ DCHECK(!VersionHasIetfInvariantHeader(version_.transport_version));
DCHECK(frame.least_unacked.IsInitialized() &&
header.packet_number >= frame.least_unacked);
const uint64_t least_unacked_delta =
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc
index 7420c72..3daf302 100644
--- a/quic/core/quic_packet_creator.cc
+++ b/quic/core/quic_packet_creator.cc
@@ -123,7 +123,7 @@
// maximum packet size if we stop sending version before it is serialized.
void QuicPacketCreator::StopSendingVersion() {
DCHECK(send_version_in_packet_);
- DCHECK_LE(framer_->transport_version(), QUIC_VERSION_43);
+ DCHECK(!VersionHasIetfInvariantHeader(framer_->transport_version()));
send_version_in_packet_ = false;
if (packet_size_ > 0) {
DCHECK_LT(kQuicVersionSize, packet_size_);
@@ -758,7 +758,7 @@
QuicConnectionIdIncluded QuicPacketCreator::GetDestinationConnectionIdIncluded()
const {
- if (framer_->transport_version() > QUIC_VERSION_43 ||
+ if (VersionHasIetfInvariantHeader(framer_->transport_version()) ||
GetQuicRestartFlag(quic_do_not_override_connection_id)) {
// Packets sent by client always include destination connection ID, and
// those sent by the server do not include destination connection ID.
@@ -997,7 +997,7 @@
}
bool QuicPacketCreator::IncludeVersionInHeader() const {
- if (framer_->transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(framer_->transport_version())) {
return packet_.encryption_level < ENCRYPTION_FORWARD_SECURE;
}
return send_version_in_packet_;
@@ -1045,7 +1045,7 @@
}
QuicPacketLength QuicPacketCreator::GetCurrentLargestMessagePayload() const {
- if (framer_->transport_version() <= QUIC_VERSION_44) {
+ if (!VersionSupportsMessageFrames(framer_->transport_version())) {
return 0;
}
const size_t packet_header_size = GetPacketHeaderSize(
@@ -1061,7 +1061,7 @@
}
QuicPacketLength QuicPacketCreator::GetGuaranteedLargestMessagePayload() const {
- if (framer_->transport_version() <= QUIC_VERSION_44) {
+ if (!VersionSupportsMessageFrames(framer_->transport_version())) {
return 0;
}
// QUIC Crypto server packets may include a diversification nonce.
@@ -1091,7 +1091,7 @@
}
bool QuicPacketCreator::HasIetfLongHeader() const {
- return framer_->transport_version() > QUIC_VERSION_43 &&
+ return VersionHasIetfInvariantHeader(framer_->transport_version()) &&
packet_.encryption_level < ENCRYPTION_FORWARD_SECURE;
}
diff --git a/quic/core/quic_packet_creator_test.cc b/quic/core/quic_packet_creator_test.cc
index bf69563..ba72d25 100644
--- a/quic/core/quic_packet_creator_test.cc
+++ b/quic/core/quic_packet_creator_test.cc
@@ -104,7 +104,7 @@
}
void StopSendingVersion() {
- if (version_ > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(version_)) {
set_encryption_level(ENCRYPTION_FORWARD_SECURE);
return;
}
@@ -331,7 +331,7 @@
}
TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) {
- if (client_framer_.transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(client_framer_.transport_version())) {
creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
}
// If the original packet number length, the current packet number
@@ -808,7 +808,8 @@
QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_SERVER);
ParsedQuicVersionVector versions;
versions.push_back(test::QuicVersionMax());
- const bool ietf_quic = GetParam().version.transport_version > QUIC_VERSION_43;
+ const bool ietf_quic =
+ VersionHasIetfInvariantHeader(GetParam().version.transport_version);
std::unique_ptr<QuicEncryptedPacket> encrypted(
creator_.SerializeVersionNegotiationPacket(ietf_quic, versions));
@@ -1106,7 +1107,7 @@
}
TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
- if (GetParam().version.transport_version > QUIC_VERSION_43 &&
+ if (VersionHasIetfInvariantHeader(GetParam().version.transport_version) &&
GetParam().version.transport_version != QUIC_VERSION_99) {
EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
@@ -1144,7 +1145,7 @@
TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthCwnd) {
QuicPacketCreatorPeer::SetPacketNumber(&creator_, 1);
- if (GetParam().version.transport_version > QUIC_VERSION_43 &&
+ if (VersionHasIetfInvariantHeader(GetParam().version.transport_version) &&
GetParam().version.transport_version != QUIC_VERSION_99) {
EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
QuicPacketCreatorPeer::GetPacketNumberLength(&creator_));
@@ -1674,7 +1675,7 @@
}
TEST_P(QuicPacketCreatorTest, AddMessageFrame) {
- if (client_framer_.transport_version() <= QUIC_VERSION_44) {
+ if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
return;
}
creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
@@ -1726,7 +1727,7 @@
}
TEST_P(QuicPacketCreatorTest, MessageFrameConsumption) {
- if (client_framer_.transport_version() <= QUIC_VERSION_44) {
+ if (!VersionSupportsMessageFrames(client_framer_.transport_version())) {
return;
}
std::string message_data(kDefaultMaxPacketSize, 'a');
diff --git a/quic/core/quic_packet_generator_test.cc b/quic/core/quic_packet_generator_test.cc
index 7212e22..1756874 100644
--- a/quic/core/quic_packet_generator_test.cc
+++ b/quic/core/quic_packet_generator_test.cc
@@ -901,7 +901,7 @@
}
TEST_F(QuicPacketGeneratorTest, ConsumeDataLargeSendAckTrue) {
- if (framer_.transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(framer_.transport_version())) {
return;
}
delegate_.SetCanNotWrite();
@@ -1144,7 +1144,7 @@
for (size_t i = 1; i < 10; i++) {
generator_.SetServerConnectionIdLength(i);
- if (framer_.transport_version() > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(framer_.transport_version())) {
EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID,
creator_->GetDestinationConnectionIdLength());
} else {
@@ -1423,7 +1423,7 @@
}
TEST_F(QuicPacketGeneratorTest, DontCrashOnInvalidStopWaiting) {
- if (framer_.transport_version() > QUIC_VERSION_43) {
+ if (VersionSupportsMessageFrames(framer_.transport_version())) {
return;
}
// Test added to ensure the generator does not crash when an invalid frame is
@@ -1627,7 +1627,7 @@
}
TEST_F(QuicPacketGeneratorTest, AddMessageFrame) {
- if (framer_.transport_version() <= QUIC_VERSION_44) {
+ if (!VersionSupportsMessageFrames(framer_.transport_version())) {
return;
}
quic::QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
diff --git a/quic/core/quic_packets.cc b/quic/core/quic_packets.cc
index 738cc6e..4cf727b 100644
--- a/quic/core/quic_packets.cc
+++ b/quic/core/quic_packets.cc
@@ -121,7 +121,7 @@
QuicVariableLengthIntegerLength retry_token_length_length,
QuicByteCount retry_token_length,
QuicVariableLengthIntegerLength length_length) {
- if (version > QUIC_VERSION_43) {
+ if (VersionHasIetfInvariantHeader(version)) {
if (include_version) {
// Long header.
return kPacketHeaderTypeSize + kConnectionIdLengthSize +
diff --git a/quic/core/quic_time_wait_list_manager_test.cc b/quic/core/quic_time_wait_list_manager_test.cc
index 4624a23..209f26f 100644
--- a/quic/core/quic_time_wait_list_manager_test.cc
+++ b/quic/core/quic_time_wait_list_manager_test.cc
@@ -163,8 +163,8 @@
QuicTimeWaitListManager::TimeWaitAction action,
std::vector<std::unique_ptr<QuicEncryptedPacket>>* packets) {
time_wait_list_manager_.AddConnectionIdToTimeWait(
- connection_id, version.transport_version > QUIC_VERSION_43, action,
- ENCRYPTION_INITIAL, packets);
+ connection_id, VersionHasIetfInvariantHeader(version.transport_version),
+ action, ENCRYPTION_INITIAL, packets);
}
bool IsConnectionIdInTimeWait(QuicConnectionId connection_id) {
diff --git a/quic/core/quic_versions.h b/quic/core/quic_versions.h
index 0a368df..b33e084 100644
--- a/quic/core/quic_versions.h
+++ b/quic/core/quic_versions.h
@@ -336,6 +336,18 @@
std::numeric_limits<size_t>::max());
}
+// Returns true if |transport_version| uses IETF invariant headers.
+QUIC_EXPORT_PRIVATE inline 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(
+ QuicTransportVersion transport_version) {
+ return transport_version > QUIC_VERSION_44;
+}
+
// Returns true if QuicSpdyStream encodes body using HTTP/3 specification and
// sends data frame header along with body.
QUIC_EXPORT_PRIVATE inline bool VersionHasDataFrameHeader(
diff --git a/quic/quartc/quartc_session.h b/quic/quartc/quartc_session.h
index cd8d2cb..3dd2916 100644
--- a/quic/quartc/quartc_session.h
+++ b/quic/quartc/quartc_session.h
@@ -69,7 +69,7 @@
// Return true if transport support message frame.
bool CanSendMessage() const {
- return connection()->transport_version() > QUIC_VERSION_44;
+ return VersionSupportsMessageFrames(connection()->transport_version());
}
void OnCryptoHandshakeEvent(CryptoHandshakeEvent event) override;