blob: c1cffe420a704a27d6a6c617e7c7eb0af5801a0d [file] [log] [blame]
// Copyright (c) 2015 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.
// TCP cubic send side congestion algorithm, emulates the behavior of TCP cubic.
#ifndef NET_QUIC_CONGESTION_CONTROL_TCP_CUBIC_SENDER_BYTES_H_
#define NET_QUIC_CONGESTION_CONTROL_TCP_CUBIC_SENDER_BYTES_H_
#include <stdint.h>
#include "base/macros.h"
#include "net/base/net_export.h"
#include "net/quic/congestion_control/cubic_bytes.h"
#include "net/quic/congestion_control/hybrid_slow_start.h"
#include "net/quic/congestion_control/prr_sender.h"
#include "net/quic/congestion_control/tcp_cubic_sender_base.h"
#include "net/quic/quic_bandwidth.h"
#include "net/quic/quic_connection_stats.h"
#include "net/quic/quic_protocol.h"
#include "net/quic/quic_time.h"
namespace net {
class RttStats;
namespace test {
class TcpCubicSenderBytesPeer;
} // namespace test
class NET_EXPORT_PRIVATE TcpCubicSenderBytes : public TcpCubicSenderBase {
public:
TcpCubicSenderBytes(const QuicClock* clock,
const RttStats* rtt_stats,
bool reno,
QuicPacketCount initial_tcp_congestion_window,
QuicPacketCount max_congestion_window,
QuicConnectionStats* stats);
~TcpCubicSenderBytes() override;
// Start implementation of SendAlgorithmInterface.
void SetNumEmulatedConnections(int num_connections) override;
void SetMaxCongestionWindow(QuicByteCount max_congestion_window) override;
void OnConnectionMigration() override;
QuicByteCount GetCongestionWindow() const override;
QuicByteCount GetSlowStartThreshold() const override;
CongestionControlType GetCongestionControlType() const override;
// End implementation of SendAlgorithmInterface.
protected:
// TcpCubicSenderBase methods
void SetCongestionWindowFromBandwidthAndRtt(QuicBandwidth bandwidth,
QuicTime::Delta rtt) override;
void SetCongestionWindowInPackets(QuicPacketCount congestion_window) override;
void SetMinCongestionWindowInPackets(
QuicPacketCount congestion_window) override;
void ExitSlowstart() override;
void OnPacketLost(QuicPacketNumber largest_loss,
QuicByteCount bytes_in_flight) override;
void MaybeIncreaseCwnd(QuicPacketNumber acked_packet_number,
QuicByteCount acked_bytes,
QuicByteCount bytes_in_flight) override;
void HandleRetransmissionTimeout() override;
private:
friend class test::TcpCubicSenderBytesPeer;
CubicBytes cubic_;
// ACK counter for the Reno implementation.
uint64_t num_acked_packets_;
// Congestion window in bytes.
QuicByteCount congestion_window_;
// Minimum congestion window in bytes.
QuicByteCount min_congestion_window_;
// Maximum congestion window in bytes.
QuicByteCount max_congestion_window_;
// Slow start congestion window in bytes, aka ssthresh.
QuicByteCount slowstart_threshold_;
// Initial TCP congestion window in bytes. This variable can only be set when
// this algorithm is created.
const QuicByteCount initial_tcp_congestion_window_;
// Initial maximum TCP congestion window in bytes. This variable can only be
// set when this algorithm is created.
const QuicByteCount initial_max_tcp_congestion_window_;
DISALLOW_COPY_AND_ASSIGN(TcpCubicSenderBytes);
};
} // namespace net
#endif // NET_QUIC_CONGESTION_CONTROL_TCP_CUBIC_BYTES_SENDER_H_