OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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/quic_sent_packet_manager.h" | 5 #include "net/quic/quic_sent_packet_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 static const size_t kDefaultMaxTailLossProbes = 2; | 43 static const size_t kDefaultMaxTailLossProbes = 2; |
44 static const int64 kMinTailLossProbeTimeoutMs = 10; | 44 static const int64 kMinTailLossProbeTimeoutMs = 10; |
45 | 45 |
46 // Number of samples before we force a new recent min rtt to be captured. | 46 // Number of samples before we force a new recent min rtt to be captured. |
47 static const size_t kNumMinRttSamplesAfterQuiescence = 2; | 47 static const size_t kNumMinRttSamplesAfterQuiescence = 2; |
48 | 48 |
49 // Number of unpaced packets to send after quiescence. | 49 // Number of unpaced packets to send after quiescence. |
50 static const size_t kInitialUnpacedBurst = 10; | 50 static const size_t kInitialUnpacedBurst = 10; |
51 | 51 |
52 bool HasCryptoHandshake(const TransmissionInfo& transmission_info) { | 52 bool HasCryptoHandshake(const TransmissionInfo& transmission_info) { |
53 if (transmission_info.retransmittable_frames == NULL) { | 53 if (transmission_info.retransmittable_frames == nullptr) { |
54 return false; | 54 return false; |
55 } | 55 } |
56 return transmission_info.retransmittable_frames->HasCryptoHandshake() == | 56 return transmission_info.retransmittable_frames->HasCryptoHandshake() == |
57 IS_HANDSHAKE; | 57 IS_HANDSHAKE; |
58 } | 58 } |
59 | 59 |
60 } // namespace | 60 } // namespace |
61 | 61 |
62 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") | 62 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") |
63 | 63 |
64 QuicSentPacketManager::QuicSentPacketManager( | 64 QuicSentPacketManager::QuicSentPacketManager( |
65 bool is_server, | 65 bool is_server, |
66 const QuicClock* clock, | 66 const QuicClock* clock, |
67 QuicConnectionStats* stats, | 67 QuicConnectionStats* stats, |
68 CongestionControlType congestion_control_type, | 68 CongestionControlType congestion_control_type, |
69 LossDetectionType loss_type) | 69 LossDetectionType loss_type) |
70 : unacked_packets_(), | 70 : unacked_packets_(), |
71 is_server_(is_server), | 71 is_server_(is_server), |
72 clock_(clock), | 72 clock_(clock), |
73 stats_(stats), | 73 stats_(stats), |
74 debug_delegate_(NULL), | 74 debug_delegate_(nullptr), |
75 network_change_visitor_(NULL), | 75 network_change_visitor_(nullptr), |
76 send_algorithm_(SendAlgorithmInterface::Create(clock, | 76 send_algorithm_(SendAlgorithmInterface::Create(clock, |
77 &rtt_stats_, | 77 &rtt_stats_, |
78 congestion_control_type, | 78 congestion_control_type, |
79 stats)), | 79 stats)), |
80 loss_algorithm_(LossDetectionInterface::Create(loss_type)), | 80 loss_algorithm_(LossDetectionInterface::Create(loss_type)), |
81 least_packet_awaited_by_peer_(1), | 81 least_packet_awaited_by_peer_(1), |
82 first_rto_transmission_(0), | 82 first_rto_transmission_(0), |
83 consecutive_rto_count_(0), | 83 consecutive_rto_count_(0), |
84 consecutive_tlp_count_(0), | 84 consecutive_tlp_count_(0), |
85 consecutive_crypto_retransmission_count_(0), | 85 consecutive_crypto_retransmission_count_(0), |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 } | 122 } |
123 if (HasClientSentConnectionOption(config, k1CON)) { | 123 if (HasClientSentConnectionOption(config, k1CON)) { |
124 send_algorithm_->SetNumEmulatedConnections(1); | 124 send_algorithm_->SetNumEmulatedConnections(1); |
125 } | 125 } |
126 if (config.HasReceivedConnectionOptions() && | 126 if (config.HasReceivedConnectionOptions() && |
127 ContainsQuicTag(config.ReceivedConnectionOptions(), kTIME)) { | 127 ContainsQuicTag(config.ReceivedConnectionOptions(), kTIME)) { |
128 loss_algorithm_.reset(LossDetectionInterface::Create(kTime)); | 128 loss_algorithm_.reset(LossDetectionInterface::Create(kTime)); |
129 } | 129 } |
130 send_algorithm_->SetFromConfig(config, is_server_); | 130 send_algorithm_->SetFromConfig(config, is_server_); |
131 | 131 |
132 if (network_change_visitor_ != NULL) { | 132 if (network_change_visitor_ != nullptr) { |
133 network_change_visitor_->OnCongestionWindowChange(GetCongestionWindow()); | 133 network_change_visitor_->OnCongestionWindowChange(GetCongestionWindow()); |
134 } | 134 } |
135 } | 135 } |
136 | 136 |
137 bool QuicSentPacketManager::HasClientSentConnectionOption( | 137 bool QuicSentPacketManager::HasClientSentConnectionOption( |
138 const QuicConfig& config, QuicTag tag) const { | 138 const QuicConfig& config, QuicTag tag) const { |
139 if (is_server_) { | 139 if (is_server_) { |
140 if (config.HasReceivedConnectionOptions() && | 140 if (config.HasReceivedConnectionOptions() && |
141 ContainsQuicTag(config.ReceivedConnectionOptions(), tag)) { | 141 ContainsQuicTag(config.ReceivedConnectionOptions(), tag)) { |
142 return true; | 142 return true; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 | 205 |
206 // Anytime we are making forward progress and have a new RTT estimate, reset | 206 // Anytime we are making forward progress and have a new RTT estimate, reset |
207 // the backoff counters. | 207 // the backoff counters. |
208 if (largest_observed_acked) { | 208 if (largest_observed_acked) { |
209 // Reset all retransmit counters any time a new packet is acked. | 209 // Reset all retransmit counters any time a new packet is acked. |
210 consecutive_rto_count_ = 0; | 210 consecutive_rto_count_ = 0; |
211 consecutive_tlp_count_ = 0; | 211 consecutive_tlp_count_ = 0; |
212 consecutive_crypto_retransmission_count_ = 0; | 212 consecutive_crypto_retransmission_count_ = 0; |
213 } | 213 } |
214 | 214 |
215 if (debug_delegate_ != NULL) { | 215 if (debug_delegate_ != nullptr) { |
216 debug_delegate_->OnIncomingAck(ack_frame, | 216 debug_delegate_->OnIncomingAck(ack_frame, |
217 ack_receive_time, | 217 ack_receive_time, |
218 unacked_packets_.largest_observed(), | 218 unacked_packets_.largest_observed(), |
219 largest_observed_acked, | 219 largest_observed_acked, |
220 GetLeastUnacked()); | 220 GetLeastUnacked()); |
221 } | 221 } |
222 } | 222 } |
223 | 223 |
224 void QuicSentPacketManager::UpdatePacketInformationReceivedByPeer( | 224 void QuicSentPacketManager::UpdatePacketInformationReceivedByPeer( |
225 const QuicAckFrame& ack_frame) { | 225 const QuicAckFrame& ack_frame) { |
226 if (ack_frame.missing_packets.empty()) { | 226 if (ack_frame.missing_packets.empty()) { |
227 least_packet_awaited_by_peer_ = ack_frame.largest_observed + 1; | 227 least_packet_awaited_by_peer_ = ack_frame.largest_observed + 1; |
228 } else { | 228 } else { |
229 least_packet_awaited_by_peer_ = *(ack_frame.missing_packets.begin()); | 229 least_packet_awaited_by_peer_ = *(ack_frame.missing_packets.begin()); |
230 } | 230 } |
231 } | 231 } |
232 | 232 |
233 void QuicSentPacketManager::MaybeInvokeCongestionEvent( | 233 void QuicSentPacketManager::MaybeInvokeCongestionEvent( |
234 bool rtt_updated, QuicByteCount bytes_in_flight) { | 234 bool rtt_updated, QuicByteCount bytes_in_flight) { |
235 if (!rtt_updated && packets_acked_.empty() && packets_lost_.empty()) { | 235 if (!rtt_updated && packets_acked_.empty() && packets_lost_.empty()) { |
236 return; | 236 return; |
237 } | 237 } |
238 send_algorithm_->OnCongestionEvent(rtt_updated, bytes_in_flight, | 238 send_algorithm_->OnCongestionEvent(rtt_updated, bytes_in_flight, |
239 packets_acked_, packets_lost_); | 239 packets_acked_, packets_lost_); |
240 packets_acked_.clear(); | 240 packets_acked_.clear(); |
241 packets_lost_.clear(); | 241 packets_lost_.clear(); |
242 if (network_change_visitor_ != NULL) { | 242 if (network_change_visitor_ != nullptr) { |
243 network_change_visitor_->OnCongestionWindowChange(GetCongestionWindow()); | 243 network_change_visitor_->OnCongestionWindowChange(GetCongestionWindow()); |
244 } | 244 } |
245 } | 245 } |
246 | 246 |
247 void QuicSentPacketManager::HandleAckForSentPackets( | 247 void QuicSentPacketManager::HandleAckForSentPackets( |
248 const QuicAckFrame& ack_frame) { | 248 const QuicAckFrame& ack_frame) { |
249 // Go through the packets we have not received an ack for and see if this | 249 // Go through the packets we have not received an ack for and see if this |
250 // incoming_ack shows they've been seen by the peer. | 250 // incoming_ack shows they've been seen by the peer. |
251 QuicTime::Delta delta_largest_observed = | 251 QuicTime::Delta delta_largest_observed = |
252 ack_frame.delta_time_largest_observed; | 252 ack_frame.delta_time_largest_observed; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 } | 300 } |
301 | 301 |
302 void QuicSentPacketManager::RetransmitUnackedPackets( | 302 void QuicSentPacketManager::RetransmitUnackedPackets( |
303 TransmissionType retransmission_type) { | 303 TransmissionType retransmission_type) { |
304 DCHECK(retransmission_type == ALL_UNACKED_RETRANSMISSION || | 304 DCHECK(retransmission_type == ALL_UNACKED_RETRANSMISSION || |
305 retransmission_type == ALL_INITIAL_RETRANSMISSION); | 305 retransmission_type == ALL_INITIAL_RETRANSMISSION); |
306 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked(); | 306 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked(); |
307 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 307 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
308 it != unacked_packets_.end(); ++it, ++sequence_number) { | 308 it != unacked_packets_.end(); ++it, ++sequence_number) { |
309 const RetransmittableFrames* frames = it->retransmittable_frames; | 309 const RetransmittableFrames* frames = it->retransmittable_frames; |
310 if (frames != NULL && (retransmission_type == ALL_UNACKED_RETRANSMISSION || | 310 if (frames != nullptr && |
311 frames->encryption_level() == ENCRYPTION_INITIAL)) { | 311 (retransmission_type == ALL_UNACKED_RETRANSMISSION || |
| 312 frames->encryption_level() == ENCRYPTION_INITIAL)) { |
312 MarkForRetransmission(sequence_number, retransmission_type); | 313 MarkForRetransmission(sequence_number, retransmission_type); |
313 } | 314 } |
314 } | 315 } |
315 } | 316 } |
316 | 317 |
317 void QuicSentPacketManager::NeuterUnencryptedPackets() { | 318 void QuicSentPacketManager::NeuterUnencryptedPackets() { |
318 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked(); | 319 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked(); |
319 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 320 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
320 it != unacked_packets_.end(); ++it, ++sequence_number) { | 321 it != unacked_packets_.end(); ++it, ++sequence_number) { |
321 const RetransmittableFrames* frames = it->retransmittable_frames; | 322 const RetransmittableFrames* frames = it->retransmittable_frames; |
322 if (frames != NULL && frames->encryption_level() == ENCRYPTION_NONE) { | 323 if (frames != nullptr && frames->encryption_level() == ENCRYPTION_NONE) { |
323 // Once you're forward secure, no unencrypted packets will be sent, crypto | 324 // Once you're forward secure, no unencrypted packets will be sent, crypto |
324 // or otherwise. Unencrypted packets are neutered and abandoned, to ensure | 325 // or otherwise. Unencrypted packets are neutered and abandoned, to ensure |
325 // they are not retransmitted or considered lost from a congestion control | 326 // they are not retransmitted or considered lost from a congestion control |
326 // perspective. | 327 // perspective. |
327 pending_retransmissions_.erase(sequence_number); | 328 pending_retransmissions_.erase(sequence_number); |
328 unacked_packets_.RemoveFromInFlight(sequence_number); | 329 unacked_packets_.RemoveFromInFlight(sequence_number); |
329 unacked_packets_.RemoveRetransmittability(sequence_number); | 330 unacked_packets_.RemoveRetransmittability(sequence_number); |
330 } | 331 } |
331 } | 332 } |
332 } | 333 } |
333 | 334 |
334 void QuicSentPacketManager::MarkForRetransmission( | 335 void QuicSentPacketManager::MarkForRetransmission( |
335 QuicPacketSequenceNumber sequence_number, | 336 QuicPacketSequenceNumber sequence_number, |
336 TransmissionType transmission_type) { | 337 TransmissionType transmission_type) { |
337 const TransmissionInfo& transmission_info = | 338 const TransmissionInfo& transmission_info = |
338 unacked_packets_.GetTransmissionInfo(sequence_number); | 339 unacked_packets_.GetTransmissionInfo(sequence_number); |
339 LOG_IF(DFATAL, transmission_info.retransmittable_frames == NULL); | 340 LOG_IF(DFATAL, transmission_info.retransmittable_frames == nullptr); |
340 if (transmission_type != TLP_RETRANSMISSION) { | 341 if (transmission_type != TLP_RETRANSMISSION) { |
341 unacked_packets_.RemoveFromInFlight(sequence_number); | 342 unacked_packets_.RemoveFromInFlight(sequence_number); |
342 } | 343 } |
343 // TODO(ianswett): Currently the RTO can fire while there are pending NACK | 344 // TODO(ianswett): Currently the RTO can fire while there are pending NACK |
344 // retransmissions for the same data, which is not ideal. | 345 // retransmissions for the same data, which is not ideal. |
345 if (ContainsKey(pending_retransmissions_, sequence_number)) { | 346 if (ContainsKey(pending_retransmissions_, sequence_number)) { |
346 return; | 347 return; |
347 } | 348 } |
348 | 349 |
349 pending_retransmissions_[sequence_number] = transmission_type; | 350 pending_retransmissions_[sequence_number] = transmission_type; |
(...skipping 19 matching lines...) Expand all Loading... |
369 ++stats_->spurious_rto_count; | 370 ++stats_->spurious_rto_count; |
370 } | 371 } |
371 for (SequenceNumberList::const_reverse_iterator it = | 372 for (SequenceNumberList::const_reverse_iterator it = |
372 all_transmissions.rbegin(); | 373 all_transmissions.rbegin(); |
373 it != all_transmissions.rend() && *it > acked_sequence_number; ++it) { | 374 it != all_transmissions.rend() && *it > acked_sequence_number; ++it) { |
374 const TransmissionInfo& retransmit_info = | 375 const TransmissionInfo& retransmit_info = |
375 unacked_packets_.GetTransmissionInfo(*it); | 376 unacked_packets_.GetTransmissionInfo(*it); |
376 | 377 |
377 stats_->bytes_spuriously_retransmitted += retransmit_info.bytes_sent; | 378 stats_->bytes_spuriously_retransmitted += retransmit_info.bytes_sent; |
378 ++stats_->packets_spuriously_retransmitted; | 379 ++stats_->packets_spuriously_retransmitted; |
379 if (debug_delegate_ != NULL) { | 380 if (debug_delegate_ != nullptr) { |
380 debug_delegate_->OnSpuriousPacketRetransmition( | 381 debug_delegate_->OnSpuriousPacketRetransmition( |
381 retransmit_info.transmission_type, | 382 retransmit_info.transmission_type, |
382 retransmit_info.bytes_sent); | 383 retransmit_info.bytes_sent); |
383 } | 384 } |
384 } | 385 } |
385 } | 386 } |
386 | 387 |
387 bool QuicSentPacketManager::HasPendingRetransmissions() const { | 388 bool QuicSentPacketManager::HasPendingRetransmissions() const { |
388 return !pending_retransmissions_.empty(); | 389 return !pending_retransmissions_.empty(); |
389 } | 390 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 void QuicSentPacketManager::MarkPacketRevived( | 422 void QuicSentPacketManager::MarkPacketRevived( |
422 QuicPacketSequenceNumber sequence_number, | 423 QuicPacketSequenceNumber sequence_number, |
423 QuicTime::Delta delta_largest_observed) { | 424 QuicTime::Delta delta_largest_observed) { |
424 if (!unacked_packets_.IsUnacked(sequence_number)) { | 425 if (!unacked_packets_.IsUnacked(sequence_number)) { |
425 return; | 426 return; |
426 } | 427 } |
427 | 428 |
428 const TransmissionInfo& transmission_info = | 429 const TransmissionInfo& transmission_info = |
429 unacked_packets_.GetTransmissionInfo(sequence_number); | 430 unacked_packets_.GetTransmissionInfo(sequence_number); |
430 QuicPacketSequenceNumber newest_transmission = | 431 QuicPacketSequenceNumber newest_transmission = |
431 transmission_info.all_transmissions == NULL ? | 432 transmission_info.all_transmissions == nullptr |
432 sequence_number : *transmission_info.all_transmissions->rbegin(); | 433 ? sequence_number |
| 434 : *transmission_info.all_transmissions->rbegin(); |
433 // This packet has been revived at the receiver. If we were going to | 435 // This packet has been revived at the receiver. If we were going to |
434 // retransmit it, do not retransmit it anymore. | 436 // retransmit it, do not retransmit it anymore. |
435 pending_retransmissions_.erase(newest_transmission); | 437 pending_retransmissions_.erase(newest_transmission); |
436 | 438 |
437 // The AckNotifierManager needs to be notified for revived packets, | 439 // The AckNotifierManager needs to be notified for revived packets, |
438 // since it indicates the packet arrived from the appliction's perspective. | 440 // since it indicates the packet arrived from the appliction's perspective. |
439 if (transmission_info.retransmittable_frames) { | 441 if (transmission_info.retransmittable_frames) { |
440 ack_notifier_manager_.OnPacketAcked( | 442 ack_notifier_manager_.OnPacketAcked( |
441 newest_transmission, delta_largest_observed); | 443 newest_transmission, delta_largest_observed); |
442 } | 444 } |
443 | 445 |
444 unacked_packets_.RemoveRetransmittability(sequence_number); | 446 unacked_packets_.RemoveRetransmittability(sequence_number); |
445 } | 447 } |
446 | 448 |
447 void QuicSentPacketManager::MarkPacketHandled( | 449 void QuicSentPacketManager::MarkPacketHandled( |
448 QuicPacketSequenceNumber sequence_number, | 450 QuicPacketSequenceNumber sequence_number, |
449 const TransmissionInfo& info, | 451 const TransmissionInfo& info, |
450 QuicTime::Delta delta_largest_observed) { | 452 QuicTime::Delta delta_largest_observed) { |
451 QuicPacketSequenceNumber newest_transmission = | 453 QuicPacketSequenceNumber newest_transmission = |
452 info.all_transmissions == NULL ? | 454 info.all_transmissions == nullptr ? sequence_number |
453 sequence_number : *info.all_transmissions->rbegin(); | 455 : *info.all_transmissions->rbegin(); |
454 // Remove the most recent packet, if it is pending retransmission. | 456 // Remove the most recent packet, if it is pending retransmission. |
455 pending_retransmissions_.erase(newest_transmission); | 457 pending_retransmissions_.erase(newest_transmission); |
456 | 458 |
457 // The AckNotifierManager needs to be notified about the most recent | 459 // The AckNotifierManager needs to be notified about the most recent |
458 // transmission, since that's the one only one it tracks. | 460 // transmission, since that's the one only one it tracks. |
459 ack_notifier_manager_.OnPacketAcked(newest_transmission, | 461 ack_notifier_manager_.OnPacketAcked(newest_transmission, |
460 delta_largest_observed); | 462 delta_largest_observed); |
461 if (newest_transmission != sequence_number) { | 463 if (newest_transmission != sequence_number) { |
462 RecordSpuriousRetransmissions(*info.all_transmissions, sequence_number); | 464 RecordSpuriousRetransmissions(*info.all_transmissions, sequence_number); |
463 // Remove the most recent packet from flight if it's a crypto handshake | 465 // Remove the most recent packet from flight if it's a crypto handshake |
464 // packet, since they won't be acked now that one has been processed. | 466 // packet, since they won't be acked now that one has been processed. |
465 // Other crypto handshake packets won't be in flight, only the newest | 467 // Other crypto handshake packets won't be in flight, only the newest |
466 // transmission of a crypto packet is in flight at once. | 468 // transmission of a crypto packet is in flight at once. |
467 // TODO(ianswett): Instead of handling all crypto packets special, | 469 // TODO(ianswett): Instead of handling all crypto packets special, |
468 // only handle NULL encrypted packets in a special way. | 470 // only handle nullptr encrypted packets in a special way. |
469 if (HasCryptoHandshake( | 471 if (HasCryptoHandshake( |
470 unacked_packets_.GetTransmissionInfo(newest_transmission))) { | 472 unacked_packets_.GetTransmissionInfo(newest_transmission))) { |
471 unacked_packets_.RemoveFromInFlight(newest_transmission); | 473 unacked_packets_.RemoveFromInFlight(newest_transmission); |
472 } | 474 } |
473 } | 475 } |
474 | 476 |
475 unacked_packets_.RemoveFromInFlight(sequence_number); | 477 unacked_packets_.RemoveFromInFlight(sequence_number); |
476 unacked_packets_.RemoveRetransmittability(sequence_number); | 478 unacked_packets_.RemoveRetransmittability(sequence_number); |
477 } | 479 } |
478 | 480 |
(...skipping 15 matching lines...) Expand all Loading... |
494 SerializedPacket* serialized_packet, | 496 SerializedPacket* serialized_packet, |
495 QuicPacketSequenceNumber original_sequence_number, | 497 QuicPacketSequenceNumber original_sequence_number, |
496 QuicTime sent_time, | 498 QuicTime sent_time, |
497 QuicByteCount bytes, | 499 QuicByteCount bytes, |
498 TransmissionType transmission_type, | 500 TransmissionType transmission_type, |
499 HasRetransmittableData has_retransmittable_data) { | 501 HasRetransmittableData has_retransmittable_data) { |
500 QuicPacketSequenceNumber sequence_number = serialized_packet->sequence_number; | 502 QuicPacketSequenceNumber sequence_number = serialized_packet->sequence_number; |
501 DCHECK_LT(0u, sequence_number); | 503 DCHECK_LT(0u, sequence_number); |
502 DCHECK(!unacked_packets_.IsUnacked(sequence_number)); | 504 DCHECK(!unacked_packets_.IsUnacked(sequence_number)); |
503 LOG_IF(DFATAL, bytes == 0) << "Cannot send empty packets."; | 505 LOG_IF(DFATAL, bytes == 0) << "Cannot send empty packets."; |
504 if (debug_delegate_ != NULL) { | 506 if (debug_delegate_ != nullptr) { |
505 debug_delegate_->OnSentPacket(*serialized_packet, | 507 debug_delegate_->OnSentPacket(*serialized_packet, |
506 original_sequence_number, | 508 original_sequence_number, |
507 sent_time, | 509 sent_time, |
508 bytes, | 510 bytes, |
509 transmission_type); | 511 transmission_type); |
510 } | 512 } |
511 | 513 |
512 if (original_sequence_number == 0) { | 514 if (original_sequence_number == 0) { |
513 if (serialized_packet->retransmittable_frames) { | 515 if (serialized_packet->retransmittable_frames) { |
514 ack_notifier_manager_.OnSerializedPacket(*serialized_packet); | 516 ack_notifier_manager_.OnSerializedPacket(*serialized_packet); |
515 } | 517 } |
516 unacked_packets_.AddPacket(*serialized_packet); | 518 unacked_packets_.AddPacket(*serialized_packet); |
517 serialized_packet->retransmittable_frames = NULL; | 519 serialized_packet->retransmittable_frames = nullptr; |
518 } else { | 520 } else { |
519 OnRetransmittedPacket(original_sequence_number, sequence_number); | 521 OnRetransmittedPacket(original_sequence_number, sequence_number); |
520 } | 522 } |
521 | 523 |
522 if (pending_timer_transmission_count_ > 0) { | 524 if (pending_timer_transmission_count_ > 0) { |
523 --pending_timer_transmission_count_; | 525 --pending_timer_transmission_count_; |
524 } | 526 } |
525 | 527 |
526 if (unacked_packets_.bytes_in_flight() == 0) { | 528 if (unacked_packets_.bytes_in_flight() == 0) { |
527 // TODO(ianswett): Consider being less aggressive to force a new | 529 // TODO(ianswett): Consider being less aggressive to force a new |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 DCHECK_EQ(HANDSHAKE_MODE, GetRetransmissionMode()); | 586 DCHECK_EQ(HANDSHAKE_MODE, GetRetransmissionMode()); |
585 // TODO(ianswett): Typical TCP implementations only retransmit 5 times. | 587 // TODO(ianswett): Typical TCP implementations only retransmit 5 times. |
586 consecutive_crypto_retransmission_count_ = | 588 consecutive_crypto_retransmission_count_ = |
587 min(kMaxHandshakeRetransmissionBackoffs, | 589 min(kMaxHandshakeRetransmissionBackoffs, |
588 consecutive_crypto_retransmission_count_ + 1); | 590 consecutive_crypto_retransmission_count_ + 1); |
589 bool packet_retransmitted = false; | 591 bool packet_retransmitted = false; |
590 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked(); | 592 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked(); |
591 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 593 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
592 it != unacked_packets_.end(); ++it, ++sequence_number) { | 594 it != unacked_packets_.end(); ++it, ++sequence_number) { |
593 // Only retransmit frames which are in flight, and therefore have been sent. | 595 // Only retransmit frames which are in flight, and therefore have been sent. |
594 if (!it->in_flight || it->retransmittable_frames == NULL || | 596 if (!it->in_flight || it->retransmittable_frames == nullptr || |
595 it->retransmittable_frames->HasCryptoHandshake() != IS_HANDSHAKE) { | 597 it->retransmittable_frames->HasCryptoHandshake() != IS_HANDSHAKE) { |
596 continue; | 598 continue; |
597 } | 599 } |
598 packet_retransmitted = true; | 600 packet_retransmitted = true; |
599 MarkForRetransmission(sequence_number, HANDSHAKE_RETRANSMISSION); | 601 MarkForRetransmission(sequence_number, HANDSHAKE_RETRANSMISSION); |
600 ++pending_timer_transmission_count_; | 602 ++pending_timer_transmission_count_; |
601 } | 603 } |
602 DCHECK(packet_retransmitted) << "No crypto packets found to retransmit."; | 604 DCHECK(packet_retransmitted) << "No crypto packets found to retransmit."; |
603 } | 605 } |
604 | 606 |
605 bool QuicSentPacketManager::MaybeRetransmitTailLossProbe() { | 607 bool QuicSentPacketManager::MaybeRetransmitTailLossProbe() { |
606 if (pending_timer_transmission_count_ == 0) { | 608 if (pending_timer_transmission_count_ == 0) { |
607 return false; | 609 return false; |
608 } | 610 } |
609 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked(); | 611 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked(); |
610 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 612 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
611 it != unacked_packets_.end(); ++it, ++sequence_number) { | 613 it != unacked_packets_.end(); ++it, ++sequence_number) { |
612 // Only retransmit frames which are in flight, and therefore have been sent. | 614 // Only retransmit frames which are in flight, and therefore have been sent. |
613 if (!it->in_flight || it->retransmittable_frames == NULL) { | 615 if (!it->in_flight || it->retransmittable_frames == nullptr) { |
614 continue; | 616 continue; |
615 } | 617 } |
616 if (!handshake_confirmed_) { | 618 if (!handshake_confirmed_) { |
617 DCHECK_NE(IS_HANDSHAKE, it->retransmittable_frames->HasCryptoHandshake()); | 619 DCHECK_NE(IS_HANDSHAKE, it->retransmittable_frames->HasCryptoHandshake()); |
618 } | 620 } |
619 MarkForRetransmission(sequence_number, TLP_RETRANSMISSION); | 621 MarkForRetransmission(sequence_number, TLP_RETRANSMISSION); |
620 return true; | 622 return true; |
621 } | 623 } |
622 DLOG(FATAL) | 624 DLOG(FATAL) |
623 << "No retransmittable packets, so RetransmitOldestPacket failed."; | 625 << "No retransmittable packets, so RetransmitOldestPacket failed."; |
624 return false; | 626 return false; |
625 } | 627 } |
626 | 628 |
627 void QuicSentPacketManager::RetransmitAllPackets() { | 629 void QuicSentPacketManager::RetransmitAllPackets() { |
628 DVLOG(1) << "RetransmitAllPackets() called with " | 630 DVLOG(1) << "RetransmitAllPackets() called with " |
629 << unacked_packets_.GetNumUnackedPacketsDebugOnly() | 631 << unacked_packets_.GetNumUnackedPacketsDebugOnly() |
630 << " unacked packets."; | 632 << " unacked packets."; |
631 // Request retransmission of all retransmittable packets when the RTO | 633 // Request retransmission of all retransmittable packets when the RTO |
632 // fires, and let the congestion manager decide how many to send | 634 // fires, and let the congestion manager decide how many to send |
633 // immediately and the remaining packets will be queued. | 635 // immediately and the remaining packets will be queued. |
634 // Abandon any non-retransmittable packets that are sufficiently old. | 636 // Abandon any non-retransmittable packets that are sufficiently old. |
635 bool packets_retransmitted = false; | 637 bool packets_retransmitted = false; |
636 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked(); | 638 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked(); |
637 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 639 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
638 it != unacked_packets_.end(); ++it, ++sequence_number) { | 640 it != unacked_packets_.end(); ++it, ++sequence_number) { |
639 if (it->retransmittable_frames != NULL) { | 641 if (it->retransmittable_frames != nullptr) { |
640 packets_retransmitted = true; | 642 packets_retransmitted = true; |
641 MarkForRetransmission(sequence_number, RTO_RETRANSMISSION); | 643 MarkForRetransmission(sequence_number, RTO_RETRANSMISSION); |
642 } else { | 644 } else { |
643 unacked_packets_.RemoveFromInFlight(sequence_number); | 645 unacked_packets_.RemoveFromInFlight(sequence_number); |
644 } | 646 } |
645 } | 647 } |
646 | 648 |
647 send_algorithm_->OnRetransmissionTimeout(packets_retransmitted); | 649 send_algorithm_->OnRetransmissionTimeout(packets_retransmitted); |
648 if (packets_retransmitted) { | 650 if (packets_retransmitted) { |
649 if (consecutive_rto_count_ == 0) { | 651 if (consecutive_rto_count_ == 0) { |
650 first_rto_transmission_ = unacked_packets_.largest_sent_packet() + 1; | 652 first_rto_transmission_ = unacked_packets_.largest_sent_packet() + 1; |
651 } | 653 } |
652 ++consecutive_rto_count_; | 654 ++consecutive_rto_count_; |
653 } | 655 } |
654 | 656 |
655 if (network_change_visitor_ != NULL) { | 657 if (network_change_visitor_ != nullptr) { |
656 network_change_visitor_->OnCongestionWindowChange(GetCongestionWindow()); | 658 network_change_visitor_->OnCongestionWindowChange(GetCongestionWindow()); |
657 } | 659 } |
658 } | 660 } |
659 | 661 |
660 QuicSentPacketManager::RetransmissionTimeoutMode | 662 QuicSentPacketManager::RetransmissionTimeoutMode |
661 QuicSentPacketManager::GetRetransmissionMode() const { | 663 QuicSentPacketManager::GetRetransmissionMode() const { |
662 DCHECK(unacked_packets_.HasInFlightPackets()); | 664 DCHECK(unacked_packets_.HasInFlightPackets()); |
663 if (!handshake_confirmed_ && unacked_packets_.HasPendingCryptoPackets()) { | 665 if (!handshake_confirmed_ && unacked_packets_.HasPendingCryptoPackets()) { |
664 return HANDSHAKE_MODE; | 666 return HANDSHAKE_MODE; |
665 } | 667 } |
(...skipping 26 matching lines...) Expand all Loading... |
692 QuicPacketSequenceNumber sequence_number = *it; | 694 QuicPacketSequenceNumber sequence_number = *it; |
693 const TransmissionInfo& transmission_info = | 695 const TransmissionInfo& transmission_info = |
694 unacked_packets_.GetTransmissionInfo(sequence_number); | 696 unacked_packets_.GetTransmissionInfo(sequence_number); |
695 // TODO(ianswett): If it's expected the FEC packet may repair the loss, it | 697 // TODO(ianswett): If it's expected the FEC packet may repair the loss, it |
696 // should be recorded as a loss to the send algorithm, but not retransmitted | 698 // should be recorded as a loss to the send algorithm, but not retransmitted |
697 // until it's known whether the FEC packet arrived. | 699 // until it's known whether the FEC packet arrived. |
698 ++stats_->packets_lost; | 700 ++stats_->packets_lost; |
699 packets_lost_.push_back(make_pair(sequence_number, transmission_info)); | 701 packets_lost_.push_back(make_pair(sequence_number, transmission_info)); |
700 DVLOG(1) << ENDPOINT << "Lost packet " << sequence_number; | 702 DVLOG(1) << ENDPOINT << "Lost packet " << sequence_number; |
701 | 703 |
702 if (transmission_info.retransmittable_frames != NULL) { | 704 if (transmission_info.retransmittable_frames != nullptr) { |
703 MarkForRetransmission(sequence_number, LOSS_RETRANSMISSION); | 705 MarkForRetransmission(sequence_number, LOSS_RETRANSMISSION); |
704 } else { | 706 } else { |
705 // Since we will not retransmit this, we need to remove it from | 707 // Since we will not retransmit this, we need to remove it from |
706 // unacked_packets_. This is either the current transmission of | 708 // unacked_packets_. This is either the current transmission of |
707 // a packet whose previous transmission has been acked, a packet that has | 709 // a packet whose previous transmission has been acked, a packet that has |
708 // been TLP retransmitted, or an FEC packet. | 710 // been TLP retransmitted, or an FEC packet. |
709 unacked_packets_.RemoveFromInFlight(sequence_number); | 711 unacked_packets_.RemoveFromInFlight(sequence_number); |
710 } | 712 } |
711 } | 713 } |
712 } | 714 } |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
878 | 880 |
879 // Set up a pacing sender with a 5 millisecond alarm granularity. | 881 // Set up a pacing sender with a 5 millisecond alarm granularity. |
880 using_pacing_ = true; | 882 using_pacing_ = true; |
881 send_algorithm_.reset( | 883 send_algorithm_.reset( |
882 new PacingSender(send_algorithm_.release(), | 884 new PacingSender(send_algorithm_.release(), |
883 QuicTime::Delta::FromMilliseconds(5), | 885 QuicTime::Delta::FromMilliseconds(5), |
884 kInitialUnpacedBurst)); | 886 kInitialUnpacedBurst)); |
885 } | 887 } |
886 | 888 |
887 } // namespace net | 889 } // namespace net |
OLD | NEW |