1 /* 2 * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef API_TEST_SIMULATED_NETWORK_H_ 12 #define API_TEST_SIMULATED_NETWORK_H_ 13 14 #include <stddef.h> 15 #include <stdint.h> 16 17 #include <deque> 18 #include <queue> 19 #include <vector> 20 21 #include "absl/types/optional.h" 22 #include "rtc_base/random.h" 23 #include "rtc_base/thread_annotations.h" 24 25 namespace webrtc { 26 27 struct PacketInFlightInfo { PacketInFlightInfoPacketInFlightInfo28 PacketInFlightInfo(size_t size, int64_t send_time_us, uint64_t packet_id) 29 : size(size), send_time_us(send_time_us), packet_id(packet_id) {} 30 31 size_t size; 32 int64_t send_time_us; 33 // Unique identifier for the packet in relation to other packets in flight. 34 uint64_t packet_id; 35 }; 36 37 struct PacketDeliveryInfo { 38 static constexpr int kNotReceived = -1; PacketDeliveryInfoPacketDeliveryInfo39 PacketDeliveryInfo(PacketInFlightInfo source, int64_t receive_time_us) 40 : receive_time_us(receive_time_us), packet_id(source.packet_id) {} 41 int64_t receive_time_us; 42 uint64_t packet_id; 43 }; 44 45 // BuiltInNetworkBehaviorConfig is a built-in network behavior configuration 46 // for built-in network behavior that will be used by WebRTC if no custom 47 // NetworkBehaviorInterface is provided. 48 struct BuiltInNetworkBehaviorConfig { BuiltInNetworkBehaviorConfigBuiltInNetworkBehaviorConfig49 BuiltInNetworkBehaviorConfig() {} 50 // Queue length in number of packets. 51 size_t queue_length_packets = 0; 52 // Delay in addition to capacity induced delay. 53 int queue_delay_ms = 0; 54 // Standard deviation of the extra delay. 55 int delay_standard_deviation_ms = 0; 56 // Link capacity in kbps. 57 int link_capacity_kbps = 0; 58 // Random packet loss. 59 int loss_percent = 0; 60 // If packets are allowed to be reordered. 61 bool allow_reordering = false; 62 // The average length of a burst of lost packets. 63 int avg_burst_loss_length = -1; 64 // Additional bytes to add to packet size. 65 int packet_overhead = 0; 66 // Enable CoDel active queue management. 67 bool codel_active_queue_management = false; 68 }; 69 70 class NetworkBehaviorInterface { 71 public: 72 virtual bool EnqueuePacket(PacketInFlightInfo packet_info) = 0; 73 // Retrieves all packets that should be delivered by the given receive time. 74 virtual std::vector<PacketDeliveryInfo> DequeueDeliverablePackets( 75 int64_t receive_time_us) = 0; 76 // Returns time in microseconds when caller should call 77 // DequeueDeliverablePackets to get next set of packets to deliver. 78 virtual absl::optional<int64_t> NextDeliveryTimeUs() const = 0; 79 virtual ~NetworkBehaviorInterface() = default; 80 }; 81 82 // Class simulating a network link. This is a simple and naive solution just 83 // faking capacity and adding an extra transport delay in addition to the 84 // capacity introduced delay. 85 class SimulatedNetworkInterface : public NetworkBehaviorInterface { 86 public: 87 // Sets a new configuration. This won't affect packets already in the pipe. 88 virtual void SetConfig(const BuiltInNetworkBehaviorConfig& config) = 0; 89 virtual void UpdateConfig( 90 std::function<void(BuiltInNetworkBehaviorConfig*)> config_modifier) = 0; 91 virtual void PauseTransmissionUntil(int64_t until_us) = 0; 92 }; 93 94 } // namespace webrtc 95 96 #endif // API_TEST_SIMULATED_NETWORK_H_ 97