| 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 "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "net/base/linked_hash_map.h" | 9 #include "net/base/linked_hash_map.h" |
| 10 #include "net/quic/quic_connection_stats.h" | 10 #include "net/quic/quic_connection_stats.h" |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 break; | 122 break; |
| 123 } | 123 } |
| 124 packets_entropy_.erase(it); | 124 packets_entropy_.erase(it); |
| 125 ++first_gap_; | 125 ++first_gap_; |
| 126 } | 126 } |
| 127 } | 127 } |
| 128 | 128 |
| 129 QuicReceivedPacketManager::QuicReceivedPacketManager( | 129 QuicReceivedPacketManager::QuicReceivedPacketManager( |
| 130 CongestionFeedbackType congestion_type, | 130 CongestionFeedbackType congestion_type, |
| 131 QuicConnectionStats* stats) | 131 QuicConnectionStats* stats) |
| 132 : peer_largest_observed_packet_(0), | 132 : peer_least_packet_awaiting_ack_(0), |
| 133 least_packet_awaited_by_peer_(1), | |
| 134 peer_least_packet_awaiting_ack_(0), | |
| 135 time_largest_observed_(QuicTime::Zero()), | 133 time_largest_observed_(QuicTime::Zero()), |
| 136 receive_algorithm_(ReceiveAlgorithmInterface::Create(congestion_type)), | 134 receive_algorithm_(ReceiveAlgorithmInterface::Create(congestion_type)), |
| 137 stats_(stats) { | 135 stats_(stats) { |
| 138 ack_frame_.largest_observed = 0; | 136 ack_frame_.largest_observed = 0; |
| 139 ack_frame_.entropy_hash = 0; | 137 ack_frame_.entropy_hash = 0; |
| 140 } | 138 } |
| 141 | 139 |
| 142 QuicReceivedPacketManager::~QuicReceivedPacketManager() {} | 140 QuicReceivedPacketManager::~QuicReceivedPacketManager() {} |
| 143 | 141 |
| 144 void QuicReceivedPacketManager::RecordPacketReceived( | 142 void QuicReceivedPacketManager::RecordPacketReceived( |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 bool QuicReceivedPacketManager::GenerateCongestionFeedback( | 220 bool QuicReceivedPacketManager::GenerateCongestionFeedback( |
| 223 QuicCongestionFeedbackFrame* feedback) { | 221 QuicCongestionFeedbackFrame* feedback) { |
| 224 return receive_algorithm_->GenerateCongestionFeedback(feedback); | 222 return receive_algorithm_->GenerateCongestionFeedback(feedback); |
| 225 } | 223 } |
| 226 | 224 |
| 227 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash( | 225 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash( |
| 228 QuicPacketSequenceNumber sequence_number) const { | 226 QuicPacketSequenceNumber sequence_number) const { |
| 229 return entropy_tracker_.EntropyHash(sequence_number); | 227 return entropy_tracker_.EntropyHash(sequence_number); |
| 230 } | 228 } |
| 231 | 229 |
| 232 void QuicReceivedPacketManager::UpdatePacketInformationReceivedByPeer( | |
| 233 const QuicAckFrame& ack_frame) { | |
| 234 // ValidateAck should fail if largest_observed ever shrinks. | |
| 235 DCHECK_LE(peer_largest_observed_packet_, ack_frame.largest_observed); | |
| 236 peer_largest_observed_packet_ = ack_frame.largest_observed; | |
| 237 | |
| 238 if (ack_frame.missing_packets.empty()) { | |
| 239 least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1; | |
| 240 } else { | |
| 241 least_packet_awaited_by_peer_ = *(ack_frame.missing_packets.begin()); | |
| 242 } | |
| 243 } | |
| 244 | |
| 245 bool QuicReceivedPacketManager::DontWaitForPacketsBefore( | 230 bool QuicReceivedPacketManager::DontWaitForPacketsBefore( |
| 246 QuicPacketSequenceNumber least_unacked) { | 231 QuicPacketSequenceNumber least_unacked) { |
| 247 ack_frame_.revived_packets.erase( | 232 ack_frame_.revived_packets.erase( |
| 248 ack_frame_.revived_packets.begin(), | 233 ack_frame_.revived_packets.begin(), |
| 249 ack_frame_.revived_packets.lower_bound(least_unacked)); | 234 ack_frame_.revived_packets.lower_bound(least_unacked)); |
| 250 size_t missing_packets_count = ack_frame_.missing_packets.size(); | 235 size_t missing_packets_count = ack_frame_.missing_packets.size(); |
| 251 ack_frame_.missing_packets.erase( | 236 ack_frame_.missing_packets.erase( |
| 252 ack_frame_.missing_packets.begin(), | 237 ack_frame_.missing_packets.begin(), |
| 253 ack_frame_.missing_packets.lower_bound(least_unacked)); | 238 ack_frame_.missing_packets.lower_bound(least_unacked)); |
| 254 return missing_packets_count != ack_frame_.missing_packets.size(); | 239 return missing_packets_count != ack_frame_.missing_packets.size(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 278 return !ack_frame_.missing_packets.empty(); | 263 return !ack_frame_.missing_packets.empty(); |
| 279 } | 264 } |
| 280 | 265 |
| 281 bool QuicReceivedPacketManager::HasNewMissingPackets() { | 266 bool QuicReceivedPacketManager::HasNewMissingPackets() { |
| 282 return HasMissingPackets() && | 267 return HasMissingPackets() && |
| 283 (ack_frame_.largest_observed - | 268 (ack_frame_.largest_observed - |
| 284 *ack_frame_.missing_packets.rbegin()) <= kMaxPacketsAfterNewMissing; | 269 *ack_frame_.missing_packets.rbegin()) <= kMaxPacketsAfterNewMissing; |
| 285 } | 270 } |
| 286 | 271 |
| 287 } // namespace net | 272 } // namespace net |
| OLD | NEW |