| 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 |