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 |