| // 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" | |
| #include "net/third_party/quiche/src/quic/platform/api/quic_logging.h" | |
| namespace quic { | |
| void Bbr2ProbeRttMode::Enter(QuicTime /*now*/, | |
| 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; | |
| QUIC_DVLOG(2) << sender_ << " PROBE_RTT exit time set to " << exit_time_ | |
| << ". bytes_inflight:" << congestion_event.bytes_in_flight | |
| << ", inflight_target:" << InflightTarget() | |
| << ", min_congestion_window:" | |
| << sender_->GetMinimumCongestionWindow() << " @ " | |
| << congestion_event.event_time; | |
| } | |
| 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())); | |
| } | |
| Bbr2Mode Bbr2ProbeRttMode::OnExitQuiescence( | |
| QuicTime now, | |
| QuicTime /*quiescence_start_time*/) { | |
| if (now > exit_time_) { | |
| return Bbr2Mode::PROBE_BW; | |
| } | |
| return Bbr2Mode::PROBE_RTT; | |
| } | |
| 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 |