gfe-relnote: In QUIC, let StatelessConnectionTerminator have its own framer instead of using framer of dispatcher. No functional change expected. Not protected.

PiperOrigin-RevId: 247063103
Change-Id: Ia8b7d66e948088ef02337f2a1dc1d8039a5356d0
diff --git a/quic/core/quic_dispatcher.cc b/quic/core/quic_dispatcher.cc
index 094fc7b..750f9b4 100644
--- a/quic/core/quic_dispatcher.cc
+++ b/quic/core/quic_dispatcher.cc
@@ -115,20 +115,23 @@
 class StatelessConnectionTerminator {
  public:
   StatelessConnectionTerminator(QuicConnectionId connection_id,
-                                QuicFramer* framer,
+                                const ParsedQuicVersion version,
                                 QuicConnectionHelperInterface* helper,
                                 QuicTimeWaitListManager* time_wait_list_manager)
       : connection_id_(connection_id),
-        framer_(framer),
+        framer_(ParsedQuicVersionVector{version},
+                /*unused*/ QuicTime::Zero(),
+                Perspective::IS_SERVER,
+                /*unused*/ kQuicDefaultConnectionIdLength),
         collector_(helper->GetStreamSendBufferAllocator()),
-        creator_(connection_id, framer, &collector_),
+        creator_(connection_id, &framer_, &collector_),
         time_wait_list_manager_(time_wait_list_manager) {
-    framer_->set_data_producer(&collector_);
+    framer_.set_data_producer(&collector_);
   }
 
   ~StatelessConnectionTerminator() {
     // Clear framer's producer.
-    framer_->set_data_producer(nullptr);
+    framer_.set_data_producer(nullptr);
   }
 
   // Generates a packet containing a CONNECTION_CLOSE frame specifying
@@ -138,8 +141,7 @@
                        bool ietf_quic) {
     QuicConnectionCloseFrame* frame =
         new QuicConnectionCloseFrame(error_code, error_details);
-    // TODO(fkastenholz): The framer version may be incorrect in some cases.
-    if (framer_->transport_version() == QUIC_VERSION_99) {
+    if (framer_.transport_version() == QUIC_VERSION_99) {
       frame->close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
     }
 
@@ -164,9 +166,9 @@
     collector_.SaveStatelessRejectFrameData(reject);
     while (offset < reject.length()) {
       QuicFrame frame;
-      if (!QuicVersionUsesCryptoFrames(framer_->transport_version())) {
+      if (!QuicVersionUsesCryptoFrames(framer_.transport_version())) {
         if (!creator_.ConsumeData(
-                QuicUtils::GetCryptoStreamId(framer_->transport_version()),
+                QuicUtils::GetCryptoStreamId(framer_.transport_version()),
                 reject.length() - offset, offset,
                 /*fin=*/false,
                 /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame)) {
@@ -185,7 +187,7 @@
       }
       if (offset < reject.length()) {
         DCHECK(!creator_.HasRoomForStreamFrame(
-            QuicUtils::GetCryptoStreamId(framer_->transport_version()), offset,
+            QuicUtils::GetCryptoStreamId(framer_.transport_version()), offset,
             frame.stream_frame.data_length));
       }
       creator_.Flush();
@@ -199,7 +201,7 @@
 
  private:
   QuicConnectionId connection_id_;
-  QuicFramer* framer_;  // Unowned.
+  QuicFramer framer_;
   // Set as the visitor of |creator_| to collect any generated packets.
   PacketCollector collector_;
   QuicPacketCreator creator_;
@@ -797,7 +799,7 @@
     framer_.set_version(version);
 
     StatelessConnectionTerminator terminator(
-        connection_id, &framer_, helper_.get(), time_wait_list_manager_.get());
+        connection_id, version, helper_.get(), time_wait_list_manager_.get());
     // This also adds the connection to time wait list.
     if (format == GOOGLE_QUIC_PACKET) {
       QUIC_RELOADABLE_FLAG_COUNT_N(quic_terminate_gquic_connection_as_ietf, 1,
@@ -1284,7 +1286,7 @@
   if (!validator.can_accept()) {
     // This CHLO is prohibited by policy.
     QUIC_CODE_COUNT(quic_reject_cant_accept_chlo);
-    StatelessConnectionTerminator terminator(connection_id, &framer_, helper(),
+    StatelessConnectionTerminator terminator(connection_id, version, helper(),
                                              time_wait_list_manager_.get());
     terminator.CloseConnection(QUIC_HANDSHAKE_FAILED, validator.error_details(),
                                form != GOOGLE_QUIC_PACKET);
@@ -1298,8 +1300,8 @@
   // If we were able to make a decision about this CHLO based purely on the
   // information available in OnChlo, just invoke the done callback immediately.
   if (rejector->state() != StatelessRejector::UNKNOWN) {
-    ProcessStatelessRejectorState(
-        std::move(rejector), version.transport_version, form, version_flag);
+    ProcessStatelessRejectorState(std::move(rejector), version, form,
+                                  version_flag);
     return;
   }
 
@@ -1352,14 +1354,13 @@
     return;
   }
 
-  ProcessStatelessRejectorState(std::move(rejector),
-                                first_version.transport_version,
+  ProcessStatelessRejectorState(std::move(rejector), first_version,
                                 current_packet_format, current_version_flag);
 }
 
 void QuicDispatcher::ProcessStatelessRejectorState(
     std::unique_ptr<StatelessRejector> rejector,
-    QuicTransportVersion first_version,
+    ParsedQuicVersion first_version,
     PacketHeaderFormat form,
     bool version_flag) {
   QuicPacketFate fate;
@@ -1368,7 +1369,7 @@
       // There was an error processing the client hello.
       QUIC_CODE_COUNT(quic_reject_error_processing_chlo);
       StatelessConnectionTerminator terminator(rejector->connection_id(),
-                                               &framer_, helper(),
+                                               first_version, helper(),
                                                time_wait_list_manager_.get());
       terminator.CloseConnection(rejector->error(), rejector->error_details(),
                                  form != GOOGLE_QUIC_PACKET);
@@ -1387,12 +1388,13 @@
       break;
 
     case StatelessRejector::REJECTED: {
-      QUIC_BUG_IF(first_version != framer_.transport_version())
-          << "SREJ: Client's version: " << QuicVersionToString(first_version)
+      QUIC_BUG_IF(first_version != framer_.version())
+          << "SREJ: Client's version: "
+          << QuicVersionToString(first_version.transport_version)
           << " is different from current dispatcher framer's version: "
           << QuicVersionToString(framer_.transport_version());
       StatelessConnectionTerminator terminator(rejector->connection_id(),
-                                               &framer_, helper(),
+                                               first_version, helper(),
                                                time_wait_list_manager_.get());
       terminator.RejectConnection(
           rejector->reply().GetSerialized().AsStringPiece(),