| 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 namespace net { | 7 namespace net { |
| 8 | 8 |
| 9 // Note(pwestin): the magic clamping numbers come from the original code in | 9 // Note(pwestin): the magic clamping numbers come from the original code in |
| 10 // tcp_cubic.c. | 10 // tcp_cubic.c. |
| 11 // Number of delay samples for detecting the increase of delay. | 11 // Number of delay samples for detecting the increase of delay. |
| 12 const int kHybridStartMinSamples = 8; | 12 const int kHybridStartMinSamples = 8; |
| 13 const int kHybridStartDelayFactorExp = 4; // 2^4 = 16 | 13 const int kHybridStartDelayFactorExp = 4; // 2^4 = 16 |
| 14 const int kHybridStartDelayMinThresholdUs = 2000; | 14 const int kHybridStartDelayMinThresholdUs = 2000; |
| 15 const int kHybridStartDelayMaxThresholdUs = 16000; | 15 const int kHybridStartDelayMaxThresholdUs = 16000; |
| 16 | 16 |
| 17 HybridSlowStart::HybridSlowStart(const QuicClock* clock) | 17 HybridSlowStart::HybridSlowStart(const QuicClock* clock) |
| 18 : clock_(clock), | 18 : clock_(clock), |
| 19 started_(false), | 19 started_(false), |
| 20 found_ack_train_(false), | 20 found_ack_train_(false), |
| 21 found_delay_(false), | 21 found_delay_(false), |
| 22 round_start_(QuicTime::Zero()), |
| 22 end_sequence_number_(0), | 23 end_sequence_number_(0), |
| 23 sample_count_(0) { | 24 last_time_(QuicTime::Zero()), |
| 25 sample_count_(0), |
| 26 current_rtt_(QuicTime::Delta::Zero()) { |
| 24 } | 27 } |
| 25 | 28 |
| 26 void HybridSlowStart::Restart() { | 29 void HybridSlowStart::Restart() { |
| 27 found_ack_train_ = false; | 30 found_ack_train_ = false; |
| 28 found_delay_ = false; | 31 found_delay_ = false; |
| 29 } | 32 } |
| 30 | 33 |
| 31 void HybridSlowStart::Reset(QuicPacketSequenceNumber end_sequence_number) { | 34 void HybridSlowStart::Reset(QuicPacketSequenceNumber end_sequence_number) { |
| 32 DLOG(INFO) << "Reset hybrid slow start @" << end_sequence_number; | 35 DLOG(INFO) << "Reset hybrid slow start @" << end_sequence_number; |
| 33 round_start_ = last_time_ = clock_->Now(); | 36 round_start_ = last_time_ = clock_->Now(); |
| 34 end_sequence_number_ = end_sequence_number; | 37 end_sequence_number_ = end_sequence_number; |
| 35 current_rtt_ = QuicTime::Delta(); // Reset to 0. | 38 current_rtt_ = QuicTime::Delta::Zero(); |
| 36 sample_count_ = 0; | 39 sample_count_ = 0; |
| 37 started_ = true; | 40 started_ = true; |
| 38 } | 41 } |
| 39 | 42 |
| 40 bool HybridSlowStart::EndOfRound(QuicPacketSequenceNumber ack) { | 43 bool HybridSlowStart::EndOfRound(QuicPacketSequenceNumber ack) { |
| 41 // TODO(pwestin): do we need to handle wraparound? | 44 // TODO(pwestin): do we need to handle wraparound? |
| 42 return end_sequence_number_ <= ack; | 45 return end_sequence_number_ <= ack; |
| 43 } | 46 } |
| 44 | 47 |
| 45 void HybridSlowStart::Update(QuicTime::Delta rtt, QuicTime::Delta delay_min) { | 48 void HybridSlowStart::Update(QuicTime::Delta rtt, QuicTime::Delta delay_min) { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 bool HybridSlowStart::Exit() { | 99 bool HybridSlowStart::Exit() { |
| 97 // If either one of the two conditions are met we exit from slow start | 100 // If either one of the two conditions are met we exit from slow start |
| 98 // immediately. | 101 // immediately. |
| 99 if (found_ack_train_ || found_delay_) { | 102 if (found_ack_train_ || found_delay_) { |
| 100 return true; | 103 return true; |
| 101 } | 104 } |
| 102 return false; | 105 return false; |
| 103 } | 106 } |
| 104 | 107 |
| 105 } // namespace net | 108 } // namespace net |
| OLD | NEW |