Change SPAD from client_connection_option to connection_option. Server only send connection ID and token for preferred address if SPAD has been received. Note for chromium merge: This would cause some QuicStreamFactoryTest tests failures. Please change quic_params_->client_connection_options.push_back(quic::kSPAD) to quic_params_->connection_options.push_back(quic::kSPAD) PiperOrigin-RevId: 501162626
diff --git a/quiche/quic/core/http/end_to_end_test.cc b/quiche/quic/core/http/end_to_end_test.cc index 83dc8a2..a6e97f9 100644 --- a/quiche/quic/core/http/end_to_end_test.cc +++ b/quiche/quic/core/http/end_to_end_test.cc
@@ -5497,8 +5497,7 @@ server_writer_ = new PacketDroppingTestWriter(); StartServer(); - client_config_.SetConnectionOptionsToSend(QuicTagVector{kRVCM}); - client_config_.SetClientConnectionOptions(QuicTagVector{kSPAD}); + client_config_.SetConnectionOptionsToSend(QuicTagVector{kRVCM, kSPAD}); client_.reset(CreateQuicClient(nullptr)); EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed()); while (client_->client()->HasPendingPathValidation()) { @@ -5536,8 +5535,8 @@ server_writer_ = new PacketDroppingTestWriter(); StartServer(); - client_config_.SetConnectionOptionsToSend(QuicTagVector{kRVCM}); - client_config_.SetClientConnectionOptions(QuicTagVector{kSPAD, kSPA2}); + client_config_.SetConnectionOptionsToSend(QuicTagVector{kRVCM, kSPAD}); + client_config_.SetClientConnectionOptions(QuicTagVector{kSPA2}); client_.reset(CreateQuicClient(nullptr)); EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed()); while (client_->client()->HasPendingPathValidation()) {
diff --git a/quiche/quic/core/quic_connection.cc b/quiche/quic/core/quic_connection.cc index ef4c9a1..f22d8ed 100644 --- a/quiche/quic/core/quic_connection.cc +++ b/quiche/quic/core/quic_connection.cc
@@ -661,7 +661,7 @@ if (connection_migration_use_new_cid_ && config.HasReceivedPreferredAddressConnectionIdAndToken() && - config.HasClientRequestedIndependentOption(kSPAD, perspective_)) { + config.HasClientSentConnectionOption(kSPAD, perspective_)) { if (self_address().host().IsIPv4() && config.HasReceivedIPv4AlternateServerAddress()) { server_preferred_address_ = config.ReceivedIPv4AlternateServerAddress();
diff --git a/quiche/quic/core/quic_connection_test.cc b/quiche/quic/core/quic_connection_test.cc index 2a5c9c1..b567587 100644 --- a/quiche/quic/core/quic_connection_test.cc +++ b/quiche/quic/core/quic_connection_test.cc
@@ -1491,7 +1491,6 @@ connection_.RemoveEncrypter(ENCRYPTION_INITIAL); connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); - config.SetConnectionOptionsToSend(QuicTagVector{kRVCM}); QuicConfigPeer::SetReceivedStatelessResetToken(&config, kTestStatelessResetToken); QuicConfigPeer::SetReceivedAlternateServerAddress(&config, @@ -3002,8 +3001,7 @@ connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); QuicConfig config; - config.SetClientConnectionOptions(QuicTagVector{kSPAD}); - config.SetConnectionOptionsToSend(QuicTagVector{kRVCM}); + config.SetConnectionOptionsToSend(QuicTagVector{kRVCM, kSPAD}); QuicConfigPeer::SetReceivedStatelessResetToken(&config, kTestStatelessResetToken); QuicConfigPeer::SetReceivedAlternateServerAddress(&config, @@ -16065,7 +16063,7 @@ return; } QuicConfig config; - config.SetClientConnectionOptions(QuicTagVector{kSPAD}); + config.SetConnectionOptionsToSend(QuicTagVector{kRVCM, kSPAD}); ServerPreferredAddressInit(config); const QuicSocketAddress kNewSelfAddress = QuicSocketAddress(QuicIpAddress::Loopback6(), /*port=*/23456); @@ -16147,7 +16145,7 @@ return; } QuicConfig config; - config.SetClientConnectionOptions(QuicTagVector{kSPAD}); + config.SetConnectionOptionsToSend(QuicTagVector{kRVCM, kSPAD}); ServerPreferredAddressInit(config); const QuicSocketAddress kNewSelfAddress = QuicSocketAddress(QuicIpAddress::Loopback6(), /*port=*/23456); @@ -16215,7 +16213,7 @@ return; } QuicConfig config; - config.SetClientConnectionOptions(QuicTagVector{kSPAD}); + config.SetConnectionOptionsToSend(QuicTagVector{kRVCM, kSPAD}); ServerPreferredAddressInit(config); const QuicSocketAddress kNewSelfAddress = QuicSocketAddress(QuicIpAddress::Loopback6(), /*port=*/23456); @@ -16297,7 +16295,8 @@ &connection_)); })); QuicConfig config; - config.SetClientConnectionOptions(QuicTagVector{kSPAD, kSPA2}); + config.SetConnectionOptionsToSend(QuicTagVector{kRVCM, kSPAD}); + config.SetClientConnectionOptions(QuicTagVector{kSPA2}); ServerPreferredAddressInit(config); EXPECT_TRUE(connection_.HasPendingPathValidation()); ASSERT_FALSE(new_writer.path_challenge_frames().empty()); @@ -16334,7 +16333,8 @@ &connection_)); })); QuicConfig config; - config.SetClientConnectionOptions(QuicTagVector{kSPAD, kSPA2}); + config.SetConnectionOptionsToSend(QuicTagVector{kRVCM, kSPAD}); + config.SetClientConnectionOptions(QuicTagVector{kSPA2}); ServerPreferredAddressInit(config); EXPECT_TRUE(connection_.HasPendingPathValidation()); ASSERT_FALSE(new_writer.path_challenge_frames().empty()); @@ -16377,7 +16377,8 @@ &connection_)); })); QuicConfig config; - config.SetClientConnectionOptions(QuicTagVector{kSPAD, kSPA2}); + config.SetConnectionOptionsToSend(QuicTagVector{kRVCM, kSPAD}); + config.SetClientConnectionOptions(QuicTagVector{kSPA2}); ServerPreferredAddressInit(config); EXPECT_TRUE(connection_.HasPendingPathValidation()); ASSERT_FALSE(new_writer.path_challenge_frames().empty()); @@ -16410,7 +16411,8 @@ return; } QuicConfig config; - config.SetClientConnectionOptions(QuicTagVector{kMPQC, kSPAD}); + config.SetConnectionOptionsToSend(QuicTagVector{kRVCM, kSPAD}); + config.SetClientConnectionOptions(QuicTagVector{kMPQC}); ServerPreferredAddressInit(config); if (!connection_.connection_migration_use_new_cid()) { return;
diff --git a/quiche/quic/core/quic_session.cc b/quiche/quic/core/quic_session.cc index 7f3312e..208c01b 100644 --- a/quiche/quic/core/quic_session.cc +++ b/quiche/quic/core/quic_session.cc
@@ -1328,7 +1328,9 @@ } if (version().HasIetfQuicFrames() && - config_.CanSendPreferredAddressConnectionIdAndToken()) { + config_.CanSendPreferredAddressConnectionIdAndToken() && + config_.HasClientSentConnectionOption(kSPAD, perspective())) { + // Set connection ID and token if SPAD is received. absl::optional<QuicNewConnectionIdFrame> frame = connection_->MaybeIssueNewConnectionIdForPreferredAddress(); if (frame.has_value()) {