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" |
11 #include "net/quic/crypto/quic_random.h" | 11 #include "net/quic/crypto/quic_random.h" |
12 | 12 |
13 using std::list; | 13 using std::list; |
| 14 using std::make_pair; |
14 using std::max; | 15 using std::max; |
15 using std::min; | 16 using std::min; |
16 using std::vector; | 17 using std::vector; |
17 | 18 |
18 namespace net { | 19 namespace net { |
19 | 20 |
20 namespace { | 21 namespace { |
21 | 22 |
22 const QuicByteCount kPacketSize = 1200; | 23 const QuicByteCount kPacketSize = 1200; |
23 | 24 |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 return true; | 238 return true; |
238 } | 239 } |
239 last_packet = it->sequence_number; | 240 last_packet = it->sequence_number; |
240 } | 241 } |
241 return false; | 242 return false; |
242 } | 243 } |
243 | 244 |
244 void SendAlgorithmSimulator::HandlePendingAck(Transfer* transfer) { | 245 void SendAlgorithmSimulator::HandlePendingAck(Transfer* transfer) { |
245 Sender* sender = transfer->sender; | 246 Sender* sender = transfer->sender; |
246 DCHECK_LT(sender->last_acked, sender->next_acked); | 247 DCHECK_LT(sender->last_acked, sender->next_acked); |
247 SendAlgorithmInterface::CongestionMap acked_packets; | 248 SendAlgorithmInterface::CongestionVector acked_packets; |
248 SendAlgorithmInterface::CongestionMap lost_packets; | 249 SendAlgorithmInterface::CongestionVector lost_packets; |
249 DVLOG(1) << "Acking packets from:" << sender->last_acked | 250 DVLOG(1) << "Acking packets from:" << sender->last_acked |
250 << " to " << sender->next_acked | 251 << " to " << sender->next_acked |
251 << " bytes_in_flight:" << transfer->bytes_in_flight | 252 << " bytes_in_flight:" << transfer->bytes_in_flight |
252 << " Now():" << (clock_->Now().ToDebuggingValue() / 1000) << "ms"; | 253 << " Now():" << (clock_->Now().ToDebuggingValue() / 1000) << "ms"; |
253 // Some entries may be missing from the sent_packets_ array, if they were | 254 // Some entries may be missing from the sent_packets_ array, if they were |
254 // dropped due to buffer overruns. | 255 // dropped due to buffer overruns. |
255 SentPacket largest_observed; | 256 SentPacket largest_observed; |
256 list<SentPacket>::iterator it = sent_packets_.begin(); | 257 list<SentPacket>::iterator it = sent_packets_.begin(); |
257 while (sender->last_acked < sender->next_acked) { | 258 while (sender->last_acked < sender->next_acked) { |
258 ++sender->last_acked; | 259 ++sender->last_acked; |
259 TransmissionInfo info = TransmissionInfo(); | 260 TransmissionInfo info = TransmissionInfo(); |
260 info.bytes_sent = kPacketSize; | 261 info.bytes_sent = kPacketSize; |
261 info.in_flight = true; | 262 info.in_flight = true; |
262 // Find the next SentPacket for this transfer. | 263 // Find the next SentPacket for this transfer. |
263 while (it->transfer != transfer) { | 264 while (it->transfer != transfer) { |
264 DCHECK(it != sent_packets_.end()); | 265 DCHECK(it != sent_packets_.end()); |
265 ++it; | 266 ++it; |
266 } | 267 } |
267 // If it's missing from the array, it's a loss. | 268 // If it's missing from the array, it's a loss. |
268 if (it->sequence_number > sender->last_acked) { | 269 if (it->sequence_number > sender->last_acked) { |
269 DVLOG(1) << "Lost packet:" << sender->last_acked | 270 DVLOG(1) << "Lost packet:" << sender->last_acked |
270 << " dropped by buffer overflow."; | 271 << " dropped by buffer overflow."; |
271 lost_packets[sender->last_acked] = info; | 272 lost_packets.push_back(make_pair(sender->last_acked, info)); |
272 continue; | 273 continue; |
273 } | 274 } |
274 if (it->lost) { | 275 if (it->lost) { |
275 lost_packets[sender->last_acked] = info; | 276 lost_packets.push_back(make_pair(sender->last_acked, info)); |
276 } else { | 277 } else { |
277 acked_packets[sender->last_acked] = info; | 278 acked_packets.push_back(make_pair(sender->last_acked, info)); |
278 } | 279 } |
279 // This packet has been acked or lost, remove it from sent_packets_. | 280 // This packet has been acked or lost, remove it from sent_packets_. |
280 largest_observed = *it; | 281 largest_observed = *it; |
281 sent_packets_.erase(it++); | 282 sent_packets_.erase(it++); |
282 } | 283 } |
283 | 284 |
284 DCHECK(largest_observed.ack_time.IsInitialized()); | 285 DCHECK(largest_observed.ack_time.IsInitialized()); |
285 DVLOG(1) << "Updating RTT from send_time:" | 286 DVLOG(1) << "Updating RTT from send_time:" |
286 << largest_observed.send_time.ToDebuggingValue() << " to ack_time:" | 287 << largest_observed.send_time.ToDebuggingValue() << " to ack_time:" |
287 << largest_observed.ack_time.ToDebuggingValue(); | 288 << largest_observed.ack_time.ToDebuggingValue(); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 } | 364 } |
364 transfer->bytes_in_flight += kPacketSize; | 365 transfer->bytes_in_flight += kPacketSize; |
365 } | 366 } |
366 | 367 |
367 // Advance the time by |delta| without sending anything. | 368 // Advance the time by |delta| without sending anything. |
368 void SendAlgorithmSimulator::AdvanceTime(QuicTime::Delta delta) { | 369 void SendAlgorithmSimulator::AdvanceTime(QuicTime::Delta delta) { |
369 clock_->AdvanceTime(delta); | 370 clock_->AdvanceTime(delta); |
370 } | 371 } |
371 | 372 |
372 } // namespace net | 373 } // namespace net |
OLD | NEW |