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 |