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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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_largest_observed_packet_(0), |
133 least_packet_awaited_by_peer_(1), | 133 least_packet_awaited_by_peer_(1), |
134 peer_least_packet_awaiting_ack_(0), | 134 peer_least_packet_awaiting_ack_(0), |
135 time_largest_observed_(QuicTime::Zero()), | 135 time_largest_observed_(QuicTime::Zero()), |
136 receive_algorithm_(ReceiveAlgorithmInterface::Create(congestion_type)), | 136 receive_algorithm_(ReceiveAlgorithmInterface::Create(congestion_type)), |
137 stats_(stats) { | 137 stats_(stats) { |
138 received_info_.largest_observed = 0; | 138 ack_frame_.largest_observed = 0; |
139 received_info_.entropy_hash = 0; | 139 ack_frame_.entropy_hash = 0; |
140 } | 140 } |
141 | 141 |
142 QuicReceivedPacketManager::~QuicReceivedPacketManager() {} | 142 QuicReceivedPacketManager::~QuicReceivedPacketManager() {} |
143 | 143 |
144 void QuicReceivedPacketManager::RecordPacketReceived( | 144 void QuicReceivedPacketManager::RecordPacketReceived( |
145 QuicByteCount bytes, | 145 QuicByteCount bytes, |
146 const QuicPacketHeader& header, | 146 const QuicPacketHeader& header, |
147 QuicTime receipt_time) { | 147 QuicTime receipt_time) { |
148 QuicPacketSequenceNumber sequence_number = header.packet_sequence_number; | 148 QuicPacketSequenceNumber sequence_number = header.packet_sequence_number; |
149 DCHECK(IsAwaitingPacket(sequence_number)); | 149 DCHECK(IsAwaitingPacket(sequence_number)); |
150 | 150 |
151 InsertMissingPacketsBetween( | 151 InsertMissingPacketsBetween( |
152 &received_info_, | 152 &ack_frame_, |
153 max(received_info_.largest_observed + 1, peer_least_packet_awaiting_ack_), | 153 max(ack_frame_.largest_observed + 1, peer_least_packet_awaiting_ack_), |
154 sequence_number); | 154 sequence_number); |
155 | 155 |
156 if (received_info_.largest_observed > sequence_number) { | 156 if (ack_frame_.largest_observed > sequence_number) { |
157 // We've gotten one of the out of order packets - remove it from our | 157 // We've gotten one of the out of order packets - remove it from our |
158 // "missing packets" list. | 158 // "missing packets" list. |
159 DVLOG(1) << "Removing " << sequence_number << " from missing list"; | 159 DVLOG(1) << "Removing " << sequence_number << " from missing list"; |
160 received_info_.missing_packets.erase(sequence_number); | 160 ack_frame_.missing_packets.erase(sequence_number); |
161 | 161 |
162 // Record how out of order stats. | 162 // Record how out of order stats. |
163 ++stats_->packets_reordered; | 163 ++stats_->packets_reordered; |
164 uint32 sequence_gap = received_info_.largest_observed - sequence_number; | 164 uint32 sequence_gap = ack_frame_.largest_observed - sequence_number; |
165 stats_->max_sequence_reordering = | 165 stats_->max_sequence_reordering = |
166 max(stats_->max_sequence_reordering, sequence_gap); | 166 max(stats_->max_sequence_reordering, sequence_gap); |
167 uint32 reordering_time_us = | 167 uint32 reordering_time_us = |
168 receipt_time.Subtract(time_largest_observed_).ToMicroseconds(); | 168 receipt_time.Subtract(time_largest_observed_).ToMicroseconds(); |
169 stats_->max_time_reordering_us = max(stats_->max_time_reordering_us, | 169 stats_->max_time_reordering_us = max(stats_->max_time_reordering_us, |
170 reordering_time_us); | 170 reordering_time_us); |
171 } | 171 } |
172 if (sequence_number > received_info_.largest_observed) { | 172 if (sequence_number > ack_frame_.largest_observed) { |
173 received_info_.largest_observed = sequence_number; | 173 ack_frame_.largest_observed = sequence_number; |
174 time_largest_observed_ = receipt_time; | 174 time_largest_observed_ = receipt_time; |
175 } | 175 } |
176 entropy_tracker_.RecordPacketEntropyHash(sequence_number, | 176 entropy_tracker_.RecordPacketEntropyHash(sequence_number, |
177 header.entropy_hash); | 177 header.entropy_hash); |
178 | 178 |
179 receive_algorithm_->RecordIncomingPacket( | 179 receive_algorithm_->RecordIncomingPacket( |
180 bytes, sequence_number, receipt_time); | 180 bytes, sequence_number, receipt_time); |
181 | 181 |
182 received_info_.revived_packets.erase(sequence_number); | 182 ack_frame_.revived_packets.erase(sequence_number); |
183 } | 183 } |
184 | 184 |
185 void QuicReceivedPacketManager::RecordPacketRevived( | 185 void QuicReceivedPacketManager::RecordPacketRevived( |
186 QuicPacketSequenceNumber sequence_number) { | 186 QuicPacketSequenceNumber sequence_number) { |
187 LOG_IF(DFATAL, !IsAwaitingPacket(sequence_number)); | 187 LOG_IF(DFATAL, !IsAwaitingPacket(sequence_number)); |
188 received_info_.revived_packets.insert(sequence_number); | 188 ack_frame_.revived_packets.insert(sequence_number); |
189 } | 189 } |
190 | 190 |
191 bool QuicReceivedPacketManager::IsMissing( | 191 bool QuicReceivedPacketManager::IsMissing( |
192 QuicPacketSequenceNumber sequence_number) { | 192 QuicPacketSequenceNumber sequence_number) { |
193 return ContainsKey(received_info_.missing_packets, sequence_number); | 193 return ContainsKey(ack_frame_.missing_packets, sequence_number); |
194 } | 194 } |
195 | 195 |
196 bool QuicReceivedPacketManager::IsAwaitingPacket( | 196 bool QuicReceivedPacketManager::IsAwaitingPacket( |
197 QuicPacketSequenceNumber sequence_number) { | 197 QuicPacketSequenceNumber sequence_number) { |
198 return ::net::IsAwaitingPacket(received_info_, sequence_number); | 198 return ::net::IsAwaitingPacket(ack_frame_, sequence_number); |
199 } | 199 } |
200 | 200 |
201 void QuicReceivedPacketManager::UpdateReceivedPacketInfo( | 201 void QuicReceivedPacketManager::UpdateReceivedPacketInfo( |
202 ReceivedPacketInfo* received_info, | 202 QuicAckFrame* ack_frame, QuicTime approximate_now) { |
203 QuicTime approximate_now) { | 203 *ack_frame = ack_frame_; |
204 *received_info = received_info_; | 204 ack_frame->entropy_hash = EntropyHash(ack_frame_.largest_observed); |
205 received_info->entropy_hash = EntropyHash(received_info_.largest_observed); | |
206 | 205 |
207 if (time_largest_observed_ == QuicTime::Zero()) { | 206 if (time_largest_observed_ == QuicTime::Zero()) { |
208 // We have received no packets. | 207 // We have received no packets. |
209 received_info->delta_time_largest_observed = QuicTime::Delta::Infinite(); | 208 ack_frame->delta_time_largest_observed = QuicTime::Delta::Infinite(); |
210 return; | 209 return; |
211 } | 210 } |
212 | 211 |
213 if (approximate_now < time_largest_observed_) { | 212 if (approximate_now < time_largest_observed_) { |
214 // Approximate now may well be "in the past". | 213 // Approximate now may well be "in the past". |
215 received_info->delta_time_largest_observed = QuicTime::Delta::Zero(); | 214 ack_frame->delta_time_largest_observed = QuicTime::Delta::Zero(); |
216 return; | 215 return; |
217 } | 216 } |
218 | 217 |
219 received_info->delta_time_largest_observed = | 218 ack_frame->delta_time_largest_observed = |
220 approximate_now.Subtract(time_largest_observed_); | 219 approximate_now.Subtract(time_largest_observed_); |
221 } | 220 } |
222 | 221 |
223 bool QuicReceivedPacketManager::GenerateCongestionFeedback( | 222 bool QuicReceivedPacketManager::GenerateCongestionFeedback( |
224 QuicCongestionFeedbackFrame* feedback) { | 223 QuicCongestionFeedbackFrame* feedback) { |
225 return receive_algorithm_->GenerateCongestionFeedback(feedback); | 224 return receive_algorithm_->GenerateCongestionFeedback(feedback); |
226 } | 225 } |
227 | 226 |
228 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash( | 227 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash( |
229 QuicPacketSequenceNumber sequence_number) const { | 228 QuicPacketSequenceNumber sequence_number) const { |
230 return entropy_tracker_.EntropyHash(sequence_number); | 229 return entropy_tracker_.EntropyHash(sequence_number); |
231 } | 230 } |
232 | 231 |
233 void QuicReceivedPacketManager::UpdatePacketInformationReceivedByPeer( | 232 void QuicReceivedPacketManager::UpdatePacketInformationReceivedByPeer( |
234 const ReceivedPacketInfo& received_info) { | 233 const QuicAckFrame& ack_frame) { |
235 // ValidateAck should fail if largest_observed ever shrinks. | 234 // ValidateAck should fail if largest_observed ever shrinks. |
236 DCHECK_LE(peer_largest_observed_packet_, received_info.largest_observed); | 235 DCHECK_LE(peer_largest_observed_packet_, ack_frame.largest_observed); |
237 peer_largest_observed_packet_ = received_info.largest_observed; | 236 peer_largest_observed_packet_ = ack_frame.largest_observed; |
238 | 237 |
239 if (received_info.missing_packets.empty()) { | 238 if (ack_frame.missing_packets.empty()) { |
240 least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1; | 239 least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1; |
241 } else { | 240 } else { |
242 least_packet_awaited_by_peer_ = *(received_info.missing_packets.begin()); | 241 least_packet_awaited_by_peer_ = *(ack_frame.missing_packets.begin()); |
243 } | 242 } |
244 } | 243 } |
245 | 244 |
246 bool QuicReceivedPacketManager::DontWaitForPacketsBefore( | 245 bool QuicReceivedPacketManager::DontWaitForPacketsBefore( |
247 QuicPacketSequenceNumber least_unacked) { | 246 QuicPacketSequenceNumber least_unacked) { |
248 received_info_.revived_packets.erase( | 247 ack_frame_.revived_packets.erase( |
249 received_info_.revived_packets.begin(), | 248 ack_frame_.revived_packets.begin(), |
250 received_info_.revived_packets.lower_bound(least_unacked)); | 249 ack_frame_.revived_packets.lower_bound(least_unacked)); |
251 size_t missing_packets_count = received_info_.missing_packets.size(); | 250 size_t missing_packets_count = ack_frame_.missing_packets.size(); |
252 received_info_.missing_packets.erase( | 251 ack_frame_.missing_packets.erase( |
253 received_info_.missing_packets.begin(), | 252 ack_frame_.missing_packets.begin(), |
254 received_info_.missing_packets.lower_bound(least_unacked)); | 253 ack_frame_.missing_packets.lower_bound(least_unacked)); |
255 return missing_packets_count != received_info_.missing_packets.size(); | 254 return missing_packets_count != ack_frame_.missing_packets.size(); |
256 } | 255 } |
257 | 256 |
258 void QuicReceivedPacketManager::UpdatePacketInformationSentByPeer( | 257 void QuicReceivedPacketManager::UpdatePacketInformationSentByPeer( |
259 const QuicStopWaitingFrame& stop_waiting) { | 258 const QuicStopWaitingFrame& stop_waiting) { |
260 // ValidateAck() should fail if peer_least_packet_awaiting_ack_ shrinks. | 259 // ValidateAck() should fail if peer_least_packet_awaiting_ack_ shrinks. |
261 DCHECK_LE(peer_least_packet_awaiting_ack_, stop_waiting.least_unacked); | 260 DCHECK_LE(peer_least_packet_awaiting_ack_, stop_waiting.least_unacked); |
262 if (stop_waiting.least_unacked > peer_least_packet_awaiting_ack_) { | 261 if (stop_waiting.least_unacked > peer_least_packet_awaiting_ack_) { |
263 bool missed_packets = DontWaitForPacketsBefore(stop_waiting.least_unacked); | 262 bool missed_packets = DontWaitForPacketsBefore(stop_waiting.least_unacked); |
264 if (missed_packets) { | 263 if (missed_packets) { |
265 DVLOG(1) << "Updating entropy hashed since we missed packets"; | 264 DVLOG(1) << "Updating entropy hashed since we missed packets"; |
266 // There were some missing packets that we won't ever get now. Recalculate | 265 // There were some missing packets that we won't ever get now. Recalculate |
267 // the received entropy hash. | 266 // the received entropy hash. |
268 entropy_tracker_.SetCumulativeEntropyUpTo(stop_waiting.least_unacked, | 267 entropy_tracker_.SetCumulativeEntropyUpTo(stop_waiting.least_unacked, |
269 stop_waiting.entropy_hash); | 268 stop_waiting.entropy_hash); |
270 } | 269 } |
271 peer_least_packet_awaiting_ack_ = stop_waiting.least_unacked; | 270 peer_least_packet_awaiting_ack_ = stop_waiting.least_unacked; |
272 } | 271 } |
273 DCHECK(received_info_.missing_packets.empty() || | 272 DCHECK(ack_frame_.missing_packets.empty() || |
274 *received_info_.missing_packets.begin() >= | 273 *ack_frame_.missing_packets.begin() >= |
275 peer_least_packet_awaiting_ack_); | 274 peer_least_packet_awaiting_ack_); |
276 } | 275 } |
277 | 276 |
278 bool QuicReceivedPacketManager::HasMissingPackets() { | 277 bool QuicReceivedPacketManager::HasMissingPackets() { |
279 return !received_info_.missing_packets.empty(); | 278 return !ack_frame_.missing_packets.empty(); |
280 } | 279 } |
281 | 280 |
282 bool QuicReceivedPacketManager::HasNewMissingPackets() { | 281 bool QuicReceivedPacketManager::HasNewMissingPackets() { |
283 return HasMissingPackets() && | 282 return HasMissingPackets() && |
284 (received_info_.largest_observed - | 283 (ack_frame_.largest_observed - |
285 *received_info_.missing_packets.rbegin()) <= kMaxPacketsAfterNewMissing; | 284 *ack_frame_.missing_packets.rbegin()) <= kMaxPacketsAfterNewMissing; |
286 } | 285 } |
287 | 286 |
288 } // namespace net | 287 } // namespace net |
OLD | NEW |