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