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

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

Issue 530343003: Landing Recent QUIC Changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@Final_0828
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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 consecutive_rto_count_ = 0; 221 consecutive_rto_count_ = 0;
222 consecutive_tlp_count_ = 0; 222 consecutive_tlp_count_ = 0;
223 consecutive_crypto_retransmission_count_ = 0; 223 consecutive_crypto_retransmission_count_ = 0;
224 } 224 }
225 225
226 if (debug_delegate_ != NULL) { 226 if (debug_delegate_ != NULL) {
227 debug_delegate_->OnIncomingAck(ack_frame, 227 debug_delegate_->OnIncomingAck(ack_frame,
228 ack_receive_time, 228 ack_receive_time,
229 unacked_packets_.largest_observed(), 229 unacked_packets_.largest_observed(),
230 largest_observed_acked, 230 largest_observed_acked,
231 GetLeastUnackedSentPacket()); 231 GetLeastUnacked());
232 } 232 }
233 } 233 }
234 234
235 void QuicSentPacketManager::UpdatePacketInformationReceivedByPeer( 235 void QuicSentPacketManager::UpdatePacketInformationReceivedByPeer(
236 const QuicAckFrame& ack_frame) { 236 const QuicAckFrame& ack_frame) {
237 if (ack_frame.missing_packets.empty()) { 237 if (ack_frame.missing_packets.empty()) {
238 least_packet_awaited_by_peer_ = ack_frame.largest_observed + 1; 238 least_packet_awaited_by_peer_ = ack_frame.largest_observed + 1;
239 } else { 239 } else {
240 least_packet_awaited_by_peer_ = *(ack_frame.missing_packets.begin()); 240 least_packet_awaited_by_peer_ = *(ack_frame.missing_packets.begin());
241 } 241 }
(...skipping 21 matching lines...) Expand all
263 ack_frame.delta_time_largest_observed; 263 ack_frame.delta_time_largest_observed;
264 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked(); 264 QuicPacketSequenceNumber sequence_number = unacked_packets_.GetLeastUnacked();
265 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); 265 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
266 it != unacked_packets_.end(); ++it, ++sequence_number) { 266 it != unacked_packets_.end(); ++it, ++sequence_number) {
267 if (sequence_number > ack_frame.largest_observed) { 267 if (sequence_number > ack_frame.largest_observed) {
268 // These packets are still in flight. 268 // These packets are still in flight.
269 break; 269 break;
270 } 270 }
271 271
272 if (ContainsKey(ack_frame.missing_packets, sequence_number)) { 272 if (ContainsKey(ack_frame.missing_packets, sequence_number)) {
273 // Don't continue to increase the nack count for packets not in flight.
274 if (!it->in_flight) {
275 continue;
276 }
273 // Consider it multiple nacks when there is a gap between the missing 277 // Consider it multiple nacks when there is a gap between the missing
274 // packet and the largest observed, since the purpose of a nack 278 // packet and the largest observed, since the purpose of a nack
275 // threshold is to tolerate re-ordering. This handles both StretchAcks 279 // threshold is to tolerate re-ordering. This handles both StretchAcks
276 // and Forward Acks. 280 // and Forward Acks.
277 // The nack count only increases when the largest observed increases. 281 // The nack count only increases when the largest observed increases.
278 size_t min_nacks = ack_frame.largest_observed - sequence_number; 282 size_t min_nacks = ack_frame.largest_observed - sequence_number;
279 // Truncated acks can nack the largest observed, so use a min of 1. 283 // Truncated acks can nack the largest observed, so use a min of 1.
280 if (min_nacks == 0) { 284 if (min_nacks == 0) {
281 min_nacks = 1; 285 min_nacks = 1;
282 } 286 }
283 unacked_packets_.NackPacket(sequence_number, min_nacks); 287 unacked_packets_.NackPacket(sequence_number, min_nacks);
284 continue; 288 continue;
285 } 289 }
286 // Packet was acked, so remove it from our unacked packet list. 290 // Packet was acked, so remove it from our unacked packet list.
287 DVLOG(1) << ENDPOINT << "Got an ack for packet " << sequence_number; 291 DVLOG(1) << ENDPOINT << "Got an ack for packet " << sequence_number;
288 // If data is associated with the most recent transmission of this 292 // If data is associated with the most recent transmission of this
289 // packet, then inform the caller. 293 // packet, then inform the caller.
290 if (it->in_flight) { 294 if (it->in_flight) {
291 packets_acked_[sequence_number] = *it; 295 packets_acked_.push_back(make_pair(sequence_number, *it));
292 } 296 }
293 MarkPacketHandled(sequence_number, *it, delta_largest_observed); 297 MarkPacketHandled(sequence_number, *it, delta_largest_observed);
294 } 298 }
295 299
296 // Discard any retransmittable frames associated with revived packets. 300 // Discard any retransmittable frames associated with revived packets.
297 for (SequenceNumberSet::const_iterator revived_it = 301 for (SequenceNumberSet::const_iterator revived_it =
298 ack_frame.revived_packets.begin(); 302 ack_frame.revived_packets.begin();
299 revived_it != ack_frame.revived_packets.end(); ++revived_it) { 303 revived_it != ack_frame.revived_packets.end(); ++revived_it) {
300 MarkPacketRevived(*revived_it, delta_largest_observed); 304 MarkPacketRevived(*revived_it, delta_largest_observed);
301 } 305 }
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 bool QuicSentPacketManager::IsUnacked( 491 bool QuicSentPacketManager::IsUnacked(
488 QuicPacketSequenceNumber sequence_number) const { 492 QuicPacketSequenceNumber sequence_number) const {
489 return unacked_packets_.IsUnacked(sequence_number); 493 return unacked_packets_.IsUnacked(sequence_number);
490 } 494 }
491 495
492 bool QuicSentPacketManager::HasUnackedPackets() const { 496 bool QuicSentPacketManager::HasUnackedPackets() const {
493 return unacked_packets_.HasUnackedPackets(); 497 return unacked_packets_.HasUnackedPackets();
494 } 498 }
495 499
496 QuicPacketSequenceNumber 500 QuicPacketSequenceNumber
497 QuicSentPacketManager::GetLeastUnackedSentPacket() const { 501 QuicSentPacketManager::GetLeastUnacked() const {
498 return unacked_packets_.GetLeastUnacked(); 502 return unacked_packets_.GetLeastUnacked();
499 } 503 }
500 504
501 bool QuicSentPacketManager::OnPacketSent( 505 bool QuicSentPacketManager::OnPacketSent(
502 QuicPacketSequenceNumber sequence_number, 506 QuicPacketSequenceNumber sequence_number,
503 QuicTime sent_time, 507 QuicTime sent_time,
504 QuicByteCount bytes, 508 QuicByteCount bytes,
505 TransmissionType transmission_type, 509 TransmissionType transmission_type,
506 HasRetransmittableData has_retransmittable_data) { 510 HasRetransmittableData has_retransmittable_data) {
507 DCHECK_LT(0u, sequence_number); 511 DCHECK_LT(0u, sequence_number);
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 rtt_stats_); 686 rtt_stats_);
683 for (SequenceNumberSet::const_iterator it = lost_packets.begin(); 687 for (SequenceNumberSet::const_iterator it = lost_packets.begin();
684 it != lost_packets.end(); ++it) { 688 it != lost_packets.end(); ++it) {
685 QuicPacketSequenceNumber sequence_number = *it; 689 QuicPacketSequenceNumber sequence_number = *it;
686 const TransmissionInfo& transmission_info = 690 const TransmissionInfo& transmission_info =
687 unacked_packets_.GetTransmissionInfo(sequence_number); 691 unacked_packets_.GetTransmissionInfo(sequence_number);
688 // TODO(ianswett): If it's expected the FEC packet may repair the loss, it 692 // TODO(ianswett): If it's expected the FEC packet may repair the loss, it
689 // should be recorded as a loss to the send algorithm, but not retransmitted 693 // should be recorded as a loss to the send algorithm, but not retransmitted
690 // until it's known whether the FEC packet arrived. 694 // until it's known whether the FEC packet arrived.
691 ++stats_->packets_lost; 695 ++stats_->packets_lost;
692 packets_lost_[sequence_number] = transmission_info; 696 packets_lost_.push_back(make_pair(sequence_number, transmission_info));
693 DVLOG(1) << ENDPOINT << "Lost packet " << sequence_number; 697 DVLOG(1) << ENDPOINT << "Lost packet " << sequence_number;
694 698
695 if (transmission_info.retransmittable_frames != NULL) { 699 if (transmission_info.retransmittable_frames != NULL) {
696 MarkForRetransmission(sequence_number, LOSS_RETRANSMISSION); 700 MarkForRetransmission(sequence_number, LOSS_RETRANSMISSION);
697 } else { 701 } else {
698 // Since we will not retransmit this, we need to remove it from 702 // Since we will not retransmit this, we need to remove it from
699 // unacked_packets_. This is either the current transmission of 703 // unacked_packets_. This is either the current transmission of
700 // a packet whose previous transmission has been acked, a packet that has 704 // a packet whose previous transmission has been acked, a packet that has
701 // been TLP retransmitted, or an FEC packet. 705 // been TLP retransmitted, or an FEC packet.
702 unacked_packets_.RemoveFromInFlight(sequence_number); 706 unacked_packets_.RemoveFromInFlight(sequence_number);
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 873
870 // Set up a pacing sender with a 5 millisecond alarm granularity. 874 // Set up a pacing sender with a 5 millisecond alarm granularity.
871 using_pacing_ = true; 875 using_pacing_ = true;
872 send_algorithm_.reset( 876 send_algorithm_.reset(
873 new PacingSender(send_algorithm_.release(), 877 new PacingSender(send_algorithm_.release(),
874 QuicTime::Delta::FromMilliseconds(5), 878 QuicTime::Delta::FromMilliseconds(5),
875 kInitialUnpacedBurst)); 879 kInitialUnpacedBurst));
876 } 880 }
877 881
878 } // namespace net 882 } // 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