In GFE, do not send version negotiation on Google QUIC packets.
Protected by FLAGS_quic_reloadable_flag_quic_no_vn_for_gquic_packets.
PiperOrigin-RevId: 488166482
diff --git a/quiche/quic/core/quic_connection.h b/quiche/quic/core/quic_connection.h
index ece0b29..869409b 100644
--- a/quiche/quic/core/quic_connection.h
+++ b/quiche/quic/core/quic_connection.h
@@ -1636,9 +1636,6 @@
const char* ValidateStopWaitingFrame(
const QuicStopWaitingFrame& stop_waiting);
- // Sends a version negotiation packet to the peer.
- void SendVersionNegotiationPacket(bool ietf_quic, bool has_length_prefix);
-
// Clears any accumulated frames from the last received packet.
void ClearLastFrames();
diff --git a/quiche/quic/core/quic_dispatcher.cc b/quiche/quic/core/quic_dispatcher.cc
index 208359d..952f512 100644
--- a/quiche/quic/core/quic_dispatcher.cc
+++ b/quiche/quic/core/quic_dispatcher.cc
@@ -458,7 +458,8 @@
return true;
}
- QuicConnectionId server_connection_id = packet_info.destination_connection_id;
+ const QuicConnectionId server_connection_id =
+ packet_info.destination_connection_id;
// The IETF spec requires the client to generate an initial server
// connection ID that is at least 64 bits long. After that initial
@@ -548,19 +549,9 @@
if (ShouldCreateSessionForUnknownVersion(packet_info.version_label)) {
return false;
}
- if (!crypto_config()->validate_chlo_size() ||
- packet_info.packet.length() >= kMinPacketSizeForVersionNegotiation) {
- // Since the version is not supported, send a version negotiation
- // packet and stop processing the current packet.
- QuicConnectionId client_connection_id =
- packet_info.source_connection_id;
- time_wait_list_manager()->SendVersionNegotiationPacket(
- server_connection_id, client_connection_id,
- packet_info.form != GOOGLE_QUIC_PACKET,
- packet_info.use_length_prefix, GetSupportedVersions(),
- packet_info.self_address, packet_info.peer_address,
- GetPerPacketContext());
- }
+ // Since the version is not supported, send a version negotiation
+ // packet and stop processing the current packet.
+ MaybeSendVersionNegotiationPacket(packet_info);
return true;
}
@@ -1393,6 +1384,19 @@
GetPerPacketContext());
}
+void QuicDispatcher::MaybeSendVersionNegotiationPacket(
+ const ReceivedPacketInfo& packet_info) {
+ if (crypto_config()->validate_chlo_size() &&
+ packet_info.packet.length() < kMinPacketSizeForVersionNegotiation) {
+ return;
+ }
+ time_wait_list_manager()->SendVersionNegotiationPacket(
+ packet_info.destination_connection_id, packet_info.source_connection_id,
+ packet_info.form != GOOGLE_QUIC_PACKET, packet_info.use_length_prefix,
+ GetSupportedVersions(), packet_info.self_address,
+ packet_info.peer_address, GetPerPacketContext());
+}
+
size_t QuicDispatcher::NumSessions() const {
return num_sessions_in_session_map_;
}
diff --git a/quiche/quic/core/quic_dispatcher.h b/quiche/quic/core/quic_dispatcher.h
index e74a8a7..4c3e278 100644
--- a/quiche/quic/core/quic_dispatcher.h
+++ b/quiche/quic/core/quic_dispatcher.h
@@ -322,6 +322,10 @@
virtual void MaybeResetPacketsWithNoVersion(
const quic::ReceivedPacketInfo& packet_info);
+ // Called on packets with unsupported versions.
+ virtual void MaybeSendVersionNegotiationPacket(
+ const ReceivedPacketInfo& packet_info);
+
ConnectionIdGeneratorInterface& connection_id_generator() {
return connection_id_generator_;
}