OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/send_algorithm_simulator.h" | 5 #include "net/quic/congestion_control/send_algorithm_simulator.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/rand_util.h" | 10 #include "base/rand_util.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 << send_event.time_delta.ToMicroseconds() << "us"; | 106 << send_event.time_delta.ToMicroseconds() << "us"; |
107 clock_->AdvanceTime(send_event.time_delta); | 107 clock_->AdvanceTime(send_event.time_delta); |
108 SendDataNow(send_event.transfer); | 108 SendDataNow(send_event.transfer); |
109 bytes_sent += kPacketSize; | 109 bytes_sent += kPacketSize; |
110 } | 110 } |
111 } | 111 } |
112 } | 112 } |
113 | 113 |
114 SendAlgorithmSimulator::PacketEvent SendAlgorithmSimulator::NextSendEvent() { | 114 SendAlgorithmSimulator::PacketEvent SendAlgorithmSimulator::NextSendEvent() { |
115 QuicTime::Delta next_send_time = QuicTime::Delta::Infinite(); | 115 QuicTime::Delta next_send_time = QuicTime::Delta::Infinite(); |
116 Transfer* transfer = NULL; | 116 Transfer* transfer = nullptr; |
117 for (vector<Transfer>::iterator it = pending_transfers_.begin(); | 117 for (vector<Transfer>::iterator it = pending_transfers_.begin(); |
118 it != pending_transfers_.end(); ++it) { | 118 it != pending_transfers_.end(); ++it) { |
119 // If we've already sent enough bytes, wait for them to be acked. | 119 // If we've already sent enough bytes, wait for them to be acked. |
120 if (it->bytes_acked + it->bytes_in_flight >= it->num_bytes) { | 120 if (it->bytes_acked + it->bytes_in_flight >= it->num_bytes) { |
121 continue; | 121 continue; |
122 } | 122 } |
123 // If the flow hasn't started, use the start time. | 123 // If the flow hasn't started, use the start time. |
124 QuicTime::Delta transfer_send_time = it->start_time.Subtract(clock_->Now()); | 124 QuicTime::Delta transfer_send_time = it->start_time.Subtract(clock_->Now()); |
125 if (clock_->Now() >= it->start_time) { | 125 if (clock_->Now() >= it->start_time) { |
126 transfer_send_time = | 126 transfer_send_time = |
127 it->sender->send_algorithm->TimeUntilSend( | 127 it->sender->send_algorithm->TimeUntilSend( |
128 clock_->Now(), it->bytes_in_flight, HAS_RETRANSMITTABLE_DATA); | 128 clock_->Now(), it->bytes_in_flight, HAS_RETRANSMITTABLE_DATA); |
129 } | 129 } |
130 if (transfer_send_time < next_send_time) { | 130 if (transfer_send_time < next_send_time) { |
131 next_send_time = transfer_send_time; | 131 next_send_time = transfer_send_time; |
132 transfer = &(*it); | 132 transfer = &(*it); |
133 } | 133 } |
134 } | 134 } |
135 DVLOG(1) << "NextSendTime returning delta(ms):" | 135 DVLOG(1) << "NextSendTime returning delta(ms):" |
136 << next_send_time.ToMilliseconds(); | 136 << next_send_time.ToMilliseconds(); |
137 return PacketEvent(next_send_time, transfer); | 137 return PacketEvent(next_send_time, transfer); |
138 } | 138 } |
139 | 139 |
140 // NextAck takes into account packet loss in both forward and reverse | 140 // NextAck takes into account packet loss in both forward and reverse |
141 // direction, as well as correlated losses. And it assumes the receiver acks | 141 // direction, as well as correlated losses. And it assumes the receiver acks |
142 // every other packet when there is no loss. | 142 // every other packet when there is no loss. |
143 SendAlgorithmSimulator::PacketEvent SendAlgorithmSimulator::NextAckEvent() { | 143 SendAlgorithmSimulator::PacketEvent SendAlgorithmSimulator::NextAckEvent() { |
144 if (sent_packets_.empty()) { | 144 if (sent_packets_.empty()) { |
145 DVLOG(1) << "No outstanding packets to ack for any transfer."; | 145 DVLOG(1) << "No outstanding packets to ack for any transfer."; |
146 return PacketEvent(QuicTime::Delta::Infinite(), NULL); | 146 return PacketEvent(QuicTime::Delta::Infinite(), nullptr); |
147 } | 147 } |
148 | 148 |
149 // For each connection, find the next acked packet. | 149 // For each connection, find the next acked packet. |
150 QuicTime::Delta ack_time = QuicTime::Delta::Infinite(); | 150 QuicTime::Delta ack_time = QuicTime::Delta::Infinite(); |
151 Transfer* transfer = NULL; | 151 Transfer* transfer = nullptr; |
152 for (vector<Transfer>::iterator it = pending_transfers_.begin(); | 152 for (vector<Transfer>::iterator it = pending_transfers_.begin(); |
153 it != pending_transfers_.end(); ++it) { | 153 it != pending_transfers_.end(); ++it) { |
154 QuicTime::Delta transfer_ack_time = FindNextAcked(&(*it)); | 154 QuicTime::Delta transfer_ack_time = FindNextAcked(&(*it)); |
155 if (transfer_ack_time < ack_time) { | 155 if (transfer_ack_time < ack_time) { |
156 ack_time = transfer_ack_time; | 156 ack_time = transfer_ack_time; |
157 transfer = &(*it); | 157 transfer = &(*it); |
158 } | 158 } |
159 } | 159 } |
160 | 160 |
161 return PacketEvent(ack_time, transfer); | 161 return PacketEvent(ack_time, transfer); |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 } | 364 } |
365 transfer->bytes_in_flight += kPacketSize; | 365 transfer->bytes_in_flight += kPacketSize; |
366 } | 366 } |
367 | 367 |
368 // Advance the time by |delta| without sending anything. | 368 // Advance the time by |delta| without sending anything. |
369 void SendAlgorithmSimulator::AdvanceTime(QuicTime::Delta delta) { | 369 void SendAlgorithmSimulator::AdvanceTime(QuicTime::Delta delta) { |
370 clock_->AdvanceTime(delta); | 370 clock_->AdvanceTime(delta); |
371 } | 371 } |
372 | 372 |
373 } // namespace net | 373 } // namespace net |
OLD | NEW |