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

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

Issue 420313005: Land Recent QUIC Changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@Final_0723
Patch Set: change QUIC packet size to 1350 Created 6 years, 4 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
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_received_packet_manager.h" 5 #include "net/quic/quic_received_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/base/linked_hash_map.h" 9 #include "net/base/linked_hash_map.h"
10 #include "net/quic/quic_connection_stats.h" 10 #include "net/quic/quic_connection_stats.h"
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 128
129 QuicReceivedPacketManager::QuicReceivedPacketManager( 129 QuicReceivedPacketManager::QuicReceivedPacketManager(
130 CongestionFeedbackType congestion_type, 130 CongestionFeedbackType congestion_type,
131 QuicConnectionStats* stats) 131 QuicConnectionStats* stats)
132 : peer_largest_observed_packet_(0), 132 : peer_largest_observed_packet_(0),
133 least_packet_awaited_by_peer_(1), 133 least_packet_awaited_by_peer_(1),
134 peer_least_packet_awaiting_ack_(0), 134 peer_least_packet_awaiting_ack_(0),
135 time_largest_observed_(QuicTime::Zero()), 135 time_largest_observed_(QuicTime::Zero()),
136 receive_algorithm_(ReceiveAlgorithmInterface::Create(congestion_type)), 136 receive_algorithm_(ReceiveAlgorithmInterface::Create(congestion_type)),
137 stats_(stats) { 137 stats_(stats) {
138 received_info_.largest_observed = 0; 138 ack_frame_.largest_observed = 0;
139 received_info_.entropy_hash = 0; 139 ack_frame_.entropy_hash = 0;
140 } 140 }
141 141
142 QuicReceivedPacketManager::~QuicReceivedPacketManager() {} 142 QuicReceivedPacketManager::~QuicReceivedPacketManager() {}
143 143
144 void QuicReceivedPacketManager::RecordPacketReceived( 144 void QuicReceivedPacketManager::RecordPacketReceived(
145 QuicByteCount bytes, 145 QuicByteCount bytes,
146 const QuicPacketHeader& header, 146 const QuicPacketHeader& header,
147 QuicTime receipt_time) { 147 QuicTime receipt_time) {
148 QuicPacketSequenceNumber sequence_number = header.packet_sequence_number; 148 QuicPacketSequenceNumber sequence_number = header.packet_sequence_number;
149 DCHECK(IsAwaitingPacket(sequence_number)); 149 DCHECK(IsAwaitingPacket(sequence_number));
150 150
151 InsertMissingPacketsBetween( 151 InsertMissingPacketsBetween(
152 &received_info_, 152 &ack_frame_,
153 max(received_info_.largest_observed + 1, peer_least_packet_awaiting_ack_), 153 max(ack_frame_.largest_observed + 1, peer_least_packet_awaiting_ack_),
154 sequence_number); 154 sequence_number);
155 155
156 if (received_info_.largest_observed > sequence_number) { 156 if (ack_frame_.largest_observed > sequence_number) {
157 // We've gotten one of the out of order packets - remove it from our 157 // We've gotten one of the out of order packets - remove it from our
158 // "missing packets" list. 158 // "missing packets" list.
159 DVLOG(1) << "Removing " << sequence_number << " from missing list"; 159 DVLOG(1) << "Removing " << sequence_number << " from missing list";
160 received_info_.missing_packets.erase(sequence_number); 160 ack_frame_.missing_packets.erase(sequence_number);
161 161
162 // Record how out of order stats. 162 // Record how out of order stats.
163 ++stats_->packets_reordered; 163 ++stats_->packets_reordered;
164 uint32 sequence_gap = received_info_.largest_observed - sequence_number; 164 uint32 sequence_gap = ack_frame_.largest_observed - sequence_number;
165 stats_->max_sequence_reordering = 165 stats_->max_sequence_reordering =
166 max(stats_->max_sequence_reordering, sequence_gap); 166 max(stats_->max_sequence_reordering, sequence_gap);
167 uint32 reordering_time_us = 167 uint32 reordering_time_us =
168 receipt_time.Subtract(time_largest_observed_).ToMicroseconds(); 168 receipt_time.Subtract(time_largest_observed_).ToMicroseconds();
169 stats_->max_time_reordering_us = max(stats_->max_time_reordering_us, 169 stats_->max_time_reordering_us = max(stats_->max_time_reordering_us,
170 reordering_time_us); 170 reordering_time_us);
171 } 171 }
172 if (sequence_number > received_info_.largest_observed) { 172 if (sequence_number > ack_frame_.largest_observed) {
173 received_info_.largest_observed = sequence_number; 173 ack_frame_.largest_observed = sequence_number;
174 time_largest_observed_ = receipt_time; 174 time_largest_observed_ = receipt_time;
175 } 175 }
176 entropy_tracker_.RecordPacketEntropyHash(sequence_number, 176 entropy_tracker_.RecordPacketEntropyHash(sequence_number,
177 header.entropy_hash); 177 header.entropy_hash);
178 178
179 receive_algorithm_->RecordIncomingPacket( 179 receive_algorithm_->RecordIncomingPacket(
180 bytes, sequence_number, receipt_time); 180 bytes, sequence_number, receipt_time);
181 181
182 received_info_.revived_packets.erase(sequence_number); 182 ack_frame_.revived_packets.erase(sequence_number);
183 } 183 }
184 184
185 void QuicReceivedPacketManager::RecordPacketRevived( 185 void QuicReceivedPacketManager::RecordPacketRevived(
186 QuicPacketSequenceNumber sequence_number) { 186 QuicPacketSequenceNumber sequence_number) {
187 LOG_IF(DFATAL, !IsAwaitingPacket(sequence_number)); 187 LOG_IF(DFATAL, !IsAwaitingPacket(sequence_number));
188 received_info_.revived_packets.insert(sequence_number); 188 ack_frame_.revived_packets.insert(sequence_number);
189 } 189 }
190 190
191 bool QuicReceivedPacketManager::IsMissing( 191 bool QuicReceivedPacketManager::IsMissing(
192 QuicPacketSequenceNumber sequence_number) { 192 QuicPacketSequenceNumber sequence_number) {
193 return ContainsKey(received_info_.missing_packets, sequence_number); 193 return ContainsKey(ack_frame_.missing_packets, sequence_number);
194 } 194 }
195 195
196 bool QuicReceivedPacketManager::IsAwaitingPacket( 196 bool QuicReceivedPacketManager::IsAwaitingPacket(
197 QuicPacketSequenceNumber sequence_number) { 197 QuicPacketSequenceNumber sequence_number) {
198 return ::net::IsAwaitingPacket(received_info_, sequence_number); 198 return ::net::IsAwaitingPacket(ack_frame_, sequence_number);
199 } 199 }
200 200
201 void QuicReceivedPacketManager::UpdateReceivedPacketInfo( 201 void QuicReceivedPacketManager::UpdateReceivedPacketInfo(
202 ReceivedPacketInfo* received_info, 202 QuicAckFrame* ack_frame, QuicTime approximate_now) {
203 QuicTime approximate_now) { 203 *ack_frame = ack_frame_;
204 *received_info = received_info_; 204 ack_frame->entropy_hash = EntropyHash(ack_frame_.largest_observed);
205 received_info->entropy_hash = EntropyHash(received_info_.largest_observed);
206 205
207 if (time_largest_observed_ == QuicTime::Zero()) { 206 if (time_largest_observed_ == QuicTime::Zero()) {
208 // We have received no packets. 207 // We have received no packets.
209 received_info->delta_time_largest_observed = QuicTime::Delta::Infinite(); 208 ack_frame->delta_time_largest_observed = QuicTime::Delta::Infinite();
210 return; 209 return;
211 } 210 }
212 211
213 if (approximate_now < time_largest_observed_) { 212 if (approximate_now < time_largest_observed_) {
214 // Approximate now may well be "in the past". 213 // Approximate now may well be "in the past".
215 received_info->delta_time_largest_observed = QuicTime::Delta::Zero(); 214 ack_frame->delta_time_largest_observed = QuicTime::Delta::Zero();
216 return; 215 return;
217 } 216 }
218 217
219 received_info->delta_time_largest_observed = 218 ack_frame->delta_time_largest_observed =
220 approximate_now.Subtract(time_largest_observed_); 219 approximate_now.Subtract(time_largest_observed_);
221 } 220 }
222 221
223 bool QuicReceivedPacketManager::GenerateCongestionFeedback( 222 bool QuicReceivedPacketManager::GenerateCongestionFeedback(
224 QuicCongestionFeedbackFrame* feedback) { 223 QuicCongestionFeedbackFrame* feedback) {
225 return receive_algorithm_->GenerateCongestionFeedback(feedback); 224 return receive_algorithm_->GenerateCongestionFeedback(feedback);
226 } 225 }
227 226
228 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash( 227 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash(
229 QuicPacketSequenceNumber sequence_number) const { 228 QuicPacketSequenceNumber sequence_number) const {
230 return entropy_tracker_.EntropyHash(sequence_number); 229 return entropy_tracker_.EntropyHash(sequence_number);
231 } 230 }
232 231
233 void QuicReceivedPacketManager::UpdatePacketInformationReceivedByPeer( 232 void QuicReceivedPacketManager::UpdatePacketInformationReceivedByPeer(
234 const ReceivedPacketInfo& received_info) { 233 const QuicAckFrame& ack_frame) {
235 // ValidateAck should fail if largest_observed ever shrinks. 234 // ValidateAck should fail if largest_observed ever shrinks.
236 DCHECK_LE(peer_largest_observed_packet_, received_info.largest_observed); 235 DCHECK_LE(peer_largest_observed_packet_, ack_frame.largest_observed);
237 peer_largest_observed_packet_ = received_info.largest_observed; 236 peer_largest_observed_packet_ = ack_frame.largest_observed;
238 237
239 if (received_info.missing_packets.empty()) { 238 if (ack_frame.missing_packets.empty()) {
240 least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1; 239 least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1;
241 } else { 240 } else {
242 least_packet_awaited_by_peer_ = *(received_info.missing_packets.begin()); 241 least_packet_awaited_by_peer_ = *(ack_frame.missing_packets.begin());
243 } 242 }
244 } 243 }
245 244
246 bool QuicReceivedPacketManager::DontWaitForPacketsBefore( 245 bool QuicReceivedPacketManager::DontWaitForPacketsBefore(
247 QuicPacketSequenceNumber least_unacked) { 246 QuicPacketSequenceNumber least_unacked) {
248 received_info_.revived_packets.erase( 247 ack_frame_.revived_packets.erase(
249 received_info_.revived_packets.begin(), 248 ack_frame_.revived_packets.begin(),
250 received_info_.revived_packets.lower_bound(least_unacked)); 249 ack_frame_.revived_packets.lower_bound(least_unacked));
251 size_t missing_packets_count = received_info_.missing_packets.size(); 250 size_t missing_packets_count = ack_frame_.missing_packets.size();
252 received_info_.missing_packets.erase( 251 ack_frame_.missing_packets.erase(
253 received_info_.missing_packets.begin(), 252 ack_frame_.missing_packets.begin(),
254 received_info_.missing_packets.lower_bound(least_unacked)); 253 ack_frame_.missing_packets.lower_bound(least_unacked));
255 return missing_packets_count != received_info_.missing_packets.size(); 254 return missing_packets_count != ack_frame_.missing_packets.size();
256 } 255 }
257 256
258 void QuicReceivedPacketManager::UpdatePacketInformationSentByPeer( 257 void QuicReceivedPacketManager::UpdatePacketInformationSentByPeer(
259 const QuicStopWaitingFrame& stop_waiting) { 258 const QuicStopWaitingFrame& stop_waiting) {
260 // ValidateAck() should fail if peer_least_packet_awaiting_ack_ shrinks. 259 // ValidateAck() should fail if peer_least_packet_awaiting_ack_ shrinks.
261 DCHECK_LE(peer_least_packet_awaiting_ack_, stop_waiting.least_unacked); 260 DCHECK_LE(peer_least_packet_awaiting_ack_, stop_waiting.least_unacked);
262 if (stop_waiting.least_unacked > peer_least_packet_awaiting_ack_) { 261 if (stop_waiting.least_unacked > peer_least_packet_awaiting_ack_) {
263 bool missed_packets = DontWaitForPacketsBefore(stop_waiting.least_unacked); 262 bool missed_packets = DontWaitForPacketsBefore(stop_waiting.least_unacked);
264 if (missed_packets) { 263 if (missed_packets) {
265 DVLOG(1) << "Updating entropy hashed since we missed packets"; 264 DVLOG(1) << "Updating entropy hashed since we missed packets";
266 // There were some missing packets that we won't ever get now. Recalculate 265 // There were some missing packets that we won't ever get now. Recalculate
267 // the received entropy hash. 266 // the received entropy hash.
268 entropy_tracker_.SetCumulativeEntropyUpTo(stop_waiting.least_unacked, 267 entropy_tracker_.SetCumulativeEntropyUpTo(stop_waiting.least_unacked,
269 stop_waiting.entropy_hash); 268 stop_waiting.entropy_hash);
270 } 269 }
271 peer_least_packet_awaiting_ack_ = stop_waiting.least_unacked; 270 peer_least_packet_awaiting_ack_ = stop_waiting.least_unacked;
272 } 271 }
273 DCHECK(received_info_.missing_packets.empty() || 272 DCHECK(ack_frame_.missing_packets.empty() ||
274 *received_info_.missing_packets.begin() >= 273 *ack_frame_.missing_packets.begin() >=
275 peer_least_packet_awaiting_ack_); 274 peer_least_packet_awaiting_ack_);
276 } 275 }
277 276
278 bool QuicReceivedPacketManager::HasMissingPackets() { 277 bool QuicReceivedPacketManager::HasMissingPackets() {
279 return !received_info_.missing_packets.empty(); 278 return !ack_frame_.missing_packets.empty();
280 } 279 }
281 280
282 bool QuicReceivedPacketManager::HasNewMissingPackets() { 281 bool QuicReceivedPacketManager::HasNewMissingPackets() {
283 return HasMissingPackets() && 282 return HasMissingPackets() &&
284 (received_info_.largest_observed - 283 (ack_frame_.largest_observed -
285 *received_info_.missing_packets.rbegin()) <= kMaxPacketsAfterNewMissing; 284 *ack_frame_.missing_packets.rbegin()) <= kMaxPacketsAfterNewMissing;
286 } 285 }
287 286
288 } // namespace net 287 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698