If B2H2 option is set in QUIC BBR2, when PROBE_UP exits due to loss, it will set the inflight_hi to the max of (inflight_at_send, inflight_target, max_bytes_delivered_in_round).
Protected by FLAGS_quic_reloadable_flag_quic_bbr2_startup_loss_exit_use_max_delivered.
PiperOrigin-RevId: 339091799
Change-Id: I7255d137ca8d203a02baaa9470612adb1483880f
diff --git a/quic/core/congestion_control/bbr2_misc.h b/quic/core/congestion_control/bbr2_misc.h
index f544273..0872076 100644
--- a/quic/core/congestion_control/bbr2_misc.h
+++ b/quic/core/congestion_control/bbr2_misc.h
@@ -193,6 +193,9 @@
// Can be enabled by connection optoin 'B2HI'.
bool limit_inflight_hi_by_cwnd = false;
+ // Can be enabled by connection option 'B2H2'.
+ bool limit_inflight_hi_by_max_delivered = false;
+
// Can be enabled by connection option 'B2SL'.
bool startup_loss_exit_use_max_delivered_for_inflight_hi = false;
};
diff --git a/quic/core/congestion_control/bbr2_probe_bw.cc b/quic/core/congestion_control/bbr2_probe_bw.cc
index fa72d9f..aa7c6ef 100644
--- a/quic/core/congestion_control/bbr2_probe_bw.cc
+++ b/quic/core/congestion_control/bbr2_probe_bw.cc
@@ -216,7 +216,25 @@
// The new code actually cuts inflight_hi slower than before.
QUIC_CODE_COUNT(quic_bbr2_cut_inflight_hi_gradually_in_effect);
}
- if (Params().limit_inflight_hi_by_cwnd) {
+ if (Params().limit_inflight_hi_by_max_delivered) {
+ QuicByteCount new_inflight_hi =
+ std::max(inflight_at_send, inflight_target);
+ if (new_inflight_hi >= model_->max_bytes_delivered_in_round()) {
+ QUIC_CODE_COUNT(quic_bbr2_cut_inflight_hi_max_delivered_noop);
+ } else {
+ QUIC_CODE_COUNT(quic_bbr2_cut_inflight_hi_max_delivered_in_effect);
+ new_inflight_hi = model_->max_bytes_delivered_in_round();
+ }
+ QUIC_DVLOG(3) << sender_
+ << " Setting inflight_hi due to loss. new_inflight_hi:"
+ << new_inflight_hi
+ << ", inflight_at_send:" << inflight_at_send
+ << ", inflight_target:" << inflight_target
+ << ", max_bytes_delivered_in_round:"
+ << model_->max_bytes_delivered_in_round() << " @ "
+ << congestion_event.event_time;
+ model_->set_inflight_hi(new_inflight_hi);
+ } else if (Params().limit_inflight_hi_by_cwnd) {
const QuicByteCount cwnd_target =
sender_->GetCongestionWindow() * (1.0 - Params().beta);
if (inflight_at_send >= cwnd_target) {
diff --git a/quic/core/congestion_control/bbr2_sender.cc b/quic/core/congestion_control/bbr2_sender.cc
index 1c53323..6761202 100644
--- a/quic/core/congestion_control/bbr2_sender.cc
+++ b/quic/core/congestion_control/bbr2_sender.cc
@@ -167,6 +167,10 @@
ContainsQuicTag(connection_options, kB2SL)) {
params_.startup_loss_exit_use_max_delivered_for_inflight_hi = true;
}
+ if (GetQuicReloadableFlag(quic_bbr2_startup_loss_exit_use_max_delivered) &&
+ ContainsQuicTag(connection_options, kB2H2)) {
+ params_.limit_inflight_hi_by_max_delivered = true;
+ }
if (ContainsQuicTag(connection_options, kBSAO)) {
model_.EnableOverestimateAvoidance();
}
diff --git a/quic/core/congestion_control/bbr2_simulator_test.cc b/quic/core/congestion_control/bbr2_simulator_test.cc
index 3485c11..c769bff 100644
--- a/quic/core/congestion_control/bbr2_simulator_test.cc
+++ b/quic/core/congestion_control/bbr2_simulator_test.cc
@@ -445,6 +445,20 @@
EXPECT_FALSE(sender_->ExportDebugState().last_sample_is_app_limited);
}
+TEST_F(Bbr2DefaultTopologyTest, SimpleTransferSmallBufferB2H2) {
+ SetConnectionOption(kB2H2);
+ DefaultTopologyParams params;
+ params.switch_queue_capacity_in_bdp = 0.5;
+ CreateNetwork(params);
+
+ DoSimpleTransfer(12 * 1024 * 1024, QuicTime::Delta::FromSeconds(30));
+ EXPECT_TRUE(Bbr2ModeIsOneOf({Bbr2Mode::PROBE_BW, Bbr2Mode::PROBE_RTT}));
+ EXPECT_APPROX_EQ(params.BottleneckBandwidth(),
+ sender_->ExportDebugState().bandwidth_hi, 0.02f);
+ EXPECT_GE(sender_connection_stats().packets_lost, 0u);
+ EXPECT_FALSE(sender_->ExportDebugState().last_sample_is_app_limited);
+}
+
TEST_F(Bbr2DefaultTopologyTest, SimpleTransfer2RTTAggregationBytes) {
SetConnectionOption(kBSAO);
DefaultTopologyParams params;
diff --git a/quic/core/crypto/crypto_protocol.h b/quic/core/crypto/crypto_protocol.h
index 248d37c..cd1bc3a 100644
--- a/quic/core/crypto/crypto_protocol.h
+++ b/quic/core/crypto/crypto_protocol.h
@@ -135,6 +135,10 @@
// loss, set inflight_hi to the
// max of bdp and max bytes
// delivered in round.
+const QuicTag kB2H2 = TAG('B', '2', 'H', '2'); // When exiting PROBE_UP due to
+ // loss, set inflight_hi to the
+ // max of inflight@send and max
+ // bytes delivered in round.
const QuicTag kBSAO = TAG('B', 'S', 'A', 'O'); // Avoid Overestimation in
// Bandwidth Sampler with ack
// aggregation