gfe-relnote: For server side QUIC connection, mark version_negotiated_ earlier. Protected by --gfe2_reloadable_flag_quic_version_negotiated_by_default_at_server.
PiperOrigin-RevId: 282365816
Change-Id: I9083e05d758f564befaab126e427f7ab434d2f6f
diff --git a/quic/core/http/quic_server_session_base_test.cc b/quic/core/http/quic_server_session_base_test.cc
index cd45c50..9e8c749 100644
--- a/quic/core/http/quic_server_session_base_test.cc
+++ b/quic/core/http/quic_server_session_base_test.cc
@@ -152,8 +152,10 @@
QuicCryptoServerConfig::ConfigOptions());
SetQuicReloadableFlag(quic_supports_tls_handshake, true);
session_->Initialize();
- QuicSessionPeer::GetMutableCryptoStream(session_.get())
- ->OnSuccessfulVersionNegotiation(supported_versions.front());
+ if (!GetQuicReloadableFlag(quic_version_negotiated_by_default_at_server)) {
+ QuicSessionPeer::GetMutableCryptoStream(session_.get())
+ ->OnSuccessfulVersionNegotiation(supported_versions.front());
+ }
QuicConfigPeer::SetReceivedInitialSessionFlowControlWindow(
session_->config(), kMinimumFlowControlSendWindow);
session_->OnConfigNegotiated();
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index c457ca4..a4efa01 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -336,7 +336,9 @@
treat_queued_packets_as_sent_(
GetQuicReloadableFlag(quic_treat_queued_packets_as_sent) ||
version().CanSendCoalescedPackets()),
- mtu_discovery_v2_(GetQuicReloadableFlag(quic_mtu_discovery_v2)) {
+ mtu_discovery_v2_(GetQuicReloadableFlag(quic_mtu_discovery_v2)),
+ quic_version_negotiated_by_default_at_server_(
+ GetQuicReloadableFlag(quic_version_negotiated_by_default_at_server)) {
QUIC_DLOG(INFO) << ENDPOINT << "Created connection with server connection ID "
<< server_connection_id
<< " and version: " << ParsedQuicVersionToString(version());
@@ -370,6 +372,13 @@
DCHECK(perspective_ == Perspective::IS_CLIENT ||
supported_versions.size() == 1);
InstallInitialCrypters(server_connection_id_);
+
+ if (quic_version_negotiated_by_default_at_server() &&
+ perspective_ == Perspective::IS_SERVER) {
+ QUIC_RELOADABLE_FLAG_COUNT(quic_version_negotiated_by_default_at_server);
+ version_negotiated_ = true;
+ framer_.InferPacketHeaderTypeFromVersion();
+ }
}
void QuicConnection::InstallInitialCrypters(QuicConnectionId connection_id) {
@@ -759,32 +768,41 @@
return false;
}
- if (!version_negotiated_ && perspective_ == Perspective::IS_SERVER) {
- if (!header.version_flag) {
- // Packets should have the version flag till version negotiation is
- // done.
- std::string error_details =
- QuicStrCat(ENDPOINT, "Packet ", header.packet_number.ToUint64(),
- " without version flag before version negotiated.");
- QUIC_DLOG(WARNING) << error_details;
- CloseConnection(QUIC_INVALID_VERSION, error_details,
- ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
- return false;
- } else {
- DCHECK_EQ(header.version, version());
- version_negotiated_ = true;
- framer_.InferPacketHeaderTypeFromVersion();
- visitor_->OnSuccessfulVersionNegotiation(version());
- if (debug_visitor_ != nullptr) {
- debug_visitor_->OnSuccessfulVersionNegotiation(version());
+ if (!quic_version_negotiated_by_default_at_server()) {
+ if (!version_negotiated_ && perspective_ == Perspective::IS_SERVER) {
+ if (!header.version_flag) {
+ // Packets should have the version flag till version negotiation is
+ // done.
+ std::string error_details =
+ QuicStrCat(ENDPOINT, "Packet ", header.packet_number.ToUint64(),
+ " without version flag before version negotiated.");
+ QUIC_DLOG(WARNING) << error_details;
+ CloseConnection(QUIC_INVALID_VERSION, error_details,
+ ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
+ return false;
+ } else {
+ DCHECK_EQ(header.version, version());
+ version_negotiated_ = true;
+ framer_.InferPacketHeaderTypeFromVersion();
+ visitor_->OnSuccessfulVersionNegotiation(version());
+ if (debug_visitor_ != nullptr) {
+ debug_visitor_->OnSuccessfulVersionNegotiation(version());
+ }
}
+ DCHECK(version_negotiated_);
}
- DCHECK(version_negotiated_);
}
return true;
}
+void QuicConnection::OnSuccessfulVersionNegotiation() {
+ visitor_->OnSuccessfulVersionNegotiation(version());
+ if (debug_visitor_ != nullptr) {
+ debug_visitor_->OnSuccessfulVersionNegotiation(version());
+ }
+}
+
void QuicConnection::OnDecryptedPacket(EncryptionLevel level) {
last_decrypted_packet_level_ = level;
last_packet_decrypted_ = true;
@@ -1959,10 +1977,7 @@
packet_creator_.StopSendingVersion();
}
version_negotiated_ = true;
- visitor_->OnSuccessfulVersionNegotiation(version());
- if (debug_visitor_ != nullptr) {
- debug_visitor_->OnSuccessfulVersionNegotiation(version());
- }
+ OnSuccessfulVersionNegotiation();
}
}
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index de26b3c..55173cc 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -895,6 +895,13 @@
return treat_queued_packets_as_sent_;
}
+ // Called when version is considered negotiated.
+ void OnSuccessfulVersionNegotiation();
+
+ bool quic_version_negotiated_by_default_at_server() const {
+ return quic_version_negotiated_by_default_at_server_;
+ }
+
protected:
// Calls cancel() on all the alarms owned by this connection.
void CancelAllAlarms();
@@ -1373,6 +1380,7 @@
QuicSentPacketManager sent_packet_manager_;
// Indicates whether connection version has been negotiated.
+ // Always true for server connections.
bool version_negotiated_;
// Tracks if the connection was created by the server or the client.
@@ -1524,6 +1532,9 @@
const bool mtu_discovery_v2_;
// Only used if quic_mtu_discovery_v2 is true.
QuicConnectionMtuDiscoverer mtu_discoverer_;
+
+ // Latched value of quic_version_negotiated_by_default_at_server.
+ const bool quic_version_negotiated_by_default_at_server_;
};
} // namespace quic
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 1fbd121..111f94f 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -1047,6 +1047,7 @@
EXPECT_CALL(visitor_, OnCongestionWindowChange(_)).Times(AnyNumber());
EXPECT_CALL(visitor_, OnPacketReceived(_, _, _)).Times(AnyNumber());
EXPECT_CALL(visitor_, OnForwardProgressConfirmed()).Times(AnyNumber());
+ EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)).Times(AnyNumber());
EXPECT_CALL(*loss_algorithm_, GetLossTimeout())
.WillRepeatedly(Return(QuicTime::Zero()));
@@ -1551,6 +1552,10 @@
connection_.set_perspective(perspective);
if (perspective == Perspective::IS_SERVER) {
connection_.set_can_truncate_connection_ids(true);
+ QuicConnectionPeer::SetNegotiatedVersion(&connection_);
+ if (GetQuicReloadableFlag(quic_version_negotiated_by_default_at_server)) {
+ connection_.OnSuccessfulVersionNegotiation();
+ }
}
QuicFramerPeer::SetPerspective(&peer_framer_,
QuicUtils::InvertPerspective(perspective));
@@ -1613,7 +1618,6 @@
void MtuDiscoveryTestInit() {
set_perspective(Perspective::IS_SERVER);
- QuicConnectionPeer::SetNegotiatedVersion(&connection_);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
peer_creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
@@ -1729,8 +1733,6 @@
}
TEST_P(QuicConnectionTest, SelfAddressChangeAtServer) {
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
-
set_perspective(Perspective::IS_SERVER);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
@@ -1760,8 +1762,6 @@
}
TEST_P(QuicConnectionTest, AllowSelfAddressChangeToMappedIpv4AddressAtServer) {
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
-
set_perspective(Perspective::IS_SERVER);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
@@ -1795,7 +1795,6 @@
}
TEST_P(QuicConnectionTest, ClientAddressChangeAndPacketReordered) {
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
set_perspective(Perspective::IS_SERVER);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
@@ -1834,7 +1833,6 @@
}
TEST_P(QuicConnectionTest, PeerAddressChangeAtServer) {
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
set_perspective(Perspective::IS_SERVER);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
EXPECT_EQ(Perspective::IS_SERVER, connection_.perspective());
@@ -1872,7 +1870,6 @@
}
TEST_P(QuicConnectionTest, EffectivePeerAddressChangeAtServer) {
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
set_perspective(Perspective::IS_SERVER);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
EXPECT_EQ(Perspective::IS_SERVER, connection_.perspective());
@@ -1958,7 +1955,6 @@
}
TEST_P(QuicConnectionTest, ReceivePaddedPingAtServer) {
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
set_perspective(Perspective::IS_SERVER);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
EXPECT_EQ(Perspective::IS_SERVER, connection_.perspective());
@@ -2083,7 +2079,6 @@
}
TEST_P(QuicConnectionTest, ReceiveConnectivityProbingAtServer) {
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
set_perspective(Perspective::IS_SERVER);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
EXPECT_EQ(Perspective::IS_SERVER, connection_.perspective());
@@ -2142,7 +2137,6 @@
}
TEST_P(QuicConnectionTest, ReceiveReorderedConnectivityProbingAtServer) {
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
set_perspective(Perspective::IS_SERVER);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
EXPECT_EQ(Perspective::IS_SERVER, connection_.perspective());
@@ -2199,7 +2193,6 @@
}
TEST_P(QuicConnectionTest, MigrateAfterProbingAtServer) {
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
set_perspective(Perspective::IS_SERVER);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
EXPECT_EQ(Perspective::IS_SERVER, connection_.perspective());
@@ -2400,8 +2393,6 @@
}
TEST_P(QuicConnectionTest, IncreaseServerMaxPacketSize) {
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
-
set_perspective(Perspective::IS_SERVER);
connection_.SetMaxPacketLength(1000);
@@ -2446,8 +2437,6 @@
}
TEST_P(QuicConnectionTest, IncreaseServerMaxPacketSizeWhileWriterLimited) {
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
-
const QuicByteCount lower_max_packet_size = 1240;
writer_->set_max_packet_size(lower_max_packet_size);
set_perspective(Perspective::IS_SERVER);
@@ -7870,7 +7859,6 @@
// Ack data.
clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _));
QuicAckFrame frame =
InitAckFrame({{QuicPacketNumber(1u), QuicPacketNumber(2u)}});
@@ -7905,8 +7893,6 @@
}
TEST_P(QuicConnectionTest, ServerReceivesChloOnNonCryptoStream) {
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
-
set_perspective(Perspective::IS_SERVER);
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
@@ -8855,7 +8841,6 @@
0u, QuicStringPiece()));
EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1);
}
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
ProcessFramePacketWithAddresses(frame, kSelfAddress, kPeerAddress);
// Let connection process a Google QUIC packet.
@@ -9128,7 +9113,6 @@
if (!framer_.version().SupportsClientConnectionIds()) {
return;
}
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
set_perspective(Perspective::IS_SERVER);
QuicPacketHeader header = ConstructPacketHeader(1, ENCRYPTION_INITIAL);
header.source_connection_id = TestConnectionId(0x33);
@@ -9569,7 +9553,6 @@
if (!connection_.version().SupportsAntiAmplificationLimit()) {
return;
}
- EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
EXPECT_CALL(visitor_, OnCryptoFrame(_)).Times(AnyNumber());
set_perspective(Perspective::IS_SERVER);
diff --git a/quic/core/quic_crypto_server_stream_test.cc b/quic/core/quic_crypto_server_stream_test.cc
index 360c268..2f7055d 100644
--- a/quic/core/quic_crypto_server_stream_test.cc
+++ b/quic/core/quic_crypto_server_stream_test.cc
@@ -100,8 +100,10 @@
crypto_test_utils::SetupCryptoServerConfigForTest(
server_connection_->clock(), server_connection_->random_generator(),
&server_crypto_config_);
- server_session_->GetMutableCryptoStream()->OnSuccessfulVersionNegotiation(
- supported_versions_.front());
+ if (!GetQuicReloadableFlag(quic_version_negotiated_by_default_at_server)) {
+ server_session_->GetMutableCryptoStream()->OnSuccessfulVersionNegotiation(
+ supported_versions_.front());
+ }
}
QuicCryptoServerStream* server_stream() {
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index cba27f0..2870b37 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -114,6 +114,13 @@
connection_->SetDataProducer(this);
connection_->SetFromConfig(config_);
+ // On the server side, version negotiation has been done by the dispatcher,
+ // and the server session is created with the right version.
+ if (connection_->quic_version_negotiated_by_default_at_server() &&
+ perspective() == Perspective::IS_SERVER) {
+ connection_->OnSuccessfulVersionNegotiation();
+ }
+
if (QuicVersionUsesCryptoFrames(transport_version())) {
return;
}
diff --git a/quic/quic_transport/quic_transport_server_session_test.cc b/quic/quic_transport/quic_transport_server_session_test.cc
index 42c3eef..5e67748 100644
--- a/quic/quic_transport/quic_transport_server_session_test.cc
+++ b/quic/quic_transport/quic_transport_server_session_test.cc
@@ -72,7 +72,9 @@
session_->Initialize();
crypto_stream_ = static_cast<QuicCryptoServerStream*>(
session_->GetMutableCryptoStream());
- crypto_stream_->OnSuccessfulVersionNegotiation(GetVersions()[0]);
+ if (!GetQuicReloadableFlag(quic_version_negotiated_by_default_at_server)) {
+ crypto_stream_->OnSuccessfulVersionNegotiation(GetVersions()[0]);
+ }
}
void Connect() {
diff --git a/quic/test_tools/crypto_test_utils.cc b/quic/test_tools/crypto_test_utils.cc
index 83efd21..6716dec 100644
--- a/quic/test_tools/crypto_test_utils.cc
+++ b/quic/test_tools/crypto_test_utils.cc
@@ -235,8 +235,10 @@
server_conn, *server_quic_config, client_conn->supported_versions(),
crypto_config, &compressed_certs_cache);
server_session.Initialize();
- server_session.OnSuccessfulVersionNegotiation(
- client_conn->supported_versions().front());
+ if (!GetQuicReloadableFlag(quic_version_negotiated_by_default_at_server)) {
+ server_session.OnSuccessfulVersionNegotiation(
+ client_conn->supported_versions().front());
+ }
EXPECT_CALL(*server_session.helper(),
CanAcceptClientHello(testing::_, testing::_, testing::_,
testing::_, testing::_))
diff --git a/quic/test_tools/quic_connection_peer.cc b/quic/test_tools/quic_connection_peer.cc
index 197514e..d48ff05 100644
--- a/quic/test_tools/quic_connection_peer.cc
+++ b/quic/test_tools/quic_connection_peer.cc
@@ -296,6 +296,11 @@
// static
void QuicConnectionPeer::SetNegotiatedVersion(QuicConnection* connection) {
connection->version_negotiated_ = true;
+ if (connection->perspective() == Perspective::IS_SERVER &&
+ !QuicFramerPeer::infer_packet_header_type_from_version(
+ &connection->framer_)) {
+ connection->framer_.InferPacketHeaderTypeFromVersion();
+ }
}
// static
diff --git a/quic/test_tools/quic_framer_peer.h b/quic/test_tools/quic_framer_peer.h
index 661def5..d462555 100644
--- a/quic/test_tools/quic_framer_peer.h
+++ b/quic/test_tools/quic_framer_peer.h
@@ -187,6 +187,10 @@
uint64_t current_received_frame_type) {
framer->current_received_frame_type_ = current_received_frame_type;
}
+
+ static bool infer_packet_header_type_from_version(QuicFramer* framer) {
+ return framer->infer_packet_header_type_from_version_;
+ }
};
} // namespace test
diff --git a/quic/tools/quic_simple_server_session_test.cc b/quic/tools/quic_simple_server_session_test.cc
index 4a12c09..a548c6c 100644
--- a/quic/tools/quic_simple_server_session_test.cc
+++ b/quic/tools/quic_simple_server_session_test.cc
@@ -230,8 +230,10 @@
QuicRandom::GetInstance(), &clock,
QuicCryptoServerConfig::ConfigOptions());
session_->Initialize();
- QuicSessionPeer::GetMutableCryptoStream(session_.get())
- ->OnSuccessfulVersionNegotiation(supported_versions.front());
+ if (!GetQuicReloadableFlag(quic_version_negotiated_by_default_at_server)) {
+ QuicSessionPeer::GetMutableCryptoStream(session_.get())
+ ->OnSuccessfulVersionNegotiation(supported_versions.front());
+ }
if (VersionHasIetfQuicFrames(transport_version())) {
EXPECT_CALL(*connection_, SendControlFrame(_))
@@ -590,8 +592,10 @@
config_, connection_, &owner_, &stream_helper_, &crypto_config_,
&compressed_certs_cache_, &memory_cache_backend_);
session_->Initialize();
- QuicSessionPeer::GetMutableCryptoStream(session_.get())
- ->OnSuccessfulVersionNegotiation(supported_versions.front());
+ if (!GetQuicReloadableFlag(quic_version_negotiated_by_default_at_server)) {
+ QuicSessionPeer::GetMutableCryptoStream(session_.get())
+ ->OnSuccessfulVersionNegotiation(supported_versions.front());
+ }
// Needed to make new session flow control window and server push work.
if (VersionHasIetfQuicFrames(transport_version())) {