QuicConnection::ShouldGeneratePacket returns false when peer connection ID is required but unavailable.

Protected by FLAGS_quic_reloadable_flag_quic_connection_support_multiple_cids_v3.

PiperOrigin-RevId: 368481673
Change-Id: I92be6afd3aa243a0cd9d4fbdb8324a92fdaf4520
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc
index 42aebe5..9fb2f5d 100644
--- a/quic/core/quic_packet_creator.cc
+++ b/quic/core/quic_packet_creator.cc
@@ -2007,17 +2007,44 @@
 
 QuicPacketCreator::ScopedPeerAddressContext::ScopedPeerAddressContext(
     QuicPacketCreator* creator,
-    QuicSocketAddress address)
-    : creator_(creator), old_peer_address_(creator_->packet_.peer_address) {
-  QUIC_BUG_IF(quic_bug_12398_19,
-              !creator_->packet_.peer_address.IsInitialized())
+    QuicSocketAddress address,
+    bool update_connection_id)
+    : ScopedPeerAddressContext(creator,
+                               address,
+                               EmptyQuicConnectionId(),
+                               EmptyQuicConnectionId(),
+                               update_connection_id) {}
+
+QuicPacketCreator::ScopedPeerAddressContext::ScopedPeerAddressContext(
+    QuicPacketCreator* creator,
+    QuicSocketAddress address,
+    const QuicConnectionId& client_connection_id,
+    const QuicConnectionId& server_connection_id,
+    bool update_connection_id)
+    : creator_(creator),
+      old_peer_address_(creator_->packet_.peer_address),
+      old_client_connection_id_(creator_->GetClientConnectionId()),
+      old_server_connection_id_(creator_->GetServerConnectionId()),
+      update_connection_id_(update_connection_id) {
+  QUIC_BUG_IF(quic_bug_12398_19, !old_peer_address_.IsInitialized())
       << "Context is used before seralized packet's peer address is "
          "initialized.";
   creator_->SetDefaultPeerAddress(address);
+  if (update_connection_id_) {
+    QUICHE_DCHECK(address != old_peer_address_ ||
+                  ((client_connection_id == old_client_connection_id_) &&
+                   (server_connection_id == old_server_connection_id_)));
+    creator_->SetClientConnectionId(client_connection_id);
+    creator_->SetServerConnectionId(server_connection_id);
+  }
 }
 
 QuicPacketCreator::ScopedPeerAddressContext::~ScopedPeerAddressContext() {
   creator_->SetDefaultPeerAddress(old_peer_address_);
+  if (update_connection_id_) {
+    creator_->SetClientConnectionId(old_client_connection_id_);
+    creator_->SetServerConnectionId(old_server_connection_id_);
+  }
 }
 
 QuicPacketCreator::ScopedSerializationFailureHandler::