xref: /minix3/minix/include/minix/sockevent.h (revision 4c27a83389a10199451bd7e0199715b47b95045c)
1 #ifndef _MINIX_SOCKEVENT_H
2 #define _MINIX_SOCKEVENT_H
3 
4 #include <minix/sockdriver.h>
5 
6 /* Socket events. */
7 #define SEV_BIND	0x01	/* a pending bind operation has ended */
8 #define SEV_CONNECT	0x02	/* a pending connect operation has ended */
9 #define SEV_ACCEPT	0x04	/* pending accept operations may be resumed */
10 #define SEV_SEND	0x08	/* pending send operations may be resumed */
11 #define SEV_RECV	0x10	/* pending receive operations may be resumed */
12 #define SEV_CLOSE	0x20	/* a pending close operation has ended */
13 
14 /* Socket flags. */
15 #define SFL_SHUT_RD	0x01	/* socket has been shut down for reading */
16 #define SFL_SHUT_WR	0x02	/* socket has been shut down for writing */
17 #define SFL_CLOSING	0x04	/* socket close operation in progress */
18 #define SFL_CLONED	0x08	/* socket has been cloned but not accepted */
19 #define SFL_TIMER	0x10	/* socket is on list of timers */
20 
21 /*
22  * Special return value from sop_recv callback functions.  This pseudo-value
23  * is used to differentiate between zero-sized packets and actual EOF.
24  */
25 #define SOCKEVENT_EOF	1
26 
27 struct sockevent_ops;
28 struct sockevent_proc;
29 
30 /* Socket structure.  None of its fields must ever be accessed directly. */
31 struct sock {
32 	sockid_t sock_id;		/* socket identifier */
33 	unsigned char sock_events;	/* pending events (SEV_) */
34 	unsigned char sock_flags;	/* internal flags (SFL_) */
35 	unsigned char sock_domain;	/* domain, address family (PF_, AF_) */
36 	int sock_type;			/* type: stream, datagram.. (SOCK_) */
37 	int sock_err;			/* pending error code < 0, 0 if none */
38 	unsigned int sock_opt;		/* generic option flags (SO_) */
39 	clock_t sock_linger;		/* SO_LINGER value, in ticks or time */
40 	clock_t sock_stimeo;		/* SO_SNDTIMEO value, in clock ticks */
41 	clock_t sock_rtimeo;		/* SO_RCVTIMEO value, in clock ticks */
42 	size_t sock_slowat;		/* SO_SNDLOWAT value, in bytes */
43 	size_t sock_rlowat;		/* SO_RCVLOWAT value, in bytes */
44 	const struct sockevent_ops *sock_ops;	/* socket operations table */
45 	SIMPLEQ_ENTRY(sock) sock_next;		/* list for pending events */
46 	SLIST_ENTRY(sock) sock_hash;		/* list for hash table */
47 	SLIST_ENTRY(sock) sock_timer;		/* list of socks with timers */
48 	struct sockevent_proc *sock_proc;	/* list of suspended calls */
49 	struct sockdriver_select sock_select;	/* pending select query */
50 	unsigned int sock_selops;	/* pending select operations, or 0 */
51 };
52 
53 /* Socket operations table. */
54 struct sockevent_ops {
55 	int (* sop_pair)(struct sock * sock1, struct sock * sock2,
56 	    endpoint_t user_endpt);
57 	int (* sop_bind)(struct sock * sock, const struct sockaddr * addr,
58 	    socklen_t addr_len, endpoint_t user_endpt);
59 	int (* sop_connect)(struct sock * sock, const struct sockaddr * addr,
60 	    socklen_t addr_len, endpoint_t user_endpt);
61 	int (* sop_listen)(struct sock * sock, int backlog);
62 	sockid_t (* sop_accept)(struct sock * sock, struct sockaddr * addr,
63 	    socklen_t * addr_len, endpoint_t user_endpt,
64 	    struct sock ** newsockp);
65 	int (* sop_test_accept)(struct sock * sock);
66 	int (* sop_pre_send)(struct sock * sock, size_t len, socklen_t ctl_len,
67 	    const struct sockaddr * addr, socklen_t addr_len,
68 	    endpoint_t user_endpt, int flags);
69 	int (* sop_send)(struct sock * sock,
70 	    const struct sockdriver_data * data, size_t len, size_t * off,
71 	    const struct sockdriver_data * ctl, socklen_t ctl_len,
72 	    socklen_t * ctl_off, const struct sockaddr * addr,
73 	    socklen_t addr_len, endpoint_t user_endpt, int flags, size_t min);
74 	int (* sop_test_send)(struct sock * sock, size_t min);
75 	int (* sop_pre_recv)(struct sock * sock, endpoint_t user_endpt,
76 	    int flags);
77 	int (* sop_recv)(struct sock * sock,
78 	    const struct sockdriver_data * data, size_t len, size_t * off,
79 	    const struct sockdriver_data * ctl, socklen_t ctl_len,
80 	    socklen_t * ctl_off, struct sockaddr * addr, socklen_t * addr_len,
81 	    endpoint_t user_endpt, int flags, size_t min, int * rflags);
82 	int (* sop_test_recv)(struct sock * sock, size_t min, size_t * size);
83 	int (* sop_ioctl)(struct sock * sock, unsigned long request,
84 	    const struct sockdriver_data * data, endpoint_t user_endpt);
85 	void (* sop_setsockmask)(struct sock * sock, unsigned int mask);
86 	int (* sop_setsockopt)(struct sock * sock, int level, int name,
87 	    const struct sockdriver_data * data, socklen_t len);
88 	int (* sop_getsockopt)(struct sock * sock, int level, int name,
89 	    const struct sockdriver_data * data, socklen_t * len);
90 	int (* sop_getsockname)(struct sock * sock, struct sockaddr * addr,
91 	    socklen_t * addr_len);
92 	int (* sop_getpeername)(struct sock * sock, struct sockaddr * addr,
93 	    socklen_t * addr_len);
94 	int (* sop_shutdown)(struct sock * sock, unsigned int flags);
95 	int (* sop_close)(struct sock * sock, int force);
96 	void (* sop_free)(struct sock * sock);
97 };
98 
99 typedef sockid_t (* sockevent_socket_cb_t)(int domain, int type, int protocol,
100 	endpoint_t user_endpt, struct sock ** sock,
101 	const struct sockevent_ops ** ops);
102 
103 void sockevent_init(sockevent_socket_cb_t socket_cb);
104 void sockevent_process(const message * m_ptr, int ipc_status);
105 
106 void sockevent_clone(struct sock * sock, struct sock * newsock,
107 	sockid_t newid);
108 
109 void sockevent_raise(struct sock * sock, unsigned int mask);
110 void sockevent_set_error(struct sock * sock, int err);
111 void sockevent_set_shutdown(struct sock * sock, unsigned int flags);
112 
113 #define sockevent_get_domain(sock)	((int)((sock)->sock_domain))
114 #define sockevent_get_type(sock)	((sock)->sock_type)
115 #define sockevent_get_opt(sock)		((sock)->sock_opt)
116 #define sockevent_is_listening(sock)	(!!((sock)->sock_opt & SO_ACCEPTCONN))
117 #define sockevent_is_shutdown(sock, mask)	((sock)->sock_flags & (mask))
118 #define sockevent_is_closing(sock)	(!!((sock)->sock_flags & SFL_CLOSING))
119 
120 #endif /* !_MINIX_SOCKEVENT_H */
121