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