xref: /aosp_15_r20/external/webrtc/rtc_base/virtual_socket_server.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef RTC_BASE_VIRTUAL_SOCKET_SERVER_H_
12*d9f75844SAndroid Build Coastguard Worker #define RTC_BASE_VIRTUAL_SOCKET_SERVER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <deque>
15*d9f75844SAndroid Build Coastguard Worker #include <map>
16*d9f75844SAndroid Build Coastguard Worker #include <vector>
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
19*d9f75844SAndroid Build Coastguard Worker #include "api/make_ref_counted.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/ref_counted_base.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/scoped_refptr.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_base.h"
23*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
24*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/event.h"
25*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/fake_clock.h"
26*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/socket_server.h"
27*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/synchronization/mutex.h"
28*d9f75844SAndroid Build Coastguard Worker 
29*d9f75844SAndroid Build Coastguard Worker namespace rtc {
30*d9f75844SAndroid Build Coastguard Worker 
31*d9f75844SAndroid Build Coastguard Worker class Packet;
32*d9f75844SAndroid Build Coastguard Worker class VirtualSocketServer;
33*d9f75844SAndroid Build Coastguard Worker class SocketAddressPair;
34*d9f75844SAndroid Build Coastguard Worker 
35*d9f75844SAndroid Build Coastguard Worker // Implements the socket interface using the virtual network. Packets are
36*d9f75844SAndroid Build Coastguard Worker // passed in tasks using the thread of the socket server.
37*d9f75844SAndroid Build Coastguard Worker class VirtualSocket : public Socket, public sigslot::has_slots<> {
38*d9f75844SAndroid Build Coastguard Worker  public:
39*d9f75844SAndroid Build Coastguard Worker   VirtualSocket(VirtualSocketServer* server, int family, int type);
40*d9f75844SAndroid Build Coastguard Worker   ~VirtualSocket() override;
41*d9f75844SAndroid Build Coastguard Worker 
42*d9f75844SAndroid Build Coastguard Worker   SocketAddress GetLocalAddress() const override;
43*d9f75844SAndroid Build Coastguard Worker   SocketAddress GetRemoteAddress() const override;
44*d9f75844SAndroid Build Coastguard Worker 
45*d9f75844SAndroid Build Coastguard Worker   int Bind(const SocketAddress& addr) override;
46*d9f75844SAndroid Build Coastguard Worker   int Connect(const SocketAddress& addr) override;
47*d9f75844SAndroid Build Coastguard Worker   int Close() override;
48*d9f75844SAndroid Build Coastguard Worker   int Send(const void* pv, size_t cb) override;
49*d9f75844SAndroid Build Coastguard Worker   int SendTo(const void* pv, size_t cb, const SocketAddress& addr) override;
50*d9f75844SAndroid Build Coastguard Worker   int Recv(void* pv, size_t cb, int64_t* timestamp) override;
51*d9f75844SAndroid Build Coastguard Worker   int RecvFrom(void* pv,
52*d9f75844SAndroid Build Coastguard Worker                size_t cb,
53*d9f75844SAndroid Build Coastguard Worker                SocketAddress* paddr,
54*d9f75844SAndroid Build Coastguard Worker                int64_t* timestamp) override;
55*d9f75844SAndroid Build Coastguard Worker   int Listen(int backlog) override;
56*d9f75844SAndroid Build Coastguard Worker   VirtualSocket* Accept(SocketAddress* paddr) override;
57*d9f75844SAndroid Build Coastguard Worker 
58*d9f75844SAndroid Build Coastguard Worker   int GetError() const override;
59*d9f75844SAndroid Build Coastguard Worker   void SetError(int error) override;
60*d9f75844SAndroid Build Coastguard Worker   ConnState GetState() const override;
61*d9f75844SAndroid Build Coastguard Worker   int GetOption(Option opt, int* value) override;
62*d9f75844SAndroid Build Coastguard Worker   int SetOption(Option opt, int value) override;
63*d9f75844SAndroid Build Coastguard Worker 
recv_buffer_size()64*d9f75844SAndroid Build Coastguard Worker   size_t recv_buffer_size() const { return recv_buffer_size_; }
send_buffer_size()65*d9f75844SAndroid Build Coastguard Worker   size_t send_buffer_size() const { return send_buffer_.size(); }
send_buffer_data()66*d9f75844SAndroid Build Coastguard Worker   const char* send_buffer_data() const { return send_buffer_.data(); }
67*d9f75844SAndroid Build Coastguard Worker 
68*d9f75844SAndroid Build Coastguard Worker   // Used by server sockets to set the local address without binding.
69*d9f75844SAndroid Build Coastguard Worker   void SetLocalAddress(const SocketAddress& addr);
70*d9f75844SAndroid Build Coastguard Worker 
was_any()71*d9f75844SAndroid Build Coastguard Worker   bool was_any() { return was_any_; }
set_was_any(bool was_any)72*d9f75844SAndroid Build Coastguard Worker   void set_was_any(bool was_any) { was_any_ = was_any; }
73*d9f75844SAndroid Build Coastguard Worker 
74*d9f75844SAndroid Build Coastguard Worker   void SetToBlocked();
75*d9f75844SAndroid Build Coastguard Worker 
76*d9f75844SAndroid Build Coastguard Worker   void UpdateRecv(size_t data_size);
77*d9f75844SAndroid Build Coastguard Worker   void UpdateSend(size_t data_size);
78*d9f75844SAndroid Build Coastguard Worker 
79*d9f75844SAndroid Build Coastguard Worker   void MaybeSignalWriteEvent(size_t capacity);
80*d9f75844SAndroid Build Coastguard Worker 
81*d9f75844SAndroid Build Coastguard Worker   // Adds a packet to be sent. Returns delay, based on network_size_.
82*d9f75844SAndroid Build Coastguard Worker   uint32_t AddPacket(int64_t cur_time, size_t packet_size);
83*d9f75844SAndroid Build Coastguard Worker 
84*d9f75844SAndroid Build Coastguard Worker   int64_t UpdateOrderedDelivery(int64_t ts);
85*d9f75844SAndroid Build Coastguard Worker 
86*d9f75844SAndroid Build Coastguard Worker   // Removes stale packets from the network. Returns current size.
87*d9f75844SAndroid Build Coastguard Worker   size_t PurgeNetworkPackets(int64_t cur_time);
88*d9f75844SAndroid Build Coastguard Worker 
89*d9f75844SAndroid Build Coastguard Worker   void PostPacket(webrtc::TimeDelta delay, std::unique_ptr<Packet> packet);
90*d9f75844SAndroid Build Coastguard Worker   void PostConnect(webrtc::TimeDelta delay, const SocketAddress& remote_addr);
91*d9f75844SAndroid Build Coastguard Worker   void PostDisconnect(webrtc::TimeDelta delay);
92*d9f75844SAndroid Build Coastguard Worker 
93*d9f75844SAndroid Build Coastguard Worker  private:
94*d9f75844SAndroid Build Coastguard Worker   // Struct shared with pending tasks that may outlive VirtualSocket.
95*d9f75844SAndroid Build Coastguard Worker   class SafetyBlock : public RefCountedNonVirtual<SafetyBlock> {
96*d9f75844SAndroid Build Coastguard Worker    public:
97*d9f75844SAndroid Build Coastguard Worker     explicit SafetyBlock(VirtualSocket* socket);
98*d9f75844SAndroid Build Coastguard Worker     SafetyBlock(const SafetyBlock&) = delete;
99*d9f75844SAndroid Build Coastguard Worker     SafetyBlock& operator=(const SafetyBlock&) = delete;
100*d9f75844SAndroid Build Coastguard Worker     ~SafetyBlock();
101*d9f75844SAndroid Build Coastguard Worker 
102*d9f75844SAndroid Build Coastguard Worker     // Prohibits posted delayed task to access owning VirtualSocket and
103*d9f75844SAndroid Build Coastguard Worker     // cleanups members protected by the `mutex`.
104*d9f75844SAndroid Build Coastguard Worker     void SetNotAlive();
105*d9f75844SAndroid Build Coastguard Worker     bool IsAlive();
106*d9f75844SAndroid Build Coastguard Worker 
107*d9f75844SAndroid Build Coastguard Worker     // Copies up to `size` bytes into buffer from the next received packet
108*d9f75844SAndroid Build Coastguard Worker     // and fills `addr` with remote address of that received packet.
109*d9f75844SAndroid Build Coastguard Worker     // Returns number of bytes copied or negative value on failure.
110*d9f75844SAndroid Build Coastguard Worker     int RecvFrom(void* buffer, size_t size, SocketAddress& addr);
111*d9f75844SAndroid Build Coastguard Worker 
112*d9f75844SAndroid Build Coastguard Worker     void Listen();
113*d9f75844SAndroid Build Coastguard Worker 
114*d9f75844SAndroid Build Coastguard Worker     struct AcceptResult {
115*d9f75844SAndroid Build Coastguard Worker       int error = 0;
116*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<VirtualSocket> socket;
117*d9f75844SAndroid Build Coastguard Worker       SocketAddress remote_addr;
118*d9f75844SAndroid Build Coastguard Worker     };
119*d9f75844SAndroid Build Coastguard Worker     AcceptResult Accept();
120*d9f75844SAndroid Build Coastguard Worker 
121*d9f75844SAndroid Build Coastguard Worker     bool AddPacket(std::unique_ptr<Packet> packet);
122*d9f75844SAndroid Build Coastguard Worker     void PostConnect(webrtc::TimeDelta delay, const SocketAddress& remote_addr);
123*d9f75844SAndroid Build Coastguard Worker 
124*d9f75844SAndroid Build Coastguard Worker    private:
125*d9f75844SAndroid Build Coastguard Worker     enum class Signal { kNone, kReadEvent, kConnectEvent };
126*d9f75844SAndroid Build Coastguard Worker     // `PostConnect` rely on the fact that std::list iterators are not
127*d9f75844SAndroid Build Coastguard Worker     // invalidated on any changes to other elements in the container.
128*d9f75844SAndroid Build Coastguard Worker     using PostedConnects = std::list<SocketAddress>;
129*d9f75844SAndroid Build Coastguard Worker 
130*d9f75844SAndroid Build Coastguard Worker     void PostSignalReadEvent() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
131*d9f75844SAndroid Build Coastguard Worker     void MaybeSignalReadEvent();
132*d9f75844SAndroid Build Coastguard Worker     Signal Connect(PostedConnects::iterator remote_addr_it);
133*d9f75844SAndroid Build Coastguard Worker 
134*d9f75844SAndroid Build Coastguard Worker     webrtc::Mutex mutex_;
135*d9f75844SAndroid Build Coastguard Worker     VirtualSocket& socket_;
136*d9f75844SAndroid Build Coastguard Worker     bool alive_ RTC_GUARDED_BY(mutex_) = true;
137*d9f75844SAndroid Build Coastguard Worker     // Flag indicating if async Task to signal SignalReadEvent is posted.
138*d9f75844SAndroid Build Coastguard Worker     // To avoid posting multiple such tasks.
139*d9f75844SAndroid Build Coastguard Worker     bool pending_read_signal_event_ RTC_GUARDED_BY(mutex_) = false;
140*d9f75844SAndroid Build Coastguard Worker 
141*d9f75844SAndroid Build Coastguard Worker     // Members below do not need to outlive VirtualSocket, but are used by the
142*d9f75844SAndroid Build Coastguard Worker     // posted tasks. Keeping them in the VirtualSocket confuses thread
143*d9f75844SAndroid Build Coastguard Worker     // annotations because they can't detect that locked mutex is the same mutex
144*d9f75844SAndroid Build Coastguard Worker     // this members are guarded by.
145*d9f75844SAndroid Build Coastguard Worker 
146*d9f75844SAndroid Build Coastguard Worker     // Addresses of the sockets for potential connect. For each address there
147*d9f75844SAndroid Build Coastguard Worker     // is a posted task that should finilze the connect.
148*d9f75844SAndroid Build Coastguard Worker     PostedConnects posted_connects_ RTC_GUARDED_BY(mutex_);
149*d9f75844SAndroid Build Coastguard Worker 
150*d9f75844SAndroid Build Coastguard Worker     // Data which has been received from the network
151*d9f75844SAndroid Build Coastguard Worker     std::list<std::unique_ptr<Packet>> recv_buffer_ RTC_GUARDED_BY(mutex_);
152*d9f75844SAndroid Build Coastguard Worker 
153*d9f75844SAndroid Build Coastguard Worker     // Pending sockets which can be Accepted
154*d9f75844SAndroid Build Coastguard Worker     absl::optional<std::deque<SocketAddress>> listen_queue_
155*d9f75844SAndroid Build Coastguard Worker         RTC_GUARDED_BY(mutex_);
156*d9f75844SAndroid Build Coastguard Worker   };
157*d9f75844SAndroid Build Coastguard Worker 
158*d9f75844SAndroid Build Coastguard Worker   struct NetworkEntry {
159*d9f75844SAndroid Build Coastguard Worker     size_t size;
160*d9f75844SAndroid Build Coastguard Worker     int64_t done_time;
161*d9f75844SAndroid Build Coastguard Worker   };
162*d9f75844SAndroid Build Coastguard Worker 
163*d9f75844SAndroid Build Coastguard Worker   typedef std::deque<NetworkEntry> NetworkQueue;
164*d9f75844SAndroid Build Coastguard Worker   typedef std::vector<char> SendBuffer;
165*d9f75844SAndroid Build Coastguard Worker   typedef std::map<Option, int> OptionsMap;
166*d9f75844SAndroid Build Coastguard Worker 
167*d9f75844SAndroid Build Coastguard Worker   int InitiateConnect(const SocketAddress& addr, bool use_delay);
168*d9f75844SAndroid Build Coastguard Worker   void CompleteConnect(const SocketAddress& addr);
169*d9f75844SAndroid Build Coastguard Worker   int SendUdp(const void* pv, size_t cb, const SocketAddress& addr);
170*d9f75844SAndroid Build Coastguard Worker   int SendTcp(const void* pv, size_t cb);
171*d9f75844SAndroid Build Coastguard Worker 
172*d9f75844SAndroid Build Coastguard Worker   void OnSocketServerReadyToSend();
173*d9f75844SAndroid Build Coastguard Worker 
174*d9f75844SAndroid Build Coastguard Worker   VirtualSocketServer* const server_;
175*d9f75844SAndroid Build Coastguard Worker   const int type_;
176*d9f75844SAndroid Build Coastguard Worker   ConnState state_;
177*d9f75844SAndroid Build Coastguard Worker   int error_;
178*d9f75844SAndroid Build Coastguard Worker   SocketAddress local_addr_;
179*d9f75844SAndroid Build Coastguard Worker   SocketAddress remote_addr_;
180*d9f75844SAndroid Build Coastguard Worker 
181*d9f75844SAndroid Build Coastguard Worker   const scoped_refptr<SafetyBlock> safety_ =
182*d9f75844SAndroid Build Coastguard Worker       make_ref_counted<SafetyBlock>(this);
183*d9f75844SAndroid Build Coastguard Worker 
184*d9f75844SAndroid Build Coastguard Worker   // Data which tcp has buffered for sending
185*d9f75844SAndroid Build Coastguard Worker   SendBuffer send_buffer_;
186*d9f75844SAndroid Build Coastguard Worker   // Set to false if the last attempt to send resulted in EWOULDBLOCK.
187*d9f75844SAndroid Build Coastguard Worker   // Set back to true when the socket can send again.
188*d9f75844SAndroid Build Coastguard Worker   bool ready_to_send_ = true;
189*d9f75844SAndroid Build Coastguard Worker 
190*d9f75844SAndroid Build Coastguard Worker   // Network model that enforces bandwidth and capacity constraints
191*d9f75844SAndroid Build Coastguard Worker   NetworkQueue network_;
192*d9f75844SAndroid Build Coastguard Worker   size_t network_size_;
193*d9f75844SAndroid Build Coastguard Worker   // The scheduled delivery time of the last packet sent on this socket.
194*d9f75844SAndroid Build Coastguard Worker   // It is used to ensure ordered delivery of packets sent on this socket.
195*d9f75844SAndroid Build Coastguard Worker   int64_t last_delivery_time_ = 0;
196*d9f75844SAndroid Build Coastguard Worker 
197*d9f75844SAndroid Build Coastguard Worker   // The amount of data which is in flight or in recv_buffer_
198*d9f75844SAndroid Build Coastguard Worker   size_t recv_buffer_size_;
199*d9f75844SAndroid Build Coastguard Worker 
200*d9f75844SAndroid Build Coastguard Worker   // Is this socket bound?
201*d9f75844SAndroid Build Coastguard Worker   bool bound_;
202*d9f75844SAndroid Build Coastguard Worker 
203*d9f75844SAndroid Build Coastguard Worker   // When we bind a socket to Any, VSS's Bind gives it another address. For
204*d9f75844SAndroid Build Coastguard Worker   // dual-stack sockets, we want to distinguish between sockets that were
205*d9f75844SAndroid Build Coastguard Worker   // explicitly given a particular address and sockets that had one picked
206*d9f75844SAndroid Build Coastguard Worker   // for them by VSS.
207*d9f75844SAndroid Build Coastguard Worker   bool was_any_;
208*d9f75844SAndroid Build Coastguard Worker 
209*d9f75844SAndroid Build Coastguard Worker   // Store the options that are set
210*d9f75844SAndroid Build Coastguard Worker   OptionsMap options_map_;
211*d9f75844SAndroid Build Coastguard Worker };
212*d9f75844SAndroid Build Coastguard Worker 
213*d9f75844SAndroid Build Coastguard Worker // Simulates a network in the same manner as a loopback interface.  The
214*d9f75844SAndroid Build Coastguard Worker // interface can create as many addresses as you want.  All of the sockets
215*d9f75844SAndroid Build Coastguard Worker // created by this network will be able to communicate with one another, unless
216*d9f75844SAndroid Build Coastguard Worker // they are bound to addresses from incompatible families.
217*d9f75844SAndroid Build Coastguard Worker class VirtualSocketServer : public SocketServer {
218*d9f75844SAndroid Build Coastguard Worker  public:
219*d9f75844SAndroid Build Coastguard Worker   VirtualSocketServer();
220*d9f75844SAndroid Build Coastguard Worker   // This constructor needs to be used if the test uses a fake clock and
221*d9f75844SAndroid Build Coastguard Worker   // ProcessMessagesUntilIdle, since ProcessMessagesUntilIdle needs a way of
222*d9f75844SAndroid Build Coastguard Worker   // advancing time.
223*d9f75844SAndroid Build Coastguard Worker   explicit VirtualSocketServer(ThreadProcessingFakeClock* fake_clock);
224*d9f75844SAndroid Build Coastguard Worker   ~VirtualSocketServer() override;
225*d9f75844SAndroid Build Coastguard Worker 
226*d9f75844SAndroid Build Coastguard Worker   VirtualSocketServer(const VirtualSocketServer&) = delete;
227*d9f75844SAndroid Build Coastguard Worker   VirtualSocketServer& operator=(const VirtualSocketServer&) = delete;
228*d9f75844SAndroid Build Coastguard Worker 
229*d9f75844SAndroid Build Coastguard Worker   // The default source address specifies which local address to use when a
230*d9f75844SAndroid Build Coastguard Worker   // socket is bound to the 'any' address, e.g. 0.0.0.0. (If not set, the 'any'
231*d9f75844SAndroid Build Coastguard Worker   // address is used as the source address on outgoing virtual packets, exposed
232*d9f75844SAndroid Build Coastguard Worker   // to recipient's RecvFrom).
233*d9f75844SAndroid Build Coastguard Worker   IPAddress GetDefaultSourceAddress(int family);
234*d9f75844SAndroid Build Coastguard Worker   void SetDefaultSourceAddress(const IPAddress& from_addr);
235*d9f75844SAndroid Build Coastguard Worker 
236*d9f75844SAndroid Build Coastguard Worker   // Limits the network bandwidth (maximum bytes per second).  Zero means that
237*d9f75844SAndroid Build Coastguard Worker   // all sends occur instantly.  Defaults to 0.
238*d9f75844SAndroid Build Coastguard Worker   void set_bandwidth(uint32_t bandwidth) RTC_LOCKS_EXCLUDED(mutex_);
239*d9f75844SAndroid Build Coastguard Worker 
240*d9f75844SAndroid Build Coastguard Worker   // Limits the amount of data which can be in flight on the network without
241*d9f75844SAndroid Build Coastguard Worker   // packet loss (on a per sender basis).  Defaults to 64 KB.
242*d9f75844SAndroid Build Coastguard Worker   void set_network_capacity(uint32_t capacity) RTC_LOCKS_EXCLUDED(mutex_);
243*d9f75844SAndroid Build Coastguard Worker 
244*d9f75844SAndroid Build Coastguard Worker   // The amount of data which can be buffered by tcp on the sender's side
245*d9f75844SAndroid Build Coastguard Worker   uint32_t send_buffer_capacity() const RTC_LOCKS_EXCLUDED(mutex_);
246*d9f75844SAndroid Build Coastguard Worker   void set_send_buffer_capacity(uint32_t capacity) RTC_LOCKS_EXCLUDED(mutex_);
247*d9f75844SAndroid Build Coastguard Worker 
248*d9f75844SAndroid Build Coastguard Worker   // The amount of data which can be buffered by tcp on the receiver's side
249*d9f75844SAndroid Build Coastguard Worker   uint32_t recv_buffer_capacity() const RTC_LOCKS_EXCLUDED(mutex_);
250*d9f75844SAndroid Build Coastguard Worker   void set_recv_buffer_capacity(uint32_t capacity) RTC_LOCKS_EXCLUDED(mutex_);
251*d9f75844SAndroid Build Coastguard Worker 
252*d9f75844SAndroid Build Coastguard Worker   // Controls the (transit) delay for packets sent in the network.  This does
253*d9f75844SAndroid Build Coastguard Worker   // not inclue the time required to sit in the send queue.  Both of these
254*d9f75844SAndroid Build Coastguard Worker   // values are measured in milliseconds.  Defaults to no delay.
255*d9f75844SAndroid Build Coastguard Worker   void set_delay_mean(uint32_t delay_mean) RTC_LOCKS_EXCLUDED(mutex_);
256*d9f75844SAndroid Build Coastguard Worker   void set_delay_stddev(uint32_t delay_stddev) RTC_LOCKS_EXCLUDED(mutex_);
257*d9f75844SAndroid Build Coastguard Worker   void set_delay_samples(uint32_t delay_samples) RTC_LOCKS_EXCLUDED(mutex_);
258*d9f75844SAndroid Build Coastguard Worker 
259*d9f75844SAndroid Build Coastguard Worker   // If the (transit) delay parameters are modified, this method should be
260*d9f75844SAndroid Build Coastguard Worker   // called to recompute the new distribution.
261*d9f75844SAndroid Build Coastguard Worker   void UpdateDelayDistribution() RTC_LOCKS_EXCLUDED(mutex_);
262*d9f75844SAndroid Build Coastguard Worker 
263*d9f75844SAndroid Build Coastguard Worker   // Controls the (uniform) probability that any sent packet is dropped.  This
264*d9f75844SAndroid Build Coastguard Worker   // is separate from calculations to drop based on queue size.
265*d9f75844SAndroid Build Coastguard Worker   void set_drop_probability(double drop_prob) RTC_LOCKS_EXCLUDED(mutex_);
266*d9f75844SAndroid Build Coastguard Worker 
267*d9f75844SAndroid Build Coastguard Worker   // Controls the maximum UDP payload for the networks simulated
268*d9f75844SAndroid Build Coastguard Worker   // by this server. Any UDP payload sent that is larger than this will
269*d9f75844SAndroid Build Coastguard Worker   // be dropped.
270*d9f75844SAndroid Build Coastguard Worker   void set_max_udp_payload(size_t payload_size) RTC_LOCKS_EXCLUDED(mutex_);
271*d9f75844SAndroid Build Coastguard Worker 
272*d9f75844SAndroid Build Coastguard Worker   // If `blocked` is true, subsequent attempts to send will result in -1 being
273*d9f75844SAndroid Build Coastguard Worker   // returned, with the socket error set to EWOULDBLOCK.
274*d9f75844SAndroid Build Coastguard Worker   //
275*d9f75844SAndroid Build Coastguard Worker   // If this method is later called with `blocked` set to false, any sockets
276*d9f75844SAndroid Build Coastguard Worker   // that previously failed to send with EWOULDBLOCK will emit SignalWriteEvent.
277*d9f75844SAndroid Build Coastguard Worker   //
278*d9f75844SAndroid Build Coastguard Worker   // This can be used to simulate the send buffer on a network interface being
279*d9f75844SAndroid Build Coastguard Worker   // full, and test functionality related to EWOULDBLOCK/SignalWriteEvent.
280*d9f75844SAndroid Build Coastguard Worker   void SetSendingBlocked(bool blocked) RTC_LOCKS_EXCLUDED(mutex_);
281*d9f75844SAndroid Build Coastguard Worker 
282*d9f75844SAndroid Build Coastguard Worker   // SocketFactory:
283*d9f75844SAndroid Build Coastguard Worker   VirtualSocket* CreateSocket(int family, int type) override;
284*d9f75844SAndroid Build Coastguard Worker 
285*d9f75844SAndroid Build Coastguard Worker   // SocketServer:
286*d9f75844SAndroid Build Coastguard Worker   void SetMessageQueue(Thread* queue) override;
287*d9f75844SAndroid Build Coastguard Worker   bool Wait(webrtc::TimeDelta max_wait_duration, bool process_io) override;
288*d9f75844SAndroid Build Coastguard Worker   void WakeUp() override;
289*d9f75844SAndroid Build Coastguard Worker 
SetDelayOnAddress(const rtc::SocketAddress & address,int delay_ms)290*d9f75844SAndroid Build Coastguard Worker   void SetDelayOnAddress(const rtc::SocketAddress& address, int delay_ms) {
291*d9f75844SAndroid Build Coastguard Worker     delay_by_ip_[address.ipaddr()] = delay_ms;
292*d9f75844SAndroid Build Coastguard Worker   }
293*d9f75844SAndroid Build Coastguard Worker 
294*d9f75844SAndroid Build Coastguard Worker   // Used by TurnPortTest and TcpPortTest (for example), to mimic a case where
295*d9f75844SAndroid Build Coastguard Worker   // a proxy returns the local host address instead of the original one the
296*d9f75844SAndroid Build Coastguard Worker   // port was bound against. Please see WebRTC issue 3927 for more detail.
297*d9f75844SAndroid Build Coastguard Worker   //
298*d9f75844SAndroid Build Coastguard Worker   // If SetAlternativeLocalAddress(A, B) is called, then when something
299*d9f75844SAndroid Build Coastguard Worker   // attempts to bind a socket to address A, it will get a socket bound to
300*d9f75844SAndroid Build Coastguard Worker   // address B instead.
301*d9f75844SAndroid Build Coastguard Worker   void SetAlternativeLocalAddress(const rtc::IPAddress& address,
302*d9f75844SAndroid Build Coastguard Worker                                   const rtc::IPAddress& alternative);
303*d9f75844SAndroid Build Coastguard Worker 
304*d9f75844SAndroid Build Coastguard Worker   typedef std::pair<double, double> Point;
305*d9f75844SAndroid Build Coastguard Worker   typedef std::vector<Point> Function;
306*d9f75844SAndroid Build Coastguard Worker 
307*d9f75844SAndroid Build Coastguard Worker   static std::unique_ptr<Function> CreateDistribution(uint32_t mean,
308*d9f75844SAndroid Build Coastguard Worker                                                       uint32_t stddev,
309*d9f75844SAndroid Build Coastguard Worker                                                       uint32_t samples);
310*d9f75844SAndroid Build Coastguard Worker 
311*d9f75844SAndroid Build Coastguard Worker   // Similar to Thread::ProcessMessages, but it only processes messages until
312*d9f75844SAndroid Build Coastguard Worker   // there are no immediate messages or pending network traffic.  Returns false
313*d9f75844SAndroid Build Coastguard Worker   // if Thread::Stop() was called.
314*d9f75844SAndroid Build Coastguard Worker   bool ProcessMessagesUntilIdle();
315*d9f75844SAndroid Build Coastguard Worker 
316*d9f75844SAndroid Build Coastguard Worker   // Sets the next port number to use for testing.
317*d9f75844SAndroid Build Coastguard Worker   void SetNextPortForTesting(uint16_t port);
318*d9f75844SAndroid Build Coastguard Worker 
319*d9f75844SAndroid Build Coastguard Worker   // Close a pair of Tcp connections by addresses. Both connections will have
320*d9f75844SAndroid Build Coastguard Worker   // its own OnClose invoked.
321*d9f75844SAndroid Build Coastguard Worker   bool CloseTcpConnections(const SocketAddress& addr_local,
322*d9f75844SAndroid Build Coastguard Worker                            const SocketAddress& addr_remote);
323*d9f75844SAndroid Build Coastguard Worker 
324*d9f75844SAndroid Build Coastguard Worker   // Number of packets that clients have attempted to send through this virtual
325*d9f75844SAndroid Build Coastguard Worker   // socket server. Intended to be used for test assertions.
326*d9f75844SAndroid Build Coastguard Worker   uint32_t sent_packets() const RTC_LOCKS_EXCLUDED(mutex_);
327*d9f75844SAndroid Build Coastguard Worker 
328*d9f75844SAndroid Build Coastguard Worker   // Assign IP and Port if application's address is unspecified. Also apply
329*d9f75844SAndroid Build Coastguard Worker   // `alternative_address_mapping_`.
330*d9f75844SAndroid Build Coastguard Worker   SocketAddress AssignBindAddress(const SocketAddress& app_addr);
331*d9f75844SAndroid Build Coastguard Worker 
332*d9f75844SAndroid Build Coastguard Worker   // Binds the given socket to the given (fully-defined) address.
333*d9f75844SAndroid Build Coastguard Worker   int Bind(VirtualSocket* socket, const SocketAddress& addr);
334*d9f75844SAndroid Build Coastguard Worker 
335*d9f75844SAndroid Build Coastguard Worker   int Unbind(const SocketAddress& addr, VirtualSocket* socket);
336*d9f75844SAndroid Build Coastguard Worker 
337*d9f75844SAndroid Build Coastguard Worker   // Adds a mapping between this socket pair and the socket.
338*d9f75844SAndroid Build Coastguard Worker   void AddConnection(const SocketAddress& client,
339*d9f75844SAndroid Build Coastguard Worker                      const SocketAddress& server,
340*d9f75844SAndroid Build Coastguard Worker                      VirtualSocket* socket);
341*d9f75844SAndroid Build Coastguard Worker 
342*d9f75844SAndroid Build Coastguard Worker   // Connects the given socket to the socket at the given address
343*d9f75844SAndroid Build Coastguard Worker   int Connect(VirtualSocket* socket,
344*d9f75844SAndroid Build Coastguard Worker               const SocketAddress& remote_addr,
345*d9f75844SAndroid Build Coastguard Worker               bool use_delay);
346*d9f75844SAndroid Build Coastguard Worker 
347*d9f75844SAndroid Build Coastguard Worker   // Sends a disconnect message to the socket at the given address
348*d9f75844SAndroid Build Coastguard Worker   bool Disconnect(VirtualSocket* socket);
349*d9f75844SAndroid Build Coastguard Worker 
350*d9f75844SAndroid Build Coastguard Worker   // Lookup address, and disconnect corresponding socket.
351*d9f75844SAndroid Build Coastguard Worker   bool Disconnect(const SocketAddress& addr);
352*d9f75844SAndroid Build Coastguard Worker 
353*d9f75844SAndroid Build Coastguard Worker   // Lookup connection, close corresponding socket.
354*d9f75844SAndroid Build Coastguard Worker   bool Disconnect(const SocketAddress& local_addr,
355*d9f75844SAndroid Build Coastguard Worker                   const SocketAddress& remote_addr);
356*d9f75844SAndroid Build Coastguard Worker 
357*d9f75844SAndroid Build Coastguard Worker   // Sends the given packet to the socket at the given address (if one exists).
358*d9f75844SAndroid Build Coastguard Worker   int SendUdp(VirtualSocket* socket,
359*d9f75844SAndroid Build Coastguard Worker               const char* data,
360*d9f75844SAndroid Build Coastguard Worker               size_t data_size,
361*d9f75844SAndroid Build Coastguard Worker               const SocketAddress& remote_addr);
362*d9f75844SAndroid Build Coastguard Worker 
363*d9f75844SAndroid Build Coastguard Worker   // Moves as much data as possible from the sender's buffer to the network
364*d9f75844SAndroid Build Coastguard Worker   void SendTcp(VirtualSocket* socket) RTC_LOCKS_EXCLUDED(mutex_);
365*d9f75844SAndroid Build Coastguard Worker 
366*d9f75844SAndroid Build Coastguard Worker   // Like above, but lookup sender by address.
367*d9f75844SAndroid Build Coastguard Worker   void SendTcp(const SocketAddress& addr) RTC_LOCKS_EXCLUDED(mutex_);
368*d9f75844SAndroid Build Coastguard Worker 
369*d9f75844SAndroid Build Coastguard Worker   // Computes the number of milliseconds required to send a packet of this size.
370*d9f75844SAndroid Build Coastguard Worker   uint32_t SendDelay(uint32_t size) RTC_LOCKS_EXCLUDED(mutex_);
371*d9f75844SAndroid Build Coastguard Worker 
372*d9f75844SAndroid Build Coastguard Worker   // Sending was previously blocked, but now isn't.
373*d9f75844SAndroid Build Coastguard Worker   sigslot::signal0<> SignalReadyToSend;
374*d9f75844SAndroid Build Coastguard Worker 
375*d9f75844SAndroid Build Coastguard Worker  protected:
376*d9f75844SAndroid Build Coastguard Worker   // Returns a new IP not used before in this network.
377*d9f75844SAndroid Build Coastguard Worker   IPAddress GetNextIP(int family);
378*d9f75844SAndroid Build Coastguard Worker 
379*d9f75844SAndroid Build Coastguard Worker   // Find the socket bound to the given address
380*d9f75844SAndroid Build Coastguard Worker   VirtualSocket* LookupBinding(const SocketAddress& addr);
381*d9f75844SAndroid Build Coastguard Worker 
382*d9f75844SAndroid Build Coastguard Worker  private:
383*d9f75844SAndroid Build Coastguard Worker   friend VirtualSocket;
384*d9f75844SAndroid Build Coastguard Worker   uint16_t GetNextPort();
385*d9f75844SAndroid Build Coastguard Worker 
386*d9f75844SAndroid Build Coastguard Worker   // Find the socket pair corresponding to this server address.
387*d9f75844SAndroid Build Coastguard Worker   VirtualSocket* LookupConnection(const SocketAddress& client,
388*d9f75844SAndroid Build Coastguard Worker                                   const SocketAddress& server);
389*d9f75844SAndroid Build Coastguard Worker 
390*d9f75844SAndroid Build Coastguard Worker   void RemoveConnection(const SocketAddress& client,
391*d9f75844SAndroid Build Coastguard Worker                         const SocketAddress& server);
392*d9f75844SAndroid Build Coastguard Worker 
393*d9f75844SAndroid Build Coastguard Worker   // Places a packet on the network.
394*d9f75844SAndroid Build Coastguard Worker   void AddPacketToNetwork(VirtualSocket* socket,
395*d9f75844SAndroid Build Coastguard Worker                           VirtualSocket* recipient,
396*d9f75844SAndroid Build Coastguard Worker                           int64_t cur_time,
397*d9f75844SAndroid Build Coastguard Worker                           const char* data,
398*d9f75844SAndroid Build Coastguard Worker                           size_t data_size,
399*d9f75844SAndroid Build Coastguard Worker                           size_t header_size,
400*d9f75844SAndroid Build Coastguard Worker                           bool ordered);
401*d9f75844SAndroid Build Coastguard Worker 
402*d9f75844SAndroid Build Coastguard Worker   // If the delay has been set for the address of the socket, returns the set
403*d9f75844SAndroid Build Coastguard Worker   // delay. Otherwise, returns a random transit delay chosen from the
404*d9f75844SAndroid Build Coastguard Worker   // appropriate distribution.
405*d9f75844SAndroid Build Coastguard Worker   uint32_t GetTransitDelay(Socket* socket);
406*d9f75844SAndroid Build Coastguard Worker 
407*d9f75844SAndroid Build Coastguard Worker   // Basic operations on functions.
408*d9f75844SAndroid Build Coastguard Worker   static std::unique_ptr<Function> Accumulate(std::unique_ptr<Function> f);
409*d9f75844SAndroid Build Coastguard Worker   static std::unique_ptr<Function> Invert(std::unique_ptr<Function> f);
410*d9f75844SAndroid Build Coastguard Worker   static std::unique_ptr<Function> Resample(std::unique_ptr<Function> f,
411*d9f75844SAndroid Build Coastguard Worker                                             double x1,
412*d9f75844SAndroid Build Coastguard Worker                                             double x2,
413*d9f75844SAndroid Build Coastguard Worker                                             uint32_t samples);
414*d9f75844SAndroid Build Coastguard Worker   static double Evaluate(const Function* f, double x);
415*d9f75844SAndroid Build Coastguard Worker 
416*d9f75844SAndroid Build Coastguard Worker   // Determine if two sockets should be able to communicate.
417*d9f75844SAndroid Build Coastguard Worker   // We don't (currently) specify an address family for sockets; instead,
418*d9f75844SAndroid Build Coastguard Worker   // the currently bound address is used to infer the address family.
419*d9f75844SAndroid Build Coastguard Worker   // Any socket that is not explicitly bound to an IPv4 address is assumed to be
420*d9f75844SAndroid Build Coastguard Worker   // dual-stack capable.
421*d9f75844SAndroid Build Coastguard Worker   // This function tests if two addresses can communicate, as well as the
422*d9f75844SAndroid Build Coastguard Worker   // sockets to which they may be bound (the addresses may or may not yet be
423*d9f75844SAndroid Build Coastguard Worker   // bound to the sockets).
424*d9f75844SAndroid Build Coastguard Worker   // First the addresses are tested (after normalization):
425*d9f75844SAndroid Build Coastguard Worker   // If both have the same family, then communication is OK.
426*d9f75844SAndroid Build Coastguard Worker   // If only one is IPv4 then false, unless the other is bound to ::.
427*d9f75844SAndroid Build Coastguard Worker   // This applies even if the IPv4 address is 0.0.0.0.
428*d9f75844SAndroid Build Coastguard Worker   // The socket arguments are optional; the sockets are checked to see if they
429*d9f75844SAndroid Build Coastguard Worker   // were explicitly bound to IPv6-any ('::'), and if so communication is
430*d9f75844SAndroid Build Coastguard Worker   // permitted.
431*d9f75844SAndroid Build Coastguard Worker   // NB: This scheme doesn't permit non-dualstack IPv6 sockets.
432*d9f75844SAndroid Build Coastguard Worker   static bool CanInteractWith(VirtualSocket* local, VirtualSocket* remote);
433*d9f75844SAndroid Build Coastguard Worker 
434*d9f75844SAndroid Build Coastguard Worker   typedef std::map<SocketAddress, VirtualSocket*> AddressMap;
435*d9f75844SAndroid Build Coastguard Worker   typedef std::map<SocketAddressPair, VirtualSocket*> ConnectionMap;
436*d9f75844SAndroid Build Coastguard Worker 
437*d9f75844SAndroid Build Coastguard Worker   // May be null if the test doesn't use a fake clock, or it does but doesn't
438*d9f75844SAndroid Build Coastguard Worker   // use ProcessMessagesUntilIdle.
439*d9f75844SAndroid Build Coastguard Worker   ThreadProcessingFakeClock* fake_clock_ = nullptr;
440*d9f75844SAndroid Build Coastguard Worker 
441*d9f75844SAndroid Build Coastguard Worker   // Used to implement Wait/WakeUp.
442*d9f75844SAndroid Build Coastguard Worker   Event wakeup_;
443*d9f75844SAndroid Build Coastguard Worker   Thread* msg_queue_;
444*d9f75844SAndroid Build Coastguard Worker   bool stop_on_idle_;
445*d9f75844SAndroid Build Coastguard Worker   in_addr next_ipv4_;
446*d9f75844SAndroid Build Coastguard Worker   in6_addr next_ipv6_;
447*d9f75844SAndroid Build Coastguard Worker   uint16_t next_port_;
448*d9f75844SAndroid Build Coastguard Worker   AddressMap* bindings_;
449*d9f75844SAndroid Build Coastguard Worker   ConnectionMap* connections_;
450*d9f75844SAndroid Build Coastguard Worker 
451*d9f75844SAndroid Build Coastguard Worker   IPAddress default_source_address_v4_;
452*d9f75844SAndroid Build Coastguard Worker   IPAddress default_source_address_v6_;
453*d9f75844SAndroid Build Coastguard Worker 
454*d9f75844SAndroid Build Coastguard Worker   mutable webrtc::Mutex mutex_;
455*d9f75844SAndroid Build Coastguard Worker 
456*d9f75844SAndroid Build Coastguard Worker   uint32_t bandwidth_ RTC_GUARDED_BY(mutex_);
457*d9f75844SAndroid Build Coastguard Worker   uint32_t network_capacity_ RTC_GUARDED_BY(mutex_);
458*d9f75844SAndroid Build Coastguard Worker   uint32_t send_buffer_capacity_ RTC_GUARDED_BY(mutex_);
459*d9f75844SAndroid Build Coastguard Worker   uint32_t recv_buffer_capacity_ RTC_GUARDED_BY(mutex_);
460*d9f75844SAndroid Build Coastguard Worker   uint32_t delay_mean_ RTC_GUARDED_BY(mutex_);
461*d9f75844SAndroid Build Coastguard Worker   uint32_t delay_stddev_ RTC_GUARDED_BY(mutex_);
462*d9f75844SAndroid Build Coastguard Worker   uint32_t delay_samples_ RTC_GUARDED_BY(mutex_);
463*d9f75844SAndroid Build Coastguard Worker 
464*d9f75844SAndroid Build Coastguard Worker   // Used for testing.
465*d9f75844SAndroid Build Coastguard Worker   uint32_t sent_packets_ RTC_GUARDED_BY(mutex_) = 0;
466*d9f75844SAndroid Build Coastguard Worker 
467*d9f75844SAndroid Build Coastguard Worker   std::map<rtc::IPAddress, int> delay_by_ip_;
468*d9f75844SAndroid Build Coastguard Worker   std::map<rtc::IPAddress, rtc::IPAddress> alternative_address_mapping_;
469*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<Function> delay_dist_;
470*d9f75844SAndroid Build Coastguard Worker 
471*d9f75844SAndroid Build Coastguard Worker   double drop_prob_ RTC_GUARDED_BY(mutex_);
472*d9f75844SAndroid Build Coastguard Worker   // The largest UDP payload permitted on this virtual socket server.
473*d9f75844SAndroid Build Coastguard Worker   // The default is the max size of IPv4 fragmented UDP packet payload:
474*d9f75844SAndroid Build Coastguard Worker   // 65535 bytes - 8 bytes UDP header - 20 bytes IP header.
475*d9f75844SAndroid Build Coastguard Worker   size_t max_udp_payload_ RTC_GUARDED_BY(mutex_) = 65507;
476*d9f75844SAndroid Build Coastguard Worker 
477*d9f75844SAndroid Build Coastguard Worker   bool sending_blocked_ RTC_GUARDED_BY(mutex_) = false;
478*d9f75844SAndroid Build Coastguard Worker };
479*d9f75844SAndroid Build Coastguard Worker 
480*d9f75844SAndroid Build Coastguard Worker }  // namespace rtc
481*d9f75844SAndroid Build Coastguard Worker 
482*d9f75844SAndroid Build Coastguard Worker #endif  // RTC_BASE_VIRTUAL_SOCKET_SERVER_H_
483