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