OLD | NEW |
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 <limits> | 7 #include <limits> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 // We've gotten one of the out of order packets - remove it from our | 156 // We've gotten one of the out of order packets - remove it from our |
157 // "missing packets" list. | 157 // "missing packets" list. |
158 DVLOG(1) << "Removing " << packet_number << " from missing list"; | 158 DVLOG(1) << "Removing " << packet_number << " from missing list"; |
159 ack_frame_.missing_packets.Remove(packet_number); | 159 ack_frame_.missing_packets.Remove(packet_number); |
160 | 160 |
161 // Record how out of order stats. | 161 // Record how out of order stats. |
162 ++stats_->packets_reordered; | 162 ++stats_->packets_reordered; |
163 stats_->max_sequence_reordering = | 163 stats_->max_sequence_reordering = |
164 max(stats_->max_sequence_reordering, | 164 max(stats_->max_sequence_reordering, |
165 ack_frame_.largest_observed - packet_number); | 165 ack_frame_.largest_observed - packet_number); |
166 int64 reordering_time_us = | 166 int64_t reordering_time_us = |
167 receipt_time.Subtract(time_largest_observed_).ToMicroseconds(); | 167 receipt_time.Subtract(time_largest_observed_).ToMicroseconds(); |
168 stats_->max_time_reordering_us = | 168 stats_->max_time_reordering_us = |
169 max(stats_->max_time_reordering_us, reordering_time_us); | 169 max(stats_->max_time_reordering_us, reordering_time_us); |
170 } | 170 } |
171 if (packet_number > ack_frame_.largest_observed) { | 171 if (packet_number > ack_frame_.largest_observed) { |
172 ack_frame_.largest_observed = packet_number; | 172 ack_frame_.largest_observed = packet_number; |
173 time_largest_observed_ = receipt_time; | 173 time_largest_observed_ = receipt_time; |
174 } | 174 } |
175 entropy_tracker_.RecordPacketEntropyHash(packet_number, header.entropy_hash); | 175 entropy_tracker_.RecordPacketEntropyHash(packet_number, header.entropy_hash); |
176 | 176 |
(...skipping 22 matching lines...) Expand all Loading... |
199 } | 199 } |
200 | 200 |
201 namespace { | 201 namespace { |
202 struct isTooLarge { | 202 struct isTooLarge { |
203 explicit isTooLarge(QuicPacketNumber n) : largest_observed_(n) {} | 203 explicit isTooLarge(QuicPacketNumber n) : largest_observed_(n) {} |
204 QuicPacketNumber largest_observed_; | 204 QuicPacketNumber largest_observed_; |
205 | 205 |
206 // Return true if the packet in p is too different from largest_observed_ | 206 // Return true if the packet in p is too different from largest_observed_ |
207 // to express. | 207 // to express. |
208 bool operator()(const std::pair<QuicPacketNumber, QuicTime>& p) const { | 208 bool operator()(const std::pair<QuicPacketNumber, QuicTime>& p) const { |
209 return largest_observed_ - p.first >= numeric_limits<uint8>::max(); | 209 return largest_observed_ - p.first >= numeric_limits<uint8_t>::max(); |
210 } | 210 } |
211 }; | 211 }; |
212 } // namespace | 212 } // namespace |
213 | 213 |
214 void QuicReceivedPacketManager::UpdateReceivedPacketInfo( | 214 void QuicReceivedPacketManager::UpdateReceivedPacketInfo( |
215 QuicAckFrame* ack_frame, | 215 QuicAckFrame* ack_frame, |
216 QuicTime approximate_now) { | 216 QuicTime approximate_now) { |
217 ack_frame_updated_ = false; | 217 ack_frame_updated_ = false; |
218 *ack_frame = ack_frame_; | 218 *ack_frame = ack_frame_; |
219 ack_frame->entropy_hash = EntropyHash(ack_frame_.largest_observed); | 219 ack_frame->entropy_hash = EntropyHash(ack_frame_.largest_observed); |
220 | 220 |
221 if (time_largest_observed_ == QuicTime::Zero()) { | 221 if (time_largest_observed_ == QuicTime::Zero()) { |
222 // We have received no packets. | 222 // We have received no packets. |
223 ack_frame->delta_time_largest_observed = QuicTime::Delta::Infinite(); | 223 ack_frame->delta_time_largest_observed = QuicTime::Delta::Infinite(); |
224 return; | 224 return; |
225 } | 225 } |
226 | 226 |
227 // Ensure the delta is zero if approximate now is "in the past". | 227 // Ensure the delta is zero if approximate now is "in the past". |
228 ack_frame->delta_time_largest_observed = | 228 ack_frame->delta_time_largest_observed = |
229 approximate_now < time_largest_observed_ | 229 approximate_now < time_largest_observed_ |
230 ? QuicTime::Delta::Zero() | 230 ? QuicTime::Delta::Zero() |
231 : approximate_now.Subtract(time_largest_observed_); | 231 : approximate_now.Subtract(time_largest_observed_); |
232 | 232 |
233 // Clear all packet times if any are too far from largest observed. | 233 // Clear all packet times if any are too far from largest observed. |
234 // It's expected this is extremely rare. | 234 // It's expected this is extremely rare. |
235 for (PacketTimeVector::iterator it = ack_frame_.received_packet_times.begin(); | 235 for (PacketTimeVector::iterator it = ack_frame_.received_packet_times.begin(); |
236 it != ack_frame_.received_packet_times.end();) { | 236 it != ack_frame_.received_packet_times.end();) { |
237 if (ack_frame_.largest_observed - it->first >= | 237 if (ack_frame_.largest_observed - it->first >= |
238 numeric_limits<uint8>::max()) { | 238 numeric_limits<uint8_t>::max()) { |
239 it = ack_frame_.received_packet_times.erase(it); | 239 it = ack_frame_.received_packet_times.erase(it); |
240 } else { | 240 } else { |
241 ++it; | 241 ++it; |
242 } | 242 } |
243 } | 243 } |
244 | 244 |
245 // TODO(ianswett): Instead of transferring all the information over, | 245 // TODO(ianswett): Instead of transferring all the information over, |
246 // consider giving the QuicPacketGenerator a reference to this ack frame | 246 // consider giving the QuicPacketGenerator a reference to this ack frame |
247 // and clear it afterwards. | 247 // and clear it afterwards. |
248 ack_frame->received_packet_times.clear(); | 248 ack_frame->received_packet_times.clear(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 return !ack_frame_.missing_packets.Empty() && | 288 return !ack_frame_.missing_packets.Empty() && |
289 (ack_frame_.largest_observed - ack_frame_.missing_packets.Max()) <= | 289 (ack_frame_.largest_observed - ack_frame_.missing_packets.Max()) <= |
290 kMaxPacketsAfterNewMissing; | 290 kMaxPacketsAfterNewMissing; |
291 } | 291 } |
292 | 292 |
293 size_t QuicReceivedPacketManager::NumTrackedPackets() const { | 293 size_t QuicReceivedPacketManager::NumTrackedPackets() const { |
294 return entropy_tracker_.size(); | 294 return entropy_tracker_.size(); |
295 } | 295 } |
296 | 296 |
297 } // namespace net | 297 } // namespace net |
OLD | NEW |