| 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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 send_algorithm_(SendAlgorithmInterface::Create(clock, type)), | 71 send_algorithm_(SendAlgorithmInterface::Create(clock, type)), |
| 72 rtt_sample_(QuicTime::Delta::Infinite()), | 72 rtt_sample_(QuicTime::Delta::Infinite()), |
| 73 consecutive_rto_count_(0), | 73 consecutive_rto_count_(0), |
| 74 using_pacing_(false) { | 74 using_pacing_(false) { |
| 75 } | 75 } |
| 76 | 76 |
| 77 QuicSentPacketManager::~QuicSentPacketManager() { | 77 QuicSentPacketManager::~QuicSentPacketManager() { |
| 78 for (UnackedPacketMap::iterator it = unacked_packets_.begin(); | 78 for (UnackedPacketMap::iterator it = unacked_packets_.begin(); |
| 79 it != unacked_packets_.end(); ++it) { | 79 it != unacked_packets_.end(); ++it) { |
| 80 delete it->second.retransmittable_frames; | 80 delete it->second.retransmittable_frames; |
| 81 } | 81 // Only delete previous_transmissions once, for the newest packet. |
| 82 while (!previous_transmissions_map_.empty()) { | 82 if (it->second.previous_transmissions != NULL && |
| 83 SequenceNumberSet* previous_transmissions = | 83 it->first == *it->second.previous_transmissions->rbegin()) { |
| 84 previous_transmissions_map_.begin()->second; | 84 delete it->second.previous_transmissions; |
| 85 for (SequenceNumberSet::const_iterator it = previous_transmissions->begin(); | |
| 86 it != previous_transmissions->end(); ++it) { | |
| 87 DCHECK(ContainsKey(previous_transmissions_map_, *it)); | |
| 88 previous_transmissions_map_.erase(*it); | |
| 89 } | 85 } |
| 90 delete previous_transmissions; | |
| 91 } | 86 } |
| 92 STLDeleteValues(&packet_history_map_); | 87 STLDeleteValues(&packet_history_map_); |
| 93 } | 88 } |
| 94 | 89 |
| 95 void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { | 90 void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { |
| 96 if (config.initial_round_trip_time_us() > 0 && | 91 if (config.initial_round_trip_time_us() > 0 && |
| 97 rtt_sample_.IsInfinite()) { | 92 rtt_sample_.IsInfinite()) { |
| 98 // The initial rtt should already be set on the client side. | 93 // The initial rtt should already be set on the client side. |
| 99 DVLOG_IF(1, !is_server_) | 94 DVLOG_IF(1, !is_server_) |
| 100 << "Client did not set an initial RTT, but did negotiate one."; | 95 << "Client did not set an initial RTT, but did negotiate one."; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 131 void QuicSentPacketManager::OnRetransmittedPacket( | 126 void QuicSentPacketManager::OnRetransmittedPacket( |
| 132 QuicPacketSequenceNumber old_sequence_number, | 127 QuicPacketSequenceNumber old_sequence_number, |
| 133 QuicPacketSequenceNumber new_sequence_number) { | 128 QuicPacketSequenceNumber new_sequence_number) { |
| 134 DCHECK(ContainsKey(unacked_packets_, old_sequence_number)); | 129 DCHECK(ContainsKey(unacked_packets_, old_sequence_number)); |
| 135 DCHECK(ContainsKey(pending_retransmissions_, old_sequence_number)); | 130 DCHECK(ContainsKey(pending_retransmissions_, old_sequence_number)); |
| 136 DCHECK(unacked_packets_.empty() || | 131 DCHECK(unacked_packets_.empty() || |
| 137 unacked_packets_.rbegin()->first < new_sequence_number); | 132 unacked_packets_.rbegin()->first < new_sequence_number); |
| 138 | 133 |
| 139 pending_retransmissions_.erase(old_sequence_number); | 134 pending_retransmissions_.erase(old_sequence_number); |
| 140 | 135 |
| 141 RetransmittableFrames* frames = | 136 UnackedPacketMap::iterator unacked_it = |
| 142 unacked_packets_[old_sequence_number].retransmittable_frames; | 137 unacked_packets_.find(old_sequence_number); |
| 138 RetransmittableFrames* frames = unacked_it->second.retransmittable_frames; |
| 143 DCHECK(frames); | 139 DCHECK(frames); |
| 144 | 140 |
| 145 // A notifier may be waiting to hear about ACKs for the original sequence | 141 // A notifier may be waiting to hear about ACKs for the original sequence |
| 146 // number. Inform them that the sequence number has changed. | 142 // number. Inform them that the sequence number has changed. |
| 147 ack_notifier_manager_.UpdateSequenceNumber(old_sequence_number, | 143 ack_notifier_manager_.UpdateSequenceNumber(old_sequence_number, |
| 148 new_sequence_number); | 144 new_sequence_number); |
| 149 | 145 |
| 150 // We keep the old packet in the unacked packet list until it, or one of | 146 // We keep the old packet in the unacked packet list until it, or one of |
| 151 // the retransmissions of it are acked. | 147 // the retransmissions of it are acked. |
| 152 unacked_packets_[old_sequence_number].retransmittable_frames = NULL; | 148 unacked_it->second.retransmittable_frames = NULL; |
| 153 unacked_packets_[new_sequence_number] = | 149 unacked_packets_[new_sequence_number] = |
| 154 TransmissionInfo(frames, GetSequenceNumberLength(old_sequence_number)); | 150 TransmissionInfo(frames, GetSequenceNumberLength(old_sequence_number)); |
| 155 | 151 |
| 156 // Keep track of all sequence numbers that this packet | 152 // Keep track of all sequence numbers that this packet |
| 157 // has been transmitted as. | 153 // has been transmitted as. |
| 158 SequenceNumberSet* previous_transmissions; | 154 SequenceNumberSet* previous_transmissions = |
| 159 PreviousTransmissionMap::iterator it = | 155 unacked_it->second.previous_transmissions; |
| 160 previous_transmissions_map_.find(old_sequence_number); | 156 if (previous_transmissions == NULL) { |
| 161 if (it == previous_transmissions_map_.end()) { | |
| 162 // This is the first retransmission of this packet, so create a new entry. | 157 // This is the first retransmission of this packet, so create a new entry. |
| 163 previous_transmissions = new SequenceNumberSet; | 158 previous_transmissions = new SequenceNumberSet; |
| 164 previous_transmissions_map_[old_sequence_number] = previous_transmissions; | 159 unacked_it->second.previous_transmissions = previous_transmissions; |
| 165 previous_transmissions->insert(old_sequence_number); | 160 previous_transmissions->insert(old_sequence_number); |
| 166 } else { | |
| 167 // Otherwise, use the existing entry. | |
| 168 previous_transmissions = it->second; | |
| 169 } | 161 } |
| 170 previous_transmissions->insert(new_sequence_number); | 162 previous_transmissions->insert(new_sequence_number); |
| 171 previous_transmissions_map_[new_sequence_number] = previous_transmissions; | 163 unacked_packets_[new_sequence_number].previous_transmissions = |
| 164 previous_transmissions; |
| 172 | 165 |
| 173 DCHECK(HasRetransmittableFrames(new_sequence_number)); | 166 DCHECK(HasRetransmittableFrames(new_sequence_number)); |
| 174 } | 167 } |
| 175 | 168 |
| 176 bool QuicSentPacketManager::OnIncomingAck( | 169 bool QuicSentPacketManager::OnIncomingAck( |
| 177 const ReceivedPacketInfo& received_info, QuicTime ack_receive_time) { | 170 const ReceivedPacketInfo& received_info, QuicTime ack_receive_time) { |
| 178 // Determine if the least unacked sequence number is being acked. | 171 // Determine if the least unacked sequence number is being acked. |
| 179 QuicPacketSequenceNumber least_unacked_sent_before = | 172 QuicPacketSequenceNumber least_unacked_sent_before = |
| 180 GetLeastUnackedSentPacket(); | 173 GetLeastUnackedSentPacket(); |
| 181 bool new_least_unacked = !IsAwaitingPacket(received_info, | 174 bool new_least_unacked = !IsAwaitingPacket(received_info, |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 | 226 |
| 234 // If we have received a truncated ack, then we need to | 227 // If we have received a truncated ack, then we need to |
| 235 // clear out some previous transmissions to allow the peer | 228 // clear out some previous transmissions to allow the peer |
| 236 // to actually ACK new packets. | 229 // to actually ACK new packets. |
| 237 if (received_info.is_truncated) { | 230 if (received_info.is_truncated) { |
| 238 ClearPreviousRetransmissions(received_info.missing_packets.size() / 2); | 231 ClearPreviousRetransmissions(received_info.missing_packets.size() / 2); |
| 239 } | 232 } |
| 240 } | 233 } |
| 241 | 234 |
| 242 void QuicSentPacketManager::ClearPreviousRetransmissions(size_t num_to_clear) { | 235 void QuicSentPacketManager::ClearPreviousRetransmissions(size_t num_to_clear) { |
| 243 UnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 236 UnackedPacketMap::iterator it = unacked_packets_.begin(); |
| 244 while (it != unacked_packets_.end() && num_to_clear > 0) { | 237 while (it != unacked_packets_.end() && num_to_clear > 0) { |
| 245 QuicPacketSequenceNumber sequence_number = it->first; | 238 QuicPacketSequenceNumber sequence_number = it->first; |
| 246 ++it; | |
| 247 // If this is not a previous transmission then there is no point | 239 // If this is not a previous transmission then there is no point |
| 248 // in clearing out any further packets, because it will not affect | 240 // in clearing out any further packets, because it will not affect |
| 249 // the high water mark. | 241 // the high water mark. |
| 250 if (!IsPreviousTransmission(sequence_number)) { | 242 SequenceNumberSet* previous_transmissions = |
| 243 it->second.previous_transmissions; |
| 244 if (previous_transmissions == NULL) { |
| 245 break; |
| 246 } |
| 247 QuicPacketSequenceNumber newest_transmission = |
| 248 *previous_transmissions->rbegin(); |
| 249 if (sequence_number == newest_transmission) { |
| 251 break; | 250 break; |
| 252 } | 251 } |
| 253 | 252 |
| 254 DCHECK(ContainsKey(previous_transmissions_map_, sequence_number)); | 253 DCHECK(it->second.retransmittable_frames == NULL); |
| 255 DCHECK(!HasRetransmittableFrames(sequence_number)); | |
| 256 unacked_packets_.erase(sequence_number); | |
| 257 SequenceNumberSet* previous_transmissions = | |
| 258 previous_transmissions_map_[sequence_number]; | |
| 259 previous_transmissions_map_.erase(sequence_number); | |
| 260 previous_transmissions->erase(sequence_number); | 254 previous_transmissions->erase(sequence_number); |
| 261 if (previous_transmissions->size() == 1) { | 255 if (previous_transmissions->size() == 1) { |
| 262 previous_transmissions_map_.erase(*previous_transmissions->begin()); | 256 unacked_packets_[newest_transmission].previous_transmissions = NULL; |
| 263 delete previous_transmissions; | 257 delete previous_transmissions; |
| 264 } | 258 } |
| 259 unacked_packets_.erase(it++); |
| 265 --num_to_clear; | 260 --num_to_clear; |
| 266 } | 261 } |
| 267 } | 262 } |
| 268 | 263 |
| 269 bool QuicSentPacketManager::HasRetransmittableFrames( | 264 bool QuicSentPacketManager::HasRetransmittableFrames( |
| 270 QuicPacketSequenceNumber sequence_number) const { | 265 QuicPacketSequenceNumber sequence_number) const { |
| 271 if (!ContainsKey(unacked_packets_, sequence_number)) { | 266 if (!ContainsKey(unacked_packets_, sequence_number)) { |
| 272 return false; | 267 return false; |
| 273 } | 268 } |
| 274 | 269 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 return PendingRetransmission(sequence_number, | 331 return PendingRetransmission(sequence_number, |
| 337 pending_retransmissions_.begin()->second, | 332 pending_retransmissions_.begin()->second, |
| 338 *retransmittable_frames, | 333 *retransmittable_frames, |
| 339 GetSequenceNumberLength(sequence_number)); | 334 GetSequenceNumberLength(sequence_number)); |
| 340 } | 335 } |
| 341 | 336 |
| 342 bool QuicSentPacketManager::IsPreviousTransmission( | 337 bool QuicSentPacketManager::IsPreviousTransmission( |
| 343 QuicPacketSequenceNumber sequence_number) const { | 338 QuicPacketSequenceNumber sequence_number) const { |
| 344 DCHECK(ContainsKey(unacked_packets_, sequence_number)); | 339 DCHECK(ContainsKey(unacked_packets_, sequence_number)); |
| 345 | 340 |
| 346 PreviousTransmissionMap::const_iterator it = | 341 UnackedPacketMap::const_iterator it = unacked_packets_.find(sequence_number); |
| 347 previous_transmissions_map_.find(sequence_number); | 342 if (it->second.previous_transmissions == NULL) { |
| 348 if (it == previous_transmissions_map_.end()) { | |
| 349 return false; | 343 return false; |
| 350 } | 344 } |
| 351 | 345 |
| 352 SequenceNumberSet* previous_transmissions = it->second; | 346 SequenceNumberSet* previous_transmissions = it->second.previous_transmissions; |
| 353 DCHECK(!previous_transmissions->empty()); | 347 DCHECK(!previous_transmissions->empty()); |
| 354 return *previous_transmissions->rbegin() != sequence_number; | 348 return *previous_transmissions->rbegin() != sequence_number; |
| 355 } | 349 } |
| 356 | 350 |
| 357 QuicPacketSequenceNumber QuicSentPacketManager::GetMostRecentTransmission( | |
| 358 QuicPacketSequenceNumber sequence_number) const { | |
| 359 DCHECK(ContainsKey(unacked_packets_, sequence_number)); | |
| 360 | |
| 361 PreviousTransmissionMap::const_iterator it = | |
| 362 previous_transmissions_map_.find(sequence_number); | |
| 363 if (it == previous_transmissions_map_.end()) { | |
| 364 return sequence_number; | |
| 365 } | |
| 366 | |
| 367 SequenceNumberSet* previous_transmissions = | |
| 368 previous_transmissions_map_.find(sequence_number)->second; | |
| 369 DCHECK(!previous_transmissions->empty()); | |
| 370 return *previous_transmissions->rbegin(); | |
| 371 } | |
| 372 | |
| 373 QuicSentPacketManager::UnackedPacketMap::iterator | 351 QuicSentPacketManager::UnackedPacketMap::iterator |
| 374 QuicSentPacketManager::MarkPacketReceivedByPeer( | 352 QuicSentPacketManager::MarkPacketReceivedByPeer( |
| 375 QuicPacketSequenceNumber sequence_number) { | 353 QuicPacketSequenceNumber sequence_number) { |
| 376 DCHECK(ContainsKey(unacked_packets_, sequence_number)); | 354 DCHECK(ContainsKey(unacked_packets_, sequence_number)); |
| 377 | 355 |
| 378 // If this packet has never been retransmitted, then simply drop it. | 356 // If this packet has never been retransmitted, then simply drop it. |
| 379 PreviousTransmissionMap::const_iterator previous_it = | 357 UnackedPacketMap::const_iterator previous_it = |
| 380 previous_transmissions_map_.find(sequence_number); | 358 unacked_packets_.find(sequence_number); |
| 381 if (previous_it == previous_transmissions_map_.end()) { | 359 if (previous_it->second.previous_transmissions == NULL) { |
| 382 UnackedPacketMap::iterator next_unacked = | 360 UnackedPacketMap::iterator next_unacked = |
| 383 unacked_packets_.find(sequence_number); | 361 unacked_packets_.find(sequence_number); |
| 384 ++next_unacked; | 362 ++next_unacked; |
| 385 DiscardPacket(sequence_number); | 363 DiscardPacket(sequence_number); |
| 386 return next_unacked; | 364 return next_unacked; |
| 387 } | 365 } |
| 388 | 366 |
| 389 SequenceNumberSet* previous_transmissions = previous_it->second; | 367 SequenceNumberSet* previous_transmissions = |
| 368 previous_it->second.previous_transmissions; |
| 390 DCHECK(!previous_transmissions->empty()); | 369 DCHECK(!previous_transmissions->empty()); |
| 391 SequenceNumberSet::reverse_iterator previous_transmissions_it = | 370 SequenceNumberSet::reverse_iterator previous_transmissions_it = |
| 392 previous_transmissions->rbegin(); | 371 previous_transmissions->rbegin(); |
| 393 QuicPacketSequenceNumber newest_transmission = *previous_transmissions_it; | 372 QuicPacketSequenceNumber newest_transmission = *previous_transmissions_it; |
| 394 if (newest_transmission == sequence_number) { | 373 if (newest_transmission == sequence_number) { |
| 395 DiscardPacket(newest_transmission); | 374 DiscardPacket(newest_transmission); |
| 396 } else { | 375 } else { |
| 397 // If we have received an ack for a previous transmission of a packet, | 376 // If we have received an ack for a previous transmission of a packet, |
| 398 // we want to keep the "new" transmission of the packet unacked, | 377 // we want to keep the "new" transmission of the packet unacked, |
| 399 // but prevent the data from being retransmitted. | 378 // but prevent the data from being retransmitted. |
| 400 delete unacked_packets_[newest_transmission].retransmittable_frames; | 379 delete unacked_packets_[newest_transmission].retransmittable_frames; |
| 401 unacked_packets_[newest_transmission].retransmittable_frames = NULL; | 380 unacked_packets_[newest_transmission].retransmittable_frames = NULL; |
| 381 unacked_packets_[newest_transmission].previous_transmissions = NULL; |
| 402 pending_retransmissions_.erase(newest_transmission); | 382 pending_retransmissions_.erase(newest_transmission); |
| 403 } | 383 } |
| 404 previous_transmissions_map_.erase(newest_transmission); | |
| 405 | 384 |
| 406 // Clear out information all previous transmissions. | 385 // Clear out information all previous transmissions. |
| 407 ++previous_transmissions_it; | 386 ++previous_transmissions_it; |
| 408 while (previous_transmissions_it != previous_transmissions->rend()) { | 387 while (previous_transmissions_it != previous_transmissions->rend()) { |
| 409 QuicPacketSequenceNumber previous_transmission = *previous_transmissions_it; | 388 QuicPacketSequenceNumber previous_transmission = *previous_transmissions_it; |
| 410 ++previous_transmissions_it; | 389 ++previous_transmissions_it; |
| 411 DCHECK(ContainsKey(previous_transmissions_map_, previous_transmission)); | |
| 412 previous_transmissions_map_.erase(previous_transmission); | |
| 413 DiscardPacket(previous_transmission); | 390 DiscardPacket(previous_transmission); |
| 414 } | 391 } |
| 415 | 392 |
| 416 delete previous_transmissions; | 393 delete previous_transmissions; |
| 417 | 394 |
| 418 UnackedPacketMap::iterator next_unacked = unacked_packets_.begin(); | 395 UnackedPacketMap::iterator next_unacked = unacked_packets_.begin(); |
| 419 while (next_unacked != unacked_packets_.end() && | 396 while (next_unacked != unacked_packets_.end() && |
| 420 next_unacked->first < sequence_number) { | 397 next_unacked->first < sequence_number) { |
| 421 ++next_unacked; | 398 ++next_unacked; |
| 422 } | 399 } |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 return; | 770 return; |
| 794 } | 771 } |
| 795 | 772 |
| 796 using_pacing_ = true; | 773 using_pacing_ = true; |
| 797 send_algorithm_.reset( | 774 send_algorithm_.reset( |
| 798 new PacingSender(send_algorithm_.release(), | 775 new PacingSender(send_algorithm_.release(), |
| 799 QuicTime::Delta::FromMicroseconds(1))); | 776 QuicTime::Delta::FromMicroseconds(1))); |
| 800 } | 777 } |
| 801 | 778 |
| 802 } // namespace net | 779 } // namespace net |
| OLD | NEW |