Home | History | Annotate | Download | only in congestion_control
      1 // Copyright (c) 2013 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 #ifndef NET_QUIC_CONGESTION_CONTROL_INTER_ARRIVAL_SENDER_H_
      6 #define NET_QUIC_CONGESTION_CONTROL_INTER_ARRIVAL_SENDER_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "net/base/net_export.h"
     11 #include "net/quic/congestion_control/channel_estimator.h"
     12 #include "net/quic/congestion_control/inter_arrival_bitrate_ramp_up.h"
     13 #include "net/quic/congestion_control/inter_arrival_overuse_detector.h"
     14 #include "net/quic/congestion_control/inter_arrival_probe.h"
     15 #include "net/quic/congestion_control/inter_arrival_state_machine.h"
     16 #include "net/quic/congestion_control/paced_sender.h"
     17 #include "net/quic/congestion_control/send_algorithm_interface.h"
     18 #include "net/quic/quic_bandwidth.h"
     19 #include "net/quic/quic_clock.h"
     20 #include "net/quic/quic_protocol.h"
     21 #include "net/quic/quic_time.h"
     22 
     23 namespace net {
     24 
     25 class NET_EXPORT_PRIVATE InterArrivalSender : public SendAlgorithmInterface {
     26  public:
     27   explicit InterArrivalSender(const QuicClock* clock);
     28   virtual ~InterArrivalSender();
     29 
     30   static QuicBandwidth CalculateSentBandwidth(
     31       const SendAlgorithmInterface::SentPacketsMap& sent_packets_map,
     32       QuicTime feedback_receive_time);
     33 
     34   // Start implementation of SendAlgorithmInterface.
     35   virtual void SetFromConfig(const QuicConfig& config, bool is_server) OVERRIDE;
     36   virtual void SetMaxPacketSize(QuicByteCount max_packet_size) OVERRIDE;
     37   virtual void OnIncomingQuicCongestionFeedbackFrame(
     38       const QuicCongestionFeedbackFrame& feedback,
     39       QuicTime feedback_receive_time,
     40       const SentPacketsMap& sent_packets) OVERRIDE;
     41   virtual void OnPacketAcked(QuicPacketSequenceNumber acked_sequence_number,
     42                              QuicByteCount acked_bytes,
     43                              QuicTime::Delta rtt) OVERRIDE;
     44   virtual void OnPacketLost(QuicPacketSequenceNumber sequence_number,
     45                             QuicTime ack_receive_time) OVERRIDE;
     46   virtual bool OnPacketSent(
     47       QuicTime sent_time,
     48       QuicPacketSequenceNumber sequence_number,
     49       QuicByteCount bytes,
     50       TransmissionType transmission_type,
     51       HasRetransmittableData has_retransmittable_data) OVERRIDE;
     52   virtual void OnRetransmissionTimeout() OVERRIDE;
     53   virtual void OnPacketAbandoned(QuicPacketSequenceNumber sequence_number,
     54                                  QuicByteCount abandoned_bytes) OVERRIDE;
     55   virtual QuicTime::Delta TimeUntilSend(
     56       QuicTime now,
     57       TransmissionType transmission_type,
     58       HasRetransmittableData has_retransmittable_data,
     59       IsHandshake handshake) OVERRIDE;
     60   virtual QuicBandwidth BandwidthEstimate() const OVERRIDE;
     61   virtual QuicTime::Delta SmoothedRtt() const OVERRIDE;
     62   virtual QuicTime::Delta RetransmissionDelay() const OVERRIDE;
     63   virtual QuicByteCount GetCongestionWindow() const OVERRIDE;
     64   // End implementation of SendAlgorithmInterface.
     65 
     66  private:
     67   void EstimateDelayBandwidth(QuicTime feedback_receive_time,
     68                               QuicBandwidth sent_bandwidth);
     69   void EstimateNewBandwidth(QuicTime feedback_receive_time,
     70                             QuicBandwidth sent_bandwidth);
     71   void EstimateNewBandwidthAfterDraining(
     72       QuicTime feedback_receive_time,
     73       QuicTime::Delta estimated_congestion_delay);
     74   void EstimateBandwidthAfterLossEvent(QuicTime feedback_receive_time);
     75   void EstimateBandwidthAfterDelayEvent(
     76       QuicTime feedback_receive_time,
     77       QuicTime::Delta estimated_congestion_delay);
     78   void ResetCurrentBandwidth(QuicTime feedback_receive_time,
     79                              QuicBandwidth new_rate);
     80   bool ProbingPhase(QuicTime feedback_receive_time);
     81 
     82   bool probing_;  // Are we currently in the probing phase?
     83   QuicByteCount max_segment_size_;
     84   QuicBandwidth current_bandwidth_;
     85   QuicTime::Delta smoothed_rtt_;
     86   scoped_ptr<ChannelEstimator> channel_estimator_;
     87   scoped_ptr<InterArrivalBitrateRampUp> bitrate_ramp_up_;
     88   scoped_ptr<InterArrivalOveruseDetector> overuse_detector_;
     89   scoped_ptr<InterArrivalProbe> probe_;
     90   scoped_ptr<InterArrivalStateMachine> state_machine_;
     91   scoped_ptr<PacedSender> paced_sender_;
     92   int accumulated_number_of_lost_packets_;
     93   BandwidthUsage bandwidth_usage_state_;
     94   QuicTime back_down_time_;  // Time when we decided to back down.
     95   QuicBandwidth back_down_bandwidth_;  // Bandwidth before backing down.
     96   QuicTime::Delta back_down_congestion_delay_;  // Delay when backing down.
     97 
     98   DISALLOW_COPY_AND_ASSIGN(InterArrivalSender);
     99 };
    100 
    101 }  // namespace net
    102 #endif  // NET_QUIC_CONGESTION_CONTROL_INTER_ARRIVAL_SENDER_H_
    103