xref: /aosp_15_r20/external/webrtc/api/test/network_emulation/cross_traffic.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2021 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 #ifndef API_TEST_NETWORK_EMULATION_CROSS_TRAFFIC_H_
11 #define API_TEST_NETWORK_EMULATION_CROSS_TRAFFIC_H_
12 
13 #include "api/task_queue/task_queue_base.h"
14 #include "api/test/network_emulation/network_emulation_interfaces.h"
15 #include "api/units/data_rate.h"
16 #include "api/units/data_size.h"
17 #include "api/units/time_delta.h"
18 #include "api/units/timestamp.h"
19 
20 namespace webrtc {
21 
22 // This API is still in development and can be changed without prior notice.
23 
24 // Represents the endpoint for cross traffic that is going through the network.
25 // It can be used to emulate unexpected network load.
26 class CrossTrafficRoute {
27  public:
28   virtual ~CrossTrafficRoute() = default;
29 
30   // Triggers sending of dummy packets with size `packet_size` bytes.
31   virtual void TriggerPacketBurst(size_t num_packets, size_t packet_size) = 0;
32   // Sends a packet over the nodes. The content of the packet is unspecified;
33   // only the size metter for the emulation purposes.
34   virtual void SendPacket(size_t packet_size) = 0;
35   // Sends a packet over the nodes and runs `action` when it has been delivered.
36   virtual void NetworkDelayedAction(size_t packet_size,
37                                     std::function<void()> action) = 0;
38 };
39 
40 // Describes a way of generating cross traffic on some route. Used by
41 // NetworkEmulationManager to produce cross traffic during some period of time.
42 class CrossTrafficGenerator {
43  public:
44   virtual ~CrossTrafficGenerator() = default;
45 
46   // Time between Process calls.
47   virtual TimeDelta GetProcessInterval() const = 0;
48 
49   // Called periodically by NetworkEmulationManager. Generates traffic on the
50   // route.
51   virtual void Process(Timestamp at_time) = 0;
52 };
53 
54 // Config of a cross traffic generator. Generated traffic rises and falls
55 // randomly.
56 struct RandomWalkConfig {
57   int random_seed = 1;
58   DataRate peak_rate = DataRate::KilobitsPerSec(100);
59   DataSize min_packet_size = DataSize::Bytes(200);
60   TimeDelta min_packet_interval = TimeDelta::Millis(1);
61   TimeDelta update_interval = TimeDelta::Millis(200);
62   double variance = 0.6;
63   double bias = -0.1;
64 };
65 
66 // Config of a cross traffic generator. Generated traffic has form of periodic
67 // peaks alternating with periods of silence.
68 struct PulsedPeaksConfig {
69   DataRate peak_rate = DataRate::KilobitsPerSec(100);
70   DataSize min_packet_size = DataSize::Bytes(200);
71   TimeDelta min_packet_interval = TimeDelta::Millis(1);
72   TimeDelta send_duration = TimeDelta::Millis(100);
73   TimeDelta hold_duration = TimeDelta::Millis(2000);
74 };
75 
76 struct FakeTcpConfig {
77   DataSize packet_size = DataSize::Bytes(1200);
78   DataSize send_limit = DataSize::PlusInfinity();
79   TimeDelta process_interval = TimeDelta::Millis(200);
80   TimeDelta packet_timeout = TimeDelta::Seconds(1);
81 };
82 
83 }  // namespace webrtc
84 
85 #endif  // API_TEST_NETWORK_EMULATION_CROSS_TRAFFIC_H_
86