| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "net/quic/congestion_control/hybrid_slow_start.h" | 5 #include "net/quic/congestion_control/hybrid_slow_start.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 | 8 | 
| 9 using std::max; | 9 using std::max; | 
| 10 using std::min; | 10 using std::min; | 
| 11 | 11 | 
| 12 namespace net { | 12 namespace net { | 
| 13 | 13 | 
| 14 // Note(pwestin): the magic clamping numbers come from the original code in | 14 // Note(pwestin): the magic clamping numbers come from the original code in | 
| 15 // tcp_cubic.c. | 15 // tcp_cubic.c. | 
| 16 const int64 kHybridStartLowWindow = 16; | 16 const int64_t kHybridStartLowWindow = 16; | 
| 17 // Number of delay samples for detecting the increase of delay. | 17 // Number of delay samples for detecting the increase of delay. | 
| 18 const uint32 kHybridStartMinSamples = 8; | 18 const uint32_t kHybridStartMinSamples = 8; | 
| 19 // Exit slow start if the min rtt has increased by more than 1/8th. | 19 // Exit slow start if the min rtt has increased by more than 1/8th. | 
| 20 const int kHybridStartDelayFactorExp = 3;  // 2^3 = 8 | 20 const int kHybridStartDelayFactorExp = 3;  // 2^3 = 8 | 
| 21 // The original paper specifies 2 and 8ms, but those have changed over time. | 21 // The original paper specifies 2 and 8ms, but those have changed over time. | 
| 22 const int64 kHybridStartDelayMinThresholdUs = 4000; | 22 const int64_t kHybridStartDelayMinThresholdUs = 4000; | 
| 23 const int64 kHybridStartDelayMaxThresholdUs = 16000; | 23 const int64_t kHybridStartDelayMaxThresholdUs = 16000; | 
| 24 | 24 | 
| 25 HybridSlowStart::HybridSlowStart() | 25 HybridSlowStart::HybridSlowStart() | 
| 26     : started_(false), | 26     : started_(false), | 
| 27       hystart_found_(NOT_FOUND), | 27       hystart_found_(NOT_FOUND), | 
| 28       last_sent_packet_number_(0), | 28       last_sent_packet_number_(0), | 
| 29       end_packet_number_(0), | 29       end_packet_number_(0), | 
| 30       rtt_sample_count_(0), | 30       rtt_sample_count_(0), | 
| 31       current_min_rtt_(QuicTime::Delta::Zero()) {} | 31       current_min_rtt_(QuicTime::Delta::Zero()) {} | 
| 32 | 32 | 
| 33 void HybridSlowStart::OnPacketAcked(QuicPacketNumber acked_packet_number, | 33 void HybridSlowStart::OnPacketAcked(QuicPacketNumber acked_packet_number, | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 79   // bursts. | 79   // bursts. | 
| 80   rtt_sample_count_++; | 80   rtt_sample_count_++; | 
| 81   if (rtt_sample_count_ <= kHybridStartMinSamples) { | 81   if (rtt_sample_count_ <= kHybridStartMinSamples) { | 
| 82     if (current_min_rtt_.IsZero() || current_min_rtt_ > latest_rtt) { | 82     if (current_min_rtt_.IsZero() || current_min_rtt_ > latest_rtt) { | 
| 83       current_min_rtt_ = latest_rtt; | 83       current_min_rtt_ = latest_rtt; | 
| 84     } | 84     } | 
| 85   } | 85   } | 
| 86   // We only need to check this once per round. | 86   // We only need to check this once per round. | 
| 87   if (rtt_sample_count_ == kHybridStartMinSamples) { | 87   if (rtt_sample_count_ == kHybridStartMinSamples) { | 
| 88     // Divide min_rtt by 8 to get a rtt increase threshold for exiting. | 88     // Divide min_rtt by 8 to get a rtt increase threshold for exiting. | 
| 89     int64 min_rtt_increase_threshold_us = | 89     int64_t min_rtt_increase_threshold_us = | 
| 90         min_rtt.ToMicroseconds() >> kHybridStartDelayFactorExp; | 90         min_rtt.ToMicroseconds() >> kHybridStartDelayFactorExp; | 
| 91     // Ensure the rtt threshold is never less than 2ms or more than 16ms. | 91     // Ensure the rtt threshold is never less than 2ms or more than 16ms. | 
| 92     min_rtt_increase_threshold_us = | 92     min_rtt_increase_threshold_us = | 
| 93         min(min_rtt_increase_threshold_us, kHybridStartDelayMaxThresholdUs); | 93         min(min_rtt_increase_threshold_us, kHybridStartDelayMaxThresholdUs); | 
| 94     QuicTime::Delta min_rtt_increase_threshold = | 94     QuicTime::Delta min_rtt_increase_threshold = | 
| 95         QuicTime::Delta::FromMicroseconds(max(min_rtt_increase_threshold_us, | 95         QuicTime::Delta::FromMicroseconds(max(min_rtt_increase_threshold_us, | 
| 96                                               kHybridStartDelayMinThresholdUs)); | 96                                               kHybridStartDelayMinThresholdUs)); | 
| 97 | 97 | 
| 98     if (current_min_rtt_ > min_rtt.Add(min_rtt_increase_threshold)) { | 98     if (current_min_rtt_ > min_rtt.Add(min_rtt_increase_threshold)) { | 
| 99       hystart_found_ = DELAY; | 99       hystart_found_ = DELAY; | 
| 100     } | 100     } | 
| 101   } | 101   } | 
| 102   // Exit from slow start if the cwnd is greater than 16 and | 102   // Exit from slow start if the cwnd is greater than 16 and | 
| 103   // increasing delay is found. | 103   // increasing delay is found. | 
| 104   return congestion_window >= kHybridStartLowWindow && | 104   return congestion_window >= kHybridStartLowWindow && | 
| 105          hystart_found_ != NOT_FOUND; | 105          hystart_found_ != NOT_FOUND; | 
| 106 } | 106 } | 
| 107 | 107 | 
| 108 }  // namespace net | 108 }  // namespace net | 
| OLD | NEW | 
|---|