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