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