Project import generated by Copybara.

PiperOrigin-RevId: 248265360
Change-Id: Ib862f0deab43c6175c46799be27bb6d2589f610f
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc
index dddc8e7..0ffcc37 100644
--- a/quic/core/quic_packet_creator.cc
+++ b/quic/core/quic_packet_creator.cc
@@ -114,7 +114,7 @@
   max_packet_length_ = length;
   max_plaintext_size_ = framer_->GetMaxPlaintextSize(max_packet_length_);
   QUIC_BUG_IF(max_plaintext_size_ - PacketHeaderSize() <
-              MinPlaintextPacketSize())
+              MinPlaintextPacketSize(framer_->version()))
       << "Attempted to set max packet length too small";
 }
 
@@ -466,8 +466,8 @@
     QUIC_BUG << "AppendStreamFrame failed";
     return;
   }
-  if (plaintext_bytes_written < MinPlaintextPacketSize() &&
-      !writer.WritePaddingBytes(MinPlaintextPacketSize() -
+  if (plaintext_bytes_written < MinPlaintextPacketSize(framer_->version()) &&
+      !writer.WritePaddingBytes(MinPlaintextPacketSize(framer_->version()) -
                                 plaintext_bytes_written)) {
     QUIC_BUG << "Unable to add padding bytes";
     return;
@@ -735,9 +735,32 @@
                           nullptr, 0, false, false);
 }
 
+QuicConnectionId QuicPacketCreator::GetDestinationConnectionId() const {
+  if (!GetQuicRestartFlag(quic_do_not_override_connection_id)) {
+    return connection_id_;
+  }
+  QUIC_RESTART_FLAG_COUNT_N(quic_do_not_override_connection_id, 1, 5);
+  if (framer_->perspective() == Perspective::IS_SERVER) {
+    return EmptyQuicConnectionId();
+  }
+  return connection_id_;
+}
+
+QuicConnectionId QuicPacketCreator::GetSourceConnectionId() const {
+  if (!GetQuicRestartFlag(quic_do_not_override_connection_id)) {
+    return connection_id_;
+  }
+  QUIC_RESTART_FLAG_COUNT_N(quic_do_not_override_connection_id, 6, 6);
+  if (framer_->perspective() == Perspective::IS_CLIENT) {
+    return EmptyQuicConnectionId();
+  }
+  return connection_id_;
+}
+
 QuicConnectionIdIncluded QuicPacketCreator::GetDestinationConnectionIdIncluded()
     const {
-  if (framer_->transport_version() > QUIC_VERSION_43) {
+  if (framer_->transport_version() > QUIC_VERSION_43 ||
+      GetQuicRestartFlag(quic_do_not_override_connection_id)) {
     // Packets sent by client always include destination connection ID, and
     // those sent by the server do not include destination connection ID.
     return framer_->perspective() == Perspective::IS_CLIENT
@@ -753,6 +776,11 @@
   if (HasIetfLongHeader() && framer_->perspective() == Perspective::IS_SERVER) {
     return CONNECTION_ID_PRESENT;
   }
+  if (GetQuicRestartFlag(quic_do_not_override_connection_id) &&
+      framer_->perspective() == Perspective::IS_SERVER) {
+    QUIC_RESTART_FLAG_COUNT_N(quic_do_not_override_connection_id, 2, 5);
+    return connection_id_included_;
+  }
   return CONNECTION_ID_ABSENT;
 }
 
@@ -761,7 +789,8 @@
   DCHECK(QuicUtils::IsConnectionIdValidForVersion(connection_id_,
                                                   transport_version()));
   return GetDestinationConnectionIdIncluded() == CONNECTION_ID_PRESENT
-             ? static_cast<QuicConnectionIdLength>(connection_id_.length())
+             ? static_cast<QuicConnectionIdLength>(
+                   GetDestinationConnectionId().length())
              : PACKET_0BYTE_CONNECTION_ID;
 }
 
@@ -769,7 +798,8 @@
   DCHECK(QuicUtils::IsConnectionIdValidForVersion(connection_id_,
                                                   transport_version()));
   return GetSourceConnectionIdIncluded() == CONNECTION_ID_PRESENT
-             ? static_cast<QuicConnectionIdLength>(connection_id_.length())
+             ? static_cast<QuicConnectionIdLength>(
+                   GetSourceConnectionId().length())
              : PACKET_0BYTE_CONNECTION_ID;
 }
 
@@ -820,10 +850,10 @@
 }
 
 void QuicPacketCreator::FillPacketHeader(QuicPacketHeader* header) {
-  header->destination_connection_id = connection_id_;
+  header->destination_connection_id = GetDestinationConnectionId();
   header->destination_connection_id_included =
       GetDestinationConnectionIdIncluded();
-  header->source_connection_id = connection_id_;
+  header->source_connection_id = GetSourceConnectionId();
   header->source_connection_id_included = GetSourceConnectionIdIncluded();
   header->reset_flag = false;
   header->version_flag = IncludeVersionInHeader();
@@ -931,9 +961,11 @@
   if (framer_->version().HasHeaderProtection()) {
     size_t frame_bytes = PacketSize() - PacketHeaderSize();
 
-    if (frame_bytes + pending_padding_bytes_ < MinPlaintextPacketSize() &&
+    if (frame_bytes + pending_padding_bytes_ <
+            MinPlaintextPacketSize(framer_->version()) &&
         !needs_full_padding_) {
-      extra_padding_bytes = MinPlaintextPacketSize() - frame_bytes;
+      extra_padding_bytes =
+          MinPlaintextPacketSize(framer_->version()) - frame_bytes;
     }
   }
 
@@ -1063,8 +1095,9 @@
          packet_.encryption_level < ENCRYPTION_FORWARD_SECURE;
 }
 
-size_t QuicPacketCreator::MinPlaintextPacketSize() const {
-  if (!framer_->version().HasHeaderProtection()) {
+size_t QuicPacketCreator::MinPlaintextPacketSize(
+    const ParsedQuicVersion& version) {
+  if (!version.HasHeaderProtection()) {
     return 0;
   }
   // Header protection samples 16 bytes of ciphertext starting 4 bytes after the