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 |