| 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 |