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

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

Issue 968513002: Land Recent QUIC Changes until 2/21/2015. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removed const from members of TransmissionInfo struct. Created 5 years, 9 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
« no previous file with comments | « net/quic/quic_unacked_packet_map.h ('k') | net/quic/quic_unacked_packet_map_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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_unacked_packet_map.h" 5 #include "net/quic/quic_unacked_packet_map.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_connection_stats.h" 9 #include "net/quic/quic_connection_stats.h"
10 #include "net/quic/quic_utils_chromium.h" 10 #include "net/quic/quic_utils_chromium.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 bool set_in_flight) { 43 bool set_in_flight) {
44 QuicPacketSequenceNumber sequence_number = packet.sequence_number; 44 QuicPacketSequenceNumber sequence_number = packet.sequence_number;
45 LOG_IF(DFATAL, largest_sent_packet_ > sequence_number); 45 LOG_IF(DFATAL, largest_sent_packet_ > sequence_number);
46 DCHECK_GE(sequence_number, least_unacked_ + unacked_packets_.size()); 46 DCHECK_GE(sequence_number, least_unacked_ + unacked_packets_.size());
47 while (least_unacked_ + unacked_packets_.size() < sequence_number) { 47 while (least_unacked_ + unacked_packets_.size() < sequence_number) {
48 unacked_packets_.push_back(TransmissionInfo()); 48 unacked_packets_.push_back(TransmissionInfo());
49 unacked_packets_.back().is_unackable = true; 49 unacked_packets_.back().is_unackable = true;
50 } 50 }
51 51
52 TransmissionInfo info(packet.retransmittable_frames, 52 TransmissionInfo info(packet.retransmittable_frames,
53 packet.sequence_number_length, 53 packet.sequence_number_length, transmission_type,
54 transmission_type, 54 sent_time, bytes_sent, packet.is_fec_packet);
55 sent_time);
56 info.is_fec_packet = packet.is_fec_packet;
57
58 if (old_sequence_number == 0) { 55 if (old_sequence_number == 0) {
59 if (packet.retransmittable_frames != nullptr && 56 if (packet.retransmittable_frames != nullptr &&
60 packet.retransmittable_frames->HasCryptoHandshake() == IS_HANDSHAKE) { 57 packet.retransmittable_frames->HasCryptoHandshake() == IS_HANDSHAKE) {
61 ++pending_crypto_packet_count_; 58 ++pending_crypto_packet_count_;
62 } 59 }
63 } else { 60 } else {
64 TransferRetransmissionInfo( 61 TransferRetransmissionInfo(
65 old_sequence_number, sequence_number, transmission_type, &info); 62 old_sequence_number, sequence_number, transmission_type, &info);
66 } 63 }
67 64
68 largest_sent_packet_ = sequence_number; 65 largest_sent_packet_ = sequence_number;
69 if (set_in_flight) { 66 if (set_in_flight) {
70 bytes_in_flight_ += bytes_sent; 67 bytes_in_flight_ += bytes_sent;
71 info.bytes_sent = bytes_sent;
72 info.in_flight = true; 68 info.in_flight = true;
73 } 69 }
74 unacked_packets_.push_back(info); 70 unacked_packets_.push_back(info);
75 } 71 }
76 72
77 void QuicUnackedPacketMap::RemoveObsoletePackets() { 73 void QuicUnackedPacketMap::RemoveObsoletePackets() {
78 while (!unacked_packets_.empty()) { 74 while (!unacked_packets_.empty()) {
79 if (!IsPacketRemovable(least_unacked_, unacked_packets_.front())) { 75 if (!IsPacketRemovable(least_unacked_, unacked_packets_.front())) {
80 break; 76 break;
81 } 77 }
82 unacked_packets_.pop_front(); 78 unacked_packets_.pop_front();
83 ++least_unacked_; 79 ++least_unacked_;
84 } 80 }
85 } 81 }
86 82
87 void QuicUnackedPacketMap::TransferRetransmissionInfo( 83 void QuicUnackedPacketMap::TransferRetransmissionInfo(
88 QuicPacketSequenceNumber old_sequence_number, 84 QuicPacketSequenceNumber old_sequence_number,
89 QuicPacketSequenceNumber new_sequence_number, 85 QuicPacketSequenceNumber new_sequence_number,
90 TransmissionType transmission_type, 86 TransmissionType transmission_type,
91 TransmissionInfo* info) { 87 TransmissionInfo* info) {
92 DCHECK_GE(old_sequence_number, least_unacked_); 88 DCHECK_GE(old_sequence_number, least_unacked_);
93 DCHECK_LT(old_sequence_number, least_unacked_ + unacked_packets_.size()); 89 DCHECK_LT(old_sequence_number, least_unacked_ + unacked_packets_.size());
94 DCHECK_GE(new_sequence_number, least_unacked_ + unacked_packets_.size()); 90 DCHECK_GE(new_sequence_number, least_unacked_ + unacked_packets_.size());
95 DCHECK_NE(NOT_RETRANSMISSION, transmission_type); 91 DCHECK_NE(NOT_RETRANSMISSION, transmission_type);
96 92
97 // TODO(ianswett): Discard and lose the packet lazily instead of immediately.
98 TransmissionInfo* transmission_info = 93 TransmissionInfo* transmission_info =
99 &unacked_packets_.at(old_sequence_number - least_unacked_); 94 &unacked_packets_.at(old_sequence_number - least_unacked_);
100 RetransmittableFrames* frames = transmission_info->retransmittable_frames; 95 RetransmittableFrames* frames = transmission_info->retransmittable_frames;
101 transmission_info->retransmittable_frames = nullptr; 96 transmission_info->retransmittable_frames = nullptr;
102 LOG_IF(DFATAL, frames == nullptr) 97 LOG_IF(DFATAL, frames == nullptr)
103 << "Attempt to retransmit packet with no " 98 << "Attempt to retransmit packet with no "
104 << "retransmittable frames: " << old_sequence_number; 99 << "retransmittable frames: " << old_sequence_number;
105 100
106 // Only keep one transmission older than largest observed, because only the 101 // Only keep one transmission older than largest observed, because only the
107 // most recent is expected to possibly be a spurious retransmission. 102 // most recent is expected to possibly be a spurious retransmission.
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 DCHECK_GE(sequence_number, least_unacked_); 189 DCHECK_GE(sequence_number, least_unacked_);
195 DCHECK_LT(sequence_number, least_unacked_ + unacked_packets_.size()); 190 DCHECK_LT(sequence_number, least_unacked_ + unacked_packets_.size());
196 TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_]; 191 TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_];
197 SequenceNumberList* all_transmissions = info->all_transmissions; 192 SequenceNumberList* all_transmissions = info->all_transmissions;
198 if (all_transmissions == nullptr) { 193 if (all_transmissions == nullptr) {
199 MaybeRemoveRetransmittableFrames(info); 194 MaybeRemoveRetransmittableFrames(info);
200 return; 195 return;
201 } 196 }
202 // TODO(ianswett): Consider adding a check to ensure there are retransmittable 197 // TODO(ianswett): Consider adding a check to ensure there are retransmittable
203 // frames associated with this packet. 198 // frames associated with this packet.
204 for (SequenceNumberList::const_iterator it = all_transmissions->begin(); 199 for (QuicPacketSequenceNumber sequence_number : *all_transmissions) {
205 it != all_transmissions->end(); ++it) {
206 TransmissionInfo* transmission_info = 200 TransmissionInfo* transmission_info =
207 &unacked_packets_[*it - least_unacked_]; 201 &unacked_packets_[sequence_number - least_unacked_];
208 MaybeRemoveRetransmittableFrames(transmission_info); 202 MaybeRemoveRetransmittableFrames(transmission_info);
209 transmission_info->all_transmissions = nullptr; 203 transmission_info->all_transmissions = nullptr;
210 } 204 }
211 delete all_transmissions; 205 delete all_transmissions;
212 } 206 }
213 207
214 void QuicUnackedPacketMap::RemoveAckability(TransmissionInfo* info) { 208 void QuicUnackedPacketMap::RemoveAckability(TransmissionInfo* info) {
215 DCHECK(info->retransmittable_frames == nullptr); 209 DCHECK(info->retransmittable_frames == nullptr);
216 info->is_unackable = true; 210 info->is_unackable = true;
217 SequenceNumberList* all_transmissions = info->all_transmissions; 211 SequenceNumberList* all_transmissions = info->all_transmissions;
218 if (all_transmissions == nullptr) { 212 if (all_transmissions == nullptr) {
219 return; 213 return;
220 } 214 }
221 for (SequenceNumberList::const_iterator it = all_transmissions->begin(); 215 for (QuicPacketSequenceNumber sequence_number : *all_transmissions) {
222 it != all_transmissions->end(); ++it) {
223 TransmissionInfo* transmission_info = 216 TransmissionInfo* transmission_info =
224 &unacked_packets_[*it - least_unacked_]; 217 &unacked_packets_[sequence_number - least_unacked_];
225 transmission_info->all_transmissions = nullptr; 218 transmission_info->all_transmissions = nullptr;
226 transmission_info->is_unackable = true; 219 transmission_info->is_unackable = true;
227 } 220 }
228 delete all_transmissions; 221 delete all_transmissions;
229 } 222 }
230 223
231 void QuicUnackedPacketMap::MaybeRemoveRetransmittableFrames( 224 void QuicUnackedPacketMap::MaybeRemoveRetransmittableFrames(
232 TransmissionInfo* transmission_info) { 225 TransmissionInfo* transmission_info) {
233 if (transmission_info->retransmittable_frames != nullptr) { 226 if (transmission_info->retransmittable_frames != nullptr) {
234 if (transmission_info->retransmittable_frames->HasCryptoHandshake() 227 if (transmission_info->retransmittable_frames->HasCryptoHandshake()
(...skipping 13 matching lines...) Expand all
248 241
249 bool QuicUnackedPacketMap::IsPacketUsefulForMeasuringRtt( 242 bool QuicUnackedPacketMap::IsPacketUsefulForMeasuringRtt(
250 QuicPacketSequenceNumber sequence_number, 243 QuicPacketSequenceNumber sequence_number,
251 const TransmissionInfo& info) const { 244 const TransmissionInfo& info) const {
252 // Packet can be used for RTT measurement if it may yet be acked as the 245 // Packet can be used for RTT measurement if it may yet be acked as the
253 // largest observed packet by the receiver. 246 // largest observed packet by the receiver.
254 return !info.is_unackable && sequence_number > largest_observed_; 247 return !info.is_unackable && sequence_number > largest_observed_;
255 } 248 }
256 249
257 bool QuicUnackedPacketMap::IsPacketUsefulForCongestionControl( 250 bool QuicUnackedPacketMap::IsPacketUsefulForCongestionControl(
258 QuicPacketSequenceNumber sequence_number,
259 const TransmissionInfo& info) const { 251 const TransmissionInfo& info) const {
260 // Packet contributes to congestion control if it is considered inflight. 252 // Packet contributes to congestion control if it is considered inflight.
261 return info.in_flight; 253 return info.in_flight;
262 } 254 }
263 255
264 bool QuicUnackedPacketMap::IsPacketUsefulForRetransmittableData( 256 bool QuicUnackedPacketMap::IsPacketUsefulForRetransmittableData(
265 QuicPacketSequenceNumber sequence_number,
266 const TransmissionInfo& info) const { 257 const TransmissionInfo& info) const {
267 // Packet may have retransmittable frames, or the data may have been 258 // Packet may have retransmittable frames, or the data may have been
268 // retransmitted with a new sequence number. 259 // retransmitted with a new sequence number.
269 return info.retransmittable_frames != nullptr || 260 return info.retransmittable_frames != nullptr ||
270 info.all_transmissions != nullptr; 261 info.all_transmissions != nullptr;
271 } 262 }
272 263
273 bool QuicUnackedPacketMap::IsPacketUseless( 264 bool QuicUnackedPacketMap::IsPacketUseless(
274 QuicPacketSequenceNumber sequence_number, 265 QuicPacketSequenceNumber sequence_number,
275 const TransmissionInfo& info) const { 266 const TransmissionInfo& info) const {
276 return !IsPacketUsefulForMeasuringRtt(sequence_number, info) && 267 return !IsPacketUsefulForMeasuringRtt(sequence_number, info) &&
277 !IsPacketUsefulForCongestionControl(sequence_number, info) && 268 !IsPacketUsefulForCongestionControl(info) &&
278 !IsPacketUsefulForRetransmittableData(sequence_number, info); 269 !IsPacketUsefulForRetransmittableData(info);
279 } 270 }
280 271
281 bool QuicUnackedPacketMap::IsPacketRemovable( 272 bool QuicUnackedPacketMap::IsPacketRemovable(
282 QuicPacketSequenceNumber sequence_number, 273 QuicPacketSequenceNumber sequence_number,
283 const TransmissionInfo& info) const { 274 const TransmissionInfo& info) const {
284 return (!IsPacketUsefulForMeasuringRtt(sequence_number, info) || 275 return (!IsPacketUsefulForMeasuringRtt(sequence_number, info) ||
285 unacked_packets_.size() > kMaxTcpCongestionWindow) && 276 unacked_packets_.size() > kMaxTcpCongestionWindow) &&
286 !IsPacketUsefulForCongestionControl(sequence_number, info) && 277 !IsPacketUsefulForCongestionControl(info) &&
287 !IsPacketUsefulForRetransmittableData(sequence_number, info); 278 !IsPacketUsefulForRetransmittableData(info);
288 } 279 }
289 280
290 bool QuicUnackedPacketMap::IsUnacked( 281 bool QuicUnackedPacketMap::IsUnacked(
291 QuicPacketSequenceNumber sequence_number) const { 282 QuicPacketSequenceNumber sequence_number) const {
292 if (sequence_number < least_unacked_ || 283 if (sequence_number < least_unacked_ ||
293 sequence_number >= least_unacked_ + unacked_packets_.size()) { 284 sequence_number >= least_unacked_ + unacked_packets_.size()) {
294 return false; 285 return false;
295 } 286 }
296 return !IsPacketUseless(sequence_number, 287 return !IsPacketUseless(sequence_number,
297 unacked_packets_[sequence_number - least_unacked_]); 288 unacked_packets_[sequence_number - least_unacked_]);
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 bool QuicUnackedPacketMap::HasUnackedRetransmittableFrames() const { 372 bool QuicUnackedPacketMap::HasUnackedRetransmittableFrames() const {
382 for (UnackedPacketMap::const_reverse_iterator it = 373 for (UnackedPacketMap::const_reverse_iterator it =
383 unacked_packets_.rbegin(); it != unacked_packets_.rend(); ++it) { 374 unacked_packets_.rbegin(); it != unacked_packets_.rend(); ++it) {
384 if (it->in_flight && it->retransmittable_frames) { 375 if (it->in_flight && it->retransmittable_frames) {
385 return true; 376 return true;
386 } 377 }
387 } 378 }
388 return false; 379 return false;
389 } 380 }
390 381
391 QuicPacketSequenceNumber 382 QuicPacketSequenceNumber QuicUnackedPacketMap::GetLeastUnacked() const {
392 QuicUnackedPacketMap::GetLeastUnacked() const {
393 return least_unacked_; 383 return least_unacked_;
394 } 384 }
395 385
396 void QuicUnackedPacketMap::RestoreInFlight(
397 QuicPacketSequenceNumber sequence_number) {
398 DCHECK_GE(sequence_number, least_unacked_);
399 DCHECK_LT(sequence_number, least_unacked_ + unacked_packets_.size());
400 TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_];
401 DCHECK(!info->in_flight);
402 DCHECK_NE(0u, info->bytes_sent);
403 DCHECK(info->sent_time.IsInitialized());
404
405 bytes_in_flight_ += info->bytes_sent;
406 info->in_flight = true;
407 }
408
409 } // namespace net 386 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_unacked_packet_map.h ('k') | net/quic/quic_unacked_packet_map_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698