Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(494)

Side by Side Diff: net/quic/quic_sent_packet_manager.cc

Issue 157803007: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: win_x64 compiler error fix Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_sent_packet_manager.h ('k') | net/quic/quic_sent_packet_manager_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/crypto/crypto_protocol.h" 10 #include "net/quic/crypto/crypto_protocol.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 static const size_t kDefaultMaxTailLossProbes = 2; 56 static const size_t kDefaultMaxTailLossProbes = 2;
57 static const int64 kMinTailLossProbeTimeoutMs = 10; 57 static const int64 kMinTailLossProbeTimeoutMs = 10;
58 58
59 COMPILE_ASSERT(kHistoryPeriodMs >= kBitrateSmoothingPeriodMs, 59 COMPILE_ASSERT(kHistoryPeriodMs >= kBitrateSmoothingPeriodMs,
60 history_must_be_longer_or_equal_to_the_smoothing_period); 60 history_must_be_longer_or_equal_to_the_smoothing_period);
61 61
62 } // namespace 62 } // namespace
63 63
64 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") 64 #define ENDPOINT (is_server_ ? "Server: " : " Client: ")
65 65
66
67 QuicSentPacketManager::TransmissionInfo::TransmissionInfo()
68 : retransmittable_frames(NULL),
69 sequence_number_length(PACKET_1BYTE_SEQUENCE_NUMBER),
70 sent_time(QuicTime::Zero()),
71 all_transmissions(NULL),
72 pending(false) { }
73
74 QuicSentPacketManager::TransmissionInfo::TransmissionInfo(
75 RetransmittableFrames* retransmittable_frames,
76 QuicPacketSequenceNumber sequence_number,
77 QuicSequenceNumberLength sequence_number_length)
78 : retransmittable_frames(retransmittable_frames),
79 sequence_number_length(sequence_number_length),
80 sent_time(QuicTime::Zero()),
81 all_transmissions(new SequenceNumberSet),
82 pending(false) {
83 all_transmissions->insert(sequence_number);
84 }
85
86 QuicSentPacketManager::TransmissionInfo::TransmissionInfo(
87 RetransmittableFrames* retransmittable_frames,
88 QuicPacketSequenceNumber sequence_number,
89 QuicSequenceNumberLength sequence_number_length,
90 SequenceNumberSet* all_transmissions)
91 : retransmittable_frames(retransmittable_frames),
92 sequence_number_length(sequence_number_length),
93 sent_time(QuicTime::Zero()),
94 all_transmissions(all_transmissions),
95 pending(false) {
96 all_transmissions->insert(sequence_number);
97 }
98
66 QuicSentPacketManager::QuicSentPacketManager(bool is_server, 99 QuicSentPacketManager::QuicSentPacketManager(bool is_server,
67 const QuicClock* clock, 100 const QuicClock* clock,
68 QuicConnectionStats* stats, 101 QuicConnectionStats* stats,
69 CongestionFeedbackType type) 102 CongestionFeedbackType type)
70 : is_server_(is_server), 103 : is_server_(is_server),
71 clock_(clock), 104 clock_(clock),
72 stats_(stats), 105 stats_(stats),
73 send_algorithm_(SendAlgorithmInterface::Create(clock, type)), 106 send_algorithm_(SendAlgorithmInterface::Create(clock, type)),
74 rtt_sample_(QuicTime::Delta::Infinite()), 107 rtt_sample_(QuicTime::Delta::Infinite()),
75 pending_crypto_packet_count_(0), 108 pending_crypto_packet_count_(0),
76 consecutive_rto_count_(0), 109 consecutive_rto_count_(0),
77 consecutive_tlp_count_(0), 110 consecutive_tlp_count_(0),
78 consecutive_crypto_retransmission_count_(0), 111 consecutive_crypto_retransmission_count_(0),
79 max_tail_loss_probes_(kDefaultMaxTailLossProbes), 112 max_tail_loss_probes_(kDefaultMaxTailLossProbes),
80 using_pacing_(false) { 113 using_pacing_(false) {
81 } 114 }
82 115
83 QuicSentPacketManager::~QuicSentPacketManager() { 116 QuicSentPacketManager::~QuicSentPacketManager() {
84 for (UnackedPacketMap::iterator it = unacked_packets_.begin(); 117 for (UnackedPacketMap::iterator it = unacked_packets_.begin();
85 it != unacked_packets_.end(); ++it) { 118 it != unacked_packets_.end(); ++it) {
86 delete it->second.retransmittable_frames; 119 delete it->second.retransmittable_frames;
87 // Only delete previous_transmissions once, for the newest packet. 120 // Only delete all_transmissions once, for the newest packet.
88 if (it->second.previous_transmissions != NULL && 121 if (it->first == *it->second.all_transmissions->rbegin()) {
89 it->first == *it->second.previous_transmissions->rbegin()) { 122 delete it->second.all_transmissions;
90 delete it->second.previous_transmissions;
91 } 123 }
92 } 124 }
93 STLDeleteValues(&packet_history_map_); 125 STLDeleteValues(&packet_history_map_);
94 } 126 }
95 127
96 void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { 128 void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) {
97 if (config.initial_round_trip_time_us() > 0 && 129 if (config.initial_round_trip_time_us() > 0 &&
98 rtt_sample_.IsInfinite()) { 130 rtt_sample_.IsInfinite()) {
99 // The initial rtt should already be set on the client side. 131 // The initial rtt should already be set on the client side.
100 DVLOG_IF(1, !is_server_) 132 DVLOG_IF(1, !is_server_)
(...skipping 18 matching lines...) Expand all
119 const SerializedPacket& serialized_packet) { 151 const SerializedPacket& serialized_packet) {
120 if (serialized_packet.retransmittable_frames) { 152 if (serialized_packet.retransmittable_frames) {
121 ack_notifier_manager_.OnSerializedPacket(serialized_packet); 153 ack_notifier_manager_.OnSerializedPacket(serialized_packet);
122 154
123 if (serialized_packet.retransmittable_frames->HasCryptoHandshake() 155 if (serialized_packet.retransmittable_frames->HasCryptoHandshake()
124 == IS_HANDSHAKE) { 156 == IS_HANDSHAKE) {
125 ++pending_crypto_packet_count_; 157 ++pending_crypto_packet_count_;
126 } 158 }
127 } 159 }
128 160
161 QuicPacketSequenceNumber sequence_number = serialized_packet.sequence_number;
129 DCHECK(unacked_packets_.empty() || 162 DCHECK(unacked_packets_.empty() ||
130 unacked_packets_.rbegin()->first < serialized_packet.sequence_number); 163 unacked_packets_.rbegin()->first < sequence_number);
131 unacked_packets_[serialized_packet.sequence_number] = 164 unacked_packets_[sequence_number] =
132 TransmissionInfo(serialized_packet.retransmittable_frames, 165 TransmissionInfo(serialized_packet.retransmittable_frames,
166 serialized_packet.sequence_number,
133 serialized_packet.sequence_number_length); 167 serialized_packet.sequence_number_length);
134 } 168 }
135 169
136 void QuicSentPacketManager::OnRetransmittedPacket( 170 void QuicSentPacketManager::OnRetransmittedPacket(
137 QuicPacketSequenceNumber old_sequence_number, 171 QuicPacketSequenceNumber old_sequence_number,
138 QuicPacketSequenceNumber new_sequence_number) { 172 QuicPacketSequenceNumber new_sequence_number) {
139 DCHECK(ContainsKey(unacked_packets_, old_sequence_number)); 173 DCHECK(ContainsKey(unacked_packets_, old_sequence_number));
140 DCHECK(ContainsKey(pending_retransmissions_, old_sequence_number)); 174 DCHECK(ContainsKey(pending_retransmissions_, old_sequence_number));
141 DCHECK(unacked_packets_.empty() || 175 DCHECK(unacked_packets_.empty() ||
142 unacked_packets_.rbegin()->first < new_sequence_number); 176 unacked_packets_.rbegin()->first < new_sequence_number);
143 177
144 pending_retransmissions_.erase(old_sequence_number); 178 pending_retransmissions_.erase(old_sequence_number);
145 // TODO(ianswett): Discard and lose the packet lazily instead of immediately. 179 // TODO(ianswett): Discard and lose the packet lazily instead of immediately.
146 TransmissionInfo* transmission_info = 180 TransmissionInfo* transmission_info =
147 FindOrNull(unacked_packets_, old_sequence_number); 181 FindOrNull(unacked_packets_, old_sequence_number);
148 RetransmittableFrames* frames = transmission_info->retransmittable_frames; 182 RetransmittableFrames* frames = transmission_info->retransmittable_frames;
149 DCHECK(frames); 183 DCHECK(frames);
150 184
151 // A notifier may be waiting to hear about ACKs for the original sequence 185 // A notifier may be waiting to hear about ACKs for the original sequence
152 // number. Inform them that the sequence number has changed. 186 // number. Inform them that the sequence number has changed.
153 ack_notifier_manager_.UpdateSequenceNumber(old_sequence_number, 187 ack_notifier_manager_.UpdateSequenceNumber(old_sequence_number,
154 new_sequence_number); 188 new_sequence_number);
155 189
156 // We keep the old packet in the unacked packet list until it, or one of 190 // We keep the old packet in the unacked packet list until it, or one of
157 // the retransmissions of it are acked. 191 // the retransmissions of it are acked.
158 transmission_info->retransmittable_frames = NULL; 192 transmission_info->retransmittable_frames = NULL;
159 unacked_packets_[new_sequence_number] = 193 unacked_packets_[new_sequence_number] =
160 TransmissionInfo(frames, transmission_info->sequence_number_length); 194 TransmissionInfo(frames, new_sequence_number,
161 195 transmission_info->sequence_number_length,
162 // Keep track of all sequence numbers that this packet 196 transmission_info->all_transmissions);
163 // has been transmitted as.
164 SequenceNumberSet* previous_transmissions =
165 transmission_info->previous_transmissions;
166 if (previous_transmissions == NULL) {
167 // This is the first retransmission of this packet, so create a new entry.
168 previous_transmissions = new SequenceNumberSet;
169 transmission_info->previous_transmissions = previous_transmissions;
170 previous_transmissions->insert(old_sequence_number);
171 }
172 previous_transmissions->insert(new_sequence_number);
173 unacked_packets_[new_sequence_number].previous_transmissions =
174 previous_transmissions;
175 } 197 }
176 198
177 bool QuicSentPacketManager::OnIncomingAck( 199 bool QuicSentPacketManager::OnIncomingAck(
178 const ReceivedPacketInfo& received_info, QuicTime ack_receive_time) { 200 const ReceivedPacketInfo& received_info, QuicTime ack_receive_time) {
179 // We rely on delta_time_largest_observed to compute an RTT estimate, so 201 // We rely on delta_time_largest_observed to compute an RTT estimate, so
180 // we only update rtt when the largest observed gets acked. 202 // we only update rtt when the largest observed gets acked.
181 bool largest_observed_acked = 203 bool largest_observed_acked =
182 ContainsKey(unacked_packets_, received_info.largest_observed); 204 ContainsKey(unacked_packets_, received_info.largest_observed);
183 MaybeUpdateRTT(received_info, ack_receive_time); 205 MaybeUpdateRTT(received_info, ack_receive_time);
184 HandleAckForSentPackets(received_info); 206 HandleAckForSentPackets(received_info);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 // Packet was acked, so remove it from our unacked packet list. 245 // Packet was acked, so remove it from our unacked packet list.
224 DVLOG(1) << ENDPOINT <<"Got an ack for packet " << sequence_number; 246 DVLOG(1) << ENDPOINT <<"Got an ack for packet " << sequence_number;
225 // If data is associated with the most recent transmission of this 247 // If data is associated with the most recent transmission of this
226 // packet, then inform the caller. 248 // packet, then inform the caller.
227 it = MarkPacketHandled(sequence_number, RECEIVED_BY_PEER); 249 it = MarkPacketHandled(sequence_number, RECEIVED_BY_PEER);
228 250
229 // The AckNotifierManager is informed of every ACKed sequence number. 251 // The AckNotifierManager is informed of every ACKed sequence number.
230 ack_notifier_manager_.OnPacketAcked(sequence_number); 252 ack_notifier_manager_.OnPacketAcked(sequence_number);
231 } 253 }
232 254
255 // Discard any retransmittable frames associated with revived packets.
256 for (SequenceNumberSet::const_iterator revived_it =
257 received_info.revived_packets.begin();
258 revived_it != received_info.revived_packets.end(); ++revived_it) {
259 TransmissionInfo* transmission_info =
260 FindOrNull(unacked_packets_, *revived_it);
261 if (transmission_info == NULL) {
262 continue;
263 }
264 // The retransmittable frames are removed from the most recent transmission.
265 transmission_info =
266 FindOrNull(unacked_packets_,
267 *transmission_info->all_transmissions->rbegin());
268 if (transmission_info->retransmittable_frames == NULL) {
269 continue;
270 }
271 delete transmission_info->retransmittable_frames;
272 transmission_info->retransmittable_frames = NULL;
273 }
274
233 // If we have received a truncated ack, then we need to 275 // If we have received a truncated ack, then we need to
234 // clear out some previous transmissions to allow the peer 276 // clear out some previous transmissions to allow the peer
235 // to actually ACK new packets. 277 // to actually ACK new packets.
236 if (received_info.is_truncated) { 278 if (received_info.is_truncated) {
237 ClearPreviousRetransmissions(received_info.missing_packets.size() / 2); 279 ClearPreviousRetransmissions(received_info.missing_packets.size() / 2);
238 } 280 }
239 } 281 }
240 282
241 void QuicSentPacketManager::ClearPreviousRetransmissions(size_t num_to_clear) { 283 void QuicSentPacketManager::ClearPreviousRetransmissions(size_t num_to_clear) {
242 UnackedPacketMap::iterator it = unacked_packets_.begin(); 284 UnackedPacketMap::iterator it = unacked_packets_.begin();
243 while (it != unacked_packets_.end() && num_to_clear > 0) { 285 while (it != unacked_packets_.end() && num_to_clear > 0) {
244 QuicPacketSequenceNumber sequence_number = it->first; 286 QuicPacketSequenceNumber sequence_number = it->first;
245 // If this is not a previous transmission then there is no point 287 // If this is a pending packet, or has retransmittable data, then there is
246 // in clearing out any further packets, because it will not affect 288 // no point in clearing out any further packets, because they would not
247 // the high water mark. 289 // affect the high water mark.
248 SequenceNumberSet* previous_transmissions = 290 if (it->second.pending || it->second.retransmittable_frames != NULL) {
249 it->second.previous_transmissions;
250 if (previous_transmissions == NULL) {
251 if (it->second.retransmittable_frames == NULL) {
252 // This is a current transmission, but a previous transmission has
253 // been acked, so it's safe to remove.
254 it = MarkPacketHandled(sequence_number, NOT_RECEIVED_BY_PEER);
255 --num_to_clear;
256 continue;
257 }
258 break;
259 }
260 QuicPacketSequenceNumber newest_transmission =
261 *previous_transmissions->rbegin();
262 if (sequence_number == newest_transmission) {
263 break;
264 }
265 if (it->second.pending) {
266 break; 291 break;
267 } 292 }
268 293
269 DCHECK(it->second.retransmittable_frames == NULL); 294 ++it;
270 previous_transmissions->erase(sequence_number); 295 RemovePacket(sequence_number);
271 if (previous_transmissions->size() == 1) {
272 unacked_packets_[newest_transmission].previous_transmissions = NULL;
273 delete previous_transmissions;
274 }
275 unacked_packets_.erase(it++);
276 --num_to_clear; 296 --num_to_clear;
277 } 297 }
278 } 298 }
279 299
280 bool QuicSentPacketManager::HasRetransmittableFrames( 300 bool QuicSentPacketManager::HasRetransmittableFrames(
281 QuicPacketSequenceNumber sequence_number) const { 301 QuicPacketSequenceNumber sequence_number) const {
282 const TransmissionInfo* transmission_info = 302 const TransmissionInfo* transmission_info =
283 FindOrNull(unacked_packets_, sequence_number); 303 FindOrNull(unacked_packets_, sequence_number);
284 if (transmission_info == NULL) { 304 if (transmission_info == NULL) {
285 return false; 305 return false;
286 } 306 }
287 307
288 return transmission_info->retransmittable_frames != NULL; 308 return transmission_info->retransmittable_frames != NULL;
289 } 309 }
290 310
291 void QuicSentPacketManager::RetransmitUnackedPackets( 311 void QuicSentPacketManager::RetransmitUnackedPackets(
292 RetransmissionType retransmission_type) { 312 RetransmissionType retransmission_type) {
293 UnackedPacketMap::iterator unacked_it = unacked_packets_.begin(); 313 UnackedPacketMap::iterator unacked_it = unacked_packets_.begin();
294 while (unacked_it != unacked_packets_.end()) { 314 while (unacked_it != unacked_packets_.end()) {
295 const RetransmittableFrames* frames = 315 const RetransmittableFrames* frames =
296 unacked_it->second.retransmittable_frames; 316 unacked_it->second.retransmittable_frames;
297 // Only mark it as handled if it can't be retransmitted and there are no 317 // Only mark it as handled if it can't be retransmitted and there are no
298 // pending retransmissions which would be cleared. 318 // pending retransmissions which would be cleared.
299 if (frames == NULL && unacked_it->second.previous_transmissions == NULL && 319 if (frames == NULL && unacked_it->second.all_transmissions->size() == 1 &&
300 retransmission_type == ALL_PACKETS) { 320 retransmission_type == ALL_PACKETS) {
301 unacked_it = MarkPacketHandled(unacked_it->first, NOT_RECEIVED_BY_PEER); 321 unacked_it = MarkPacketHandled(unacked_it->first, NOT_RECEIVED_BY_PEER);
302 continue; 322 continue;
303 } 323 }
304 // If it had no other transmissions, we handle it above. If it has 324 // If it had no other transmissions, we handle it above. If it has
305 // other transmissions, one of them must have retransmittable frames, 325 // other transmissions, one of them must have retransmittable frames,
306 // so that gets resolved the same way as other retransmissions. 326 // so that gets resolved the same way as other retransmissions.
307 // TODO(ianswett): Consider adding a new retransmission type which removes 327 // TODO(ianswett): Consider adding a new retransmission type which removes
308 // all these old packets from unacked and retransmits them as new sequence 328 // all these old packets from unacked and retransmits them as new sequence
309 // numbers with no connection to the previous ones. 329 // numbers with no connection to the previous ones.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 const TransmissionInfo& transmission_info) { 381 const TransmissionInfo& transmission_info) {
362 if (transmission_info.retransmittable_frames == NULL) { 382 if (transmission_info.retransmittable_frames == NULL) {
363 return false; 383 return false;
364 } 384 }
365 return transmission_info.retransmittable_frames->HasCryptoHandshake() == 385 return transmission_info.retransmittable_frames->HasCryptoHandshake() ==
366 IS_HANDSHAKE; 386 IS_HANDSHAKE;
367 } 387 }
368 388
369 QuicSentPacketManager::UnackedPacketMap::iterator 389 QuicSentPacketManager::UnackedPacketMap::iterator
370 QuicSentPacketManager::MarkPacketHandled( 390 QuicSentPacketManager::MarkPacketHandled(
371 QuicPacketSequenceNumber sequence_number, ReceivedByPeer received_by_peer) { 391 QuicPacketSequenceNumber sequence_number,
372 DCHECK(ContainsKey(unacked_packets_, sequence_number)); 392 ReceivedByPeer received_by_peer) {
373 393 UnackedPacketMap::iterator it = unacked_packets_.find(sequence_number);
394 if (it == unacked_packets_.end()) {
395 LOG(DFATAL) << "Packet is not unacked: " << sequence_number;
396 return it;
397 }
374 // If this packet is pending, remove it and inform the send algorithm. 398 // If this packet is pending, remove it and inform the send algorithm.
375 UnackedPacketMap::iterator it = unacked_packets_.find(sequence_number);
376 if (it->second.pending) { 399 if (it->second.pending) {
377 size_t bytes_sent = packet_history_map_[sequence_number]->bytes_sent(); 400 size_t bytes_sent = packet_history_map_[sequence_number]->bytes_sent();
378 if (received_by_peer == RECEIVED_BY_PEER) { 401 if (received_by_peer == RECEIVED_BY_PEER) {
379 send_algorithm_->OnPacketAcked(sequence_number, bytes_sent); 402 send_algorithm_->OnPacketAcked(sequence_number, bytes_sent);
380 } else { 403 } else {
381 // It's been abandoned. 404 // It's been abandoned.
382 send_algorithm_->OnPacketAbandoned(sequence_number, bytes_sent); 405 send_algorithm_->OnPacketAbandoned(sequence_number, bytes_sent);
383 } 406 }
384 it->second.pending = false; 407 it->second.pending = false;
385 } 408 }
386 409
387 // If this packet has never been retransmitted, then simply drop it. 410 SequenceNumberSet* all_transmissions = it->second.all_transmissions;
388 if (it->second.previous_transmissions == NULL) { 411 DCHECK(!all_transmissions->empty());
389 ++it; 412 SequenceNumberSet::reverse_iterator all_transmissions_it =
390 DiscardPacket(sequence_number); 413 all_transmissions->rbegin();
391 return it; 414 QuicPacketSequenceNumber newest_transmission = *all_transmissions_it;
392 }
393
394 SequenceNumberSet* previous_transmissions = it->second.previous_transmissions;
395 DCHECK(!previous_transmissions->empty());
396 SequenceNumberSet::reverse_iterator previous_transmissions_it =
397 previous_transmissions->rbegin();
398 QuicPacketSequenceNumber newest_transmission = *previous_transmissions_it;
399 TransmissionInfo* transmission_info =
400 FindOrNull(unacked_packets_, newest_transmission);
401 if (newest_transmission != sequence_number) { 415 if (newest_transmission != sequence_number) {
402 ++stats_->packets_spuriously_retransmitted; 416 ++stats_->packets_spuriously_retransmitted;
403 } 417 }
404 if (newest_transmission == sequence_number) { 418
405 DiscardPacket(newest_transmission); 419 bool has_cryto_handshake = HasCryptoHandshake(
406 } else if (HasCryptoHandshake(*transmission_info)) { 420 *FindOrNull(unacked_packets_, newest_transmission));
407 // If it's a crypto handshake packet, discard it and all retransmissions, 421 if (has_cryto_handshake) {
408 // since they won't be acked now that one has been processed. 422 --pending_crypto_packet_count_;
409 if (transmission_info->pending) { 423 }
410 OnPacketAbandoned(unacked_packets_.find(newest_transmission)); 424 while (all_transmissions_it != all_transmissions->rend()) {
425 QuicPacketSequenceNumber previous_transmission = *all_transmissions_it;
426 TransmissionInfo* transmission_info =
427 FindOrNull(unacked_packets_, previous_transmission);
428 if (transmission_info->retransmittable_frames != NULL) {
429 // Since some version of this packet has been acked, ensure that
430 // the data is not retransmitted again.
431 delete transmission_info->retransmittable_frames;
432 transmission_info->retransmittable_frames = NULL;
411 } 433 }
412 DiscardPacket(newest_transmission); 434 if (ContainsKey(pending_retransmissions_, previous_transmission)) {
413 } else { 435 // Don't bother retransmitting this packet, if it has been
414 // If we have received an ack for a previous transmission of a packet, 436 // marked for retransmission.
415 // we want to keep the "new" transmission of the packet unacked, 437 pending_retransmissions_.erase(previous_transmission);
416 // but prevent the data from being retransmitted. 438 }
417 delete transmission_info->retransmittable_frames; 439 if (has_cryto_handshake) {
418 transmission_info->retransmittable_frames = NULL; 440 // If it's a crypto handshake packet, discard it and all retransmissions,
419 transmission_info->previous_transmissions = NULL; 441 // since they won't be acked now that one has been processed.
442 if (transmission_info->pending) {
443 OnPacketAbandoned(unacked_packets_.find(newest_transmission));
444 }
445 transmission_info->pending = false;
446 }
447 if (!transmission_info->pending) {
448 unacked_packets_.erase(previous_transmission);
449 } else {
450 transmission_info->all_transmissions = new SequenceNumberSet;
451 transmission_info->all_transmissions->insert(previous_transmission);
452 }
453 ++all_transmissions_it;
420 } 454 }
421 455 delete all_transmissions;
422 // Clear out information all previous transmissions unless they're pending.
423 ++previous_transmissions_it;
424 while (previous_transmissions_it != previous_transmissions->rend()) {
425 QuicPacketSequenceNumber previous_transmission = *previous_transmissions_it;
426 ++previous_transmissions_it;
427 // If the packet was TLP retransmitted, the old copy is still pending.
428 // Keep it until it is lost or acked.
429 if (unacked_packets_[previous_transmission].pending) {
430 // Previous transmissions will be deleted, so set it to NULL.
431 unacked_packets_[previous_transmission].previous_transmissions = NULL;
432 } else {
433 DiscardPacket(previous_transmission);
434 }
435 }
436
437 delete previous_transmissions;
438
439 if (ContainsKey(pending_retransmissions_, newest_transmission)) {
440 pending_retransmissions_.erase(newest_transmission);
441 if (!unacked_packets_[newest_transmission].pending) {
442 // If the newest transmission has already been marked for retransmission
443 // and has already been abandoned, then we should remove it from
444 // unacked_packets_, as well as cancel the retransmission.
445 DCHECK(ContainsKey(unacked_packets_, newest_transmission));
446 DCHECK(!unacked_packets_[newest_transmission].previous_transmissions);
447 unacked_packets_.erase(newest_transmission);
448 }
449 }
450 456
451 UnackedPacketMap::iterator next_unacked = unacked_packets_.begin(); 457 UnackedPacketMap::iterator next_unacked = unacked_packets_.begin();
452 while (next_unacked != unacked_packets_.end() && 458 while (next_unacked != unacked_packets_.end() &&
453 next_unacked->first < sequence_number) { 459 next_unacked->first < sequence_number) {
454 ++next_unacked; 460 ++next_unacked;
455 } 461 }
456 return next_unacked; 462 return next_unacked;
457 } 463 }
458 464
459 void QuicSentPacketManager::DiscardPacket( 465 void QuicSentPacketManager::RemovePacket(
460 QuicPacketSequenceNumber sequence_number) { 466 QuicPacketSequenceNumber sequence_number) {
461 UnackedPacketMap::iterator unacked_it = 467 UnackedPacketMap::iterator it = unacked_packets_.find(sequence_number);
462 unacked_packets_.find(sequence_number); 468 if (it == unacked_packets_.end()) {
463 DCHECK(unacked_it != unacked_packets_.end()); 469 LOG(DFATAL) << "packet is not unacked: " << sequence_number;
464 // Ensure the packet is no longer pending when it's discarded. 470 return;
465 DCHECK(!unacked_it->second.pending);
466
467 RetransmittableFrames* retransmittable_frames =
468 unacked_it->second.retransmittable_frames;
469 if (HasCryptoHandshake(unacked_it->second)) {
470 --pending_crypto_packet_count_;
471 } 471 }
472 472 const TransmissionInfo& transmission_info = it->second;
473 // Delete the retransmittable frames. 473 transmission_info.all_transmissions->erase(sequence_number);
474 delete retransmittable_frames; 474 if (transmission_info.all_transmissions->empty()) {
475 unacked_packets_.erase(unacked_it); 475 delete transmission_info.all_transmissions;
476 pending_retransmissions_.erase(sequence_number); 476 }
477 return; 477 unacked_packets_.erase(it);
478 } 478 }
479 479
480 bool QuicSentPacketManager::IsUnacked( 480 bool QuicSentPacketManager::IsUnacked(
481 QuicPacketSequenceNumber sequence_number) const { 481 QuicPacketSequenceNumber sequence_number) const {
482 return ContainsKey(unacked_packets_, sequence_number); 482 return ContainsKey(unacked_packets_, sequence_number);
483 } 483 }
484 484
485 bool QuicSentPacketManager::HasUnackedPackets() const { 485 bool QuicSentPacketManager::HasUnackedPackets() const {
486 return !unacked_packets_.empty(); 486 return !unacked_packets_.empty();
487 } 487 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 if (it == unacked_packets_.end()) { 539 if (it == unacked_packets_.end()) {
540 return false; 540 return false;
541 } 541 }
542 DCHECK(!it->second.pending); 542 DCHECK(!it->second.pending);
543 543
544 // Only track packets the send algorithm wants us to track. 544 // Only track packets the send algorithm wants us to track.
545 if (!send_algorithm_->OnPacketSent(sent_time, sequence_number, bytes, 545 if (!send_algorithm_->OnPacketSent(sent_time, sequence_number, bytes,
546 transmission_type, 546 transmission_type,
547 has_retransmittable_data)) { 547 has_retransmittable_data)) {
548 DCHECK(it->second.retransmittable_frames == NULL); 548 DCHECK(it->second.retransmittable_frames == NULL);
549 unacked_packets_.erase(it); 549 RemovePacket(sequence_number);
550 // Do not reset the retransmission timer, since the packet isn't tracked. 550 // Do not reset the retransmission timer, since the packet isn't tracked.
551 return false; 551 return false;
552 } 552 }
553 553
554 const bool set_retransmission_timer = !HasPendingPackets(); 554 const bool set_retransmission_timer = !HasPendingPackets();
555 it->second.sent_time = sent_time; 555 it->second.sent_time = sent_time;
556 it->second.pending = true; 556 it->second.pending = true;
557 packet_history_map_[sequence_number] = 557 packet_history_map_[sequence_number] =
558 new SendAlgorithmInterface::SentPacket(bytes, sent_time); 558 new SendAlgorithmInterface::SentPacket(bytes, sent_time);
559 CleanupPacketHistory(); 559 CleanupPacketHistory();
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 OnPacketAbandoned(it); 748 OnPacketAbandoned(it);
749 749
750 if (transmission_info.retransmittable_frames) { 750 if (transmission_info.retransmittable_frames) {
751 MarkForRetransmission(sequence_number, NACK_RETRANSMISSION); 751 MarkForRetransmission(sequence_number, NACK_RETRANSMISSION);
752 ++it; 752 ++it;
753 } else { 753 } else {
754 // Since we will not retransmit this, we need to remove it from 754 // Since we will not retransmit this, we need to remove it from
755 // unacked_packets_. This is either the current transmission of 755 // unacked_packets_. This is either the current transmission of
756 // a packet whose previous transmission has been acked, or it 756 // a packet whose previous transmission has been acked, or it
757 // is a packet that has been TLP retransmitted. 757 // is a packet that has been TLP retransmitted.
758 RemovePreviousTransmission(sequence_number); 758 ++it;
759 unacked_packets_.erase(it++); 759 RemovePacket(sequence_number);
760 } 760 }
761 } 761 }
762 } 762 }
763 763
764 void QuicSentPacketManager::MaybeUpdateRTT( 764 void QuicSentPacketManager::MaybeUpdateRTT(
765 const ReceivedPacketInfo& received_info, 765 const ReceivedPacketInfo& received_info,
766 const QuicTime& ack_receive_time) { 766 const QuicTime& ack_receive_time) {
767 // We calculate the RTT based on the highest ACKed sequence number, the lower 767 // We calculate the RTT based on the highest ACKed sequence number, the lower
768 // sequence numbers will include the ACK aggregation delay. 768 // sequence numbers will include the ACK aggregation delay.
769 const TransmissionInfo* transmission_info = 769 const TransmissionInfo* transmission_info =
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
954 if (using_pacing_) { 954 if (using_pacing_) {
955 return; 955 return;
956 } 956 }
957 957
958 using_pacing_ = true; 958 using_pacing_ = true;
959 send_algorithm_.reset( 959 send_algorithm_.reset(
960 new PacingSender(send_algorithm_.release(), 960 new PacingSender(send_algorithm_.release(),
961 QuicTime::Delta::FromMicroseconds(1))); 961 QuicTime::Delta::FromMicroseconds(1)));
962 } 962 }
963 963
964 void QuicSentPacketManager::RemovePreviousTransmission(
965 QuicPacketSequenceNumber sequence_number) {
966 SequenceNumberSet* previous_transmissions =
967 unacked_packets_[sequence_number].previous_transmissions;
968 if (!previous_transmissions) {
969 return;
970 }
971 previous_transmissions->erase(sequence_number);
972 if (previous_transmissions->size() == 1) {
973 QuicPacketSequenceNumber current = *previous_transmissions->begin();
974 unacked_packets_[current].previous_transmissions = NULL;
975 delete previous_transmissions;
976 }
977 }
978
979 } // namespace net 964 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_sent_packet_manager.h ('k') | net/quic/quic_sent_packet_manager_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698