Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(192)

Side by Side Diff: net/quic/congestion_control/fix_rate_sender.cc

Issue 12806002: Land Recent QUIC Changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: minor comment fix Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
OLDNEW
« no previous file with comments | « net/quic/congestion_control/fix_rate_sender.h ('k') | net/quic/congestion_control/fix_rate_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698