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_WIN_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_UDP_SOCKET_WIN_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <winsock2.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <qos2.h> 11*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker // Must be after winsock2.h: 14*6777b538SAndroid Build Coastguard Worker #include <MSWSock.h> 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker #include <atomic> 17*6777b538SAndroid Build Coastguard Worker #include <memory> 18*6777b538SAndroid Build Coastguard Worker #include <set> 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h" 21*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 22*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 23*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 24*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_checker.h" 25*6777b538SAndroid Build Coastguard Worker #include "base/win/object_watcher.h" 26*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_handle.h" 27*6777b538SAndroid Build Coastguard Worker #include "net/base/address_family.h" 28*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 29*6777b538SAndroid Build Coastguard Worker #include "net/base/io_buffer.h" 30*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_endpoint.h" 31*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 32*6777b538SAndroid Build Coastguard Worker #include "net/base/network_handle.h" 33*6777b538SAndroid Build Coastguard Worker #include "net/base/sockaddr_storage.h" 34*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h" 35*6777b538SAndroid Build Coastguard Worker #include "net/socket/datagram_socket.h" 36*6777b538SAndroid Build Coastguard Worker #include "net/socket/diff_serv_code_point.h" 37*6777b538SAndroid Build Coastguard Worker #include "net/socket/udp_socket_global_limits.h" 38*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h" 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker namespace net { 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker class IPAddress; 43*6777b538SAndroid Build Coastguard Worker class NetLog; 44*6777b538SAndroid Build Coastguard Worker struct NetLogSource; 45*6777b538SAndroid Build Coastguard Worker class SocketTag; 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker // QWAVE (Quality Windows Audio/Video Experience) is the latest windows 48*6777b538SAndroid Build Coastguard Worker // library for setting packet priorities (and other things). Unfortunately, 49*6777b538SAndroid Build Coastguard Worker // Microsoft has decided that setting the DSCP bits with setsockopt() no 50*6777b538SAndroid Build Coastguard Worker // longer works, so we have to use this API instead. 51*6777b538SAndroid Build Coastguard Worker // This class is meant to be used as a singleton. It exposes a few dynamically 52*6777b538SAndroid Build Coastguard Worker // loaded functions and a bool called "qwave_supported". 53*6777b538SAndroid Build Coastguard Worker class NET_EXPORT QwaveApi { 54*6777b538SAndroid Build Coastguard Worker typedef BOOL(WINAPI* CreateHandleFn)(PQOS_VERSION, PHANDLE); 55*6777b538SAndroid Build Coastguard Worker typedef BOOL(WINAPI* CloseHandleFn)(HANDLE); 56*6777b538SAndroid Build Coastguard Worker typedef BOOL(WINAPI* AddSocketToFlowFn)(HANDLE, 57*6777b538SAndroid Build Coastguard Worker SOCKET, 58*6777b538SAndroid Build Coastguard Worker PSOCKADDR, 59*6777b538SAndroid Build Coastguard Worker QOS_TRAFFIC_TYPE, 60*6777b538SAndroid Build Coastguard Worker DWORD, 61*6777b538SAndroid Build Coastguard Worker PQOS_FLOWID); 62*6777b538SAndroid Build Coastguard Worker typedef BOOL(WINAPI* RemoveSocketFromFlowFn)(HANDLE, 63*6777b538SAndroid Build Coastguard Worker SOCKET, 64*6777b538SAndroid Build Coastguard Worker QOS_FLOWID, 65*6777b538SAndroid Build Coastguard Worker DWORD); 66*6777b538SAndroid Build Coastguard Worker typedef BOOL(WINAPI* SetFlowFn)(HANDLE, 67*6777b538SAndroid Build Coastguard Worker QOS_FLOWID, 68*6777b538SAndroid Build Coastguard Worker QOS_SET_FLOW, 69*6777b538SAndroid Build Coastguard Worker ULONG, 70*6777b538SAndroid Build Coastguard Worker PVOID, 71*6777b538SAndroid Build Coastguard Worker DWORD, 72*6777b538SAndroid Build Coastguard Worker LPOVERLAPPED); 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker public: 75*6777b538SAndroid Build Coastguard Worker QwaveApi(); 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker QwaveApi(const QwaveApi&) = delete; 78*6777b538SAndroid Build Coastguard Worker QwaveApi& operator=(const QwaveApi&) = delete; 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker static QwaveApi* GetDefault(); 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker virtual bool qwave_supported() const; 83*6777b538SAndroid Build Coastguard Worker virtual void OnFatalError(); 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker virtual BOOL CreateHandle(PQOS_VERSION version, PHANDLE handle); 86*6777b538SAndroid Build Coastguard Worker virtual BOOL CloseHandle(HANDLE handle); 87*6777b538SAndroid Build Coastguard Worker virtual BOOL AddSocketToFlow(HANDLE handle, 88*6777b538SAndroid Build Coastguard Worker SOCKET socket, 89*6777b538SAndroid Build Coastguard Worker PSOCKADDR addr, 90*6777b538SAndroid Build Coastguard Worker QOS_TRAFFIC_TYPE traffic_type, 91*6777b538SAndroid Build Coastguard Worker DWORD flags, 92*6777b538SAndroid Build Coastguard Worker PQOS_FLOWID flow_id); 93*6777b538SAndroid Build Coastguard Worker virtual BOOL RemoveSocketFromFlow(HANDLE handle, 94*6777b538SAndroid Build Coastguard Worker SOCKET socket, 95*6777b538SAndroid Build Coastguard Worker QOS_FLOWID flow_id, 96*6777b538SAndroid Build Coastguard Worker DWORD reserved); 97*6777b538SAndroid Build Coastguard Worker virtual BOOL SetFlow(HANDLE handle, 98*6777b538SAndroid Build Coastguard Worker QOS_FLOWID flow_id, 99*6777b538SAndroid Build Coastguard Worker QOS_SET_FLOW op, 100*6777b538SAndroid Build Coastguard Worker ULONG size, 101*6777b538SAndroid Build Coastguard Worker PVOID data, 102*6777b538SAndroid Build Coastguard Worker DWORD reserved, 103*6777b538SAndroid Build Coastguard Worker LPOVERLAPPED overlapped); 104*6777b538SAndroid Build Coastguard Worker 105*6777b538SAndroid Build Coastguard Worker private: 106*6777b538SAndroid Build Coastguard Worker std::atomic<bool> qwave_supported_{false}; 107*6777b538SAndroid Build Coastguard Worker 108*6777b538SAndroid Build Coastguard Worker CreateHandleFn create_handle_func_; 109*6777b538SAndroid Build Coastguard Worker CloseHandleFn close_handle_func_; 110*6777b538SAndroid Build Coastguard Worker AddSocketToFlowFn add_socket_to_flow_func_; 111*6777b538SAndroid Build Coastguard Worker RemoveSocketFromFlowFn remove_socket_from_flow_func_; 112*6777b538SAndroid Build Coastguard Worker SetFlowFn set_flow_func_; 113*6777b538SAndroid Build Coastguard Worker }; 114*6777b538SAndroid Build Coastguard Worker 115*6777b538SAndroid Build Coastguard Worker //----------------------------------------------------------------------------- 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker // Helper for maintaining the state that (unlike a blanket socket option), DSCP 118*6777b538SAndroid Build Coastguard Worker // values are set per-remote endpoint instead of just per-socket on Windows. 119*6777b538SAndroid Build Coastguard Worker // The implementation creates a single QWAVE 'flow' for the socket, and adds 120*6777b538SAndroid Build Coastguard Worker // all encountered remote addresses to that flow. Flows are the minimum 121*6777b538SAndroid Build Coastguard Worker // manageable unit within the QWAVE API. See 122*6777b538SAndroid Build Coastguard Worker // https://docs.microsoft.com/en-us/previous-versions/windows/desktop/api/qos2/ 123*6777b538SAndroid Build Coastguard Worker // for Microsoft's documentation. 124*6777b538SAndroid Build Coastguard Worker class NET_EXPORT DscpManager { 125*6777b538SAndroid Build Coastguard Worker public: 126*6777b538SAndroid Build Coastguard Worker DscpManager(QwaveApi* api, SOCKET socket); 127*6777b538SAndroid Build Coastguard Worker 128*6777b538SAndroid Build Coastguard Worker DscpManager(const DscpManager&) = delete; 129*6777b538SAndroid Build Coastguard Worker DscpManager& operator=(const DscpManager&) = delete; 130*6777b538SAndroid Build Coastguard Worker 131*6777b538SAndroid Build Coastguard Worker ~DscpManager(); 132*6777b538SAndroid Build Coastguard Worker 133*6777b538SAndroid Build Coastguard Worker // Remembers the latest |dscp| so PrepareToSend can add remote addresses to 134*6777b538SAndroid Build Coastguard Worker // the qos flow. Destroys the old flow if it exists and |dscp| changes. 135*6777b538SAndroid Build Coastguard Worker void Set(DiffServCodePoint dscp); 136*6777b538SAndroid Build Coastguard Worker 137*6777b538SAndroid Build Coastguard Worker // Constructs a qos flow for the latest set DSCP value if we don't already 138*6777b538SAndroid Build Coastguard Worker // have one. Adds |remote_address| to the qos flow if it hasn't been added 139*6777b538SAndroid Build Coastguard Worker // already. Does nothing if no DSCP value has been Set. 140*6777b538SAndroid Build Coastguard Worker int PrepareForSend(const IPEndPoint& remote_address); 141*6777b538SAndroid Build Coastguard Worker 142*6777b538SAndroid Build Coastguard Worker private: 143*6777b538SAndroid Build Coastguard Worker void RequestHandle(); 144*6777b538SAndroid Build Coastguard Worker static HANDLE DoCreateHandle(QwaveApi* api); 145*6777b538SAndroid Build Coastguard Worker static void OnHandleCreated(QwaveApi* api, 146*6777b538SAndroid Build Coastguard Worker base::WeakPtr<DscpManager> dscp_manager, 147*6777b538SAndroid Build Coastguard Worker HANDLE handle); 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker const raw_ptr<QwaveApi> api_; 150*6777b538SAndroid Build Coastguard Worker const SOCKET socket_; 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard Worker DiffServCodePoint dscp_value_ = DSCP_NO_CHANGE; 153*6777b538SAndroid Build Coastguard Worker // The remote addresses currently in the flow. 154*6777b538SAndroid Build Coastguard Worker std::set<IPEndPoint> configured_; 155*6777b538SAndroid Build Coastguard Worker 156*6777b538SAndroid Build Coastguard Worker HANDLE qos_handle_ = nullptr; 157*6777b538SAndroid Build Coastguard Worker bool handle_is_initializing_ = false; 158*6777b538SAndroid Build Coastguard Worker // 0 means no flow has been constructed. 159*6777b538SAndroid Build Coastguard Worker QOS_FLOWID flow_id_ = 0; 160*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<DscpManager> weak_ptr_factory_{this}; 161*6777b538SAndroid Build Coastguard Worker }; 162*6777b538SAndroid Build Coastguard Worker 163*6777b538SAndroid Build Coastguard Worker //----------------------------------------------------------------------------- 164*6777b538SAndroid Build Coastguard Worker 165*6777b538SAndroid Build Coastguard Worker class NET_EXPORT UDPSocketWin : public base::win::ObjectWatcher::Delegate { 166*6777b538SAndroid Build Coastguard Worker public: 167*6777b538SAndroid Build Coastguard Worker // BindType is ignored. Windows has an option to do random binds, so 168*6777b538SAndroid Build Coastguard Worker // UDPSocketWin sets that whenever connecting a socket. 169*6777b538SAndroid Build Coastguard Worker UDPSocketWin(DatagramSocket::BindType bind_type, 170*6777b538SAndroid Build Coastguard Worker net::NetLog* net_log, 171*6777b538SAndroid Build Coastguard Worker const net::NetLogSource& source); 172*6777b538SAndroid Build Coastguard Worker 173*6777b538SAndroid Build Coastguard Worker UDPSocketWin(DatagramSocket::BindType bind_type, 174*6777b538SAndroid Build Coastguard Worker NetLogWithSource source_net_log); 175*6777b538SAndroid Build Coastguard Worker 176*6777b538SAndroid Build Coastguard Worker UDPSocketWin(const UDPSocketWin&) = delete; 177*6777b538SAndroid Build Coastguard Worker UDPSocketWin& operator=(const UDPSocketWin&) = delete; 178*6777b538SAndroid Build Coastguard Worker 179*6777b538SAndroid Build Coastguard Worker ~UDPSocketWin() override; 180*6777b538SAndroid Build Coastguard Worker 181*6777b538SAndroid Build Coastguard Worker // Opens the socket. 182*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 183*6777b538SAndroid Build Coastguard Worker int Open(AddressFamily address_family); 184*6777b538SAndroid Build Coastguard Worker 185*6777b538SAndroid Build Coastguard Worker // Not implemented. Returns ERR_NOT_IMPLEMENTED. 186*6777b538SAndroid Build Coastguard Worker int BindToNetwork(handles::NetworkHandle network); 187*6777b538SAndroid Build Coastguard Worker 188*6777b538SAndroid Build Coastguard Worker // Connects the socket to connect with a certain |address|. 189*6777b538SAndroid Build Coastguard Worker // Should be called after Open(). 190*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 191*6777b538SAndroid Build Coastguard Worker int Connect(const IPEndPoint& address); 192*6777b538SAndroid Build Coastguard Worker 193*6777b538SAndroid Build Coastguard Worker // Binds the address/port for this socket to |address|. This is generally 194*6777b538SAndroid Build Coastguard Worker // only used on a server. Should be called after Open(). 195*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 196*6777b538SAndroid Build Coastguard Worker int Bind(const IPEndPoint& address); 197*6777b538SAndroid Build Coastguard Worker 198*6777b538SAndroid Build Coastguard Worker // Closes the socket. 199*6777b538SAndroid Build Coastguard Worker void Close(); 200*6777b538SAndroid Build Coastguard Worker 201*6777b538SAndroid Build Coastguard Worker // Copies the remote udp address into |address| and returns a net error code. 202*6777b538SAndroid Build Coastguard Worker int GetPeerAddress(IPEndPoint* address) const; 203*6777b538SAndroid Build Coastguard Worker 204*6777b538SAndroid Build Coastguard Worker // Copies the local udp address into |address| and returns a net error code. 205*6777b538SAndroid Build Coastguard Worker // (similar to getsockname) 206*6777b538SAndroid Build Coastguard Worker int GetLocalAddress(IPEndPoint* address) const; 207*6777b538SAndroid Build Coastguard Worker 208*6777b538SAndroid Build Coastguard Worker // IO: 209*6777b538SAndroid Build Coastguard Worker // Multiple outstanding read requests are not supported. 210*6777b538SAndroid Build Coastguard Worker // Full duplex mode (reading and writing at the same time) is supported 211*6777b538SAndroid Build Coastguard Worker 212*6777b538SAndroid Build Coastguard Worker // Reads from the socket. 213*6777b538SAndroid Build Coastguard Worker // Only usable from the client-side of a UDP socket, after the socket 214*6777b538SAndroid Build Coastguard Worker // has been connected. 215*6777b538SAndroid Build Coastguard Worker int Read(IOBuffer* buf, int buf_len, CompletionOnceCallback callback); 216*6777b538SAndroid Build Coastguard Worker 217*6777b538SAndroid Build Coastguard Worker // Writes to the socket. 218*6777b538SAndroid Build Coastguard Worker // Only usable from the client-side of a UDP socket, after the socket 219*6777b538SAndroid Build Coastguard Worker // has been connected. 220*6777b538SAndroid Build Coastguard Worker int Write(IOBuffer* buf, 221*6777b538SAndroid Build Coastguard Worker int buf_len, 222*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 223*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& traffic_annotation); 224*6777b538SAndroid Build Coastguard Worker 225*6777b538SAndroid Build Coastguard Worker // Reads from a socket and receive sender address information. 226*6777b538SAndroid Build Coastguard Worker // |buf| is the buffer to read data into. 227*6777b538SAndroid Build Coastguard Worker // |buf_len| is the maximum amount of data to read. 228*6777b538SAndroid Build Coastguard Worker // |address| is a buffer provided by the caller for receiving the sender 229*6777b538SAndroid Build Coastguard Worker // address information about the received data. This buffer must be kept 230*6777b538SAndroid Build Coastguard Worker // alive by the caller until the callback is placed. 231*6777b538SAndroid Build Coastguard Worker // |callback| is the callback on completion of the RecvFrom. 232*6777b538SAndroid Build Coastguard Worker // Returns a net error code, or ERR_IO_PENDING if the IO is in progress. 233*6777b538SAndroid Build Coastguard Worker // If ERR_IO_PENDING is returned, this socket takes a ref to |buf| to keep 234*6777b538SAndroid Build Coastguard Worker // it alive until the data is received. However, the caller must keep 235*6777b538SAndroid Build Coastguard Worker // |address| alive until the callback is called. 236*6777b538SAndroid Build Coastguard Worker int RecvFrom(IOBuffer* buf, 237*6777b538SAndroid Build Coastguard Worker int buf_len, 238*6777b538SAndroid Build Coastguard Worker IPEndPoint* address, 239*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback); 240*6777b538SAndroid Build Coastguard Worker 241*6777b538SAndroid Build Coastguard Worker // Sends to a socket with a particular destination. 242*6777b538SAndroid Build Coastguard Worker // |buf| is the buffer to send. 243*6777b538SAndroid Build Coastguard Worker // |buf_len| is the number of bytes to send. 244*6777b538SAndroid Build Coastguard Worker // |address| is the recipient address. 245*6777b538SAndroid Build Coastguard Worker // |callback| is the user callback function to call on complete. 246*6777b538SAndroid Build Coastguard Worker // Returns a net error code, or ERR_IO_PENDING if the IO is in progress. 247*6777b538SAndroid Build Coastguard Worker // If ERR_IO_PENDING is returned, this socket copies |address| for 248*6777b538SAndroid Build Coastguard Worker // asynchronous sending, and takes a ref to |buf| to keep it alive until the 249*6777b538SAndroid Build Coastguard Worker // data is sent. 250*6777b538SAndroid Build Coastguard Worker int SendTo(IOBuffer* buf, 251*6777b538SAndroid Build Coastguard Worker int buf_len, 252*6777b538SAndroid Build Coastguard Worker const IPEndPoint& address, 253*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback); 254*6777b538SAndroid Build Coastguard Worker 255*6777b538SAndroid Build Coastguard Worker // Sets the receive buffer size (in bytes) for the socket. 256*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 257*6777b538SAndroid Build Coastguard Worker int SetReceiveBufferSize(int32_t size); 258*6777b538SAndroid Build Coastguard Worker 259*6777b538SAndroid Build Coastguard Worker // Sets the send buffer size (in bytes) for the socket. 260*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 261*6777b538SAndroid Build Coastguard Worker int SetSendBufferSize(int32_t size); 262*6777b538SAndroid Build Coastguard Worker 263*6777b538SAndroid Build Coastguard Worker // Requests that packets sent by this socket not be fragment, either locally 264*6777b538SAndroid Build Coastguard Worker // by the host, or by routers (via the DF bit in the IPv4 packet header). 265*6777b538SAndroid Build Coastguard Worker // May not be supported by all platforms. Returns a network error code if 266*6777b538SAndroid Build Coastguard Worker // there was a problem, but the socket will still be usable. Can not 267*6777b538SAndroid Build Coastguard Worker // return ERR_IO_PENDING. 268*6777b538SAndroid Build Coastguard Worker int SetDoNotFragment(); 269*6777b538SAndroid Build Coastguard Worker 270*6777b538SAndroid Build Coastguard Worker // Requests that packets received by this socket have the ECN bit set. Returns 271*6777b538SAndroid Build Coastguard Worker // a network error code if there was a problem. 272*6777b538SAndroid Build Coastguard Worker int SetRecvTos(); 273*6777b538SAndroid Build Coastguard Worker 274*6777b538SAndroid Build Coastguard Worker // This is a no-op on Windows. 275*6777b538SAndroid Build Coastguard Worker void SetMsgConfirm(bool confirm); 276*6777b538SAndroid Build Coastguard Worker 277*6777b538SAndroid Build Coastguard Worker // Returns true if the socket is already connected or bound. is_connected()278*6777b538SAndroid Build Coastguard Worker bool is_connected() const { return is_connected_; } 279*6777b538SAndroid Build Coastguard Worker NetLog()280*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& NetLog() const { return net_log_; } 281*6777b538SAndroid Build Coastguard Worker 282*6777b538SAndroid Build Coastguard Worker // Sets socket options to allow the socket to share the local address to which 283*6777b538SAndroid Build Coastguard Worker // the socket will be bound with other processes. If multiple processes are 284*6777b538SAndroid Build Coastguard Worker // bound to the same local address at the same time, behavior is undefined; 285*6777b538SAndroid Build Coastguard Worker // e.g., it is not guaranteed that incoming messages will be sent to all 286*6777b538SAndroid Build Coastguard Worker // listening sockets. Returns a net error code. 287*6777b538SAndroid Build Coastguard Worker // 288*6777b538SAndroid Build Coastguard Worker // Should be called between Open() and Bind(). 289*6777b538SAndroid Build Coastguard Worker int AllowAddressReuse(); 290*6777b538SAndroid Build Coastguard Worker 291*6777b538SAndroid Build Coastguard Worker // Sets socket options to allow sending and receiving packets to and from 292*6777b538SAndroid Build Coastguard Worker // broadcast addresses. 293*6777b538SAndroid Build Coastguard Worker int SetBroadcast(bool broadcast); 294*6777b538SAndroid Build Coastguard Worker 295*6777b538SAndroid Build Coastguard Worker // Sets socket options to allow the socket to share the local address to which 296*6777b538SAndroid Build Coastguard Worker // the socket will be bound with other processes and attempt to allow all such 297*6777b538SAndroid Build Coastguard Worker // sockets to receive the same multicast messages. Returns a net error code. 298*6777b538SAndroid Build Coastguard Worker // 299*6777b538SAndroid Build Coastguard Worker // For Windows, multicast messages should always be shared between sockets 300*6777b538SAndroid Build Coastguard Worker // configured thusly as long as the sockets join the same multicast group and 301*6777b538SAndroid Build Coastguard Worker // interface. 302*6777b538SAndroid Build Coastguard Worker // 303*6777b538SAndroid Build Coastguard Worker // Should be called between Open() and Bind(). 304*6777b538SAndroid Build Coastguard Worker int AllowAddressSharingForMulticast(); 305*6777b538SAndroid Build Coastguard Worker 306*6777b538SAndroid Build Coastguard Worker // Joins the multicast group. 307*6777b538SAndroid Build Coastguard Worker // |group_address| is the group address to join, could be either 308*6777b538SAndroid Build Coastguard Worker // an IPv4 or IPv6 address. 309*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 310*6777b538SAndroid Build Coastguard Worker int JoinGroup(const IPAddress& group_address) const; 311*6777b538SAndroid Build Coastguard Worker 312*6777b538SAndroid Build Coastguard Worker // Leaves the multicast group. 313*6777b538SAndroid Build Coastguard Worker // |group_address| is the group address to leave, could be either 314*6777b538SAndroid Build Coastguard Worker // an IPv4 or IPv6 address. If the socket hasn't joined the group, 315*6777b538SAndroid Build Coastguard Worker // it will be ignored. 316*6777b538SAndroid Build Coastguard Worker // It's optional to leave the multicast group before destroying 317*6777b538SAndroid Build Coastguard Worker // the socket. It will be done by the OS. 318*6777b538SAndroid Build Coastguard Worker // Return a net error code. 319*6777b538SAndroid Build Coastguard Worker int LeaveGroup(const IPAddress& group_address) const; 320*6777b538SAndroid Build Coastguard Worker 321*6777b538SAndroid Build Coastguard Worker // Sets interface to use for multicast. If |interface_index| set to 0, 322*6777b538SAndroid Build Coastguard Worker // default interface is used. 323*6777b538SAndroid Build Coastguard Worker // Should be called before Bind(). 324*6777b538SAndroid Build Coastguard Worker // Returns a net error code. 325*6777b538SAndroid Build Coastguard Worker int SetMulticastInterface(uint32_t interface_index); 326*6777b538SAndroid Build Coastguard Worker 327*6777b538SAndroid Build Coastguard Worker // Sets the time-to-live option for UDP packets sent to the multicast 328*6777b538SAndroid Build Coastguard Worker // group address. The default value of this option is 1. 329*6777b538SAndroid Build Coastguard Worker // Cannot be negative or more than 255. 330*6777b538SAndroid Build Coastguard Worker // Should be called before Bind(). 331*6777b538SAndroid Build Coastguard Worker int SetMulticastTimeToLive(int time_to_live); 332*6777b538SAndroid Build Coastguard Worker 333*6777b538SAndroid Build Coastguard Worker // Sets the loopback flag for UDP socket. If this flag is true, the host 334*6777b538SAndroid Build Coastguard Worker // will receive packets sent to the joined group from itself. 335*6777b538SAndroid Build Coastguard Worker // The default value of this option is true. 336*6777b538SAndroid Build Coastguard Worker // Should be called before Bind(). 337*6777b538SAndroid Build Coastguard Worker // 338*6777b538SAndroid Build Coastguard Worker // Note: the behavior of |SetMulticastLoopbackMode| is slightly 339*6777b538SAndroid Build Coastguard Worker // different between Windows and Unix-like systems. The inconsistency only 340*6777b538SAndroid Build Coastguard Worker // happens when there are more than one applications on the same host 341*6777b538SAndroid Build Coastguard Worker // joined to the same multicast group while having different settings on 342*6777b538SAndroid Build Coastguard Worker // multicast loopback mode. On Windows, the applications with loopback off 343*6777b538SAndroid Build Coastguard Worker // will not RECEIVE the loopback packets; while on Unix-like systems, the 344*6777b538SAndroid Build Coastguard Worker // applications with loopback off will not SEND the loopback packets to 345*6777b538SAndroid Build Coastguard Worker // other applications on the same host. See MSDN: http://goo.gl/6vqbj 346*6777b538SAndroid Build Coastguard Worker int SetMulticastLoopbackMode(bool loopback); 347*6777b538SAndroid Build Coastguard Worker 348*6777b538SAndroid Build Coastguard Worker // Sets the differentiated services flags on outgoing packets. May not do 349*6777b538SAndroid Build Coastguard Worker // anything on some platforms. A return value of ERR_INVALID_HANDLE indicates 350*6777b538SAndroid Build Coastguard Worker // the value was not set but could succeed on a future call, because 351*6777b538SAndroid Build Coastguard Worker // initialization is in progress. 352*6777b538SAndroid Build Coastguard Worker int SetDiffServCodePoint(DiffServCodePoint dscp); 353*6777b538SAndroid Build Coastguard Worker 354*6777b538SAndroid Build Coastguard Worker // Requests that packets sent by this socket have the DSCP and/or ECN 355*6777b538SAndroid Build Coastguard Worker // bits set. Returns a network error code if there was a problem. If 356*6777b538SAndroid Build Coastguard Worker // DSCP_NO_CHANGE or ECN_NO_CHANGE are set, will preserve those parts of 357*6777b538SAndroid Build Coastguard Worker // the original setting. 358*6777b538SAndroid Build Coastguard Worker // ECN values other than 0 must not be used outside of tests, without 359*6777b538SAndroid Build Coastguard Worker // appropriate congestion control. 360*6777b538SAndroid Build Coastguard Worker int SetTos(DiffServCodePoint dscp, EcnCodePoint ecn); 361*6777b538SAndroid Build Coastguard Worker 362*6777b538SAndroid Build Coastguard Worker // Sets IPV6_V6ONLY on the socket. If this flag is true, the socket will be 363*6777b538SAndroid Build Coastguard Worker // restricted to only IPv6; false allows both IPv4 and IPv6 traffic. 364*6777b538SAndroid Build Coastguard Worker int SetIPv6Only(bool ipv6_only); 365*6777b538SAndroid Build Coastguard Worker 366*6777b538SAndroid Build Coastguard Worker // Resets the thread to be used for thread-safety checks. 367*6777b538SAndroid Build Coastguard Worker void DetachFromThread(); 368*6777b538SAndroid Build Coastguard Worker 369*6777b538SAndroid Build Coastguard Worker // This class by default uses overlapped IO. Call this method before Open() or 370*6777b538SAndroid Build Coastguard Worker // AdoptOpenedSocket() to switch to non-blocking IO. 371*6777b538SAndroid Build Coastguard Worker void UseNonBlockingIO(); 372*6777b538SAndroid Build Coastguard Worker 373*6777b538SAndroid Build Coastguard Worker // Apply |tag| to this socket. 374*6777b538SAndroid Build Coastguard Worker void ApplySocketTag(const SocketTag& tag); 375*6777b538SAndroid Build Coastguard Worker 376*6777b538SAndroid Build Coastguard Worker // Takes ownership of `socket`, which should be a socket descriptor opened 377*6777b538SAndroid Build Coastguard Worker // with the specified address family. The socket should only be created but 378*6777b538SAndroid Build Coastguard Worker // not bound or connected to an address. This method must be called after 379*6777b538SAndroid Build Coastguard Worker // UseNonBlockingIO, otherwise the adopted socket will not have the 380*6777b538SAndroid Build Coastguard Worker // non-blocking IO flag set. 381*6777b538SAndroid Build Coastguard Worker int AdoptOpenedSocket(AddressFamily address_family, SOCKET socket); 382*6777b538SAndroid Build Coastguard Worker get_multicast_interface_for_testing()383*6777b538SAndroid Build Coastguard Worker uint32_t get_multicast_interface_for_testing() { 384*6777b538SAndroid Build Coastguard Worker return multicast_interface_; 385*6777b538SAndroid Build Coastguard Worker } get_use_non_blocking_io_for_testing()386*6777b538SAndroid Build Coastguard Worker bool get_use_non_blocking_io_for_testing() { return use_non_blocking_io_; } 387*6777b538SAndroid Build Coastguard Worker 388*6777b538SAndroid Build Coastguard Worker // Because the windows API separates out DSCP and ECN better than Posix, this 389*6777b538SAndroid Build Coastguard Worker // function does not actually return the correct DSCP value, instead always 390*6777b538SAndroid Build Coastguard Worker // returning DSCP_DEFAULT rather than the last incoming value. 391*6777b538SAndroid Build Coastguard Worker // If a use case arises for reading the incoming DSCP value, it would only 392*6777b538SAndroid Build Coastguard Worker // then worth be executing the system call. 393*6777b538SAndroid Build Coastguard Worker // However, the ECN member of the return value is correct if SetRecvTos() 394*6777b538SAndroid Build Coastguard Worker // was called previously on the socket. GetLastTos()395*6777b538SAndroid Build Coastguard Worker DscpAndEcn GetLastTos() const { return last_tos_; } 396*6777b538SAndroid Build Coastguard Worker 397*6777b538SAndroid Build Coastguard Worker private: 398*6777b538SAndroid Build Coastguard Worker enum SocketOptions { 399*6777b538SAndroid Build Coastguard Worker SOCKET_OPTION_MULTICAST_LOOP = 1 << 0 400*6777b538SAndroid Build Coastguard Worker }; 401*6777b538SAndroid Build Coastguard Worker 402*6777b538SAndroid Build Coastguard Worker class Core; 403*6777b538SAndroid Build Coastguard Worker 404*6777b538SAndroid Build Coastguard Worker void DoReadCallback(int rv); 405*6777b538SAndroid Build Coastguard Worker void DoWriteCallback(int rv); 406*6777b538SAndroid Build Coastguard Worker 407*6777b538SAndroid Build Coastguard Worker void DidCompleteRead(); 408*6777b538SAndroid Build Coastguard Worker void DidCompleteWrite(); 409*6777b538SAndroid Build Coastguard Worker 410*6777b538SAndroid Build Coastguard Worker // base::ObjectWatcher::Delegate implementation. 411*6777b538SAndroid Build Coastguard Worker void OnObjectSignaled(HANDLE object) override; 412*6777b538SAndroid Build Coastguard Worker void OnReadSignaled(); 413*6777b538SAndroid Build Coastguard Worker void OnWriteSignaled(); 414*6777b538SAndroid Build Coastguard Worker 415*6777b538SAndroid Build Coastguard Worker void WatchForReadWrite(); 416*6777b538SAndroid Build Coastguard Worker 417*6777b538SAndroid Build Coastguard Worker // Handles stats and logging. |result| is the number of bytes transferred, on 418*6777b538SAndroid Build Coastguard Worker // success, or the net error code on failure. 419*6777b538SAndroid Build Coastguard Worker void LogRead(int result, const char* bytes, const IPEndPoint* address) const; 420*6777b538SAndroid Build Coastguard Worker void LogWrite(int result, const char* bytes, const IPEndPoint* address) const; 421*6777b538SAndroid Build Coastguard Worker 422*6777b538SAndroid Build Coastguard Worker // Same as SendTo(), except that address is passed by pointer 423*6777b538SAndroid Build Coastguard Worker // instead of by reference. It is called from Write() with |address| 424*6777b538SAndroid Build Coastguard Worker // set to NULL. 425*6777b538SAndroid Build Coastguard Worker int SendToOrWrite(IOBuffer* buf, 426*6777b538SAndroid Build Coastguard Worker int buf_len, 427*6777b538SAndroid Build Coastguard Worker const IPEndPoint* address, 428*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback); 429*6777b538SAndroid Build Coastguard Worker 430*6777b538SAndroid Build Coastguard Worker int InternalConnect(const IPEndPoint& address); 431*6777b538SAndroid Build Coastguard Worker 432*6777b538SAndroid Build Coastguard Worker // Returns a function pointer to the platform's instantiation of WSARecvMsg() 433*6777b538SAndroid Build Coastguard Worker // or WSASendMsg(). 434*6777b538SAndroid Build Coastguard Worker LPFN_WSARECVMSG GetRecvMsgPointer(); 435*6777b538SAndroid Build Coastguard Worker LPFN_WSASENDMSG GetSendMsgPointer(); 436*6777b538SAndroid Build Coastguard Worker 437*6777b538SAndroid Build Coastguard Worker // Populates |message| with |storage|, |data_buffer|, and |control_buffer| to 438*6777b538SAndroid Build Coastguard Worker // use ECN before calls to either WSASendMsg() (if |send| is true) or 439*6777b538SAndroid Build Coastguard Worker // WSARecvMsg(). 440*6777b538SAndroid Build Coastguard Worker // |data_buffer| is the datagram. |control_buffer| is the storage 441*6777b538SAndroid Build Coastguard Worker // space for cmsgs. If |send| is false for an overlapped socket, the caller 442*6777b538SAndroid Build Coastguard Worker // must retain a reference to |msghdr|, |storage|, and the buf members of 443*6777b538SAndroid Build Coastguard Worker // |data_buffer| and |control_buffer|, in case WSARecvMsg() returns IO_PENDING 444*6777b538SAndroid Build Coastguard Worker // and the result is delivered asynchronously. 445*6777b538SAndroid Build Coastguard Worker void PopulateWSAMSG(WSAMSG& message, 446*6777b538SAndroid Build Coastguard Worker SockaddrStorage& storage, 447*6777b538SAndroid Build Coastguard Worker WSABUF* data_buffer, 448*6777b538SAndroid Build Coastguard Worker WSABUF& control_buffer, 449*6777b538SAndroid Build Coastguard Worker bool send); 450*6777b538SAndroid Build Coastguard Worker // Sets last_tos_ to the last ECN codepoint contained in |message|. 451*6777b538SAndroid Build Coastguard Worker void SetLastTosFromWSAMSG(WSAMSG& message); 452*6777b538SAndroid Build Coastguard Worker 453*6777b538SAndroid Build Coastguard Worker // Version for using overlapped IO. 454*6777b538SAndroid Build Coastguard Worker int InternalRecvFromOverlapped(IOBuffer* buf, 455*6777b538SAndroid Build Coastguard Worker int buf_len, 456*6777b538SAndroid Build Coastguard Worker IPEndPoint* address); 457*6777b538SAndroid Build Coastguard Worker int InternalSendToOverlapped(IOBuffer* buf, 458*6777b538SAndroid Build Coastguard Worker int buf_len, 459*6777b538SAndroid Build Coastguard Worker const IPEndPoint* address); 460*6777b538SAndroid Build Coastguard Worker 461*6777b538SAndroid Build Coastguard Worker // Version for using non-blocking IO. 462*6777b538SAndroid Build Coastguard Worker int InternalRecvFromNonBlocking(IOBuffer* buf, 463*6777b538SAndroid Build Coastguard Worker int buf_len, 464*6777b538SAndroid Build Coastguard Worker IPEndPoint* address); 465*6777b538SAndroid Build Coastguard Worker int InternalSendToNonBlocking(IOBuffer* buf, 466*6777b538SAndroid Build Coastguard Worker int buf_len, 467*6777b538SAndroid Build Coastguard Worker const IPEndPoint* address); 468*6777b538SAndroid Build Coastguard Worker 469*6777b538SAndroid Build Coastguard Worker // Applies |socket_options_| to |socket_|. Should be called before 470*6777b538SAndroid Build Coastguard Worker // Bind(). 471*6777b538SAndroid Build Coastguard Worker int SetMulticastOptions(); 472*6777b538SAndroid Build Coastguard Worker int DoBind(const IPEndPoint& address); 473*6777b538SAndroid Build Coastguard Worker 474*6777b538SAndroid Build Coastguard Worker // Configures opened `socket_` depending on whether it uses nonblocking IO. 475*6777b538SAndroid Build Coastguard Worker void ConfigureOpenedSocket(); 476*6777b538SAndroid Build Coastguard Worker 477*6777b538SAndroid Build Coastguard Worker // This is provided to allow QwaveApi mocking in tests. |UDPSocketWin| method 478*6777b538SAndroid Build Coastguard Worker // implementations should call |GetQwaveApi()| instead of 479*6777b538SAndroid Build Coastguard Worker // |QwaveApi::GetDefault()| directly. 480*6777b538SAndroid Build Coastguard Worker virtual QwaveApi* GetQwaveApi() const; 481*6777b538SAndroid Build Coastguard Worker 482*6777b538SAndroid Build Coastguard Worker SOCKET socket_; 483*6777b538SAndroid Build Coastguard Worker int addr_family_ = 0; 484*6777b538SAndroid Build Coastguard Worker bool is_connected_ = false; 485*6777b538SAndroid Build Coastguard Worker 486*6777b538SAndroid Build Coastguard Worker // Bitwise-or'd combination of SocketOptions. Specifies the set of 487*6777b538SAndroid Build Coastguard Worker // options that should be applied to |socket_| before Bind(). 488*6777b538SAndroid Build Coastguard Worker int socket_options_; 489*6777b538SAndroid Build Coastguard Worker 490*6777b538SAndroid Build Coastguard Worker // Multicast interface. 491*6777b538SAndroid Build Coastguard Worker uint32_t multicast_interface_ = 0; 492*6777b538SAndroid Build Coastguard Worker 493*6777b538SAndroid Build Coastguard Worker // Multicast socket options cached for SetMulticastOption. 494*6777b538SAndroid Build Coastguard Worker // Cannot be used after Bind(). 495*6777b538SAndroid Build Coastguard Worker int multicast_time_to_live_ = 1; 496*6777b538SAndroid Build Coastguard Worker 497*6777b538SAndroid Build Coastguard Worker // These are mutable since they're just cached copies to make 498*6777b538SAndroid Build Coastguard Worker // GetPeerAddress/GetLocalAddress smarter. 499*6777b538SAndroid Build Coastguard Worker mutable std::unique_ptr<IPEndPoint> local_address_; 500*6777b538SAndroid Build Coastguard Worker mutable std::unique_ptr<IPEndPoint> remote_address_; 501*6777b538SAndroid Build Coastguard Worker 502*6777b538SAndroid Build Coastguard Worker // The core of the socket that can live longer than the socket itself. We pass 503*6777b538SAndroid Build Coastguard Worker // resources to the Windows async IO functions and we have to make sure that 504*6777b538SAndroid Build Coastguard Worker // they are not destroyed while the OS still references them. 505*6777b538SAndroid Build Coastguard Worker scoped_refptr<Core> core_; 506*6777b538SAndroid Build Coastguard Worker 507*6777b538SAndroid Build Coastguard Worker // True if non-blocking IO is used. 508*6777b538SAndroid Build Coastguard Worker bool use_non_blocking_io_ = false; 509*6777b538SAndroid Build Coastguard Worker 510*6777b538SAndroid Build Coastguard Worker // Watches |read_write_event_|. 511*6777b538SAndroid Build Coastguard Worker base::win::ObjectWatcher read_write_watcher_; 512*6777b538SAndroid Build Coastguard Worker 513*6777b538SAndroid Build Coastguard Worker // Events for read and write. 514*6777b538SAndroid Build Coastguard Worker base::win::ScopedHandle read_write_event_; 515*6777b538SAndroid Build Coastguard Worker 516*6777b538SAndroid Build Coastguard Worker // The buffers used in Read() and Write(). 517*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBuffer> read_iobuffer_; 518*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBuffer> write_iobuffer_; 519*6777b538SAndroid Build Coastguard Worker 520*6777b538SAndroid Build Coastguard Worker int read_iobuffer_len_ = 0; 521*6777b538SAndroid Build Coastguard Worker int write_iobuffer_len_ = 0; 522*6777b538SAndroid Build Coastguard Worker 523*6777b538SAndroid Build Coastguard Worker raw_ptr<IPEndPoint> recv_from_address_ = nullptr; 524*6777b538SAndroid Build Coastguard Worker 525*6777b538SAndroid Build Coastguard Worker // Cached copy of the current address we're sending to, if any. Used for 526*6777b538SAndroid Build Coastguard Worker // logging. 527*6777b538SAndroid Build Coastguard Worker std::unique_ptr<IPEndPoint> send_to_address_; 528*6777b538SAndroid Build Coastguard Worker 529*6777b538SAndroid Build Coastguard Worker // External callback; called when read is complete. 530*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback read_callback_; 531*6777b538SAndroid Build Coastguard Worker 532*6777b538SAndroid Build Coastguard Worker // External callback; called when write is complete. 533*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback write_callback_; 534*6777b538SAndroid Build Coastguard Worker 535*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log_; 536*6777b538SAndroid Build Coastguard Worker 537*6777b538SAndroid Build Coastguard Worker // Maintains remote addresses for QWAVE qos management. 538*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DscpManager> dscp_manager_; 539*6777b538SAndroid Build Coastguard Worker 540*6777b538SAndroid Build Coastguard Worker // Manages decrementing the global open UDP socket counter when this 541*6777b538SAndroid Build Coastguard Worker // UDPSocket is destroyed. 542*6777b538SAndroid Build Coastguard Worker OwnedUDPSocketCount owned_socket_count_; 543*6777b538SAndroid Build Coastguard Worker 544*6777b538SAndroid Build Coastguard Worker DscpAndEcn last_tos_ = {DSCP_DEFAULT, ECN_DEFAULT}; 545*6777b538SAndroid Build Coastguard Worker 546*6777b538SAndroid Build Coastguard Worker // If true, the socket has been configured to report ECN on incoming 547*6777b538SAndroid Build Coastguard Worker // datagrams. 548*6777b538SAndroid Build Coastguard Worker bool report_ecn_ = false; 549*6777b538SAndroid Build Coastguard Worker 550*6777b538SAndroid Build Coastguard Worker // Function pointers to the platform implementations of WSARecvMsg() and 551*6777b538SAndroid Build Coastguard Worker // WSASendMsg(). 552*6777b538SAndroid Build Coastguard Worker LPFN_WSARECVMSG wsa_recv_msg_ = nullptr; 553*6777b538SAndroid Build Coastguard Worker LPFN_WSASENDMSG wsa_send_msg_ = nullptr; 554*6777b538SAndroid Build Coastguard Worker 555*6777b538SAndroid Build Coastguard Worker // The ECN codepoint to send on outgoing packets. 556*6777b538SAndroid Build Coastguard Worker EcnCodePoint send_ecn_ = ECN_NOT_ECT; 557*6777b538SAndroid Build Coastguard Worker 558*6777b538SAndroid Build Coastguard Worker THREAD_CHECKER(thread_checker_); 559*6777b538SAndroid Build Coastguard Worker 560*6777b538SAndroid Build Coastguard Worker // Used to prevent null dereferences in OnObjectSignaled, when passing an 561*6777b538SAndroid Build Coastguard Worker // error to both read and write callbacks. Cleared in Close() 562*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<UDPSocketWin> event_pending_{this}; 563*6777b538SAndroid Build Coastguard Worker }; 564*6777b538SAndroid Build Coastguard Worker 565*6777b538SAndroid Build Coastguard Worker //----------------------------------------------------------------------------- 566*6777b538SAndroid Build Coastguard Worker 567*6777b538SAndroid Build Coastguard Worker 568*6777b538SAndroid Build Coastguard Worker 569*6777b538SAndroid Build Coastguard Worker } // namespace net 570*6777b538SAndroid Build Coastguard Worker 571*6777b538SAndroid Build Coastguard Worker #endif // NET_SOCKET_UDP_SOCKET_WIN_H_ 572