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