xref: /aosp_15_r20/external/cronet/net/socket/tcp_socket_posix.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 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_TCP_SOCKET_POSIX_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_TCP_SOCKET_POSIX_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 <memory>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/address_family.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/base/network_handle.h"
17*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_descriptor.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_performance_watcher.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_tag.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h"
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker namespace base {
24*6777b538SAndroid Build Coastguard Worker class TimeDelta;
25*6777b538SAndroid Build Coastguard Worker }
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker namespace net {
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker class AddressList;
30*6777b538SAndroid Build Coastguard Worker class IOBuffer;
31*6777b538SAndroid Build Coastguard Worker class IPEndPoint;
32*6777b538SAndroid Build Coastguard Worker class SocketPosix;
33*6777b538SAndroid Build Coastguard Worker class NetLog;
34*6777b538SAndroid Build Coastguard Worker struct NetLogSource;
35*6777b538SAndroid Build Coastguard Worker class SocketTag;
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker class NET_EXPORT TCPSocketPosix {
38*6777b538SAndroid Build Coastguard Worker  public:
39*6777b538SAndroid Build Coastguard Worker   // |socket_performance_watcher| is notified of the performance metrics related
40*6777b538SAndroid Build Coastguard Worker   // to this socket. |socket_performance_watcher| may be null.
41*6777b538SAndroid Build Coastguard Worker   TCPSocketPosix(
42*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
43*6777b538SAndroid Build Coastguard Worker       NetLog* net_log,
44*6777b538SAndroid Build Coastguard Worker       const NetLogSource& source);
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker   TCPSocketPosix(
47*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
48*6777b538SAndroid Build Coastguard Worker       NetLogWithSource net_log_source);
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker   TCPSocketPosix(const TCPSocketPosix&) = delete;
51*6777b538SAndroid Build Coastguard Worker   TCPSocketPosix& operator=(const TCPSocketPosix&) = delete;
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker   virtual ~TCPSocketPosix();
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   // Opens the socket.
56*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
57*6777b538SAndroid Build Coastguard Worker   int Open(AddressFamily family);
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker   // Takes ownership of |socket|, which is known to already be connected to the
60*6777b538SAndroid Build Coastguard Worker   // given peer address. However, peer address may be the empty address, for
61*6777b538SAndroid Build Coastguard Worker   // compatibility. The given peer address will be returned by GetPeerAddress.
62*6777b538SAndroid Build Coastguard Worker   int AdoptConnectedSocket(SocketDescriptor socket,
63*6777b538SAndroid Build Coastguard Worker                            const IPEndPoint& peer_address);
64*6777b538SAndroid Build Coastguard Worker   // Takes ownership of |socket|, which may or may not be open, bound, or
65*6777b538SAndroid Build Coastguard Worker   // listening. The caller must determine the state of the socket based on its
66*6777b538SAndroid Build Coastguard Worker   // provenance and act accordingly. The socket may have connections waiting
67*6777b538SAndroid Build Coastguard Worker   // to be accepted, but must not be actually connected.
68*6777b538SAndroid Build Coastguard Worker   int AdoptUnconnectedSocket(SocketDescriptor socket);
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker   // Binds this socket to |address|. This is generally only used on a server.
71*6777b538SAndroid Build Coastguard Worker   // Should be called after Open(). Returns a net error code.
72*6777b538SAndroid Build Coastguard Worker   int Bind(const IPEndPoint& address);
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker   // Put this socket on listen state with the given |backlog|.
75*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
76*6777b538SAndroid Build Coastguard Worker   int Listen(int backlog);
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker   // Accepts incoming connection.
79*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
80*6777b538SAndroid Build Coastguard Worker   int Accept(std::unique_ptr<TCPSocketPosix>* socket,
81*6777b538SAndroid Build Coastguard Worker              IPEndPoint* address,
82*6777b538SAndroid Build Coastguard Worker              CompletionOnceCallback callback);
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker   // Connects this socket to the given |address|.
85*6777b538SAndroid Build Coastguard Worker   // Should be called after Open().
86*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
87*6777b538SAndroid Build Coastguard Worker   int Connect(const IPEndPoint& address, CompletionOnceCallback callback);
88*6777b538SAndroid Build Coastguard Worker   bool IsConnected() const;
89*6777b538SAndroid Build Coastguard Worker   bool IsConnectedAndIdle() const;
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker   // IO:
92*6777b538SAndroid Build Coastguard Worker   // Multiple outstanding requests are not supported.
93*6777b538SAndroid Build Coastguard Worker   // Full duplex mode (reading and writing at the same time) is supported.
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker   // Reads from the socket.
96*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
97*6777b538SAndroid Build Coastguard Worker   int Read(IOBuffer* buf, int buf_len, CompletionOnceCallback callback);
98*6777b538SAndroid Build Coastguard Worker   int ReadIfReady(IOBuffer* buf, int buf_len, CompletionOnceCallback callback);
99*6777b538SAndroid Build Coastguard Worker   int CancelReadIfReady();
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker   // Writes to the socket.
102*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
103*6777b538SAndroid Build Coastguard Worker   int Write(IOBuffer* buf,
104*6777b538SAndroid Build Coastguard Worker             int buf_len,
105*6777b538SAndroid Build Coastguard Worker             CompletionOnceCallback callback,
106*6777b538SAndroid Build Coastguard Worker             const NetworkTrafficAnnotationTag& traffic_annotation);
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   // Copies the local tcp address into |address| and returns a net error code.
109*6777b538SAndroid Build Coastguard Worker   int GetLocalAddress(IPEndPoint* address) const;
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker   // Copies the remote tcp code into |address| and returns a net error code.
112*6777b538SAndroid Build Coastguard Worker   int GetPeerAddress(IPEndPoint* address) const;
113*6777b538SAndroid Build Coastguard Worker 
114*6777b538SAndroid Build Coastguard Worker   // Sets various socket options.
115*6777b538SAndroid Build Coastguard Worker   // The commonly used options for server listening sockets:
116*6777b538SAndroid Build Coastguard Worker   // - AllowAddressReuse().
117*6777b538SAndroid Build Coastguard Worker   int SetDefaultOptionsForServer();
118*6777b538SAndroid Build Coastguard Worker   // The commonly used options for client sockets and accepted sockets:
119*6777b538SAndroid Build Coastguard Worker   // - SetNoDelay(true);
120*6777b538SAndroid Build Coastguard Worker   // - SetKeepAlive(true, 45).
121*6777b538SAndroid Build Coastguard Worker   void SetDefaultOptionsForClient();
122*6777b538SAndroid Build Coastguard Worker   int AllowAddressReuse();
123*6777b538SAndroid Build Coastguard Worker   int SetReceiveBufferSize(int32_t size);
124*6777b538SAndroid Build Coastguard Worker   int SetSendBufferSize(int32_t size);
125*6777b538SAndroid Build Coastguard Worker   bool SetKeepAlive(bool enable, int delay);
126*6777b538SAndroid Build Coastguard Worker   bool SetNoDelay(bool no_delay);
127*6777b538SAndroid Build Coastguard Worker   int SetIPv6Only(bool ipv6_only);
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker   // Gets the estimated RTT. Returns false if the RTT is
130*6777b538SAndroid Build Coastguard Worker   // unavailable. May also return false when estimated RTT is 0.
131*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] bool GetEstimatedRoundTripTime(base::TimeDelta* out_rtt) const;
132*6777b538SAndroid Build Coastguard Worker 
133*6777b538SAndroid Build Coastguard Worker   // Closes the socket.
134*6777b538SAndroid Build Coastguard Worker   void Close();
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker   bool IsValid() const;
137*6777b538SAndroid Build Coastguard Worker 
138*6777b538SAndroid Build Coastguard Worker   // Detachs from the current thread, to allow the socket to be transferred to
139*6777b538SAndroid Build Coastguard Worker   // a new thread. Should only be called when the object is no longer used by
140*6777b538SAndroid Build Coastguard Worker   // the old thread.
141*6777b538SAndroid Build Coastguard Worker   void DetachFromThread();
142*6777b538SAndroid Build Coastguard Worker 
143*6777b538SAndroid Build Coastguard Worker   // Marks the start/end of a series of connect attempts for logging purpose.
144*6777b538SAndroid Build Coastguard Worker   //
145*6777b538SAndroid Build Coastguard Worker   // TCPClientSocket may attempt to connect to multiple addresses until it
146*6777b538SAndroid Build Coastguard Worker   // succeeds in establishing a connection. The corresponding log will have
147*6777b538SAndroid Build Coastguard Worker   // multiple NetLogEventType::TCP_CONNECT_ATTEMPT entries nested within a
148*6777b538SAndroid Build Coastguard Worker   // NetLogEventType::TCP_CONNECT. These methods set the start/end of
149*6777b538SAndroid Build Coastguard Worker   // NetLogEventType::TCP_CONNECT.
150*6777b538SAndroid Build Coastguard Worker   //
151*6777b538SAndroid Build Coastguard Worker   // TODO(yzshen): Change logging format and let TCPClientSocket log the
152*6777b538SAndroid Build Coastguard Worker   // start/end of a series of connect attempts itself.
153*6777b538SAndroid Build Coastguard Worker   void StartLoggingMultipleConnectAttempts(const AddressList& addresses);
154*6777b538SAndroid Build Coastguard Worker   void EndLoggingMultipleConnectAttempts(int net_error);
155*6777b538SAndroid Build Coastguard Worker 
net_log()156*6777b538SAndroid Build Coastguard Worker   const NetLogWithSource& net_log() const { return net_log_; }
157*6777b538SAndroid Build Coastguard Worker 
158*6777b538SAndroid Build Coastguard Worker   // Return the underlying SocketDescriptor and clean up this object, which may
159*6777b538SAndroid Build Coastguard Worker   // no longer be used. This method should be used only for testing. No read,
160*6777b538SAndroid Build Coastguard Worker   // write, or accept operations should be pending.
161*6777b538SAndroid Build Coastguard Worker   SocketDescriptor ReleaseSocketDescriptorForTesting();
162*6777b538SAndroid Build Coastguard Worker 
163*6777b538SAndroid Build Coastguard Worker   // Exposes the underlying socket descriptor for testing its state. Does not
164*6777b538SAndroid Build Coastguard Worker   // release ownership of the descriptor.
165*6777b538SAndroid Build Coastguard Worker   SocketDescriptor SocketDescriptorForTesting() const;
166*6777b538SAndroid Build Coastguard Worker 
167*6777b538SAndroid Build Coastguard Worker   // Apply |tag| to this socket.
168*6777b538SAndroid Build Coastguard Worker   void ApplySocketTag(const SocketTag& tag);
169*6777b538SAndroid Build Coastguard Worker 
170*6777b538SAndroid Build Coastguard Worker   // May return nullptr.
socket_performance_watcher()171*6777b538SAndroid Build Coastguard Worker   SocketPerformanceWatcher* socket_performance_watcher() const {
172*6777b538SAndroid Build Coastguard Worker     return socket_performance_watcher_.get();
173*6777b538SAndroid Build Coastguard Worker   }
174*6777b538SAndroid Build Coastguard Worker 
175*6777b538SAndroid Build Coastguard Worker   // Binds this socket to `network`. All data traffic on the socket will be sent
176*6777b538SAndroid Build Coastguard Worker   // and received via `network`. Must be called after Open() but before
177*6777b538SAndroid Build Coastguard Worker   // Connect() and/or Bind(). This call will fail if `network` has disconnected.
178*6777b538SAndroid Build Coastguard Worker   // Communication using this socket will fail if `network` disconnects.
179*6777b538SAndroid Build Coastguard Worker   // Returns a net error code.
180*6777b538SAndroid Build Coastguard Worker   int BindToNetwork(handles::NetworkHandle network);
181*6777b538SAndroid Build Coastguard Worker 
182*6777b538SAndroid Build Coastguard Worker  private:
183*6777b538SAndroid Build Coastguard Worker   void AcceptCompleted(std::unique_ptr<TCPSocketPosix>* tcp_socket,
184*6777b538SAndroid Build Coastguard Worker                        IPEndPoint* address,
185*6777b538SAndroid Build Coastguard Worker                        CompletionOnceCallback callback,
186*6777b538SAndroid Build Coastguard Worker                        int rv);
187*6777b538SAndroid Build Coastguard Worker   int HandleAcceptCompleted(std::unique_ptr<TCPSocketPosix>* tcp_socket,
188*6777b538SAndroid Build Coastguard Worker                             IPEndPoint* address,
189*6777b538SAndroid Build Coastguard Worker                             int rv);
190*6777b538SAndroid Build Coastguard Worker   int BuildTcpSocketPosix(std::unique_ptr<TCPSocketPosix>* tcp_socket,
191*6777b538SAndroid Build Coastguard Worker                           IPEndPoint* address);
192*6777b538SAndroid Build Coastguard Worker 
193*6777b538SAndroid Build Coastguard Worker   void ConnectCompleted(CompletionOnceCallback callback, int rv);
194*6777b538SAndroid Build Coastguard Worker   int HandleConnectCompleted(int rv);
195*6777b538SAndroid Build Coastguard Worker   void LogConnectBegin(const AddressList& addresses) const;
196*6777b538SAndroid Build Coastguard Worker   void LogConnectEnd(int net_error) const;
197*6777b538SAndroid Build Coastguard Worker 
198*6777b538SAndroid Build Coastguard Worker   void ReadCompleted(const scoped_refptr<IOBuffer>& buf,
199*6777b538SAndroid Build Coastguard Worker                      CompletionOnceCallback callback,
200*6777b538SAndroid Build Coastguard Worker                      int rv);
201*6777b538SAndroid Build Coastguard Worker   void ReadIfReadyCompleted(CompletionOnceCallback callback, int rv);
202*6777b538SAndroid Build Coastguard Worker   int HandleReadCompleted(IOBuffer* buf, int rv);
203*6777b538SAndroid Build Coastguard Worker   void HandleReadCompletedHelper(int rv);
204*6777b538SAndroid Build Coastguard Worker 
205*6777b538SAndroid Build Coastguard Worker   void WriteCompleted(const scoped_refptr<IOBuffer>& buf,
206*6777b538SAndroid Build Coastguard Worker                       CompletionOnceCallback callback,
207*6777b538SAndroid Build Coastguard Worker                       int rv);
208*6777b538SAndroid Build Coastguard Worker   int HandleWriteCompleted(IOBuffer* buf, int rv);
209*6777b538SAndroid Build Coastguard Worker 
210*6777b538SAndroid Build Coastguard Worker   // Notifies |socket_performance_watcher_| of the latest RTT estimate available
211*6777b538SAndroid Build Coastguard Worker   // from the tcp_info struct for this TCP socket.
212*6777b538SAndroid Build Coastguard Worker   void NotifySocketPerformanceWatcher();
213*6777b538SAndroid Build Coastguard Worker 
214*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<SocketPosix> socket_;
215*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<SocketPosix> accept_socket_;
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker   // Socket performance statistics (such as RTT) are reported to the
218*6777b538SAndroid Build Coastguard Worker   // |socket_performance_watcher_|. May be nullptr.
219*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher_;
220*6777b538SAndroid Build Coastguard Worker 
221*6777b538SAndroid Build Coastguard Worker   bool logging_multiple_connect_attempts_ = false;
222*6777b538SAndroid Build Coastguard Worker 
223*6777b538SAndroid Build Coastguard Worker   NetLogWithSource net_log_;
224*6777b538SAndroid Build Coastguard Worker 
225*6777b538SAndroid Build Coastguard Worker   // Current socket tag if |socket_| is valid, otherwise the tag to apply when
226*6777b538SAndroid Build Coastguard Worker   // |socket_| is opened.
227*6777b538SAndroid Build Coastguard Worker   SocketTag tag_;
228*6777b538SAndroid Build Coastguard Worker };
229*6777b538SAndroid Build Coastguard Worker 
230*6777b538SAndroid Build Coastguard Worker }  // namespace net
231*6777b538SAndroid Build Coastguard Worker 
232*6777b538SAndroid Build Coastguard Worker #endif  // NET_SOCKET_TCP_SOCKET_POSIX_H_
233