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

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

Issue 1811043002: Landing Recent QUIC changes until 2016-03-15 16:26 UTC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add an export clause. Created 4 years, 9 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 <limits> 7 #include <limits>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/stl_util.h" 11 #include "base/stl_util.h"
12 #include "base/strings/stringprintf.h" 12 #include "base/strings/stringprintf.h"
13 #include "net/base/linked_hash_map.h" 13 #include "net/base/linked_hash_map.h"
14 #include "net/quic/crypto/crypto_protocol.h" 14 #include "net/quic/crypto/crypto_protocol.h"
15 #include "net/quic/quic_bug_tracker.h" 15 #include "net/quic/quic_bug_tracker.h"
16 #include "net/quic/quic_connection_stats.h" 16 #include "net/quic/quic_connection_stats.h"
17 #include "net/quic/quic_flags.h"
17 18
18 using std::max; 19 using std::max;
19 using std::min; 20 using std::min;
20 using std::numeric_limits; 21 using std::numeric_limits;
21 22
22 namespace net { 23 namespace net {
23 24
24 namespace { 25 namespace {
25 26
26 // The maximum number of packets to ack immediately after a missing packet for 27 // The maximum number of packets to ack immediately after a missing packet for
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
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,
146 QuicTime receipt_time) { 147 QuicTime receipt_time) {
147 QuicPacketNumber packet_number = header.packet_number; 148 QuicPacketNumber packet_number = header.packet_number;
148 DCHECK(IsAwaitingPacket(packet_number)); 149 DCHECK(IsAwaitingPacket(packet_number));
150 if (FLAGS_quic_dont_copy_acks && !ack_frame_updated_) {
151 ack_frame_.received_packet_times.clear();
152 }
149 ack_frame_updated_ = true; 153 ack_frame_updated_ = true;
150
151 // Adds the range of packet numbers from max(largest observed + 1, least 154 // Adds the range of packet numbers from max(largest observed + 1, least
152 // awaiting ack) up to packet_number not including packet_number. 155 // awaiting ack) up to packet_number not including packet_number.
153 ack_frame_.missing_packets.Add( 156 ack_frame_.missing_packets.Add(
154 max(ack_frame_.largest_observed + 1, peer_least_packet_awaiting_ack_), 157 max(ack_frame_.largest_observed + 1, peer_least_packet_awaiting_ack_),
155 packet_number); 158 packet_number);
156 159
157 if (ack_frame_.largest_observed > packet_number) { 160 if (ack_frame_.largest_observed > packet_number) {
158 // We've gotten one of the out of order packets - remove it from our 161 // We've gotten one of the out of order packets - remove it from our
159 // "missing packets" list. 162 // "missing packets" list.
160 DVLOG(1) << "Removing " << packet_number << " from missing list"; 163 DVLOG(1) << "Removing " << packet_number << " from missing list";
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 // to express. 201 // to express.
199 bool operator()(const std::pair<QuicPacketNumber, QuicTime>& p) const { 202 bool operator()(const std::pair<QuicPacketNumber, QuicTime>& p) const {
200 return largest_observed_ - p.first >= numeric_limits<uint8_t>::max(); 203 return largest_observed_ - p.first >= numeric_limits<uint8_t>::max();
201 } 204 }
202 }; 205 };
203 } // namespace 206 } // namespace
204 207
205 void QuicReceivedPacketManager::UpdateReceivedPacketInfo( 208 void QuicReceivedPacketManager::UpdateReceivedPacketInfo(
206 QuicAckFrame* ack_frame, 209 QuicAckFrame* ack_frame,
207 QuicTime approximate_now) { 210 QuicTime approximate_now) {
211 DCHECK(!FLAGS_quic_dont_copy_acks);
208 ack_frame_updated_ = false; 212 ack_frame_updated_ = false;
209 *ack_frame = ack_frame_; 213 *ack_frame = ack_frame_;
210 ack_frame->entropy_hash = EntropyHash(ack_frame_.largest_observed); 214 ack_frame->entropy_hash = EntropyHash(ack_frame_.largest_observed);
211 215
212 if (time_largest_observed_ == QuicTime::Zero()) { 216 if (time_largest_observed_ == QuicTime::Zero()) {
213 // We have received no packets. 217 // We have received no packets.
214 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); 218 ack_frame->ack_delay_time = QuicTime::Delta::Infinite();
215 return; 219 return;
216 } 220 }
217 221
218 // Ensure the delta is zero if approximate now is "in the past". 222 // Ensure the delta is zero if approximate now is "in the past".
219 ack_frame->ack_delay_time = 223 ack_frame->ack_delay_time =
220 approximate_now < time_largest_observed_ 224 approximate_now < time_largest_observed_
221 ? QuicTime::Delta::Zero() 225 ? QuicTime::Delta::Zero()
222 : approximate_now.Subtract(time_largest_observed_); 226 : approximate_now.Subtract(time_largest_observed_);
223 227
224 // Clear all packet times if any are too far from largest observed. 228 // Clear all packet times if any are too far from largest observed.
225 // It's expected this is extremely rare. 229 // It's expected this is extremely rare.
226 for (PacketTimeVector::iterator it = ack_frame_.received_packet_times.begin(); 230 for (PacketTimeVector::iterator it = ack_frame_.received_packet_times.begin();
227 it != ack_frame_.received_packet_times.end();) { 231 it != ack_frame_.received_packet_times.end();) {
228 if (ack_frame_.largest_observed - it->first >= 232 if (ack_frame_.largest_observed - it->first >=
229 numeric_limits<uint8_t>::max()) { 233 numeric_limits<uint8_t>::max()) {
230 it = ack_frame_.received_packet_times.erase(it); 234 it = ack_frame_.received_packet_times.erase(it);
231 } else { 235 } else {
232 ++it; 236 ++it;
233 } 237 }
234 } 238 }
235 239
236 // TODO(ianswett): Instead of transferring all the information over,
237 // consider giving the QuicPacketGenerator a reference to this ack frame
238 // and clear it afterwards.
239 ack_frame->received_packet_times.clear(); 240 ack_frame->received_packet_times.clear();
240 ack_frame->received_packet_times.swap(ack_frame_.received_packet_times); 241 ack_frame->received_packet_times.swap(ack_frame_.received_packet_times);
241 } 242 }
242 243
244 const QuicFrame QuicReceivedPacketManager::GetUpdatedAckFrame(
245 QuicTime approximate_now) {
246 ack_frame_updated_ = false;
247 ack_frame_.entropy_hash = EntropyHash(ack_frame_.largest_observed);
248
249 if (time_largest_observed_ == QuicTime::Zero()) {
250 // We have received no packets.
251 ack_frame_.ack_delay_time = QuicTime::Delta::Infinite();
252 } else {
253 // Ensure the delta is zero if approximate now is "in the past".
254 ack_frame_.ack_delay_time =
255 approximate_now < time_largest_observed_
256 ? QuicTime::Delta::Zero()
257 : approximate_now.Subtract(time_largest_observed_);
258 }
259
260 // Clear all packet times if any are too far from largest observed.
261 // It's expected this is extremely rare.
262 for (PacketTimeVector::iterator it = ack_frame_.received_packet_times.begin();
263 it != ack_frame_.received_packet_times.end();) {
264 if (ack_frame_.largest_observed - it->first >=
265 numeric_limits<uint8_t>::max()) {
266 it = ack_frame_.received_packet_times.erase(it);
267 } else {
268 ++it;
269 }
270 }
271
272 return QuicFrame(&ack_frame_);
273 }
274
243 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash( 275 QuicPacketEntropyHash QuicReceivedPacketManager::EntropyHash(
244 QuicPacketNumber packet_number) const { 276 QuicPacketNumber packet_number) const {
245 return entropy_tracker_.EntropyHash(packet_number); 277 return entropy_tracker_.EntropyHash(packet_number);
246 } 278 }
247 279
248 bool QuicReceivedPacketManager::DontWaitForPacketsBefore( 280 bool QuicReceivedPacketManager::DontWaitForPacketsBefore(
249 QuicPacketNumber least_unacked) { 281 QuicPacketNumber least_unacked) {
250 return ack_frame_.missing_packets.RemoveUpTo(least_unacked); 282 return ack_frame_.missing_packets.RemoveUpTo(least_unacked);
251 } 283 }
252 284
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 316
285 size_t QuicReceivedPacketManager::NumTrackedPackets() const { 317 size_t QuicReceivedPacketManager::NumTrackedPackets() const {
286 return entropy_tracker_.size(); 318 return entropy_tracker_.size();
287 } 319 }
288 320
289 bool QuicReceivedPacketManager::ack_frame_updated() const { 321 bool QuicReceivedPacketManager::ack_frame_updated() const {
290 return ack_frame_updated_; 322 return ack_frame_updated_;
291 } 323 }
292 324
293 } // namespace net 325 } // 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