blob: 3a1531bcfa8ba3a20123783cc8e0f0aae6a643ad [file] [log] [blame]
QUICHE teamb23daa72019-03-21 08:37:48 -07001// Copyright 2019 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/uber_received_packet_manager.h"
6
bnc463f2352019-10-10 04:49:34 -07007#include <utility>
8
QUICHE teamb23daa72019-03-21 08:37:48 -07009#include "net/third_party/quiche/src/quic/core/congestion_control/rtt_stats.h"
10#include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
11#include "net/third_party/quiche/src/quic/core/quic_connection_stats.h"
QUICHE team1dfa46b2019-03-22 10:39:10 -070012#include "net/third_party/quiche/src/quic/core/quic_utils.h"
QUICHE teamb23daa72019-03-21 08:37:48 -070013#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
14#include "net/third_party/quiche/src/quic/test_tools/mock_clock.h"
15
16namespace quic {
17namespace test {
18
19class UberReceivedPacketManagerPeer {
20 public:
QUICHE teamb23daa72019-03-21 08:37:48 -070021 static void SetAckDecimationDelay(UberReceivedPacketManager* manager,
22 float ack_decimation_delay) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070023 for (auto& received_packet_manager : manager->received_packet_managers_) {
24 received_packet_manager.ack_decimation_delay_ = ack_decimation_delay;
25 }
QUICHE teamb23daa72019-03-21 08:37:48 -070026 }
27};
28
29namespace {
30
31const bool kInstigateAck = true;
32const QuicTime::Delta kMinRttMs = QuicTime::Delta::FromMilliseconds(40);
33const QuicTime::Delta kDelayedAckTime =
34 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
35
36class UberReceivedPacketManagerTest : public QuicTest {
37 protected:
38 UberReceivedPacketManagerTest() {
vasilvv0fc587f2019-09-06 13:33:08 -070039 manager_ = std::make_unique<UberReceivedPacketManager>(&stats_);
QUICHE teamb23daa72019-03-21 08:37:48 -070040 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
41 rtt_stats_.UpdateRtt(kMinRttMs, QuicTime::Delta::Zero(), QuicTime::Zero());
42 manager_->set_save_timestamps(true);
43 }
44
45 void RecordPacketReceipt(uint64_t packet_number) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070046 RecordPacketReceipt(ENCRYPTION_FORWARD_SECURE, packet_number);
QUICHE teamb23daa72019-03-21 08:37:48 -070047 }
48
49 void RecordPacketReceipt(uint64_t packet_number, QuicTime receipt_time) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070050 RecordPacketReceipt(ENCRYPTION_FORWARD_SECURE, packet_number, receipt_time);
QUICHE teamb23daa72019-03-21 08:37:48 -070051 }
52
QUICHE team1dfa46b2019-03-22 10:39:10 -070053 void RecordPacketReceipt(EncryptionLevel decrypted_packet_level,
54 uint64_t packet_number) {
55 RecordPacketReceipt(decrypted_packet_level, packet_number,
56 QuicTime::Zero());
57 }
58
59 void RecordPacketReceipt(EncryptionLevel decrypted_packet_level,
60 uint64_t packet_number,
61 QuicTime receipt_time) {
62 QuicPacketHeader header;
63 header.packet_number = QuicPacketNumber(packet_number);
64 manager_->RecordPacketReceived(decrypted_packet_level, header,
65 receipt_time);
66 }
67
68 bool HasPendingAck() {
69 if (!manager_->supports_multiple_packet_number_spaces()) {
70 return manager_->GetAckTimeout(APPLICATION_DATA).IsInitialized();
71 }
72 return manager_->GetEarliestAckTimeout().IsInitialized();
73 }
QUICHE teamb23daa72019-03-21 08:37:48 -070074
75 void MaybeUpdateAckTimeout(bool should_last_packet_instigate_acks,
76 uint64_t last_received_packet_number) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070077 MaybeUpdateAckTimeout(should_last_packet_instigate_acks,
78 ENCRYPTION_FORWARD_SECURE,
79 last_received_packet_number);
80 }
81
82 void MaybeUpdateAckTimeout(bool should_last_packet_instigate_acks,
83 EncryptionLevel decrypted_packet_level,
84 uint64_t last_received_packet_number) {
QUICHE teamb23daa72019-03-21 08:37:48 -070085 manager_->MaybeUpdateAckTimeout(
QUICHE team1dfa46b2019-03-22 10:39:10 -070086 should_last_packet_instigate_acks, decrypted_packet_level,
QUICHE teamb23daa72019-03-21 08:37:48 -070087 QuicPacketNumber(last_received_packet_number), clock_.ApproximateNow(),
haoyuewang0cc998a2020-09-08 15:02:22 -070088 &rtt_stats_);
QUICHE teamb23daa72019-03-21 08:37:48 -070089 }
90
91 void CheckAckTimeout(QuicTime time) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070092 DCHECK(HasPendingAck());
93 if (!manager_->supports_multiple_packet_number_spaces()) {
94 DCHECK(manager_->GetAckTimeout(APPLICATION_DATA) == time);
95 if (time <= clock_.ApproximateNow()) {
96 // ACK timeout expires, send an ACK.
97 manager_->ResetAckStates(ENCRYPTION_FORWARD_SECURE);
98 DCHECK(!HasPendingAck());
99 }
100 return;
101 }
102 DCHECK(manager_->GetEarliestAckTimeout() == time);
103 // Send all expired ACKs.
104 for (int8_t i = INITIAL_DATA; i < NUM_PACKET_NUMBER_SPACES; ++i) {
105 const QuicTime ack_timeout =
106 manager_->GetAckTimeout(static_cast<PacketNumberSpace>(i));
107 if (!ack_timeout.IsInitialized() ||
108 ack_timeout > clock_.ApproximateNow()) {
109 continue;
110 }
111 manager_->ResetAckStates(
112 QuicUtils::GetEncryptionLevel(static_cast<PacketNumberSpace>(i)));
QUICHE teamb23daa72019-03-21 08:37:48 -0700113 }
114 }
115
116 MockClock clock_;
117 RttStats rtt_stats_;
118 QuicConnectionStats stats_;
119 std::unique_ptr<UberReceivedPacketManager> manager_;
120};
121
122TEST_F(UberReceivedPacketManagerTest, DontWaitForPacketsBefore) {
fayang5d92c412020-02-19 12:10:31 -0800123 EXPECT_TRUE(manager_->IsAckFrameEmpty(APPLICATION_DATA));
QUICHE team1dfa46b2019-03-22 10:39:10 -0700124 RecordPacketReceipt(2);
fayang5d92c412020-02-19 12:10:31 -0800125 EXPECT_FALSE(manager_->IsAckFrameEmpty(APPLICATION_DATA));
QUICHE team1dfa46b2019-03-22 10:39:10 -0700126 RecordPacketReceipt(7);
127 EXPECT_TRUE(manager_->IsAwaitingPacket(ENCRYPTION_FORWARD_SECURE,
128 QuicPacketNumber(3u)));
129 EXPECT_TRUE(manager_->IsAwaitingPacket(ENCRYPTION_FORWARD_SECURE,
130 QuicPacketNumber(6u)));
131 manager_->DontWaitForPacketsBefore(ENCRYPTION_FORWARD_SECURE,
132 QuicPacketNumber(4));
133 EXPECT_FALSE(manager_->IsAwaitingPacket(ENCRYPTION_FORWARD_SECURE,
134 QuicPacketNumber(3u)));
135 EXPECT_TRUE(manager_->IsAwaitingPacket(ENCRYPTION_FORWARD_SECURE,
136 QuicPacketNumber(6u)));
QUICHE teamb23daa72019-03-21 08:37:48 -0700137}
138
139TEST_F(UberReceivedPacketManagerTest, GetUpdatedAckFrame) {
QUICHE teamb23daa72019-03-21 08:37:48 -0700140 QuicTime two_ms = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(2);
QUICHE team1dfa46b2019-03-22 10:39:10 -0700141 EXPECT_FALSE(manager_->IsAckFrameUpdated());
142 RecordPacketReceipt(2, two_ms);
143 EXPECT_TRUE(manager_->IsAckFrameUpdated());
QUICHE teamb23daa72019-03-21 08:37:48 -0700144
QUICHE team1dfa46b2019-03-22 10:39:10 -0700145 QuicFrame ack =
146 manager_->GetUpdatedAckFrame(APPLICATION_DATA, QuicTime::Zero());
147 manager_->ResetAckStates(ENCRYPTION_FORWARD_SECURE);
148 EXPECT_FALSE(manager_->IsAckFrameUpdated());
QUICHE teamb23daa72019-03-21 08:37:48 -0700149 // When UpdateReceivedPacketInfo with a time earlier than the time of the
150 // largest observed packet, make sure that the delta is 0, not negative.
151 EXPECT_EQ(QuicTime::Delta::Zero(), ack.ack_frame->ack_delay_time);
152 EXPECT_EQ(1u, ack.ack_frame->received_packet_times.size());
153
154 QuicTime four_ms = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(4);
QUICHE team1dfa46b2019-03-22 10:39:10 -0700155 ack = manager_->GetUpdatedAckFrame(APPLICATION_DATA, four_ms);
156 manager_->ResetAckStates(ENCRYPTION_FORWARD_SECURE);
157 EXPECT_FALSE(manager_->IsAckFrameUpdated());
QUICHE teamb23daa72019-03-21 08:37:48 -0700158 // When UpdateReceivedPacketInfo after not having received a new packet,
159 // the delta should still be accurate.
160 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(2),
161 ack.ack_frame->ack_delay_time);
162 // And received packet times won't have change.
163 EXPECT_EQ(1u, ack.ack_frame->received_packet_times.size());
164
QUICHE team1dfa46b2019-03-22 10:39:10 -0700165 RecordPacketReceipt(999, two_ms);
166 RecordPacketReceipt(4, two_ms);
167 RecordPacketReceipt(1000, two_ms);
168 EXPECT_TRUE(manager_->IsAckFrameUpdated());
169 ack = manager_->GetUpdatedAckFrame(APPLICATION_DATA, two_ms);
170 manager_->ResetAckStates(ENCRYPTION_FORWARD_SECURE);
171 EXPECT_FALSE(manager_->IsAckFrameUpdated());
QUICHE teamb23daa72019-03-21 08:37:48 -0700172 // UpdateReceivedPacketInfo should discard any times which can't be
173 // expressed on the wire.
174 EXPECT_EQ(2u, ack.ack_frame->received_packet_times.size());
175}
176
177TEST_F(UberReceivedPacketManagerTest, UpdateReceivedConnectionStats) {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700178 EXPECT_FALSE(manager_->IsAckFrameUpdated());
QUICHE teamb23daa72019-03-21 08:37:48 -0700179 RecordPacketReceipt(1);
QUICHE team1dfa46b2019-03-22 10:39:10 -0700180 EXPECT_TRUE(manager_->IsAckFrameUpdated());
QUICHE teamb23daa72019-03-21 08:37:48 -0700181 RecordPacketReceipt(6);
182 RecordPacketReceipt(2,
183 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1));
184
185 EXPECT_EQ(4u, stats_.max_sequence_reordering);
186 EXPECT_EQ(1000, stats_.max_time_reordering_us);
187 EXPECT_EQ(1u, stats_.packets_reordered);
188}
189
190TEST_F(UberReceivedPacketManagerTest, LimitAckRanges) {
191 manager_->set_max_ack_ranges(10);
QUICHE team1dfa46b2019-03-22 10:39:10 -0700192 EXPECT_FALSE(manager_->IsAckFrameUpdated());
QUICHE teamb23daa72019-03-21 08:37:48 -0700193 for (int i = 0; i < 100; ++i) {
194 RecordPacketReceipt(1 + 2 * i);
QUICHE team1dfa46b2019-03-22 10:39:10 -0700195 EXPECT_TRUE(manager_->IsAckFrameUpdated());
196 manager_->GetUpdatedAckFrame(APPLICATION_DATA, QuicTime::Zero());
QUICHE teamb23daa72019-03-21 08:37:48 -0700197 EXPECT_GE(10u, manager_->ack_frame().packets.NumIntervals());
198 EXPECT_EQ(QuicPacketNumber(1u + 2 * i),
199 manager_->ack_frame().packets.Max());
200 for (int j = 0; j < std::min(10, i + 1); ++j) {
201 ASSERT_GE(i, j);
202 EXPECT_TRUE(manager_->ack_frame().packets.Contains(
203 QuicPacketNumber(1 + (i - j) * 2)));
204 if (i > j) {
205 EXPECT_FALSE(manager_->ack_frame().packets.Contains(
206 QuicPacketNumber((i - j) * 2)));
207 }
208 }
209 }
210}
211
212TEST_F(UberReceivedPacketManagerTest, IgnoreOutOfOrderTimestamps) {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700213 EXPECT_FALSE(manager_->IsAckFrameUpdated());
QUICHE teamb23daa72019-03-21 08:37:48 -0700214 RecordPacketReceipt(1, QuicTime::Zero());
QUICHE team1dfa46b2019-03-22 10:39:10 -0700215 EXPECT_TRUE(manager_->IsAckFrameUpdated());
QUICHE teamb23daa72019-03-21 08:37:48 -0700216 EXPECT_EQ(1u, manager_->ack_frame().received_packet_times.size());
217 RecordPacketReceipt(2,
218 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1));
219 EXPECT_EQ(2u, manager_->ack_frame().received_packet_times.size());
220 RecordPacketReceipt(3, QuicTime::Zero());
221 EXPECT_EQ(2u, manager_->ack_frame().received_packet_times.size());
222}
223
224TEST_F(UberReceivedPacketManagerTest, OutOfOrderReceiptCausesAckSent) {
225 EXPECT_FALSE(HasPendingAck());
226
227 RecordPacketReceipt(3, clock_.ApproximateNow());
228 MaybeUpdateAckTimeout(kInstigateAck, 3);
fayang6dba4902019-06-17 10:04:23 -0700229 // Delayed ack is scheduled.
230 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
QUICHE teamb23daa72019-03-21 08:37:48 -0700231
232 RecordPacketReceipt(2, clock_.ApproximateNow());
233 MaybeUpdateAckTimeout(kInstigateAck, 2);
234 CheckAckTimeout(clock_.ApproximateNow());
235
236 RecordPacketReceipt(1, clock_.ApproximateNow());
237 MaybeUpdateAckTimeout(kInstigateAck, 1);
238 // Should ack immediately, since this fills the last hole.
239 CheckAckTimeout(clock_.ApproximateNow());
240
241 RecordPacketReceipt(4, clock_.ApproximateNow());
242 MaybeUpdateAckTimeout(kInstigateAck, 4);
243 // Delayed ack is scheduled.
244 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
245}
246
247TEST_F(UberReceivedPacketManagerTest, OutOfOrderAckReceiptCausesNoAck) {
248 EXPECT_FALSE(HasPendingAck());
249
250 RecordPacketReceipt(2, clock_.ApproximateNow());
251 MaybeUpdateAckTimeout(!kInstigateAck, 2);
252 EXPECT_FALSE(HasPendingAck());
253
254 RecordPacketReceipt(1, clock_.ApproximateNow());
255 MaybeUpdateAckTimeout(!kInstigateAck, 1);
256 EXPECT_FALSE(HasPendingAck());
257}
258
259TEST_F(UberReceivedPacketManagerTest, AckReceiptCausesAckSend) {
260 EXPECT_FALSE(HasPendingAck());
261
262 RecordPacketReceipt(1, clock_.ApproximateNow());
263 MaybeUpdateAckTimeout(!kInstigateAck, 1);
264 EXPECT_FALSE(HasPendingAck());
265
266 RecordPacketReceipt(2, clock_.ApproximateNow());
267 MaybeUpdateAckTimeout(!kInstigateAck, 2);
268 EXPECT_FALSE(HasPendingAck());
269
270 RecordPacketReceipt(3, clock_.ApproximateNow());
271 MaybeUpdateAckTimeout(kInstigateAck, 3);
272 // Delayed ack is scheduled.
273 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
274 clock_.AdvanceTime(kDelayedAckTime);
275 CheckAckTimeout(clock_.ApproximateNow());
276
277 RecordPacketReceipt(4, clock_.ApproximateNow());
278 MaybeUpdateAckTimeout(!kInstigateAck, 4);
279 EXPECT_FALSE(HasPendingAck());
280
281 RecordPacketReceipt(5, clock_.ApproximateNow());
282 MaybeUpdateAckTimeout(!kInstigateAck, 5);
283 EXPECT_FALSE(HasPendingAck());
284}
285
286TEST_F(UberReceivedPacketManagerTest, AckSentEveryNthPacket) {
287 EXPECT_FALSE(HasPendingAck());
haoyuewange7415a52020-07-27 17:12:26 -0700288 manager_->set_ack_frequency(3);
QUICHE teamb23daa72019-03-21 08:37:48 -0700289
290 // Receives packets 1 - 39.
291 for (size_t i = 1; i <= 39; ++i) {
292 RecordPacketReceipt(i, clock_.ApproximateNow());
293 MaybeUpdateAckTimeout(kInstigateAck, i);
294 if (i % 3 == 0) {
295 CheckAckTimeout(clock_.ApproximateNow());
296 } else {
297 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
298 }
299 }
300}
301
302TEST_F(UberReceivedPacketManagerTest, AckDecimationReducesAcks) {
303 EXPECT_FALSE(HasPendingAck());
QUICHE teamb23daa72019-03-21 08:37:48 -0700304
305 // Start ack decimation from 10th packet.
306 manager_->set_min_received_before_ack_decimation(10);
307
308 // Receives packets 1 - 29.
309 for (size_t i = 1; i <= 29; ++i) {
310 RecordPacketReceipt(i, clock_.ApproximateNow());
311 MaybeUpdateAckTimeout(kInstigateAck, i);
312 if (i <= 10) {
313 // For packets 1-10, ack every 2 packets.
314 if (i % 2 == 0) {
315 CheckAckTimeout(clock_.ApproximateNow());
316 } else {
317 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
318 }
319 continue;
320 }
321 // ack at 20.
322 if (i == 20) {
323 CheckAckTimeout(clock_.ApproximateNow());
324 } else {
325 CheckAckTimeout(clock_.ApproximateNow() + kMinRttMs * 0.25);
326 }
327 }
328
329 // We now receive the 30th packet, and so we send an ack.
330 RecordPacketReceipt(30, clock_.ApproximateNow());
331 MaybeUpdateAckTimeout(kInstigateAck, 30);
332 CheckAckTimeout(clock_.ApproximateNow());
333}
334
QUICHE teamb23daa72019-03-21 08:37:48 -0700335TEST_F(UberReceivedPacketManagerTest, SendDelayedAckDecimation) {
336 EXPECT_FALSE(HasPendingAck());
QUICHE teamb23daa72019-03-21 08:37:48 -0700337 // The ack time should be based on min_rtt * 1/4, since it's less than the
338 // default delayed ack time.
339 QuicTime ack_time = clock_.ApproximateNow() + kMinRttMs * 0.25;
340
341 // Process all the packets in order so there aren't missing packets.
342 uint64_t kFirstDecimatedPacket = 101;
343 for (uint64_t i = 1; i < kFirstDecimatedPacket; ++i) {
344 RecordPacketReceipt(i, clock_.ApproximateNow());
345 MaybeUpdateAckTimeout(kInstigateAck, i);
346 if (i % 2 == 0) {
347 // Ack every 2 packets by default.
348 CheckAckTimeout(clock_.ApproximateNow());
349 } else {
350 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
351 }
352 }
353
354 RecordPacketReceipt(kFirstDecimatedPacket, clock_.ApproximateNow());
355 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket);
356 CheckAckTimeout(ack_time);
357
358 // The 10th received packet causes an ack to be sent.
359 for (uint64_t i = 1; i < 10; ++i) {
360 RecordPacketReceipt(kFirstDecimatedPacket + i, clock_.ApproximateNow());
361 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + i);
362 }
363 CheckAckTimeout(clock_.ApproximateNow());
364}
365
366TEST_F(UberReceivedPacketManagerTest,
QUICHE teamb23daa72019-03-21 08:37:48 -0700367 SendDelayedAckDecimationUnlimitedAggregation) {
368 EXPECT_FALSE(HasPendingAck());
369 QuicConfig config;
370 QuicTagVector connection_options;
371 connection_options.push_back(kACKD);
372 // No limit on the number of packets received before sending an ack.
373 connection_options.push_back(kAKDU);
374 config.SetConnectionOptionsToSend(connection_options);
375 manager_->SetFromConfig(config, Perspective::IS_CLIENT);
376
377 // The ack time should be based on min_rtt/4, since it's less than the
378 // default delayed ack time.
379 QuicTime ack_time = clock_.ApproximateNow() + kMinRttMs * 0.25;
380
381 // Process all the initial packets in order so there aren't missing packets.
382 uint64_t kFirstDecimatedPacket = 101;
383 for (uint64_t i = 1; i < kFirstDecimatedPacket; ++i) {
384 RecordPacketReceipt(i, clock_.ApproximateNow());
385 MaybeUpdateAckTimeout(kInstigateAck, i);
386 if (i % 2 == 0) {
387 // Ack every 2 packets by default.
388 CheckAckTimeout(clock_.ApproximateNow());
389 } else {
390 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
391 }
392 }
393
394 RecordPacketReceipt(kFirstDecimatedPacket, clock_.ApproximateNow());
395 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket);
396 CheckAckTimeout(ack_time);
397
398 // 18 packets will not cause an ack to be sent. 19 will because when
399 // stop waiting frames are in use, we ack every 20 packets no matter what.
400 for (int i = 1; i <= 18; ++i) {
401 RecordPacketReceipt(kFirstDecimatedPacket + i, clock_.ApproximateNow());
402 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + i);
403 }
404 CheckAckTimeout(ack_time);
405}
406
407TEST_F(UberReceivedPacketManagerTest, SendDelayedAckDecimationEighthRtt) {
408 EXPECT_FALSE(HasPendingAck());
QUICHE teamb23daa72019-03-21 08:37:48 -0700409 UberReceivedPacketManagerPeer::SetAckDecimationDelay(manager_.get(), 0.125);
410
411 // The ack time should be based on min_rtt/8, since it's less than the
412 // default delayed ack time.
413 QuicTime ack_time = clock_.ApproximateNow() + kMinRttMs * 0.125;
414
415 // Process all the packets in order so there aren't missing packets.
416 uint64_t kFirstDecimatedPacket = 101;
417 for (uint64_t i = 1; i < kFirstDecimatedPacket; ++i) {
418 RecordPacketReceipt(i, clock_.ApproximateNow());
419 MaybeUpdateAckTimeout(kInstigateAck, i);
420 if (i % 2 == 0) {
421 // Ack every 2 packets by default.
422 CheckAckTimeout(clock_.ApproximateNow());
423 } else {
424 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
425 }
426 }
427
428 RecordPacketReceipt(kFirstDecimatedPacket, clock_.ApproximateNow());
429 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket);
430 CheckAckTimeout(ack_time);
431
432 // The 10th received packet causes an ack to be sent.
433 for (uint64_t i = 1; i < 10; ++i) {
434 RecordPacketReceipt(kFirstDecimatedPacket + i, clock_.ApproximateNow());
435 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + i);
436 }
437 CheckAckTimeout(clock_.ApproximateNow());
438}
439
QUICHE team1dfa46b2019-03-22 10:39:10 -0700440TEST_F(UberReceivedPacketManagerTest,
441 DontWaitForPacketsBeforeMultiplePacketNumberSpaces) {
ianswettb39b6ab2020-10-22 11:54:06 -0700442 manager_->EnableMultiplePacketNumberSpacesSupport(Perspective::IS_CLIENT);
QUICHE team1dfa46b2019-03-22 10:39:10 -0700443 EXPECT_FALSE(
444 manager_->GetLargestObserved(ENCRYPTION_HANDSHAKE).IsInitialized());
445 EXPECT_FALSE(
446 manager_->GetLargestObserved(ENCRYPTION_FORWARD_SECURE).IsInitialized());
447 RecordPacketReceipt(ENCRYPTION_HANDSHAKE, 2);
448 RecordPacketReceipt(ENCRYPTION_HANDSHAKE, 4);
449 RecordPacketReceipt(ENCRYPTION_FORWARD_SECURE, 3);
450 RecordPacketReceipt(ENCRYPTION_FORWARD_SECURE, 7);
451 EXPECT_EQ(QuicPacketNumber(4),
452 manager_->GetLargestObserved(ENCRYPTION_HANDSHAKE));
453 EXPECT_EQ(QuicPacketNumber(7),
454 manager_->GetLargestObserved(ENCRYPTION_FORWARD_SECURE));
455
456 EXPECT_TRUE(
457 manager_->IsAwaitingPacket(ENCRYPTION_HANDSHAKE, QuicPacketNumber(3)));
458 EXPECT_FALSE(manager_->IsAwaitingPacket(ENCRYPTION_FORWARD_SECURE,
459 QuicPacketNumber(3)));
460 EXPECT_TRUE(manager_->IsAwaitingPacket(ENCRYPTION_FORWARD_SECURE,
461 QuicPacketNumber(4)));
462
463 manager_->DontWaitForPacketsBefore(ENCRYPTION_FORWARD_SECURE,
464 QuicPacketNumber(5));
465 EXPECT_TRUE(
466 manager_->IsAwaitingPacket(ENCRYPTION_HANDSHAKE, QuicPacketNumber(3)));
467 EXPECT_FALSE(manager_->IsAwaitingPacket(ENCRYPTION_FORWARD_SECURE,
468 QuicPacketNumber(4)));
469}
470
471TEST_F(UberReceivedPacketManagerTest, AckSendingDifferentPacketNumberSpaces) {
ianswettb39b6ab2020-10-22 11:54:06 -0700472 manager_->EnableMultiplePacketNumberSpacesSupport(Perspective::IS_SERVER);
QUICHE team1dfa46b2019-03-22 10:39:10 -0700473 EXPECT_FALSE(HasPendingAck());
474 EXPECT_FALSE(manager_->IsAckFrameUpdated());
475
ianswettb39b6ab2020-10-22 11:54:06 -0700476 RecordPacketReceipt(ENCRYPTION_INITIAL, 3);
477 EXPECT_TRUE(manager_->IsAckFrameUpdated());
478 MaybeUpdateAckTimeout(kInstigateAck, ENCRYPTION_INITIAL, 3);
479 EXPECT_TRUE(HasPendingAck());
480 // Delayed ack is scheduled.
481 if (GetQuicReloadableFlag(quic_delay_initial_ack)) {
482 CheckAckTimeout(clock_.ApproximateNow() +
483 QuicTime::Delta::FromMilliseconds(25));
484 // Send delayed handshake data ACK.
485 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(25));
486 } else {
487 CheckAckTimeout(clock_.ApproximateNow() +
488 QuicTime::Delta::FromMilliseconds(1));
489 // Send delayed handshake data ACK.
490 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
491 }
492 CheckAckTimeout(clock_.ApproximateNow());
493 EXPECT_FALSE(HasPendingAck());
494
495 // Second delayed ack should have a shorter delay.
496 RecordPacketReceipt(ENCRYPTION_INITIAL, 4);
497 EXPECT_TRUE(manager_->IsAckFrameUpdated());
498 MaybeUpdateAckTimeout(kInstigateAck, ENCRYPTION_INITIAL, 4);
499 EXPECT_TRUE(HasPendingAck());
500 // Delayed ack is scheduled.
501 CheckAckTimeout(clock_.ApproximateNow() +
502 QuicTime::Delta::FromMilliseconds(1));
503 // Send delayed handshake data ACK.
504 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
505 CheckAckTimeout(clock_.ApproximateNow());
506 EXPECT_FALSE(HasPendingAck());
507
QUICHE team1dfa46b2019-03-22 10:39:10 -0700508 RecordPacketReceipt(ENCRYPTION_HANDSHAKE, 3);
509 EXPECT_TRUE(manager_->IsAckFrameUpdated());
510 MaybeUpdateAckTimeout(kInstigateAck, ENCRYPTION_HANDSHAKE, 3);
511 EXPECT_TRUE(HasPendingAck());
512 // Delayed ack is scheduled.
ianswett309987e2019-08-02 13:16:26 -0700513 CheckAckTimeout(clock_.ApproximateNow() +
514 QuicTime::Delta::FromMilliseconds(1));
515 // Send delayed handshake data ACK.
516 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
517 CheckAckTimeout(clock_.ApproximateNow());
518 EXPECT_FALSE(HasPendingAck());
QUICHE team1dfa46b2019-03-22 10:39:10 -0700519
520 RecordPacketReceipt(ENCRYPTION_FORWARD_SECURE, 3);
521 MaybeUpdateAckTimeout(kInstigateAck, ENCRYPTION_FORWARD_SECURE, 3);
522 EXPECT_TRUE(HasPendingAck());
523 // Delayed ack is scheduled.
524 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
525
526 RecordPacketReceipt(ENCRYPTION_FORWARD_SECURE, 2);
527 MaybeUpdateAckTimeout(kInstigateAck, ENCRYPTION_FORWARD_SECURE, 2);
528 // Application data ACK should be sent immediately.
529 CheckAckTimeout(clock_.ApproximateNow());
QUICHE team1dfa46b2019-03-22 10:39:10 -0700530 EXPECT_FALSE(HasPendingAck());
531}
532
QUICHE teamb23daa72019-03-21 08:37:48 -0700533} // namespace
534} // namespace test
535} // namespace quic