| OLD | NEW |
| 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 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 ++stats_->packets_spuriously_retransmitted; | 407 ++stats_->packets_spuriously_retransmitted; |
| 408 if (debug_delegate_ != nullptr) { | 408 if (debug_delegate_ != nullptr) { |
| 409 debug_delegate_->OnSpuriousPacketRetransmission(info.transmission_type, | 409 debug_delegate_->OnSpuriousPacketRetransmission(info.transmission_type, |
| 410 info.bytes_sent); | 410 info.bytes_sent); |
| 411 } | 411 } |
| 412 } | 412 } |
| 413 | 413 |
| 414 void QuicSentPacketManager::RecordSpuriousRetransmissions( | 414 void QuicSentPacketManager::RecordSpuriousRetransmissions( |
| 415 const TransmissionInfo& info, | 415 const TransmissionInfo& info, |
| 416 QuicPacketNumber acked_packet_number) { | 416 QuicPacketNumber acked_packet_number) { |
| 417 if (unacked_packets_.track_single_retransmission()) { | 417 QuicPacketNumber retransmission = info.retransmission; |
| 418 QuicPacketNumber retransmission = info.retransmission; | 418 while (retransmission != 0) { |
| 419 while (retransmission != 0) { | |
| 420 const TransmissionInfo& retransmit_info = | |
| 421 unacked_packets_.GetTransmissionInfo(retransmission); | |
| 422 retransmission = retransmit_info.retransmission; | |
| 423 RecordOneSpuriousRetransmission(retransmit_info); | |
| 424 } | |
| 425 return; | |
| 426 } | |
| 427 const PacketNumberList* all_transmissions = info.all_transmissions; | |
| 428 for (PacketNumberList::const_reverse_iterator it = | |
| 429 all_transmissions->rbegin(); | |
| 430 it != all_transmissions->rend() && *it > acked_packet_number; ++it) { | |
| 431 // ianswett: Prevents crash in b/20552846. | |
| 432 if (*it < unacked_packets_.GetLeastUnacked() || | |
| 433 *it > unacked_packets_.largest_sent_packet()) { | |
| 434 QUIC_BUG << "Retransmission out of range:" << *it | |
| 435 << " least unacked:" << unacked_packets_.GetLeastUnacked() | |
| 436 << " largest sent:" << unacked_packets_.largest_sent_packet(); | |
| 437 return; | |
| 438 } | |
| 439 const TransmissionInfo& retransmit_info = | 419 const TransmissionInfo& retransmit_info = |
| 440 unacked_packets_.GetTransmissionInfo(*it); | 420 unacked_packets_.GetTransmissionInfo(retransmission); |
| 441 | 421 retransmission = retransmit_info.retransmission; |
| 442 RecordOneSpuriousRetransmission(retransmit_info); | 422 RecordOneSpuriousRetransmission(retransmit_info); |
| 443 } | 423 } |
| 444 } | 424 } |
| 445 | 425 |
| 446 bool QuicSentPacketManager::HasPendingRetransmissions() const { | 426 bool QuicSentPacketManager::HasPendingRetransmissions() const { |
| 447 return !pending_retransmissions_.empty(); | 427 return !pending_retransmissions_.empty(); |
| 448 } | 428 } |
| 449 | 429 |
| 450 PendingRetransmission QuicSentPacketManager::NextPendingRetransmission() { | 430 PendingRetransmission QuicSentPacketManager::NextPendingRetransmission() { |
| 451 QUIC_BUG_IF(pending_retransmissions_.empty()) | 431 QUIC_BUG_IF(pending_retransmissions_.empty()) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 473 transmission_info.retransmittable_frames, | 453 transmission_info.retransmittable_frames, |
| 474 transmission_info.has_crypto_handshake, | 454 transmission_info.has_crypto_handshake, |
| 475 transmission_info.needs_padding, | 455 transmission_info.needs_padding, |
| 476 transmission_info.encryption_level, | 456 transmission_info.encryption_level, |
| 477 transmission_info.packet_number_length); | 457 transmission_info.packet_number_length); |
| 478 } | 458 } |
| 479 | 459 |
| 480 QuicPacketNumber QuicSentPacketManager::GetNewestRetransmission( | 460 QuicPacketNumber QuicSentPacketManager::GetNewestRetransmission( |
| 481 QuicPacketNumber packet_number, | 461 QuicPacketNumber packet_number, |
| 482 const TransmissionInfo& transmission_info) const { | 462 const TransmissionInfo& transmission_info) const { |
| 483 if (unacked_packets_.track_single_retransmission()) { | 463 QuicPacketNumber retransmission = transmission_info.retransmission; |
| 484 QuicPacketNumber retransmission = transmission_info.retransmission; | 464 while (retransmission != 0) { |
| 485 while (retransmission != 0) { | 465 packet_number = retransmission; |
| 486 packet_number = retransmission; | 466 retransmission = |
| 487 retransmission = | 467 unacked_packets_.GetTransmissionInfo(retransmission).retransmission; |
| 488 unacked_packets_.GetTransmissionInfo(retransmission).retransmission; | |
| 489 } | |
| 490 return packet_number; | |
| 491 } else { | |
| 492 return transmission_info.all_transmissions == nullptr | |
| 493 ? packet_number | |
| 494 : *transmission_info.all_transmissions->rbegin(); | |
| 495 } | 468 } |
| 469 return packet_number; |
| 496 } | 470 } |
| 497 | 471 |
| 498 void QuicSentPacketManager::MarkPacketNotRetransmittable( | 472 void QuicSentPacketManager::MarkPacketNotRetransmittable( |
| 499 QuicPacketNumber packet_number, | 473 QuicPacketNumber packet_number, |
| 500 QuicTime::Delta ack_delay_time) { | 474 QuicTime::Delta ack_delay_time) { |
| 501 if (!unacked_packets_.IsUnacked(packet_number)) { | 475 if (!unacked_packets_.IsUnacked(packet_number)) { |
| 502 return; | 476 return; |
| 503 } | 477 } |
| 504 | 478 |
| 505 const TransmissionInfo& transmission_info = | 479 const TransmissionInfo& transmission_info = |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 QuicPacketNumber packet_number = unacked_packets_.GetLeastUnacked(); | 674 QuicPacketNumber packet_number = unacked_packets_.GetLeastUnacked(); |
| 701 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 675 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
| 702 it != unacked_packets_.end(); ++it, ++packet_number) { | 676 it != unacked_packets_.end(); ++it, ++packet_number) { |
| 703 if (!it->retransmittable_frames.empty() && | 677 if (!it->retransmittable_frames.empty() && |
| 704 pending_timer_transmission_count_ < kMaxRetransmissionsOnTimeout) { | 678 pending_timer_transmission_count_ < kMaxRetransmissionsOnTimeout) { |
| 705 MarkForRetransmission(packet_number, RTO_RETRANSMISSION); | 679 MarkForRetransmission(packet_number, RTO_RETRANSMISSION); |
| 706 ++pending_timer_transmission_count_; | 680 ++pending_timer_transmission_count_; |
| 707 } | 681 } |
| 708 // Abandon non-retransmittable data that's in flight to ensure it doesn't | 682 // Abandon non-retransmittable data that's in flight to ensure it doesn't |
| 709 // fill up the congestion window. | 683 // fill up the congestion window. |
| 710 const bool has_retransmissions = | 684 const bool has_retransmissions = it->retransmission != 0; |
| 711 unacked_packets_.track_single_retransmission() | |
| 712 ? it->retransmission != 0 | |
| 713 : it->all_transmissions != nullptr; | |
| 714 if (it->retransmittable_frames.empty() && it->in_flight && | 685 if (it->retransmittable_frames.empty() && it->in_flight && |
| 715 !has_retransmissions) { | 686 !has_retransmissions) { |
| 716 // Log only for non-retransmittable data. | 687 // Log only for non-retransmittable data. |
| 717 // Retransmittable data is marked as lost during loss detection, and will | 688 // Retransmittable data is marked as lost during loss detection, and will |
| 718 // be logged later. | 689 // be logged later. |
| 719 unacked_packets_.RemoveFromInFlight(packet_number); | 690 unacked_packets_.RemoveFromInFlight(packet_number); |
| 720 if (FLAGS_quic_log_loss_event && debug_delegate_ != nullptr) { | 691 if (FLAGS_quic_log_loss_event && debug_delegate_ != nullptr) { |
| 721 debug_delegate_->OnPacketLoss(packet_number, RTO_RETRANSMISSION, | 692 debug_delegate_->OnPacketLoss(packet_number, RTO_RETRANSMISSION, |
| 722 clock_->Now()); | 693 clock_->Now()); |
| 723 } | 694 } |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1033 TransmissionInfo* QuicSentPacketManager::GetMutableTransmissionInfo( | 1004 TransmissionInfo* QuicSentPacketManager::GetMutableTransmissionInfo( |
| 1034 QuicPacketNumber packet_number) { | 1005 QuicPacketNumber packet_number) { |
| 1035 return unacked_packets_.GetMutableTransmissionInfo(packet_number); | 1006 return unacked_packets_.GetMutableTransmissionInfo(packet_number); |
| 1036 } | 1007 } |
| 1037 | 1008 |
| 1038 void QuicSentPacketManager::RemoveObsoletePackets() { | 1009 void QuicSentPacketManager::RemoveObsoletePackets() { |
| 1039 unacked_packets_.RemoveObsoletePackets(); | 1010 unacked_packets_.RemoveObsoletePackets(); |
| 1040 } | 1011 } |
| 1041 | 1012 |
| 1042 } // namespace net | 1013 } // namespace net |
| OLD | NEW |