summaryrefslogtreecommitdiff
path: root/chromium/net/quic/congestion_control/tcp_cubic_sender.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/quic/congestion_control/tcp_cubic_sender.h')
-rw-r--r--chromium/net/quic/congestion_control/tcp_cubic_sender.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/chromium/net/quic/congestion_control/tcp_cubic_sender.h b/chromium/net/quic/congestion_control/tcp_cubic_sender.h
new file mode 100644
index 00000000000..c22813a2cfd
--- /dev/null
+++ b/chromium/net/quic/congestion_control/tcp_cubic_sender.h
@@ -0,0 +1,118 @@
+// Copyright (c) 2012 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 behaviour of
+// TCP cubic.
+
+#ifndef NET_QUIC_CONGESTION_CONTROL_TCP_CUBIC_SENDER_H_
+#define NET_QUIC_CONGESTION_CONTROL_TCP_CUBIC_SENDER_H_
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "net/base/net_export.h"
+#include "net/quic/congestion_control/cubic.h"
+#include "net/quic/congestion_control/hybrid_slow_start.h"
+#include "net/quic/congestion_control/send_algorithm_interface.h"
+#include "net/quic/quic_bandwidth.h"
+#include "net/quic/quic_protocol.h"
+#include "net/quic/quic_time.h"
+
+namespace net {
+
+namespace test {
+class TcpCubicSenderPeer;
+} // namespace test
+
+class NET_EXPORT_PRIVATE TcpCubicSender : public SendAlgorithmInterface {
+ public:
+ // Reno option and max_tcp_congestion_window are provided for testing.
+ TcpCubicSender(const QuicClock* clock,
+ bool reno,
+ QuicTcpCongestionWindow max_tcp_congestion_window);
+ virtual ~TcpCubicSender();
+
+ // Start implementation of SendAlgorithmInterface.
+ virtual void OnIncomingQuicCongestionFeedbackFrame(
+ const QuicCongestionFeedbackFrame& feedback,
+ QuicTime feedback_receive_time,
+ const SentPacketsMap& sent_packets) OVERRIDE;
+ virtual void OnIncomingAck(QuicPacketSequenceNumber acked_sequence_number,
+ QuicByteCount acked_bytes,
+ QuicTime::Delta rtt) OVERRIDE;
+ virtual void OnIncomingLoss(QuicTime ack_receive_time) OVERRIDE;
+ virtual void SentPacket(QuicTime sent_time,
+ QuicPacketSequenceNumber sequence_number,
+ QuicByteCount bytes,
+ Retransmission is_retransmission) OVERRIDE;
+ virtual void AbandoningPacket(QuicPacketSequenceNumber sequence_number,
+ QuicByteCount abandoned_bytes) OVERRIDE;
+ virtual QuicTime::Delta TimeUntilSend(
+ QuicTime now,
+ Retransmission is_retransmission,
+ HasRetransmittableData has_retransmittable_data,
+ IsHandshake handshake) OVERRIDE;
+ virtual QuicBandwidth BandwidthEstimate() OVERRIDE;
+ virtual QuicTime::Delta SmoothedRtt() OVERRIDE;
+ virtual QuicTime::Delta RetransmissionDelay() OVERRIDE;
+ // End implementation of SendAlgorithmInterface.
+
+ private:
+ friend class test::TcpCubicSenderPeer;
+
+ QuicByteCount AvailableCongestionWindow();
+ QuicByteCount CongestionWindow();
+ void Reset();
+ void AckAccounting(QuicTime::Delta rtt);
+ void CongestionAvoidance(QuicPacketSequenceNumber ack);
+ bool IsCwndLimited() const;
+ void OnTimeOut();
+
+ HybridSlowStart hybrid_slow_start_;
+ Cubic cubic_;
+
+ // Reno provided for testing.
+ const bool reno_;
+
+ // ACK counter for the Reno implementation.
+ int64 congestion_window_count_;
+
+ // Receiver side advertised window.
+ QuicByteCount receiver_congestion_window_;
+
+ // Receiver side advertised packet loss.
+ int last_received_accumulated_number_of_lost_packets_;
+
+ // Bytes in flight, aka bytes on the wire.
+ QuicByteCount bytes_in_flight_;
+
+ // We need to keep track of the end sequence number of each RTT "burst".
+ bool update_end_sequence_number_;
+ QuicPacketSequenceNumber end_sequence_number_;
+
+ // Congestion window in packets.
+ QuicTcpCongestionWindow congestion_window_;
+
+ // Slow start congestion window in packets.
+ QuicTcpCongestionWindow slowstart_threshold_;
+
+ // Maximum number of outstanding packets for tcp.
+ QuicTcpCongestionWindow max_tcp_congestion_window_;
+
+ // Min RTT during this session.
+ QuicTime::Delta delay_min_;
+
+ // Smoothed RTT during this session.
+ QuicTime::Delta smoothed_rtt_;
+
+ // Mean RTT deviation during this session.
+ // Approximation of standard deviation, the error is roughly 1.25 times
+ // larger than the standard deviation, for a normally distributed signal.
+ QuicTime::Delta mean_deviation_;
+
+ DISALLOW_COPY_AND_ASSIGN(TcpCubicSender);
+};
+
+} // namespace net
+
+#endif // NET_QUIC_CONGESTION_CONTROL_TCP_CUBIC_SENDER_H_