Refactor out the logic which responds to connectivity probing and connection migration from QuicConnection::OnPacketComplete(). No behavior change, not protected.
Split the logic into IETF branch and GQuic branch.
PiperOrigin-RevId: 324848626
Change-Id: I2444f6697c524cafc35e3036e81818eb1c8213d2
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index f3d5431..16d7e5c 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -1665,44 +1665,7 @@
<< ENDPOINT << "Received a padded PING packet. is_probing: "
<< IsCurrentPacketConnectivityProbing();
- if (IsCurrentPacketConnectivityProbing()) {
- DCHECK(!version().HasIetfQuicFrames());
- visitor_->OnPacketReceived(last_packet_destination_address_,
- last_packet_source_address_,
- /*is_connectivity_probe=*/true);
- } else if (perspective_ == Perspective::IS_CLIENT) {
- // This node is a client, notify that a speculative connectivity probing
- // packet has been received anyway.
- QUIC_DVLOG(1) << ENDPOINT
- << "Received a speculative connectivity probing packet for "
- << GetServerConnectionIdAsRecipient(last_header_,
- perspective_)
- << " from ip:port: " << last_packet_source_address_.ToString()
- << " to ip:port: "
- << last_packet_destination_address_.ToString();
- visitor_->OnPacketReceived(last_packet_destination_address_,
- last_packet_source_address_,
- /*is_connectivity_probe=*/false);
- } else if (version().HasIetfQuicFrames() &&
- !received_path_challenge_payloads_.empty()) {
- if (current_effective_peer_migration_type_ != NO_CHANGE) {
- // TODO(b/150095588): change the stats to
- // num_valid_path_challenge_received.
- ++stats_.num_connectivity_probing_received;
- }
- // If the packet contains PATH CHALLENGE, send appropriate RESPONSE.
- // There was at least one PATH CHALLENGE in the received packet,
- // Generate the required PATH RESPONSE.
- SendGenericPathProbePacket(nullptr, last_packet_source_address_,
- /* is_response=*/true);
- } else if (last_header_.packet_number == GetLargestReceivedPacket()) {
- direct_peer_address_ = last_packet_source_address_;
- if (current_effective_peer_migration_type_ != NO_CHANGE) {
- // TODO(fayang): When multiple packet number spaces is supported, only
- // start peer migration for the application data.
- StartEffectivePeerMigration(current_effective_peer_migration_type_);
- }
- }
+ MaybeRespondToConnectivityProbingOrMigration();
current_effective_peer_migration_type_ = NO_CHANGE;
@@ -1721,6 +1684,64 @@
CloseIfTooManyOutstandingSentPackets();
}
+void QuicConnection::MaybeRespondToConnectivityProbingOrMigration() {
+ if (version().HasIetfQuicFrames()) {
+ if (perspective_ == Perspective::IS_CLIENT) {
+ // This node is a client, notify that a speculative connectivity probing
+ // packet has been received anyway.
+ visitor_->OnPacketReceived(last_packet_destination_address_,
+ last_packet_source_address_,
+ /*is_connectivity_probe=*/false);
+ return;
+ }
+ if (!received_path_challenge_payloads_.empty()) {
+ if (current_effective_peer_migration_type_ != NO_CHANGE) {
+ // TODO(b/150095588): change the stats to
+ // num_valid_path_challenge_received.
+ ++stats_.num_connectivity_probing_received;
+ }
+ // If the packet contains PATH CHALLENGE, send appropriate RESPONSE.
+ // There was at least one PATH CHALLENGE in the received packet,
+ // Generate the required PATH RESPONSE.
+ SendGenericPathProbePacket(nullptr, last_packet_source_address_,
+ /* is_response=*/true);
+ return;
+ }
+ } else {
+ if (IsCurrentPacketConnectivityProbing()) {
+ visitor_->OnPacketReceived(last_packet_destination_address_,
+ last_packet_source_address_,
+ /*is_connectivity_probe=*/true);
+ return;
+ }
+ if (perspective_ == Perspective::IS_CLIENT) {
+ // This node is a client, notify that a speculative connectivity probing
+ // packet has been received anyway.
+ QUIC_DVLOG(1) << ENDPOINT
+ << "Received a speculative connectivity probing packet for "
+ << GetServerConnectionIdAsRecipient(last_header_,
+ perspective_)
+ << " from ip:port: "
+ << last_packet_source_address_.ToString() << " to ip:port: "
+ << last_packet_destination_address_.ToString();
+ visitor_->OnPacketReceived(last_packet_destination_address_,
+ last_packet_source_address_,
+ /*is_connectivity_probe=*/false);
+ return;
+ }
+ }
+ // Server starts to migrate connection upon receiving of non-probing packet
+ // from a new peer address.
+ if (last_header_.packet_number == GetLargestReceivedPacket()) {
+ direct_peer_address_ = last_packet_source_address_;
+ if (current_effective_peer_migration_type_ != NO_CHANGE) {
+ // TODO(fayang): When multiple packet number spaces is supported, only
+ // start peer migration for the application data.
+ StartEffectivePeerMigration(current_effective_peer_migration_type_);
+ }
+ }
+}
+
bool QuicConnection::IsValidStatelessResetToken(QuicUint128 token) const {
return stateless_reset_token_received_ &&
token == received_stateless_reset_token_;
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index c1bf5bb..50c6496 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -1341,6 +1341,15 @@
void MaybeActivateLegacyVersionEncapsulation();
void MaybeDisactivateLegacyVersionEncapsulation();
+ // For Google Quic, if the current packet is connectivity probing packet, call
+ // session OnPacketReceived() which eventually sends connectivity probing
+ // response on server side. And no-op on client side. And for both Google Quic
+ // and IETF Quic, start migration if the current packet is a non-probing
+ // packet.
+ // TODO(danzh) rename to MaybeRespondToPeerMigration() when Google Quic is
+ // deprecated.
+ void MaybeRespondToConnectivityProbingOrMigration();
+
QuicFramer framer_;
// Contents received in the current packet, especially used to identify