blob: 3dddbdaa575780566e8fbe5de78b8eb368883e3e [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "quic/core/frames/quic_ack_frequency_frame.h"
#include "quic/core/quic_received_packet_manager.h"
namespace quic {
// This class comprises multiple received packet managers, one per packet number
// space. Please note, if multiple packet number spaces is not supported, only
// one received packet manager will be used.
class QUIC_EXPORT_PRIVATE UberReceivedPacketManager {
explicit UberReceivedPacketManager(QuicConnectionStats* stats);
UberReceivedPacketManager(const UberReceivedPacketManager&) = delete;
UberReceivedPacketManager& operator=(const UberReceivedPacketManager&) =
virtual ~UberReceivedPacketManager();
void SetFromConfig(const QuicConfig& config, Perspective perspective);
// Checks if we are still waiting for the packet with |packet_number|.
bool IsAwaitingPacket(EncryptionLevel decrypted_packet_level,
QuicPacketNumber packet_number) const;
// Called after a packet has been successfully decrypted and its header has
// been parsed.
void RecordPacketReceived(EncryptionLevel decrypted_packet_level,
const QuicPacketHeader& header,
QuicTime receipt_time);
// Retrieves a frame containing a QuicAckFrame. The ack frame must be
// serialized before another packet is received, or it will change.
const QuicFrame GetUpdatedAckFrame(PacketNumberSpace packet_number_space,
QuicTime approximate_now);
// Stop ACKing packets before |least_unacked|.
void DontWaitForPacketsBefore(EncryptionLevel decrypted_packet_level,
QuicPacketNumber least_unacked);
// Called after header of last received packet has been successfully processed
// to update ACK timeout.
void MaybeUpdateAckTimeout(bool should_last_packet_instigate_acks,
EncryptionLevel decrypted_packet_level,
QuicPacketNumber last_received_packet_number,
QuicTime now,
const RttStats* rtt_stats);
// Resets ACK related states, called after an ACK is successfully sent.
void ResetAckStates(EncryptionLevel encryption_level);
// Called to enable multiple packet number support.
void EnableMultiplePacketNumberSpacesSupport(Perspective perspective);
// Returns true if ACK frame has been updated since GetUpdatedAckFrame was
// last called.
bool IsAckFrameUpdated() const;
// Returns the largest received packet number.
QuicPacketNumber GetLargestObserved(
EncryptionLevel decrypted_packet_level) const;
// Returns ACK timeout of |packet_number_space|.
QuicTime GetAckTimeout(PacketNumberSpace packet_number_space) const;
// Get the earliest ack_timeout of all packet number spaces.
QuicTime GetEarliestAckTimeout() const;
// Return true if ack frame of |packet_number_space| is empty.
bool IsAckFrameEmpty(PacketNumberSpace packet_number_space) const;
QuicPacketNumber peer_least_packet_awaiting_ack() const;
size_t min_received_before_ack_decimation() const;
void set_min_received_before_ack_decimation(size_t new_value);
void set_ack_frequency(size_t new_value);
bool supports_multiple_packet_number_spaces() const {
return supports_multiple_packet_number_spaces_;
// For logging purposes.
const QuicAckFrame& ack_frame() const;
const QuicAckFrame& GetAckFrame(PacketNumberSpace packet_number_space) const;
void set_max_ack_ranges(size_t max_ack_ranges);
void OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame);
void set_save_timestamps(bool save_timestamps);
friend class test::QuicConnectionPeer;
friend class test::UberReceivedPacketManagerPeer;
// One received packet manager per packet number space. If
// supports_multiple_packet_number_spaces_ is false, only the first (0 index)
// received_packet_manager is used.
QuicReceivedPacketManager received_packet_managers_[NUM_PACKET_NUMBER_SPACES];
bool supports_multiple_packet_number_spaces_;
} // namespace quic