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/fix_rate_sender.h" | 5 #include "net/quic/congestion_control/fix_rate_sender.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "net/quic/quic_protocol.h" | 10 #include "net/quic/quic_protocol.h" |
11 | 11 |
12 namespace { | 12 namespace { |
13 const int kInitialBitrate = 100000; // In bytes per second. | 13 const int kInitialBitrate = 100000; // In bytes per second. |
14 const uint64 kWindowSizeUs = 10000; // 10 ms. | 14 const uint64 kWindowSizeUs = 10000; // 10 ms. |
15 } | 15 } |
16 | 16 |
17 namespace net { | 17 namespace net { |
18 | 18 |
19 FixRateSender::FixRateSender(const QuicClock* clock) | 19 FixRateSender::FixRateSender(const QuicClock* clock) |
20 : bitrate_(QuicBandwidth::FromBytesPerSecond(kInitialBitrate)), | 20 : bitrate_(QuicBandwidth::FromBytesPerSecond(kInitialBitrate)), |
21 fix_rate_leaky_bucket_(bitrate_), | 21 fix_rate_leaky_bucket_(bitrate_), |
22 paced_sender_(bitrate_), | 22 paced_sender_(bitrate_), |
23 data_in_flight_(0) { | 23 data_in_flight_(0), |
| 24 latest_rtt_(QuicTime::Delta::Zero()) { |
24 DLOG(INFO) << "FixRateSender"; | 25 DLOG(INFO) << "FixRateSender"; |
25 } | 26 } |
26 | 27 |
| 28 FixRateSender::~FixRateSender() { |
| 29 } |
| 30 |
27 void FixRateSender::OnIncomingQuicCongestionFeedbackFrame( | 31 void FixRateSender::OnIncomingQuicCongestionFeedbackFrame( |
28 const QuicCongestionFeedbackFrame& feedback, | 32 const QuicCongestionFeedbackFrame& feedback, |
29 QuicTime feedback_receive_time, | 33 QuicTime feedback_receive_time, |
30 QuicBandwidth /*sent_bandwidth*/, | 34 QuicBandwidth /*sent_bandwidth*/, |
31 const SentPacketsMap& /*sent_packets*/) { | 35 const SentPacketsMap& /*sent_packets*/) { |
32 DCHECK(feedback.type == kFixRate) << | 36 DCHECK(feedback.type == kFixRate) << |
33 "Invalid incoming CongestionFeedbackType:" << feedback.type; | 37 "Invalid incoming CongestionFeedbackType:" << feedback.type; |
34 if (feedback.type == kFixRate) { | 38 if (feedback.type == kFixRate) { |
35 bitrate_ = feedback.fix_rate.bitrate; | 39 bitrate_ = feedback.fix_rate.bitrate; |
36 fix_rate_leaky_bucket_.SetDrainingRate(feedback_receive_time, bitrate_); | 40 fix_rate_leaky_bucket_.SetDrainingRate(feedback_receive_time, bitrate_); |
37 paced_sender_.UpdateBandwidthEstimate(feedback_receive_time, bitrate_); | 41 paced_sender_.UpdateBandwidthEstimate(feedback_receive_time, bitrate_); |
38 } | 42 } |
39 // Silently ignore invalid messages in release mode. | 43 // Silently ignore invalid messages in release mode. |
40 } | 44 } |
41 | 45 |
42 void FixRateSender::OnIncomingAck( | 46 void FixRateSender::OnIncomingAck( |
43 QuicPacketSequenceNumber /*acked_sequence_number*/, | 47 QuicPacketSequenceNumber /*acked_sequence_number*/, |
44 QuicByteCount bytes_acked, | 48 QuicByteCount bytes_acked, |
45 QuicTime::Delta /*rtt*/) { | 49 QuicTime::Delta rtt) { |
| 50 latest_rtt_ = rtt; |
46 data_in_flight_ -= bytes_acked; | 51 data_in_flight_ -= bytes_acked; |
47 } | 52 } |
48 | 53 |
49 void FixRateSender::OnIncomingLoss(QuicTime /*ack_receive_time*/) { | 54 void FixRateSender::OnIncomingLoss(QuicTime /*ack_receive_time*/) { |
50 // Ignore losses for fix rate sender. | 55 // Ignore losses for fix rate sender. |
51 } | 56 } |
52 | 57 |
53 void FixRateSender::SentPacket(QuicTime sent_time, | 58 void FixRateSender::SentPacket(QuicTime sent_time, |
54 QuicPacketSequenceNumber /*sequence_number*/, | 59 QuicPacketSequenceNumber /*sequence_number*/, |
55 QuicByteCount bytes, | 60 QuicByteCount bytes, |
56 bool is_retransmission, | 61 bool is_retransmission) { |
57 bool /*has_retransmittable_data*/) { | |
58 fix_rate_leaky_bucket_.Add(sent_time, bytes); | 62 fix_rate_leaky_bucket_.Add(sent_time, bytes); |
59 paced_sender_.SentPacket(sent_time, bytes); | 63 paced_sender_.SentPacket(sent_time, bytes); |
60 if (!is_retransmission) { | 64 if (!is_retransmission) { |
61 data_in_flight_ += bytes; | 65 data_in_flight_ += bytes; |
62 } | 66 } |
63 } | 67 } |
64 | 68 |
65 QuicTime::Delta FixRateSender::TimeUntilSend(QuicTime now, | 69 void FixRateSender::AbandoningPacket( |
66 bool /*is_retransmission*/) { | 70 QuicPacketSequenceNumber /*sequence_number*/, |
| 71 QuicByteCount /*abandoned_bytes*/) { |
| 72 } |
| 73 |
| 74 QuicTime::Delta FixRateSender::TimeUntilSend( |
| 75 QuicTime now, |
| 76 bool /*is_retransmission*/, |
| 77 bool /*has_retransmittable_data*/) { |
67 if (CongestionWindow() > fix_rate_leaky_bucket_.BytesPending(now)) { | 78 if (CongestionWindow() > fix_rate_leaky_bucket_.BytesPending(now)) { |
68 if (CongestionWindow() <= data_in_flight_) { | 79 if (CongestionWindow() <= data_in_flight_) { |
69 // We need an ack before we send more. | 80 // We need an ack before we send more. |
70 return QuicTime::Delta::Infinite(); | 81 return QuicTime::Delta::Infinite(); |
71 } | 82 } |
72 return paced_sender_.TimeUntilSend(now, QuicTime::Delta::Zero()); | 83 return paced_sender_.TimeUntilSend(now, QuicTime::Delta::Zero()); |
73 } | 84 } |
74 QuicTime::Delta time_remaining = fix_rate_leaky_bucket_.TimeRemaining(now); | 85 QuicTime::Delta time_remaining = fix_rate_leaky_bucket_.TimeRemaining(now); |
75 if (time_remaining.IsZero()) { | 86 if (time_remaining.IsZero()) { |
76 // We need an ack before we send more. | 87 // We need an ack before we send more. |
77 return QuicTime::Delta::Infinite(); | 88 return QuicTime::Delta::Infinite(); |
78 } | 89 } |
79 return paced_sender_.TimeUntilSend(now, time_remaining); | 90 return paced_sender_.TimeUntilSend(now, time_remaining); |
80 } | 91 } |
81 | 92 |
82 QuicByteCount FixRateSender::CongestionWindow() { | 93 QuicByteCount FixRateSender::CongestionWindow() { |
83 QuicByteCount window_size_bytes = bitrate_.ToBytesPerPeriod( | 94 QuicByteCount window_size_bytes = bitrate_.ToBytesPerPeriod( |
84 QuicTime::Delta::FromMicroseconds(kWindowSizeUs)); | 95 QuicTime::Delta::FromMicroseconds(kWindowSizeUs)); |
85 // Make sure window size is not less than a packet. | 96 // Make sure window size is not less than a packet. |
86 return std::max(kMaxPacketSize, window_size_bytes); | 97 return std::max(kMaxPacketSize, window_size_bytes); |
87 } | 98 } |
88 | 99 |
89 QuicBandwidth FixRateSender::BandwidthEstimate() { | 100 QuicBandwidth FixRateSender::BandwidthEstimate() { |
90 return bitrate_; | 101 return bitrate_; |
91 } | 102 } |
92 | 103 |
| 104 QuicTime::Delta FixRateSender::SmoothedRtt() { |
| 105 // TODO(satyamshekhar): Calculate and return smoothed rtt. |
| 106 return latest_rtt_; |
| 107 } |
| 108 |
93 } // namespace net | 109 } // namespace net |
OLD | NEW |