Internal change PiperOrigin-RevId: 483743653
diff --git a/quiche/quic/core/quic_connection.cc b/quiche/quic/core/quic_connection.cc index 565419d..b16c933 100644 --- a/quiche/quic/core/quic_connection.cc +++ b/quiche/quic/core/quic_connection.cc
@@ -2728,7 +2728,7 @@ sent_packet_manager_.GetLargestObserved() > highest_packet_sent_before_effective_peer_migration_)) { if (perspective_ == Perspective::IS_SERVER) { - OnEffectivePeerMigrationValidated(); + OnEffectivePeerMigrationValidated(/*is_migration_linkable=*/true); } } @@ -5077,7 +5077,8 @@ QUICHE_DCHECK(!mtu_discovery_alarm_->IsSet()); } -void QuicConnection::OnEffectivePeerMigrationValidated() { +void QuicConnection::OnEffectivePeerMigrationValidated( + bool /*is_migration_linkable*/) { if (active_effective_peer_migration_type_ == NO_CHANGE) { QUIC_BUG(quic_bug_10511_33) << "No migration underway."; return; @@ -5275,7 +5276,9 @@ // validation. ++stats_.num_peer_migration_to_proactively_validated_address; } - OnEffectivePeerMigrationValidated(); + OnEffectivePeerMigrationValidated( + default_path_.server_connection_id == + previous_default_path.server_connection_id); return; } @@ -7053,7 +7056,9 @@ " Connection is connected: ", connection_->connected_); QUIC_BUG(quic_bug_10511_43) << error_detail; } - connection_->OnEffectivePeerMigrationValidated(); + connection_->OnEffectivePeerMigrationValidated( + connection_->alternative_path_.server_connection_id == + connection_->default_path_.server_connection_id); } else { QUICHE_DCHECK(connection_->IsAlternativePath( context->self_address(), context->effective_peer_address()));
diff --git a/quiche/quic/core/quic_connection.h b/quiche/quic/core/quic_connection.h index 61e66cc..ece0b29 100644 --- a/quiche/quic/core/quic_connection.h +++ b/quiche/quic/core/quic_connection.h
@@ -1284,7 +1284,7 @@ void StartEffectivePeerMigration(AddressChangeType type); // Called when a effective peer address migration is validated. - virtual void OnEffectivePeerMigrationValidated(); + virtual void OnEffectivePeerMigrationValidated(bool is_migration_linkable); // Get the effective peer address from the packet being processed. For proxied // connections, effective peer address is the address of the endpoint behind
diff --git a/quiche/quic/core/quic_connection_test.cc b/quiche/quic/core/quic_connection_test.cc index 3a4e7a9..04e9d0e 100644 --- a/quiche/quic/core/quic_connection_test.cc +++ b/quiche/quic/core/quic_connection_test.cc
@@ -210,6 +210,23 @@ MOCK_METHOD(void, OnSerializedPacket, (SerializedPacket packet), (override)); + void OnEffectivePeerMigrationValidated(bool is_migration_linkable) override { + QuicConnection::OnEffectivePeerMigrationValidated(is_migration_linkable); + if (is_migration_linkable) { + num_linkable_client_migration_++; + } else { + num_unlinkable_client_migration_++; + } + } + + uint32_t num_unlinkable_client_migration() const { + return num_unlinkable_client_migration_; + } + + uint32_t num_linkable_client_migration() const { + return num_linkable_client_migration_; + } + void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); } @@ -541,6 +558,10 @@ std::unique_ptr<QuicSocketAddress> next_effective_peer_addr_; QuicSocketAddress self_address_on_default_path_while_sending_packet_; + + uint32_t num_unlinkable_client_migration_ = 0; + + uint32_t num_linkable_client_migration_ = 0; }; enum class AckResponse { kDefer, kImmediate }; @@ -1714,6 +1735,7 @@ if (connection_.validate_client_address()) { EXPECT_EQ(NO_CHANGE, connection_.active_effective_peer_migration_type()); EXPECT_EQ(1u, connection_.GetStats().num_validated_peer_migration); + EXPECT_EQ(1u, connection_.num_linkable_client_migration()); } } @@ -1855,6 +1877,7 @@ // than the anti-amplification limit. connection_.SendCryptoDataWithString(std::string(1200, 'a'), 0); EXPECT_EQ(1u, connection_.GetStats().num_validated_peer_migration); + EXPECT_EQ(1u, connection_.num_linkable_client_migration()); } TEST_P(QuicConnectionTest, PeerIpAddressChangeAtServerWithMissingConnectionId) { @@ -1994,6 +2017,7 @@ if (connection_.validate_client_address()) { EXPECT_EQ(NO_CHANGE, connection_.active_effective_peer_migration_type()); EXPECT_EQ(1u, connection_.GetStats().num_validated_peer_migration); + EXPECT_EQ(1u, connection_.num_linkable_client_migration()); } // Process another packet with a different direct peer address and the same @@ -13434,6 +13458,7 @@ .WillRepeatedly(Return(QuicBandwidth::Zero())); connection_.SendCryptoDataWithString(std::string(1200, 'a'), 0); EXPECT_EQ(1u, connection_.GetStats().num_validated_peer_migration); + EXPECT_EQ(1u, connection_.num_unlinkable_client_migration()); } TEST_P(QuicConnectionTest,