blob: 78cf35919d1c0e6ab203e1857ef9c9f65ec350af [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
ianswett309987e2019-08-02 13:16:26 -07007#include "net/third_party/quiche/src/quic/core/quic_types.h"
QUICHE team1dfa46b2019-03-22 10:39:10 -07008#include "net/third_party/quiche/src/quic/core/quic_utils.h"
9#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
10
QUICHE teamb23daa72019-03-21 08:37:48 -070011namespace quic {
12
13UberReceivedPacketManager::UberReceivedPacketManager(QuicConnectionStats* stats)
QUICHE team1dfa46b2019-03-22 10:39:10 -070014 : supports_multiple_packet_number_spaces_(false) {
15 for (auto& received_packet_manager : received_packet_managers_) {
16 received_packet_manager.set_connection_stats(stats);
17 }
18}
QUICHE teamb23daa72019-03-21 08:37:48 -070019
20UberReceivedPacketManager::~UberReceivedPacketManager() {}
21
22void UberReceivedPacketManager::SetFromConfig(const QuicConfig& config,
23 Perspective perspective) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070024 for (auto& received_packet_manager : received_packet_managers_) {
25 received_packet_manager.SetFromConfig(config, perspective);
26 }
QUICHE teamb23daa72019-03-21 08:37:48 -070027}
28
29bool UberReceivedPacketManager::IsAwaitingPacket(
QUICHE team1dfa46b2019-03-22 10:39:10 -070030 EncryptionLevel decrypted_packet_level,
QUICHE teamb23daa72019-03-21 08:37:48 -070031 QuicPacketNumber packet_number) const {
QUICHE team1dfa46b2019-03-22 10:39:10 -070032 if (!supports_multiple_packet_number_spaces_) {
33 return received_packet_managers_[0].IsAwaitingPacket(packet_number);
34 }
35 return received_packet_managers_[QuicUtils::GetPacketNumberSpace(
36 decrypted_packet_level)]
37 .IsAwaitingPacket(packet_number);
QUICHE teamb23daa72019-03-21 08:37:48 -070038}
39
40const QuicFrame UberReceivedPacketManager::GetUpdatedAckFrame(
QUICHE team1dfa46b2019-03-22 10:39:10 -070041 PacketNumberSpace packet_number_space,
QUICHE teamb23daa72019-03-21 08:37:48 -070042 QuicTime approximate_now) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070043 if (!supports_multiple_packet_number_spaces_) {
44 return received_packet_managers_[0].GetUpdatedAckFrame(approximate_now);
45 }
46 return received_packet_managers_[packet_number_space].GetUpdatedAckFrame(
47 approximate_now);
QUICHE teamb23daa72019-03-21 08:37:48 -070048}
49
50void UberReceivedPacketManager::RecordPacketReceived(
QUICHE team1dfa46b2019-03-22 10:39:10 -070051 EncryptionLevel decrypted_packet_level,
QUICHE teamb23daa72019-03-21 08:37:48 -070052 const QuicPacketHeader& header,
53 QuicTime receipt_time) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070054 if (!supports_multiple_packet_number_spaces_) {
55 received_packet_managers_[0].RecordPacketReceived(header, receipt_time);
56 return;
57 }
58 received_packet_managers_[QuicUtils::GetPacketNumberSpace(
59 decrypted_packet_level)]
60 .RecordPacketReceived(header, receipt_time);
QUICHE teamb23daa72019-03-21 08:37:48 -070061}
62
63void UberReceivedPacketManager::DontWaitForPacketsBefore(
QUICHE team1dfa46b2019-03-22 10:39:10 -070064 EncryptionLevel decrypted_packet_level,
QUICHE teamb23daa72019-03-21 08:37:48 -070065 QuicPacketNumber least_unacked) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070066 if (!supports_multiple_packet_number_spaces_) {
67 received_packet_managers_[0].DontWaitForPacketsBefore(least_unacked);
68 return;
69 }
70 received_packet_managers_[QuicUtils::GetPacketNumberSpace(
71 decrypted_packet_level)]
72 .DontWaitForPacketsBefore(least_unacked);
QUICHE teamb23daa72019-03-21 08:37:48 -070073}
74
75void UberReceivedPacketManager::MaybeUpdateAckTimeout(
76 bool should_last_packet_instigate_acks,
QUICHE team1dfa46b2019-03-22 10:39:10 -070077 EncryptionLevel decrypted_packet_level,
QUICHE teamb23daa72019-03-21 08:37:48 -070078 QuicPacketNumber last_received_packet_number,
79 QuicTime time_of_last_received_packet,
80 QuicTime now,
ianswett309987e2019-08-02 13:16:26 -070081 const RttStats* rtt_stats) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070082 if (!supports_multiple_packet_number_spaces_) {
83 received_packet_managers_[0].MaybeUpdateAckTimeout(
84 should_last_packet_instigate_acks, last_received_packet_number,
ianswett309987e2019-08-02 13:16:26 -070085 time_of_last_received_packet, now, rtt_stats);
QUICHE team1dfa46b2019-03-22 10:39:10 -070086 return;
87 }
88 received_packet_managers_[QuicUtils::GetPacketNumberSpace(
89 decrypted_packet_level)]
ianswett309987e2019-08-02 13:16:26 -070090 .MaybeUpdateAckTimeout(should_last_packet_instigate_acks,
91 last_received_packet_number,
92 time_of_last_received_packet, now, rtt_stats);
QUICHE teamb23daa72019-03-21 08:37:48 -070093}
94
QUICHE team1dfa46b2019-03-22 10:39:10 -070095void UberReceivedPacketManager::ResetAckStates(
96 EncryptionLevel encryption_level) {
97 if (!supports_multiple_packet_number_spaces_) {
98 received_packet_managers_[0].ResetAckStates();
99 return;
100 }
101 received_packet_managers_[QuicUtils::GetPacketNumberSpace(encryption_level)]
102 .ResetAckStates();
QUICHE teamb23daa72019-03-21 08:37:48 -0700103}
104
QUICHE team1dfa46b2019-03-22 10:39:10 -0700105void UberReceivedPacketManager::EnableMultiplePacketNumberSpacesSupport() {
106 if (supports_multiple_packet_number_spaces_) {
107 QUIC_BUG << "Multiple packet number spaces has already been enabled";
108 return;
109 }
110 if (received_packet_managers_[0].GetLargestObserved().IsInitialized()) {
111 QUIC_BUG << "Try to enable multiple packet number spaces support after any "
112 "packet has been received.";
113 return;
114 }
ianswett309987e2019-08-02 13:16:26 -0700115 // In IETF QUIC, the peer is expected to acknowledge packets in Initial and
116 // Handshake packets with minimal delay.
117 received_packet_managers_[INITIAL_DATA].set_local_max_ack_delay(
118 QuicTime::Delta::FromMilliseconds(1));
119 received_packet_managers_[HANDSHAKE_DATA].set_local_max_ack_delay(
120 QuicTime::Delta::FromMilliseconds(1));
QUICHE team1dfa46b2019-03-22 10:39:10 -0700121
122 supports_multiple_packet_number_spaces_ = true;
QUICHE teamb23daa72019-03-21 08:37:48 -0700123}
124
QUICHE team1dfa46b2019-03-22 10:39:10 -0700125bool UberReceivedPacketManager::IsAckFrameUpdated() const {
126 if (!supports_multiple_packet_number_spaces_) {
127 return received_packet_managers_[0].ack_frame_updated();
128 }
129 for (const auto& received_packet_manager : received_packet_managers_) {
130 if (received_packet_manager.ack_frame_updated()) {
131 return true;
132 }
133 }
134 return false;
QUICHE teamb23daa72019-03-21 08:37:48 -0700135}
136
QUICHE team1dfa46b2019-03-22 10:39:10 -0700137QuicPacketNumber UberReceivedPacketManager::GetLargestObserved(
138 EncryptionLevel decrypted_packet_level) const {
139 if (!supports_multiple_packet_number_spaces_) {
140 return received_packet_managers_[0].GetLargestObserved();
141 }
142 return received_packet_managers_[QuicUtils::GetPacketNumberSpace(
143 decrypted_packet_level)]
144 .GetLargestObserved();
145}
146
147QuicTime UberReceivedPacketManager::GetAckTimeout(
148 PacketNumberSpace packet_number_space) const {
149 if (!supports_multiple_packet_number_spaces_) {
150 return received_packet_managers_[0].ack_timeout();
151 }
152 return received_packet_managers_[packet_number_space].ack_timeout();
153}
154
155QuicTime UberReceivedPacketManager::GetEarliestAckTimeout() const {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700156 QuicTime ack_timeout = QuicTime::Zero();
157 // Returns the earliest non-zero ack timeout.
158 for (const auto& received_packet_manager : received_packet_managers_) {
159 const QuicTime timeout = received_packet_manager.ack_timeout();
160 if (!ack_timeout.IsInitialized()) {
161 ack_timeout = timeout;
162 continue;
163 }
164 if (timeout.IsInitialized()) {
165 ack_timeout = std::min(ack_timeout, timeout);
166 }
167 }
168 return ack_timeout;
QUICHE teamb23daa72019-03-21 08:37:48 -0700169}
170
QUICHE teamb23daa72019-03-21 08:37:48 -0700171QuicPacketNumber UberReceivedPacketManager::peer_least_packet_awaiting_ack()
172 const {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700173 DCHECK(!supports_multiple_packet_number_spaces_);
174 return received_packet_managers_[0].peer_least_packet_awaiting_ack();
QUICHE teamb23daa72019-03-21 08:37:48 -0700175}
176
177size_t UberReceivedPacketManager::min_received_before_ack_decimation() const {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700178 return received_packet_managers_[0].min_received_before_ack_decimation();
QUICHE teamb23daa72019-03-21 08:37:48 -0700179}
180
181void UberReceivedPacketManager::set_min_received_before_ack_decimation(
182 size_t new_value) {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700183 for (auto& received_packet_manager : received_packet_managers_) {
184 received_packet_manager.set_min_received_before_ack_decimation(new_value);
185 }
QUICHE teamb23daa72019-03-21 08:37:48 -0700186}
187
188size_t UberReceivedPacketManager::ack_frequency_before_ack_decimation() const {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700189 return received_packet_managers_[0].ack_frequency_before_ack_decimation();
QUICHE teamb23daa72019-03-21 08:37:48 -0700190}
191
192void UberReceivedPacketManager::set_ack_frequency_before_ack_decimation(
193 size_t new_value) {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700194 for (auto& received_packet_manager : received_packet_managers_) {
195 received_packet_manager.set_ack_frequency_before_ack_decimation(new_value);
196 }
QUICHE teamb23daa72019-03-21 08:37:48 -0700197}
198
199const QuicAckFrame& UberReceivedPacketManager::ack_frame() const {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700200 DCHECK(!supports_multiple_packet_number_spaces_);
201 return received_packet_managers_[0].ack_frame();
QUICHE teamb23daa72019-03-21 08:37:48 -0700202}
203
fayang21ffb712019-05-16 08:39:26 -0700204const QuicAckFrame& UberReceivedPacketManager::GetAckFrame(
205 PacketNumberSpace packet_number_space) const {
206 DCHECK(supports_multiple_packet_number_spaces_);
207 return received_packet_managers_[packet_number_space].ack_frame();
208}
209
QUICHE teamb23daa72019-03-21 08:37:48 -0700210void UberReceivedPacketManager::set_max_ack_ranges(size_t max_ack_ranges) {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700211 for (auto& received_packet_manager : received_packet_managers_) {
212 received_packet_manager.set_max_ack_ranges(max_ack_ranges);
213 }
QUICHE teamb23daa72019-03-21 08:37:48 -0700214}
215
ianswett309987e2019-08-02 13:16:26 -0700216QuicTime::Delta UberReceivedPacketManager::max_ack_delay() {
217 if (!supports_multiple_packet_number_spaces_) {
218 return received_packet_managers_[0].local_max_ack_delay();
219 }
220 return received_packet_managers_[APPLICATION_DATA].local_max_ack_delay();
221}
222
223void UberReceivedPacketManager::set_max_ack_delay(
224 QuicTime::Delta max_ack_delay) {
225 if (!supports_multiple_packet_number_spaces_) {
226 received_packet_managers_[0].set_local_max_ack_delay(max_ack_delay);
227 return;
228 }
229 received_packet_managers_[APPLICATION_DATA].set_local_max_ack_delay(
230 max_ack_delay);
231}
232
QUICHE teamb23daa72019-03-21 08:37:48 -0700233void UberReceivedPacketManager::set_save_timestamps(bool save_timestamps) {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700234 for (auto& received_packet_manager : received_packet_managers_) {
235 received_packet_manager.set_save_timestamps(save_timestamps);
236 }
QUICHE teamb23daa72019-03-21 08:37:48 -0700237}
238
239} // namespace quic