| 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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 QuicPacketNumber packet_number = header.packet_packet_number; | 148 QuicPacketNumber packet_number = header.packet_packet_number; |
| 149 DCHECK(IsAwaitingPacket(packet_number)); | 149 DCHECK(IsAwaitingPacket(packet_number)); |
| 150 | 150 |
| 151 InsertMissingPacketsBetween(&ack_frame_, max(ack_frame_.largest_observed + 1, | 151 // Adds the range of packet numbers from max(largest observed + 1, least |
| 152 peer_least_packet_awaiting_ack_), | 152 // awaiting ack) up to packet_number not including packet_number. |
| 153 packet_number); | 153 ack_frame_.missing_packets.Add( |
| 154 max(ack_frame_.largest_observed + 1, peer_least_packet_awaiting_ack_), |
| 155 packet_number); |
| 154 | 156 |
| 155 if (ack_frame_.largest_observed > packet_number) { | 157 if (ack_frame_.largest_observed > packet_number) { |
| 156 // We've gotten one of the out of order packets - remove it from our | 158 // We've gotten one of the out of order packets - remove it from our |
| 157 // "missing packets" list. | 159 // "missing packets" list. |
| 158 DVLOG(1) << "Removing " << packet_number << " from missing list"; | 160 DVLOG(1) << "Removing " << packet_number << " from missing list"; |
| 159 ack_frame_.missing_packets.erase(packet_number); | 161 ack_frame_.missing_packets.Remove(packet_number); |
| 160 | 162 |
| 161 // Record how out of order stats. | 163 // Record how out of order stats. |
| 162 ++stats_->packets_reordered; | 164 ++stats_->packets_reordered; |
| 163 stats_->max_sequence_reordering = | 165 stats_->max_sequence_reordering = |
| 164 max(stats_->max_sequence_reordering, | 166 max(stats_->max_sequence_reordering, |
| 165 ack_frame_.largest_observed - packet_number); | 167 ack_frame_.largest_observed - packet_number); |
| 166 int64 reordering_time_us = | 168 int64 reordering_time_us = |
| 167 receipt_time.Subtract(time_largest_observed_).ToMicroseconds(); | 169 receipt_time.Subtract(time_largest_observed_).ToMicroseconds(); |
| 168 stats_->max_time_reordering_us = max(stats_->max_time_reordering_us, | 170 stats_->max_time_reordering_us = max(stats_->max_time_reordering_us, |
| 169 reordering_time_us); | 171 reordering_time_us); |
| 170 } | 172 } |
| 171 if (packet_number > ack_frame_.largest_observed) { | 173 if (packet_number > ack_frame_.largest_observed) { |
| 172 ack_frame_.largest_observed = packet_number; | 174 ack_frame_.largest_observed = packet_number; |
| 173 time_largest_observed_ = receipt_time; | 175 time_largest_observed_ = receipt_time; |
| 174 } | 176 } |
| 175 entropy_tracker_.RecordPacketEntropyHash(packet_number, header.entropy_hash); | 177 entropy_tracker_.RecordPacketEntropyHash(packet_number, header.entropy_hash); |
| 176 | 178 |
| 177 received_packet_times_.push_back(std::make_pair(packet_number, receipt_time)); | 179 received_packet_times_.push_back(std::make_pair(packet_number, receipt_time)); |
| 178 | 180 |
| 179 ack_frame_.revived_packets.erase(packet_number); | 181 ack_frame_.revived_packets.erase(packet_number); |
| 180 } | 182 } |
| 181 | 183 |
| 182 void QuicReceivedPacketManager::RecordPacketRevived( | 184 void QuicReceivedPacketManager::RecordPacketRevived( |
| 183 QuicPacketNumber packet_number) { | 185 QuicPacketNumber packet_number) { |
| 184 LOG_IF(DFATAL, !IsAwaitingPacket(packet_number)); | 186 LOG_IF(DFATAL, !IsAwaitingPacket(packet_number)); |
| 185 ack_frame_.revived_packets.insert(packet_number); | 187 ack_frame_.revived_packets.insert(packet_number); |
| 186 } | 188 } |
| 187 | 189 |
| 188 bool QuicReceivedPacketManager::IsMissing(QuicPacketNumber packet_number) { | 190 bool QuicReceivedPacketManager::IsMissing(QuicPacketNumber packet_number) { |
| 189 return ContainsKey(ack_frame_.missing_packets, packet_number); | 191 return ack_frame_.missing_packets.Contains(packet_number); |
| 190 } | 192 } |
| 191 | 193 |
| 192 bool QuicReceivedPacketManager::IsAwaitingPacket( | 194 bool QuicReceivedPacketManager::IsAwaitingPacket( |
| 193 QuicPacketNumber packet_number) { | 195 QuicPacketNumber packet_number) { |
| 194 return ::net::IsAwaitingPacket(ack_frame_, packet_number); | 196 return ::net::IsAwaitingPacket(ack_frame_, packet_number); |
| 195 } | 197 } |
| 196 | 198 |
| 197 namespace { | 199 namespace { |
| 198 struct isTooLarge { | 200 struct isTooLarge { |
| 199 explicit isTooLarge(QuicPacketNumber n) : largest_observed_(n) {} | 201 explicit isTooLarge(QuicPacketNumber n) : largest_observed_(n) {} |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash( | 236 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash( |
| 235 QuicPacketNumber packet_number) const { | 237 QuicPacketNumber packet_number) const { |
| 236 return entropy_tracker_.EntropyHash(packet_number); | 238 return entropy_tracker_.EntropyHash(packet_number); |
| 237 } | 239 } |
| 238 | 240 |
| 239 bool QuicReceivedPacketManager::DontWaitForPacketsBefore( | 241 bool QuicReceivedPacketManager::DontWaitForPacketsBefore( |
| 240 QuicPacketNumber least_unacked) { | 242 QuicPacketNumber least_unacked) { |
| 241 ack_frame_.revived_packets.erase( | 243 ack_frame_.revived_packets.erase( |
| 242 ack_frame_.revived_packets.begin(), | 244 ack_frame_.revived_packets.begin(), |
| 243 ack_frame_.revived_packets.lower_bound(least_unacked)); | 245 ack_frame_.revived_packets.lower_bound(least_unacked)); |
| 244 size_t missing_packets_count = ack_frame_.missing_packets.size(); | 246 return ack_frame_.missing_packets.RemoveUpTo(least_unacked); |
| 245 ack_frame_.missing_packets.erase( | |
| 246 ack_frame_.missing_packets.begin(), | |
| 247 ack_frame_.missing_packets.lower_bound(least_unacked)); | |
| 248 return missing_packets_count != ack_frame_.missing_packets.size(); | |
| 249 } | 247 } |
| 250 | 248 |
| 251 void QuicReceivedPacketManager::UpdatePacketInformationSentByPeer( | 249 void QuicReceivedPacketManager::UpdatePacketInformationSentByPeer( |
| 252 const QuicStopWaitingFrame& stop_waiting) { | 250 const QuicStopWaitingFrame& stop_waiting) { |
| 253 // ValidateAck() should fail if peer_least_packet_awaiting_ack_ shrinks. | 251 // ValidateAck() should fail if peer_least_packet_awaiting_ack_ shrinks. |
| 254 DCHECK_LE(peer_least_packet_awaiting_ack_, stop_waiting.least_unacked); | 252 DCHECK_LE(peer_least_packet_awaiting_ack_, stop_waiting.least_unacked); |
| 255 if (stop_waiting.least_unacked > peer_least_packet_awaiting_ack_) { | 253 if (stop_waiting.least_unacked > peer_least_packet_awaiting_ack_) { |
| 256 bool missed_packets = DontWaitForPacketsBefore(stop_waiting.least_unacked); | 254 bool missed_packets = DontWaitForPacketsBefore(stop_waiting.least_unacked); |
| 257 if (missed_packets) { | 255 if (missed_packets) { |
| 258 DVLOG(1) << "Updating entropy hashed since we missed packets"; | 256 DVLOG(1) << "Updating entropy hashed since we missed packets"; |
| 259 // There were some missing packets that we won't ever get now. Recalculate | 257 // There were some missing packets that we won't ever get now. Recalculate |
| 260 // the received entropy hash. | 258 // the received entropy hash. |
| 261 entropy_tracker_.SetCumulativeEntropyUpTo(stop_waiting.least_unacked, | 259 entropy_tracker_.SetCumulativeEntropyUpTo(stop_waiting.least_unacked, |
| 262 stop_waiting.entropy_hash); | 260 stop_waiting.entropy_hash); |
| 263 } | 261 } |
| 264 peer_least_packet_awaiting_ack_ = stop_waiting.least_unacked; | 262 peer_least_packet_awaiting_ack_ = stop_waiting.least_unacked; |
| 265 } | 263 } |
| 266 DCHECK(ack_frame_.missing_packets.empty() || | 264 DCHECK(ack_frame_.missing_packets.Empty() || |
| 267 *ack_frame_.missing_packets.begin() >= | 265 ack_frame_.missing_packets.Min() >= peer_least_packet_awaiting_ack_); |
| 268 peer_least_packet_awaiting_ack_); | |
| 269 } | 266 } |
| 270 | 267 |
| 271 bool QuicReceivedPacketManager::HasNewMissingPackets() const { | 268 bool QuicReceivedPacketManager::HasNewMissingPackets() const { |
| 272 return !ack_frame_.missing_packets.empty() && | 269 return !ack_frame_.missing_packets.Empty() && |
| 273 (ack_frame_.largest_observed - | 270 (ack_frame_.largest_observed - ack_frame_.missing_packets.Max()) <= |
| 274 *ack_frame_.missing_packets.rbegin()) <= kMaxPacketsAfterNewMissing; | 271 kMaxPacketsAfterNewMissing; |
| 275 } | 272 } |
| 276 | 273 |
| 277 size_t QuicReceivedPacketManager::NumTrackedPackets() const { | 274 size_t QuicReceivedPacketManager::NumTrackedPackets() const { |
| 278 return entropy_tracker_.size(); | 275 return entropy_tracker_.size(); |
| 279 } | 276 } |
| 280 | 277 |
| 281 } // namespace net | 278 } // namespace net |
| OLD | NEW |