Reset alternative path state after migrating to that path. Protected by existing flag --quic_reloadable_flag_quic_pass_path_response_to_validator. PiperOrigin-RevId: 351447513 Change-Id: I0932ec20dd4e7016c9a950275f9f93e6a4453058
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc index 67177a5..8de03d2 100644 --- a/quic/core/quic_connection.cc +++ b/quic/core/quic_connection.cc
@@ -1095,6 +1095,10 @@ // probing, restart the path degrading and blackhole detection. OnForwardProgressMade(); } + if (IsMostRecentAlternativePath(self_address_, effective_peer_address_)) { + // Reset alternative path state even if it is still under validation. + most_recent_alternative_path_.Clear(); + } // TODO(b/159074035): notify SentPacketManger with RTT sample from probing and // reset cwnd if this is a successful network migration. } @@ -5653,5 +5657,13 @@ most_recent_alternative_path_.self_address == self_address; } +void QuicConnection::AlternativePathState::Clear() { + self_address = QuicSocketAddress(); + peer_address = QuicSocketAddress(); + validated = false; + bytes_received_before_address_validation_ = 0; + bytes_sent_before_address_validation_ = 0; +} + #undef ENDPOINT // undef for jumbo builds } // namespace quic
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h index 64e83b0..600e882 100644 --- a/quic/core/quic_connection.h +++ b/quic/core/quic_connection.h
@@ -1277,6 +1277,9 @@ : self_address(alternative_self_address), peer_address(alternative_peer_address) {} + // Reset all the members. + void Clear(); + QuicSocketAddress self_address; // The actual peer address behind the proxy if there is any. QuicSocketAddress peer_address;
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc index 609f28c..620f5f0 100644 --- a/quic/core/quic_connection_test.cc +++ b/quic/core/quic_connection_test.cc
@@ -12745,6 +12745,34 @@ EXPECT_FALSE(connection_.IsPathDegrading()); } +TEST_P(QuicConnectionTest, MigrateToNewPathDuringValidation) { + if (!VersionHasIetfQuicFrames(connection_.version().transport_version) || + !connection_.use_path_validator()) { + return; + } + PathProbeTestInit(Perspective::IS_CLIENT); + const QuicSocketAddress kNewSelfAddress(QuicIpAddress::Any4(), 12345); + EXPECT_NE(kNewSelfAddress, connection_.self_address()); + TestPacketWriter new_writer(version(), &clock_, Perspective::IS_CLIENT); + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); + bool success = false; + connection_.ValidatePath( + std::make_unique<TestQuicPathValidationContext>( + kNewSelfAddress, connection_.peer_address(), &new_writer), + std::make_unique<TestValidationResultDelegate>( + kNewSelfAddress, connection_.peer_address(), &success)); + EXPECT_TRUE(connection_.HasPendingPathValidation()); + EXPECT_TRUE(QuicConnectionPeer::IsMostRecentAlternativePath( + &connection_, kNewSelfAddress, connection_.peer_address())); + + connection_.MigratePath(kNewSelfAddress, connection_.peer_address(), + &new_writer, /*owns_writer=*/false); + EXPECT_EQ(kNewSelfAddress, connection_.self_address()); + EXPECT_TRUE(connection_.HasPendingPathValidation()); + EXPECT_FALSE(QuicConnectionPeer::IsMostRecentAlternativePath( + &connection_, kNewSelfAddress, connection_.peer_address())); +} + TEST_P(QuicConnectionTest, SingleAckInPacket) { EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); EXPECT_CALL(visitor_, OnConnectionClosed(_, _));
diff --git a/quic/test_tools/quic_connection_peer.cc b/quic/test_tools/quic_connection_peer.cc index 4989612..c446da3 100644 --- a/quic/test_tools/quic_connection_peer.cc +++ b/quic/test_tools/quic_connection_peer.cc
@@ -426,5 +426,13 @@ .bytes_sent_before_address_validation_; } +// static +bool QuicConnectionPeer::IsMostRecentAlternativePath( + QuicConnection* connection, + const QuicSocketAddress& self_address, + const QuicSocketAddress& peer_address) { + return connection->IsMostRecentAlternativePath(self_address, peer_address); +} + } // namespace test } // namespace quic
diff --git a/quic/test_tools/quic_connection_peer.h b/quic/test_tools/quic_connection_peer.h index 2795531..ad8a5ce 100644 --- a/quic/test_tools/quic_connection_peer.h +++ b/quic/test_tools/quic_connection_peer.h
@@ -176,6 +176,11 @@ static QuicByteCount BytesReceivedOnMostRecentAlternativePath( QuicConnection* connection); + + static bool IsMostRecentAlternativePath( + QuicConnection* connection, + const QuicSocketAddress& self_address, + const QuicSocketAddress& peer_address); }; } // namespace test