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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 *transmission_info->all_transmissions->begin(); | 88 *transmission_info->all_transmissions->begin(); |
89 TransmissionInfo* old_info = | 89 TransmissionInfo* old_info = |
90 &unacked_packets_[old_transmission - least_unacked_]; | 90 &unacked_packets_[old_transmission - least_unacked_]; |
91 // Don't remove old packets if they're still in flight. | 91 // Don't remove old packets if they're still in flight. |
92 if (!old_info->in_flight) { | 92 if (!old_info->in_flight) { |
93 old_info->all_transmissions->pop_front(); | 93 old_info->all_transmissions->pop_front(); |
94 // This will cause the packet be removed in RemoveObsoletePackets. | 94 // This will cause the packet be removed in RemoveObsoletePackets. |
95 old_info->all_transmissions = NULL; | 95 old_info->all_transmissions = NULL; |
96 } | 96 } |
97 } | 97 } |
98 if (transmission_info->all_transmissions == NULL) { | 98 // Don't link old transmissions to new ones when version or |
99 transmission_info->all_transmissions = new SequenceNumberList(); | 99 // encryption changes. |
100 transmission_info->all_transmissions->push_back(old_sequence_number); | 100 if (transmission_type == ALL_INITIAL_RETRANSMISSION || |
| 101 transmission_type == ALL_UNACKED_RETRANSMISSION) { |
| 102 RemoveAckability(transmission_info); |
| 103 } else { |
| 104 if (transmission_info->all_transmissions == NULL) { |
| 105 transmission_info->all_transmissions = new SequenceNumberList(); |
| 106 transmission_info->all_transmissions->push_back(old_sequence_number); |
| 107 } |
| 108 transmission_info->all_transmissions->push_back(new_sequence_number); |
101 } | 109 } |
102 transmission_info->all_transmissions->push_back(new_sequence_number); | |
103 unacked_packets_.push_back( | 110 unacked_packets_.push_back( |
104 TransmissionInfo(frames, | 111 TransmissionInfo(frames, |
105 transmission_info->sequence_number_length, | 112 transmission_info->sequence_number_length, |
106 transmission_type, | 113 transmission_type, |
107 transmission_info->all_transmissions)); | 114 transmission_info->all_transmissions)); |
| 115 RemoveObsoletePackets(); |
108 } | 116 } |
109 | 117 |
110 void QuicUnackedPacketMap::ClearAllPreviousRetransmissions() { | 118 void QuicUnackedPacketMap::ClearAllPreviousRetransmissions() { |
111 while (!unacked_packets_.empty() && least_unacked_ < largest_observed_) { | 119 while (!unacked_packets_.empty() && least_unacked_ < largest_observed_) { |
112 // If this packet is in flight, or has retransmittable data, then there is | 120 // If this packet is in flight, or has retransmittable data, then there is |
113 // no point in clearing out any further packets, because they would not | 121 // no point in clearing out any further packets, because they would not |
114 // affect the high water mark. | 122 // affect the high water mark. |
115 TransmissionInfo* info = &unacked_packets_.front(); | 123 TransmissionInfo* info = &unacked_packets_.front(); |
116 if (info->in_flight || info->retransmittable_frames != NULL) { | 124 if (info->in_flight || info->retransmittable_frames != NULL) { |
117 break; | 125 break; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 for (SequenceNumberList::const_iterator it = all_transmissions->begin(); | 180 for (SequenceNumberList::const_iterator it = all_transmissions->begin(); |
173 it != all_transmissions->end(); ++it) { | 181 it != all_transmissions->end(); ++it) { |
174 TransmissionInfo* transmission_info = | 182 TransmissionInfo* transmission_info = |
175 &unacked_packets_[*it - least_unacked_]; | 183 &unacked_packets_[*it - least_unacked_]; |
176 MaybeRemoveRetransmittableFrames(transmission_info); | 184 MaybeRemoveRetransmittableFrames(transmission_info); |
177 transmission_info->all_transmissions = NULL; | 185 transmission_info->all_transmissions = NULL; |
178 } | 186 } |
179 delete all_transmissions; | 187 delete all_transmissions; |
180 } | 188 } |
181 | 189 |
| 190 void QuicUnackedPacketMap::RemoveAckability(TransmissionInfo* info) { |
| 191 DCHECK(info->retransmittable_frames == NULL); |
| 192 info->is_unackable = true; |
| 193 SequenceNumberList* all_transmissions = info->all_transmissions; |
| 194 if (all_transmissions == NULL) { |
| 195 return; |
| 196 } |
| 197 for (SequenceNumberList::const_iterator it = all_transmissions->begin(); |
| 198 it != all_transmissions->end(); ++it) { |
| 199 TransmissionInfo* transmission_info = |
| 200 &unacked_packets_[*it - least_unacked_]; |
| 201 transmission_info->all_transmissions = NULL; |
| 202 transmission_info->is_unackable = true; |
| 203 } |
| 204 delete all_transmissions; |
| 205 } |
| 206 |
182 void QuicUnackedPacketMap::MaybeRemoveRetransmittableFrames( | 207 void QuicUnackedPacketMap::MaybeRemoveRetransmittableFrames( |
183 TransmissionInfo* transmission_info) { | 208 TransmissionInfo* transmission_info) { |
184 if (transmission_info->retransmittable_frames != NULL) { | 209 if (transmission_info->retransmittable_frames != NULL) { |
185 if (transmission_info->retransmittable_frames->HasCryptoHandshake() | 210 if (transmission_info->retransmittable_frames->HasCryptoHandshake() |
186 == IS_HANDSHAKE) { | 211 == IS_HANDSHAKE) { |
187 --pending_crypto_packet_count_; | 212 --pending_crypto_packet_count_; |
188 } | 213 } |
189 delete transmission_info->retransmittable_frames; | 214 delete transmission_info->retransmittable_frames; |
190 transmission_info->retransmittable_frames = NULL; | 215 transmission_info->retransmittable_frames = NULL; |
191 } | 216 } |
(...skipping 10 matching lines...) Expand all Loading... |
202 const TransmissionInfo& info) const { | 227 const TransmissionInfo& info) const { |
203 return sequence_number <= largest_observed_ && | 228 return sequence_number <= largest_observed_ && |
204 !info.in_flight && | 229 !info.in_flight && |
205 info.retransmittable_frames == NULL && | 230 info.retransmittable_frames == NULL && |
206 info.all_transmissions == NULL; | 231 info.all_transmissions == NULL; |
207 } | 232 } |
208 | 233 |
209 bool QuicUnackedPacketMap::IsPacketRemovable( | 234 bool QuicUnackedPacketMap::IsPacketRemovable( |
210 QuicPacketSequenceNumber sequence_number, | 235 QuicPacketSequenceNumber sequence_number, |
211 const TransmissionInfo& info) const { | 236 const TransmissionInfo& info) const { |
212 return (sequence_number <= largest_observed_ || | 237 return (info.is_unackable || |
| 238 sequence_number <= largest_observed_ || |
213 unacked_packets_.size() > kMaxTcpCongestionWindow) && | 239 unacked_packets_.size() > kMaxTcpCongestionWindow) && |
214 !info.in_flight && | 240 !info.in_flight && |
215 info.retransmittable_frames == NULL && | 241 info.retransmittable_frames == NULL && |
216 info.all_transmissions == NULL; | 242 info.all_transmissions == NULL; |
217 } | 243 } |
218 | 244 |
219 bool QuicUnackedPacketMap::IsUnacked( | 245 bool QuicUnackedPacketMap::IsUnacked( |
220 QuicPacketSequenceNumber sequence_number) const { | 246 QuicPacketSequenceNumber sequence_number) const { |
221 if (sequence_number < least_unacked_ || | 247 if (sequence_number < least_unacked_ || |
222 sequence_number >= least_unacked_ + unacked_packets_.size()) { | 248 sequence_number >= least_unacked_ + unacked_packets_.size()) { |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_]; | 374 TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_]; |
349 DCHECK(!info->in_flight); | 375 DCHECK(!info->in_flight); |
350 DCHECK_NE(0u, info->bytes_sent); | 376 DCHECK_NE(0u, info->bytes_sent); |
351 DCHECK(info->sent_time.IsInitialized()); | 377 DCHECK(info->sent_time.IsInitialized()); |
352 | 378 |
353 bytes_in_flight_ += info->bytes_sent; | 379 bytes_in_flight_ += info->bytes_sent; |
354 info->in_flight = true; | 380 info->in_flight = true; |
355 } | 381 } |
356 | 382 |
357 } // namespace net | 383 } // namespace net |
OLD | NEW |