1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 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_SOCKET_POSIX_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_SOCKET_POSIX_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/message_loop/message_pump_for_io.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_checker.h" 15*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 16*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 17*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_descriptor.h" 18*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h" 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace net { 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker class IOBuffer; 23*6777b538SAndroid Build Coastguard Worker struct SockaddrStorage; 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker // Socket class to provide asynchronous read/write operations on top of the 26*6777b538SAndroid Build Coastguard Worker // posix socket api. It supports AF_INET, AF_INET6, and AF_UNIX addresses. 27*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE SocketPosix 28*6777b538SAndroid Build Coastguard Worker : public base::MessagePumpForIO::FdWatcher { 29*6777b538SAndroid Build Coastguard Worker public: 30*6777b538SAndroid Build Coastguard Worker SocketPosix(); 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker SocketPosix(const SocketPosix&) = delete; 33*6777b538SAndroid Build Coastguard Worker SocketPosix& operator=(const SocketPosix&) = delete; 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker ~SocketPosix() override; 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker // Opens a socket and returns net::OK if |address_family| is AF_INET, AF_INET6 38*6777b538SAndroid Build Coastguard Worker // or AF_UNIX. Otherwise, it does DCHECK() and returns a net error. 39*6777b538SAndroid Build Coastguard Worker int Open(int address_family); 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker // Takes ownership of |socket|, which is known to already be connected to the 42*6777b538SAndroid Build Coastguard Worker // given peer address. 43*6777b538SAndroid Build Coastguard Worker int AdoptConnectedSocket(SocketDescriptor socket, 44*6777b538SAndroid Build Coastguard Worker const SockaddrStorage& peer_address); 45*6777b538SAndroid Build Coastguard Worker // Takes ownership of |socket|, which may or may not be open, bound, or 46*6777b538SAndroid Build Coastguard Worker // listening. The caller must determine the state of the socket based on its 47*6777b538SAndroid Build Coastguard Worker // provenance and act accordingly. The socket may have connections waiting 48*6777b538SAndroid Build Coastguard Worker // to be accepted, but must not be actually connected. 49*6777b538SAndroid Build Coastguard Worker int AdoptUnconnectedSocket(SocketDescriptor socket); 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker // Releases ownership of |socket_fd_| to caller. There must be no pending 52*6777b538SAndroid Build Coastguard Worker // write. 53*6777b538SAndroid Build Coastguard Worker SocketDescriptor ReleaseConnectedSocket(); 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker int Bind(const SockaddrStorage& address); 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker int Listen(int backlog); 58*6777b538SAndroid Build Coastguard Worker int Accept(std::unique_ptr<SocketPosix>* socket, 59*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback); 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker // Connects socket. On non-ERR_IO_PENDING error, sets errno and returns a net 62*6777b538SAndroid Build Coastguard Worker // error code. On ERR_IO_PENDING, |callback| is called with a net error code, 63*6777b538SAndroid Build Coastguard Worker // not errno, though errno is set if connect event happens with error. 64*6777b538SAndroid Build Coastguard Worker // TODO(byungchul): Need more robust way to pass system errno. 65*6777b538SAndroid Build Coastguard Worker int Connect(const SockaddrStorage& address, CompletionOnceCallback callback); 66*6777b538SAndroid Build Coastguard Worker bool IsConnected() const; 67*6777b538SAndroid Build Coastguard Worker bool IsConnectedAndIdle() const; 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker // Multiple outstanding requests of the same type are not supported. 70*6777b538SAndroid Build Coastguard Worker // Full duplex mode (reading and writing at the same time) is supported. 71*6777b538SAndroid Build Coastguard Worker // On error which is not ERR_IO_PENDING, sets errno and returns a net error 72*6777b538SAndroid Build Coastguard Worker // code. On ERR_IO_PENDING, |callback| is called with a net error code, not 73*6777b538SAndroid Build Coastguard Worker // errno, though errno is set if read or write events happen with error. 74*6777b538SAndroid Build Coastguard Worker // TODO(byungchul): Need more robust way to pass system errno. 75*6777b538SAndroid Build Coastguard Worker int Read(IOBuffer* buf, int buf_len, CompletionOnceCallback callback); 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker // Reads up to |buf_len| bytes into |buf| without blocking. If read is to 78*6777b538SAndroid Build Coastguard Worker // be retried later, |callback| will be invoked when data is ready for 79*6777b538SAndroid Build Coastguard Worker // reading. This method doesn't hold on to |buf|. 80*6777b538SAndroid Build Coastguard Worker // See socket.h for more information. 81*6777b538SAndroid Build Coastguard Worker int ReadIfReady(IOBuffer* buf, int buf_len, CompletionOnceCallback callback); 82*6777b538SAndroid Build Coastguard Worker int CancelReadIfReady(); 83*6777b538SAndroid Build Coastguard Worker int Write(IOBuffer* buf, 84*6777b538SAndroid Build Coastguard Worker int buf_len, 85*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 86*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& traffic_annotation); 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker // Waits for next write event. This is called by TCPSocketPosix for TCP 89*6777b538SAndroid Build Coastguard Worker // fastopen after sending first data. Returns ERR_IO_PENDING if it starts 90*6777b538SAndroid Build Coastguard Worker // waiting for write event successfully. Otherwise, returns a net error code. 91*6777b538SAndroid Build Coastguard Worker // It must not be called after Write() because Write() calls it internally. 92*6777b538SAndroid Build Coastguard Worker int WaitForWrite(IOBuffer* buf, int buf_len, CompletionOnceCallback callback); 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker int GetLocalAddress(SockaddrStorage* address) const; 95*6777b538SAndroid Build Coastguard Worker int GetPeerAddress(SockaddrStorage* address) const; 96*6777b538SAndroid Build Coastguard Worker void SetPeerAddress(const SockaddrStorage& address); 97*6777b538SAndroid Build Coastguard Worker // Returns true if peer address has been set regardless of socket state. 98*6777b538SAndroid Build Coastguard Worker bool HasPeerAddress() const; 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard Worker void Close(); 101*6777b538SAndroid Build Coastguard Worker 102*6777b538SAndroid Build Coastguard Worker // Detachs from the current thread, to allow the socket to be transferred to 103*6777b538SAndroid Build Coastguard Worker // a new thread. Should only be called when the object is no longer used by 104*6777b538SAndroid Build Coastguard Worker // the old thread. 105*6777b538SAndroid Build Coastguard Worker void DetachFromThread(); 106*6777b538SAndroid Build Coastguard Worker socket_fd()107*6777b538SAndroid Build Coastguard Worker SocketDescriptor socket_fd() const { return socket_fd_; } 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker private: 110*6777b538SAndroid Build Coastguard Worker // base::MessagePumpForIO::FdWatcher methods. 111*6777b538SAndroid Build Coastguard Worker void OnFileCanReadWithoutBlocking(int fd) override; 112*6777b538SAndroid Build Coastguard Worker void OnFileCanWriteWithoutBlocking(int fd) override; 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker int DoAccept(std::unique_ptr<SocketPosix>* socket); 115*6777b538SAndroid Build Coastguard Worker void AcceptCompleted(); 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker int DoConnect(); 118*6777b538SAndroid Build Coastguard Worker void ConnectCompleted(); 119*6777b538SAndroid Build Coastguard Worker 120*6777b538SAndroid Build Coastguard Worker int DoRead(IOBuffer* buf, int buf_len); 121*6777b538SAndroid Build Coastguard Worker void RetryRead(int rv); 122*6777b538SAndroid Build Coastguard Worker void ReadCompleted(); 123*6777b538SAndroid Build Coastguard Worker 124*6777b538SAndroid Build Coastguard Worker int DoWrite(IOBuffer* buf, int buf_len); 125*6777b538SAndroid Build Coastguard Worker void WriteCompleted(); 126*6777b538SAndroid Build Coastguard Worker 127*6777b538SAndroid Build Coastguard Worker // |close_socket| indicates whether the socket should also be closed. 128*6777b538SAndroid Build Coastguard Worker void StopWatchingAndCleanUp(bool close_socket); 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Worker SocketDescriptor socket_fd_; 131*6777b538SAndroid Build Coastguard Worker 132*6777b538SAndroid Build Coastguard Worker base::MessagePumpForIO::FdWatchController accept_socket_watcher_; 133*6777b538SAndroid Build Coastguard Worker raw_ptr<std::unique_ptr<SocketPosix>> accept_socket_; 134*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback accept_callback_; 135*6777b538SAndroid Build Coastguard Worker 136*6777b538SAndroid Build Coastguard Worker base::MessagePumpForIO::FdWatchController read_socket_watcher_; 137*6777b538SAndroid Build Coastguard Worker 138*6777b538SAndroid Build Coastguard Worker // Non-null when a Read() is in progress. 139*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBuffer> read_buf_; 140*6777b538SAndroid Build Coastguard Worker int read_buf_len_ = 0; 141*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback read_callback_; 142*6777b538SAndroid Build Coastguard Worker 143*6777b538SAndroid Build Coastguard Worker // Non-null when a ReadIfReady() is in progress. 144*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback read_if_ready_callback_; 145*6777b538SAndroid Build Coastguard Worker 146*6777b538SAndroid Build Coastguard Worker base::MessagePumpForIO::FdWatchController write_socket_watcher_; 147*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBuffer> write_buf_; 148*6777b538SAndroid Build Coastguard Worker int write_buf_len_ = 0; 149*6777b538SAndroid Build Coastguard Worker // External callback; called when write or connect is complete. 150*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback write_callback_; 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard Worker // A connect operation is pending. In this case, |write_callback_| needs to be 153*6777b538SAndroid Build Coastguard Worker // called when connect is complete. 154*6777b538SAndroid Build Coastguard Worker bool waiting_connect_ = false; 155*6777b538SAndroid Build Coastguard Worker 156*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SockaddrStorage> peer_address_; 157*6777b538SAndroid Build Coastguard Worker 158*6777b538SAndroid Build Coastguard Worker base::ThreadChecker thread_checker_; 159*6777b538SAndroid Build Coastguard Worker }; 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Worker } // namespace net 162*6777b538SAndroid Build Coastguard Worker 163*6777b538SAndroid Build Coastguard Worker #endif // NET_SOCKET_SOCKET_POSIX_H_ 164