| 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 "net/base/linked_hash_map.h" | 8 #include "net/base/linked_hash_map.h" |
| 9 | 9 |
| 10 using std::make_pair; | 10 using std::make_pair; |
| 11 using std::max; | 11 using std::max; |
| 12 using std::min; | 12 using std::min; |
| 13 | 13 |
| 14 namespace net { | 14 namespace net { |
| 15 | 15 |
| 16 QuicReceivedPacketManager::QuicReceivedPacketManager() | 16 QuicReceivedPacketManager::QuicReceivedPacketManager() |
| 17 : packets_entropy_hash_(0), | 17 : packets_entropy_hash_(0), |
| 18 largest_sequence_number_(0), | 18 largest_sequence_number_(0), |
| 19 peer_largest_observed_packet_(0), | 19 peer_largest_observed_packet_(0), |
| 20 least_packet_awaited_by_peer_(1), | 20 least_packet_awaited_by_peer_(1), |
| 21 peer_least_packet_awaiting_ack_(0), | 21 peer_least_packet_awaiting_ack_(0), |
| 22 time_largest_observed_(QuicTime::Zero()) { | 22 time_largest_observed_(QuicTime::Zero()) { |
| 23 received_info_.largest_observed = 0; | 23 received_info_.largest_observed = 0; |
| 24 received_info_.entropy_hash = 0; | 24 received_info_.entropy_hash = 0; |
| 25 } | 25 } |
| 26 | 26 |
| 27 QuicReceivedPacketManager::~QuicReceivedPacketManager() {} | 27 QuicReceivedPacketManager::~QuicReceivedPacketManager() {} |
| 28 | 28 |
| 29 void QuicReceivedPacketManager::RecordPacketReceived( | 29 void QuicReceivedPacketManager::RecordPacketReceived( |
| 30 const QuicPacketHeader& header, QuicTime receipt_time) { | 30 const QuicPacketHeader& header, |
| 31 QuicTime receipt_time) { |
| 31 QuicPacketSequenceNumber sequence_number = header.packet_sequence_number; | 32 QuicPacketSequenceNumber sequence_number = header.packet_sequence_number; |
| 32 DCHECK(IsAwaitingPacket(sequence_number)); | 33 DCHECK(IsAwaitingPacket(sequence_number)); |
| 33 | 34 |
| 34 InsertMissingPacketsBetween( | 35 InsertMissingPacketsBetween( |
| 35 &received_info_, | 36 &received_info_, |
| 36 max(received_info_.largest_observed + 1, peer_least_packet_awaiting_ack_), | 37 max(received_info_.largest_observed + 1, peer_least_packet_awaiting_ack_), |
| 37 header.packet_sequence_number); | 38 header.packet_sequence_number); |
| 38 | 39 |
| 39 if (received_info_.largest_observed > header.packet_sequence_number) { | 40 if (received_info_.largest_observed > header.packet_sequence_number) { |
| 40 // We've gotten one of the out of order packets - remove it from our | 41 // We've gotten one of the out of order packets - remove it from our |
| 41 // "missing packets" list. | 42 // "missing packets" list. |
| 42 DVLOG(1) << "Removing " << sequence_number << " from missing list"; | 43 DVLOG(1) << "Removing " << sequence_number << " from missing list"; |
| 43 received_info_.missing_packets.erase(sequence_number); | 44 received_info_.missing_packets.erase(sequence_number); |
| 44 } | 45 } |
| 45 if (header.packet_sequence_number > received_info_.largest_observed) { | 46 if (header.packet_sequence_number > received_info_.largest_observed) { |
| 46 received_info_.largest_observed = header.packet_sequence_number; | 47 received_info_.largest_observed = header.packet_sequence_number; |
| 47 time_largest_observed_ = receipt_time; | 48 time_largest_observed_ = receipt_time; |
| 48 } | 49 } |
| 49 RecordPacketEntropyHash(sequence_number, header.entropy_hash); | 50 RecordPacketEntropyHash(sequence_number, header.entropy_hash); |
| 50 } | 51 } |
| 51 | 52 |
| 52 bool QuicReceivedPacketManager::IsAwaitingPacket( | 53 bool QuicReceivedPacketManager::IsAwaitingPacket( |
| 53 QuicPacketSequenceNumber sequence_number) { | 54 QuicPacketSequenceNumber sequence_number) { |
| 54 return ::net::IsAwaitingPacket(received_info_, sequence_number); | 55 return ::net::IsAwaitingPacket(received_info_, sequence_number); |
| 55 } | 56 } |
| 56 | 57 |
| 57 void QuicReceivedPacketManager::UpdateReceivedPacketInfo( | 58 void QuicReceivedPacketManager::UpdateReceivedPacketInfo( |
| 58 ReceivedPacketInfo* received_info, QuicTime approximate_now) { | 59 ReceivedPacketInfo* received_info, |
| 60 QuicTime approximate_now) { |
| 59 *received_info = received_info_; | 61 *received_info = received_info_; |
| 60 received_info->entropy_hash = EntropyHash(received_info_.largest_observed); | 62 received_info->entropy_hash = EntropyHash(received_info_.largest_observed); |
| 63 |
| 61 if (time_largest_observed_ == QuicTime::Zero()) { | 64 if (time_largest_observed_ == QuicTime::Zero()) { |
| 62 // We have not received any new higher sequence numbers since we sent our | 65 // We have received no packets. |
| 63 // last ACK. | |
| 64 received_info->delta_time_largest_observed = QuicTime::Delta::Infinite(); | 66 received_info->delta_time_largest_observed = QuicTime::Delta::Infinite(); |
| 65 } else { | 67 return; |
| 66 received_info->delta_time_largest_observed = | 68 } |
| 67 approximate_now.Subtract(time_largest_observed_); | |
| 68 | 69 |
| 69 time_largest_observed_ = QuicTime::Zero(); | 70 if (approximate_now < time_largest_observed_) { |
| 71 // Approximate now may well be "in the past". |
| 72 received_info->delta_time_largest_observed = QuicTime::Delta::Zero(); |
| 73 return; |
| 70 } | 74 } |
| 75 |
| 76 received_info->delta_time_largest_observed = |
| 77 approximate_now.Subtract(time_largest_observed_); |
| 71 } | 78 } |
| 72 | 79 |
| 73 void QuicReceivedPacketManager::RecordPacketEntropyHash( | 80 void QuicReceivedPacketManager::RecordPacketEntropyHash( |
| 74 QuicPacketSequenceNumber sequence_number, | 81 QuicPacketSequenceNumber sequence_number, |
| 75 QuicPacketEntropyHash entropy_hash) { | 82 QuicPacketEntropyHash entropy_hash) { |
| 76 if (sequence_number < largest_sequence_number_) { | 83 if (sequence_number < largest_sequence_number_) { |
| 77 DLOG(INFO) << "Ignoring received packet entropy for sequence_number:" | 84 DLOG(INFO) << "Ignoring received packet entropy for sequence_number:" |
| 78 << sequence_number << " less than largest_peer_sequence_number:" | 85 << sequence_number << " less than largest_peer_sequence_number:" |
| 79 << largest_sequence_number_; | 86 << largest_sequence_number_; |
| 80 return; | 87 return; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 DCHECK(received_info_.missing_packets.empty() || | 192 DCHECK(received_info_.missing_packets.empty() || |
| 186 *received_info_.missing_packets.begin() >= | 193 *received_info_.missing_packets.begin() >= |
| 187 peer_least_packet_awaiting_ack_); | 194 peer_least_packet_awaiting_ack_); |
| 188 } | 195 } |
| 189 | 196 |
| 190 size_t QuicReceivedPacketManager::GetNumMissingPackets() { | 197 size_t QuicReceivedPacketManager::GetNumMissingPackets() { |
| 191 return received_info_.missing_packets.size(); | 198 return received_info_.missing_packets.size(); |
| 192 } | 199 } |
| 193 | 200 |
| 194 } // namespace net | 201 } // namespace net |
| OLD | NEW |