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

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

Issue 640853005: Simplify QuicUnackedPacketMap to expose AddSentPacket, instead of (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@Making_whole_host_of_QUIC_framing_errors_77961885
Patch Set: Created 6 years, 2 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
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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 ContainsQuicTag(config.ReceivedConnectionOptions(), tag)) { 141 ContainsQuicTag(config.ReceivedConnectionOptions(), tag)) {
142 return true; 142 return true;
143 } 143 }
144 } else if (config.HasSendConnectionOptions() && 144 } else if (config.HasSendConnectionOptions() &&
145 ContainsQuicTag(config.SendConnectionOptions(), tag)) { 145 ContainsQuicTag(config.SendConnectionOptions(), tag)) {
146 return true; 146 return true;
147 } 147 }
148 return false; 148 return false;
149 } 149 }
150 150
151 void QuicSentPacketManager::OnRetransmittedPacket(
152 QuicPacketSequenceNumber old_sequence_number,
153 QuicPacketSequenceNumber new_sequence_number) {
154 TransmissionType transmission_type;
155 PendingRetransmissionMap::iterator it =
156 pending_retransmissions_.find(old_sequence_number);
157 if (it != pending_retransmissions_.end()) {
158 transmission_type = it->second;
159 pending_retransmissions_.erase(it);
160 } else {
161 DLOG(DFATAL) << "Expected sequence number to be in "
162 "pending_retransmissions_. sequence_number: " << old_sequence_number;
163 transmission_type = NOT_RETRANSMISSION;
164 }
165
166 // A notifier may be waiting to hear about ACKs for the original sequence
167 // number. Inform them that the sequence number has changed.
168 ack_notifier_manager_.UpdateSequenceNumber(old_sequence_number,
169 new_sequence_number);
170
171 unacked_packets_.OnRetransmittedPacket(old_sequence_number,
172 new_sequence_number,
173 transmission_type);
174 }
175
176 void QuicSentPacketManager::OnIncomingAck(const QuicAckFrame& ack_frame, 151 void QuicSentPacketManager::OnIncomingAck(const QuicAckFrame& ack_frame,
177 QuicTime ack_receive_time) { 152 QuicTime ack_receive_time) {
178 QuicByteCount bytes_in_flight = unacked_packets_.bytes_in_flight(); 153 QuicByteCount bytes_in_flight = unacked_packets_.bytes_in_flight();
179 154
180 UpdatePacketInformationReceivedByPeer(ack_frame); 155 UpdatePacketInformationReceivedByPeer(ack_frame);
181 // We rely on delta_time_largest_observed to compute an RTT estimate, so 156 // We rely on delta_time_largest_observed to compute an RTT estimate, so
182 // we only update rtt when the largest observed gets acked. 157 // we only update rtt when the largest observed gets acked.
183 bool largest_observed_acked = MaybeUpdateRTT(ack_frame, ack_receive_time); 158 bool largest_observed_acked = MaybeUpdateRTT(ack_frame, ack_receive_time);
184 DCHECK_GE(ack_frame.largest_observed, unacked_packets_.largest_observed()); 159 DCHECK_GE(ack_frame.largest_observed, unacked_packets_.largest_observed());
185 unacked_packets_.IncreaseLargestObserved(ack_frame.largest_observed); 160 unacked_packets_.IncreaseLargestObserved(ack_frame.largest_observed);
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 } 419 }
445 420
446 unacked_packets_.RemoveRetransmittability(sequence_number); 421 unacked_packets_.RemoveRetransmittability(sequence_number);
447 } 422 }
448 423
449 void QuicSentPacketManager::MarkPacketHandled( 424 void QuicSentPacketManager::MarkPacketHandled(
450 QuicPacketSequenceNumber sequence_number, 425 QuicPacketSequenceNumber sequence_number,
451 const TransmissionInfo& info, 426 const TransmissionInfo& info,
452 QuicTime::Delta delta_largest_observed) { 427 QuicTime::Delta delta_largest_observed) {
453 QuicPacketSequenceNumber newest_transmission = 428 QuicPacketSequenceNumber newest_transmission =
454 info.all_transmissions == nullptr ? sequence_number 429 info.all_transmissions == nullptr ?
455 : *info.all_transmissions->rbegin(); 430 sequence_number : *info.all_transmissions->rbegin();
456 // Remove the most recent packet, if it is pending retransmission. 431 // Remove the most recent packet, if it is pending retransmission.
457 pending_retransmissions_.erase(newest_transmission); 432 pending_retransmissions_.erase(newest_transmission);
458 433
459 // The AckNotifierManager needs to be notified about the most recent 434 // The AckNotifierManager needs to be notified about the most recent
460 // transmission, since that's the one only one it tracks. 435 // transmission, since that's the one only one it tracks.
461 ack_notifier_manager_.OnPacketAcked(newest_transmission, 436 ack_notifier_manager_.OnPacketAcked(newest_transmission,
462 delta_largest_observed); 437 delta_largest_observed);
463 if (newest_transmission != sequence_number) { 438 if (newest_transmission != sequence_number) {
464 RecordSpuriousRetransmissions(*info.all_transmissions, sequence_number); 439 RecordSpuriousRetransmissions(*info.all_transmissions, sequence_number);
465 // Remove the most recent packet from flight if it's a crypto handshake 440 // Remove the most recent packet from flight if it's a crypto handshake
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 HasRetransmittableData has_retransmittable_data) { 476 HasRetransmittableData has_retransmittable_data) {
502 QuicPacketSequenceNumber sequence_number = serialized_packet->sequence_number; 477 QuicPacketSequenceNumber sequence_number = serialized_packet->sequence_number;
503 DCHECK_LT(0u, sequence_number); 478 DCHECK_LT(0u, sequence_number);
504 DCHECK(!unacked_packets_.IsUnacked(sequence_number)); 479 DCHECK(!unacked_packets_.IsUnacked(sequence_number));
505 LOG_IF(DFATAL, bytes == 0) << "Cannot send empty packets."; 480 LOG_IF(DFATAL, bytes == 0) << "Cannot send empty packets.";
506 481
507 if (original_sequence_number == 0) { 482 if (original_sequence_number == 0) {
508 if (serialized_packet->retransmittable_frames) { 483 if (serialized_packet->retransmittable_frames) {
509 ack_notifier_manager_.OnSerializedPacket(*serialized_packet); 484 ack_notifier_manager_.OnSerializedPacket(*serialized_packet);
510 } 485 }
511 unacked_packets_.AddPacket(*serialized_packet);
512 serialized_packet->retransmittable_frames = nullptr;
513 } else { 486 } else {
514 OnRetransmittedPacket(original_sequence_number, sequence_number); 487 PendingRetransmissionMap::iterator it =
488 pending_retransmissions_.find(original_sequence_number);
489 if (it != pending_retransmissions_.end()) {
490 pending_retransmissions_.erase(it);
491 } else {
492 DLOG(DFATAL) << "Expected sequence number to be in "
493 << "pending_retransmissions_. sequence_number: "
494 << original_sequence_number;
495 }
496 // A notifier may be waiting to hear about ACKs for the original sequence
497 // number. Inform them that the sequence number has changed.
498 ack_notifier_manager_.UpdateSequenceNumber(original_sequence_number,
499 sequence_number);
515 } 500 }
516 501
517 if (pending_timer_transmission_count_ > 0) { 502 if (pending_timer_transmission_count_ > 0) {
518 --pending_timer_transmission_count_; 503 --pending_timer_transmission_count_;
519 } 504 }
520 505
521 if (unacked_packets_.bytes_in_flight() == 0) { 506 if (unacked_packets_.bytes_in_flight() == 0) {
522 // TODO(ianswett): Consider being less aggressive to force a new 507 // TODO(ianswett): Consider being less aggressive to force a new
523 // recent_min_rtt, likely by not discarding a relatively new sample. 508 // recent_min_rtt, likely by not discarding a relatively new sample.
524 DVLOG(1) << "Sampling a new recent min rtt within 2 samples. currently:" 509 DVLOG(1) << "Sampling a new recent min rtt within 2 samples. currently:"
525 << rtt_stats_.recent_min_rtt().ToMilliseconds() << "ms"; 510 << rtt_stats_.recent_min_rtt().ToMilliseconds() << "ms";
526 rtt_stats_.SampleNewRecentMinRtt(kNumMinRttSamplesAfterQuiescence); 511 rtt_stats_.SampleNewRecentMinRtt(kNumMinRttSamplesAfterQuiescence);
527 } 512 }
528 513
529 // Only track packets as in flight that the send algorithm wants us to track. 514 // Only track packets as in flight that the send algorithm wants us to track.
530 const bool in_flight = 515 const bool in_flight =
531 send_algorithm_->OnPacketSent(sent_time, 516 send_algorithm_->OnPacketSent(sent_time,
532 unacked_packets_.bytes_in_flight(), 517 unacked_packets_.bytes_in_flight(),
533 sequence_number, 518 sequence_number,
534 bytes, 519 bytes,
535 has_retransmittable_data); 520 has_retransmittable_data);
536 unacked_packets_.SetSent(sequence_number, sent_time, bytes, in_flight); 521 unacked_packets_.AddSentPacket(*serialized_packet,
522 original_sequence_number,
523 transmission_type,
524 sent_time,
525 bytes,
526 in_flight);
537 527
528 // Take ownership of the retransmittable frames before exiting.
529 serialized_packet->retransmittable_frames = nullptr;
538 // Reset the retransmission timer anytime a pending packet is sent. 530 // Reset the retransmission timer anytime a pending packet is sent.
539 return in_flight; 531 return in_flight;
540 } 532 }
541 533
542 void QuicSentPacketManager::OnRetransmissionTimeout() { 534 void QuicSentPacketManager::OnRetransmissionTimeout() {
543 DCHECK(unacked_packets_.HasInFlightPackets()); 535 DCHECK(unacked_packets_.HasInFlightPackets());
544 DCHECK_EQ(0u, pending_timer_transmission_count_); 536 DCHECK_EQ(0u, pending_timer_transmission_count_);
545 // Handshake retransmission, timer based loss detection, TLP, and RTO are 537 // Handshake retransmission, timer based loss detection, TLP, and RTO are
546 // implemented with a single alarm. The handshake alarm is set when the 538 // implemented with a single alarm. The handshake alarm is set when the
547 // handshake has not completed, the loss alarm is set when the loss detection 539 // handshake has not completed, the loss alarm is set when the loss detection
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 // Set up a pacing sender with a 1 millisecond alarm granularity, the same as 868 // Set up a pacing sender with a 1 millisecond alarm granularity, the same as
877 // the default granularity of the Linux kernel's FQ qdisc. 869 // the default granularity of the Linux kernel's FQ qdisc.
878 using_pacing_ = true; 870 using_pacing_ = true;
879 send_algorithm_.reset( 871 send_algorithm_.reset(
880 new PacingSender(send_algorithm_.release(), 872 new PacingSender(send_algorithm_.release(),
881 QuicTime::Delta::FromMilliseconds(1), 873 QuicTime::Delta::FromMilliseconds(1),
882 kInitialUnpacedBurst)); 874 kInitialUnpacedBurst));
883 } 875 }
884 876
885 } // namespace net 877 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/congestion_control/time_loss_algorithm_test.cc ('k') | net/quic/quic_sent_packet_manager_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698