1 #ifndef __EVENT_CALLBACK_H_ 2 #define __EVENT_CALLBACK_H_ 3 4 #ifndef NEWEV 5 6 #include <stdint.h> 7 #include <sys/queue.h> 8 #include "mos_api.h" 9 /*----------------------------------------------------------------------------*/ 10 typedef struct socket_map * socket_map_t; 11 12 /* configuration */ 13 #define NUM_EV_TABLE 100 14 15 /* event representation 16 * identification (ID): type: event_t (uint64_t), range: 0x1, 0x2, 0x4, ... 17 * index (IDX): type: int8_t, range: 0 ~ 63 */ 18 19 /** maximum number of event (== 64) */ 20 #define MAX_EV (8 * sizeof(event_t)) 21 #define BEV_OFFSET 0 22 #define UDE_OFFSET 32 23 #define NUM_BEV 12 24 25 struct ev_table { 26 struct { 27 callback_t cb; /**< callback function pointer */ 28 int ref; /**< number of flows which are referring this `cb` */ 29 } ent[MAX_EV]; /**< table entry */ 30 31 event_t map; /**< A bit is 1 if the corresponding `ent` is occupied 32 by any flow. This is to speed up callback registration. */ 33 34 TAILQ_ENTRY(ev_table) link; /**< TAILQ link */ 35 }; 36 37 struct ev_pointer { 38 uint64_t cb_map; /**< map of registered callback */ 39 uint64_t ft_map; /**< map of registered fltrs. Automatically updated by 40 `mtcp_register_callback()` or 41 `mtcp_unregister_callback()` */ 42 43 struct ev_table *evt; /**< pointer to `struct ev_table` in 44 `struct ev_base` */ 45 }; 46 47 struct ev_base { 48 /** Default event pointer. 49 * This will be copied to every new monitor stream socket. 50 * dflt_evp.evt always points default event table. */ 51 struct ev_pointer dflt_evp; 52 /** List of event tables. 53 * TAILQ_FIRST(`evth`) will return current default event table. */ 54 TAILQ_HEAD(, ev_table) evth; 55 }; 56 /*----------------------------------------------------------------------------*/ 57 /* Event's global initialization (only one CPU core should run this) */ 58 void 59 GlobInitEvent(void); 60 61 void 62 InitEvent(mtcp_manager_t mtcp, int num_evt); 63 64 void 65 InitEvP(struct ev_pointer *evp, struct ev_base *evb); 66 67 void 68 CleanupEvP(struct ev_pointer *evp); 69 70 void 71 InitEvB(mtcp_manager_t mtcp, struct ev_base *evb); 72 73 void 74 CleanupEvB(mtcp_manager_t mtcp, struct ev_base *evb); 75 76 extern inline void 77 HandleCallback(mtcp_manager_t mtcp, uint32_t hook, 78 socket_map_t socket, int side, struct pkt_ctx *pctx, event_t events); 79 80 #endif 81 82 #endif /* __EVENT_CALLBACK_H_ */ 83