Make QuicDispatcher pass only one version to the ChloExtractor

gfe-relnote: pass only one version to the ChloExtractor, protected by gfe2_restart_flag_quic_dispatcher_hands_chlo_extractor_one_version
PiperOrigin-RevId: 258696182
Change-Id: I80ce835c40d357d6fad3b526b960272ce1c85c83
diff --git a/quic/core/quic_dispatcher.cc b/quic/core/quic_dispatcher.cc
index 0a83ca8..c6ee816 100644
--- a/quic/core/quic_dispatcher.cc
+++ b/quic/core/quic_dispatcher.cc
@@ -14,6 +14,7 @@
 #include "net/third_party/quiche/src/quic/core/quic_time_wait_list_manager.h"
 #include "net/third_party/quiche/src/quic/core/quic_types.h"
 #include "net/third_party/quiche/src/quic/core/quic_utils.h"
+#include "net/third_party/quiche/src/quic/core/quic_versions.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
@@ -415,15 +416,27 @@
   QuicPacketFate fate = ValidityChecks(*packet_info);
   ChloAlpnExtractor alpn_extractor;
   switch (fate) {
-    case kFateProcess:
+    case kFateProcess: {
       if (packet_info->version.handshake_protocol == PROTOCOL_TLS1_3) {
         // TODO(nharper): Support buffering non-ClientHello packets when using
         // TLS.
         ProcessChlo(/*alpn=*/"", packet_info);
         break;
       }
+      ParsedQuicVersionVector chlo_extractor_versions;
+      if (!GetQuicRestartFlag(
+              quic_dispatcher_hands_chlo_extractor_one_version)) {
+        chlo_extractor_versions = GetSupportedVersions();
+      } else {
+        QUIC_RESTART_FLAG_COUNT(
+            quic_dispatcher_hands_chlo_extractor_one_version);
+        chlo_extractor_versions = {packet_info->version};
+        // TODO(dschinazi) once we deprecate
+        // quic_dispatcher_hands_chlo_extractor_one_version, we should change
+        // ChloExtractor::Extract to only take one version.
+      }
       if (GetQuicFlag(FLAGS_quic_allow_chlo_buffering) &&
-          !ChloExtractor::Extract(packet_info->packet, GetSupportedVersions(),
+          !ChloExtractor::Extract(packet_info->packet, chlo_extractor_versions,
                                   config_->create_session_tag_indicators(),
                                   &alpn_extractor,
                                   server_connection_id.length())) {
@@ -432,7 +445,7 @@
         break;
       }
       ProcessChlo(alpn_extractor.ConsumeAlpn(), packet_info);
-      break;
+    } break;
     case kFateTimeWait:
       // Add this connection_id to the time-wait state, to safely reject
       // future packets.
diff --git a/quic/core/quic_versions.cc b/quic/core/quic_versions.cc
index 9f53c3b..950dd1d 100644
--- a/quic/core/quic_versions.cc
+++ b/quic/core/quic_versions.cc
@@ -455,6 +455,7 @@
   SetQuicReloadableFlag(quic_simplify_stop_waiting, true);
   SetQuicRestartFlag(quic_do_not_override_connection_id, true);
   SetQuicRestartFlag(quic_use_allocated_connection_ids, true);
+  SetQuicRestartFlag(quic_dispatcher_hands_chlo_extractor_one_version, true);
 }
 
 void QuicEnableVersion(ParsedQuicVersion parsed_version) {