• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 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|.
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   QuicPacketNumber peer_least_packet_awaiting_ack() const;
78 
79   size_t min_received_before_ack_decimation() const;
80   void set_min_received_before_ack_decimation(size_t new_value);
81 
82   void set_ack_frequency(size_t new_value);
83 
supports_multiple_packet_number_spaces()84   bool supports_multiple_packet_number_spaces() const {
85     return supports_multiple_packet_number_spaces_;
86   }
87 
88   // For logging purposes.
89   const QuicAckFrame& ack_frame() const;
90   const QuicAckFrame& GetAckFrame(PacketNumberSpace packet_number_space) const;
91 
92   void set_max_ack_ranges(size_t max_ack_ranges);
93 
94   void OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame);
95 
96   void set_save_timestamps(bool save_timestamps);
97 
98  private:
99   friend class test::QuicConnectionPeer;
100   friend class test::UberReceivedPacketManagerPeer;
101 
102   // One received packet manager per packet number space. If
103   // supports_multiple_packet_number_spaces_ is false, only the first (0 index)
104   // received_packet_manager is used.
105   QuicReceivedPacketManager received_packet_managers_[NUM_PACKET_NUMBER_SPACES];
106 
107   bool supports_multiple_packet_number_spaces_;
108 };
109 
110 }  // namespace quic
111 
112 #endif  // QUICHE_QUIC_CORE_UBER_RECEIVED_PACKET_MANAGER_H_
113