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()) {