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