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

Side by Side Diff: net/quic/quic_sent_packet_manager.cc

Issue 514033002: Optimize QuicUnackedPacketMap by changing from a LinkedHashMap to a (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@unit_test_for_empty_packet_74041239
Patch Set: Created 6 years, 3 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
« no previous file with comments | « net/quic/quic_sent_packet_manager.h ('k') | net/quic/quic_sent_packet_manager_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 UpdatePacketInformationReceivedByPeer(ack_frame); 190 UpdatePacketInformationReceivedByPeer(ack_frame);
191 // We rely on delta_time_largest_observed to compute an RTT estimate, so 191 // We rely on delta_time_largest_observed to compute an RTT estimate, so
192 // we only update rtt when the largest observed gets acked. 192 // we only update rtt when the largest observed gets acked.
193 bool largest_observed_acked = MaybeUpdateRTT(ack_frame, ack_receive_time); 193 bool largest_observed_acked = MaybeUpdateRTT(ack_frame, ack_receive_time);
194 DCHECK_GE(ack_frame.largest_observed, unacked_packets_.largest_observed()); 194 DCHECK_GE(ack_frame.largest_observed, unacked_packets_.largest_observed());
195 unacked_packets_.IncreaseLargestObserved(ack_frame.largest_observed); 195 unacked_packets_.IncreaseLargestObserved(ack_frame.largest_observed);
196 196
197 HandleAckForSentPackets(ack_frame); 197 HandleAckForSentPackets(ack_frame);
198 InvokeLossDetection(ack_receive_time); 198 InvokeLossDetection(ack_receive_time);
199 MaybeInvokeCongestionEvent(largest_observed_acked, bytes_in_flight); 199 MaybeInvokeCongestionEvent(largest_observed_acked, bytes_in_flight);
200 unacked_packets_.RemoveObsoletePackets();
200 201
201 sustained_bandwidth_recorder_.RecordEstimate( 202 sustained_bandwidth_recorder_.RecordEstimate(
202 send_algorithm_->InRecovery(), 203 send_algorithm_->InRecovery(),
203 send_algorithm_->InSlowStart(), 204 send_algorithm_->InSlowStart(),
204 send_algorithm_->BandwidthEstimate(), 205 send_algorithm_->BandwidthEstimate(),
205 ack_receive_time, 206 ack_receive_time,
206 clock_->WallNow(), 207 clock_->WallNow(),
207 rtt_stats_.SmoothedRtt()); 208 rtt_stats_.SmoothedRtt());
208 209
209 // If we have received a truncated ack, then we need to clear out some 210 // If we have received a truncated ack, then we need to clear out some
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 network_change_visitor_->OnCongestionWindowChange(GetCongestionWindow()); 254 network_change_visitor_->OnCongestionWindowChange(GetCongestionWindow());
254 } 255 }
255 } 256 }
256 257
257 void QuicSentPacketManager::HandleAckForSentPackets( 258 void QuicSentPacketManager::HandleAckForSentPackets(
258 const QuicAckFrame& ack_frame) { 259 const QuicAckFrame& ack_frame) {
259 // Go through the packets we have not received an ack for and see if this 260 // Go through the packets we have not received an ack for and see if this
260 // incoming_ack shows they've been seen by the peer. 261 // incoming_ack shows they've been seen by the peer.
261 QuicTime::Delta delta_largest_observed = 262 QuicTime::Delta delta_largest_observed =
262 ack_frame.delta_time_largest_observed; 263 ack_frame.delta_time_largest_observed;
263 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); 264 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked();
264 while (it != unacked_packets_.end()) { 265 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
265 QuicPacketSequenceNumber sequence_number = it->first; 266 it != unacked_packets_.end(); ++it, ++sequence_number) {
266 if (sequence_number > ack_frame.largest_observed) { 267 if (sequence_number > ack_frame.largest_observed) {
267 // These packets are still in flight. 268 // These packets are still in flight.
268 break; 269 break;
269 } 270 }
270 271
271 if (IsAwaitingPacket(ack_frame, sequence_number)) { 272 if (ContainsKey(ack_frame.missing_packets, sequence_number)) {
272 // Consider it multiple nacks when there is a gap between the missing 273 // Consider it multiple nacks when there is a gap between the missing
273 // packet and the largest observed, since the purpose of a nack 274 // packet and the largest observed, since the purpose of a nack
274 // threshold is to tolerate re-ordering. This handles both StretchAcks 275 // threshold is to tolerate re-ordering. This handles both StretchAcks
275 // and Forward Acks. 276 // and Forward Acks.
276 // The nack count only increases when the largest observed increases. 277 // The nack count only increases when the largest observed increases.
277 size_t min_nacks = ack_frame.largest_observed - sequence_number; 278 size_t min_nacks = ack_frame.largest_observed - sequence_number;
278 // Truncated acks can nack the largest observed, so use a min of 1. 279 // Truncated acks can nack the largest observed, so use a min of 1.
279 if (min_nacks == 0) { 280 if (min_nacks == 0) {
280 min_nacks = 1; 281 min_nacks = 1;
281 } 282 }
282 unacked_packets_.NackPacket(sequence_number, min_nacks); 283 unacked_packets_.NackPacket(sequence_number, min_nacks);
283 ++it;
284 continue; 284 continue;
285 } 285 }
286 // Packet was acked, so remove it from our unacked packet list. 286 // Packet was acked, so remove it from our unacked packet list.
287 DVLOG(1) << ENDPOINT << "Got an ack for packet " << sequence_number; 287 DVLOG(1) << ENDPOINT << "Got an ack for packet " << sequence_number;
288 // If data is associated with the most recent transmission of this 288 // If data is associated with the most recent transmission of this
289 // packet, then inform the caller. 289 // packet, then inform the caller.
290 if (it->second.in_flight) { 290 if (it->in_flight) {
291 packets_acked_[sequence_number] = it->second; 291 packets_acked_[sequence_number] = *it;
292 } 292 }
293 it = MarkPacketHandled(it, delta_largest_observed); 293 MarkPacketHandled(sequence_number, *it, delta_largest_observed);
294 } 294 }
295 295
296 // Discard any retransmittable frames associated with revived packets. 296 // Discard any retransmittable frames associated with revived packets.
297 for (SequenceNumberSet::const_iterator revived_it = 297 for (SequenceNumberSet::const_iterator revived_it =
298 ack_frame.revived_packets.begin(); 298 ack_frame.revived_packets.begin();
299 revived_it != ack_frame.revived_packets.end(); ++revived_it) { 299 revived_it != ack_frame.revived_packets.end(); ++revived_it) {
300 MarkPacketRevived(*revived_it, delta_largest_observed); 300 MarkPacketRevived(*revived_it, delta_largest_observed);
301 } 301 }
302 } 302 }
303 303
304 bool QuicSentPacketManager::HasRetransmittableFrames( 304 bool QuicSentPacketManager::HasRetransmittableFrames(
305 QuicPacketSequenceNumber sequence_number) const { 305 QuicPacketSequenceNumber sequence_number) const {
306 return unacked_packets_.HasRetransmittableFrames(sequence_number); 306 return unacked_packets_.HasRetransmittableFrames(sequence_number);
307 } 307 }
308 308
309 void QuicSentPacketManager::RetransmitUnackedPackets( 309 void QuicSentPacketManager::RetransmitUnackedPackets(
310 RetransmissionType retransmission_type) { 310 RetransmissionType retransmission_type) {
311 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); 311 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked();
312 while (it != unacked_packets_.end()) { 312 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
313 const RetransmittableFrames* frames = it->second.retransmittable_frames; 313 it != unacked_packets_.end(); ++it, ++sequence_number) {
314 const RetransmittableFrames* frames = it->retransmittable_frames;
314 // TODO(ianswett): Consider adding a new retransmission type which removes 315 // TODO(ianswett): Consider adding a new retransmission type which removes
315 // all these old packets from unacked and retransmits them as new sequence 316 // all these old packets from unacked and retransmits them as new sequence
316 // numbers with no connection to the previous ones. 317 // numbers with no connection to the previous ones.
317 if (frames != NULL && (retransmission_type == ALL_PACKETS || 318 if (frames != NULL && (retransmission_type == ALL_PACKETS ||
318 frames->encryption_level() == ENCRYPTION_INITIAL)) { 319 frames->encryption_level() == ENCRYPTION_INITIAL)) {
319 MarkForRetransmission(it->first, ALL_UNACKED_RETRANSMISSION); 320 MarkForRetransmission(sequence_number, ALL_UNACKED_RETRANSMISSION);
320 } 321 }
321 ++it;
322 } 322 }
323 } 323 }
324 324
325 void QuicSentPacketManager::NeuterUnencryptedPackets() { 325 void QuicSentPacketManager::NeuterUnencryptedPackets() {
326 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); 326 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked();
327 while (it != unacked_packets_.end()) { 327 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
328 const RetransmittableFrames* frames = it->second.retransmittable_frames; 328 it != unacked_packets_.end(); ++it, ++sequence_number) {
329 QuicPacketSequenceNumber sequence_number = it->first; 329 const RetransmittableFrames* frames = it->retransmittable_frames;
330 ++it;
331 if (frames != NULL && frames->encryption_level() == ENCRYPTION_NONE) { 330 if (frames != NULL && frames->encryption_level() == ENCRYPTION_NONE) {
332 // Once you're forward secure, no unencrypted packets will be sent, crypto 331 // Once you're forward secure, no unencrypted packets will be sent, crypto
333 // or otherwise. Unencrypted packets are neutered and abandoned, to ensure 332 // or otherwise. Unencrypted packets are neutered and abandoned, to ensure
334 // they are not retransmitted or considered lost from a congestion control 333 // they are not retransmitted or considered lost from a congestion control
335 // perspective. 334 // perspective.
336 pending_retransmissions_.erase(sequence_number); 335 pending_retransmissions_.erase(sequence_number);
337 unacked_packets_.RemoveFromInFlight(sequence_number); 336 unacked_packets_.RemoveFromInFlight(sequence_number);
338 // RemoveRetransmittibility is safe because only the newest sequence
339 // number can have frames.
340 unacked_packets_.RemoveRetransmittability(sequence_number); 337 unacked_packets_.RemoveRetransmittability(sequence_number);
341 } 338 }
342 } 339 }
343 } 340 }
344 341
345 void QuicSentPacketManager::MarkForRetransmission( 342 void QuicSentPacketManager::MarkForRetransmission(
346 QuicPacketSequenceNumber sequence_number, 343 QuicPacketSequenceNumber sequence_number,
347 TransmissionType transmission_type) { 344 TransmissionType transmission_type) {
348 const TransmissionInfo& transmission_info = 345 const TransmissionInfo& transmission_info =
349 unacked_packets_.GetTransmissionInfo(sequence_number); 346 unacked_packets_.GetTransmissionInfo(sequence_number);
(...skipping 23 matching lines...) Expand all
373 it != pending_retransmissions_.end(); ++it) { 370 it != pending_retransmissions_.end(); ++it) {
374 DCHECK_EQ(it->second, RTO_RETRANSMISSION); 371 DCHECK_EQ(it->second, RTO_RETRANSMISSION);
375 unacked_packets_.RestoreInFlight(it->first); 372 unacked_packets_.RestoreInFlight(it->first);
376 } 373 }
377 pending_retransmissions_.clear(); 374 pending_retransmissions_.clear();
378 send_algorithm_->RevertRetransmissionTimeout(); 375 send_algorithm_->RevertRetransmissionTimeout();
379 first_rto_transmission_ = 0; 376 first_rto_transmission_ = 0;
380 ++stats_->spurious_rto_count; 377 ++stats_->spurious_rto_count;
381 } 378 }
382 for (SequenceNumberSet::const_iterator 379 for (SequenceNumberSet::const_iterator
383 it = all_transmissions.upper_bound(acked_sequence_number), 380 it = all_transmissions.upper_bound(acked_sequence_number),
384 end = all_transmissions.end(); 381 end = all_transmissions.end();
385 it != end; 382 it != end;
386 ++it) { 383 ++it) {
387 const TransmissionInfo& retransmit_info = 384 const TransmissionInfo& retransmit_info =
388 unacked_packets_.GetTransmissionInfo(*it); 385 unacked_packets_.GetTransmissionInfo(*it);
389 386
390 stats_->bytes_spuriously_retransmitted += retransmit_info.bytes_sent; 387 stats_->bytes_spuriously_retransmitted += retransmit_info.bytes_sent;
391 ++stats_->packets_spuriously_retransmitted; 388 ++stats_->packets_spuriously_retransmitted;
392 if (debug_delegate_ != NULL) { 389 if (debug_delegate_ != NULL) {
393 debug_delegate_->OnSpuriousPacketRetransmition( 390 debug_delegate_->OnSpuriousPacketRetransmition(
394 retransmit_info.transmission_type, 391 retransmit_info.transmission_type,
395 retransmit_info.bytes_sent); 392 retransmit_info.bytes_sent);
396 } 393 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 // The AckNotifierManager needs to be notified for revived packets, 446 // The AckNotifierManager needs to be notified for revived packets,
450 // since it indicates the packet arrived from the appliction's perspective. 447 // since it indicates the packet arrived from the appliction's perspective.
451 if (transmission_info.retransmittable_frames) { 448 if (transmission_info.retransmittable_frames) {
452 ack_notifier_manager_.OnPacketAcked( 449 ack_notifier_manager_.OnPacketAcked(
453 newest_transmission, delta_largest_observed); 450 newest_transmission, delta_largest_observed);
454 } 451 }
455 452
456 unacked_packets_.RemoveRetransmittability(sequence_number); 453 unacked_packets_.RemoveRetransmittability(sequence_number);
457 } 454 }
458 455
459 QuicUnackedPacketMap::const_iterator QuicSentPacketManager::MarkPacketHandled( 456 void QuicSentPacketManager::MarkPacketHandled(
460 QuicUnackedPacketMap::const_iterator it, 457 QuicPacketSequenceNumber sequence_number,
458 const TransmissionInfo& info,
461 QuicTime::Delta delta_largest_observed) { 459 QuicTime::Delta delta_largest_observed) {
462 LOG_IF(DFATAL, it == unacked_packets_.end())
463 << "MarkPacketHandled must be passed a valid iterator entry.";
464 const QuicPacketSequenceNumber sequence_number = it->first;
465 const TransmissionInfo& transmission_info = it->second;
466
467 QuicPacketSequenceNumber newest_transmission = 460 QuicPacketSequenceNumber newest_transmission =
468 *transmission_info.all_transmissions->rbegin(); 461 *info.all_transmissions->rbegin();
469 // Remove the most recent packet, if it is pending retransmission. 462 // Remove the most recent packet, if it is pending retransmission.
470 pending_retransmissions_.erase(newest_transmission); 463 pending_retransmissions_.erase(newest_transmission);
471 464
472 // Notify observers about the ACKed packet. 465 // Notify observers about the ACKed packet.
473 { 466 {
474 // The AckNotifierManager needs to be notified about the most recent 467 // The AckNotifierManager needs to be notified about the most recent
475 // transmission, since that's the one only one it tracks. 468 // transmission, since that's the one only one it tracks.
476 ack_notifier_manager_.OnPacketAcked(newest_transmission, 469 ack_notifier_manager_.OnPacketAcked(newest_transmission,
477 delta_largest_observed); 470 delta_largest_observed);
478 if (newest_transmission != sequence_number) { 471 if (newest_transmission != sequence_number) {
479 RecordSpuriousRetransmissions(*transmission_info.all_transmissions, 472 RecordSpuriousRetransmissions(*info.all_transmissions, sequence_number);
480 sequence_number);
481 } 473 }
482 } 474 }
483 475
484 // Two cases for MarkPacketHandled: 476 // Two cases for MarkPacketHandled:
485 // 1) Handle the most recent or a crypto packet, so remove all transmissions. 477 // 1) Handle the most recent or a crypto packet, so remove all transmissions.
486 // 2) Handle old transmission, keep all other pending transmissions, 478 // 2) Handle old transmission, keep all other pending transmissions,
487 // but disassociate them from one another. 479 // but disassociate them from one another.
488 480
489 // If it's a crypto handshake packet, discard it and all retransmissions, 481 // If it's a crypto handshake packet, discard it and all retransmissions,
490 // since they won't be acked now that one has been processed. 482 // since they won't be acked now that one has been processed.
491 // TODO(ianswett): Instead of handling all crypto packets in a special way, 483 // TODO(ianswett): Instead of handling all crypto packets in a special way,
492 // only handle NULL encrypted packets in a special way. 484 // only handle NULL encrypted packets in a special way.
493 if (HasCryptoHandshake( 485 if (HasCryptoHandshake(
494 unacked_packets_.GetTransmissionInfo(newest_transmission))) { 486 unacked_packets_.GetTransmissionInfo(newest_transmission))) {
495 unacked_packets_.RemoveFromInFlight(newest_transmission); 487 unacked_packets_.RemoveFromInFlight(newest_transmission);
496 } 488 }
497 unacked_packets_.RemoveFromInFlight(sequence_number); 489 unacked_packets_.RemoveFromInFlight(sequence_number);
498 unacked_packets_.RemoveRetransmittability(sequence_number); 490 unacked_packets_.RemoveRetransmittability(sequence_number);
499
500 QuicUnackedPacketMap::const_iterator next_unacked = unacked_packets_.begin();
501 while (next_unacked != unacked_packets_.end() &&
502 next_unacked->first <= sequence_number) {
503 ++next_unacked;
504 }
505 return next_unacked;
506 } 491 }
507 492
508 bool QuicSentPacketManager::IsUnacked( 493 bool QuicSentPacketManager::IsUnacked(
509 QuicPacketSequenceNumber sequence_number) const { 494 QuicPacketSequenceNumber sequence_number) const {
510 return unacked_packets_.IsUnacked(sequence_number); 495 return unacked_packets_.IsUnacked(sequence_number);
511 } 496 }
512 497
513 bool QuicSentPacketManager::HasUnackedPackets() const { 498 bool QuicSentPacketManager::HasUnackedPackets() const {
514 return unacked_packets_.HasUnackedPackets(); 499 return unacked_packets_.HasUnackedPackets();
515 } 500 }
516 501
517 QuicPacketSequenceNumber 502 QuicPacketSequenceNumber
518 QuicSentPacketManager::GetLeastUnackedSentPacket() const { 503 QuicSentPacketManager::GetLeastUnackedSentPacket() const {
519 return unacked_packets_.GetLeastUnackedSentPacket(); 504 return unacked_packets_.GetLeastUnacked();
520 } 505 }
521 506
522 bool QuicSentPacketManager::OnPacketSent( 507 bool QuicSentPacketManager::OnPacketSent(
523 QuicPacketSequenceNumber sequence_number, 508 QuicPacketSequenceNumber sequence_number,
524 QuicTime sent_time, 509 QuicTime sent_time,
525 QuicByteCount bytes, 510 QuicByteCount bytes,
526 TransmissionType transmission_type, 511 TransmissionType transmission_type,
527 HasRetransmittableData has_retransmittable_data) { 512 HasRetransmittableData has_retransmittable_data) {
528 DCHECK_LT(0u, sequence_number); 513 DCHECK_LT(0u, sequence_number);
529 DCHECK(unacked_packets_.IsUnacked(sequence_number)); 514 DCHECK(unacked_packets_.IsUnacked(sequence_number));
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 } 579 }
595 } 580 }
596 581
597 void QuicSentPacketManager::RetransmitCryptoPackets() { 582 void QuicSentPacketManager::RetransmitCryptoPackets() {
598 DCHECK_EQ(HANDSHAKE_MODE, GetRetransmissionMode()); 583 DCHECK_EQ(HANDSHAKE_MODE, GetRetransmissionMode());
599 // TODO(ianswett): Typical TCP implementations only retransmit 5 times. 584 // TODO(ianswett): Typical TCP implementations only retransmit 5 times.
600 consecutive_crypto_retransmission_count_ = 585 consecutive_crypto_retransmission_count_ =
601 min(kMaxHandshakeRetransmissionBackoffs, 586 min(kMaxHandshakeRetransmissionBackoffs,
602 consecutive_crypto_retransmission_count_ + 1); 587 consecutive_crypto_retransmission_count_ + 1);
603 bool packet_retransmitted = false; 588 bool packet_retransmitted = false;
589 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked();
604 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); 590 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
605 it != unacked_packets_.end(); ++it) { 591 it != unacked_packets_.end(); ++it, ++sequence_number) {
606 QuicPacketSequenceNumber sequence_number = it->first;
607 const RetransmittableFrames* frames = it->second.retransmittable_frames;
608 // Only retransmit frames which are in flight, and therefore have been sent. 592 // Only retransmit frames which are in flight, and therefore have been sent.
609 if (!it->second.in_flight || frames == NULL || 593 if (!it->in_flight || it->retransmittable_frames == NULL ||
610 frames->HasCryptoHandshake() != IS_HANDSHAKE) { 594 it->retransmittable_frames->HasCryptoHandshake() != IS_HANDSHAKE) {
611 continue; 595 continue;
612 } 596 }
613 packet_retransmitted = true; 597 packet_retransmitted = true;
614 MarkForRetransmission(sequence_number, HANDSHAKE_RETRANSMISSION); 598 MarkForRetransmission(sequence_number, HANDSHAKE_RETRANSMISSION);
615 ++pending_timer_transmission_count_; 599 ++pending_timer_transmission_count_;
616 } 600 }
617 DCHECK(packet_retransmitted) << "No crypto packets found to retransmit."; 601 DCHECK(packet_retransmitted) << "No crypto packets found to retransmit.";
618 } 602 }
619 603
620 bool QuicSentPacketManager::MaybeRetransmitTailLossProbe() { 604 bool QuicSentPacketManager::MaybeRetransmitTailLossProbe() {
621 if (pending_timer_transmission_count_ == 0) { 605 if (pending_timer_transmission_count_ == 0) {
622 return false; 606 return false;
623 } 607 }
608 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked();
624 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); 609 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
625 it != unacked_packets_.end(); ++it) { 610 it != unacked_packets_.end(); ++it, ++sequence_number) {
626 QuicPacketSequenceNumber sequence_number = it->first;
627 const RetransmittableFrames* frames = it->second.retransmittable_frames;
628 // Only retransmit frames which are in flight, and therefore have been sent. 611 // Only retransmit frames which are in flight, and therefore have been sent.
629 if (!it->second.in_flight || frames == NULL) { 612 if (!it->in_flight || it->retransmittable_frames == NULL) {
630 continue; 613 continue;
631 } 614 }
632 if (!handshake_confirmed_) { 615 if (!handshake_confirmed_) {
633 DCHECK_NE(IS_HANDSHAKE, frames->HasCryptoHandshake()); 616 DCHECK_NE(IS_HANDSHAKE, it->retransmittable_frames->HasCryptoHandshake());
634 } 617 }
635 MarkForRetransmission(sequence_number, TLP_RETRANSMISSION); 618 MarkForRetransmission(sequence_number, TLP_RETRANSMISSION);
636 return true; 619 return true;
637 } 620 }
638 DLOG(FATAL) 621 DLOG(FATAL)
639 << "No retransmittable packets, so RetransmitOldestPacket failed."; 622 << "No retransmittable packets, so RetransmitOldestPacket failed.";
640 return false; 623 return false;
641 } 624 }
642 625
643 void QuicSentPacketManager::RetransmitAllPackets() { 626 void QuicSentPacketManager::RetransmitAllPackets() {
644 DVLOG(1) << "RetransmitAllPackets() called with " 627 DVLOG(1) << "RetransmitAllPackets() called with "
645 << unacked_packets_.GetNumUnackedPackets() << " unacked packets."; 628 << unacked_packets_.GetNumUnackedPacketsDebugOnly()
629 << " unacked packets.";
646 // Request retransmission of all retransmittable packets when the RTO 630 // Request retransmission of all retransmittable packets when the RTO
647 // fires, and let the congestion manager decide how many to send 631 // fires, and let the congestion manager decide how many to send
648 // immediately and the remaining packets will be queued. 632 // immediately and the remaining packets will be queued.
649 // Abandon any non-retransmittable packets that are sufficiently old. 633 // Abandon any non-retransmittable packets that are sufficiently old.
650 bool packets_retransmitted = false; 634 bool packets_retransmitted = false;
651 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); 635 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked();
652 while (it != unacked_packets_.end()) { 636 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
653 const RetransmittableFrames* frames = it->second.retransmittable_frames; 637 it != unacked_packets_.end(); ++it, ++sequence_number) {
654 QuicPacketSequenceNumber sequence_number = it->first; 638 if (it->retransmittable_frames != NULL) {
655 ++it;
656 if (frames != NULL) {
657 packets_retransmitted = true; 639 packets_retransmitted = true;
658 MarkForRetransmission(sequence_number, RTO_RETRANSMISSION); 640 MarkForRetransmission(sequence_number, RTO_RETRANSMISSION);
659 } else { 641 } else {
660 unacked_packets_.RemoveFromInFlight(sequence_number); 642 unacked_packets_.RemoveFromInFlight(sequence_number);
661 } 643 }
662 } 644 }
663 645
664 send_algorithm_->OnRetransmissionTimeout(packets_retransmitted); 646 send_algorithm_->OnRetransmissionTimeout(packets_retransmitted);
665 if (packets_retransmitted) { 647 if (packets_retransmitted) {
666 if (consecutive_rto_count_ == 0) { 648 if (consecutive_rto_count_ == 0) {
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 875
894 // Set up a pacing sender with a 5 millisecond alarm granularity. 876 // Set up a pacing sender with a 5 millisecond alarm granularity.
895 using_pacing_ = true; 877 using_pacing_ = true;
896 send_algorithm_.reset( 878 send_algorithm_.reset(
897 new PacingSender(send_algorithm_.release(), 879 new PacingSender(send_algorithm_.release(),
898 QuicTime::Delta::FromMilliseconds(5), 880 QuicTime::Delta::FromMilliseconds(5),
899 kInitialUnpacedBurst)); 881 kInitialUnpacedBurst));
900 } 882 }
901 883
902 } // namespace net 884 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_sent_packet_manager.h ('k') | net/quic/quic_sent_packet_manager_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698