1*76404edcSAsim Jamshed #ifndef __MTCP_EPOLL_H_
2*76404edcSAsim Jamshed #define __MTCP_EPOLL_H_
3*76404edcSAsim Jamshed 
4*76404edcSAsim Jamshed #include "mtcp_api.h"
5*76404edcSAsim Jamshed 
6*76404edcSAsim Jamshed #ifdef __cplusplus
7*76404edcSAsim Jamshed extern "C" {
8*76404edcSAsim Jamshed #endif
9*76404edcSAsim Jamshed 
10*76404edcSAsim Jamshed /** `mtcp_epoll_ctl()` operations */
11*76404edcSAsim Jamshed enum mtcp_epoll_op
12*76404edcSAsim Jamshed {
13*76404edcSAsim Jamshed 	MOS_EPOLL_CTL_ADD = 1,
14*76404edcSAsim Jamshed 	MOS_EPOLL_CTL_DEL = 2,
15*76404edcSAsim Jamshed 	MOS_EPOLL_CTL_MOD = 3,
16*76404edcSAsim Jamshed };
17*76404edcSAsim Jamshed 
18*76404edcSAsim Jamshed /** Event types for mtcp epoll */
19*76404edcSAsim Jamshed enum epoll_event_type
20*76404edcSAsim Jamshed {
21*76404edcSAsim Jamshed 	/* mtcp-defined epoll events */
22*76404edcSAsim Jamshed 	MOS_EPOLLNONE		= (0x1<<0),
23*76404edcSAsim Jamshed 	MOS_EPOLLIN			= (0x1<<1),
24*76404edcSAsim Jamshed 	MOS_EPOLLPRI		= (0x1<<2),
25*76404edcSAsim Jamshed 	MOS_EPOLLOUT		= (0x1<<3),
26*76404edcSAsim Jamshed 	MOS_EPOLLRDNORM		= (0x1<<4),
27*76404edcSAsim Jamshed 	MOS_EPOLLRDBAND		= (0x1<<5),
28*76404edcSAsim Jamshed 	MOS_EPOLLWRNORM		= (0x1<<6),
29*76404edcSAsim Jamshed 	MOS_EPOLLWRBAND		= (0x1<<7),
30*76404edcSAsim Jamshed 	MOS_EPOLLMSG		= (0x1<<8),
31*76404edcSAsim Jamshed 	MOS_EPOLLERR		= (0x1<<9),
32*76404edcSAsim Jamshed 	MOS_EPOLLHUP		= (0x1<<10),
33*76404edcSAsim Jamshed 	MOS_EPOLLRDHUP 		= (0x1<<11),
34*76404edcSAsim Jamshed 
35*76404edcSAsim Jamshed 	/* mtcp-defined epoll events */
36*76404edcSAsim Jamshed 	MOS_EPOLLONESHOT	= (0x1 << 30),
37*76404edcSAsim Jamshed 	MOS_EPOLLET			= (0x1 << 31)
38*76404edcSAsim Jamshed };
39*76404edcSAsim Jamshed 
40*76404edcSAsim Jamshed /** Control messages from state update module to react module
41*76404edcSAsim Jamshed  * XXX: Is this only for internal use? */
42*76404edcSAsim Jamshed enum mtcp_action
43*76404edcSAsim Jamshed {
44*76404edcSAsim Jamshed 	/* mtcp action */
45*76404edcSAsim Jamshed 	MOS_ACT_SEND_DATA 	=	(0x01<<1),
46*76404edcSAsim Jamshed 	MOS_ACT_SEND_ACK_NOW 	=	(0x01<<2),
47*76404edcSAsim Jamshed 	MOS_ACT_SEND_ACK_AGG 	=	(0x01<<3),
48*76404edcSAsim Jamshed 	MOS_ACT_SEND_CONTROL 	=	(0x01<<4),
49*76404edcSAsim Jamshed 	MOS_ACT_SEND_RST	=	(0x01<<5),
50*76404edcSAsim Jamshed 	MOS_ACT_DESTROY	 	=	(0x01<<6),
51*76404edcSAsim Jamshed 	/* only used by monitoring socket */
52*76404edcSAsim Jamshed 	MOS_ACT_READ_DATA	=	(0x01<<7),
53*76404edcSAsim Jamshed 	MOS_ACT_CNT
54*76404edcSAsim Jamshed };
55*76404edcSAsim Jamshed 
56*76404edcSAsim Jamshed /** epoll data structure */
57*76404edcSAsim Jamshed typedef union mtcp_epoll_data
58*76404edcSAsim Jamshed {
59*76404edcSAsim Jamshed 	void *ptr;
60*76404edcSAsim Jamshed 	int sock;
61*76404edcSAsim Jamshed 	uint32_t u32;
62*76404edcSAsim Jamshed 	uint64_t u64;
63*76404edcSAsim Jamshed } mtcp_epoll_data_t;
64*76404edcSAsim Jamshed 
65*76404edcSAsim Jamshed /** epoll data structure */
66*76404edcSAsim Jamshed struct mtcp_epoll_event
67*76404edcSAsim Jamshed {
68*76404edcSAsim Jamshed 	uint64_t events;
69*76404edcSAsim Jamshed 	mtcp_epoll_data_t data;
70*76404edcSAsim Jamshed };
71*76404edcSAsim Jamshed 
72*76404edcSAsim Jamshed /** Create new epoll descriptor.
73*76404edcSAsim Jamshed  * @param [in] mctx: mtcp context
74*76404edcSAsim Jamshed  * @param [in] size: backlog size
75*76404edcSAsim Jamshed  * @return new epoll descriptor on success, -1 on error
76*76404edcSAsim Jamshed  *
77*76404edcSAsim Jamshed  * Same with `epoll_create()`
78*76404edcSAsim Jamshed  */
79*76404edcSAsim Jamshed int
80*76404edcSAsim Jamshed mtcp_epoll_create(mctx_t mctx, int size);
81*76404edcSAsim Jamshed 
82*76404edcSAsim Jamshed /** Control epoll.
83*76404edcSAsim Jamshed  * @param [in] mctx: mtcp context
84*76404edcSAsim Jamshed  * @param [in] epid: epoll descriptor
85*76404edcSAsim Jamshed  * @param [in] op: operation
86*76404edcSAsim Jamshed  *                 (MOS_EPOLL_CTL_ADD, MOS_EPOLL_CTL_DEL, MOS_EPOLL_CTL_MOD)
87*76404edcSAsim Jamshed  * @param [in] sock: socket ID
88*76404edcSAsim Jamshed  * @param [in] event: event to be controlled
89*76404edcSAsim Jamshed  * @return zero on success, -1 on error
90*76404edcSAsim Jamshed  *
91*76404edcSAsim Jamshed  * Same with `epoll_ctl()`
92*76404edcSAsim Jamshed  */
93*76404edcSAsim Jamshed int
94*76404edcSAsim Jamshed mtcp_epoll_ctl(mctx_t mctx, int epid,
95*76404edcSAsim Jamshed 		int op, int sock, struct mtcp_epoll_event *event);
96*76404edcSAsim Jamshed 
97*76404edcSAsim Jamshed /** Wait for events.
98*76404edcSAsim Jamshed  * @param [in] mctx: mtcp context
99*76404edcSAsim Jamshed  * @param [in] epid: epoll descriptor
100*76404edcSAsim Jamshed  * @param [in] events: occured events
101*76404edcSAsim Jamshed  * @param [in] maxevents: maximum number of events to read
102*76404edcSAsim Jamshed  * @param [in] timeout: timeout
103*76404edcSAsim Jamshed  * @return number of events occured, -1 on error
104*76404edcSAsim Jamshed  *
105*76404edcSAsim Jamshed  * Same with `epoll_wait()`
106*76404edcSAsim Jamshed  */
107*76404edcSAsim Jamshed int
108*76404edcSAsim Jamshed mtcp_epoll_wait(mctx_t mctx, int epid,
109*76404edcSAsim Jamshed 		struct mtcp_epoll_event *events, int maxevents, int timeout);
110*76404edcSAsim Jamshed 
111*76404edcSAsim Jamshed /** Convert built-in event ID to string
112*76404edcSAsim Jamshed  * @param [in] event: built-in event ID
113*76404edcSAsim Jamshed  * @return string of the event name
114*76404edcSAsim Jamshed  */
115*76404edcSAsim Jamshed char *
116*76404edcSAsim Jamshed EventToString(uint32_t event);
117*76404edcSAsim Jamshed 
118*76404edcSAsim Jamshed #ifdef __cplusplus
119*76404edcSAsim Jamshed };
120*76404edcSAsim Jamshed #endif
121*76404edcSAsim Jamshed 
122*76404edcSAsim Jamshed #endif /* __MTCP_EPOLL_H_ */
123