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

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

Issue 2547583002: Landing Recent QUIC changes until Fri Nov 18 23:21:04 2016 +0000 (Closed)
Patch Set: Remove explicit HTTP/2 enum usage Created 4 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
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/core/quic_sent_packet_manager.h" 5 #include "net/quic/core/quic_sent_packet_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 27 matching lines...) Expand all
38 // This limits the tenth retransmitted packet to 10s after the initial CHLO. 38 // This limits the tenth retransmitted packet to 10s after the initial CHLO.
39 static const int64_t kMinHandshakeTimeoutMs = 10; 39 static const int64_t kMinHandshakeTimeoutMs = 10;
40 40
41 // Ensure the handshake timer isnt't faster than 25ms. 41 // Ensure the handshake timer isnt't faster than 25ms.
42 static const int64_t kConservativeMinHandshakeTimeoutMs = kMaxDelayedAckTimeMs; 42 static const int64_t kConservativeMinHandshakeTimeoutMs = kMaxDelayedAckTimeMs;
43 43
44 // Sends up to two tail loss probes before firing an RTO, 44 // Sends up to two tail loss probes before firing an RTO,
45 // per draft RFC draft-dukkipati-tcpm-tcp-loss-probe. 45 // per draft RFC draft-dukkipati-tcpm-tcp-loss-probe.
46 static const size_t kDefaultMaxTailLossProbes = 2; 46 static const size_t kDefaultMaxTailLossProbes = 2;
47 47
48 bool HasCryptoHandshake(const TransmissionInfo& transmission_info) { 48 bool HasCryptoHandshake(const QuicTransmissionInfo& transmission_info) {
49 DCHECK(!transmission_info.has_crypto_handshake || 49 DCHECK(!transmission_info.has_crypto_handshake ||
50 !transmission_info.retransmittable_frames.empty()); 50 !transmission_info.retransmittable_frames.empty());
51 return transmission_info.has_crypto_handshake; 51 return transmission_info.has_crypto_handshake;
52 } 52 }
53 53
54 } // namespace 54 } // namespace
55 55
56 #define ENDPOINT \ 56 #define ENDPOINT \
57 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ") 57 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
58 58
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 max(kMinInitialRoundTripTimeUs, 104 max(kMinInitialRoundTripTimeUs,
105 min(kMaxInitialRoundTripTimeUs, 105 min(kMaxInitialRoundTripTimeUs,
106 config.ReceivedInitialRoundTripTimeUs()))); 106 config.ReceivedInitialRoundTripTimeUs())));
107 } else if (config.HasInitialRoundTripTimeUsToSend() && 107 } else if (config.HasInitialRoundTripTimeUsToSend() &&
108 config.GetInitialRoundTripTimeUsToSend() > 0) { 108 config.GetInitialRoundTripTimeUsToSend() > 0) {
109 rtt_stats_.set_initial_rtt_us( 109 rtt_stats_.set_initial_rtt_us(
110 max(kMinInitialRoundTripTimeUs, 110 max(kMinInitialRoundTripTimeUs,
111 min(kMaxInitialRoundTripTimeUs, 111 min(kMaxInitialRoundTripTimeUs,
112 config.GetInitialRoundTripTimeUsToSend()))); 112 config.GetInitialRoundTripTimeUsToSend())));
113 } 113 }
114 if (FLAGS_quic_allow_new_bbr && config.HasReceivedConnectionOptions() && 114 // Configure congestion control.
115 ContainsQuicTag(config.ReceivedConnectionOptions(), kTBBR)) { 115 const bool enable_client_connection_options =
116 SetSendAlgorithm(kBBR); 116 FLAGS_quic_client_connection_options;
117 } 117 if (enable_client_connection_options) {
118 if (config.HasReceivedConnectionOptions() && 118 if (FLAGS_quic_allow_new_bbr &&
119 ContainsQuicTag(config.ReceivedConnectionOptions(), kRENO)) { 119 config.HasClientRequestedIndependentOption(kTBBR, perspective_)) {
120 if (ContainsQuicTag(config.ReceivedConnectionOptions(), kBYTE)) { 120 SetSendAlgorithm(kBBR);
121 SetSendAlgorithm(kRenoBytes);
122 } else {
123 SetSendAlgorithm(kReno);
124 } 121 }
125 } else if (config.HasReceivedConnectionOptions() && 122 if (config.HasClientRequestedIndependentOption(kRENO, perspective_)) {
126 ContainsQuicTag(config.ReceivedConnectionOptions(), kBYTE)) { 123 if (config.HasClientRequestedIndependentOption(kBYTE, perspective_)) {
127 if (FLAGS_quic_default_enable_cubic_bytes) { 124 SetSendAlgorithm(kRenoBytes);
128 SetSendAlgorithm(kCubic); 125 } else {
129 } else { 126 SetSendAlgorithm(kReno);
130 SetSendAlgorithm(kCubicBytes); 127 }
128 } else if (config.HasClientRequestedIndependentOption(kBYTE,
129 perspective_)) {
130 if (FLAGS_quic_default_enable_cubic_bytes) {
131 SetSendAlgorithm(kCubic);
132 } else {
133 SetSendAlgorithm(kCubicBytes);
134 }
135 }
136 } else {
137 if (FLAGS_quic_allow_new_bbr && config.HasReceivedConnectionOptions() &&
138 ContainsQuicTag(config.ReceivedConnectionOptions(), kTBBR)) {
139 SetSendAlgorithm(kBBR);
140 }
141 if (config.HasReceivedConnectionOptions() &&
142 ContainsQuicTag(config.ReceivedConnectionOptions(), kRENO)) {
143 if (ContainsQuicTag(config.ReceivedConnectionOptions(), kBYTE)) {
144 SetSendAlgorithm(kRenoBytes);
145 } else {
146 SetSendAlgorithm(kReno);
147 }
148 } else if (config.HasReceivedConnectionOptions() &&
149 ContainsQuicTag(config.ReceivedConnectionOptions(), kBYTE)) {
150 if (FLAGS_quic_default_enable_cubic_bytes) {
151 SetSendAlgorithm(kCubic);
152 } else {
153 SetSendAlgorithm(kCubicBytes);
154 }
131 } 155 }
132 } 156 }
133 using_pacing_ = !FLAGS_quic_disable_pacing_for_perf_tests; 157 using_pacing_ = !FLAGS_quic_disable_pacing_for_perf_tests;
134 158
135 if (config.HasClientSentConnectionOption(k1CON, perspective_)) { 159 if (config.HasClientSentConnectionOption(k1CON, perspective_)) {
136 send_algorithm_->SetNumEmulatedConnections(1); 160 send_algorithm_->SetNumEmulatedConnections(1);
137 } 161 }
138 if (config.HasClientSentConnectionOption(kNCON, perspective_)) { 162 if (config.HasClientSentConnectionOption(kNCON, perspective_)) {
139 n_connection_simulation_ = true; 163 n_connection_simulation_ = true;
140 } 164 }
141 if (config.HasClientSentConnectionOption(kNTLP, perspective_)) { 165 if (config.HasClientSentConnectionOption(kNTLP, perspective_)) {
142 max_tail_loss_probes_ = 0; 166 max_tail_loss_probes_ = 0;
143 } 167 }
144 if (config.HasClientSentConnectionOption(kTLPR, perspective_)) { 168 if (config.HasClientSentConnectionOption(kTLPR, perspective_)) {
145 enable_half_rtt_tail_loss_probe_ = true; 169 enable_half_rtt_tail_loss_probe_ = true;
146 } 170 }
147 if (config.HasClientSentConnectionOption(kNRTO, perspective_)) { 171 if (config.HasClientSentConnectionOption(kNRTO, perspective_)) {
148 use_new_rto_ = true; 172 use_new_rto_ = true;
149 } 173 }
150 if (config.HasReceivedConnectionOptions() && 174 // Configure loss detection.
151 ContainsQuicTag(config.ReceivedConnectionOptions(), kTIME)) { 175 if (enable_client_connection_options) {
152 general_loss_algorithm_.SetLossDetectionType(kTime); 176 if (config.HasClientRequestedIndependentOption(kTIME, perspective_)) {
153 } 177 general_loss_algorithm_.SetLossDetectionType(kTime);
154 if (config.HasReceivedConnectionOptions() && 178 }
155 ContainsQuicTag(config.ReceivedConnectionOptions(), kATIM)) { 179 if (config.HasClientRequestedIndependentOption(kATIM, perspective_)) {
156 general_loss_algorithm_.SetLossDetectionType(kAdaptiveTime); 180 general_loss_algorithm_.SetLossDetectionType(kAdaptiveTime);
157 } 181 }
158 if (FLAGS_quic_enable_lazy_fack && config.HasReceivedConnectionOptions() && 182 if (FLAGS_quic_enable_lazy_fack &&
159 ContainsQuicTag(config.ReceivedConnectionOptions(), kLFAK)) { 183 config.HasClientRequestedIndependentOption(kLFAK, perspective_)) {
160 general_loss_algorithm_.SetLossDetectionType(kLazyFack); 184 general_loss_algorithm_.SetLossDetectionType(kLazyFack);
185 }
186 } else {
187 if (config.HasReceivedConnectionOptions() &&
188 ContainsQuicTag(config.ReceivedConnectionOptions(), kTIME)) {
189 general_loss_algorithm_.SetLossDetectionType(kTime);
190 }
191 if (config.HasReceivedConnectionOptions() &&
192 ContainsQuicTag(config.ReceivedConnectionOptions(), kATIM)) {
193 general_loss_algorithm_.SetLossDetectionType(kAdaptiveTime);
194 }
195 if (FLAGS_quic_enable_lazy_fack && config.HasReceivedConnectionOptions() &&
196 ContainsQuicTag(config.ReceivedConnectionOptions(), kLFAK)) {
197 general_loss_algorithm_.SetLossDetectionType(kLazyFack);
198 }
161 } 199 }
162 if (config.HasClientSentConnectionOption(kUNDO, perspective_)) { 200 if (config.HasClientSentConnectionOption(kUNDO, perspective_)) {
163 undo_pending_retransmits_ = true; 201 undo_pending_retransmits_ = true;
164 } 202 }
165 if (FLAGS_quic_conservative_handshake_retransmits && 203 if (FLAGS_quic_conservative_handshake_retransmits &&
166 config.HasClientSentConnectionOption(kCONH, perspective_)) { 204 config.HasClientSentConnectionOption(kCONH, perspective_)) {
167 conservative_handshake_retransmits_ = true; 205 conservative_handshake_retransmits_ = true;
168 } 206 }
169 send_algorithm_->SetFromConfig(config, perspective_); 207 send_algorithm_->SetFromConfig(config, perspective_);
170 208
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 } 397 }
360 unacked_packets_.RemoveFromInFlight(packet_number); 398 unacked_packets_.RemoveFromInFlight(packet_number);
361 unacked_packets_.RemoveRetransmittability(packet_number); 399 unacked_packets_.RemoveRetransmittability(packet_number);
362 } 400 }
363 } 401 }
364 } 402 }
365 403
366 void QuicSentPacketManager::MarkForRetransmission( 404 void QuicSentPacketManager::MarkForRetransmission(
367 QuicPacketNumber packet_number, 405 QuicPacketNumber packet_number,
368 TransmissionType transmission_type) { 406 TransmissionType transmission_type) {
369 const TransmissionInfo& transmission_info = 407 const QuicTransmissionInfo& transmission_info =
370 unacked_packets_.GetTransmissionInfo(packet_number); 408 unacked_packets_.GetTransmissionInfo(packet_number);
371 QUIC_BUG_IF(transmission_info.retransmittable_frames.empty()); 409 QUIC_BUG_IF(transmission_info.retransmittable_frames.empty());
372 // Both TLP and the new RTO leave the packets in flight and let the loss 410 // Both TLP and the new RTO leave the packets in flight and let the loss
373 // detection decide if packets are lost. 411 // detection decide if packets are lost.
374 if (transmission_type != TLP_RETRANSMISSION && 412 if (transmission_type != TLP_RETRANSMISSION &&
375 transmission_type != RTO_RETRANSMISSION) { 413 transmission_type != RTO_RETRANSMISSION) {
376 unacked_packets_.RemoveFromInFlight(packet_number); 414 unacked_packets_.RemoveFromInFlight(packet_number);
377 } 415 }
378 if (delegate_ != nullptr) { 416 if (delegate_ != nullptr) {
379 delegate_->OnRetransmissionMarked(path_id_, packet_number, 417 delegate_->OnRetransmissionMarked(path_id_, packet_number,
380 transmission_type); 418 transmission_type);
381 } else { 419 } else {
382 // TODO(ianswett): Currently the RTO can fire while there are pending NACK 420 // TODO(ianswett): Currently the RTO can fire while there are pending NACK
383 // retransmissions for the same data, which is not ideal. 421 // retransmissions for the same data, which is not ideal.
384 if (base::ContainsKey(pending_retransmissions_, packet_number)) { 422 if (base::ContainsKey(pending_retransmissions_, packet_number)) {
385 return; 423 return;
386 } 424 }
387 425
388 pending_retransmissions_[packet_number] = transmission_type; 426 pending_retransmissions_[packet_number] = transmission_type;
389 } 427 }
390 } 428 }
391 429
392 void QuicSentPacketManager::RecordOneSpuriousRetransmission( 430 void QuicSentPacketManager::RecordOneSpuriousRetransmission(
393 const TransmissionInfo& info) { 431 const QuicTransmissionInfo& info) {
394 stats_->bytes_spuriously_retransmitted += info.bytes_sent; 432 stats_->bytes_spuriously_retransmitted += info.bytes_sent;
395 ++stats_->packets_spuriously_retransmitted; 433 ++stats_->packets_spuriously_retransmitted;
396 if (debug_delegate_ != nullptr) { 434 if (debug_delegate_ != nullptr) {
397 debug_delegate_->OnSpuriousPacketRetransmission(info.transmission_type, 435 debug_delegate_->OnSpuriousPacketRetransmission(info.transmission_type,
398 info.bytes_sent); 436 info.bytes_sent);
399 } 437 }
400 } 438 }
401 439
402 void QuicSentPacketManager::RecordSpuriousRetransmissions( 440 void QuicSentPacketManager::RecordSpuriousRetransmissions(
403 const TransmissionInfo& info, 441 const QuicTransmissionInfo& info,
404 QuicPacketNumber acked_packet_number) { 442 QuicPacketNumber acked_packet_number) {
405 QuicPacketNumber retransmission = info.retransmission; 443 QuicPacketNumber retransmission = info.retransmission;
406 while (retransmission != 0) { 444 while (retransmission != 0) {
407 const TransmissionInfo& retransmit_info = 445 const QuicTransmissionInfo& retransmit_info =
408 unacked_packets_.GetTransmissionInfo(retransmission); 446 unacked_packets_.GetTransmissionInfo(retransmission);
409 retransmission = retransmit_info.retransmission; 447 retransmission = retransmit_info.retransmission;
410 RecordOneSpuriousRetransmission(retransmit_info); 448 RecordOneSpuriousRetransmission(retransmit_info);
411 } 449 }
412 // Only inform the loss detection of spurious retransmits it caused. 450 // Only inform the loss detection of spurious retransmits it caused.
413 if (unacked_packets_.GetTransmissionInfo(info.retransmission) 451 if (unacked_packets_.GetTransmissionInfo(info.retransmission)
414 .transmission_type == LOSS_RETRANSMISSION) { 452 .transmission_type == LOSS_RETRANSMISSION) {
415 loss_algorithm_->SpuriousRetransmitDetected( 453 loss_algorithm_->SpuriousRetransmitDetected(
416 unacked_packets_, clock_->Now(), rtt_stats_, info.retransmission); 454 unacked_packets_, clock_->Now(), rtt_stats_, info.retransmission);
417 } 455 }
418 } 456 }
419 457
420 bool QuicSentPacketManager::HasPendingRetransmissions() const { 458 bool QuicSentPacketManager::HasPendingRetransmissions() const {
421 return !pending_retransmissions_.empty(); 459 return !pending_retransmissions_.empty();
422 } 460 }
423 461
424 PendingRetransmission QuicSentPacketManager::NextPendingRetransmission() { 462 QuicPendingRetransmission QuicSentPacketManager::NextPendingRetransmission() {
425 QUIC_BUG_IF(pending_retransmissions_.empty()) 463 QUIC_BUG_IF(pending_retransmissions_.empty())
426 << "Unexpected call to PendingRetransmissions() with empty pending " 464 << "Unexpected call to PendingRetransmissions() with empty pending "
427 << "retransmission list. Corrupted memory usage imminent."; 465 << "retransmission list. Corrupted memory usage imminent.";
428 QuicPacketNumber packet_number = pending_retransmissions_.begin()->first; 466 QuicPacketNumber packet_number = pending_retransmissions_.begin()->first;
429 TransmissionType transmission_type = pending_retransmissions_.begin()->second; 467 TransmissionType transmission_type = pending_retransmissions_.begin()->second;
430 if (unacked_packets_.HasPendingCryptoPackets()) { 468 if (unacked_packets_.HasPendingCryptoPackets()) {
431 // Ensure crypto packets are retransmitted before other packets. 469 // Ensure crypto packets are retransmitted before other packets.
432 for (const auto& pair : pending_retransmissions_) { 470 for (const auto& pair : pending_retransmissions_) {
433 if (HasCryptoHandshake( 471 if (HasCryptoHandshake(
434 unacked_packets_.GetTransmissionInfo(pair.first))) { 472 unacked_packets_.GetTransmissionInfo(pair.first))) {
435 packet_number = pair.first; 473 packet_number = pair.first;
436 transmission_type = pair.second; 474 transmission_type = pair.second;
437 break; 475 break;
438 } 476 }
439 } 477 }
440 } 478 }
441 DCHECK(unacked_packets_.IsUnacked(packet_number)) << packet_number; 479 DCHECK(unacked_packets_.IsUnacked(packet_number)) << packet_number;
442 const TransmissionInfo& transmission_info = 480 const QuicTransmissionInfo& transmission_info =
443 unacked_packets_.GetTransmissionInfo(packet_number); 481 unacked_packets_.GetTransmissionInfo(packet_number);
444 DCHECK(!transmission_info.retransmittable_frames.empty()); 482 DCHECK(!transmission_info.retransmittable_frames.empty());
445 483
446 return PendingRetransmission(path_id_, packet_number, transmission_type, 484 return QuicPendingRetransmission(path_id_, packet_number, transmission_type,
447 transmission_info.retransmittable_frames, 485 transmission_info.retransmittable_frames,
448 transmission_info.has_crypto_handshake, 486 transmission_info.has_crypto_handshake,
449 transmission_info.num_padding_bytes, 487 transmission_info.num_padding_bytes,
450 transmission_info.encryption_level, 488 transmission_info.encryption_level,
451 transmission_info.packet_number_length); 489 transmission_info.packet_number_length);
452 } 490 }
453 491
454 QuicPacketNumber QuicSentPacketManager::GetNewestRetransmission( 492 QuicPacketNumber QuicSentPacketManager::GetNewestRetransmission(
455 QuicPacketNumber packet_number, 493 QuicPacketNumber packet_number,
456 const TransmissionInfo& transmission_info) const { 494 const QuicTransmissionInfo& transmission_info) const {
457 QuicPacketNumber retransmission = transmission_info.retransmission; 495 QuicPacketNumber retransmission = transmission_info.retransmission;
458 while (retransmission != 0) { 496 while (retransmission != 0) {
459 packet_number = retransmission; 497 packet_number = retransmission;
460 retransmission = 498 retransmission =
461 unacked_packets_.GetTransmissionInfo(retransmission).retransmission; 499 unacked_packets_.GetTransmissionInfo(retransmission).retransmission;
462 } 500 }
463 return packet_number; 501 return packet_number;
464 } 502 }
465 503
466 void QuicSentPacketManager::MarkPacketNotRetransmittable( 504 void QuicSentPacketManager::MarkPacketNotRetransmittable(
467 QuicPacketNumber packet_number, 505 QuicPacketNumber packet_number,
468 QuicTime::Delta ack_delay_time) { 506 QuicTime::Delta ack_delay_time) {
469 if (!unacked_packets_.IsUnacked(packet_number)) { 507 if (!unacked_packets_.IsUnacked(packet_number)) {
470 return; 508 return;
471 } 509 }
472 510
473 const TransmissionInfo& transmission_info = 511 const QuicTransmissionInfo& transmission_info =
474 unacked_packets_.GetTransmissionInfo(packet_number); 512 unacked_packets_.GetTransmissionInfo(packet_number);
475 QuicPacketNumber newest_transmission = 513 QuicPacketNumber newest_transmission =
476 GetNewestRetransmission(packet_number, transmission_info); 514 GetNewestRetransmission(packet_number, transmission_info);
477 // We do not need to retransmit this packet anymore. 515 // We do not need to retransmit this packet anymore.
478 if (delegate_ != nullptr) { 516 if (delegate_ != nullptr) {
479 delegate_->OnPacketMarkedNotRetransmittable(path_id_, newest_transmission, 517 delegate_->OnPacketMarkedNotRetransmittable(path_id_, newest_transmission,
480 ack_delay_time); 518 ack_delay_time);
481 } else { 519 } else {
482 pending_retransmissions_.erase(newest_transmission); 520 pending_retransmissions_.erase(newest_transmission);
483 } 521 }
484 522
485 unacked_packets_.NotifyAndClearListeners(newest_transmission, ack_delay_time); 523 unacked_packets_.NotifyAndClearListeners(newest_transmission, ack_delay_time);
486 unacked_packets_.RemoveRetransmittability(packet_number); 524 unacked_packets_.RemoveRetransmittability(packet_number);
487 } 525 }
488 526
489 void QuicSentPacketManager::MarkPacketHandled(QuicPacketNumber packet_number, 527 void QuicSentPacketManager::MarkPacketHandled(QuicPacketNumber packet_number,
490 TransmissionInfo* info, 528 QuicTransmissionInfo* info,
491 QuicTime::Delta ack_delay_time) { 529 QuicTime::Delta ack_delay_time) {
492 QuicPacketNumber newest_transmission = 530 QuicPacketNumber newest_transmission =
493 GetNewestRetransmission(packet_number, *info); 531 GetNewestRetransmission(packet_number, *info);
494 // Remove the most recent packet, if it is pending retransmission. 532 // Remove the most recent packet, if it is pending retransmission.
495 if (delegate_ != nullptr) { 533 if (delegate_ != nullptr) {
496 delegate_->OnPacketMarkedHandled(path_id_, newest_transmission, 534 delegate_->OnPacketMarkedHandled(path_id_, newest_transmission,
497 ack_delay_time); 535 ack_delay_time);
498 } else { 536 } else {
499 pending_retransmissions_.erase(newest_transmission); 537 pending_retransmissions_.erase(newest_transmission);
500 } 538 }
501 539
502 // The AckListener needs to be notified about the most recent 540 // The AckListener needs to be notified about the most recent
503 // transmission, since that's the one only one it tracks. 541 // transmission, since that's the one only one it tracks.
504 if (newest_transmission == packet_number) { 542 if (newest_transmission == packet_number) {
505 unacked_packets_.NotifyAndClearListeners(&info->ack_listeners, 543 unacked_packets_.NotifyAndClearListeners(&info->ack_listeners,
506 ack_delay_time); 544 ack_delay_time);
507 } else { 545 } else {
508 unacked_packets_.NotifyAndClearListeners(newest_transmission, 546 unacked_packets_.NotifyAndClearListeners(newest_transmission,
509 ack_delay_time); 547 ack_delay_time);
510 RecordSpuriousRetransmissions(*info, packet_number); 548 RecordSpuriousRetransmissions(*info, packet_number);
511 // Remove the most recent packet from flight if it's a crypto handshake 549 // Remove the most recent packet from flight if it's a crypto handshake
512 // packet, since they won't be acked now that one has been processed. 550 // packet, since they won't be acked now that one has been processed.
513 // Other crypto handshake packets won't be in flight, only the newest 551 // Other crypto handshake packets won't be in flight, only the newest
514 // transmission of a crypto packet is in flight at once. 552 // transmission of a crypto packet is in flight at once.
515 // TODO(ianswett): Instead of handling all crypto packets special, 553 // TODO(ianswett): Instead of handling all crypto packets special,
516 // only handle nullptr encrypted packets in a special way. 554 // only handle nullptr encrypted packets in a special way.
517 const TransmissionInfo& newest_transmission_info = 555 const QuicTransmissionInfo& newest_transmission_info =
518 unacked_packets_.GetTransmissionInfo(newest_transmission); 556 unacked_packets_.GetTransmissionInfo(newest_transmission);
519 if (HasCryptoHandshake(newest_transmission_info)) { 557 if (HasCryptoHandshake(newest_transmission_info)) {
520 unacked_packets_.RemoveFromInFlight(newest_transmission); 558 unacked_packets_.RemoveFromInFlight(newest_transmission);
521 } 559 }
522 } 560 }
523 561
524 if (network_change_visitor_ != nullptr && 562 if (network_change_visitor_ != nullptr &&
525 info->bytes_sent > largest_mtu_acked_) { 563 info->bytes_sent > largest_mtu_acked_) {
526 largest_mtu_acked_ = info->bytes_sent; 564 largest_mtu_acked_ = info->bytes_sent;
527 network_change_visitor_->OnPathMtuIncreased(largest_mtu_acked_); 565 network_change_visitor_->OnPathMtuIncreased(largest_mtu_acked_);
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 QuicTime ack_receive_time) { 776 QuicTime ack_receive_time) {
739 // We rely on ack_delay_time to compute an RTT estimate, so we 777 // We rely on ack_delay_time to compute an RTT estimate, so we
740 // only update rtt when the largest observed gets acked. 778 // only update rtt when the largest observed gets acked.
741 // NOTE: If ack is a truncated ack, then the largest observed is in fact 779 // NOTE: If ack is a truncated ack, then the largest observed is in fact
742 // unacked, and may cause an RTT sample to be taken. 780 // unacked, and may cause an RTT sample to be taken.
743 if (!unacked_packets_.IsUnacked(ack_frame.largest_observed)) { 781 if (!unacked_packets_.IsUnacked(ack_frame.largest_observed)) {
744 return false; 782 return false;
745 } 783 }
746 // We calculate the RTT based on the highest ACKed packet number, the lower 784 // We calculate the RTT based on the highest ACKed packet number, the lower
747 // packet numbers will include the ACK aggregation delay. 785 // packet numbers will include the ACK aggregation delay.
748 const TransmissionInfo& transmission_info = 786 const QuicTransmissionInfo& transmission_info =
749 unacked_packets_.GetTransmissionInfo(ack_frame.largest_observed); 787 unacked_packets_.GetTransmissionInfo(ack_frame.largest_observed);
750 // Ensure the packet has a valid sent time. 788 // Ensure the packet has a valid sent time.
751 if (transmission_info.sent_time == QuicTime::Zero()) { 789 if (transmission_info.sent_time == QuicTime::Zero()) {
752 QUIC_BUG << "Acked packet has zero sent time, largest_observed:" 790 QUIC_BUG << "Acked packet has zero sent time, largest_observed:"
753 << ack_frame.largest_observed; 791 << ack_frame.largest_observed;
754 return false; 792 return false;
755 } 793 }
756 794
757 QuicTime::Delta send_delta = ack_receive_time - transmission_info.sent_time; 795 QuicTime::Delta send_delta = ack_receive_time - transmission_info.sent_time;
758 const int kMaxSendDeltaSeconds = 30; 796 const int kMaxSendDeltaSeconds = 30;
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 } 1042 }
1005 1043
1006 size_t QuicSentPacketManager::GetConsecutiveRtoCount() const { 1044 size_t QuicSentPacketManager::GetConsecutiveRtoCount() const {
1007 return consecutive_rto_count_; 1045 return consecutive_rto_count_;
1008 } 1046 }
1009 1047
1010 size_t QuicSentPacketManager::GetConsecutiveTlpCount() const { 1048 size_t QuicSentPacketManager::GetConsecutiveTlpCount() const {
1011 return consecutive_tlp_count_; 1049 return consecutive_tlp_count_;
1012 } 1050 }
1013 1051
1014 TransmissionInfo* QuicSentPacketManager::GetMutableTransmissionInfo( 1052 QuicTransmissionInfo* QuicSentPacketManager::GetMutableTransmissionInfo(
1015 QuicPacketNumber packet_number) { 1053 QuicPacketNumber packet_number) {
1016 return unacked_packets_.GetMutableTransmissionInfo(packet_number); 1054 return unacked_packets_.GetMutableTransmissionInfo(packet_number);
1017 } 1055 }
1018 1056
1019 void QuicSentPacketManager::RemoveObsoletePackets() { 1057 void QuicSentPacketManager::RemoveObsoletePackets() {
1020 unacked_packets_.RemoveObsoletePackets(); 1058 unacked_packets_.RemoveObsoletePackets();
1021 } 1059 }
1022 1060
1023 void QuicSentPacketManager::OnApplicationLimited() { 1061 void QuicSentPacketManager::OnApplicationLimited() {
1024 send_algorithm_->OnApplicationLimited(unacked_packets_.bytes_in_flight()); 1062 send_algorithm_->OnApplicationLimited(unacked_packets_.bytes_in_flight());
1025 } 1063 }
1026 1064
1065 const SendAlgorithmInterface* QuicSentPacketManager::GetSendAlgorithm() const {
1066 return send_algorithm_.get();
1067 }
1068
1027 } // namespace net 1069 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_sent_packet_manager.h ('k') | net/quic/core/quic_sent_packet_manager_interface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698