/* * Copyright 2025 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef API_TEST_NETWORK_EMULATION_NETWORK_QUEUE_H_ #define API_TEST_NETWORK_EMULATION_NETWORK_QUEUE_H_ #include #include #include #include #include "api/test/simulated_network.h" #include "api/units/timestamp.h" namespace webrtc { // NetworkQueue defines the interface for a queue used in network simulation. // The purpose is to allow for different AQM implementations. // A queue should not modify PacketInFlightInfo except for the explicit // congestion notification field (ecn). class NetworkQueue { public: // Max capacity a queue is expected to handle. constexpr static size_t kMaxPacketCapacity = 10000; virtual ~NetworkQueue() = default; // Sets the max capacity of the queue. If there are already more than // `max_capacitiy` packets in the queue, the behaviour depends on the // implementation. virtual void SetMaxPacketCapacity(size_t max_capactiy) = 0; // Enqueues a packet. // Must return true if the packet is enqueued successfully, false otherwise. virtual bool EnqueuePacket(const PacketInFlightInfo& packet_info) = 0; // Next packet that can be dequeued. virtual std::optional PeekNextPacket() const = 0; // Dequeues a packet. // or std::nullopt if there are no enqueued packets. virtual std::optional DequeuePacket( Timestamp time_now) = 0; // Dequeues all packets that are dropped by the queue itself after being // enqueued. virtual std::vector DequeueDroppedPackets() = 0; virtual bool empty() const = 0; }; class NetworkQueueFactory { public: virtual ~NetworkQueueFactory() = default; virtual std::unique_ptr CreateQueue() = 0; }; } // namespace webrtc #endif // API_TEST_NETWORK_EMULATION_NETWORK_QUEUE_H_