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