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