gfe-relnote: In QUIC, add a connection option to set max cwnd to 100 when adjusting network parameters. Protected by existing gfe2_reloadable_flag_quic_use_ip_bandwidth_module.
PiperOrigin-RevId: 294291230
Change-Id: Iff1fe789bb6938a0068853114c01ee9bae8993d1
diff --git a/quic/core/congestion_control/bbr_sender.cc b/quic/core/congestion_control/bbr_sender.cc
index 5a6de91..3fd6139 100644
--- a/quic/core/congestion_control/bbr_sender.cc
+++ b/quic/core/congestion_control/bbr_sender.cc
@@ -130,6 +130,8 @@
network_parameters_adjusted_(false),
bytes_lost_with_network_parameters_adjusted_(0),
bytes_lost_multiplier_with_network_parameters_adjusted_(2),
+ max_congestion_window_with_network_parameters_adjusted_(
+ kMaxInitialCongestionWindow * kDefaultTCPMSS),
loss_based_startup_exit_(
GetQuicReloadableFlag(quic_bbr_loss_based_startup_exit) &&
sampler_.one_bw_sample_per_ack_event()) {
@@ -320,6 +322,10 @@
if (config.HasClientRequestedIndependentOption(kMIN1, perspective)) {
min_congestion_window_ = kMaxSegmentSize;
}
+ if (config.HasClientRequestedIndependentOption(kICW1, perspective)) {
+ max_congestion_window_with_network_parameters_adjusted_ =
+ 100 * kDefaultTCPMSS;
+ }
}
void BbrSender::AdjustNetworkParameters(const NetworkParams& params) {
@@ -342,7 +348,7 @@
}
const QuicByteCount new_cwnd = std::max(
kMinInitialCongestionWindow * kDefaultTCPMSS,
- std::min(kMaxInitialCongestionWindow * kDefaultTCPMSS,
+ std::min(max_congestion_window_with_network_parameters_adjusted_,
bandwidth * (params.quic_bbr_donot_inject_bandwidth
? GetMinRtt()
: rtt_stats_->SmoothedOrInitialRtt())));
diff --git a/quic/core/congestion_control/bbr_sender.h b/quic/core/congestion_control/bbr_sender.h
index 4e348f3..87d3272 100644
--- a/quic/core/congestion_control/bbr_sender.h
+++ b/quic/core/congestion_control/bbr_sender.h
@@ -402,6 +402,9 @@
// bytes_lost_multiplier_with_network_parameters_adjusted_ > IW.
uint8_t bytes_lost_multiplier_with_network_parameters_adjusted_;
+ // Max congestion window when adjusting network parameters.
+ QuicByteCount max_congestion_window_with_network_parameters_adjusted_;
+
// Latched value of --quic_bbr_loss_based_startup_exit &&
// sampler_.one_bw_sample_per_ack_event().
const bool loss_based_startup_exit_;
diff --git a/quic/core/congestion_control/bbr_sender_test.cc b/quic/core/congestion_control/bbr_sender_test.cc
index fac4a34..096b7fa 100644
--- a/quic/core/congestion_control/bbr_sender_test.cc
+++ b/quic/core/congestion_control/bbr_sender_test.cc
@@ -1445,5 +1445,48 @@
}
}
+TEST_F(BbrSenderTest, 200InitialCongestionWindowWithNetworkParameterAdjusted) {
+ CreateDefaultSetup();
+
+ bbr_sender_.AddBytesToTransfer(1 * 1024 * 1024);
+ // Wait until an ACK comes back.
+ const QuicTime::Delta timeout = QuicTime::Delta::FromSeconds(5);
+ bool simulator_result = simulator_.RunUntilOrTimeout(
+ [this]() { return !sender_->ExportDebugState().min_rtt.IsZero(); },
+ timeout);
+ ASSERT_TRUE(simulator_result);
+
+ // Bootstrap cwnd by a overly large bandwidth sample.
+ bbr_sender_.connection()->AdjustNetworkParameters(
+ SendAlgorithmInterface::NetworkParams(1024 * kTestLinkBandwidth,
+ QuicTime::Delta::Zero(), false));
+ // Verify cwnd is capped at 200.
+ EXPECT_EQ(200 * kDefaultTCPMSS,
+ sender_->ExportDebugState().congestion_window);
+ EXPECT_GT(1024 * kTestLinkBandwidth, sender_->PacingRate(0));
+}
+
+TEST_F(BbrSenderTest, 100InitialCongestionWindowWithNetworkParameterAdjusted) {
+ SetConnectionOption(kICW1);
+ CreateDefaultSetup();
+
+ bbr_sender_.AddBytesToTransfer(1 * 1024 * 1024);
+ // Wait until an ACK comes back.
+ const QuicTime::Delta timeout = QuicTime::Delta::FromSeconds(5);
+ bool simulator_result = simulator_.RunUntilOrTimeout(
+ [this]() { return !sender_->ExportDebugState().min_rtt.IsZero(); },
+ timeout);
+ ASSERT_TRUE(simulator_result);
+
+ // Bootstrap cwnd by a overly large bandwidth sample.
+ bbr_sender_.connection()->AdjustNetworkParameters(
+ SendAlgorithmInterface::NetworkParams(1024 * kTestLinkBandwidth,
+ QuicTime::Delta::Zero(), false));
+ // Verify cwnd is capped at 100.
+ EXPECT_EQ(100 * kDefaultTCPMSS,
+ sender_->ExportDebugState().congestion_window);
+ EXPECT_GT(1024 * kTestLinkBandwidth, sender_->PacingRate(0));
+}
+
} // namespace test
} // namespace quic
diff --git a/quic/core/crypto/crypto_protocol.h b/quic/core/crypto/crypto_protocol.h
index 766fa0b..54a91e2 100644
--- a/quic/core/crypto/crypto_protocol.h
+++ b/quic/core/crypto/crypto_protocol.h
@@ -245,6 +245,8 @@
const QuicTag kBWM4 = TAG('B', 'W', 'M', '4'); // Consider overshooting if
// bytes lost after bandwidth
// resumption * 4 > IW.
+const QuicTag kICW1 = TAG('I', 'C', 'W', '1'); // Max initial congestion window
+ // 100.
// Enable path MTU discovery experiment.
const QuicTag kMTUH = TAG('M', 'T', 'U', 'H'); // High-target MTU discovery.