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" |
11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
12 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
13 #include "net/base/linked_hash_map.h" | 13 #include "net/base/linked_hash_map.h" |
14 #include "net/quic/crypto/crypto_protocol.h" | 14 #include "net/quic/crypto/crypto_protocol.h" |
15 #include "net/quic/quic_bug_tracker.h" | 15 #include "net/quic/quic_bug_tracker.h" |
16 #include "net/quic/quic_connection_stats.h" | 16 #include "net/quic/quic_connection_stats.h" |
| 17 #include "net/quic/quic_flags.h" |
17 | 18 |
18 using std::max; | 19 using std::max; |
19 using std::min; | 20 using std::min; |
20 using std::numeric_limits; | 21 using std::numeric_limits; |
21 | 22 |
22 namespace net { | 23 namespace net { |
23 | 24 |
24 namespace { | 25 namespace { |
25 | 26 |
26 // The maximum number of packets to ack immediately after a missing packet for | 27 // The maximum number of packets to ack immediately after a missing packet for |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 } | 140 } |
140 | 141 |
141 QuicReceivedPacketManager::~QuicReceivedPacketManager() {} | 142 QuicReceivedPacketManager::~QuicReceivedPacketManager() {} |
142 | 143 |
143 void QuicReceivedPacketManager::RecordPacketReceived( | 144 void QuicReceivedPacketManager::RecordPacketReceived( |
144 QuicByteCount bytes, | 145 QuicByteCount bytes, |
145 const QuicPacketHeader& header, | 146 const QuicPacketHeader& header, |
146 QuicTime receipt_time) { | 147 QuicTime receipt_time) { |
147 QuicPacketNumber packet_number = header.packet_number; | 148 QuicPacketNumber packet_number = header.packet_number; |
148 DCHECK(IsAwaitingPacket(packet_number)); | 149 DCHECK(IsAwaitingPacket(packet_number)); |
| 150 if (FLAGS_quic_dont_copy_acks && !ack_frame_updated_) { |
| 151 ack_frame_.received_packet_times.clear(); |
| 152 } |
149 ack_frame_updated_ = true; | 153 ack_frame_updated_ = true; |
150 | |
151 // Adds the range of packet numbers from max(largest observed + 1, least | 154 // Adds the range of packet numbers from max(largest observed + 1, least |
152 // awaiting ack) up to packet_number not including packet_number. | 155 // awaiting ack) up to packet_number not including packet_number. |
153 ack_frame_.missing_packets.Add( | 156 ack_frame_.missing_packets.Add( |
154 max(ack_frame_.largest_observed + 1, peer_least_packet_awaiting_ack_), | 157 max(ack_frame_.largest_observed + 1, peer_least_packet_awaiting_ack_), |
155 packet_number); | 158 packet_number); |
156 | 159 |
157 if (ack_frame_.largest_observed > packet_number) { | 160 if (ack_frame_.largest_observed > packet_number) { |
158 // We've gotten one of the out of order packets - remove it from our | 161 // We've gotten one of the out of order packets - remove it from our |
159 // "missing packets" list. | 162 // "missing packets" list. |
160 DVLOG(1) << "Removing " << packet_number << " from missing list"; | 163 DVLOG(1) << "Removing " << packet_number << " from missing list"; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 // to express. | 201 // to express. |
199 bool operator()(const std::pair<QuicPacketNumber, QuicTime>& p) const { | 202 bool operator()(const std::pair<QuicPacketNumber, QuicTime>& p) const { |
200 return largest_observed_ - p.first >= numeric_limits<uint8_t>::max(); | 203 return largest_observed_ - p.first >= numeric_limits<uint8_t>::max(); |
201 } | 204 } |
202 }; | 205 }; |
203 } // namespace | 206 } // namespace |
204 | 207 |
205 void QuicReceivedPacketManager::UpdateReceivedPacketInfo( | 208 void QuicReceivedPacketManager::UpdateReceivedPacketInfo( |
206 QuicAckFrame* ack_frame, | 209 QuicAckFrame* ack_frame, |
207 QuicTime approximate_now) { | 210 QuicTime approximate_now) { |
| 211 DCHECK(!FLAGS_quic_dont_copy_acks); |
208 ack_frame_updated_ = false; | 212 ack_frame_updated_ = false; |
209 *ack_frame = ack_frame_; | 213 *ack_frame = ack_frame_; |
210 ack_frame->entropy_hash = EntropyHash(ack_frame_.largest_observed); | 214 ack_frame->entropy_hash = EntropyHash(ack_frame_.largest_observed); |
211 | 215 |
212 if (time_largest_observed_ == QuicTime::Zero()) { | 216 if (time_largest_observed_ == QuicTime::Zero()) { |
213 // We have received no packets. | 217 // We have received no packets. |
214 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); | 218 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); |
215 return; | 219 return; |
216 } | 220 } |
217 | 221 |
218 // Ensure the delta is zero if approximate now is "in the past". | 222 // Ensure the delta is zero if approximate now is "in the past". |
219 ack_frame->ack_delay_time = | 223 ack_frame->ack_delay_time = |
220 approximate_now < time_largest_observed_ | 224 approximate_now < time_largest_observed_ |
221 ? QuicTime::Delta::Zero() | 225 ? QuicTime::Delta::Zero() |
222 : approximate_now.Subtract(time_largest_observed_); | 226 : approximate_now.Subtract(time_largest_observed_); |
223 | 227 |
224 // Clear all packet times if any are too far from largest observed. | 228 // Clear all packet times if any are too far from largest observed. |
225 // It's expected this is extremely rare. | 229 // It's expected this is extremely rare. |
226 for (PacketTimeVector::iterator it = ack_frame_.received_packet_times.begin(); | 230 for (PacketTimeVector::iterator it = ack_frame_.received_packet_times.begin(); |
227 it != ack_frame_.received_packet_times.end();) { | 231 it != ack_frame_.received_packet_times.end();) { |
228 if (ack_frame_.largest_observed - it->first >= | 232 if (ack_frame_.largest_observed - it->first >= |
229 numeric_limits<uint8_t>::max()) { | 233 numeric_limits<uint8_t>::max()) { |
230 it = ack_frame_.received_packet_times.erase(it); | 234 it = ack_frame_.received_packet_times.erase(it); |
231 } else { | 235 } else { |
232 ++it; | 236 ++it; |
233 } | 237 } |
234 } | 238 } |
235 | 239 |
236 // TODO(ianswett): Instead of transferring all the information over, | |
237 // consider giving the QuicPacketGenerator a reference to this ack frame | |
238 // and clear it afterwards. | |
239 ack_frame->received_packet_times.clear(); | 240 ack_frame->received_packet_times.clear(); |
240 ack_frame->received_packet_times.swap(ack_frame_.received_packet_times); | 241 ack_frame->received_packet_times.swap(ack_frame_.received_packet_times); |
241 } | 242 } |
242 | 243 |
| 244 const QuicFrame QuicReceivedPacketManager::GetUpdatedAckFrame( |
| 245 QuicTime approximate_now) { |
| 246 ack_frame_updated_ = false; |
| 247 ack_frame_.entropy_hash = EntropyHash(ack_frame_.largest_observed); |
| 248 |
| 249 if (time_largest_observed_ == QuicTime::Zero()) { |
| 250 // We have received no packets. |
| 251 ack_frame_.ack_delay_time = QuicTime::Delta::Infinite(); |
| 252 } else { |
| 253 // Ensure the delta is zero if approximate now is "in the past". |
| 254 ack_frame_.ack_delay_time = |
| 255 approximate_now < time_largest_observed_ |
| 256 ? QuicTime::Delta::Zero() |
| 257 : approximate_now.Subtract(time_largest_observed_); |
| 258 } |
| 259 |
| 260 // Clear all packet times if any are too far from largest observed. |
| 261 // It's expected this is extremely rare. |
| 262 for (PacketTimeVector::iterator it = ack_frame_.received_packet_times.begin(); |
| 263 it != ack_frame_.received_packet_times.end();) { |
| 264 if (ack_frame_.largest_observed - it->first >= |
| 265 numeric_limits<uint8_t>::max()) { |
| 266 it = ack_frame_.received_packet_times.erase(it); |
| 267 } else { |
| 268 ++it; |
| 269 } |
| 270 } |
| 271 |
| 272 return QuicFrame(&ack_frame_); |
| 273 } |
| 274 |
243 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash( | 275 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash( |
244 QuicPacketNumber packet_number) const { | 276 QuicPacketNumber packet_number) const { |
245 return entropy_tracker_.EntropyHash(packet_number); | 277 return entropy_tracker_.EntropyHash(packet_number); |
246 } | 278 } |
247 | 279 |
248 bool QuicReceivedPacketManager::DontWaitForPacketsBefore( | 280 bool QuicReceivedPacketManager::DontWaitForPacketsBefore( |
249 QuicPacketNumber least_unacked) { | 281 QuicPacketNumber least_unacked) { |
250 return ack_frame_.missing_packets.RemoveUpTo(least_unacked); | 282 return ack_frame_.missing_packets.RemoveUpTo(least_unacked); |
251 } | 283 } |
252 | 284 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 | 316 |
285 size_t QuicReceivedPacketManager::NumTrackedPackets() const { | 317 size_t QuicReceivedPacketManager::NumTrackedPackets() const { |
286 return entropy_tracker_.size(); | 318 return entropy_tracker_.size(); |
287 } | 319 } |
288 | 320 |
289 bool QuicReceivedPacketManager::ack_frame_updated() const { | 321 bool QuicReceivedPacketManager::ack_frame_updated() const { |
290 return ack_frame_updated_; | 322 return ack_frame_updated_; |
291 } | 323 } |
292 | 324 |
293 } // namespace net | 325 } // namespace net |
OLD | NEW |