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 |