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

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

Issue 103973007: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix for android compile error Created 7 years 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
« 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 "base/logging.h" 7 #include "base/logging.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "net/quic/congestion_control/pacing_sender.h" 9 #include "net/quic/congestion_control/pacing_sender.h"
10 #include "net/quic/quic_ack_notifier_manager.h" 10 #include "net/quic/quic_ack_notifier_manager.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 MaybeEnablePacing(); 105 MaybeEnablePacing();
106 } 106 }
107 send_algorithm_->SetFromConfig(config, is_server_); 107 send_algorithm_->SetFromConfig(config, is_server_);
108 } 108 }
109 109
110 void QuicSentPacketManager::SetMaxPacketSize(QuicByteCount max_packet_size) { 110 void QuicSentPacketManager::SetMaxPacketSize(QuicByteCount max_packet_size) {
111 send_algorithm_->SetMaxPacketSize(max_packet_size); 111 send_algorithm_->SetMaxPacketSize(max_packet_size);
112 } 112 }
113 113
114 void QuicSentPacketManager::OnSerializedPacket( 114 void QuicSentPacketManager::OnSerializedPacket(
115 const SerializedPacket& serialized_packet, QuicTime serialized_time) { 115 const SerializedPacket& serialized_packet) {
116 if (serialized_packet.packet->is_fec_packet()) { 116 if (serialized_packet.retransmittable_frames == NULL &&
117 DCHECK(!serialized_packet.retransmittable_frames); 117 !serialized_packet.packet->is_fec_packet()) {
118 unacked_fec_packets_.insert(make_pair(
119 serialized_packet.sequence_number, serialized_time));
120 return;
121 }
122
123 if (serialized_packet.retransmittable_frames == NULL) {
124 // Don't track ack/congestion feedback packets. 118 // Don't track ack/congestion feedback packets.
125 return; 119 return;
126 } 120 }
127 121
128 ack_notifier_manager_.OnSerializedPacket(serialized_packet); 122 ack_notifier_manager_.OnSerializedPacket(serialized_packet);
129 123
130 DCHECK(unacked_packets_.empty() || 124 DCHECK(unacked_packets_.empty() ||
131 unacked_packets_.rbegin()->first < serialized_packet.sequence_number); 125 unacked_packets_.rbegin()->first < serialized_packet.sequence_number);
132 unacked_packets_[serialized_packet.sequence_number] = 126 unacked_packets_[serialized_packet.sequence_number] =
133 TransmissionInfo(serialized_packet.retransmittable_frames, 127 TransmissionInfo(serialized_packet.retransmittable_frames,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 previous_transmissions->insert(new_sequence_number); 170 previous_transmissions->insert(new_sequence_number);
177 previous_transmissions_map_[new_sequence_number] = previous_transmissions; 171 previous_transmissions_map_[new_sequence_number] = previous_transmissions;
178 172
179 DCHECK(HasRetransmittableFrames(new_sequence_number)); 173 DCHECK(HasRetransmittableFrames(new_sequence_number));
180 } 174 }
181 175
182 bool QuicSentPacketManager::OnIncomingAck( 176 bool QuicSentPacketManager::OnIncomingAck(
183 const ReceivedPacketInfo& received_info, QuicTime ack_receive_time) { 177 const ReceivedPacketInfo& received_info, QuicTime ack_receive_time) {
184 // Determine if the least unacked sequence number is being acked. 178 // Determine if the least unacked sequence number is being acked.
185 QuicPacketSequenceNumber least_unacked_sent_before = 179 QuicPacketSequenceNumber least_unacked_sent_before =
186 min(GetLeastUnackedSentPacket(), GetLeastUnackedFecPacket()); 180 GetLeastUnackedSentPacket();
187 bool new_least_unacked = !IsAwaitingPacket(received_info, 181 bool new_least_unacked = !IsAwaitingPacket(received_info,
188 least_unacked_sent_before); 182 least_unacked_sent_before);
189 183
190 HandleAckForSentPackets(received_info); 184 HandleAckForSentPackets(received_info);
191 HandleAckForSentFecPackets(received_info);
192 185
193 SequenceNumberSet retransmission_packets = 186 SequenceNumberSet retransmission_packets =
194 OnIncomingAckFrame(received_info, ack_receive_time); 187 OnIncomingAckFrame(received_info, ack_receive_time);
195 188
196 for (SequenceNumberSet::const_iterator it = retransmission_packets.begin(); 189 for (SequenceNumberSet::const_iterator it = retransmission_packets.begin();
197 it != retransmission_packets.end(); ++it) { 190 it != retransmission_packets.end(); ++it) {
198 DCHECK(!ContainsKey(pending_packets_, *it)); 191 DCHECK(!ContainsKey(pending_packets_, *it));
199 MarkForRetransmission(*it, NACK_RETRANSMISSION); 192 MarkForRetransmission(*it, NACK_RETRANSMISSION);
200 } 193 }
201 194
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 return; 432 return;
440 } 433 }
441 434
442 // Delete the retransmittable frames. 435 // Delete the retransmittable frames.
443 delete unacked_it->second.retransmittable_frames; 436 delete unacked_it->second.retransmittable_frames;
444 unacked_packets_.erase(unacked_it); 437 unacked_packets_.erase(unacked_it);
445 pending_retransmissions_.erase(sequence_number); 438 pending_retransmissions_.erase(sequence_number);
446 return; 439 return;
447 } 440 }
448 441
449 void QuicSentPacketManager::HandleAckForSentFecPackets(
450 const ReceivedPacketInfo& received_info) {
451 UnackedFecPacketMap::iterator it = unacked_fec_packets_.begin();
452 while (it != unacked_fec_packets_.end()) {
453 QuicPacketSequenceNumber sequence_number = it->first;
454 if (sequence_number > received_info.largest_observed) {
455 break;
456 }
457
458 if (!IsAwaitingPacket(received_info, sequence_number)) {
459 DVLOG(1) << ENDPOINT << "Got an ack for fec packet: " << sequence_number;
460 unacked_fec_packets_.erase(it++);
461 } else {
462 // TODO(rch): treat these packets more consistently. They should
463 // be subject to NACK and RTO based loss. (Thought obviously, they
464 // should not be retransmitted.)
465 DVLOG(1) << ENDPOINT << "Still missing ack for fec packet: "
466 << sequence_number;
467 ++it;
468 }
469 }
470 }
471
472 void QuicSentPacketManager::DiscardFecPacket(
473 QuicPacketSequenceNumber sequence_number) {
474 DCHECK(ContainsKey(unacked_fec_packets_, sequence_number));
475 unacked_fec_packets_.erase(sequence_number);
476 }
477
478 bool QuicSentPacketManager::IsUnacked( 442 bool QuicSentPacketManager::IsUnacked(
479 QuicPacketSequenceNumber sequence_number) const { 443 QuicPacketSequenceNumber sequence_number) const {
480 return ContainsKey(unacked_packets_, sequence_number); 444 return ContainsKey(unacked_packets_, sequence_number);
481 } 445 }
482 446
483 QuicSequenceNumberLength QuicSentPacketManager::GetSequenceNumberLength( 447 QuicSequenceNumberLength QuicSentPacketManager::GetSequenceNumberLength(
484 QuicPacketSequenceNumber sequence_number) const { 448 QuicPacketSequenceNumber sequence_number) const {
485 DCHECK(ContainsKey(unacked_packets_, sequence_number)); 449 DCHECK(ContainsKey(unacked_packets_, sequence_number));
486 450
487 return unacked_packets_.find(sequence_number)->second.sequence_number_length; 451 return unacked_packets_.find(sequence_number)->second.sequence_number_length;
488 } 452 }
489 453
490 QuicTime QuicSentPacketManager::GetFecSentTime(
491 QuicPacketSequenceNumber sequence_number) const {
492 DCHECK(ContainsKey(unacked_fec_packets_, sequence_number));
493
494 return unacked_fec_packets_.find(sequence_number)->second;
495 }
496
497 bool QuicSentPacketManager::HasUnackedPackets() const { 454 bool QuicSentPacketManager::HasUnackedPackets() const {
498 return !unacked_packets_.empty(); 455 return !unacked_packets_.empty();
499 } 456 }
500 457
501 size_t QuicSentPacketManager::GetNumRetransmittablePackets() const { 458 size_t QuicSentPacketManager::GetNumRetransmittablePackets() const {
502 size_t num_unacked_packets = 0; 459 size_t num_unacked_packets = 0;
503 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin(); 460 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin();
504 it != unacked_packets_.end(); ++it) { 461 it != unacked_packets_.end(); ++it) {
505 QuicPacketSequenceNumber sequence_number = it->first; 462 QuicPacketSequenceNumber sequence_number = it->first;
506 if (HasRetransmittableFrames(sequence_number)) { 463 if (HasRetransmittableFrames(sequence_number)) {
507 ++num_unacked_packets; 464 ++num_unacked_packets;
508 } 465 }
509 } 466 }
510 return num_unacked_packets; 467 return num_unacked_packets;
511 } 468 }
512 469
513 bool QuicSentPacketManager::HasUnackedFecPackets() const {
514 return !unacked_fec_packets_.empty();
515 }
516
517 QuicPacketSequenceNumber 470 QuicPacketSequenceNumber
518 QuicSentPacketManager::GetLeastUnackedSentPacket() const { 471 QuicSentPacketManager::GetLeastUnackedSentPacket() const {
519 if (unacked_packets_.empty()) { 472 if (unacked_packets_.empty()) {
520 // If there are no unacked packets, set the least unacked packet to 473 // If there are no unacked packets, set the least unacked packet to
521 // the sequence number of the next packet sent. 474 // the sequence number of the next packet sent.
522 return helper_->GetNextPacketSequenceNumber(); 475 return helper_->GetNextPacketSequenceNumber();
523 } 476 }
524 477
525 return unacked_packets_.begin()->first; 478 return unacked_packets_.begin()->first;
526 } 479 }
527 480
528 QuicPacketSequenceNumber
529 QuicSentPacketManager::GetLeastUnackedFecPacket() const {
530 if (unacked_fec_packets_.empty()) {
531 // If there are no unacked packets, set the least unacked packet to
532 // the sequence number of the next packet sent.
533 return helper_->GetNextPacketSequenceNumber();
534 }
535
536 return unacked_fec_packets_.begin()->first;
537 }
538
539 SequenceNumberSet QuicSentPacketManager::GetUnackedPackets() const { 481 SequenceNumberSet QuicSentPacketManager::GetUnackedPackets() const {
540 SequenceNumberSet unacked_packets; 482 SequenceNumberSet unacked_packets;
541 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin(); 483 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin();
542 it != unacked_packets_.end(); ++it) { 484 it != unacked_packets_.end(); ++it) {
543 unacked_packets.insert(it->first); 485 unacked_packets.insert(it->first);
544 } 486 }
545 return unacked_packets; 487 return unacked_packets;
546 } 488 }
547 489
548 void QuicSentPacketManager::OnPacketSent( 490 void QuicSentPacketManager::OnPacketSent(
549 QuicPacketSequenceNumber sequence_number, 491 QuicPacketSequenceNumber sequence_number,
550 QuicTime sent_time, 492 QuicTime sent_time,
551 QuicByteCount bytes, 493 QuicByteCount bytes,
552 TransmissionType transmission_type, 494 TransmissionType transmission_type,
553 HasRetransmittableData has_retransmittable_data) { 495 HasRetransmittableData has_retransmittable_data) {
554 DCHECK_LT(0u, sequence_number); 496 DCHECK_LT(0u, sequence_number);
555 DCHECK(!ContainsKey(pending_packets_, sequence_number)); 497 DCHECK(!ContainsKey(pending_packets_, sequence_number));
498 if (ContainsKey(unacked_packets_, sequence_number)) {
499 unacked_packets_[sequence_number].sent_time = sent_time;
500 }
556 501
557 // Only track packets the send algorithm wants us to track. 502 // Only track packets the send algorithm wants us to track.
558 if (!send_algorithm_->OnPacketSent(sent_time, sequence_number, bytes, 503 if (!send_algorithm_->OnPacketSent(sent_time, sequence_number, bytes,
559 transmission_type, 504 transmission_type,
560 has_retransmittable_data)) { 505 has_retransmittable_data)) {
561 return; 506 return;
562 } 507 }
563 packet_history_map_[sequence_number] = new SendAlgorithmInterface::SentPacket( 508 packet_history_map_[sequence_number] = new SendAlgorithmInterface::SentPacket(
564 bytes, sent_time, has_retransmittable_data); 509 bytes, sent_time, has_retransmittable_data);
565 pending_packets_.insert(sequence_number); 510 pending_packets_.insert(sequence_number);
566 CleanupPacketHistory(); 511 CleanupPacketHistory();
567 } 512 }
568 513
569 void QuicSentPacketManager::OnRetransmissionTimeout() { 514 void QuicSentPacketManager::OnRetransmissionTimeout() {
570 ++consecutive_rto_count_;
571 send_algorithm_->OnRetransmissionTimeout();
572 // Abandon all pending packets to ensure the congestion window 515 // Abandon all pending packets to ensure the congestion window
573 // opens up before we attempt to retransmit packets. 516 // opens up before we attempt to retransmit packets.
574 for (SequenceNumberSet::const_iterator it = pending_packets_.begin(); 517 QuicTime::Delta retransmission_delay = GetRetransmissionDelay();
575 it != pending_packets_.end(); ++it) { 518 QuicTime max_send_time =
519 clock_->ApproximateNow().Subtract(retransmission_delay);
520 for (SequenceNumberSet::iterator it = pending_packets_.begin();
521 it != pending_packets_.end();) {
576 QuicPacketSequenceNumber sequence_number = *it; 522 QuicPacketSequenceNumber sequence_number = *it;
577 DCHECK(ContainsKey(packet_history_map_, sequence_number)); 523 DCHECK(ContainsKey(packet_history_map_, sequence_number));
578 send_algorithm_->OnPacketAbandoned( 524 DCHECK(ContainsKey(unacked_packets_, sequence_number));
579 sequence_number, packet_history_map_[sequence_number]->bytes_sent()); 525 const TransmissionInfo& transmission_info =
526 unacked_packets_.find(sequence_number)->second;
527 // Abandon retransmittable packet and old non-retransmittable packets.
528 if (transmission_info.retransmittable_frames ||
529 transmission_info.sent_time <= max_send_time) {
530 pending_packets_.erase(it++);
531 send_algorithm_->OnPacketAbandoned(
532 sequence_number, packet_history_map_[sequence_number]->bytes_sent());
533 } else {
534 ++it;
535 }
580 } 536 }
581 pending_packets_.clear();
582 537
583 // Attempt to send all the unacked packets when the RTO fires, let the 538 // Attempt to send all the unacked packets when the RTO fires, let the
584 // congestion manager decide how many to send immediately and the remaining 539 // congestion manager decide how many to send immediately and the remaining
585 // packets will be queued for future sending. 540 // packets will be queued for future sending.
586 DVLOG(1) << "OnRetransmissionTimeout() fired with " 541 DVLOG(1) << "OnRetransmissionTimeout() fired with "
587 << unacked_packets_.size() << " unacked packets."; 542 << unacked_packets_.size() << " unacked packets.";
588 543
589 // Retransmit any packet with retransmittable frames. 544 // Retransmit any packet with retransmittable frames.
545 bool packets_retransmitted = false;
590 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin(); 546 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin();
591 it != unacked_packets_.end(); ++it) { 547 it != unacked_packets_.end(); ++it) {
592 if (it->second.retransmittable_frames != NULL) { 548 if (it->second.retransmittable_frames != NULL) {
549 packets_retransmitted = true;
593 MarkForRetransmission(it->first, RTO_RETRANSMISSION); 550 MarkForRetransmission(it->first, RTO_RETRANSMISSION);
594 } 551 }
595 } 552 }
596 }
597 553
598 QuicTime QuicSentPacketManager::OnAbandonFecTimeout() { 554 // Only inform the sent packet manager of an RTO if data was retransmitted.
599 // Abandon all the FEC packets older than the current RTO, then reschedule 555 if (packets_retransmitted) {
600 // the alarm if there are more pending fec packets. 556 ++consecutive_rto_count_;
601 QuicTime::Delta retransmission_delay = GetRetransmissionDelay(); 557 send_algorithm_->OnRetransmissionTimeout();
602 QuicTime max_send_time =
603 clock_->ApproximateNow().Subtract(retransmission_delay);
604 while (HasUnackedFecPackets()) {
605 QuicPacketSequenceNumber oldest_unacked_fec = GetLeastUnackedFecPacket();
606 QuicTime fec_sent_time = GetFecSentTime(oldest_unacked_fec);
607 if (fec_sent_time > max_send_time) {
608 return fec_sent_time.Add(retransmission_delay);
609 }
610 DiscardFecPacket(oldest_unacked_fec);
611 OnPacketAbandoned(oldest_unacked_fec);
612 } 558 }
613
614 return QuicTime::Zero();
615 } 559 }
616 560
617 void QuicSentPacketManager::OnPacketAbandoned( 561 void QuicSentPacketManager::OnPacketAbandoned(
618 QuicPacketSequenceNumber sequence_number) { 562 QuicPacketSequenceNumber sequence_number) {
619 SequenceNumberSet::iterator it = pending_packets_.find(sequence_number); 563 SequenceNumberSet::iterator it = pending_packets_.find(sequence_number);
620 if (it != pending_packets_.end()) { 564 if (it != pending_packets_.end()) {
621 DCHECK(ContainsKey(packet_history_map_, sequence_number)); 565 DCHECK(ContainsKey(packet_history_map_, sequence_number));
622 send_algorithm_->OnPacketAbandoned( 566 send_algorithm_->OnPacketAbandoned(
623 sequence_number, packet_history_map_[sequence_number]->bytes_sent()); 567 sequence_number, packet_history_map_[sequence_number]->bytes_sent());
624 pending_packets_.erase(it); 568 pending_packets_.erase(it);
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 688
745 QuicTime::Delta QuicSentPacketManager::TimeUntilSend( 689 QuicTime::Delta QuicSentPacketManager::TimeUntilSend(
746 QuicTime now, 690 QuicTime now,
747 TransmissionType transmission_type, 691 TransmissionType transmission_type,
748 HasRetransmittableData retransmittable, 692 HasRetransmittableData retransmittable,
749 IsHandshake handshake) { 693 IsHandshake handshake) {
750 return send_algorithm_->TimeUntilSend(now, transmission_type, retransmittable, 694 return send_algorithm_->TimeUntilSend(now, transmission_type, retransmittable,
751 handshake); 695 handshake);
752 } 696 }
753 697
754 const QuicTime::Delta QuicSentPacketManager::DefaultRetransmissionTime() {
755 return QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs);
756 }
757
758 // Ensures that the Delayed Ack timer is always set to a value lesser 698 // Ensures that the Delayed Ack timer is always set to a value lesser
759 // than the retransmission timer's minimum value (MinRTO). We want the 699 // than the retransmission timer's minimum value (MinRTO). We want the
760 // delayed ack to get back to the QUIC peer before the sender's 700 // delayed ack to get back to the QUIC peer before the sender's
761 // retransmission timer triggers. Since we do not know the 701 // retransmission timer triggers. Since we do not know the
762 // reverse-path one-way delay, we assume equal delays for forward and 702 // reverse-path one-way delay, we assume equal delays for forward and
763 // reverse paths, and ensure that the timer is set to less than half 703 // reverse paths, and ensure that the timer is set to less than half
764 // of the MinRTO. 704 // of the MinRTO.
765 // There may be a value in making this delay adaptive with the help of 705 // There may be a value in making this delay adaptive with the help of
766 // the sender and a signaling mechanism -- if the sender uses a 706 // the sender and a signaling mechanism -- if the sender uses a
767 // different MinRTO, we may get spurious retransmissions. May not have 707 // different MinRTO, we may get spurious retransmissions. May not have
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 return; 793 return;
854 } 794 }
855 795
856 using_pacing_ = true; 796 using_pacing_ = true;
857 send_algorithm_.reset( 797 send_algorithm_.reset(
858 new PacingSender(send_algorithm_.release(), 798 new PacingSender(send_algorithm_.release(),
859 QuicTime::Delta::FromMicroseconds(1))); 799 QuicTime::Delta::FromMicroseconds(1)));
860 } 800 }
861 801
862 } // namespace net 802 } // 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