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