Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: net/quic/quic_received_packet_manager.cc

Issue 478153003: Change the wire format of the ack frame to include a compressed version (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase TOT and pass clock to QuicTestPacketMaker and use it in AckPacket Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_received_packet_manager.h ('k') | net/quic/quic_received_packet_manager_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_received_packet_manager.h ('k') | net/quic/quic_received_packet_manager_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698