xref: /haiku/src/add-ons/kernel/network/protocols/unix/UnixEndpoint.h (revision e1c4049fed1047bdb957b0529e1921e97ef94770)
1 /*
2  * Copyright 2023, Trung Nguyen, trungnt282910@gmail.com.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef UNIX_ENDPOINT_H
6 #define UNIX_ENDPOINT_H
7 
8 
9 #include <net_protocol.h>
10 #include <net_socket.h>
11 #include <ProtocolUtilities.h>
12 
13 #include <lock.h>
14 #include <vfs.h>
15 
16 #include "UnixAddress.h"
17 
18 
19 class UnixEndpoint : public net_protocol, public ProtocolSocket {
20 public:
21 	virtual						~UnixEndpoint();
22 
23 	bool Lock()
24 	{
25 		return mutex_lock(&fLock) == B_OK;
26 	}
27 
28 	void Unlock()
29 	{
30 		mutex_unlock(&fLock);
31 	}
32 
33 	const UnixAddress& Address() const
34 	{
35 		return fAddress;
36 	}
37 
38 	UnixEndpoint*& HashTableLink()
39 	{
40 		return fAddressHashLink;
41 	}
42 
43 	virtual	status_t			Init() = 0;
44 	virtual	void				Uninit() = 0;
45 
46 	virtual	status_t			Open() = 0;
47 	virtual	status_t			Close() = 0;
48 	virtual	status_t			Free() = 0;
49 
50 	virtual	status_t			Bind(const struct sockaddr* _address) = 0;
51 	virtual	status_t			Unbind() = 0;
52 	virtual	status_t			Listen(int backlog) = 0;
53 	virtual	status_t			Connect(const struct sockaddr* address) = 0;
54 	virtual	status_t			Accept(net_socket** _acceptedSocket) = 0;
55 
56 	virtual	ssize_t				Send(const iovec* vecs, size_t vecCount,
57 									ancillary_data_container* ancillaryData,
58 									const struct sockaddr* address,
59 									socklen_t addressLength, int flags) = 0;
60 	virtual	ssize_t				Receive(const iovec* vecs, size_t vecCount,
61 									ancillary_data_container** _ancillaryData,
62 									struct sockaddr* _address, socklen_t* _addressLength,
63 									int flags) = 0;
64 
65 	virtual	ssize_t				Sendable() = 0;
66 	virtual	ssize_t				Receivable() = 0;
67 
68 	virtual	status_t			SetReceiveBufferSize(size_t size) = 0;
69 	virtual	status_t			GetPeerCredentials(ucred* credentials) = 0;
70 
71 	virtual	status_t			Shutdown(int direction) = 0;
72 
73 	static	status_t			Create(net_socket* socket, UnixEndpoint** _endpoint);
74 
75 protected:
76 								UnixEndpoint(net_socket* socket);
77 
78 	// These functions perform no locking or checking on the endpoint.
79 			status_t			_Bind(const struct sockaddr_un* address);
80 			status_t			_Unbind();
81 
82 private:
83 			status_t			_Bind(struct vnode* vnode);
84 			status_t			_Bind(int32 internalID);
85 
86 protected:
87 			UnixAddress			fAddress;
88 
89 private:
90 			mutex				fLock;
91 			UnixEndpoint*		fAddressHashLink;
92 };
93 
94 
95 static inline bigtime_t
96 absolute_timeout(bigtime_t timeout)
97 {
98 	if (timeout == 0 || timeout == B_INFINITE_TIMEOUT)
99 		return timeout;
100 
101 // TODO: Make overflow safe!
102 	return timeout + system_time();
103 }
104 
105 
106 #endif	// UNIX_ENDPOINT_H
107