When server tries to send a packet from original address to a client address (say A), override the packet's self address to server preferred address if server has not received packet from A on the original address.
Protected by FLAGS_quic_reloadable_flag_quic_use_received_client_addresses_cache.
PiperOrigin-RevId: 518029299
diff --git a/quiche/quic/core/quic_connection_test.cc b/quiche/quic/core/quic_connection_test.cc
index e0cd6e3..d3ff120 100644
--- a/quiche/quic/core/quic_connection_test.cc
+++ b/quiche/quic/core/quic_connection_test.cc
@@ -1497,6 +1497,7 @@
connection_.CreateConnectionIdManager();
QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
SetQuicReloadableFlag(quic_connection_migration_use_new_cid_v2, true);
+ SetQuicReloadableFlag(quic_use_received_client_addresses_cache, true);
EXPECT_CALL(visitor_, AllowSelfAddressChange())
.WillRepeatedly(Return(true));
@@ -2791,8 +2792,11 @@
.WillOnce(Invoke([&]() {
EXPECT_EQ(1u, writer_->path_response_frames().size());
EXPECT_EQ(1u, writer_->path_challenge_frames().size());
- EXPECT_EQ(kSelfAddress.host(), writer_->last_write_source_address());
- // The responses should still be sent from the original address.
+ EXPECT_EQ(kServerPreferredAddress.host(),
+ writer_->last_write_source_address());
+ // The responses should be sent from preferred address given server
+ // has not received packet on original address from the new client
+ // address.
EXPECT_EQ(kNewPeerAddress, writer_->last_write_peer_address());
}));
ProcessReceivedPacket(kServerPreferredAddress, kNewPeerAddress, *received);
@@ -17413,8 +17417,11 @@
.WillOnce(Invoke([&]() {
EXPECT_EQ(1u, writer_->path_response_frames().size());
EXPECT_EQ(1u, writer_->path_challenge_frames().size());
- // The responses should still be sent from the original address.
- EXPECT_EQ(kSelfAddress.host(), writer_->last_write_source_address());
+ // The responses should be sent from preferred address given server
+ // has not received packet on original address from the new client
+ // address.
+ EXPECT_EQ(kServerPreferredAddress.host(),
+ writer_->last_write_source_address());
EXPECT_EQ(kNewPeerAddress, writer_->last_write_peer_address());
}));
ProcessReceivedPacket(kServerPreferredAddress, kNewPeerAddress, *received);
@@ -17451,7 +17458,8 @@
ProcessFramePacketWithAddresses(MakeCryptoFrame(), kServerPreferredAddress,
kNewPeerAddress, ENCRYPTION_FORWARD_SECURE);
EXPECT_EQ(kNewPeerAddress, connection_.peer_address());
- EXPECT_EQ(kSelfAddress.host(), writer_->last_write_source_address());
+ EXPECT_EQ(kServerPreferredAddress.host(),
+ writer_->last_write_source_address());
EXPECT_EQ(kSelfAddress, connection_.self_address());
}