gfe-relnote: Combine quic_no_stream_data_after_reset and quic_no_decrease_in_final_offset into a single flag gfe2_reloadable_flag_quic_close_connection_and_discard_data_on_wrong_offset to impose flag dependency.

PiperOrigin-RevId: 280710051
Change-Id: I2ab0c396d4cb44c144204908f15952b61fbc9761
diff --git a/quic/core/quic_stream_sequencer.cc b/quic/core/quic_stream_sequencer.cc
index 57651ef..d797668 100644
--- a/quic/core/quic_stream_sequencer.cc
+++ b/quic/core/quic_stream_sequencer.cc
@@ -35,7 +35,9 @@
       ignore_read_data_(false),
       level_triggered_(false),
       stop_reading_when_level_triggered_(
-          GetQuicReloadableFlag(quic_stop_reading_when_level_triggered)) {
+          GetQuicReloadableFlag(quic_stop_reading_when_level_triggered)),
+      close_connection_and_discard_data_on_wrong_offset_(GetQuicReloadableFlag(
+          quic_close_connection_and_discard_data_on_wrong_offset)) {
   if (stop_reading_when_level_triggered_) {
     QUIC_RELOADABLE_FLAG_COUNT(quic_stop_reading_when_level_triggered);
   }
@@ -54,8 +56,9 @@
     if (data_len == 0) {
       return;
     }
-    if (GetQuicReloadableFlag(quic_no_stream_data_after_reset)) {
-      QUIC_RELOADABLE_FLAG_COUNT(quic_no_stream_data_after_reset);
+    if (close_connection_and_discard_data_on_wrong_offset_) {
+      QUIC_RELOADABLE_FLAG_COUNT_N(
+          quic_close_connection_and_discard_data_on_wrong_offset, 1, 3);
       if (!should_process_data) {
         return;
       }
@@ -130,11 +133,12 @@
 
   // If there is a scheduled close, the new offset should match it.
   if (close_offset_ != kMaxOffset && offset != close_offset_) {
-    if (!GetQuicReloadableFlag(quic_no_decrease_in_final_offset)) {
+    if (!close_connection_and_discard_data_on_wrong_offset_) {
       stream_->Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS);
       return false;
     }
-    QUIC_RELOADABLE_FLAG_COUNT_N(quic_no_decrease_in_final_offset, 1, 2);
+    QUIC_RELOADABLE_FLAG_COUNT_N(
+        quic_close_connection_and_discard_data_on_wrong_offset, 2, 3);
     stream_->CloseConnectionWithDetails(
         QUIC_STREAM_SEQUENCER_INVALID_STATE,
         QuicStrCat("Stream ", stream_->id(),
@@ -145,16 +149,16 @@
 
   // The final offset should be no less than the highest offset that is
   // received.
-  if (GetQuicReloadableFlag(quic_no_decrease_in_final_offset)) {
-    QUIC_RELOADABLE_FLAG_COUNT_N(quic_no_decrease_in_final_offset, 2, 2);
-    if (offset < highest_offset_) {
-      stream_->CloseConnectionWithDetails(
-          QUIC_STREAM_SEQUENCER_INVALID_STATE,
-          QuicStrCat(
-              "Stream ", stream_->id(), " received fin with offset: ", offset,
-              ", which reduces current highest offset: ", highest_offset_));
-      return false;
-    }
+  if (close_connection_and_discard_data_on_wrong_offset_ &&
+      offset < highest_offset_) {
+    QUIC_RELOADABLE_FLAG_COUNT_N(
+        quic_close_connection_and_discard_data_on_wrong_offset, 3, 3);
+    stream_->CloseConnectionWithDetails(
+        QUIC_STREAM_SEQUENCER_INVALID_STATE,
+        QuicStrCat(
+            "Stream ", stream_->id(), " received fin with offset: ", offset,
+            ", which reduces current highest offset: ", highest_offset_));
+    return false;
   }
 
   close_offset_ = offset;
diff --git a/quic/core/quic_stream_sequencer.h b/quic/core/quic_stream_sequencer.h
index 54e0e28..878acb0 100644
--- a/quic/core/quic_stream_sequencer.h
+++ b/quic/core/quic_stream_sequencer.h
@@ -211,6 +211,11 @@
   // the sequencer will discard incoming data (but not FIN bits) after
   // StopReading is called, even in level_triggered_ mode.
   const bool stop_reading_when_level_triggered_;
+
+  // Latched value of quic_close_connection_and_discard_data_on_wrong_offset.
+  // When true, the sequencer will inform the stream to close connection when
+  // wrong offset is received. And the stream frame's data will be discarded.
+  const bool close_connection_and_discard_data_on_wrong_offset_;
 };
 
 }  // namespace quic
diff --git a/quic/core/quic_stream_sequencer_test.cc b/quic/core/quic_stream_sequencer_test.cc
index 15484d8..cb6fb93 100644
--- a/quic/core/quic_stream_sequencer_test.cc
+++ b/quic/core/quic_stream_sequencer_test.cc
@@ -375,7 +375,8 @@
   OnFinFrame(3, "");
   EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
 
-  if (!GetQuicReloadableFlag(quic_no_decrease_in_final_offset)) {
+  if (!GetQuicReloadableFlag(
+          quic_close_connection_and_discard_data_on_wrong_offset)) {
     EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS));
   } else {
     EXPECT_CALL(stream_, CloseConnectionWithDetails(
@@ -760,15 +761,14 @@
 
 // Regression test for https://crbug.com/992486.
 TEST_F(QuicStreamSequencerTest, CorruptFinFrames) {
-  SetQuicReloadableFlag(quic_no_stream_data_after_reset, true);
-  if (!GetQuicReloadableFlag(quic_no_decrease_in_final_offset)) {
-    EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS));
-  } else {
-    EXPECT_CALL(stream_, CloseConnectionWithDetails(
-                             QUIC_STREAM_SEQUENCER_INVALID_STATE,
-                             "Stream 1 received new final offset: 1, which is "
-                             "different from close offset: 2"));
+  if (!GetQuicReloadableFlag(
+          quic_close_connection_and_discard_data_on_wrong_offset)) {
+    return;
   }
+  EXPECT_CALL(stream_, CloseConnectionWithDetails(
+                           QUIC_STREAM_SEQUENCER_INVALID_STATE,
+                           "Stream 1 received new final offset: 1, which is "
+                           "different from close offset: 2"));
 
   OnFinFrame(2u, "");
   OnFinFrame(0u, "a");
@@ -777,7 +777,10 @@
 
 // Regression test for crbug.com/1015693
 TEST_F(QuicStreamSequencerTest, ReceiveFinLessThanHighestOffset) {
-  SetQuicReloadableFlag(quic_no_decrease_in_final_offset, true);
+  if (!GetQuicReloadableFlag(
+          quic_close_connection_and_discard_data_on_wrong_offset)) {
+    return;
+  }
   EXPECT_CALL(stream_, OnDataAvailable()).Times(1);
   EXPECT_CALL(stream_, CloseConnectionWithDetails(
                            QUIC_STREAM_SEQUENCER_INVALID_STATE,