gfe-relnote: In QUIC, add a multiplier (default to 2) to consider overshooting happens if bytes_lost_with_network_parameters_adjusted_ * bytes_lost_multiplier_with_network_parameters_adjusted_ > IW. Protected by existing gfe2_reloadable_flag_quic_bbr_mitigate_overly_large_bandwidth_sample.

Also add two connection options to set this multiplier to 3 and 4.

PiperOrigin-RevId: 289551442
Change-Id: If22f2f0754362396afa9771b5099790f1655b789
diff --git a/quic/core/congestion_control/bbr_sender.cc b/quic/core/congestion_control/bbr_sender.cc
index a279bc7..3bef1dd 100644
--- a/quic/core/congestion_control/bbr_sender.cc
+++ b/quic/core/congestion_control/bbr_sender.cc
@@ -137,7 +137,8 @@
       app_limited_since_last_probe_rtt_(false),
       min_rtt_since_last_probe_rtt_(QuicTime::Delta::Infinite()),
       network_parameters_adjusted_(false),
-      bytes_lost_with_network_parameters_adjusted_(0) {
+      bytes_lost_with_network_parameters_adjusted_(0),
+      bytes_lost_multiplier_with_network_parameters_adjusted_(2) {
   if (stats_) {
     // Clear some startup stats if |stats_| has been used by another sender,
     // which happens e.g. when QuicConnection switch send algorithms.
@@ -284,6 +285,14 @@
     // Hits 1.25x pacing multiplier when ~1/3 CWND is lost.
     startup_rate_reduction_multiplier_ = 2;
   }
+  if (GetQuicReloadableFlag(quic_bbr_mitigate_overly_large_bandwidth_sample)) {
+    if (config.HasClientRequestedIndependentOption(kBWM3, perspective)) {
+      bytes_lost_multiplier_with_network_parameters_adjusted_ = 3;
+    }
+    if (config.HasClientRequestedIndependentOption(kBWM4, perspective)) {
+      bytes_lost_multiplier_with_network_parameters_adjusted_ = 4;
+    }
+  }
   if (config.HasClientRequestedIndependentOption(kBBR4, perspective)) {
     sampler_.SetMaxAckHeightTrackerWindowLength(2 * kBandwidthWindowSize);
   }
@@ -846,7 +855,8 @@
       QUIC_RELOADABLE_FLAG_COUNT_N(
           quic_bbr_mitigate_overly_large_bandwidth_sample, 2, 4);
       if (has_non_app_limited_sample_ ||
-          bytes_lost_with_network_parameters_adjusted_ * 2 >
+          bytes_lost_with_network_parameters_adjusted_ *
+                  bytes_lost_multiplier_with_network_parameters_adjusted_ >
               initial_congestion_window_) {
         // We are fairly sure overshoot happens if 1) there is at least one
         // non app-limited bw sample or 2) half of IW gets lost. Slow pacing
diff --git a/quic/core/congestion_control/bbr_sender.h b/quic/core/congestion_control/bbr_sender.h
index db0f330..3db423d 100644
--- a/quic/core/congestion_control/bbr_sender.h
+++ b/quic/core/congestion_control/bbr_sender.h
@@ -398,6 +398,10 @@
   bool network_parameters_adjusted_;
   // Bytes lost after network parameters gets adjusted.
   QuicByteCount bytes_lost_with_network_parameters_adjusted_;
+  // Decrease pacing rate after parameters adjusted if
+  // bytes_lost_with_network_parameters_adjusted_ *
+  // bytes_lost_multiplier_with_network_parameters_adjusted_ > IW.
+  uint8_t bytes_lost_multiplier_with_network_parameters_adjusted_;
 };
 
 QUIC_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
diff --git a/quic/core/crypto/crypto_protocol.h b/quic/core/crypto/crypto_protocol.h
index 1a6e5f2..a1d7d76 100644
--- a/quic/core/crypto/crypto_protocol.h
+++ b/quic/core/crypto/crypto_protocol.h
@@ -241,6 +241,12 @@
 const QuicTag kBWS7 = TAG('B', 'W', 'S', '7');  // QUIC Initial CWND - Enabled
                                                 // with 0.75 * default
                                                 // multiplier.
+const QuicTag kBWM3 = TAG('B', 'W', 'M', '3');  // Consider overshooting if
+                                                // bytes lost after bandwidth
+                                                // resumption * 3 > IW.
+const QuicTag kBWM4 = TAG('B', 'W', 'M', '4');  // Consider overshooting if
+                                                // bytes lost after bandwidth
+                                                // resumption * 4 > IW.
 
 // Enable path MTU discovery experiment.
 const QuicTag kMTUH = TAG('M', 'T', 'U', 'H');  // High-target MTU discovery.