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 "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "net/quic/congestion_control/pacing_sender.h" | 9 #include "net/quic/congestion_control/pacing_sender.h" |
10 #include "net/quic/quic_ack_notifier_manager.h" | 10 #include "net/quic/quic_ack_notifier_manager.h" |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 transmission_info->previous_transmissions; | 166 transmission_info->previous_transmissions; |
167 if (previous_transmissions == NULL) { | 167 if (previous_transmissions == NULL) { |
168 // This is the first retransmission of this packet, so create a new entry. | 168 // This is the first retransmission of this packet, so create a new entry. |
169 previous_transmissions = new SequenceNumberSet; | 169 previous_transmissions = new SequenceNumberSet; |
170 transmission_info->previous_transmissions = previous_transmissions; | 170 transmission_info->previous_transmissions = previous_transmissions; |
171 previous_transmissions->insert(old_sequence_number); | 171 previous_transmissions->insert(old_sequence_number); |
172 } | 172 } |
173 previous_transmissions->insert(new_sequence_number); | 173 previous_transmissions->insert(new_sequence_number); |
174 unacked_packets_[new_sequence_number].previous_transmissions = | 174 unacked_packets_[new_sequence_number].previous_transmissions = |
175 previous_transmissions; | 175 previous_transmissions; |
176 | |
177 DCHECK(HasRetransmittableFrames(new_sequence_number)); | |
178 } | 176 } |
179 | 177 |
180 bool QuicSentPacketManager::OnIncomingAck( | 178 bool QuicSentPacketManager::OnIncomingAck( |
181 const ReceivedPacketInfo& received_info, QuicTime ack_receive_time) { | 179 const ReceivedPacketInfo& received_info, QuicTime ack_receive_time) { |
182 // We rely on delta_time_largest_observed to compute an RTT estimate, so | 180 // We rely on delta_time_largest_observed to compute an RTT estimate, so |
183 // we only update rtt when the largest observed gets acked. | 181 // we only update rtt when the largest observed gets acked. |
184 bool largest_observed_acked = | 182 bool largest_observed_acked = |
185 ContainsKey(unacked_packets_, received_info.largest_observed); | 183 ContainsKey(unacked_packets_, received_info.largest_observed); |
186 MaybeUpdateRTT(received_info, ack_receive_time); | 184 MaybeUpdateRTT(received_info, ack_receive_time); |
187 HandleAckForSentPackets(received_info); | 185 HandleAckForSentPackets(received_info); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 --num_to_clear; | 256 --num_to_clear; |
259 continue; | 257 continue; |
260 } | 258 } |
261 break; | 259 break; |
262 } | 260 } |
263 QuicPacketSequenceNumber newest_transmission = | 261 QuicPacketSequenceNumber newest_transmission = |
264 *previous_transmissions->rbegin(); | 262 *previous_transmissions->rbegin(); |
265 if (sequence_number == newest_transmission) { | 263 if (sequence_number == newest_transmission) { |
266 break; | 264 break; |
267 } | 265 } |
| 266 if (it->second.pending) { |
| 267 break; |
| 268 } |
268 | 269 |
269 DCHECK(it->second.retransmittable_frames == NULL); | 270 DCHECK(it->second.retransmittable_frames == NULL); |
270 previous_transmissions->erase(sequence_number); | 271 previous_transmissions->erase(sequence_number); |
271 if (previous_transmissions->size() == 1) { | 272 if (previous_transmissions->size() == 1) { |
272 unacked_packets_[newest_transmission].previous_transmissions = NULL; | 273 unacked_packets_[newest_transmission].previous_transmissions = NULL; |
273 delete previous_transmissions; | 274 delete previous_transmissions; |
274 } | 275 } |
275 DCHECK(!it->second.pending); | |
276 unacked_packets_.erase(it++); | 276 unacked_packets_.erase(it++); |
277 --num_to_clear; | 277 --num_to_clear; |
278 } | 278 } |
279 } | 279 } |
280 | 280 |
281 bool QuicSentPacketManager::HasRetransmittableFrames( | 281 bool QuicSentPacketManager::HasRetransmittableFrames( |
282 QuicPacketSequenceNumber sequence_number) const { | 282 QuicPacketSequenceNumber sequence_number) const { |
283 const TransmissionInfo* transmission_info = | 283 const TransmissionInfo* transmission_info = |
284 FindOrNull(unacked_packets_, sequence_number); | 284 FindOrNull(unacked_packets_, sequence_number); |
285 if (transmission_info == NULL) { | 285 if (transmission_info == NULL) { |
(...skipping 21 matching lines...) Expand all Loading... |
307 } else { | 307 } else { |
308 DiscardUnackedPacket(unacked_it->first); | 308 DiscardUnackedPacket(unacked_it->first); |
309 } | 309 } |
310 } | 310 } |
311 } | 311 } |
312 } | 312 } |
313 | 313 |
314 void QuicSentPacketManager::MarkForRetransmission( | 314 void QuicSentPacketManager::MarkForRetransmission( |
315 QuicPacketSequenceNumber sequence_number, | 315 QuicPacketSequenceNumber sequence_number, |
316 TransmissionType transmission_type) { | 316 TransmissionType transmission_type) { |
317 DCHECK(ContainsKey(unacked_packets_, sequence_number)); | 317 TransmissionInfo* transmission_info = |
318 DCHECK(HasRetransmittableFrames(sequence_number)); | 318 FindOrNull(unacked_packets_, sequence_number); |
| 319 if (transmission_info == NULL) { |
| 320 LOG(DFATAL) << "transmission_info == NULL"; |
| 321 } else { |
| 322 if (transmission_info->retransmittable_frames == NULL) { |
| 323 LOG(DFATAL) << "transmission_info->retransmittable_frames == NULL"; |
| 324 } |
| 325 if (transmission_info->sent_time == QuicTime::Zero()) { |
| 326 LOG(DFATAL) << "transmission_info->sent_time == QuicTime::Zero()"; |
| 327 } |
| 328 } |
319 // TODO(ianswett): Currently the RTO can fire while there are pending NACK | 329 // TODO(ianswett): Currently the RTO can fire while there are pending NACK |
320 // retransmissions for the same data, which is not ideal. | 330 // retransmissions for the same data, which is not ideal. |
321 if (ContainsKey(pending_retransmissions_, sequence_number)) { | 331 if (ContainsKey(pending_retransmissions_, sequence_number)) { |
322 return; | 332 return; |
323 } | 333 } |
324 | 334 |
325 pending_retransmissions_[sequence_number] = transmission_type; | 335 pending_retransmissions_[sequence_number] = transmission_type; |
326 } | 336 } |
327 | 337 |
328 bool QuicSentPacketManager::HasPendingRetransmissions() const { | 338 bool QuicSentPacketManager::HasPendingRetransmissions() const { |
329 return !pending_retransmissions_.empty(); | 339 return !pending_retransmissions_.empty(); |
330 } | 340 } |
331 | 341 |
332 QuicSentPacketManager::PendingRetransmission | 342 QuicSentPacketManager::PendingRetransmission |
333 QuicSentPacketManager::NextPendingRetransmission() { | 343 QuicSentPacketManager::NextPendingRetransmission() { |
334 DCHECK(!pending_retransmissions_.empty()); | 344 DCHECK(!pending_retransmissions_.empty()); |
335 QuicPacketSequenceNumber sequence_number = | 345 QuicPacketSequenceNumber sequence_number = |
336 pending_retransmissions_.begin()->first; | 346 pending_retransmissions_.begin()->first; |
337 DCHECK(ContainsKey(unacked_packets_, sequence_number)); | 347 DCHECK(ContainsKey(unacked_packets_, sequence_number)); |
338 const TransmissionInfo& transmission_info = | 348 const TransmissionInfo& transmission_info = |
339 FindOrDie(unacked_packets_, sequence_number); | 349 FindOrDie(unacked_packets_, sequence_number); |
340 DCHECK(transmission_info.retransmittable_frames); | 350 DCHECK(transmission_info.retransmittable_frames); |
341 | 351 |
342 return PendingRetransmission(sequence_number, | 352 return PendingRetransmission(sequence_number, |
343 pending_retransmissions_.begin()->second, | 353 pending_retransmissions_.begin()->second, |
344 *transmission_info.retransmittable_frames, | 354 *transmission_info.retransmittable_frames, |
345 transmission_info.sequence_number_length); | 355 transmission_info.sequence_number_length); |
346 } | 356 } |
347 | 357 |
348 bool QuicSentPacketManager::IsPreviousTransmission( | |
349 QuicPacketSequenceNumber sequence_number) const { | |
350 DCHECK(ContainsKey(unacked_packets_, sequence_number)); | |
351 | |
352 UnackedPacketMap::const_iterator unacked_it = | |
353 unacked_packets_.find(sequence_number); | |
354 if (unacked_it == unacked_packets_.end()) { | |
355 return false; | |
356 } | |
357 const TransmissionInfo* transmission_info = &unacked_it->second; | |
358 if (transmission_info->previous_transmissions == NULL) { | |
359 return false; | |
360 } | |
361 | |
362 SequenceNumberSet* previous_transmissions = | |
363 transmission_info->previous_transmissions; | |
364 DCHECK(!previous_transmissions->empty()); | |
365 return *previous_transmissions->rbegin() != sequence_number; | |
366 } | |
367 | |
368 // static | 358 // static |
369 bool QuicSentPacketManager::HasCryptoHandshake( | 359 bool QuicSentPacketManager::HasCryptoHandshake( |
370 const TransmissionInfo& transmission_info) { | 360 const TransmissionInfo& transmission_info) { |
371 if (transmission_info.retransmittable_frames == NULL) { | 361 if (transmission_info.retransmittable_frames == NULL) { |
372 return false; | 362 return false; |
373 } | 363 } |
374 return transmission_info.retransmittable_frames->HasCryptoHandshake() == | 364 return transmission_info.retransmittable_frames->HasCryptoHandshake() == |
375 IS_HANDSHAKE; | 365 IS_HANDSHAKE; |
376 } | 366 } |
377 | 367 |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 return true; | 491 return true; |
502 } | 492 } |
503 } | 493 } |
504 return false; | 494 return false; |
505 } | 495 } |
506 | 496 |
507 size_t QuicSentPacketManager::GetNumRetransmittablePackets() const { | 497 size_t QuicSentPacketManager::GetNumRetransmittablePackets() const { |
508 size_t num_unacked_packets = 0; | 498 size_t num_unacked_packets = 0; |
509 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 499 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
510 it != unacked_packets_.end(); ++it) { | 500 it != unacked_packets_.end(); ++it) { |
511 QuicPacketSequenceNumber sequence_number = it->first; | 501 if (it->second.retransmittable_frames != NULL) { |
512 if (HasRetransmittableFrames(sequence_number)) { | |
513 ++num_unacked_packets; | 502 ++num_unacked_packets; |
514 } | 503 } |
515 } | 504 } |
516 return num_unacked_packets; | 505 return num_unacked_packets; |
517 } | 506 } |
518 | 507 |
519 QuicPacketSequenceNumber | 508 QuicPacketSequenceNumber |
520 QuicSentPacketManager::GetLeastUnackedSentPacket() const { | 509 QuicSentPacketManager::GetLeastUnackedSentPacket() const { |
521 if (unacked_packets_.empty()) { | 510 if (unacked_packets_.empty()) { |
522 // If there are no unacked packets, set the least unacked packet to | 511 // If there are no unacked packets, set the least unacked packet to |
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
979 } | 968 } |
980 previous_transmissions->erase(sequence_number); | 969 previous_transmissions->erase(sequence_number); |
981 if (previous_transmissions->size() == 1) { | 970 if (previous_transmissions->size() == 1) { |
982 QuicPacketSequenceNumber current = *previous_transmissions->begin(); | 971 QuicPacketSequenceNumber current = *previous_transmissions->begin(); |
983 unacked_packets_[current].previous_transmissions = NULL; | 972 unacked_packets_[current].previous_transmissions = NULL; |
984 delete previous_transmissions; | 973 delete previous_transmissions; |
985 } | 974 } |
986 } | 975 } |
987 | 976 |
988 } // namespace net | 977 } // namespace net |
OLD | NEW |