| 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> | 
|  | 8 #include <utility> | 
|  | 9 | 
| 7 #include "base/logging.h" | 10 #include "base/logging.h" | 
| 8 #include "base/stl_util.h" | 11 #include "base/stl_util.h" | 
| 9 #include "net/base/linked_hash_map.h" | 12 #include "net/base/linked_hash_map.h" | 
| 10 #include "net/quic/crypto/crypto_protocol.h" | 13 #include "net/quic/crypto/crypto_protocol.h" | 
| 11 #include "net/quic/quic_connection_stats.h" | 14 #include "net/quic/quic_connection_stats.h" | 
| 12 | 15 | 
| 13 using std::make_pair; | 16 using std::make_pair; | 
| 14 using std::max; | 17 using std::max; | 
| 15 using std::min; | 18 using std::min; | 
| 16 using std::numeric_limits; | 19 using std::numeric_limits; | 
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 194 bool QuicReceivedPacketManager::IsMissing( | 197 bool QuicReceivedPacketManager::IsMissing( | 
| 195     QuicPacketSequenceNumber sequence_number) { | 198     QuicPacketSequenceNumber sequence_number) { | 
| 196   return ContainsKey(ack_frame_.missing_packets, sequence_number); | 199   return ContainsKey(ack_frame_.missing_packets, sequence_number); | 
| 197 } | 200 } | 
| 198 | 201 | 
| 199 bool QuicReceivedPacketManager::IsAwaitingPacket( | 202 bool QuicReceivedPacketManager::IsAwaitingPacket( | 
| 200     QuicPacketSequenceNumber sequence_number) { | 203     QuicPacketSequenceNumber sequence_number) { | 
| 201   return ::net::IsAwaitingPacket(ack_frame_, sequence_number); | 204   return ::net::IsAwaitingPacket(ack_frame_, sequence_number); | 
| 202 } | 205 } | 
| 203 | 206 | 
|  | 207 namespace { | 
|  | 208 struct isTooLarge { | 
|  | 209   explicit isTooLarge(QuicPacketSequenceNumber n) : largest_observed_(n) {} | 
|  | 210   QuicPacketSequenceNumber largest_observed_; | 
|  | 211 | 
|  | 212   // Return true if the packet in p is too different from largest_observed_ | 
|  | 213   // to express. | 
|  | 214   bool operator() ( | 
|  | 215       const std::pair<QuicPacketSequenceNumber, QuicTime>& p) const { | 
|  | 216     return largest_observed_ - p.first >= numeric_limits<uint8>::max(); | 
|  | 217   } | 
|  | 218 }; | 
|  | 219 }  // namespace | 
|  | 220 | 
| 204 void QuicReceivedPacketManager::UpdateReceivedPacketInfo( | 221 void QuicReceivedPacketManager::UpdateReceivedPacketInfo( | 
| 205     QuicAckFrame* ack_frame, QuicTime approximate_now) { | 222     QuicAckFrame* ack_frame, QuicTime approximate_now) { | 
| 206   *ack_frame = ack_frame_; | 223   *ack_frame = ack_frame_; | 
| 207   ack_frame->entropy_hash = EntropyHash(ack_frame_.largest_observed); | 224   ack_frame->entropy_hash = EntropyHash(ack_frame_.largest_observed); | 
| 208 | 225 | 
| 209   if (time_largest_observed_ == QuicTime::Zero()) { | 226   if (time_largest_observed_ == QuicTime::Zero()) { | 
| 210     // We have received no packets. | 227     // We have received no packets. | 
| 211     ack_frame->delta_time_largest_observed = QuicTime::Delta::Infinite(); | 228     ack_frame->delta_time_largest_observed = QuicTime::Delta::Infinite(); | 
| 212     return; | 229     return; | 
| 213   } | 230   } | 
| 214 | 231 | 
| 215   if (approximate_now < time_largest_observed_) { | 232   if (approximate_now < time_largest_observed_) { | 
| 216     // Approximate now may well be "in the past". | 233     // Approximate now may well be "in the past". | 
| 217     ack_frame->delta_time_largest_observed = QuicTime::Delta::Zero(); | 234     ack_frame->delta_time_largest_observed = QuicTime::Delta::Zero(); | 
| 218     return; | 235     return; | 
| 219   } | 236   } | 
| 220 | 237 | 
| 221   ack_frame->delta_time_largest_observed = | 238   ack_frame->delta_time_largest_observed = | 
| 222       approximate_now.Subtract(time_largest_observed_); | 239       approximate_now.Subtract(time_largest_observed_); | 
| 223 | 240 | 
| 224   // Remove all packets that are too far from largest_observed to express. | 241   // Remove all packets that are too far from largest_observed to express. | 
| 225   received_packet_times_.remove_if( | 242   received_packet_times_.remove_if(isTooLarge(ack_frame_.largest_observed)); | 
| 226       [this] (std::pair<QuicPacketSequenceNumber, QuicTime> p) |  | 
| 227       { return ack_frame_.largest_observed - p.first >= |  | 
| 228         numeric_limits<uint8>::max();}); |  | 
| 229 | 243 | 
| 230   ack_frame->received_packet_times = received_packet_times_; | 244   ack_frame->received_packet_times = received_packet_times_; | 
| 231   received_packet_times_.clear(); | 245   received_packet_times_.clear(); | 
| 232 } | 246 } | 
| 233 | 247 | 
| 234 bool QuicReceivedPacketManager::GenerateCongestionFeedback( | 248 bool QuicReceivedPacketManager::GenerateCongestionFeedback( | 
| 235     QuicCongestionFeedbackFrame* feedback) { | 249     QuicCongestionFeedbackFrame* feedback) { | 
| 236   return receive_algorithm_->GenerateCongestionFeedback(feedback); | 250   return receive_algorithm_->GenerateCongestionFeedback(feedback); | 
| 237 } | 251 } | 
| 238 | 252 | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 273              peer_least_packet_awaiting_ack_); | 287              peer_least_packet_awaiting_ack_); | 
| 274 } | 288 } | 
| 275 | 289 | 
| 276 bool QuicReceivedPacketManager::HasNewMissingPackets() { | 290 bool QuicReceivedPacketManager::HasNewMissingPackets() { | 
| 277   return !ack_frame_.missing_packets.empty() && | 291   return !ack_frame_.missing_packets.empty() && | 
| 278       (ack_frame_.largest_observed - | 292       (ack_frame_.largest_observed - | 
| 279        *ack_frame_.missing_packets.rbegin()) <= kMaxPacketsAfterNewMissing; | 293        *ack_frame_.missing_packets.rbegin()) <= kMaxPacketsAfterNewMissing; | 
| 280 } | 294 } | 
| 281 | 295 | 
| 282 }  // namespace net | 296 }  // namespace net | 
| OLD | NEW | 
|---|