blob: 3dddbdaa575780566e8fbe5de78b8eb368883e3e [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#ifndef QUICHE_QUIC_CORE_UBER_RECEIVED_PACKET_MANAGER_H_
6#define QUICHE_QUIC_CORE_UBER_RECEIVED_PACKET_MANAGER_H_
7
QUICHE team5be974e2020-12-29 18:35:24 -05008#include "quic/core/frames/quic_ack_frequency_frame.h"
9#include "quic/core/quic_received_packet_manager.h"
QUICHE teamb23daa72019-03-21 08:37:48 -070010
11namespace quic {
12
QUICHE team1dfa46b2019-03-22 10:39:10 -070013// This class comprises multiple received packet managers, one per packet number
14// space. Please note, if multiple packet number spaces is not supported, only
15// one received packet manager will be used.
QUICHE teamb23daa72019-03-21 08:37:48 -070016class QUIC_EXPORT_PRIVATE UberReceivedPacketManager {
17 public:
18 explicit UberReceivedPacketManager(QuicConnectionStats* stats);
19 UberReceivedPacketManager(const UberReceivedPacketManager&) = delete;
20 UberReceivedPacketManager& operator=(const UberReceivedPacketManager&) =
21 delete;
22 virtual ~UberReceivedPacketManager();
23
24 void SetFromConfig(const QuicConfig& config, Perspective perspective);
25
26 // Checks if we are still waiting for the packet with |packet_number|.
QUICHE team1dfa46b2019-03-22 10:39:10 -070027 bool IsAwaitingPacket(EncryptionLevel decrypted_packet_level,
28 QuicPacketNumber packet_number) const;
QUICHE teamb23daa72019-03-21 08:37:48 -070029
30 // Called after a packet has been successfully decrypted and its header has
31 // been parsed.
QUICHE team1dfa46b2019-03-22 10:39:10 -070032 void RecordPacketReceived(EncryptionLevel decrypted_packet_level,
33 const QuicPacketHeader& header,
QUICHE teamb23daa72019-03-21 08:37:48 -070034 QuicTime receipt_time);
35
36 // Retrieves a frame containing a QuicAckFrame. The ack frame must be
37 // serialized before another packet is received, or it will change.
QUICHE team1dfa46b2019-03-22 10:39:10 -070038 const QuicFrame GetUpdatedAckFrame(PacketNumberSpace packet_number_space,
39 QuicTime approximate_now);
QUICHE teamb23daa72019-03-21 08:37:48 -070040
41 // Stop ACKing packets before |least_unacked|.
QUICHE team1dfa46b2019-03-22 10:39:10 -070042 void DontWaitForPacketsBefore(EncryptionLevel decrypted_packet_level,
43 QuicPacketNumber least_unacked);
QUICHE teamb23daa72019-03-21 08:37:48 -070044
45 // Called after header of last received packet has been successfully processed
46 // to update ACK timeout.
47 void MaybeUpdateAckTimeout(bool should_last_packet_instigate_acks,
QUICHE team1dfa46b2019-03-22 10:39:10 -070048 EncryptionLevel decrypted_packet_level,
QUICHE teamb23daa72019-03-21 08:37:48 -070049 QuicPacketNumber last_received_packet_number,
QUICHE teamb23daa72019-03-21 08:37:48 -070050 QuicTime now,
ianswett309987e2019-08-02 13:16:26 -070051 const RttStats* rtt_stats);
QUICHE teamb23daa72019-03-21 08:37:48 -070052
53 // Resets ACK related states, called after an ACK is successfully sent.
QUICHE team1dfa46b2019-03-22 10:39:10 -070054 void ResetAckStates(EncryptionLevel encryption_level);
55
56 // Called to enable multiple packet number support.
ianswettb39b6ab2020-10-22 11:54:06 -070057 void EnableMultiplePacketNumberSpacesSupport(Perspective perspective);
QUICHE teamb23daa72019-03-21 08:37:48 -070058
59 // Returns true if ACK frame has been updated since GetUpdatedAckFrame was
60 // last called.
QUICHE team1dfa46b2019-03-22 10:39:10 -070061 bool IsAckFrameUpdated() const;
QUICHE teamb23daa72019-03-21 08:37:48 -070062
63 // Returns the largest received packet number.
QUICHE team1dfa46b2019-03-22 10:39:10 -070064 QuicPacketNumber GetLargestObserved(
65 EncryptionLevel decrypted_packet_level) const;
QUICHE teamb23daa72019-03-21 08:37:48 -070066
QUICHE team1dfa46b2019-03-22 10:39:10 -070067 // Returns ACK timeout of |packet_number_space|.
68 QuicTime GetAckTimeout(PacketNumberSpace packet_number_space) const;
69
70 // Get the earliest ack_timeout of all packet number spaces.
71 QuicTime GetEarliestAckTimeout() const;
QUICHE teamb23daa72019-03-21 08:37:48 -070072
fayang5d92c412020-02-19 12:10:31 -080073 // Return true if ack frame of |packet_number_space| is empty.
74 bool IsAckFrameEmpty(PacketNumberSpace packet_number_space) const;
75
QUICHE teamb23daa72019-03-21 08:37:48 -070076 QuicPacketNumber peer_least_packet_awaiting_ack() const;
77
78 size_t min_received_before_ack_decimation() const;
79 void set_min_received_before_ack_decimation(size_t new_value);
80
haoyuewange7415a52020-07-27 17:12:26 -070081 void set_ack_frequency(size_t new_value);
QUICHE teamb23daa72019-03-21 08:37:48 -070082
QUICHE team1dfa46b2019-03-22 10:39:10 -070083 bool supports_multiple_packet_number_spaces() const {
84 return supports_multiple_packet_number_spaces_;
85 }
86
QUICHE teamb23daa72019-03-21 08:37:48 -070087 // For logging purposes.
88 const QuicAckFrame& ack_frame() const;
fayang21ffb712019-05-16 08:39:26 -070089 const QuicAckFrame& GetAckFrame(PacketNumberSpace packet_number_space) const;
QUICHE teamb23daa72019-03-21 08:37:48 -070090
91 void set_max_ack_ranges(size_t max_ack_ranges);
92
haoyuewang2d2fdd12020-09-16 11:26:56 -070093 void OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame);
ianswett309987e2019-08-02 13:16:26 -070094
QUICHE teamb23daa72019-03-21 08:37:48 -070095 void set_save_timestamps(bool save_timestamps);
96
97 private:
98 friend class test::QuicConnectionPeer;
99 friend class test::UberReceivedPacketManagerPeer;
100
QUICHE team1dfa46b2019-03-22 10:39:10 -0700101 // One received packet manager per packet number space. If
102 // supports_multiple_packet_number_spaces_ is false, only the first (0 index)
103 // received_packet_manager is used.
104 QuicReceivedPacketManager received_packet_managers_[NUM_PACKET_NUMBER_SPACES];
105
106 bool supports_multiple_packet_number_spaces_;
QUICHE teamb23daa72019-03-21 08:37:48 -0700107};
108
109} // namespace quic
110
111#endif // QUICHE_QUIC_CORE_UBER_RECEIVED_PACKET_MANAGER_H_