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 #include "net/quic/congestion_control/paced_sender.h"
      6 
      7 #include "net/quic/quic_protocol.h"
      8 
      9 namespace net {
     10 
     11 // To prevent too aggressive pacing we allow the following packet burst size.
     12 const int64 kMinPacketBurstSize = 2;
     13 // Max estimated time between calls to TimeUntilSend and
     14 // AvailableCongestionWindow.
     15 const int64 kMaxSchedulingDelayUs = 2000;
     16 
     17 PacedSender::PacedSender(QuicBandwidth estimate)
     18     : leaky_bucket_(estimate),
     19       pace_(estimate) {
     20 }
     21 
     22 void PacedSender::UpdateBandwidthEstimate(QuicTime now,
     23                                           QuicBandwidth estimate) {
     24   leaky_bucket_.SetDrainingRate(now, estimate);
     25   pace_ = estimate;
     26 }
     27 
     28 void PacedSender::SentPacket(QuicTime now, QuicByteCount bytes) {
     29   leaky_bucket_.Add(now, bytes);
     30 }
     31 
     32 QuicTime::Delta PacedSender::TimeUntilSend(QuicTime now,
     33                                            QuicTime::Delta time_until_send) {
     34   if (time_until_send.ToMicroseconds() >= kMaxSchedulingDelayUs) {
     35     return time_until_send;
     36   }
     37   // Pace the data.
     38   QuicByteCount pacing_window = pace_.ToBytesPerPeriod(
     39       QuicTime::Delta::FromMicroseconds(kMaxSchedulingDelayUs));
     40   QuicByteCount min_window_size = kMinPacketBurstSize *  kMaxPacketSize;
     41   pacing_window = std::max(pacing_window, min_window_size);
     42 
     43   if (pacing_window > leaky_bucket_.BytesPending(now)) {
     44     // We have not filled our pacing window yet.
     45     return time_until_send;
     46   }
     47   return leaky_bucket_.TimeRemaining(now);
     48 }
     49 
     50 }  // namespace net
     51