| 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 |