Pass PATH_CHALLENGE payload to QuicPacketCreator::SendPathChallenge() instead of getting it populated by this interface.

This changes the behavior in the old implementation of IETF connection migration. But it is not used in production.

PiperOrigin-RevId: 342098354
Change-Id: I8b719738184c49907e313d53bee0281546ca0fae
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 845e078..6e6ded6 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -4432,9 +4432,11 @@
     // Send a path probe request using IETF QUIC PATH_CHALLENGE frame.
     transmitted_connectivity_probe_payload_ =
         std::make_unique<QuicPathFrameBuffer>();
+    random_generator_->RandBytes(transmitted_connectivity_probe_payload_.get(),
+                                 sizeof(QuicPathFrameBuffer));
     probing_packet =
         packet_creator_.SerializePathChallengeConnectivityProbingPacket(
-            transmitted_connectivity_probe_payload_.get());
+            *transmitted_connectivity_probe_payload_);
     if (!probing_packet) {
       transmitted_connectivity_probe_payload_ = nullptr;
     }
@@ -5437,7 +5439,7 @@
   return sent_packet_manager_.GetRetransmissionTime();
 }
 
-void QuicConnection::SendPathChallenge(QuicPathFrameBuffer* data_buffer,
+void QuicConnection::SendPathChallenge(const QuicPathFrameBuffer& data_buffer,
                                        const QuicSocketAddress& self_address,
                                        const QuicSocketAddress& peer_address,
                                        QuicPacketWriter* writer) {
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 35d15ff..b19796a 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -1115,7 +1115,7 @@
   // PATH_CHALLENGE will be written in an individual packet and it will be
   // dropped if write fails. |data_buffer| will be populated with the payload
   // for future validation.
-  void SendPathChallenge(QuicPathFrameBuffer* data_buffer,
+  void SendPathChallenge(const QuicPathFrameBuffer& data_buffer,
                          const QuicSocketAddress& self_address,
                          const QuicSocketAddress& peer_address,
                          QuicPacketWriter* writer);
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 1d55c1a..5f8af1c 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -1176,7 +1176,7 @@
           {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
       return QuicPacketCreatorPeer::
           SerializePathChallengeConnectivityProbingPacket(&peer_creator_,
-                                                          &payload);
+                                                          payload);
     }
     return QuicPacketCreatorPeer::SerializeConnectivityProbingPacket(
         &peer_creator_);
@@ -6505,9 +6505,10 @@
       .Times(1);
   if (connection_.send_path_response() &&
       VersionHasIetfQuicFrames(GetParam().version.transport_version)) {
-    QuicPathFrameBuffer payload;
+    QuicPathFrameBuffer payload{
+        {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
     QuicConnection::ScopedPacketFlusher flusher(&connection_);
-    connection_.SendPathChallenge(&payload, connection_.self_address(),
+    connection_.SendPathChallenge(payload, connection_.self_address(),
                                   connection_.peer_address(), writer_.get());
   } else {
     connection_.SendConnectivityProbingPacket(writer_.get(),
@@ -11342,7 +11343,7 @@
   const QuicSocketAddress kNewSourceAddress(QuicIpAddress::Any6(), 12345);
   EXPECT_NE(kNewSourceAddress, connection_.self_address());
   TestPacketWriter new_writer(version(), &clock_, Perspective::IS_CLIENT);
-  QuicPathFrameBuffer payload;
+  QuicPathFrameBuffer payload{{0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
       .WillOnce(Invoke([&]() {
         EXPECT_EQ(1u, new_writer.packets_write_attempts());
@@ -11355,7 +11356,7 @@
         EXPECT_EQ(kNewSourceAddress.host(),
                   new_writer.last_write_source_address());
       }));
-  connection_.SendPathChallenge(&payload, kNewSourceAddress,
+  connection_.SendPathChallenge(payload, kNewSourceAddress,
                                 connection_.peer_address(), &new_writer);
   EXPECT_EQ(0u, writer_->packets_write_attempts());
 }
@@ -11370,7 +11371,7 @@
   EXPECT_NE(kNewSourceAddress, connection_.self_address());
   TestPacketWriter new_writer(version(), &clock_, Perspective::IS_CLIENT);
   new_writer.BlockOnNextWrite();
-  QuicPathFrameBuffer payload;
+  QuicPathFrameBuffer payload{{0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
   EXPECT_CALL(visitor_, OnWriteBlocked()).Times(0);
   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
       .WillOnce(Invoke([&]() {
@@ -11386,7 +11387,7 @@
         EXPECT_EQ(kNewSourceAddress.host(),
                   new_writer.last_write_source_address());
       }));
-  connection_.SendPathChallenge(&payload, kNewSourceAddress,
+  connection_.SendPathChallenge(payload, kNewSourceAddress,
                                 connection_.peer_address(), &new_writer);
   EXPECT_EQ(0u, writer_->packets_write_attempts());
 
@@ -11408,7 +11409,7 @@
   }
   const QuicSocketAddress kNewPeerAddress(QuicIpAddress::Any6(), 12345);
   writer_->BlockOnNextWrite();
-  QuicPathFrameBuffer payload;
+  QuicPathFrameBuffer payload{{0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
   // 1st time is after writer returns WRITE_STATUS_BLOCKED. 2nd time is in
   // ShouldGeneratePacket();
   EXPECT_CALL(visitor_, OnWriteBlocked()).Times(2u);
@@ -11423,14 +11424,14 @@
         EXPECT_EQ(1u, writer_->padding_frames().size());
         EXPECT_EQ(kNewPeerAddress, writer_->last_write_peer_address());
       }));
-  connection_.SendPathChallenge(&payload, connection_.self_address(),
+  connection_.SendPathChallenge(payload, connection_.self_address(),
                                 kNewPeerAddress, writer_.get());
   EXPECT_EQ(1u, writer_->packets_write_attempts());
 
   memset(payload.data(), 0, sizeof(payload));
   // Try again with the new socket blocked from the beginning. The 2nd
   // PATH_CHALLENGE shouldn't be serialized, but be dropped.
-  connection_.SendPathChallenge(&payload, connection_.self_address(),
+  connection_.SendPathChallenge(payload, connection_.self_address(),
                                 kNewPeerAddress, writer_.get());
   // No more write attempt should be made.
   EXPECT_EQ(1u, writer_->packets_write_attempts());
@@ -11453,11 +11454,11 @@
   EXPECT_NE(kNewSourceAddress, connection_.self_address());
   TestPacketWriter new_writer(version(), &clock_, Perspective::IS_CLIENT);
   new_writer.SetShouldWriteFail();
-  QuicPathFrameBuffer payload;
+  QuicPathFrameBuffer payload{{0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
   EXPECT_CALL(visitor_, OnConnectionClosed(_, ConnectionCloseSource::FROM_SELF))
       .Times(0);
 
-  connection_.SendPathChallenge(&payload, kNewSourceAddress,
+  connection_.SendPathChallenge(payload, kNewSourceAddress,
                                 connection_.peer_address(), &new_writer);
   // Regardless of the write error, the PATH_CHALLENGE should still be
   // treated as sent.
@@ -11481,7 +11482,7 @@
   }
   PathProbeTestInit(Perspective::IS_CLIENT);
   writer_->SetShouldWriteFail();
-  QuicPathFrameBuffer payload;
+  QuicPathFrameBuffer payload{{0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
   EXPECT_CALL(visitor_, OnConnectionClosed(_, ConnectionCloseSource::FROM_SELF))
       .WillOnce(
           Invoke([](QuicConnectionCloseFrame frame, ConnectionCloseSource) {
@@ -11492,7 +11493,7 @@
     // Add a flusher to force flush, otherwise the frames will remain in the
     // packet creator.
     QuicConnection::ScopedPacketFlusher flusher(&connection_);
-    connection_.SendPathChallenge(&payload, connection_.self_address(),
+    connection_.SendPathChallenge(payload, connection_.self_address(),
                                   connection_.peer_address(), writer_.get());
   }
   EXPECT_EQ(1u, writer_->packets_write_attempts());
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc
index 3db37ed..087b427 100644
--- a/quic/core/quic_packet_creator.cc
+++ b/quic/core/quic_packet_creator.cc
@@ -875,7 +875,7 @@
 
 std::unique_ptr<SerializedPacket>
 QuicPacketCreator::SerializePathChallengeConnectivityProbingPacket(
-    QuicPathFrameBuffer* payload) {
+    const QuicPathFrameBuffer& payload) {
   QUIC_BUG_IF(!VersionHasIetfQuicFrames(framer_->transport_version()))
       << "Must be version 99 to serialize path challenge connectivity probe, "
          "is version "
@@ -888,9 +888,9 @@
   QUIC_DVLOG(2) << ENDPOINT << "Serializing path challenge packet " << header;
 
   std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
-  size_t length = BuildPaddedPathChallengePacket(
-      header, buffer.get(), max_plaintext_size_, payload, random_,
-      packet_.encryption_level);
+  size_t length =
+      BuildPaddedPathChallengePacket(header, buffer.get(), max_plaintext_size_,
+                                     payload, packet_.encryption_level);
   DCHECK(length);
 
   DCHECK_EQ(packet_.encryption_level, ENCRYPTION_FORWARD_SECURE);
@@ -960,15 +960,13 @@
     const QuicPacketHeader& header,
     char* buffer,
     size_t packet_length,
-    QuicPathFrameBuffer* payload,
-    QuicRandom* randomizer,
+    const QuicPathFrameBuffer& payload,
     EncryptionLevel level) {
   DCHECK(VersionHasIetfQuicFrames(framer_->transport_version()));
   QuicFrames frames;
 
   // Write a PATH_CHALLENGE frame, which has a random 8-byte payload
-  randomizer->RandBytes(payload->data(), payload->size());
-  QuicPathChallengeFrame path_challenge_frame(0, *payload);
+  QuicPathChallengeFrame path_challenge_frame(0, payload);
   frames.push_back(QuicFrame(&path_challenge_frame));
 
   if (debug_delegate_ != nullptr) {
@@ -2008,10 +2006,10 @@
   packet_.encryption_level = level;
 }
 
-void QuicPacketCreator::AddPathChallengeFrame(QuicPathFrameBuffer* payload) {
+void QuicPacketCreator::AddPathChallengeFrame(
+    const QuicPathFrameBuffer& payload) {
   // Write a PATH_CHALLENGE frame, which has a random 8-byte payload.
-  random_->RandBytes(payload->data(), payload->size());
-  auto path_challenge_frame = new QuicPathChallengeFrame(0, *payload);
+  auto path_challenge_frame = new QuicPathChallengeFrame(0, payload);
   QuicFrame frame(path_challenge_frame);
   if (AddPaddedFrameWithRetry(frame)) {
     return;
diff --git a/quic/core/quic_packet_creator.h b/quic/core/quic_packet_creator.h
index 54da59c..f1ace67 100644
--- a/quic/core/quic_packet_creator.h
+++ b/quic/core/quic_packet_creator.h
@@ -239,7 +239,8 @@
   // SerializePathChallengeConnectivityProbingPacket will pad the packet to be
   // MTU bytes long.
   std::unique_ptr<SerializedPacket>
-  SerializePathChallengeConnectivityProbingPacket(QuicPathFrameBuffer* payload);
+  SerializePathChallengeConnectivityProbingPacket(
+      const QuicPathFrameBuffer& payload);
 
   // If |is_padded| is true then SerializePathResponseConnectivityProbingPacket
   // will pad the packet to be MTU bytes long, else it will not pad the packet.
@@ -255,7 +256,7 @@
   // Add PATH_CHALLENGE to current packet, flush before or afterwards if needed.
   // This is a best effort adding. It may fail becasue of delegate state, but
   // it's okay because of path validation retry mechanism.
-  void AddPathChallengeFrame(QuicPathFrameBuffer* payload);
+  void AddPathChallengeFrame(const QuicPathFrameBuffer& payload);
 
   // Returns a dummy packet that is valid but contains no useful information.
   static SerializedPacket NoPacket();
@@ -432,8 +433,7 @@
   size_t BuildPaddedPathChallengePacket(const QuicPacketHeader& header,
                                         char* buffer,
                                         size_t packet_length,
-                                        QuicPathFrameBuffer* payload,
-                                        QuicRandom* randomizer,
+                                        const QuicPathFrameBuffer& payload,
                                         EncryptionLevel level);
 
   // Serialize a probing response packet that uses IETF QUIC's PATH RESPONSE
diff --git a/quic/core/quic_packet_creator_test.cc b/quic/core/quic_packet_creator_test.cc
index d76f198..b33389d 100644
--- a/quic/core/quic_packet_creator_test.cc
+++ b/quic/core/quic_packet_creator_test.cc
@@ -592,7 +592,9 @@
   header.reset_flag = false;
   header.version_flag = false;
   header.packet_number = kPacketNumber;
+  MockRandom randomizer;
   QuicPathFrameBuffer payload;
+  randomizer.RandBytes(payload.data(), payload.size());
 
   // clang-format off
   unsigned char packet[] = {
@@ -614,10 +616,9 @@
   // clang-format on
 
   std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
-  MockRandom randomizer;
 
   size_t length = creator_.BuildPaddedPathChallengePacket(
-      header, buffer.get(), ABSL_ARRAYSIZE(packet), &payload, &randomizer,
+      header, buffer.get(), ABSL_ARRAYSIZE(packet), payload,
       ENCRYPTION_INITIAL);
   EXPECT_EQ(length, ABSL_ARRAYSIZE(packet));
 
@@ -921,7 +922,7 @@
     QuicPathFrameBuffer payload = {
         {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
     encrypted =
-        creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
+        creator_.SerializePathChallengeConnectivityProbingPacket(payload);
   } else {
     encrypted = creator_.SerializeConnectivityProbingPacket();
   }
@@ -956,7 +957,7 @@
   creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE);
 
   std::unique_ptr<SerializedPacket> encrypted(
-      creator_.SerializePathChallengeConnectivityProbingPacket(&payload));
+      creator_.SerializePathChallengeConnectivityProbingPacket(payload));
   {
     InSequence s;
     EXPECT_CALL(framer_visitor_, OnPacket());
@@ -3413,7 +3414,7 @@
     QuicPathFrameBuffer payload = {
         {0xde, 0xad, 0xbe, 0xef, 0xba, 0xdc, 0x0f, 0xfe}};
     probing_packet =
-        creator_.SerializePathChallengeConnectivityProbingPacket(&payload);
+        creator_.SerializePathChallengeConnectivityProbingPacket(payload);
   } else {
     probing_packet = creator_.SerializeConnectivityProbingPacket();
   }
diff --git a/quic/test_tools/quic_packet_creator_peer.cc b/quic/test_tools/quic_packet_creator_peer.cc
index f94620b..1686c03 100644
--- a/quic/test_tools/quic_packet_creator_peer.cc
+++ b/quic/test_tools/quic_packet_creator_peer.cc
@@ -131,7 +131,7 @@
 std::unique_ptr<SerializedPacket>
 QuicPacketCreatorPeer::SerializePathChallengeConnectivityProbingPacket(
     QuicPacketCreator* creator,
-    QuicPathFrameBuffer* payload) {
+    const QuicPathFrameBuffer& payload) {
   return creator->SerializePathChallengeConnectivityProbingPacket(payload);
 }
 
diff --git a/quic/test_tools/quic_packet_creator_peer.h b/quic/test_tools/quic_packet_creator_peer.h
index 2dc9413..3d5b1cb 100644
--- a/quic/test_tools/quic_packet_creator_peer.h
+++ b/quic/test_tools/quic_packet_creator_peer.h
@@ -53,8 +53,9 @@
   static std::unique_ptr<SerializedPacket> SerializeConnectivityProbingPacket(
       QuicPacketCreator* creator);
   static std::unique_ptr<SerializedPacket>
-  SerializePathChallengeConnectivityProbingPacket(QuicPacketCreator* creator,
-                                                  QuicPathFrameBuffer* payload);
+  SerializePathChallengeConnectivityProbingPacket(
+      QuicPacketCreator* creator,
+      const QuicPathFrameBuffer& payload);
 
   static EncryptionLevel GetEncryptionLevel(QuicPacketCreator* creator);
   static QuicFramer* framer(QuicPacketCreator* creator);