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

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

Issue 76723002: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix compilation error Created 7 years, 1 month 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/quic_ack_notifier_manager.h" 9 #include "net/quic/quic_ack_notifier_manager.h"
10 10
(...skipping 14 matching lines...) Expand all
25 QuicSentPacketManager::HelperInterface::~HelperInterface() { 25 QuicSentPacketManager::HelperInterface::~HelperInterface() {
26 } 26 }
27 27
28 QuicSentPacketManager::QuicSentPacketManager(bool is_server, 28 QuicSentPacketManager::QuicSentPacketManager(bool is_server,
29 HelperInterface* helper) 29 HelperInterface* helper)
30 : is_server_(is_server), 30 : is_server_(is_server),
31 helper_(helper) { 31 helper_(helper) {
32 } 32 }
33 33
34 QuicSentPacketManager::~QuicSentPacketManager() { 34 QuicSentPacketManager::~QuicSentPacketManager() {
35 STLDeleteValues(&unacked_packets_); 35 for (UnackedPacketMap::iterator it = unacked_packets_.begin();
36 it != unacked_packets_.end(); ++it) {
37 delete it->second.retransmittable_frames;
38 }
36 while (!previous_transmissions_map_.empty()) { 39 while (!previous_transmissions_map_.empty()) {
37 SequenceNumberSet* previous_transmissions = 40 SequenceNumberSet* previous_transmissions =
38 previous_transmissions_map_.begin()->second; 41 previous_transmissions_map_.begin()->second;
39 for (SequenceNumberSet::const_iterator it = previous_transmissions->begin(); 42 for (SequenceNumberSet::const_iterator it = previous_transmissions->begin();
40 it != previous_transmissions->end(); ++it) { 43 it != previous_transmissions->end(); ++it) {
41 DCHECK(ContainsKey(previous_transmissions_map_, *it)); 44 DCHECK(ContainsKey(previous_transmissions_map_, *it));
42 previous_transmissions_map_.erase(*it); 45 previous_transmissions_map_.erase(*it);
43 } 46 }
44 delete previous_transmissions; 47 delete previous_transmissions;
45 } 48 }
46 } 49 }
47 50
48 void QuicSentPacketManager::OnSerializedPacket( 51 void QuicSentPacketManager::OnSerializedPacket(
49 const SerializedPacket& serialized_packet, QuicTime serialized_time) { 52 const SerializedPacket& serialized_packet, QuicTime serialized_time) {
50 if (serialized_packet.packet->is_fec_packet()) { 53 if (serialized_packet.packet->is_fec_packet()) {
51 DCHECK(!serialized_packet.retransmittable_frames); 54 DCHECK(!serialized_packet.retransmittable_frames);
52 unacked_fec_packets_.insert(make_pair( 55 unacked_fec_packets_.insert(make_pair(
53 serialized_packet.sequence_number, serialized_time)); 56 serialized_packet.sequence_number, serialized_time));
54 return; 57 return;
55 } 58 }
56 59
57 if (serialized_packet.retransmittable_frames == NULL) { 60 if (serialized_packet.retransmittable_frames == NULL) {
58 // Don't track ack/congestion feedback packets. 61 // Don't track ack/congestion feedback packets.
59 return; 62 return;
60 } 63 }
61 64
62 ack_notifier_manager_.OnSerializedPacket(serialized_packet); 65 ack_notifier_manager_.OnSerializedPacket(serialized_packet);
63 66
64 DCHECK(unacked_packets_.empty() || 67 DCHECK(unacked_packets_.empty() ||
65 unacked_packets_.rbegin()->first < 68 unacked_packets_.rbegin()->first < serialized_packet.sequence_number);
66 serialized_packet.sequence_number);
67 unacked_packets_[serialized_packet.sequence_number] = 69 unacked_packets_[serialized_packet.sequence_number] =
68 serialized_packet.retransmittable_frames; 70 TransmissionInfo(serialized_packet.retransmittable_frames,
69 retransmission_map_[serialized_packet.sequence_number] = 71 serialized_packet.sequence_number_length);
70 RetransmissionInfo(serialized_packet.sequence_number, 72 nack_map_[serialized_packet.sequence_number] = 0;
71 serialized_packet.sequence_number_length);
72 } 73 }
73 74
74 void QuicSentPacketManager::OnRetransmittedPacket( 75 void QuicSentPacketManager::OnRetransmittedPacket(
75 QuicPacketSequenceNumber old_sequence_number, 76 QuicPacketSequenceNumber old_sequence_number,
76 QuicPacketSequenceNumber new_sequence_number) { 77 QuicPacketSequenceNumber new_sequence_number) {
77 DCHECK(ContainsKey(unacked_packets_, old_sequence_number)); 78 DCHECK(ContainsKey(unacked_packets_, old_sequence_number));
78 DCHECK(ContainsKey(retransmission_map_, old_sequence_number)); 79 DCHECK(ContainsKey(nack_map_, old_sequence_number));
79 DCHECK(ContainsKey(pending_retransmissions_, old_sequence_number)); 80 DCHECK(ContainsKey(pending_retransmissions_, old_sequence_number));
80 DCHECK(unacked_packets_.empty() || 81 DCHECK(unacked_packets_.empty() ||
81 unacked_packets_.rbegin()->first < new_sequence_number); 82 unacked_packets_.rbegin()->first < new_sequence_number);
82 83
83 pending_retransmissions_.erase(old_sequence_number); 84 pending_retransmissions_.erase(old_sequence_number);
84 85
85 RetransmissionInfo retransmission_info( 86 nack_map_.erase(old_sequence_number);
86 new_sequence_number, GetSequenceNumberLength(old_sequence_number)); 87 nack_map_[new_sequence_number] = 0;
87 retransmission_info.number_retransmissions =
88 retransmission_map_[old_sequence_number].number_retransmissions + 1;
89 retransmission_map_.erase(old_sequence_number);
90 retransmission_map_[new_sequence_number] = retransmission_info;
91 88
92 RetransmittableFrames* frames = unacked_packets_[old_sequence_number]; 89 RetransmittableFrames* frames =
90 unacked_packets_[old_sequence_number].retransmittable_frames;
93 DCHECK(frames); 91 DCHECK(frames);
94 92
95 // A notifier may be waiting to hear about ACKs for the original sequence 93 // A notifier may be waiting to hear about ACKs for the original sequence
96 // number. Inform them that the sequence number has changed. 94 // number. Inform them that the sequence number has changed.
97 ack_notifier_manager_.UpdateSequenceNumber(old_sequence_number, 95 ack_notifier_manager_.UpdateSequenceNumber(old_sequence_number,
98 new_sequence_number); 96 new_sequence_number);
99 97
100 if (FLAGS_track_retransmission_history) { 98 // We keep the old packet in the unacked packet list until it, or one of
101 // We keep the old packet in the unacked packet list until it, or one of 99 // the retransmissions of it are acked.
102 // the retransmissions of it are acked. 100 unacked_packets_[old_sequence_number].retransmittable_frames = NULL;
103 unacked_packets_[old_sequence_number] = NULL; 101 unacked_packets_[new_sequence_number] =
104 } else { 102 TransmissionInfo(frames, GetSequenceNumberLength(old_sequence_number));
105 unacked_packets_.erase(old_sequence_number);
106 }
107 unacked_packets_[new_sequence_number] = frames;
108 103
109 if (!FLAGS_track_retransmission_history) {
110 return;
111 }
112 // Keep track of all sequence numbers that this packet 104 // Keep track of all sequence numbers that this packet
113 // has been transmitted as. 105 // has been transmitted as.
114 SequenceNumberSet* previous_transmissions; 106 SequenceNumberSet* previous_transmissions;
115 PreviousTransmissionMap::iterator it = 107 PreviousTransmissionMap::iterator it =
116 previous_transmissions_map_.find(old_sequence_number); 108 previous_transmissions_map_.find(old_sequence_number);
117 if (it == previous_transmissions_map_.end()) { 109 if (it == previous_transmissions_map_.end()) {
118 // This is the first retransmission of this packet, so create a new entry. 110 // This is the first retransmission of this packet, so create a new entry.
119 previous_transmissions = new SequenceNumberSet; 111 previous_transmissions = new SequenceNumberSet;
120 previous_transmissions_map_[old_sequence_number] = previous_transmissions; 112 previous_transmissions_map_[old_sequence_number] = previous_transmissions;
121 previous_transmissions->insert(old_sequence_number); 113 previous_transmissions->insert(old_sequence_number);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 161
170 // The peer got packets after this sequence number. This is an explicit 162 // The peer got packets after this sequence number. This is an explicit
171 // nack. 163 // nack.
172 164
173 // TODO(rch): move this to the congestion manager, and fix the logic. 165 // TODO(rch): move this to the congestion manager, and fix the logic.
174 // This is a packet which we planned on retransmitting and has not been 166 // This is a packet which we planned on retransmitting and has not been
175 // seen at the time of this ack being sent out. See if it's our new 167 // seen at the time of this ack being sent out. See if it's our new
176 // lowest unacked packet. 168 // lowest unacked packet.
177 DVLOG(1) << ENDPOINT << "still missing packet " << sequence_number; 169 DVLOG(1) << ENDPOINT << "still missing packet " << sequence_number;
178 ++it; 170 ++it;
179 RetransmissionMap::iterator retransmission_it = 171 NackMap::iterator nack_it = nack_map_.find(sequence_number);
180 retransmission_map_.find(sequence_number); 172 if (nack_it == nack_map_.end()) {
181 if (retransmission_it == retransmission_map_.end()) {
182 continue; 173 continue;
183 } 174 }
184 size_t nack_count = ++(retransmission_it->second.number_nacks); 175 ++nack_it->second;
185 helper_->OnPacketNacked(sequence_number, nack_count); 176 helper_->OnPacketNacked(sequence_number, nack_it->second);
186 } 177 }
187 178
188 // If we have received a trunacted ack, then we need to 179 // If we have received a trunacted ack, then we need to
189 // clear out some previous transmissions to allow the peer 180 // clear out some previous transmissions to allow the peer
190 // to actually ACK new packets. 181 // to actually ACK new packets.
191 if (is_truncated_ack) { 182 if (is_truncated_ack) {
192 size_t num_to_clear = received_info.missing_packets.size() / 2; 183 size_t num_to_clear = received_info.missing_packets.size() / 2;
193 UnackedPacketMap::iterator it = unacked_packets_.begin(); 184 UnackedPacketMap::iterator it = unacked_packets_.begin();
194 while (it != unacked_packets_.end() && num_to_clear > 0) { 185 while (it != unacked_packets_.end() && num_to_clear > 0) {
195 QuicPacketSequenceNumber sequence_number = it->first; 186 QuicPacketSequenceNumber sequence_number = it->first;
196 ++it; 187 ++it;
197 // If this is not a previous transmission then there is no point 188 // If this is not a previous transmission then there is no point
198 // in clearing out any further packets, because it will not 189 // in clearing out any further packets, because it will not
199 // affect the high water mark. 190 // affect the high water mark.
200 if (!IsPreviousTransmission(sequence_number)) { 191 if (!IsPreviousTransmission(sequence_number)) {
201 break; 192 break;
202 } 193 }
203 194
204 DCHECK(ContainsKey(previous_transmissions_map_, sequence_number)); 195 DCHECK(ContainsKey(previous_transmissions_map_, sequence_number));
205 DCHECK(!ContainsKey(retransmission_map_, sequence_number)); 196 DCHECK(!ContainsKey(nack_map_, sequence_number));
206 DCHECK(!HasRetransmittableFrames(sequence_number)); 197 DCHECK(!HasRetransmittableFrames(sequence_number));
207 unacked_packets_.erase(sequence_number); 198 unacked_packets_.erase(sequence_number);
208 SequenceNumberSet* previous_transmissions = 199 SequenceNumberSet* previous_transmissions =
209 previous_transmissions_map_[sequence_number]; 200 previous_transmissions_map_[sequence_number];
210 previous_transmissions_map_.erase(sequence_number); 201 previous_transmissions_map_.erase(sequence_number);
211 previous_transmissions->erase(sequence_number); 202 previous_transmissions->erase(sequence_number);
212 if (previous_transmissions->size() == 1) { 203 if (previous_transmissions->size() == 1) {
213 previous_transmissions_map_.erase(*previous_transmissions->begin()); 204 previous_transmissions_map_.erase(*previous_transmissions->begin());
214 delete previous_transmissions; 205 delete previous_transmissions;
215 } 206 }
216 --num_to_clear; 207 --num_to_clear;
217 } 208 }
218 } 209 }
219 } 210 }
220 211
221 bool QuicSentPacketManager::HasRetransmittableFrames( 212 bool QuicSentPacketManager::HasRetransmittableFrames(
222 QuicPacketSequenceNumber sequence_number) const { 213 QuicPacketSequenceNumber sequence_number) const {
223 if (!ContainsKey(unacked_packets_, sequence_number)) { 214 if (!ContainsKey(unacked_packets_, sequence_number)) {
224 return false; 215 return false;
225 } 216 }
226 217
227 return unacked_packets_.find(sequence_number)->second != NULL; 218 return unacked_packets_.find(
219 sequence_number)->second.retransmittable_frames != NULL;
228 } 220 }
229 221
230 bool QuicSentPacketManager::MarkForRetransmission( 222 bool QuicSentPacketManager::MarkForRetransmission(
231 QuicPacketSequenceNumber sequence_number, 223 QuicPacketSequenceNumber sequence_number,
232 TransmissionType transmission_type) { 224 TransmissionType transmission_type) {
233 DCHECK(ContainsKey(unacked_packets_, sequence_number)); 225 DCHECK(ContainsKey(unacked_packets_, sequence_number));
234 if (!HasRetransmittableFrames(sequence_number)) { 226 if (!HasRetransmittableFrames(sequence_number)) {
235 return false; 227 return false;
236 } 228 }
237 // If it's already in the retransmission map, don't add it again, just let 229 // If it's already in the retransmission map, don't add it again, just let
238 // the prior retransmission request win out. 230 // the prior retransmission request win out.
239 if (ContainsKey(pending_retransmissions_, sequence_number)) { 231 if (ContainsKey(pending_retransmissions_, sequence_number)) {
240 return true; 232 return true;
241 } 233 }
242 234
243 pending_retransmissions_[sequence_number] = transmission_type; 235 pending_retransmissions_[sequence_number] = transmission_type;
244 return true; 236 return true;
245 } 237 }
246 238
247 bool QuicSentPacketManager::HasPendingRetransmissions() const { 239 bool QuicSentPacketManager::HasPendingRetransmissions() const {
248 return !pending_retransmissions_.empty(); 240 return !pending_retransmissions_.empty();
249 } 241 }
250 242
251 QuicSentPacketManager::PendingRetransmission 243 QuicSentPacketManager::PendingRetransmission
252 QuicSentPacketManager::NextPendingRetransmission() { 244 QuicSentPacketManager::NextPendingRetransmission() {
253 DCHECK(!pending_retransmissions_.empty()); 245 DCHECK(!pending_retransmissions_.empty());
254 QuicPacketSequenceNumber sequence_number = 246 QuicPacketSequenceNumber sequence_number =
255 pending_retransmissions_.begin()->first; 247 pending_retransmissions_.begin()->first;
256 DCHECK(ContainsKey(unacked_packets_, sequence_number)); 248 DCHECK(ContainsKey(unacked_packets_, sequence_number));
257 DCHECK(unacked_packets_[sequence_number]); 249 DCHECK(unacked_packets_[sequence_number].retransmittable_frames);
258 250
259 return PendingRetransmission(sequence_number, 251 return PendingRetransmission(sequence_number,
260 pending_retransmissions_.begin()->second, 252 pending_retransmissions_.begin()->second,
261 GetRetransmittableFrames(sequence_number), 253 GetRetransmittableFrames(sequence_number),
262 GetSequenceNumberLength(sequence_number)); 254 GetSequenceNumberLength(sequence_number));
263 } 255 }
264 256
265 bool QuicSentPacketManager::IsPreviousTransmission( 257 bool QuicSentPacketManager::IsPreviousTransmission(
266 QuicPacketSequenceNumber sequence_number) const { 258 QuicPacketSequenceNumber sequence_number) const {
267 DCHECK(ContainsKey(unacked_packets_, sequence_number)); 259 DCHECK(ContainsKey(unacked_packets_, sequence_number));
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 bool is_new_packet = new_packet == sequence_number; 309 bool is_new_packet = new_packet == sequence_number;
318 if (is_new_packet) { 310 if (is_new_packet) {
319 DiscardPacket(new_packet); 311 DiscardPacket(new_packet);
320 } else { 312 } else {
321 if (next_unacked->first == new_packet) { 313 if (next_unacked->first == new_packet) {
322 ++next_unacked; 314 ++next_unacked;
323 } 315 }
324 // If we have received an ack for a previous transmission of a packet, 316 // If we have received an ack for a previous transmission of a packet,
325 // we want to keep the "new" transmission of the packet unacked, 317 // we want to keep the "new" transmission of the packet unacked,
326 // but prevent the data from being retransmitted. 318 // but prevent the data from being retransmitted.
327 delete unacked_packets_[new_packet]; 319 delete unacked_packets_[new_packet].retransmittable_frames;
328 unacked_packets_[new_packet] = NULL; 320 unacked_packets_[new_packet].retransmittable_frames = NULL;
329 pending_retransmissions_.erase(new_packet); 321 pending_retransmissions_.erase(new_packet);
330 } 322 }
331 previous_transmissions_map_.erase(new_packet); 323 previous_transmissions_map_.erase(new_packet);
332 324
333 // Clear out information all previous transmissions. 325 // Clear out information all previous transmissions.
334 ++previous_transmissions_it; 326 ++previous_transmissions_it;
335 while (previous_transmissions_it != previous_transmissions->rend()) { 327 while (previous_transmissions_it != previous_transmissions->rend()) {
336 QuicPacketSequenceNumber previous_transmission = *previous_transmissions_it; 328 QuicPacketSequenceNumber previous_transmission = *previous_transmissions_it;
337 ++previous_transmissions_it; 329 ++previous_transmissions_it;
338 DCHECK(ContainsKey(previous_transmissions_map_, previous_transmission)); 330 DCHECK(ContainsKey(previous_transmissions_map_, previous_transmission));
(...skipping 14 matching lines...) Expand all
353 } 345 }
354 return next_unacked; 346 return next_unacked;
355 } 347 }
356 348
357 void QuicSentPacketManager::DiscardPacket( 349 void QuicSentPacketManager::DiscardPacket(
358 QuicPacketSequenceNumber sequence_number) { 350 QuicPacketSequenceNumber sequence_number) {
359 UnackedPacketMap::iterator unacked_it = 351 UnackedPacketMap::iterator unacked_it =
360 unacked_packets_.find(sequence_number); 352 unacked_packets_.find(sequence_number);
361 // Packet was not meant to be retransmitted. 353 // Packet was not meant to be retransmitted.
362 if (unacked_it == unacked_packets_.end()) { 354 if (unacked_it == unacked_packets_.end()) {
363 DCHECK(!ContainsKey(retransmission_map_, sequence_number)); 355 DCHECK(!ContainsKey(nack_map_, sequence_number));
364 return; 356 return;
365 } 357 }
366 358
367 // Delete the unacked packet. 359 // Delete the retransmittable frames.
368 delete unacked_it->second; 360 delete unacked_it->second.retransmittable_frames;
369 unacked_packets_.erase(unacked_it); 361 unacked_packets_.erase(unacked_it);
370 retransmission_map_.erase(sequence_number); 362 nack_map_.erase(sequence_number);
371 pending_retransmissions_.erase(sequence_number); 363 pending_retransmissions_.erase(sequence_number);
372 return; 364 return;
373 } 365 }
374 366
375 void QuicSentPacketManager::HandleAckForSentFecPackets( 367 void QuicSentPacketManager::HandleAckForSentFecPackets(
376 const ReceivedPacketInfo& received_info) { 368 const ReceivedPacketInfo& received_info) {
377 UnackedFecPacketMap::iterator it = unacked_fec_packets_.begin(); 369 UnackedFecPacketMap::iterator it = unacked_fec_packets_.begin();
378 while (it != unacked_fec_packets_.end()) { 370 while (it != unacked_fec_packets_.end()) {
379 QuicPacketSequenceNumber sequence_number = it->first; 371 QuicPacketSequenceNumber sequence_number = it->first;
380 if (sequence_number > received_info.largest_observed) { 372 if (sequence_number > received_info.largest_observed) {
(...skipping 16 matching lines...) Expand all
397 389
398 void QuicSentPacketManager::DiscardFecPacket( 390 void QuicSentPacketManager::DiscardFecPacket(
399 QuicPacketSequenceNumber sequence_number) { 391 QuicPacketSequenceNumber sequence_number) {
400 DCHECK(ContainsKey(unacked_fec_packets_, sequence_number)); 392 DCHECK(ContainsKey(unacked_fec_packets_, sequence_number));
401 unacked_fec_packets_.erase(sequence_number); 393 unacked_fec_packets_.erase(sequence_number);
402 } 394 }
403 395
404 bool QuicSentPacketManager::IsRetransmission( 396 bool QuicSentPacketManager::IsRetransmission(
405 QuicPacketSequenceNumber sequence_number) const { 397 QuicPacketSequenceNumber sequence_number) const {
406 DCHECK(HasRetransmittableFrames(sequence_number)); 398 DCHECK(HasRetransmittableFrames(sequence_number));
407 RetransmissionMap::const_iterator it = 399 return HasRetransmittableFrames(sequence_number) &&
408 retransmission_map_.find(sequence_number); 400 ContainsKey(previous_transmissions_map_, sequence_number);
409 return it != retransmission_map_.end() &&
410 it->second.number_retransmissions > 0;
411 }
412
413 size_t QuicSentPacketManager::GetRetransmissionCount(
414 QuicPacketSequenceNumber sequence_number) const {
415 DCHECK(HasRetransmittableFrames(sequence_number));
416 DCHECK(ContainsKey(retransmission_map_, sequence_number));
417 RetransmissionMap::const_iterator it =
418 retransmission_map_.find(sequence_number);
419 return it->second.number_retransmissions;
420 } 401 }
421 402
422 bool QuicSentPacketManager::IsUnacked( 403 bool QuicSentPacketManager::IsUnacked(
423 QuicPacketSequenceNumber sequence_number) const { 404 QuicPacketSequenceNumber sequence_number) const {
424 return ContainsKey(unacked_packets_, sequence_number); 405 return ContainsKey(unacked_packets_, sequence_number);
425 } 406 }
426 407
427 bool QuicSentPacketManager::IsFecUnacked( 408 bool QuicSentPacketManager::IsFecUnacked(
428 QuicPacketSequenceNumber sequence_number) const { 409 QuicPacketSequenceNumber sequence_number) const {
429 return ContainsKey(unacked_fec_packets_, sequence_number); 410 return ContainsKey(unacked_fec_packets_, sequence_number);
430 } 411 }
431 412
432 const RetransmittableFrames& QuicSentPacketManager::GetRetransmittableFrames( 413 const RetransmittableFrames& QuicSentPacketManager::GetRetransmittableFrames(
433 QuicPacketSequenceNumber sequence_number) const { 414 QuicPacketSequenceNumber sequence_number) const {
434 DCHECK(ContainsKey(unacked_packets_, sequence_number)); 415 DCHECK(ContainsKey(unacked_packets_, sequence_number));
435 DCHECK(ContainsKey(retransmission_map_, sequence_number)); 416 DCHECK(ContainsKey(nack_map_, sequence_number));
436 417
437 return *unacked_packets_.find(sequence_number)->second; 418 return *unacked_packets_.find(sequence_number)->second.retransmittable_frames;
438 } 419 }
439 420
440 QuicSequenceNumberLength QuicSentPacketManager::GetSequenceNumberLength( 421 QuicSequenceNumberLength QuicSentPacketManager::GetSequenceNumberLength(
441 QuicPacketSequenceNumber sequence_number) const { 422 QuicPacketSequenceNumber sequence_number) const {
442 DCHECK(ContainsKey(unacked_packets_, sequence_number)); 423 DCHECK(ContainsKey(unacked_packets_, sequence_number));
443 DCHECK(ContainsKey(retransmission_map_, sequence_number));
444 424
445 return retransmission_map_.find( 425 return unacked_packets_.find(sequence_number)->second.sequence_number_length;
446 sequence_number)->second.sequence_number_length;
447 } 426 }
448 427
449 QuicTime QuicSentPacketManager::GetFecSentTime( 428 QuicTime QuicSentPacketManager::GetFecSentTime(
450 QuicPacketSequenceNumber sequence_number) const { 429 QuicPacketSequenceNumber sequence_number) const {
451 DCHECK(ContainsKey(unacked_fec_packets_, sequence_number)); 430 DCHECK(ContainsKey(unacked_fec_packets_, sequence_number));
452 431
453 return unacked_fec_packets_.find(sequence_number)->second; 432 return unacked_fec_packets_.find(sequence_number)->second;
454 } 433 }
455 434
456 bool QuicSentPacketManager::HasUnackedPackets() const { 435 bool QuicSentPacketManager::HasUnackedPackets() const {
457 return !unacked_packets_.empty(); 436 return !unacked_packets_.empty();
458 } 437 }
459 438
460 size_t QuicSentPacketManager::GetNumUnackedPackets() const { 439 size_t QuicSentPacketManager::GetNumRetransmittablePackets() const {
461 return unacked_packets_.size(); 440 size_t num_unacked_packets = 0;
441 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin();
442 it != unacked_packets_.end(); ++it) {
443 QuicPacketSequenceNumber sequence_number = it->first;
444 if (HasRetransmittableFrames(sequence_number)) {
445 ++num_unacked_packets;
446 }
447 }
448 return num_unacked_packets;
462 } 449 }
463 450
464 bool QuicSentPacketManager::HasUnackedFecPackets() const { 451 bool QuicSentPacketManager::HasUnackedFecPackets() const {
465 return !unacked_fec_packets_.empty(); 452 return !unacked_fec_packets_.empty();
466 } 453 }
467 454
468 QuicPacketSequenceNumber 455 QuicPacketSequenceNumber
469 QuicSentPacketManager::GetLeastUnackedSentPacket() const { 456 QuicSentPacketManager::GetLeastUnackedSentPacket() const {
470 if (unacked_packets_.empty()) { 457 if (unacked_packets_.empty()) {
471 // If there are no unacked packets, set the least unacked packet to 458 // If there are no unacked packets, set the least unacked packet to
(...skipping 18 matching lines...) Expand all
490 SequenceNumberSet QuicSentPacketManager::GetUnackedPackets() const { 477 SequenceNumberSet QuicSentPacketManager::GetUnackedPackets() const {
491 SequenceNumberSet unacked_packets; 478 SequenceNumberSet unacked_packets;
492 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin(); 479 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin();
493 it != unacked_packets_.end(); ++it) { 480 it != unacked_packets_.end(); ++it) {
494 unacked_packets.insert(it->first); 481 unacked_packets.insert(it->first);
495 } 482 }
496 return unacked_packets; 483 return unacked_packets;
497 } 484 }
498 485
499 } // namespace net 486 } // 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