OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 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/pacing_sender.h" | 5 #include "net/quic/congestion_control/pacing_sender.h" |
6 | 6 |
7 namespace net { | 7 namespace net { |
8 | 8 |
9 PacingSender::PacingSender(SendAlgorithmInterface* sender, | 9 PacingSender::PacingSender(SendAlgorithmInterface* sender, |
10 QuicTime::Delta alarm_granularity) | 10 QuicTime::Delta alarm_granularity) |
11 : sender_(sender), | 11 : sender_(sender), |
12 alarm_granularity_(alarm_granularity), | 12 alarm_granularity_(alarm_granularity), |
13 next_packet_send_time_(QuicTime::Zero()), | 13 next_packet_send_time_(QuicTime::Zero()), |
14 was_last_send_delayed_(false), | 14 was_last_send_delayed_(false), |
15 updated_rtt_(false) { | 15 updated_rtt_(false) { |
16 } | 16 } |
17 | 17 |
18 PacingSender::~PacingSender() {} | 18 PacingSender::~PacingSender() { |
| 19 } |
19 | 20 |
20 void PacingSender::SetFromConfig(const QuicConfig& config, bool is_server) { | 21 void PacingSender::SetFromConfig(const QuicConfig& config, bool is_server) { |
21 sender_->SetFromConfig(config, is_server); | 22 sender_->SetFromConfig(config, is_server); |
22 } | 23 } |
23 | 24 |
24 void PacingSender::OnIncomingQuicCongestionFeedbackFrame( | 25 void PacingSender::OnIncomingQuicCongestionFeedbackFrame( |
25 const QuicCongestionFeedbackFrame& feedback, | 26 const QuicCongestionFeedbackFrame& feedback, |
26 QuicTime feedback_receive_time) { | 27 QuicTime feedback_receive_time) { |
27 sender_->OnIncomingQuicCongestionFeedbackFrame( | 28 sender_->OnIncomingQuicCongestionFeedbackFrame(feedback, |
28 feedback, feedback_receive_time); | 29 feedback_receive_time); |
29 } | 30 } |
30 | 31 |
31 void PacingSender::OnPacketAcked( | 32 void PacingSender::OnPacketAcked(QuicPacketSequenceNumber acked_sequence_number, |
32 QuicPacketSequenceNumber acked_sequence_number, | 33 QuicByteCount acked_bytes) { |
33 QuicByteCount acked_bytes) { | |
34 sender_->OnPacketAcked(acked_sequence_number, acked_bytes); | 34 sender_->OnPacketAcked(acked_sequence_number, acked_bytes); |
35 } | 35 } |
36 | 36 |
37 void PacingSender::OnPacketLost(QuicPacketSequenceNumber sequence_number, | 37 void PacingSender::OnPacketLost(QuicPacketSequenceNumber sequence_number, |
38 QuicTime ack_receive_time) { | 38 QuicTime ack_receive_time) { |
39 sender_->OnPacketLost(sequence_number, ack_receive_time); | 39 sender_->OnPacketLost(sequence_number, ack_receive_time); |
40 } | 40 } |
41 | 41 |
42 bool PacingSender::OnPacketSent( | 42 bool PacingSender::OnPacketSent( |
43 QuicTime sent_time, | 43 QuicTime sent_time, |
44 QuicPacketSequenceNumber sequence_number, | 44 QuicPacketSequenceNumber sequence_number, |
45 QuicByteCount bytes, | 45 QuicByteCount bytes, |
46 HasRetransmittableData has_retransmittable_data) { | 46 HasRetransmittableData has_retransmittable_data) { |
47 // Only pace data packets once we have an updated RTT. | 47 // Only pace data packets once we have an updated RTT. |
48 if (has_retransmittable_data == HAS_RETRANSMITTABLE_DATA && updated_rtt_) { | 48 if (has_retransmittable_data == HAS_RETRANSMITTABLE_DATA && updated_rtt_) { |
49 // The next packet should be sent as soon as the current packets has | 49 // The next packet should be sent as soon as the current packets has |
50 // been transferred. We pace at twice the rate of the underlying | 50 // been transferred. We pace at twice the rate of the underlying |
51 // sender's bandwidth estimate to help ensure that pacing doesn't become | 51 // sender's bandwidth estimate to help ensure that pacing doesn't become |
52 // a bottleneck. | 52 // a bottleneck. |
53 const float kPacingAggression = 2; | 53 const float kPacingAggression = 2; |
54 QuicTime::Delta delay = | 54 QuicTime::Delta delay = |
55 BandwidthEstimate().Scale(kPacingAggression).TransferTime(bytes); | 55 BandwidthEstimate().Scale(kPacingAggression).TransferTime(bytes); |
56 next_packet_send_time_ = next_packet_send_time_.Add(delay); | 56 next_packet_send_time_ = next_packet_send_time_.Add(delay); |
57 } | 57 } |
58 return sender_->OnPacketSent(sent_time, sequence_number, bytes, | 58 return sender_->OnPacketSent( |
59 has_retransmittable_data); | 59 sent_time, sequence_number, bytes, has_retransmittable_data); |
60 } | 60 } |
61 | 61 |
62 void PacingSender::OnRetransmissionTimeout(bool packets_retransmitted) { | 62 void PacingSender::OnRetransmissionTimeout(bool packets_retransmitted) { |
63 sender_->OnRetransmissionTimeout(packets_retransmitted); | 63 sender_->OnRetransmissionTimeout(packets_retransmitted); |
64 } | 64 } |
65 | 65 |
66 void PacingSender::OnPacketAbandoned(QuicPacketSequenceNumber sequence_number, | 66 void PacingSender::OnPacketAbandoned(QuicPacketSequenceNumber sequence_number, |
67 QuicByteCount abandoned_bytes) { | 67 QuicByteCount abandoned_bytes) { |
68 sender_->OnPacketAbandoned(sequence_number, abandoned_bytes); | 68 sender_->OnPacketAbandoned(sequence_number, abandoned_bytes); |
69 } | 69 } |
70 | 70 |
71 QuicTime::Delta PacingSender::TimeUntilSend( | 71 QuicTime::Delta PacingSender::TimeUntilSend( |
72 QuicTime now, | 72 QuicTime now, |
73 HasRetransmittableData has_retransmittable_data) { | 73 HasRetransmittableData has_retransmittable_data) { |
74 QuicTime::Delta time_until_send = | 74 QuicTime::Delta time_until_send = |
75 sender_->TimeUntilSend(now, has_retransmittable_data); | 75 sender_->TimeUntilSend(now, has_retransmittable_data); |
76 if (!updated_rtt_) { | 76 if (!updated_rtt_) { |
77 // Don't pace if we don't have an updated RTT estimate. | 77 // Don't pace if we don't have an updated RTT estimate. |
78 return time_until_send; | 78 return time_until_send; |
79 } | 79 } |
80 | 80 |
81 if (!time_until_send.IsZero()) { | 81 if (!time_until_send.IsZero()) { |
82 DCHECK(time_until_send.IsInfinite()); | 82 DCHECK(time_until_send.IsInfinite()); |
83 // The underlying sender prevents sending. | 83 // The underlying sender prevents sending. |
(...skipping 11 matching lines...) Expand all Loading... |
95 now > next_packet_send_time_.Add(alarm_granularity_))) { | 95 now > next_packet_send_time_.Add(alarm_granularity_))) { |
96 // An alarm did not go off late, instead the application is "slow" | 96 // An alarm did not go off late, instead the application is "slow" |
97 // delivering data. In this case, we restrict the amount of lost time | 97 // delivering data. In this case, we restrict the amount of lost time |
98 // that we can make up for. | 98 // that we can make up for. |
99 next_packet_send_time_ = now.Subtract(alarm_granularity_); | 99 next_packet_send_time_ = now.Subtract(alarm_granularity_); |
100 } | 100 } |
101 | 101 |
102 // If the end of the epoch is far enough in the future, delay the send. | 102 // If the end of the epoch is far enough in the future, delay the send. |
103 if (next_packet_send_time_ > now.Add(alarm_granularity_)) { | 103 if (next_packet_send_time_ > now.Add(alarm_granularity_)) { |
104 was_last_send_delayed_ = true; | 104 was_last_send_delayed_ = true; |
105 DVLOG(1) << "Delaying packet: " | 105 DVLOG(1) << "Delaying packet: " << next_packet_send_time_.Subtract(now) |
106 << next_packet_send_time_.Subtract(now).ToMicroseconds(); | 106 .ToMicroseconds(); |
107 return next_packet_send_time_.Subtract(now); | 107 return next_packet_send_time_.Subtract(now); |
108 } | 108 } |
109 | 109 |
110 // Sent it immediately. The epoch end will be adjusted in OnPacketSent. | 110 // Sent it immediately. The epoch end will be adjusted in OnPacketSent. |
111 was_last_send_delayed_ = false; | 111 was_last_send_delayed_ = false; |
112 DVLOG(1) << "Sending packet now"; | 112 DVLOG(1) << "Sending packet now"; |
113 return QuicTime::Delta::Zero(); | 113 return QuicTime::Delta::Zero(); |
114 } | 114 } |
115 | 115 |
116 QuicBandwidth PacingSender::BandwidthEstimate() const { | 116 QuicBandwidth PacingSender::BandwidthEstimate() const { |
117 return sender_->BandwidthEstimate(); | 117 return sender_->BandwidthEstimate(); |
118 } | 118 } |
119 | 119 |
120 void PacingSender::OnRttUpdated(QuicPacketSequenceNumber largest_observed) { | 120 void PacingSender::OnRttUpdated(QuicPacketSequenceNumber largest_observed) { |
121 updated_rtt_= true; | 121 updated_rtt_ = true; |
122 sender_->OnRttUpdated(largest_observed); | 122 sender_->OnRttUpdated(largest_observed); |
123 } | 123 } |
124 | 124 |
125 QuicTime::Delta PacingSender::RetransmissionDelay() const { | 125 QuicTime::Delta PacingSender::RetransmissionDelay() const { |
126 return sender_->RetransmissionDelay(); | 126 return sender_->RetransmissionDelay(); |
127 } | 127 } |
128 | 128 |
129 QuicByteCount PacingSender::GetCongestionWindow() const { | 129 QuicByteCount PacingSender::GetCongestionWindow() const { |
130 return sender_->GetCongestionWindow(); | 130 return sender_->GetCongestionWindow(); |
131 } | 131 } |
132 | 132 |
133 } // namespace net | 133 } // namespace net |
OLD | NEW |