| 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_IF(DFATAL, transmission_info->retransmittable_frames == NULL); |
| 321 LOG_IF(DFATAL, transmission_info->sent_time == QuicTime::Zero()); |
| 322 } else { |
| 323 LOG(DFATAL) << "Unable to retansmit packet: " << sequence_number; |
| 324 } |
| 319 // TODO(ianswett): Currently the RTO can fire while there are pending NACK | 325 // TODO(ianswett): Currently the RTO can fire while there are pending NACK |
| 320 // retransmissions for the same data, which is not ideal. | 326 // retransmissions for the same data, which is not ideal. |
| 321 if (ContainsKey(pending_retransmissions_, sequence_number)) { | 327 if (ContainsKey(pending_retransmissions_, sequence_number)) { |
| 322 return; | 328 return; |
| 323 } | 329 } |
| 324 | 330 |
| 325 pending_retransmissions_[sequence_number] = transmission_type; | 331 pending_retransmissions_[sequence_number] = transmission_type; |
| 326 } | 332 } |
| 327 | 333 |
| 328 bool QuicSentPacketManager::HasPendingRetransmissions() const { | 334 bool QuicSentPacketManager::HasPendingRetransmissions() const { |
| 329 return !pending_retransmissions_.empty(); | 335 return !pending_retransmissions_.empty(); |
| 330 } | 336 } |
| 331 | 337 |
| 332 QuicSentPacketManager::PendingRetransmission | 338 QuicSentPacketManager::PendingRetransmission |
| 333 QuicSentPacketManager::NextPendingRetransmission() { | 339 QuicSentPacketManager::NextPendingRetransmission() { |
| 334 DCHECK(!pending_retransmissions_.empty()); | 340 DCHECK(!pending_retransmissions_.empty()); |
| 335 QuicPacketSequenceNumber sequence_number = | 341 QuicPacketSequenceNumber sequence_number = |
| 336 pending_retransmissions_.begin()->first; | 342 pending_retransmissions_.begin()->first; |
| 337 DCHECK(ContainsKey(unacked_packets_, sequence_number)); | 343 DCHECK(ContainsKey(unacked_packets_, sequence_number)); |
| 338 const TransmissionInfo& transmission_info = | 344 const TransmissionInfo& transmission_info = |
| 339 FindOrDie(unacked_packets_, sequence_number); | 345 FindOrDie(unacked_packets_, sequence_number); |
| 340 DCHECK(transmission_info.retransmittable_frames); | 346 DCHECK(transmission_info.retransmittable_frames); |
| 341 | 347 |
| 342 return PendingRetransmission(sequence_number, | 348 return PendingRetransmission(sequence_number, |
| 343 pending_retransmissions_.begin()->second, | 349 pending_retransmissions_.begin()->second, |
| 344 *transmission_info.retransmittable_frames, | 350 *transmission_info.retransmittable_frames, |
| 345 transmission_info.sequence_number_length); | 351 transmission_info.sequence_number_length); |
| 346 } | 352 } |
| 347 | 353 |
| 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 | 354 // static |
| 369 bool QuicSentPacketManager::HasCryptoHandshake( | 355 bool QuicSentPacketManager::HasCryptoHandshake( |
| 370 const TransmissionInfo& transmission_info) { | 356 const TransmissionInfo& transmission_info) { |
| 371 if (transmission_info.retransmittable_frames == NULL) { | 357 if (transmission_info.retransmittable_frames == NULL) { |
| 372 return false; | 358 return false; |
| 373 } | 359 } |
| 374 return transmission_info.retransmittable_frames->HasCryptoHandshake() == | 360 return transmission_info.retransmittable_frames->HasCryptoHandshake() == |
| 375 IS_HANDSHAKE; | 361 IS_HANDSHAKE; |
| 376 } | 362 } |
| 377 | 363 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 return true; | 487 return true; |
| 502 } | 488 } |
| 503 } | 489 } |
| 504 return false; | 490 return false; |
| 505 } | 491 } |
| 506 | 492 |
| 507 size_t QuicSentPacketManager::GetNumRetransmittablePackets() const { | 493 size_t QuicSentPacketManager::GetNumRetransmittablePackets() const { |
| 508 size_t num_unacked_packets = 0; | 494 size_t num_unacked_packets = 0; |
| 509 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 495 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
| 510 it != unacked_packets_.end(); ++it) { | 496 it != unacked_packets_.end(); ++it) { |
| 511 QuicPacketSequenceNumber sequence_number = it->first; | 497 if (it->second.retransmittable_frames != NULL) { |
| 512 if (HasRetransmittableFrames(sequence_number)) { | |
| 513 ++num_unacked_packets; | 498 ++num_unacked_packets; |
| 514 } | 499 } |
| 515 } | 500 } |
| 516 return num_unacked_packets; | 501 return num_unacked_packets; |
| 517 } | 502 } |
| 518 | 503 |
| 519 QuicPacketSequenceNumber | 504 QuicPacketSequenceNumber |
| 520 QuicSentPacketManager::GetLeastUnackedSentPacket() const { | 505 QuicSentPacketManager::GetLeastUnackedSentPacket() const { |
| 521 if (unacked_packets_.empty()) { | 506 if (unacked_packets_.empty()) { |
| 522 // If there are no unacked packets, set the least unacked packet to | 507 // 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 } | 964 } |
| 980 previous_transmissions->erase(sequence_number); | 965 previous_transmissions->erase(sequence_number); |
| 981 if (previous_transmissions->size() == 1) { | 966 if (previous_transmissions->size() == 1) { |
| 982 QuicPacketSequenceNumber current = *previous_transmissions->begin(); | 967 QuicPacketSequenceNumber current = *previous_transmissions->begin(); |
| 983 unacked_packets_[current].previous_transmissions = NULL; | 968 unacked_packets_[current].previous_transmissions = NULL; |
| 984 delete previous_transmissions; | 969 delete previous_transmissions; |
| 985 } | 970 } |
| 986 } | 971 } |
| 987 | 972 |
| 988 } // namespace net | 973 } // namespace net |
| OLD | NEW |