| 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/crypto/crypto_protocol.h" |
| 10 #include "net/quic/quic_connection_stats.h" | 11 #include "net/quic/quic_connection_stats.h" |
| 11 | 12 |
| 12 using std::make_pair; | 13 using std::make_pair; |
| 13 using std::max; | 14 using std::max; |
| 14 using std::min; | 15 using std::min; |
| 16 using std::numeric_limits; |
| 15 | 17 |
| 16 namespace net { | 18 namespace net { |
| 17 | 19 |
| 18 namespace { | 20 namespace { |
| 19 | 21 |
| 20 // The maximum number of packets to ack immediately after a missing packet for | 22 // The maximum number of packets to ack immediately after a missing packet for |
| 21 // fast retransmission to kick in at the sender. This limit is created to | 23 // fast retransmission to kick in at the sender. This limit is created to |
| 22 // reduce the number of acks sent that have no benefit for fast retransmission. | 24 // reduce the number of acks sent that have no benefit for fast retransmission. |
| 23 // Set to the number of nacks needed for fast retransmit plus one for protection | 25 // Set to the number of nacks needed for fast retransmit plus one for protection |
| 24 // against an ack loss | 26 // against an ack loss |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 | 123 |
| 122 void QuicReceivedPacketManager::EntropyTracker:: | 124 void QuicReceivedPacketManager::EntropyTracker:: |
| 123 AdvanceFirstGapAndGarbageCollectEntropyMap() { | 125 AdvanceFirstGapAndGarbageCollectEntropyMap() { |
| 124 while (!packets_entropy_.empty() && packets_entropy_.front().second) { | 126 while (!packets_entropy_.empty() && packets_entropy_.front().second) { |
| 125 ++first_gap_; | 127 ++first_gap_; |
| 126 packets_entropy_.pop_front(); | 128 packets_entropy_.pop_front(); |
| 127 } | 129 } |
| 128 } | 130 } |
| 129 | 131 |
| 130 QuicReceivedPacketManager::QuicReceivedPacketManager( | 132 QuicReceivedPacketManager::QuicReceivedPacketManager( |
| 131 CongestionFeedbackType congestion_type, | |
| 132 QuicConnectionStats* stats) | 133 QuicConnectionStats* stats) |
| 133 : peer_least_packet_awaiting_ack_(0), | 134 : peer_least_packet_awaiting_ack_(0), |
| 134 time_largest_observed_(QuicTime::Zero()), | 135 time_largest_observed_(QuicTime::Zero()), |
| 135 receive_algorithm_(ReceiveAlgorithmInterface::Create(congestion_type)), | 136 receive_algorithm_(ReceiveAlgorithmInterface::Create(kTCP)), |
| 136 stats_(stats) { | 137 stats_(stats) { |
| 137 ack_frame_.largest_observed = 0; | 138 ack_frame_.largest_observed = 0; |
| 138 ack_frame_.entropy_hash = 0; | 139 ack_frame_.entropy_hash = 0; |
| 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, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 171 if (sequence_number > ack_frame_.largest_observed) { | 172 if (sequence_number > ack_frame_.largest_observed) { |
| 172 ack_frame_.largest_observed = sequence_number; | 173 ack_frame_.largest_observed = sequence_number; |
| 173 time_largest_observed_ = receipt_time; | 174 time_largest_observed_ = receipt_time; |
| 174 } | 175 } |
| 175 entropy_tracker_.RecordPacketEntropyHash(sequence_number, | 176 entropy_tracker_.RecordPacketEntropyHash(sequence_number, |
| 176 header.entropy_hash); | 177 header.entropy_hash); |
| 177 | 178 |
| 178 receive_algorithm_->RecordIncomingPacket( | 179 receive_algorithm_->RecordIncomingPacket( |
| 179 bytes, sequence_number, receipt_time); | 180 bytes, sequence_number, receipt_time); |
| 180 | 181 |
| 182 received_packet_times_.push_back( |
| 183 std::make_pair(sequence_number, receipt_time)); |
| 184 |
| 181 ack_frame_.revived_packets.erase(sequence_number); | 185 ack_frame_.revived_packets.erase(sequence_number); |
| 182 } | 186 } |
| 183 | 187 |
| 184 void QuicReceivedPacketManager::RecordPacketRevived( | 188 void QuicReceivedPacketManager::RecordPacketRevived( |
| 185 QuicPacketSequenceNumber sequence_number) { | 189 QuicPacketSequenceNumber sequence_number) { |
| 186 LOG_IF(DFATAL, !IsAwaitingPacket(sequence_number)); | 190 LOG_IF(DFATAL, !IsAwaitingPacket(sequence_number)); |
| 187 ack_frame_.revived_packets.insert(sequence_number); | 191 ack_frame_.revived_packets.insert(sequence_number); |
| 188 } | 192 } |
| 189 | 193 |
| 190 bool QuicReceivedPacketManager::IsMissing( | 194 bool QuicReceivedPacketManager::IsMissing( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 209 } | 213 } |
| 210 | 214 |
| 211 if (approximate_now < time_largest_observed_) { | 215 if (approximate_now < time_largest_observed_) { |
| 212 // Approximate now may well be "in the past". | 216 // Approximate now may well be "in the past". |
| 213 ack_frame->delta_time_largest_observed = QuicTime::Delta::Zero(); | 217 ack_frame->delta_time_largest_observed = QuicTime::Delta::Zero(); |
| 214 return; | 218 return; |
| 215 } | 219 } |
| 216 | 220 |
| 217 ack_frame->delta_time_largest_observed = | 221 ack_frame->delta_time_largest_observed = |
| 218 approximate_now.Subtract(time_largest_observed_); | 222 approximate_now.Subtract(time_largest_observed_); |
| 223 |
| 224 // Remove all packets that are too far from largest_observed to express. |
| 225 received_packet_times_.remove_if( |
| 226 [this] (std::pair<QuicPacketSequenceNumber, QuicTime> p) |
| 227 { return ack_frame_.largest_observed - p.first >= |
| 228 numeric_limits<uint8>::max();}); |
| 229 |
| 230 ack_frame->received_packet_times = received_packet_times_; |
| 231 received_packet_times_.clear(); |
| 219 } | 232 } |
| 220 | 233 |
| 221 bool QuicReceivedPacketManager::GenerateCongestionFeedback( | 234 bool QuicReceivedPacketManager::GenerateCongestionFeedback( |
| 222 QuicCongestionFeedbackFrame* feedback) { | 235 QuicCongestionFeedbackFrame* feedback) { |
| 223 return receive_algorithm_->GenerateCongestionFeedback(feedback); | 236 return receive_algorithm_->GenerateCongestionFeedback(feedback); |
| 224 } | 237 } |
| 225 | 238 |
| 226 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash( | 239 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash( |
| 227 QuicPacketSequenceNumber sequence_number) const { | 240 QuicPacketSequenceNumber sequence_number) const { |
| 228 return entropy_tracker_.EntropyHash(sequence_number); | 241 return entropy_tracker_.EntropyHash(sequence_number); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 peer_least_packet_awaiting_ack_); | 273 peer_least_packet_awaiting_ack_); |
| 261 } | 274 } |
| 262 | 275 |
| 263 bool QuicReceivedPacketManager::HasNewMissingPackets() { | 276 bool QuicReceivedPacketManager::HasNewMissingPackets() { |
| 264 return !ack_frame_.missing_packets.empty() && | 277 return !ack_frame_.missing_packets.empty() && |
| 265 (ack_frame_.largest_observed - | 278 (ack_frame_.largest_observed - |
| 266 *ack_frame_.missing_packets.rbegin()) <= kMaxPacketsAfterNewMissing; | 279 *ack_frame_.missing_packets.rbegin()) <= kMaxPacketsAfterNewMissing; |
| 267 } | 280 } |
| 268 | 281 |
| 269 } // namespace net | 282 } // namespace net |
| OLD | NEW |