| 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 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 DCHECK_GE(sequence_number, least_unacked_); | 194 DCHECK_GE(sequence_number, least_unacked_); |
| 195 DCHECK_LT(sequence_number, least_unacked_ + unacked_packets_.size()); | 195 DCHECK_LT(sequence_number, least_unacked_ + unacked_packets_.size()); |
| 196 TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_]; | 196 TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_]; |
| 197 SequenceNumberList* all_transmissions = info->all_transmissions; | 197 SequenceNumberList* all_transmissions = info->all_transmissions; |
| 198 if (all_transmissions == nullptr) { | 198 if (all_transmissions == nullptr) { |
| 199 MaybeRemoveRetransmittableFrames(info); | 199 MaybeRemoveRetransmittableFrames(info); |
| 200 return; | 200 return; |
| 201 } | 201 } |
| 202 // TODO(ianswett): Consider adding a check to ensure there are retransmittable | 202 // TODO(ianswett): Consider adding a check to ensure there are retransmittable |
| 203 // frames associated with this packet. | 203 // frames associated with this packet. |
| 204 for (SequenceNumberList::const_iterator it = all_transmissions->begin(); | 204 for (QuicPacketSequenceNumber sequence_number : *all_transmissions) { |
| 205 it != all_transmissions->end(); ++it) { | |
| 206 TransmissionInfo* transmission_info = | 205 TransmissionInfo* transmission_info = |
| 207 &unacked_packets_[*it - least_unacked_]; | 206 &unacked_packets_[sequence_number - least_unacked_]; |
| 208 MaybeRemoveRetransmittableFrames(transmission_info); | 207 MaybeRemoveRetransmittableFrames(transmission_info); |
| 209 transmission_info->all_transmissions = nullptr; | 208 transmission_info->all_transmissions = nullptr; |
| 210 } | 209 } |
| 211 delete all_transmissions; | 210 delete all_transmissions; |
| 212 } | 211 } |
| 213 | 212 |
| 214 void QuicUnackedPacketMap::RemoveAckability(TransmissionInfo* info) { | 213 void QuicUnackedPacketMap::RemoveAckability(TransmissionInfo* info) { |
| 215 DCHECK(info->retransmittable_frames == nullptr); | 214 DCHECK(info->retransmittable_frames == nullptr); |
| 216 info->is_unackable = true; | 215 info->is_unackable = true; |
| 217 SequenceNumberList* all_transmissions = info->all_transmissions; | 216 SequenceNumberList* all_transmissions = info->all_transmissions; |
| 218 if (all_transmissions == nullptr) { | 217 if (all_transmissions == nullptr) { |
| 219 return; | 218 return; |
| 220 } | 219 } |
| 221 for (SequenceNumberList::const_iterator it = all_transmissions->begin(); | 220 for (QuicPacketSequenceNumber sequence_number : *all_transmissions) { |
| 222 it != all_transmissions->end(); ++it) { | |
| 223 TransmissionInfo* transmission_info = | 221 TransmissionInfo* transmission_info = |
| 224 &unacked_packets_[*it - least_unacked_]; | 222 &unacked_packets_[sequence_number - least_unacked_]; |
| 225 transmission_info->all_transmissions = nullptr; | 223 transmission_info->all_transmissions = nullptr; |
| 226 transmission_info->is_unackable = true; | 224 transmission_info->is_unackable = true; |
| 227 } | 225 } |
| 228 delete all_transmissions; | 226 delete all_transmissions; |
| 229 } | 227 } |
| 230 | 228 |
| 231 void QuicUnackedPacketMap::MaybeRemoveRetransmittableFrames( | 229 void QuicUnackedPacketMap::MaybeRemoveRetransmittableFrames( |
| 232 TransmissionInfo* transmission_info) { | 230 TransmissionInfo* transmission_info) { |
| 233 if (transmission_info->retransmittable_frames != nullptr) { | 231 if (transmission_info->retransmittable_frames != nullptr) { |
| 234 if (transmission_info->retransmittable_frames->HasCryptoHandshake() | 232 if (transmission_info->retransmittable_frames->HasCryptoHandshake() |
| (...skipping 13 matching lines...) Expand all Loading... |
| 248 | 246 |
| 249 bool QuicUnackedPacketMap::IsPacketUsefulForMeasuringRtt( | 247 bool QuicUnackedPacketMap::IsPacketUsefulForMeasuringRtt( |
| 250 QuicPacketSequenceNumber sequence_number, | 248 QuicPacketSequenceNumber sequence_number, |
| 251 const TransmissionInfo& info) const { | 249 const TransmissionInfo& info) const { |
| 252 // Packet can be used for RTT measurement if it may yet be acked as the | 250 // Packet can be used for RTT measurement if it may yet be acked as the |
| 253 // largest observed packet by the receiver. | 251 // largest observed packet by the receiver. |
| 254 return !info.is_unackable && sequence_number > largest_observed_; | 252 return !info.is_unackable && sequence_number > largest_observed_; |
| 255 } | 253 } |
| 256 | 254 |
| 257 bool QuicUnackedPacketMap::IsPacketUsefulForCongestionControl( | 255 bool QuicUnackedPacketMap::IsPacketUsefulForCongestionControl( |
| 258 QuicPacketSequenceNumber sequence_number, | |
| 259 const TransmissionInfo& info) const { | 256 const TransmissionInfo& info) const { |
| 260 // Packet contributes to congestion control if it is considered inflight. | 257 // Packet contributes to congestion control if it is considered inflight. |
| 261 return info.in_flight; | 258 return info.in_flight; |
| 262 } | 259 } |
| 263 | 260 |
| 264 bool QuicUnackedPacketMap::IsPacketUsefulForRetransmittableData( | 261 bool QuicUnackedPacketMap::IsPacketUsefulForRetransmittableData( |
| 265 QuicPacketSequenceNumber sequence_number, | |
| 266 const TransmissionInfo& info) const { | 262 const TransmissionInfo& info) const { |
| 267 // Packet may have retransmittable frames, or the data may have been | 263 // Packet may have retransmittable frames, or the data may have been |
| 268 // retransmitted with a new sequence number. | 264 // retransmitted with a new sequence number. |
| 269 return info.retransmittable_frames != nullptr || | 265 return info.retransmittable_frames != nullptr || |
| 270 info.all_transmissions != nullptr; | 266 info.all_transmissions != nullptr; |
| 271 } | 267 } |
| 272 | 268 |
| 273 bool QuicUnackedPacketMap::IsPacketUseless( | 269 bool QuicUnackedPacketMap::IsPacketUseless( |
| 274 QuicPacketSequenceNumber sequence_number, | 270 QuicPacketSequenceNumber sequence_number, |
| 275 const TransmissionInfo& info) const { | 271 const TransmissionInfo& info) const { |
| 276 return !IsPacketUsefulForMeasuringRtt(sequence_number, info) && | 272 return !IsPacketUsefulForMeasuringRtt(sequence_number, info) && |
| 277 !IsPacketUsefulForCongestionControl(sequence_number, info) && | 273 !IsPacketUsefulForCongestionControl(info) && |
| 278 !IsPacketUsefulForRetransmittableData(sequence_number, info); | 274 !IsPacketUsefulForRetransmittableData(info); |
| 279 } | 275 } |
| 280 | 276 |
| 281 bool QuicUnackedPacketMap::IsPacketRemovable( | 277 bool QuicUnackedPacketMap::IsPacketRemovable( |
| 282 QuicPacketSequenceNumber sequence_number, | 278 QuicPacketSequenceNumber sequence_number, |
| 283 const TransmissionInfo& info) const { | 279 const TransmissionInfo& info) const { |
| 284 return (!IsPacketUsefulForMeasuringRtt(sequence_number, info) || | 280 return (!IsPacketUsefulForMeasuringRtt(sequence_number, info) || |
| 285 unacked_packets_.size() > kMaxTcpCongestionWindow) && | 281 unacked_packets_.size() > kMaxTcpCongestionWindow) && |
| 286 !IsPacketUsefulForCongestionControl(sequence_number, info) && | 282 !IsPacketUsefulForCongestionControl(info) && |
| 287 !IsPacketUsefulForRetransmittableData(sequence_number, info); | 283 !IsPacketUsefulForRetransmittableData(info); |
| 288 } | 284 } |
| 289 | 285 |
| 290 bool QuicUnackedPacketMap::IsUnacked( | 286 bool QuicUnackedPacketMap::IsUnacked( |
| 291 QuicPacketSequenceNumber sequence_number) const { | 287 QuicPacketSequenceNumber sequence_number) const { |
| 292 if (sequence_number < least_unacked_ || | 288 if (sequence_number < least_unacked_ || |
| 293 sequence_number >= least_unacked_ + unacked_packets_.size()) { | 289 sequence_number >= least_unacked_ + unacked_packets_.size()) { |
| 294 return false; | 290 return false; |
| 295 } | 291 } |
| 296 return !IsPacketUseless(sequence_number, | 292 return !IsPacketUseless(sequence_number, |
| 297 unacked_packets_[sequence_number - least_unacked_]); | 293 unacked_packets_[sequence_number - least_unacked_]); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 bool QuicUnackedPacketMap::HasUnackedRetransmittableFrames() const { | 377 bool QuicUnackedPacketMap::HasUnackedRetransmittableFrames() const { |
| 382 for (UnackedPacketMap::const_reverse_iterator it = | 378 for (UnackedPacketMap::const_reverse_iterator it = |
| 383 unacked_packets_.rbegin(); it != unacked_packets_.rend(); ++it) { | 379 unacked_packets_.rbegin(); it != unacked_packets_.rend(); ++it) { |
| 384 if (it->in_flight && it->retransmittable_frames) { | 380 if (it->in_flight && it->retransmittable_frames) { |
| 385 return true; | 381 return true; |
| 386 } | 382 } |
| 387 } | 383 } |
| 388 return false; | 384 return false; |
| 389 } | 385 } |
| 390 | 386 |
| 391 QuicPacketSequenceNumber | 387 QuicPacketSequenceNumber QuicUnackedPacketMap::GetLeastUnacked() const { |
| 392 QuicUnackedPacketMap::GetLeastUnacked() const { | |
| 393 return least_unacked_; | 388 return least_unacked_; |
| 394 } | 389 } |
| 395 | 390 |
| 396 void QuicUnackedPacketMap::RestoreInFlight( | |
| 397 QuicPacketSequenceNumber sequence_number) { | |
| 398 DCHECK_GE(sequence_number, least_unacked_); | |
| 399 DCHECK_LT(sequence_number, least_unacked_ + unacked_packets_.size()); | |
| 400 TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_]; | |
| 401 DCHECK(!info->in_flight); | |
| 402 DCHECK_NE(0u, info->bytes_sent); | |
| 403 DCHECK(info->sent_time.IsInitialized()); | |
| 404 | |
| 405 bytes_in_flight_ += info->bytes_sent; | |
| 406 info->in_flight = true; | |
| 407 } | |
| 408 | |
| 409 } // namespace net | 391 } // namespace net |
| OLD | NEW |