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

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

Issue 242593002: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Build fix. Use uint32 instead of int Created 6 years, 8 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_session.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 <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 if (largest_observed_acked) { 133 if (largest_observed_acked) {
134 // Reset all retransmit counters any time a new packet is acked. 134 // Reset all retransmit counters any time a new packet is acked.
135 consecutive_rto_count_ = 0; 135 consecutive_rto_count_ = 0;
136 consecutive_tlp_count_ = 0; 136 consecutive_tlp_count_ = 0;
137 consecutive_crypto_retransmission_count_ = 0; 137 consecutive_crypto_retransmission_count_ = 0;
138 } 138 }
139 } 139 }
140 140
141 void QuicSentPacketManager::DiscardUnackedPacket( 141 void QuicSentPacketManager::DiscardUnackedPacket(
142 QuicPacketSequenceNumber sequence_number) { 142 QuicPacketSequenceNumber sequence_number) {
143 MarkPacketHandled(sequence_number, NOT_RECEIVED_BY_PEER); 143 MarkPacketHandled(sequence_number, QuicTime::Delta::Zero(),
144 NOT_RECEIVED_BY_PEER);
144 } 145 }
145 146
146 void QuicSentPacketManager::HandleAckForSentPackets( 147 void QuicSentPacketManager::HandleAckForSentPackets(
147 const ReceivedPacketInfo& received_info) { 148 const ReceivedPacketInfo& received_info) {
148 // Go through the packets we have not received an ack for and see if this 149 // Go through the packets we have not received an ack for and see if this
149 // incoming_ack shows they've been seen by the peer. 150 // incoming_ack shows they've been seen by the peer.
150 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); 151 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
151 while (it != unacked_packets_.end()) { 152 while (it != unacked_packets_.end()) {
152 QuicPacketSequenceNumber sequence_number = it->first; 153 QuicPacketSequenceNumber sequence_number = it->first;
153 if (sequence_number > received_info.largest_observed) { 154 if (sequence_number > received_info.largest_observed) {
154 // These packets are still in flight. 155 // These packets are still in flight.
155 break; 156 break;
156 } 157 }
157 158
159 QuicTime::Delta delta_largest_observed =
160 received_info.delta_time_largest_observed;
158 if (IsAwaitingPacket(received_info, sequence_number)) { 161 if (IsAwaitingPacket(received_info, sequence_number)) {
159 // Remove any packets not being tracked by the send algorithm, allowing 162 // Remove any packets not being tracked by the send algorithm, allowing
160 // the high water mark to be raised if necessary. 163 // the high water mark to be raised if necessary.
161 if (QuicUnackedPacketMap::IsSentAndNotPending(it->second)) { 164 if (QuicUnackedPacketMap::IsSentAndNotPending(it->second)) {
162 it = MarkPacketHandled(sequence_number, NOT_RECEIVED_BY_PEER); 165 it = MarkPacketHandled(sequence_number, delta_largest_observed,
166 NOT_RECEIVED_BY_PEER);
163 } else { 167 } else {
164 ++it; 168 ++it;
165 } 169 }
166 continue; 170 continue;
167 } 171 }
168 172
169 // Packet was acked, so remove it from our unacked packet list. 173 // Packet was acked, so remove it from our unacked packet list.
170 DVLOG(1) << ENDPOINT <<"Got an ack for packet " << sequence_number; 174 DVLOG(1) << ENDPOINT <<"Got an ack for packet " << sequence_number;
171 // If data is associated with the most recent transmission of this 175 // If data is associated with the most recent transmission of this
172 // packet, then inform the caller. 176 // packet, then inform the caller.
173 it = MarkPacketHandled(sequence_number, RECEIVED_BY_PEER); 177 it = MarkPacketHandled(sequence_number, delta_largest_observed,
178 RECEIVED_BY_PEER);
174 } 179 }
175 180
176 // Discard any retransmittable frames associated with revived packets. 181 // Discard any retransmittable frames associated with revived packets.
177 for (SequenceNumberSet::const_iterator revived_it = 182 for (SequenceNumberSet::const_iterator revived_it =
178 received_info.revived_packets.begin(); 183 received_info.revived_packets.begin();
179 revived_it != received_info.revived_packets.end(); ++revived_it) { 184 revived_it != received_info.revived_packets.end(); ++revived_it) {
180 if (unacked_packets_.IsUnacked(*revived_it)) { 185 if (unacked_packets_.IsUnacked(*revived_it)) {
181 if (!unacked_packets_.IsPending(*revived_it)) { 186 if (!unacked_packets_.IsPending(*revived_it)) {
182 unacked_packets_.RemovePacket(*revived_it); 187 unacked_packets_.RemovePacket(*revived_it);
183 } else { 188 } else {
(...skipping 19 matching lines...) Expand all
203 void QuicSentPacketManager::RetransmitUnackedPackets( 208 void QuicSentPacketManager::RetransmitUnackedPackets(
204 RetransmissionType retransmission_type) { 209 RetransmissionType retransmission_type) {
205 QuicUnackedPacketMap::const_iterator unacked_it = unacked_packets_.begin(); 210 QuicUnackedPacketMap::const_iterator unacked_it = unacked_packets_.begin();
206 while (unacked_it != unacked_packets_.end()) { 211 while (unacked_it != unacked_packets_.end()) {
207 const RetransmittableFrames* frames = 212 const RetransmittableFrames* frames =
208 unacked_it->second.retransmittable_frames; 213 unacked_it->second.retransmittable_frames;
209 // Only mark it as handled if it can't be retransmitted and there are no 214 // Only mark it as handled if it can't be retransmitted and there are no
210 // pending retransmissions which would be cleared. 215 // pending retransmissions which would be cleared.
211 if (frames == NULL && unacked_it->second.all_transmissions->size() == 1 && 216 if (frames == NULL && unacked_it->second.all_transmissions->size() == 1 &&
212 retransmission_type == ALL_PACKETS) { 217 retransmission_type == ALL_PACKETS) {
213 unacked_it = MarkPacketHandled(unacked_it->first, NOT_RECEIVED_BY_PEER); 218 unacked_it = MarkPacketHandled(unacked_it->first, QuicTime::Delta::Zero(),
219 NOT_RECEIVED_BY_PEER);
214 continue; 220 continue;
215 } 221 }
216 // If it had no other transmissions, we handle it above. If it has 222 // If it had no other transmissions, we handle it above. If it has
217 // other transmissions, one of them must have retransmittable frames, 223 // other transmissions, one of them must have retransmittable frames,
218 // so that gets resolved the same way as other retransmissions. 224 // so that gets resolved the same way as other retransmissions.
219 // TODO(ianswett): Consider adding a new retransmission type which removes 225 // TODO(ianswett): Consider adding a new retransmission type which removes
220 // all these old packets from unacked and retransmits them as new sequence 226 // all these old packets from unacked and retransmits them as new sequence
221 // numbers with no connection to the previous ones. 227 // numbers with no connection to the previous ones.
222 if (frames != NULL && (retransmission_type == ALL_PACKETS || 228 if (frames != NULL && (retransmission_type == ALL_PACKETS ||
223 frames->encryption_level() == ENCRYPTION_INITIAL)) { 229 frames->encryption_level() == ENCRYPTION_INITIAL)) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 const QuicUnackedPacketMap::TransmissionInfo& transmission_info = 277 const QuicUnackedPacketMap::TransmissionInfo& transmission_info =
272 unacked_packets_.GetTransmissionInfo(sequence_number); 278 unacked_packets_.GetTransmissionInfo(sequence_number);
273 DCHECK(transmission_info.retransmittable_frames); 279 DCHECK(transmission_info.retransmittable_frames);
274 280
275 return PendingRetransmission(sequence_number, 281 return PendingRetransmission(sequence_number,
276 transmission_type, 282 transmission_type,
277 *transmission_info.retransmittable_frames, 283 *transmission_info.retransmittable_frames,
278 transmission_info.sequence_number_length); 284 transmission_info.sequence_number_length);
279 } 285 }
280 286
281 QuicUnackedPacketMap::const_iterator 287 QuicUnackedPacketMap::const_iterator QuicSentPacketManager::MarkPacketHandled(
282 QuicSentPacketManager::MarkPacketHandled(
283 QuicPacketSequenceNumber sequence_number, 288 QuicPacketSequenceNumber sequence_number,
284 ReceivedByPeer received_by_peer) { 289 QuicTime::Delta delta_largest_observed, ReceivedByPeer received_by_peer) {
285 if (!unacked_packets_.IsUnacked(sequence_number)) { 290 if (!unacked_packets_.IsUnacked(sequence_number)) {
286 LOG(DFATAL) << "Packet is not unacked: " << sequence_number; 291 LOG(DFATAL) << "Packet is not unacked: " << sequence_number;
287 return unacked_packets_.end(); 292 return unacked_packets_.end();
288 } 293 }
289 const QuicUnackedPacketMap::TransmissionInfo& transmission_info = 294 const QuicUnackedPacketMap::TransmissionInfo& transmission_info =
290 unacked_packets_.GetTransmissionInfo(sequence_number); 295 unacked_packets_.GetTransmissionInfo(sequence_number);
291 // If this packet is pending, remove it and inform the send algorithm. 296 // If this packet is pending, remove it and inform the send algorithm.
292 if (transmission_info.pending) { 297 if (transmission_info.pending) {
293 if (received_by_peer == RECEIVED_BY_PEER) { 298 if (received_by_peer == RECEIVED_BY_PEER) {
294 send_algorithm_->OnPacketAcked(sequence_number, 299 send_algorithm_->OnPacketAcked(sequence_number,
295 transmission_info.bytes_sent); 300 transmission_info.bytes_sent);
296 } else { 301 } else {
297 // It's been abandoned. 302 // It's been abandoned.
298 send_algorithm_->OnPacketAbandoned(sequence_number, 303 send_algorithm_->OnPacketAbandoned(sequence_number,
299 transmission_info.bytes_sent); 304 transmission_info.bytes_sent);
300 } 305 }
301 unacked_packets_.SetNotPending(sequence_number); 306 unacked_packets_.SetNotPending(sequence_number);
302 } 307 }
303 308
304 SequenceNumberSet all_transmissions = *transmission_info.all_transmissions; 309 SequenceNumberSet all_transmissions = *transmission_info.all_transmissions;
305 SequenceNumberSet::reverse_iterator all_transmissions_it = 310 SequenceNumberSet::reverse_iterator all_transmissions_it =
306 all_transmissions.rbegin(); 311 all_transmissions.rbegin();
307 QuicPacketSequenceNumber newest_transmission = *all_transmissions_it; 312 QuicPacketSequenceNumber newest_transmission = *all_transmissions_it;
308 if (newest_transmission != sequence_number) { 313 if (newest_transmission != sequence_number) {
309 ++stats_->packets_spuriously_retransmitted; 314 ++stats_->packets_spuriously_retransmitted;
310 } 315 }
311 316
312 // The AckNotifierManager needs to be notified about the most recent 317 // The AckNotifierManager needs to be notified about the most recent
313 // transmission, since that's the one only one it tracks. 318 // transmission, since that's the one only one it tracks.
314 ack_notifier_manager_.OnPacketAcked(newest_transmission); 319 ack_notifier_manager_.OnPacketAcked(newest_transmission,
320 delta_largest_observed);
315 321
316 bool has_crypto_handshake = HasCryptoHandshake( 322 bool has_crypto_handshake = HasCryptoHandshake(
317 unacked_packets_.GetTransmissionInfo(newest_transmission)); 323 unacked_packets_.GetTransmissionInfo(newest_transmission));
318 while (all_transmissions_it != all_transmissions.rend()) { 324 while (all_transmissions_it != all_transmissions.rend()) {
319 QuicPacketSequenceNumber previous_transmission = *all_transmissions_it; 325 QuicPacketSequenceNumber previous_transmission = *all_transmissions_it;
320 const QuicUnackedPacketMap::TransmissionInfo& transmission_info = 326 const QuicUnackedPacketMap::TransmissionInfo& transmission_info =
321 unacked_packets_.GetTransmissionInfo(previous_transmission); 327 unacked_packets_.GetTransmissionInfo(previous_transmission);
322 if (ContainsKey(pending_retransmissions_, previous_transmission)) { 328 if (ContainsKey(pending_retransmissions_, previous_transmission)) {
323 // Don't bother retransmitting this packet, if it has been 329 // Don't bother retransmitting this packet, if it has been
324 // marked for retransmission. 330 // marked for retransmission.
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 return; 740 return;
735 } 741 }
736 742
737 using_pacing_ = true; 743 using_pacing_ = true;
738 send_algorithm_.reset( 744 send_algorithm_.reset(
739 new PacingSender(send_algorithm_.release(), 745 new PacingSender(send_algorithm_.release(),
740 QuicTime::Delta::FromMicroseconds(1))); 746 QuicTime::Delta::FromMicroseconds(1)));
741 } 747 }
742 748
743 } // namespace net 749 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_sent_packet_manager.h ('k') | net/quic/quic_session.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698