1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_SOCKET_UDP_SOCKET_POSIX_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_UDP_SOCKET_POSIX_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker #include <sys/socket.h> 10*6777b538SAndroid Build Coastguard Worker #include <sys/types.h> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include <memory> 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #include "base/logging.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 17*6777b538SAndroid Build Coastguard Worker #include "base/message_loop/message_pump_for_io.h" 18*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_checker.h" 19*6777b538SAndroid Build Coastguard Worker #include "base/timer/timer.h" 20*6777b538SAndroid Build Coastguard Worker #include "net/base/address_family.h" 21*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 22*6777b538SAndroid Build Coastguard Worker #include "net/base/io_buffer.h" 23*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_endpoint.h" 24*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 25*6777b538SAndroid Build Coastguard Worker #include "net/base/network_handle.h" 26*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h" 27*6777b538SAndroid Build Coastguard Worker #include "net/socket/datagram_socket.h" 28*6777b538SAndroid Build Coastguard Worker #include "net/socket/diff_serv_code_point.h" 29*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_descriptor.h" 30*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_tag.h" 31*6777b538SAndroid Build Coastguard Worker #include "net/socket/udp_socket_global_limits.h" 32*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h" 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker namespace net { 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker class IPAddress; 37*6777b538SAndroid Build Coastguard Worker class NetLog; 38*6777b538SAndroid Build Coastguard Worker struct NetLogSource; 39*6777b538SAndroid Build Coastguard Worker class SocketTag; 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker class NET_EXPORT UDPSocketPosix { 42*6777b538SAndroid Build Coastguard Worker public: 43*6777b538SAndroid Build Coastguard Worker // Performance helper for net::activity_monitor, it batches 44*6777b538SAndroid Build Coastguard Worker // throughput samples, subject to a byte limit threshold (64 KB) or 45*6777b538SAndroid Build Coastguard Worker // timer (100 ms), whichever comes first. The batching is subject 46*6777b538SAndroid Build Coastguard Worker // to a minimum number of samples (2) required by NQE to update its 47*6777b538SAndroid Build Coastguard Worker // throughput estimate. 48*6777b538SAndroid Build Coastguard Worker class ReceivedActivityMonitor { 49*6777b538SAndroid Build Coastguard Worker public: 50*6777b538SAndroid Build Coastguard Worker ReceivedActivityMonitor() = default; 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker ReceivedActivityMonitor(const ReceivedActivityMonitor&) = delete; 53*6777b538SAndroid Build Coastguard Worker ReceivedActivityMonitor& operator=(const ReceivedActivityMonitor&) = delete; 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker ~ReceivedActivityMonitor() = default; 56*6777b538SAndroid Build Coastguard Worker // Provided by sent/received subclass. 57*6777b538SAndroid Build Coastguard Worker // Update throughput, but batch to limit overhead of net::activity_monitor. 58*6777b538SAndroid Build Coastguard Worker void Increment(uint32_t bytes); 59*6777b538SAndroid Build Coastguard Worker // For flushing cached values. 60*6777b538SAndroid Build Coastguard Worker void OnClose(); 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker private: 63*6777b538SAndroid Build Coastguard Worker void Update(); 64*6777b538SAndroid Build Coastguard Worker void OnTimerFired(); 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker uint32_t bytes_ = 0; 67*6777b538SAndroid Build Coastguard Worker uint32_t increments_ = 0; 68*6777b538SAndroid Build Coastguard Worker base::RepeatingTimer timer_; 69*6777b538SAndroid Build Coastguard Worker }; 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker UDPSocketPosix(DatagramSocket::BindType bind_type, 72*6777b538SAndroid Build Coastguard Worker net::NetLog* net_log, 73*6777b538SAndroid Build Coastguard Worker const net::NetLogSource& source); 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker UDPSocketPosix(DatagramSocket::BindType bind_type, 76*6777b538SAndroid Build Coastguard Worker NetLogWithSource source_net_log); 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker UDPSocketPosix(const UDPSocketPosix&) = delete; 79*6777b538SAndroid Build Coastguard Worker UDPSocketPosix& operator=(const UDPSocketPosix&) = delete; 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker virtual ~UDPSocketPosix(); 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker // Opens the socket. 84*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 85*6777b538SAndroid Build Coastguard Worker int Open(AddressFamily address_family); 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker // Binds this socket to |network|. All data traffic on the socket will be sent 88*6777b538SAndroid Build Coastguard Worker // and received via |network|. Must be called before Connect(). This call will 89*6777b538SAndroid Build Coastguard Worker // fail if |network| has disconnected. Communication using this socket will 90*6777b538SAndroid Build Coastguard Worker // fail if |network| disconnects. 91*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 92*6777b538SAndroid Build Coastguard Worker int BindToNetwork(handles::NetworkHandle network); 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker // Connects the socket to connect with a certain |address|. 95*6777b538SAndroid Build Coastguard Worker // Should be called after Open(). 96*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 97*6777b538SAndroid Build Coastguard Worker int Connect(const IPEndPoint& address); 98*6777b538SAndroid Build Coastguard Worker 99*6777b538SAndroid Build Coastguard Worker // Binds the address/port for this socket to |address|. This is generally 100*6777b538SAndroid Build Coastguard Worker // only used on a server. Should be called after Open(). 101*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 102*6777b538SAndroid Build Coastguard Worker int Bind(const IPEndPoint& address); 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker // Closes the socket. 105*6777b538SAndroid Build Coastguard Worker void Close(); 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker // Copies the remote udp address into |address| and returns a net error code. 108*6777b538SAndroid Build Coastguard Worker int GetPeerAddress(IPEndPoint* address) const; 109*6777b538SAndroid Build Coastguard Worker 110*6777b538SAndroid Build Coastguard Worker // Copies the local udp address into |address| and returns a net error code. 111*6777b538SAndroid Build Coastguard Worker // (similar to getsockname) 112*6777b538SAndroid Build Coastguard Worker int GetLocalAddress(IPEndPoint* address) const; 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker // IO: 115*6777b538SAndroid Build Coastguard Worker // Multiple outstanding read requests are not supported. 116*6777b538SAndroid Build Coastguard Worker // Full duplex mode (reading and writing at the same time) is supported 117*6777b538SAndroid Build Coastguard Worker 118*6777b538SAndroid Build Coastguard Worker // Reads from the socket. 119*6777b538SAndroid Build Coastguard Worker // Only usable from the client-side of a UDP socket, after the socket 120*6777b538SAndroid Build Coastguard Worker // has been connected. 121*6777b538SAndroid Build Coastguard Worker int Read(IOBuffer* buf, int buf_len, CompletionOnceCallback callback); 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Worker // Writes to the socket. 124*6777b538SAndroid Build Coastguard Worker // Only usable from the client-side of a UDP socket, after the socket 125*6777b538SAndroid Build Coastguard Worker // has been connected. 126*6777b538SAndroid Build Coastguard Worker int Write(IOBuffer* buf, 127*6777b538SAndroid Build Coastguard Worker int buf_len, 128*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 129*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& traffic_annotation); 130*6777b538SAndroid Build Coastguard Worker 131*6777b538SAndroid Build Coastguard Worker // Reads from a socket and receive sender address information. 132*6777b538SAndroid Build Coastguard Worker // |buf| is the buffer to read data into. 133*6777b538SAndroid Build Coastguard Worker // |buf_len| is the maximum amount of data to read. 134*6777b538SAndroid Build Coastguard Worker // |address| is a buffer provided by the caller for receiving the sender 135*6777b538SAndroid Build Coastguard Worker // address information about the received data. This buffer must be kept 136*6777b538SAndroid Build Coastguard Worker // alive by the caller until the callback is placed. 137*6777b538SAndroid Build Coastguard Worker // |callback| is the callback on completion of the RecvFrom. 138*6777b538SAndroid Build Coastguard Worker // Returns a net error code, or ERR_IO_PENDING if the IO is in progress. 139*6777b538SAndroid Build Coastguard Worker // If ERR_IO_PENDING is returned, this socket takes a ref to |buf| to keep 140*6777b538SAndroid Build Coastguard Worker // it alive until the data is received. However, the caller must keep 141*6777b538SAndroid Build Coastguard Worker // |address| alive until the callback is called. 142*6777b538SAndroid Build Coastguard Worker int RecvFrom(IOBuffer* buf, 143*6777b538SAndroid Build Coastguard Worker int buf_len, 144*6777b538SAndroid Build Coastguard Worker IPEndPoint* address, 145*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback); 146*6777b538SAndroid Build Coastguard Worker 147*6777b538SAndroid Build Coastguard Worker // Sends to a socket with a particular destination. 148*6777b538SAndroid Build Coastguard Worker // |buf| is the buffer to send. 149*6777b538SAndroid Build Coastguard Worker // |buf_len| is the number of bytes to send. 150*6777b538SAndroid Build Coastguard Worker // |address| is the recipient address. 151*6777b538SAndroid Build Coastguard Worker // |callback| is the user callback function to call on complete. 152*6777b538SAndroid Build Coastguard Worker // Returns a net error code, or ERR_IO_PENDING if the IO is in progress. 153*6777b538SAndroid Build Coastguard Worker // If ERR_IO_PENDING is returned, this socket copies |address| for 154*6777b538SAndroid Build Coastguard Worker // asynchronous sending, and takes a ref to |buf| to keep it alive until the 155*6777b538SAndroid Build Coastguard Worker // data is sent. 156*6777b538SAndroid Build Coastguard Worker int SendTo(IOBuffer* buf, 157*6777b538SAndroid Build Coastguard Worker int buf_len, 158*6777b538SAndroid Build Coastguard Worker const IPEndPoint& address, 159*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback); 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Worker // Sets the receive buffer size (in bytes) for the socket. 162*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 163*6777b538SAndroid Build Coastguard Worker int SetReceiveBufferSize(int32_t size); 164*6777b538SAndroid Build Coastguard Worker 165*6777b538SAndroid Build Coastguard Worker // Sets the send buffer size (in bytes) for the socket. 166*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 167*6777b538SAndroid Build Coastguard Worker int SetSendBufferSize(int32_t size); 168*6777b538SAndroid Build Coastguard Worker 169*6777b538SAndroid Build Coastguard Worker // Requests that packets sent by this socket not be fragment, either locally 170*6777b538SAndroid Build Coastguard Worker // by the host, or by routers (via the DF bit in the IPv4 packet header). 171*6777b538SAndroid Build Coastguard Worker // May not be supported by all platforms. Returns a network error code if 172*6777b538SAndroid Build Coastguard Worker // there was a problem, but the socket will still be usable. Can not 173*6777b538SAndroid Build Coastguard Worker // return ERR_IO_PENDING. 174*6777b538SAndroid Build Coastguard Worker int SetDoNotFragment(); 175*6777b538SAndroid Build Coastguard Worker 176*6777b538SAndroid Build Coastguard Worker // Requests that packets received by this socket have the ECN bit set. Returns 177*6777b538SAndroid Build Coastguard Worker // a network error code if there was a problem. 178*6777b538SAndroid Build Coastguard Worker int SetRecvTos(); 179*6777b538SAndroid Build Coastguard Worker 180*6777b538SAndroid Build Coastguard Worker // If |confirm| is true, then the MSG_CONFIRM flag will be passed to 181*6777b538SAndroid Build Coastguard Worker // subsequent writes if it's supported by the platform. 182*6777b538SAndroid Build Coastguard Worker void SetMsgConfirm(bool confirm); 183*6777b538SAndroid Build Coastguard Worker 184*6777b538SAndroid Build Coastguard Worker // Returns true if the socket is already connected or bound. is_connected()185*6777b538SAndroid Build Coastguard Worker bool is_connected() const { return is_connected_; } 186*6777b538SAndroid Build Coastguard Worker NetLog()187*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& NetLog() const { return net_log_; } 188*6777b538SAndroid Build Coastguard Worker 189*6777b538SAndroid Build Coastguard Worker // Call this to enable SO_REUSEADDR on the underlying socket. 190*6777b538SAndroid Build Coastguard Worker // Should be called between Open() and Bind(). 191*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 192*6777b538SAndroid Build Coastguard Worker int AllowAddressReuse(); 193*6777b538SAndroid Build Coastguard Worker 194*6777b538SAndroid Build Coastguard Worker // Call this to allow or disallow sending and receiving packets to and from 195*6777b538SAndroid Build Coastguard Worker // broadcast addresses. 196*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 197*6777b538SAndroid Build Coastguard Worker int SetBroadcast(bool broadcast); 198*6777b538SAndroid Build Coastguard Worker 199*6777b538SAndroid Build Coastguard Worker // Sets socket options to allow the socket to share the local address to which 200*6777b538SAndroid Build Coastguard Worker // the socket will be bound with other processes and attempt to allow all such 201*6777b538SAndroid Build Coastguard Worker // sockets to receive the same multicast messages. Returns a net error code. 202*6777b538SAndroid Build Coastguard Worker // 203*6777b538SAndroid Build Coastguard Worker // Ability and requirements for different sockets to receive the same messages 204*6777b538SAndroid Build Coastguard Worker // varies between POSIX platforms. For best results in allowing the messages 205*6777b538SAndroid Build Coastguard Worker // to be shared, all sockets sharing the same address should join the same 206*6777b538SAndroid Build Coastguard Worker // multicast group and interface. Also, the socket should listen to the 207*6777b538SAndroid Build Coastguard Worker // specific multicast address rather than a wildcard address (e.g. 0.0.0.0). 208*6777b538SAndroid Build Coastguard Worker // 209*6777b538SAndroid Build Coastguard Worker // Should be called between Open() and Bind(). 210*6777b538SAndroid Build Coastguard Worker int AllowAddressSharingForMulticast(); 211*6777b538SAndroid Build Coastguard Worker 212*6777b538SAndroid Build Coastguard Worker // Joins the multicast group. 213*6777b538SAndroid Build Coastguard Worker // |group_address| is the group address to join, could be either 214*6777b538SAndroid Build Coastguard Worker // an IPv4 or IPv6 address. 215*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 216*6777b538SAndroid Build Coastguard Worker int JoinGroup(const IPAddress& group_address) const; 217*6777b538SAndroid Build Coastguard Worker 218*6777b538SAndroid Build Coastguard Worker // Leaves the multicast group. 219*6777b538SAndroid Build Coastguard Worker // |group_address| is the group address to leave, could be either 220*6777b538SAndroid Build Coastguard Worker // an IPv4 or IPv6 address. If the socket hasn't joined the group, 221*6777b538SAndroid Build Coastguard Worker // it will be ignored. 222*6777b538SAndroid Build Coastguard Worker // It's optional to leave the multicast group before destroying 223*6777b538SAndroid Build Coastguard Worker // the socket. It will be done by the OS. 224*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 225*6777b538SAndroid Build Coastguard Worker int LeaveGroup(const IPAddress& group_address) const; 226*6777b538SAndroid Build Coastguard Worker 227*6777b538SAndroid Build Coastguard Worker // Sets interface to use for multicast. If |interface_index| set to 0, 228*6777b538SAndroid Build Coastguard Worker // default interface is used. 229*6777b538SAndroid Build Coastguard Worker // Should be called before Bind(). 230*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 231*6777b538SAndroid Build Coastguard Worker int SetMulticastInterface(uint32_t interface_index); 232*6777b538SAndroid Build Coastguard Worker 233*6777b538SAndroid Build Coastguard Worker // Sets the time-to-live option for UDP packets sent to the multicast 234*6777b538SAndroid Build Coastguard Worker // group address. The default value of this option is 1. 235*6777b538SAndroid Build Coastguard Worker // Cannot be negative or more than 255. 236*6777b538SAndroid Build Coastguard Worker // Should be called before Bind(). 237*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 238*6777b538SAndroid Build Coastguard Worker int SetMulticastTimeToLive(int time_to_live); 239*6777b538SAndroid Build Coastguard Worker 240*6777b538SAndroid Build Coastguard Worker // Sets the loopback flag for UDP socket. If this flag is true, the host 241*6777b538SAndroid Build Coastguard Worker // will receive packets sent to the joined group from itself. 242*6777b538SAndroid Build Coastguard Worker // The default value of this option is true. 243*6777b538SAndroid Build Coastguard Worker // Should be called before Bind(). 244*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 245*6777b538SAndroid Build Coastguard Worker // 246*6777b538SAndroid Build Coastguard Worker // Note: the behavior of |SetMulticastLoopbackMode| is slightly 247*6777b538SAndroid Build Coastguard Worker // different between Windows and Unix-like systems. The inconsistency only 248*6777b538SAndroid Build Coastguard Worker // happens when there are more than one applications on the same host 249*6777b538SAndroid Build Coastguard Worker // joined to the same multicast group while having different settings on 250*6777b538SAndroid Build Coastguard Worker // multicast loopback mode. On Windows, the applications with loopback off 251*6777b538SAndroid Build Coastguard Worker // will not RECEIVE the loopback packets; while on Unix-like systems, the 252*6777b538SAndroid Build Coastguard Worker // applications with loopback off will not SEND the loopback packets to 253*6777b538SAndroid Build Coastguard Worker // other applications on the same host. See MSDN: http://goo.gl/6vqbj 254*6777b538SAndroid Build Coastguard Worker int SetMulticastLoopbackMode(bool loopback); 255*6777b538SAndroid Build Coastguard Worker 256*6777b538SAndroid Build Coastguard Worker // Sets the differentiated services flags on outgoing packets. May not 257*6777b538SAndroid Build Coastguard Worker // do anything on some platforms. 258*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 259*6777b538SAndroid Build Coastguard Worker int SetDiffServCodePoint(DiffServCodePoint dscp); 260*6777b538SAndroid Build Coastguard Worker 261*6777b538SAndroid Build Coastguard Worker // Requests that packets sent by this socket have the DSCP and/or ECN 262*6777b538SAndroid Build Coastguard Worker // bits set. Returns a network error code if there was a problem. If 263*6777b538SAndroid Build Coastguard Worker // DSCP_NO_CHANGE or ECN_NO_CHANGE are set, will preserve those parts of 264*6777b538SAndroid Build Coastguard Worker // the original setting. 265*6777b538SAndroid Build Coastguard Worker // ECN values other than ECN_DEFAULT must not be used outside of tests, 266*6777b538SAndroid Build Coastguard Worker // without appropriate congestion control. 267*6777b538SAndroid Build Coastguard Worker int SetTos(DiffServCodePoint dscp, EcnCodePoint ecn); 268*6777b538SAndroid Build Coastguard Worker 269*6777b538SAndroid Build Coastguard Worker // Sets IPV6_V6ONLY on the socket. If this flag is true, the socket will be 270*6777b538SAndroid Build Coastguard Worker // restricted to only IPv6; false allows both IPv4 and IPv6 traffic. 271*6777b538SAndroid Build Coastguard Worker int SetIPv6Only(bool ipv6_only); 272*6777b538SAndroid Build Coastguard Worker 273*6777b538SAndroid Build Coastguard Worker // Exposes the underlying socket descriptor for testing its state. Does not 274*6777b538SAndroid Build Coastguard Worker // release ownership of the descriptor. SocketDescriptorForTesting()275*6777b538SAndroid Build Coastguard Worker SocketDescriptor SocketDescriptorForTesting() const { return socket_; } 276*6777b538SAndroid Build Coastguard Worker 277*6777b538SAndroid Build Coastguard Worker // Resets the thread to be used for thread-safety checks. 278*6777b538SAndroid Build Coastguard Worker void DetachFromThread(); 279*6777b538SAndroid Build Coastguard Worker 280*6777b538SAndroid Build Coastguard Worker // Apply |tag| to this socket. 281*6777b538SAndroid Build Coastguard Worker void ApplySocketTag(const SocketTag& tag); 282*6777b538SAndroid Build Coastguard Worker 283*6777b538SAndroid Build Coastguard Worker // Enables experimental optimization. This method should be called 284*6777b538SAndroid Build Coastguard Worker // before the socket is used to read data for the first time. enable_experimental_recv_optimization()285*6777b538SAndroid Build Coastguard Worker void enable_experimental_recv_optimization() { 286*6777b538SAndroid Build Coastguard Worker DCHECK_EQ(kInvalidSocket, socket_); 287*6777b538SAndroid Build Coastguard Worker experimental_recv_optimization_enabled_ = true; 288*6777b538SAndroid Build Coastguard Worker } 289*6777b538SAndroid Build Coastguard Worker 290*6777b538SAndroid Build Coastguard Worker // Sets iOS Network Service Type for option SO_NET_SERVICE_TYPE. 291*6777b538SAndroid Build Coastguard Worker int SetIOSNetworkServiceType(int ios_network_service_type); 292*6777b538SAndroid Build Coastguard Worker 293*6777b538SAndroid Build Coastguard Worker // Takes ownership of `socket`, which should be a socket descriptor opened 294*6777b538SAndroid Build Coastguard Worker // with the specified address family. The socket should only be created but 295*6777b538SAndroid Build Coastguard Worker // not bound or connected to an address. 296*6777b538SAndroid Build Coastguard Worker int AdoptOpenedSocket(AddressFamily address_family, int socket); 297*6777b538SAndroid Build Coastguard Worker get_multicast_interface_for_testing()298*6777b538SAndroid Build Coastguard Worker uint32_t get_multicast_interface_for_testing() { 299*6777b538SAndroid Build Coastguard Worker return multicast_interface_; 300*6777b538SAndroid Build Coastguard Worker } get_msg_confirm_for_testing()301*6777b538SAndroid Build Coastguard Worker bool get_msg_confirm_for_testing() { return sendto_flags_; } get_experimental_recv_optimization_enabled_for_testing()302*6777b538SAndroid Build Coastguard Worker bool get_experimental_recv_optimization_enabled_for_testing() { 303*6777b538SAndroid Build Coastguard Worker return experimental_recv_optimization_enabled_; 304*6777b538SAndroid Build Coastguard Worker } 305*6777b538SAndroid Build Coastguard Worker GetLastTos()306*6777b538SAndroid Build Coastguard Worker DscpAndEcn GetLastTos() const { return TosToDscpAndEcn(last_tos_); } 307*6777b538SAndroid Build Coastguard Worker 308*6777b538SAndroid Build Coastguard Worker private: 309*6777b538SAndroid Build Coastguard Worker enum SocketOptions { 310*6777b538SAndroid Build Coastguard Worker SOCKET_OPTION_MULTICAST_LOOP = 1 << 0 311*6777b538SAndroid Build Coastguard Worker }; 312*6777b538SAndroid Build Coastguard Worker 313*6777b538SAndroid Build Coastguard Worker class ReadWatcher : public base::MessagePumpForIO::FdWatcher { 314*6777b538SAndroid Build Coastguard Worker public: ReadWatcher(UDPSocketPosix * socket)315*6777b538SAndroid Build Coastguard Worker explicit ReadWatcher(UDPSocketPosix* socket) : socket_(socket) {} 316*6777b538SAndroid Build Coastguard Worker 317*6777b538SAndroid Build Coastguard Worker ReadWatcher(const ReadWatcher&) = delete; 318*6777b538SAndroid Build Coastguard Worker ReadWatcher& operator=(const ReadWatcher&) = delete; 319*6777b538SAndroid Build Coastguard Worker 320*6777b538SAndroid Build Coastguard Worker // MessagePumpForIO::FdWatcher methods 321*6777b538SAndroid Build Coastguard Worker 322*6777b538SAndroid Build Coastguard Worker void OnFileCanReadWithoutBlocking(int /* fd */) override; 323*6777b538SAndroid Build Coastguard Worker OnFileCanWriteWithoutBlocking(int)324*6777b538SAndroid Build Coastguard Worker void OnFileCanWriteWithoutBlocking(int /* fd */) override {} 325*6777b538SAndroid Build Coastguard Worker 326*6777b538SAndroid Build Coastguard Worker private: 327*6777b538SAndroid Build Coastguard Worker const raw_ptr<UDPSocketPosix> socket_; 328*6777b538SAndroid Build Coastguard Worker }; 329*6777b538SAndroid Build Coastguard Worker 330*6777b538SAndroid Build Coastguard Worker class WriteWatcher : public base::MessagePumpForIO::FdWatcher { 331*6777b538SAndroid Build Coastguard Worker public: WriteWatcher(UDPSocketPosix * socket)332*6777b538SAndroid Build Coastguard Worker explicit WriteWatcher(UDPSocketPosix* socket) : socket_(socket) {} 333*6777b538SAndroid Build Coastguard Worker 334*6777b538SAndroid Build Coastguard Worker WriteWatcher(const WriteWatcher&) = delete; 335*6777b538SAndroid Build Coastguard Worker WriteWatcher& operator=(const WriteWatcher&) = delete; 336*6777b538SAndroid Build Coastguard Worker 337*6777b538SAndroid Build Coastguard Worker // MessagePumpForIO::FdWatcher methods 338*6777b538SAndroid Build Coastguard Worker OnFileCanReadWithoutBlocking(int)339*6777b538SAndroid Build Coastguard Worker void OnFileCanReadWithoutBlocking(int /* fd */) override {} 340*6777b538SAndroid Build Coastguard Worker 341*6777b538SAndroid Build Coastguard Worker void OnFileCanWriteWithoutBlocking(int /* fd */) override; 342*6777b538SAndroid Build Coastguard Worker 343*6777b538SAndroid Build Coastguard Worker private: 344*6777b538SAndroid Build Coastguard Worker const raw_ptr<UDPSocketPosix> socket_; 345*6777b538SAndroid Build Coastguard Worker }; 346*6777b538SAndroid Build Coastguard Worker 347*6777b538SAndroid Build Coastguard Worker void DoReadCallback(int rv); 348*6777b538SAndroid Build Coastguard Worker void DoWriteCallback(int rv); 349*6777b538SAndroid Build Coastguard Worker void DidCompleteRead(); 350*6777b538SAndroid Build Coastguard Worker void DidCompleteWrite(); 351*6777b538SAndroid Build Coastguard Worker 352*6777b538SAndroid Build Coastguard Worker // Handles stats and logging. |result| is the number of bytes transferred, on 353*6777b538SAndroid Build Coastguard Worker // success, or the net error code on failure. On success, LogRead takes in a 354*6777b538SAndroid Build Coastguard Worker // sockaddr and its length, which are mandatory, while LogWrite takes in an 355*6777b538SAndroid Build Coastguard Worker // optional IPEndPoint. 356*6777b538SAndroid Build Coastguard Worker void LogRead(int result, 357*6777b538SAndroid Build Coastguard Worker const char* bytes, 358*6777b538SAndroid Build Coastguard Worker socklen_t addr_len, 359*6777b538SAndroid Build Coastguard Worker const sockaddr* addr); 360*6777b538SAndroid Build Coastguard Worker void LogWrite(int result, const char* bytes, const IPEndPoint* address); 361*6777b538SAndroid Build Coastguard Worker 362*6777b538SAndroid Build Coastguard Worker // Same as SendTo(), except that address is passed by pointer 363*6777b538SAndroid Build Coastguard Worker // instead of by reference. It is called from Write() with |address| 364*6777b538SAndroid Build Coastguard Worker // set to nullptr. 365*6777b538SAndroid Build Coastguard Worker int SendToOrWrite(IOBuffer* buf, 366*6777b538SAndroid Build Coastguard Worker int buf_len, 367*6777b538SAndroid Build Coastguard Worker const IPEndPoint* address, 368*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback); 369*6777b538SAndroid Build Coastguard Worker 370*6777b538SAndroid Build Coastguard Worker int InternalConnect(const IPEndPoint& address); 371*6777b538SAndroid Build Coastguard Worker 372*6777b538SAndroid Build Coastguard Worker // Reads data from a UDP socket. Depending whether the socket is connected or 373*6777b538SAndroid Build Coastguard Worker // not, the method delegates the call to InternalRecvFromConnectedSocket() 374*6777b538SAndroid Build Coastguard Worker // or InternalRecvFromNonConnectedSocket() respectively. 375*6777b538SAndroid Build Coastguard Worker // For proper detection of truncated reads, the |buf_len| should always be 376*6777b538SAndroid Build Coastguard Worker // one byte longer than the expected maximum packet length. 377*6777b538SAndroid Build Coastguard Worker int InternalRecvFrom(IOBuffer* buf, int buf_len, IPEndPoint* address); 378*6777b538SAndroid Build Coastguard Worker 379*6777b538SAndroid Build Coastguard Worker // A more efficient implementation of the InternalRecvFrom() method for 380*6777b538SAndroid Build Coastguard Worker // reading data from connected sockets. Internally the method uses the read() 381*6777b538SAndroid Build Coastguard Worker // system call. 382*6777b538SAndroid Build Coastguard Worker int InternalRecvFromConnectedSocket(IOBuffer* buf, 383*6777b538SAndroid Build Coastguard Worker int buf_len, 384*6777b538SAndroid Build Coastguard Worker IPEndPoint* address); 385*6777b538SAndroid Build Coastguard Worker 386*6777b538SAndroid Build Coastguard Worker // An implementation of the InternalRecvFrom() method for reading data 387*6777b538SAndroid Build Coastguard Worker // from non-connected sockets. Internally the method uses the recvmsg() 388*6777b538SAndroid Build Coastguard Worker // system call. 389*6777b538SAndroid Build Coastguard Worker int InternalRecvFromNonConnectedSocket(IOBuffer* buf, 390*6777b538SAndroid Build Coastguard Worker int buf_len, 391*6777b538SAndroid Build Coastguard Worker IPEndPoint* address); 392*6777b538SAndroid Build Coastguard Worker int InternalSendTo(IOBuffer* buf, int buf_len, const IPEndPoint* address); 393*6777b538SAndroid Build Coastguard Worker 394*6777b538SAndroid Build Coastguard Worker // Applies |socket_options_| to |socket_|. Should be called before 395*6777b538SAndroid Build Coastguard Worker // Bind(). 396*6777b538SAndroid Build Coastguard Worker int SetMulticastOptions(); 397*6777b538SAndroid Build Coastguard Worker int DoBind(const IPEndPoint& address); 398*6777b538SAndroid Build Coastguard Worker // Binds to a random port on |address|. 399*6777b538SAndroid Build Coastguard Worker int RandomBind(const IPAddress& address); 400*6777b538SAndroid Build Coastguard Worker 401*6777b538SAndroid Build Coastguard Worker // Sets `socket_hash_` and `tag_` on opened `socket_`. 402*6777b538SAndroid Build Coastguard Worker int ConfigureOpenedSocket(); 403*6777b538SAndroid Build Coastguard Worker 404*6777b538SAndroid Build Coastguard Worker int socket_; 405*6777b538SAndroid Build Coastguard Worker 406*6777b538SAndroid Build Coastguard Worker // Hash of |socket_| to verify that it is not corrupted when calling close(). 407*6777b538SAndroid Build Coastguard Worker // Used to debug https://crbug.com/906005. 408*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/906005): Remove this once the bug is fixed. 409*6777b538SAndroid Build Coastguard Worker int socket_hash_ = 0; 410*6777b538SAndroid Build Coastguard Worker 411*6777b538SAndroid Build Coastguard Worker int addr_family_ = 0; 412*6777b538SAndroid Build Coastguard Worker bool is_connected_ = false; 413*6777b538SAndroid Build Coastguard Worker 414*6777b538SAndroid Build Coastguard Worker // Bitwise-or'd combination of SocketOptions. Specifies the set of 415*6777b538SAndroid Build Coastguard Worker // options that should be applied to |socket_| before Bind(). 416*6777b538SAndroid Build Coastguard Worker int socket_options_ = SOCKET_OPTION_MULTICAST_LOOP; 417*6777b538SAndroid Build Coastguard Worker 418*6777b538SAndroid Build Coastguard Worker // Flags passed to sendto(). 419*6777b538SAndroid Build Coastguard Worker int sendto_flags_ = 0; 420*6777b538SAndroid Build Coastguard Worker 421*6777b538SAndroid Build Coastguard Worker // Multicast interface. 422*6777b538SAndroid Build Coastguard Worker uint32_t multicast_interface_ = 0; 423*6777b538SAndroid Build Coastguard Worker 424*6777b538SAndroid Build Coastguard Worker // Multicast socket options cached for SetMulticastOption. 425*6777b538SAndroid Build Coastguard Worker // Cannot be used after Bind(). 426*6777b538SAndroid Build Coastguard Worker int multicast_time_to_live_ = 1; 427*6777b538SAndroid Build Coastguard Worker 428*6777b538SAndroid Build Coastguard Worker // How to do source port binding, used only when UDPSocket is part of 429*6777b538SAndroid Build Coastguard Worker // UDPClientSocket, since UDPServerSocket provides Bind. 430*6777b538SAndroid Build Coastguard Worker DatagramSocket::BindType bind_type_; 431*6777b538SAndroid Build Coastguard Worker 432*6777b538SAndroid Build Coastguard Worker // These are mutable since they're just cached copies to make 433*6777b538SAndroid Build Coastguard Worker // GetPeerAddress/GetLocalAddress smarter. 434*6777b538SAndroid Build Coastguard Worker mutable std::unique_ptr<IPEndPoint> local_address_; 435*6777b538SAndroid Build Coastguard Worker mutable std::unique_ptr<IPEndPoint> remote_address_; 436*6777b538SAndroid Build Coastguard Worker 437*6777b538SAndroid Build Coastguard Worker // The socket's posix wrappers 438*6777b538SAndroid Build Coastguard Worker base::MessagePumpForIO::FdWatchController read_socket_watcher_; 439*6777b538SAndroid Build Coastguard Worker base::MessagePumpForIO::FdWatchController write_socket_watcher_; 440*6777b538SAndroid Build Coastguard Worker 441*6777b538SAndroid Build Coastguard Worker // The corresponding watchers for reads and writes. 442*6777b538SAndroid Build Coastguard Worker ReadWatcher read_watcher_; 443*6777b538SAndroid Build Coastguard Worker WriteWatcher write_watcher_; 444*6777b538SAndroid Build Coastguard Worker 445*6777b538SAndroid Build Coastguard Worker // The buffer used by InternalRead() to retry Read requests 446*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBuffer> read_buf_; 447*6777b538SAndroid Build Coastguard Worker int read_buf_len_ = 0; 448*6777b538SAndroid Build Coastguard Worker raw_ptr<IPEndPoint> recv_from_address_ = nullptr; 449*6777b538SAndroid Build Coastguard Worker 450*6777b538SAndroid Build Coastguard Worker // The buffer used by InternalWrite() to retry Write requests 451*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBuffer> write_buf_; 452*6777b538SAndroid Build Coastguard Worker int write_buf_len_ = 0; 453*6777b538SAndroid Build Coastguard Worker std::unique_ptr<IPEndPoint> send_to_address_; 454*6777b538SAndroid Build Coastguard Worker 455*6777b538SAndroid Build Coastguard Worker // External callback; called when read is complete. 456*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback read_callback_; 457*6777b538SAndroid Build Coastguard Worker 458*6777b538SAndroid Build Coastguard Worker // External callback; called when write is complete. 459*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback write_callback_; 460*6777b538SAndroid Build Coastguard Worker 461*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log_; 462*6777b538SAndroid Build Coastguard Worker 463*6777b538SAndroid Build Coastguard Worker // Network that this socket is bound to via BindToNetwork(). 464*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle bound_network_; 465*6777b538SAndroid Build Coastguard Worker 466*6777b538SAndroid Build Coastguard Worker // Whether net::activity_monitor should be updated every time bytes are 467*6777b538SAndroid Build Coastguard Worker // received, without batching through |received_activity_monitor_|. This is 468*6777b538SAndroid Build Coastguard Worker // initialized with the state of the "UdpSocketPosixAlwaysUpdateBytesReceived" 469*6777b538SAndroid Build Coastguard Worker // feature. It is cached to avoid accessing the FeatureList every time bytes 470*6777b538SAndroid Build Coastguard Worker // are received. 471*6777b538SAndroid Build Coastguard Worker const bool always_update_bytes_received_; 472*6777b538SAndroid Build Coastguard Worker 473*6777b538SAndroid Build Coastguard Worker // Used to lower the overhead updating activity monitor. 474*6777b538SAndroid Build Coastguard Worker ReceivedActivityMonitor received_activity_monitor_; 475*6777b538SAndroid Build Coastguard Worker 476*6777b538SAndroid Build Coastguard Worker // Current socket tag if |socket_| is valid, otherwise the tag to apply when 477*6777b538SAndroid Build Coastguard Worker // |socket_| is opened. 478*6777b538SAndroid Build Coastguard Worker SocketTag tag_; 479*6777b538SAndroid Build Coastguard Worker 480*6777b538SAndroid Build Coastguard Worker // If set to true, the socket will use an optimized experimental code path. 481*6777b538SAndroid Build Coastguard Worker // By default, the value is set to false. To use the optimization, the 482*6777b538SAndroid Build Coastguard Worker // client of the socket has to opt-in by calling the 483*6777b538SAndroid Build Coastguard Worker // enable_experimental_recv_optimization() method. 484*6777b538SAndroid Build Coastguard Worker bool experimental_recv_optimization_enabled_ = false; 485*6777b538SAndroid Build Coastguard Worker 486*6777b538SAndroid Build Coastguard Worker // Manages decrementing the global open UDP socket counter when this 487*6777b538SAndroid Build Coastguard Worker // UDPSocket is destroyed. 488*6777b538SAndroid Build Coastguard Worker OwnedUDPSocketCount owned_socket_count_; 489*6777b538SAndroid Build Coastguard Worker 490*6777b538SAndroid Build Coastguard Worker // The last TOS byte received on the socket. 491*6777b538SAndroid Build Coastguard Worker uint8_t last_tos_ = 0; 492*6777b538SAndroid Build Coastguard Worker 493*6777b538SAndroid Build Coastguard Worker THREAD_CHECKER(thread_checker_); 494*6777b538SAndroid Build Coastguard Worker }; 495*6777b538SAndroid Build Coastguard Worker 496*6777b538SAndroid Build Coastguard Worker } // namespace net 497*6777b538SAndroid Build Coastguard Worker 498*6777b538SAndroid Build Coastguard Worker #endif // NET_SOCKET_UDP_SOCKET_POSIX_H_ 499