Initial export of QUIC BBRv2.
PiperOrigin-RevId: 259531121
Change-Id: Idbca8ab50bac5e098bda4ec0a752b1d68a4a3cd2
diff --git a/quic/core/congestion_control/bbr2_probe_rtt.cc b/quic/core/congestion_control/bbr2_probe_rtt.cc
new file mode 100644
index 0000000..fe4506b
--- /dev/null
+++ b/quic/core/congestion_control/bbr2_probe_rtt.cc
@@ -0,0 +1,66 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/third_party/quiche/src/quic/core/congestion_control/bbr2_probe_rtt.h"
+
+#include "net/third_party/quiche/src/quic/core/congestion_control/bbr2_sender.h"
+#include "net/third_party/quiche/src/quic/core/quic_time.h"
+
+namespace quic {
+
+void Bbr2ProbeRttMode::Enter(const Bbr2CongestionEvent& /*congestion_event*/) {
+ model_->set_pacing_gain(1.0);
+ model_->set_cwnd_gain(1.0);
+ exit_time_ = QuicTime::Zero();
+}
+
+Bbr2Mode Bbr2ProbeRttMode::OnCongestionEvent(
+ QuicByteCount /*prior_in_flight*/,
+ QuicTime /*event_time*/,
+ const AckedPacketVector& /*acked_packets*/,
+ const LostPacketVector& /*lost_packets*/,
+ const Bbr2CongestionEvent& congestion_event) {
+ if (exit_time_ == QuicTime::Zero()) {
+ if (congestion_event.bytes_in_flight <= InflightTarget() ||
+ congestion_event.bytes_in_flight <=
+ sender_->GetMinimumCongestionWindow()) {
+ exit_time_ = congestion_event.event_time + Params().probe_rtt_duration;
+ }
+ return Bbr2Mode::PROBE_RTT;
+ }
+
+ return congestion_event.event_time > exit_time_ ? Bbr2Mode::PROBE_BW
+ : Bbr2Mode::PROBE_RTT;
+}
+
+QuicByteCount Bbr2ProbeRttMode::InflightTarget() const {
+ return model_->BDP(model_->MaxBandwidth(),
+ Params().probe_rtt_inflight_target_bdp_fraction);
+}
+
+Limits<QuicByteCount> Bbr2ProbeRttMode::GetCwndLimits() const {
+ QuicByteCount inflight_upper_bound =
+ std::min(model_->inflight_lo(), model_->inflight_hi_with_headroom());
+ return NoGreaterThan(std::min(inflight_upper_bound, InflightTarget()));
+}
+
+Bbr2ProbeRttMode::DebugState Bbr2ProbeRttMode::ExportDebugState() const {
+ DebugState s;
+ s.inflight_target = InflightTarget();
+ s.exit_time = exit_time_;
+ return s;
+}
+
+std::ostream& operator<<(std::ostream& os,
+ const Bbr2ProbeRttMode::DebugState& state) {
+ os << "[PROBE_RTT] inflight_target: " << state.inflight_target << "\n";
+ os << "[PROBE_RTT] exit_time: " << state.exit_time << "\n";
+ return os;
+}
+
+const Bbr2Params& Bbr2ProbeRttMode::Params() const {
+ return sender_->Params();
+}
+
+} // namespace quic