blob: e8876369c8b20b35ef47bfdc5f03fe7560c92cd5 [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
QUICHE team1dfa46b2019-03-22 10:39:10 -07007#include "net/third_party/quiche/src/quic/core/quic_utils.h"
8#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
9
QUICHE teamb23daa72019-03-21 08:37:48 -070010namespace quic {
11
12UberReceivedPacketManager::UberReceivedPacketManager(QuicConnectionStats* stats)
QUICHE team1dfa46b2019-03-22 10:39:10 -070013 : supports_multiple_packet_number_spaces_(false) {
14 for (auto& received_packet_manager : received_packet_managers_) {
15 received_packet_manager.set_connection_stats(stats);
16 }
17}
QUICHE teamb23daa72019-03-21 08:37:48 -070018
19UberReceivedPacketManager::~UberReceivedPacketManager() {}
20
21void UberReceivedPacketManager::SetFromConfig(const QuicConfig& config,
22 Perspective perspective) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070023 for (auto& received_packet_manager : received_packet_managers_) {
24 received_packet_manager.SetFromConfig(config, perspective);
25 }
QUICHE teamb23daa72019-03-21 08:37:48 -070026}
27
28bool UberReceivedPacketManager::IsAwaitingPacket(
QUICHE team1dfa46b2019-03-22 10:39:10 -070029 EncryptionLevel decrypted_packet_level,
QUICHE teamb23daa72019-03-21 08:37:48 -070030 QuicPacketNumber packet_number) const {
QUICHE team1dfa46b2019-03-22 10:39:10 -070031 if (!supports_multiple_packet_number_spaces_) {
32 return received_packet_managers_[0].IsAwaitingPacket(packet_number);
33 }
34 return received_packet_managers_[QuicUtils::GetPacketNumberSpace(
35 decrypted_packet_level)]
36 .IsAwaitingPacket(packet_number);
QUICHE teamb23daa72019-03-21 08:37:48 -070037}
38
39const QuicFrame UberReceivedPacketManager::GetUpdatedAckFrame(
QUICHE team1dfa46b2019-03-22 10:39:10 -070040 PacketNumberSpace packet_number_space,
QUICHE teamb23daa72019-03-21 08:37:48 -070041 QuicTime approximate_now) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070042 if (!supports_multiple_packet_number_spaces_) {
43 return received_packet_managers_[0].GetUpdatedAckFrame(approximate_now);
44 }
45 return received_packet_managers_[packet_number_space].GetUpdatedAckFrame(
46 approximate_now);
QUICHE teamb23daa72019-03-21 08:37:48 -070047}
48
49void UberReceivedPacketManager::RecordPacketReceived(
QUICHE team1dfa46b2019-03-22 10:39:10 -070050 EncryptionLevel decrypted_packet_level,
QUICHE teamb23daa72019-03-21 08:37:48 -070051 const QuicPacketHeader& header,
52 QuicTime receipt_time) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070053 if (!supports_multiple_packet_number_spaces_) {
54 received_packet_managers_[0].RecordPacketReceived(header, receipt_time);
55 return;
56 }
57 received_packet_managers_[QuicUtils::GetPacketNumberSpace(
58 decrypted_packet_level)]
59 .RecordPacketReceived(header, receipt_time);
QUICHE teamb23daa72019-03-21 08:37:48 -070060}
61
62void UberReceivedPacketManager::DontWaitForPacketsBefore(
QUICHE team1dfa46b2019-03-22 10:39:10 -070063 EncryptionLevel decrypted_packet_level,
QUICHE teamb23daa72019-03-21 08:37:48 -070064 QuicPacketNumber least_unacked) {
QUICHE team1dfa46b2019-03-22 10:39:10 -070065 if (!supports_multiple_packet_number_spaces_) {
66 received_packet_managers_[0].DontWaitForPacketsBefore(least_unacked);
67 return;
68 }
69 received_packet_managers_[QuicUtils::GetPacketNumberSpace(
70 decrypted_packet_level)]
71 .DontWaitForPacketsBefore(least_unacked);
QUICHE teamb23daa72019-03-21 08:37:48 -070072}
73
74void UberReceivedPacketManager::MaybeUpdateAckTimeout(
75 bool should_last_packet_instigate_acks,
QUICHE team1dfa46b2019-03-22 10:39:10 -070076 EncryptionLevel decrypted_packet_level,
QUICHE teamb23daa72019-03-21 08:37:48 -070077 QuicPacketNumber last_received_packet_number,
78 QuicTime time_of_last_received_packet,
79 QuicTime now,
80 const RttStats* rtt_stats,
81 QuicTime::Delta delayed_ack_time) {
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,
85 time_of_last_received_packet, now, rtt_stats, delayed_ack_time);
86 return;
87 }
88 received_packet_managers_[QuicUtils::GetPacketNumberSpace(
89 decrypted_packet_level)]
90 .MaybeUpdateAckTimeout(
91 should_last_packet_instigate_acks, last_received_packet_number,
92 time_of_last_received_packet, now, rtt_stats, delayed_ack_time);
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 }
115
116 supports_multiple_packet_number_spaces_ = true;
QUICHE teamb23daa72019-03-21 08:37:48 -0700117}
118
QUICHE team1dfa46b2019-03-22 10:39:10 -0700119bool UberReceivedPacketManager::IsAckFrameUpdated() const {
120 if (!supports_multiple_packet_number_spaces_) {
121 return received_packet_managers_[0].ack_frame_updated();
122 }
123 for (const auto& received_packet_manager : received_packet_managers_) {
124 if (received_packet_manager.ack_frame_updated()) {
125 return true;
126 }
127 }
128 return false;
QUICHE teamb23daa72019-03-21 08:37:48 -0700129}
130
QUICHE team1dfa46b2019-03-22 10:39:10 -0700131QuicPacketNumber UberReceivedPacketManager::GetLargestObserved(
132 EncryptionLevel decrypted_packet_level) const {
133 if (!supports_multiple_packet_number_spaces_) {
134 return received_packet_managers_[0].GetLargestObserved();
135 }
136 return received_packet_managers_[QuicUtils::GetPacketNumberSpace(
137 decrypted_packet_level)]
138 .GetLargestObserved();
139}
140
141QuicTime UberReceivedPacketManager::GetAckTimeout(
142 PacketNumberSpace packet_number_space) const {
143 if (!supports_multiple_packet_number_spaces_) {
144 return received_packet_managers_[0].ack_timeout();
145 }
146 return received_packet_managers_[packet_number_space].ack_timeout();
147}
148
149QuicTime UberReceivedPacketManager::GetEarliestAckTimeout() const {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700150 QuicTime ack_timeout = QuicTime::Zero();
151 // Returns the earliest non-zero ack timeout.
152 for (const auto& received_packet_manager : received_packet_managers_) {
153 const QuicTime timeout = received_packet_manager.ack_timeout();
154 if (!ack_timeout.IsInitialized()) {
155 ack_timeout = timeout;
156 continue;
157 }
158 if (timeout.IsInitialized()) {
159 ack_timeout = std::min(ack_timeout, timeout);
160 }
161 }
162 return ack_timeout;
QUICHE teamb23daa72019-03-21 08:37:48 -0700163}
164
QUICHE teamb23daa72019-03-21 08:37:48 -0700165QuicPacketNumber UberReceivedPacketManager::peer_least_packet_awaiting_ack()
166 const {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700167 DCHECK(!supports_multiple_packet_number_spaces_);
168 return received_packet_managers_[0].peer_least_packet_awaiting_ack();
QUICHE teamb23daa72019-03-21 08:37:48 -0700169}
170
171size_t UberReceivedPacketManager::min_received_before_ack_decimation() const {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700172 return received_packet_managers_[0].min_received_before_ack_decimation();
QUICHE teamb23daa72019-03-21 08:37:48 -0700173}
174
175void UberReceivedPacketManager::set_min_received_before_ack_decimation(
176 size_t new_value) {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700177 for (auto& received_packet_manager : received_packet_managers_) {
178 received_packet_manager.set_min_received_before_ack_decimation(new_value);
179 }
QUICHE teamb23daa72019-03-21 08:37:48 -0700180}
181
182size_t UberReceivedPacketManager::ack_frequency_before_ack_decimation() const {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700183 return received_packet_managers_[0].ack_frequency_before_ack_decimation();
QUICHE teamb23daa72019-03-21 08:37:48 -0700184}
185
186void UberReceivedPacketManager::set_ack_frequency_before_ack_decimation(
187 size_t new_value) {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700188 for (auto& received_packet_manager : received_packet_managers_) {
189 received_packet_manager.set_ack_frequency_before_ack_decimation(new_value);
190 }
QUICHE teamb23daa72019-03-21 08:37:48 -0700191}
192
193const QuicAckFrame& UberReceivedPacketManager::ack_frame() const {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700194 DCHECK(!supports_multiple_packet_number_spaces_);
195 return received_packet_managers_[0].ack_frame();
QUICHE teamb23daa72019-03-21 08:37:48 -0700196}
197
198void UberReceivedPacketManager::set_max_ack_ranges(size_t max_ack_ranges) {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700199 for (auto& received_packet_manager : received_packet_managers_) {
200 received_packet_manager.set_max_ack_ranges(max_ack_ranges);
201 }
QUICHE teamb23daa72019-03-21 08:37:48 -0700202}
203
204void UberReceivedPacketManager::set_save_timestamps(bool save_timestamps) {
QUICHE team1dfa46b2019-03-22 10:39:10 -0700205 for (auto& received_packet_manager : received_packet_managers_) {
206 received_packet_manager.set_save_timestamps(save_timestamps);
207 }
QUICHE teamb23daa72019-03-21 08:37:48 -0700208}
209
210} // namespace quic