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