xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/uber_received_packet_manager.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // 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 
8 #include "quiche/quic/core/frames/quic_ack_frequency_frame.h"
9 #include "quiche/quic/core/quic_received_packet_manager.h"
10 
11 namespace quic {
12 
13 // 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.
16 class QUICHE_EXPORT 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|.
27   bool IsAwaitingPacket(EncryptionLevel decrypted_packet_level,
28                         QuicPacketNumber packet_number) const;
29 
30   // Called after a packet has been successfully decrypted and its header has
31   // been parsed.
32   void RecordPacketReceived(EncryptionLevel decrypted_packet_level,
33                             const QuicPacketHeader& header,
34                             QuicTime receipt_time,
35                             QuicEcnCodepoint ecn_codepoint);
36 
37   // Retrieves a frame containing a QuicAckFrame. The ack frame must be
38   // serialized before another packet is received, or it will change.
39   const QuicFrame GetUpdatedAckFrame(PacketNumberSpace packet_number_space,
40                                      QuicTime approximate_now);
41 
42   // Stop ACKing packets before |least_unacked|.
43   void DontWaitForPacketsBefore(EncryptionLevel decrypted_packet_level,
44                                 QuicPacketNumber least_unacked);
45 
46   // Called after header of last received packet has been successfully processed
47   // to update ACK timeout.
48   void MaybeUpdateAckTimeout(bool should_last_packet_instigate_acks,
49                              EncryptionLevel decrypted_packet_level,
50                              QuicPacketNumber last_received_packet_number,
51                              QuicTime last_packet_receipt_time, QuicTime now,
52                              const RttStats* rtt_stats);
53 
54   // Resets ACK related states, called after an ACK is successfully sent.
55   void ResetAckStates(EncryptionLevel encryption_level);
56 
57   // Called to enable multiple packet number support.
58   void EnableMultiplePacketNumberSpacesSupport(Perspective perspective);
59 
60   // Returns true if ACK frame has been updated since GetUpdatedAckFrame was
61   // last called.
62   bool IsAckFrameUpdated() const;
63 
64   // Returns the largest received packet number.
65   QuicPacketNumber GetLargestObserved(
66       EncryptionLevel decrypted_packet_level) const;
67 
68   // Returns ACK timeout of |packet_number_space|.
69   QuicTime GetAckTimeout(PacketNumberSpace packet_number_space) const;
70 
71   // Get the earliest ack_timeout of all packet number spaces.
72   QuicTime GetEarliestAckTimeout() const;
73 
74   // Return true if ack frame of |packet_number_space| is empty.
75   bool IsAckFrameEmpty(PacketNumberSpace packet_number_space) const;
76 
77   size_t min_received_before_ack_decimation() const;
78   void set_min_received_before_ack_decimation(size_t new_value);
79 
80   void set_ack_frequency(size_t new_value);
81 
supports_multiple_packet_number_spaces()82   bool supports_multiple_packet_number_spaces() const {
83     return supports_multiple_packet_number_spaces_;
84   }
85 
86   // For logging purposes.
87   const QuicAckFrame& ack_frame() const;
88   const QuicAckFrame& GetAckFrame(PacketNumberSpace packet_number_space) const;
89 
90   void set_max_ack_ranges(size_t max_ack_ranges);
91 
92   void OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame);
93 
94   void set_save_timestamps(bool save_timestamps);
95 
96  private:
97   friend class test::QuicConnectionPeer;
98   friend class test::UberReceivedPacketManagerPeer;
99 
100   // One received packet manager per packet number space. If
101   // supports_multiple_packet_number_spaces_ is false, only the first (0 index)
102   // received_packet_manager is used.
103   QuicReceivedPacketManager received_packet_managers_[NUM_PACKET_NUMBER_SPACES];
104 
105   bool supports_multiple_packet_number_spaces_;
106 };
107 
108 }  // namespace quic
109 
110 #endif  // QUICHE_QUIC_CORE_UBER_RECEIVED_PACKET_MANAGER_H_
111