xref: /aosp_15_r20/external/cronet/net/socket/udp_client_socket.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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