1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 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_CLIENT_SOCKET_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_UDP_CLIENT_SOCKET_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 11*6777b538SAndroid Build Coastguard Worker #include "net/socket/datagram_client_socket.h" 12*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_descriptor.h" 13*6777b538SAndroid Build Coastguard Worker #include "net/socket/udp_socket.h" 14*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace net { 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker class NetLog; 19*6777b538SAndroid Build Coastguard Worker struct NetLogSource; 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker // A client socket that uses UDP as the transport layer. 22*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE UDPClientSocket : public DatagramClientSocket { 23*6777b538SAndroid Build Coastguard Worker public: 24*6777b538SAndroid Build Coastguard Worker // If `network` is specified, the socket will be bound to it. All data traffic 25*6777b538SAndroid Build Coastguard Worker // on the socket will be sent and received via `network`. Communication using 26*6777b538SAndroid Build Coastguard Worker // this socket will fail if `network` disconnects. 27*6777b538SAndroid Build Coastguard Worker UDPClientSocket( 28*6777b538SAndroid Build Coastguard Worker DatagramSocket::BindType bind_type, 29*6777b538SAndroid Build Coastguard Worker net::NetLog* net_log, 30*6777b538SAndroid Build Coastguard Worker const net::NetLogSource& source, 31*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle network = handles::kInvalidNetworkHandle); 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker UDPClientSocket( 34*6777b538SAndroid Build Coastguard Worker DatagramSocket::BindType bind_type, 35*6777b538SAndroid Build Coastguard Worker NetLogWithSource source_net_log, 36*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle network = handles::kInvalidNetworkHandle); 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker UDPClientSocket(const UDPClientSocket&) = delete; 39*6777b538SAndroid Build Coastguard Worker UDPClientSocket& operator=(const UDPClientSocket&) = delete; 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker ~UDPClientSocket() override; 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker // DatagramClientSocket implementation. 44*6777b538SAndroid Build Coastguard Worker int Connect(const IPEndPoint& address) override; 45*6777b538SAndroid Build Coastguard Worker int ConnectUsingNetwork(handles::NetworkHandle network, 46*6777b538SAndroid Build Coastguard Worker const IPEndPoint& address) override; 47*6777b538SAndroid Build Coastguard Worker int ConnectUsingDefaultNetwork(const IPEndPoint& address) override; 48*6777b538SAndroid Build Coastguard Worker int ConnectAsync(const IPEndPoint& address, 49*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 50*6777b538SAndroid Build Coastguard Worker int ConnectUsingNetworkAsync(handles::NetworkHandle network, 51*6777b538SAndroid Build Coastguard Worker const IPEndPoint& address, 52*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 53*6777b538SAndroid Build Coastguard Worker int ConnectUsingDefaultNetworkAsync(const IPEndPoint& address, 54*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 55*6777b538SAndroid Build Coastguard Worker DscpAndEcn GetLastTos() const override; 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle GetBoundNetwork() const override; 58*6777b538SAndroid Build Coastguard Worker void ApplySocketTag(const SocketTag& tag) override; 59*6777b538SAndroid Build Coastguard Worker int Read(IOBuffer* buf, 60*6777b538SAndroid Build Coastguard Worker int buf_len, 61*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 62*6777b538SAndroid Build Coastguard Worker int Write(IOBuffer* buf, 63*6777b538SAndroid Build Coastguard Worker int buf_len, 64*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 65*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& traffic_annotation) override; 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker void Close() override; 68*6777b538SAndroid Build Coastguard Worker int GetPeerAddress(IPEndPoint* address) const override; 69*6777b538SAndroid Build Coastguard Worker int GetLocalAddress(IPEndPoint* address) const override; 70*6777b538SAndroid Build Coastguard Worker // Switch to use non-blocking IO. Must be called right after construction and 71*6777b538SAndroid Build Coastguard Worker // before other calls. 72*6777b538SAndroid Build Coastguard Worker void UseNonBlockingIO() override; 73*6777b538SAndroid Build Coastguard Worker int SetReceiveBufferSize(int32_t size) override; 74*6777b538SAndroid Build Coastguard Worker int SetSendBufferSize(int32_t size) override; 75*6777b538SAndroid Build Coastguard Worker int SetDoNotFragment() override; 76*6777b538SAndroid Build Coastguard Worker int SetRecvTos() override; 77*6777b538SAndroid Build Coastguard Worker int SetTos(DiffServCodePoint dscp, EcnCodePoint ecn) override; 78*6777b538SAndroid Build Coastguard Worker void SetMsgConfirm(bool confirm) override; 79*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& NetLog() const override; 80*6777b538SAndroid Build Coastguard Worker void EnableRecvOptimization() override; 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker int SetMulticastInterface(uint32_t interface_index) override; 83*6777b538SAndroid Build Coastguard Worker void SetIOSNetworkServiceType(int ios_network_service_type) override; 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker // Takes ownership of an opened but unconnected and unbound `socket`. This 86*6777b538SAndroid Build Coastguard Worker // method must be called after UseNonBlockingIO, otherwise the adopted socket 87*6777b538SAndroid Build Coastguard Worker // will not have the non-blocking IO flag set. 88*6777b538SAndroid Build Coastguard Worker int AdoptOpenedSocket(AddressFamily address_family, SocketDescriptor socket); 89*6777b538SAndroid Build Coastguard Worker get_multicast_interface_for_testing()90*6777b538SAndroid Build Coastguard Worker uint32_t get_multicast_interface_for_testing() { 91*6777b538SAndroid Build Coastguard Worker return socket_.get_multicast_interface_for_testing(); 92*6777b538SAndroid Build Coastguard Worker } 93*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_WIN) get_msg_confirm_for_testing()94*6777b538SAndroid Build Coastguard Worker bool get_msg_confirm_for_testing() { 95*6777b538SAndroid Build Coastguard Worker return socket_.get_msg_confirm_for_testing(); 96*6777b538SAndroid Build Coastguard Worker } get_recv_optimization_for_testing()97*6777b538SAndroid Build Coastguard Worker bool get_recv_optimization_for_testing() { 98*6777b538SAndroid Build Coastguard Worker return socket_.get_experimental_recv_optimization_enabled_for_testing(); 99*6777b538SAndroid Build Coastguard Worker } 100*6777b538SAndroid Build Coastguard Worker #endif 101*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) get_use_non_blocking_io_for_testing()102*6777b538SAndroid Build Coastguard Worker bool get_use_non_blocking_io_for_testing() { 103*6777b538SAndroid Build Coastguard Worker return socket_.get_use_non_blocking_io_for_testing(); 104*6777b538SAndroid Build Coastguard Worker } 105*6777b538SAndroid Build Coastguard Worker #endif 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker private: 108*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log_; 109*6777b538SAndroid Build Coastguard Worker UDPSocket socket_; 110*6777b538SAndroid Build Coastguard Worker bool adopted_opened_socket_ = false; 111*6777b538SAndroid Build Coastguard Worker bool connect_called_ = false; 112*6777b538SAndroid Build Coastguard Worker // The network the socket is currently bound to. 113*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle network_ = handles::kInvalidNetworkHandle; 114*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle connect_using_network_; 115*6777b538SAndroid Build Coastguard Worker }; 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker } // namespace net 118*6777b538SAndroid Build Coastguard Worker 119*6777b538SAndroid Build Coastguard Worker #endif // NET_SOCKET_UDP_CLIENT_SOCKET_H_ 120