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