Home | History | Annotate | Download | only in congestion_control
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 //
      5 // The pure virtual class for send side congestion control algorithm.
      6 
      7 #ifndef NET_QUIC_CONGESTION_CONTROL_SEND_ALGORITHM_INTERFACE_H_
      8 #define NET_QUIC_CONGESTION_CONTROL_SEND_ALGORITHM_INTERFACE_H_
      9 
     10 #include <algorithm>
     11 #include <map>
     12 
     13 #include "base/basictypes.h"
     14 #include "net/base/net_export.h"
     15 #include "net/quic/quic_bandwidth.h"
     16 #include "net/quic/quic_clock.h"
     17 #include "net/quic/quic_config.h"
     18 #include "net/quic/quic_connection_stats.h"
     19 #include "net/quic/quic_protocol.h"
     20 #include "net/quic/quic_time.h"
     21 
     22 namespace net {
     23 
     24 class RttStats;
     25 
     26 class NET_EXPORT_PRIVATE SendAlgorithmInterface {
     27  public:
     28   // A sorted vector of packets.
     29   typedef std::vector<std::pair<QuicPacketSequenceNumber, TransmissionInfo>>
     30       CongestionVector;
     31 
     32   static SendAlgorithmInterface* Create(const QuicClock* clock,
     33                                         const RttStats* rtt_stats,
     34                                         CongestionControlType type,
     35                                         QuicConnectionStats* stats);
     36 
     37   virtual ~SendAlgorithmInterface() {}
     38 
     39   virtual void SetFromConfig(const QuicConfig& config, bool is_server) = 0;
     40 
     41   // Called when we receive congestion feedback from remote peer.
     42   virtual void OnIncomingQuicCongestionFeedbackFrame(
     43       const QuicCongestionFeedbackFrame& feedback,
     44       QuicTime feedback_receive_time) = 0;
     45 
     46   // Indicates an update to the congestion state, caused either by an incoming
     47   // ack or loss event timeout.  |rtt_updated| indicates whether a new
     48   // latest_rtt sample has been taken, |byte_in_flight| the bytes in flight
     49   // prior to the congestion event.  |acked_packets| and |lost_packets| are
     50   // any packets considered acked or lost as a result of the congestion event.
     51   virtual void OnCongestionEvent(bool rtt_updated,
     52                                  QuicByteCount bytes_in_flight,
     53                                  const CongestionVector& acked_packets,
     54                                  const CongestionVector& lost_packets) = 0;
     55 
     56   // Inform that we sent |bytes| to the wire, and if the packet is
     57   // retransmittable. Returns true if the packet should be tracked by the
     58   // congestion manager and included in bytes_in_flight, false otherwise.
     59   // |bytes_in_flight| is the number of bytes in flight before the packet was
     60   // sent.
     61   // Note: this function must be called for every packet sent to the wire.
     62   virtual bool OnPacketSent(QuicTime sent_time,
     63                             QuicByteCount bytes_in_flight,
     64                             QuicPacketSequenceNumber sequence_number,
     65                             QuicByteCount bytes,
     66                             HasRetransmittableData is_retransmittable) = 0;
     67 
     68   // Called when the retransmission timeout fires.  Neither OnPacketAbandoned
     69   // nor OnPacketLost will be called for these packets.
     70   virtual void OnRetransmissionTimeout(bool packets_retransmitted) = 0;
     71 
     72   // Called when the last retransmission timeout was spurious.
     73   virtual void RevertRetransmissionTimeout() = 0;
     74 
     75   // Calculate the time until we can send the next packet.
     76   virtual QuicTime::Delta TimeUntilSend(
     77       QuicTime now,
     78       QuicByteCount bytes_in_flight,
     79       HasRetransmittableData has_retransmittable_data) const = 0;
     80 
     81   // What's the current estimated bandwidth in bytes per second.
     82   // Returns 0 when it does not have an estimate.
     83   virtual QuicBandwidth BandwidthEstimate() const = 0;
     84 
     85   // Returns true if the current bandwidth estimate is reliable.
     86   virtual bool HasReliableBandwidthEstimate() const = 0;
     87 
     88   // Get the send algorithm specific retransmission delay, called RTO in TCP,
     89   // Note 1: the caller is responsible for sanity checking this value.
     90   // Note 2: this will return zero if we don't have enough data for an estimate.
     91   virtual QuicTime::Delta RetransmissionDelay() const = 0;
     92 
     93   // Returns the size of the current congestion window in bytes.  Note, this is
     94   // not the *available* window.  Some send algorithms may not use a congestion
     95   // window and will return 0.
     96   virtual QuicByteCount GetCongestionWindow() const = 0;
     97 
     98   // Whether the send algorithm is currently in slow start.  When true, the
     99   // BandwidthEstimate is expected to be too low.
    100   virtual bool InSlowStart() const = 0;
    101 
    102   // Whether the send algorithm is currently in recovery.
    103   virtual bool InRecovery() const = 0;
    104 
    105   // Returns the size of the slow start congestion window in bytes,
    106   // aka ssthresh.  Some send algorithms do not define a slow start
    107   // threshold and will return 0.
    108   virtual QuicByteCount GetSlowStartThreshold() const = 0;
    109 
    110   virtual CongestionControlType GetCongestionControlType() const = 0;
    111 };
    112 
    113 }  // namespace net
    114 
    115 #endif  // NET_QUIC_CONGESTION_CONTROL_SEND_ALGORITHM_INTERFACE_H_
    116