blob: c4e617414fe5f804eb5a81793973dda57032717f [file] [log] [blame]
// Copyright (c) 2024 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.
// A modification of Cubic to match Prague congestion control, as described in
// draft-briscoe-iccrg-prague-congestion-control-04.
#ifndef QUICHE_QUIC_CORE_CONGESTION_CONTROL_PRAGUE_SENDER_H_
#define QUICHE_QUIC_CORE_CONGESTION_CONTROL_PRAGUE_SENDER_H_
#include <optional>
#include "quiche/quic/core/congestion_control/rtt_stats.h"
#include "quiche/quic/core/congestion_control/send_algorithm_interface.h"
#include "quiche/quic/core/congestion_control/tcp_cubic_sender_bytes.h"
#include "quiche/quic/core/quic_connection_stats.h"
#include "quiche/quic/core/quic_time.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/common/platform/api/quiche_export.h"
namespace quic {
class RttStats;
inline constexpr float kPragueEwmaGain = 1 / 16.0;
inline constexpr QuicTime::Delta kPragueRttVirtMin =
QuicTime::Delta::FromMilliseconds(25);
inline constexpr int kRoundsBeforeReducedRttDependence = 500;
namespace test {
class PragueSenderPeer;
} // namespace test
class QUICHE_EXPORT PragueSender : public TcpCubicSenderBytes {
public:
PragueSender(const QuicClock* clock, const RttStats* rtt_stats,
QuicPacketCount initial_tcp_congestion_window,
QuicPacketCount max_congestion_window,
QuicConnectionStats* stats);
PragueSender(const PragueSender&) = delete;
PragueSender& operator=(const PragueSender&) = delete;
~PragueSender() override {}
// Start implementation of SendAlgorithmInterface overrides.
void OnCongestionEvent(bool rtt_updated, QuicByteCount prior_in_flight,
QuicTime event_time,
const AckedPacketVector& acked_packets,
const LostPacketVector& lost_packets,
QuicPacketCount num_ect,
QuicPacketCount num_ce) override;
CongestionControlType GetCongestionControlType() const override;
bool EnableECT1() override;
// End implementation of SendAlgorithmInterface overrides.
private:
friend class test::PragueSenderPeer;
bool ect1_enabled_ = false;
// Tracks the life of the connection to begin reducing RTT dependence of
// congestion avoidance after 500 RTTs.
QuicTime connection_start_time_;
bool reduce_rtt_dependence_ = false;
// Alpha-related variables
std::optional<float> prague_alpha_;
QuicPacketCount ect_count_ = 0;
QuicPacketCount ce_count_ = 0;
// Virtual RTT related variables
QuicTime::Delta rtt_virt_ = kPragueRttVirtMin;
QuicTime last_alpha_update_;
// Accounting for recent CE-based cwnd reductions that are "credit" for future
// loss responses.
std::optional<QuicTime> last_congestion_response_time_;
QuicByteCount last_congestion_response_size_;
};
} // namespace quic
#endif // QUICHE_QUIC_CORE_CONGESTION_CONTROL_PRAGUE_SENDER_H_