| Index: net/quic/congestion_control/inter_arrival_sender.cc
|
| diff --git a/net/quic/congestion_control/inter_arrival_sender.cc b/net/quic/congestion_control/inter_arrival_sender.cc
|
| index 693156081ea06f552a8e0f01f6bccd4d95e11eac..1b46455de53d7a969bf7eb24a54445b274991cc1 100644
|
| --- a/net/quic/congestion_control/inter_arrival_sender.cc
|
| +++ b/net/quic/congestion_control/inter_arrival_sender.cc
|
| @@ -7,6 +7,7 @@
|
| #include <algorithm>
|
|
|
| #include "base/stl_util.h"
|
| +#include "net/quic/congestion_control/rtt_stats.h"
|
|
|
| using std::max;
|
| using std::min;
|
| @@ -20,9 +21,6 @@ const float kUncertainSafetyMargin = 0.7f;
|
| const float kMaxBitrateReduction = 0.9f;
|
| const float kMinBitrateReduction = 0.05f;
|
| const uint64 kMinBitrateKbit = 10;
|
| -const int kInitialRttMs = 60; // At a typical RTT 60 ms.
|
| -const float kAlpha = 0.125f;
|
| -const float kOneMinusAlpha = 1 - kAlpha;
|
|
|
| static const int kHistoryPeriodMs = 5000;
|
| static const int kBitrateSmoothingPeriodMs = 1000;
|
| @@ -30,8 +28,10 @@ static const int kMinBitrateSmoothingPeriodMs = 500;
|
|
|
| } // namespace
|
|
|
| -InterArrivalSender::InterArrivalSender(const QuicClock* clock)
|
| +InterArrivalSender::InterArrivalSender(const QuicClock* clock,
|
| + const RttStats* rtt_stats)
|
| : clock_(clock),
|
| + rtt_stats_(rtt_stats),
|
| probing_(true),
|
| max_segment_size_(kDefaultMaxPacketSize),
|
| current_bandwidth_(QuicBandwidth::Zero()),
|
| @@ -305,34 +305,13 @@ QuicBandwidth InterArrivalSender::BandwidthEstimate() const {
|
| }
|
|
|
| void InterArrivalSender::UpdateRtt(QuicTime::Delta rtt) {
|
| - // RTT can't be negative.
|
| - DCHECK_LE(0, rtt.ToMicroseconds());
|
| -
|
| - if (rtt.IsInfinite()) {
|
| - return;
|
| - }
|
| -
|
| - if (smoothed_rtt_.IsZero()) {
|
| - smoothed_rtt_ = rtt;
|
| - } else {
|
| - smoothed_rtt_ = QuicTime::Delta::FromMicroseconds(
|
| - kOneMinusAlpha * smoothed_rtt_.ToMicroseconds() +
|
| - kAlpha * rtt.ToMicroseconds());
|
| - }
|
| - state_machine_->set_rtt(smoothed_rtt_);
|
| -}
|
| -
|
| -QuicTime::Delta InterArrivalSender::SmoothedRtt() const {
|
| - if (smoothed_rtt_.IsZero()) {
|
| - return QuicTime::Delta::FromMilliseconds(kInitialRttMs);
|
| - }
|
| - return smoothed_rtt_;
|
| + state_machine_->set_rtt(rtt_stats_->SmoothedRtt());
|
| }
|
|
|
| QuicTime::Delta InterArrivalSender::RetransmissionDelay() const {
|
| // TODO(pwestin): Calculate and return retransmission delay.
|
| // Use 2 * the smoothed RTT for now.
|
| - return smoothed_rtt_.Add(smoothed_rtt_);
|
| + return rtt_stats_->SmoothedRtt().Multiply(2);
|
| }
|
|
|
| QuicByteCount InterArrivalSender::GetCongestionWindow() const {
|
| @@ -381,7 +360,8 @@ void InterArrivalSender::EstimateNewBandwidthAfterDraining(
|
| QuicTime::Delta buffer_reduction =
|
| back_down_congestion_delay_.Subtract(estimated_congestion_delay);
|
| QuicTime::Delta elapsed_time =
|
| - feedback_receive_time.Subtract(back_down_time_).Subtract(SmoothedRtt());
|
| + feedback_receive_time.Subtract(back_down_time_).Subtract(
|
| + rtt_stats_->SmoothedRtt());
|
|
|
| QuicBandwidth new_estimate = QuicBandwidth::Zero();
|
| if (buffer_reduction >= elapsed_time) {
|
| @@ -454,7 +434,7 @@ void InterArrivalSender::EstimateBandwidthAfterDelayEvent(
|
| // bitrate with the following.
|
| // TODO(pwestin): this is a crude first implementation.
|
| int64 draining_rate_per_rtt = (estimated_byte_buildup *
|
| - kNumMicrosPerSecond) / SmoothedRtt().ToMicroseconds();
|
| + kNumMicrosPerSecond) / rtt_stats_->SmoothedRtt().ToMicroseconds();
|
|
|
| float decrease_factor =
|
| draining_rate_per_rtt / current_bandwidth_.ToBytesPerSecond();
|
| @@ -467,18 +447,16 @@ void InterArrivalSender::EstimateBandwidthAfterDelayEvent(
|
|
|
| // While in delay sensing mode send at least one packet per RTT.
|
| QuicBandwidth min_delay_bitrate =
|
| - QuicBandwidth::FromBytesAndTimeDelta(max_segment_size_, SmoothedRtt());
|
| + QuicBandwidth::FromBytesAndTimeDelta(max_segment_size_,
|
| + rtt_stats_->SmoothedRtt());
|
| new_target_bitrate = max(new_target_bitrate, min_delay_bitrate);
|
|
|
| ResetCurrentBandwidth(feedback_receive_time, new_target_bitrate);
|
|
|
| DVLOG(1) << "New bandwidth estimate after delay event:"
|
| - << current_bandwidth_.ToKBitsPerSecond()
|
| - << " Kbits/s min delay bitrate:"
|
| - << min_delay_bitrate.ToKBitsPerSecond()
|
| - << " Kbits/s RTT:"
|
| - << SmoothedRtt().ToMicroseconds()
|
| - << " us";
|
| + << current_bandwidth_.ToKBitsPerSecond() << " Kbits/s min delay bitrate:"
|
| + << min_delay_bitrate.ToKBitsPerSecond() << " Kbits/s RTT:"
|
| + << rtt_stats_->SmoothedRtt().ToMicroseconds() << " us";
|
| }
|
|
|
| void InterArrivalSender::EstimateBandwidthAfterLossEvent(
|
| @@ -486,8 +464,7 @@ void InterArrivalSender::EstimateBandwidthAfterLossEvent(
|
| ResetCurrentBandwidth(feedback_receive_time,
|
| current_bandwidth_.Scale(kPacketLossBitrateReduction));
|
| DVLOG(1) << "New bandwidth estimate after loss event:"
|
| - << current_bandwidth_.ToKBitsPerSecond()
|
| - << " Kbits/s";
|
| + << current_bandwidth_.ToKBitsPerSecond() << " Kbits/s";
|
| }
|
|
|
| void InterArrivalSender::ResetCurrentBandwidth(QuicTime feedback_receive_time,
|
|
|