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 // Based on the inter arrival time of the received packets relative to the time
      6 // those packets where sent we can estimate the available capacity of the
      7 // channel.
      8 // We can only use packet trains that are sent out faster than the acctual
      9 // available channel capacity.
     10 // Note 1: this is intended to be a temporary class created when you send out a
     11 // channel probing burst. Once the last packet have arrived you ask it for an
     12 // estimate.
     13 // Note 2: During this phase we should not update the overuse detector.
     14 #ifndef NET_QUIC_CONGESTION_CONTROL_AVAILABLE_CHANNEL_ESTIMATOR_H_
     15 #define NET_QUIC_CONGESTION_CONTROL_AVAILABLE_CHANNEL_ESTIMATOR_H_
     16 
     17 #include "base/basictypes.h"
     18 #include "net/base/net_export.h"
     19 #include "net/quic/quic_bandwidth.h"
     20 #include "net/quic/quic_protocol.h"
     21 #include "net/quic/quic_time.h"
     22 
     23 namespace net {
     24 
     25 enum NET_EXPORT_PRIVATE AvailableChannelEstimateState {
     26   kAvailableChannelEstimateUnknown = 0,
     27   kAvailableChannelEstimateUncertain = 1,
     28   kAvailableChannelEstimateGood = 2,
     29   kAvailableChannelEstimateSenderLimited = 3,
     30 };
     31 
     32 class NET_EXPORT_PRIVATE AvailableChannelEstimator {
     33  public:
     34   explicit AvailableChannelEstimator(
     35       QuicPacketSequenceNumber first_sequence_number,
     36       QuicTime first_send_time,
     37       QuicTime first_receive_time);
     38 
     39   // Update the statistics with each receive time, for every packet we get a
     40   // feedback message for.
     41   void OnIncomingFeedback(QuicPacketSequenceNumber sequence_number,
     42                           QuicByteCount packet_size,
     43                           QuicTime sent_time,
     44                           QuicTime receive_time);
     45 
     46   // Get the current estimated available channel capacity.
     47   // bandwidth_estimate is invalid if kAvailableChannelEstimateUnknown
     48   // is returned.
     49   AvailableChannelEstimateState GetAvailableChannelEstimate(
     50       QuicBandwidth* bandwidth_estimate) const;
     51 
     52  private:
     53   const QuicPacketSequenceNumber first_sequence_number_;
     54   const QuicTime first_send_time_;
     55   const QuicTime first_receive_time_;
     56   QuicPacketSequenceNumber last_incorporated_sequence_number_;
     57   QuicTime last_time_sent_;
     58   QuicTime last_receive_time_;
     59   int number_of_sequence_numbers_;
     60   QuicByteCount received_bytes_;
     61 };
     62 
     63 }  // namespace net
     64 #endif  // NET_QUIC_CONGESTION_CONTROL_AVAILABLE_CHANNEL_ESTIMATOR_H_
     65