| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_unacked_packet_map.h" | 5 #include "net/quic/quic_unacked_packet_map.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/quic_connection_stats.h" | 9 #include "net/quic/quic_connection_stats.h" |
| 10 #include "net/quic/quic_utils_chromium.h" | 10 #include "net/quic/quic_utils_chromium.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 } | 35 } |
| 36 | 36 |
| 37 void QuicUnackedPacketMap::AddSentPacket( | 37 void QuicUnackedPacketMap::AddSentPacket( |
| 38 const SerializedPacket& packet, | 38 const SerializedPacket& packet, |
| 39 QuicPacketSequenceNumber old_sequence_number, | 39 QuicPacketSequenceNumber old_sequence_number, |
| 40 TransmissionType transmission_type, | 40 TransmissionType transmission_type, |
| 41 QuicTime sent_time, | 41 QuicTime sent_time, |
| 42 QuicByteCount bytes_sent, | 42 QuicByteCount bytes_sent, |
| 43 bool set_in_flight) { | 43 bool set_in_flight) { |
| 44 QuicPacketSequenceNumber sequence_number = packet.sequence_number; | 44 QuicPacketSequenceNumber sequence_number = packet.sequence_number; |
| 45 DCHECK_LT(largest_sent_packet_, sequence_number); | 45 LOG_IF(DFATAL, largest_sent_packet_ > sequence_number); |
| 46 DCHECK_GE(sequence_number, least_unacked_ + unacked_packets_.size()); | 46 DCHECK_GE(sequence_number, least_unacked_ + unacked_packets_.size()); |
| 47 while (least_unacked_ + unacked_packets_.size() < sequence_number) { | 47 while (least_unacked_ + unacked_packets_.size() < sequence_number) { |
| 48 unacked_packets_.push_back(TransmissionInfo()); | 48 unacked_packets_.push_back(TransmissionInfo()); |
| 49 unacked_packets_.back().is_unackable = true; | 49 unacked_packets_.back().is_unackable = true; |
| 50 } | 50 } |
| 51 | 51 |
| 52 TransmissionInfo info; | 52 TransmissionInfo info(packet.retransmittable_frames, |
| 53 packet.sequence_number_length, |
| 54 transmission_type, |
| 55 sent_time); |
| 53 if (old_sequence_number == 0) { | 56 if (old_sequence_number == 0) { |
| 54 if (packet.retransmittable_frames != nullptr && | 57 if (packet.retransmittable_frames != nullptr && |
| 55 packet.retransmittable_frames->HasCryptoHandshake() == IS_HANDSHAKE) { | 58 packet.retransmittable_frames->HasCryptoHandshake() == IS_HANDSHAKE) { |
| 56 ++pending_crypto_packet_count_; | 59 ++pending_crypto_packet_count_; |
| 57 } | 60 } |
| 58 info = TransmissionInfo(packet.retransmittable_frames, | |
| 59 packet.sequence_number_length); | |
| 60 } else { | 61 } else { |
| 61 info = OnRetransmittedPacket( | 62 TransferRetransmissionInfo( |
| 62 old_sequence_number, sequence_number, transmission_type); | 63 old_sequence_number, sequence_number, transmission_type, &info); |
| 63 } | 64 } |
| 64 info.sent_time = sent_time; | |
| 65 | 65 |
| 66 largest_sent_packet_ = max(sequence_number, largest_sent_packet_); | 66 largest_sent_packet_ = sequence_number; |
| 67 if (set_in_flight) { | 67 if (set_in_flight) { |
| 68 bytes_in_flight_ += bytes_sent; | 68 bytes_in_flight_ += bytes_sent; |
| 69 info.bytes_sent = bytes_sent; | 69 info.bytes_sent = bytes_sent; |
| 70 info.in_flight = true; | 70 info.in_flight = true; |
| 71 } | 71 } |
| 72 unacked_packets_.push_back(info); | 72 unacked_packets_.push_back(info); |
| 73 } | 73 } |
| 74 | 74 |
| 75 void QuicUnackedPacketMap::RemoveObsoletePackets() { | 75 void QuicUnackedPacketMap::RemoveObsoletePackets() { |
| 76 while (!unacked_packets_.empty()) { | 76 while (!unacked_packets_.empty()) { |
| 77 if (!IsPacketRemovable(least_unacked_, unacked_packets_.front())) { | 77 if (!IsPacketRemovable(least_unacked_, unacked_packets_.front())) { |
| 78 break; | 78 break; |
| 79 } | 79 } |
| 80 unacked_packets_.pop_front(); | 80 unacked_packets_.pop_front(); |
| 81 ++least_unacked_; | 81 ++least_unacked_; |
| 82 } | 82 } |
| 83 } | 83 } |
| 84 | 84 |
| 85 TransmissionInfo QuicUnackedPacketMap::OnRetransmittedPacket( | 85 void QuicUnackedPacketMap::TransferRetransmissionInfo( |
| 86 QuicPacketSequenceNumber old_sequence_number, | 86 QuicPacketSequenceNumber old_sequence_number, |
| 87 QuicPacketSequenceNumber new_sequence_number, | 87 QuicPacketSequenceNumber new_sequence_number, |
| 88 TransmissionType transmission_type) { | 88 TransmissionType transmission_type, |
| 89 TransmissionInfo* info) { |
| 89 DCHECK_GE(old_sequence_number, least_unacked_); | 90 DCHECK_GE(old_sequence_number, least_unacked_); |
| 90 DCHECK_LT(old_sequence_number, least_unacked_ + unacked_packets_.size()); | 91 DCHECK_LT(old_sequence_number, least_unacked_ + unacked_packets_.size()); |
| 91 DCHECK_GE(new_sequence_number, least_unacked_ + unacked_packets_.size()); | 92 DCHECK_GE(new_sequence_number, least_unacked_ + unacked_packets_.size()); |
| 92 DCHECK_NE(NOT_RETRANSMISSION, transmission_type); | 93 DCHECK_NE(NOT_RETRANSMISSION, transmission_type); |
| 93 | 94 |
| 94 // TODO(ianswett): Discard and lose the packet lazily instead of immediately. | 95 // TODO(ianswett): Discard and lose the packet lazily instead of immediately. |
| 95 TransmissionInfo* transmission_info = | 96 TransmissionInfo* transmission_info = |
| 96 &unacked_packets_.at(old_sequence_number - least_unacked_); | 97 &unacked_packets_.at(old_sequence_number - least_unacked_); |
| 97 RetransmittableFrames* frames = transmission_info->retransmittable_frames; | 98 RetransmittableFrames* frames = transmission_info->retransmittable_frames; |
| 98 transmission_info->retransmittable_frames = nullptr; | 99 transmission_info->retransmittable_frames = nullptr; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 123 if (transmission_type == ALL_INITIAL_RETRANSMISSION || | 124 if (transmission_type == ALL_INITIAL_RETRANSMISSION || |
| 124 transmission_type == ALL_UNACKED_RETRANSMISSION) { | 125 transmission_type == ALL_UNACKED_RETRANSMISSION) { |
| 125 RemoveAckability(transmission_info); | 126 RemoveAckability(transmission_info); |
| 126 } else { | 127 } else { |
| 127 if (transmission_info->all_transmissions == nullptr) { | 128 if (transmission_info->all_transmissions == nullptr) { |
| 128 transmission_info->all_transmissions = new SequenceNumberList(); | 129 transmission_info->all_transmissions = new SequenceNumberList(); |
| 129 transmission_info->all_transmissions->push_back(old_sequence_number); | 130 transmission_info->all_transmissions->push_back(old_sequence_number); |
| 130 } | 131 } |
| 131 transmission_info->all_transmissions->push_back(new_sequence_number); | 132 transmission_info->all_transmissions->push_back(new_sequence_number); |
| 132 } | 133 } |
| 133 TransmissionInfo info = | 134 info->retransmittable_frames = frames; |
| 134 TransmissionInfo(frames, | 135 info->all_transmissions = transmission_info->all_transmissions; |
| 135 transmission_info->sequence_number_length, | |
| 136 transmission_type, | |
| 137 transmission_info->all_transmissions); | |
| 138 // Proactively remove obsolete packets so the least unacked can be raised. | 136 // Proactively remove obsolete packets so the least unacked can be raised. |
| 139 RemoveObsoletePackets(); | 137 RemoveObsoletePackets(); |
| 140 return info; | |
| 141 } | 138 } |
| 142 | 139 |
| 143 void QuicUnackedPacketMap::ClearAllPreviousRetransmissions() { | 140 void QuicUnackedPacketMap::ClearAllPreviousRetransmissions() { |
| 144 while (!unacked_packets_.empty() && least_unacked_ < largest_observed_) { | 141 while (!unacked_packets_.empty() && least_unacked_ < largest_observed_) { |
| 145 // If this packet is in flight, or has retransmittable data, then there is | 142 // If this packet is in flight, or has retransmittable data, then there is |
| 146 // no point in clearing out any further packets, because they would not | 143 // no point in clearing out any further packets, because they would not |
| 147 // affect the high water mark. | 144 // affect the high water mark. |
| 148 TransmissionInfo* info = &unacked_packets_.front(); | 145 TransmissionInfo* info = &unacked_packets_.front(); |
| 149 if (info->in_flight || info->retransmittable_frames != nullptr) { | 146 if (info->in_flight || info->retransmittable_frames != nullptr) { |
| 150 break; | 147 break; |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_]; | 374 TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_]; |
| 378 DCHECK(!info->in_flight); | 375 DCHECK(!info->in_flight); |
| 379 DCHECK_NE(0u, info->bytes_sent); | 376 DCHECK_NE(0u, info->bytes_sent); |
| 380 DCHECK(info->sent_time.IsInitialized()); | 377 DCHECK(info->sent_time.IsInitialized()); |
| 381 | 378 |
| 382 bytes_in_flight_ += info->bytes_sent; | 379 bytes_in_flight_ += info->bytes_sent; |
| 383 info->in_flight = true; | 380 info->in_flight = true; |
| 384 } | 381 } |
| 385 | 382 |
| 386 } // namespace net | 383 } // namespace net |
| OLD | NEW |