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_bug_tracker.h" | 9 #include "net/quic/quic_bug_tracker.h" |
10 #include "net/quic/quic_connection_stats.h" | 10 #include "net/quic/quic_connection_stats.h" |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 // Transfer the AckListeners if any are present. | 116 // Transfer the AckListeners if any are present. |
117 info->ack_listeners.swap(transmission_info->ack_listeners); | 117 info->ack_listeners.swap(transmission_info->ack_listeners); |
118 QUIC_BUG_IF(frames == nullptr) | 118 QUIC_BUG_IF(frames == nullptr) |
119 << "Attempt to retransmit packet with no " | 119 << "Attempt to retransmit packet with no " |
120 << "retransmittable frames: " << old_packet_number; | 120 << "retransmittable frames: " << old_packet_number; |
121 | 121 |
122 // Don't link old transmissions to new ones when version or | 122 // Don't link old transmissions to new ones when version or |
123 // encryption changes. | 123 // encryption changes. |
124 if (transmission_type == ALL_INITIAL_RETRANSMISSION || | 124 if (transmission_type == ALL_INITIAL_RETRANSMISSION || |
125 transmission_type == ALL_UNACKED_RETRANSMISSION) { | 125 transmission_type == ALL_UNACKED_RETRANSMISSION) { |
126 RemoveAckability(transmission_info); | 126 transmission_info->is_unackable = true; |
127 } else { | 127 } else { |
128 transmission_info->retransmission = new_packet_number; | 128 transmission_info->retransmission = new_packet_number; |
129 } | 129 } |
130 // Proactively remove obsolete packets so the least unacked can be raised. | 130 // Proactively remove obsolete packets so the least unacked can be raised. |
131 RemoveObsoletePackets(); | 131 RemoveObsoletePackets(); |
132 } | 132 } |
133 | 133 |
134 bool QuicUnackedPacketMap::HasRetransmittableFrames( | 134 bool QuicUnackedPacketMap::HasRetransmittableFrames( |
135 QuicPacketNumber packet_number) const { | 135 QuicPacketNumber packet_number) const { |
136 DCHECK_GE(packet_number, least_unacked_); | 136 DCHECK_GE(packet_number, least_unacked_); |
(...skipping 21 matching lines...) Expand all Loading... |
158 } | 158 } |
159 | 159 |
160 void QuicUnackedPacketMap::RemoveRetransmittability( | 160 void QuicUnackedPacketMap::RemoveRetransmittability( |
161 QuicPacketNumber packet_number) { | 161 QuicPacketNumber packet_number) { |
162 DCHECK_GE(packet_number, least_unacked_); | 162 DCHECK_GE(packet_number, least_unacked_); |
163 DCHECK_LT(packet_number, least_unacked_ + unacked_packets_.size()); | 163 DCHECK_LT(packet_number, least_unacked_ + unacked_packets_.size()); |
164 TransmissionInfo* info = &unacked_packets_[packet_number - least_unacked_]; | 164 TransmissionInfo* info = &unacked_packets_[packet_number - least_unacked_]; |
165 RemoveRetransmittability(info); | 165 RemoveRetransmittability(info); |
166 } | 166 } |
167 | 167 |
168 void QuicUnackedPacketMap::RemoveAckability(TransmissionInfo* info) { | |
169 DCHECK(info->retransmittable_frames.empty()); | |
170 DCHECK_EQ(0u, info->retransmission); | |
171 info->is_unackable = true; | |
172 } | |
173 | |
174 void QuicUnackedPacketMap::MaybeRemoveRetransmittableFrames( | 168 void QuicUnackedPacketMap::MaybeRemoveRetransmittableFrames( |
175 TransmissionInfo* transmission_info) { | 169 TransmissionInfo* transmission_info) { |
176 if (transmission_info->has_crypto_handshake) { | 170 if (transmission_info->has_crypto_handshake) { |
177 DCHECK(!transmission_info->retransmittable_frames.empty()); | 171 DCHECK(!transmission_info->retransmittable_frames.empty()); |
178 DCHECK_LT(0u, pending_crypto_packet_count_); | 172 DCHECK_LT(0u, pending_crypto_packet_count_); |
179 --pending_crypto_packet_count_; | 173 --pending_crypto_packet_count_; |
180 transmission_info->has_crypto_handshake = false; | 174 transmission_info->has_crypto_handshake = false; |
181 } | 175 } |
182 QuicUtils::DeleteFrames(&transmission_info->retransmittable_frames); | 176 QuicUtils::DeleteFrames(&transmission_info->retransmittable_frames); |
183 } | 177 } |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 } | 247 } |
254 } | 248 } |
255 | 249 |
256 void QuicUnackedPacketMap::RemoveFromInFlight(QuicPacketNumber packet_number) { | 250 void QuicUnackedPacketMap::RemoveFromInFlight(QuicPacketNumber packet_number) { |
257 DCHECK_GE(packet_number, least_unacked_); | 251 DCHECK_GE(packet_number, least_unacked_); |
258 DCHECK_LT(packet_number, least_unacked_ + unacked_packets_.size()); | 252 DCHECK_LT(packet_number, least_unacked_ + unacked_packets_.size()); |
259 TransmissionInfo* info = &unacked_packets_[packet_number - least_unacked_]; | 253 TransmissionInfo* info = &unacked_packets_[packet_number - least_unacked_]; |
260 RemoveFromInFlight(info); | 254 RemoveFromInFlight(info); |
261 } | 255 } |
262 | 256 |
| 257 void QuicUnackedPacketMap::RestoreToInFlight(QuicPacketNumber packet_number) { |
| 258 DCHECK_GE(packet_number, least_unacked_); |
| 259 DCHECK_LT(packet_number, least_unacked_ + unacked_packets_.size()); |
| 260 TransmissionInfo* info = &unacked_packets_[packet_number - least_unacked_]; |
| 261 DCHECK(!info->is_unackable); |
| 262 bytes_in_flight_ += info->bytes_sent; |
| 263 info->in_flight = true; |
| 264 } |
| 265 |
263 void QuicUnackedPacketMap::CancelRetransmissionsForStream( | 266 void QuicUnackedPacketMap::CancelRetransmissionsForStream( |
264 QuicStreamId stream_id) { | 267 QuicStreamId stream_id) { |
265 QuicPacketNumber packet_number = least_unacked_; | 268 QuicPacketNumber packet_number = least_unacked_; |
266 for (UnackedPacketMap::iterator it = unacked_packets_.begin(); | 269 for (UnackedPacketMap::iterator it = unacked_packets_.begin(); |
267 it != unacked_packets_.end(); ++it, ++packet_number) { | 270 it != unacked_packets_.end(); ++it, ++packet_number) { |
268 QuicFrames* frames = &it->retransmittable_frames; | 271 QuicFrames* frames = &it->retransmittable_frames; |
269 if (frames->empty()) { | 272 if (frames->empty()) { |
270 continue; | 273 continue; |
271 } | 274 } |
272 QuicUtils::RemoveFramesForStream(frames, stream_id); | 275 QuicUtils::RemoveFramesForStream(frames, stream_id); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 } | 352 } |
350 } | 353 } |
351 return false; | 354 return false; |
352 } | 355 } |
353 | 356 |
354 QuicPacketNumber QuicUnackedPacketMap::GetLeastUnacked() const { | 357 QuicPacketNumber QuicUnackedPacketMap::GetLeastUnacked() const { |
355 return least_unacked_; | 358 return least_unacked_; |
356 } | 359 } |
357 | 360 |
358 } // namespace net | 361 } // namespace net |
OLD | NEW |