1*76404edcSAsim Jamshed #ifndef __SOCKET_H_
2*76404edcSAsim Jamshed #define __SOCKET_H_
3*76404edcSAsim Jamshed 
4*76404edcSAsim Jamshed #include <sys/queue.h>
5*76404edcSAsim Jamshed #include "tcp_stream_queue.h"
6*76404edcSAsim Jamshed #include "mtcp_epoll.h"
7*76404edcSAsim Jamshed #include "mos_api.h"
8*76404edcSAsim Jamshed #include "bpf/sfbpf.h"
9*76404edcSAsim Jamshed #include "bpf/sfbpf_dlt.h"
10*76404edcSAsim Jamshed #include "event_callback.h"
11*76404edcSAsim Jamshed #include "tcp_rb.h"
12*76404edcSAsim Jamshed #include "scalable_event.h"
13*76404edcSAsim Jamshed 
14*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
15*76404edcSAsim Jamshed #ifndef __SOCKET_MAP
16*76404edcSAsim Jamshed #define __SOCKET_MAP
17*76404edcSAsim Jamshed typedef struct socket_map * socket_map_t;
18*76404edcSAsim Jamshed #endif
19*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
20*76404edcSAsim Jamshed enum socket_opts
21*76404edcSAsim Jamshed {
22*76404edcSAsim Jamshed 	MTCP_NONBLOCK		= 0x01,
23*76404edcSAsim Jamshed 	MTCP_ADDR_BIND		= 0x02,
24*76404edcSAsim Jamshed };
25*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
26*76404edcSAsim Jamshed struct tcp_listener
27*76404edcSAsim Jamshed {
28*76404edcSAsim Jamshed 	int sockid;
29*76404edcSAsim Jamshed 	socket_map_t socket;
30*76404edcSAsim Jamshed 
31*76404edcSAsim Jamshed 	int backlog;
32*76404edcSAsim Jamshed 	stream_queue_t acceptq;
33*76404edcSAsim Jamshed 
34*76404edcSAsim Jamshed 	pthread_mutex_t accept_lock;
35*76404edcSAsim Jamshed 	pthread_cond_t accept_cond;
36*76404edcSAsim Jamshed };
37*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
38*76404edcSAsim Jamshed struct mon_listener
39*76404edcSAsim Jamshed {
40*76404edcSAsim Jamshed 	socket_map_t socket;
41*76404edcSAsim Jamshed 	void *uctx;
42*76404edcSAsim Jamshed 
43*76404edcSAsim Jamshed 	uint8_t ude_id;
44*76404edcSAsim Jamshed 	uint8_t client_buf_mgmt: 2,	/* controls different buf mgmt modes (client-side) */
45*76404edcSAsim Jamshed 		server_buf_mgmt: 2,	/* controls different buf mgmt modes (server-side) */
46*76404edcSAsim Jamshed 		client_mon: 1,		/* controls client-side monitoring */
47*76404edcSAsim Jamshed 		server_mon: 1,		/* controls server-side monitoring */
48*76404edcSAsim Jamshed 		is_stream_syn_filter_hit: 1;
49*76404edcSAsim Jamshed 
50*76404edcSAsim Jamshed 	//	struct sfbpf_program fcode;
51*76404edcSAsim Jamshed 
52*76404edcSAsim Jamshed 	union {
53*76404edcSAsim Jamshed 		/** For MOS_SOCK_MONITOR_RAW type socket **/
54*76404edcSAsim Jamshed 		struct sfbpf_program raw_pkt_fcode;
55*76404edcSAsim Jamshed 		/** For MOS_SOCK_MONITOR_STREAM type socket **/
56*76404edcSAsim Jamshed 		struct {
57*76404edcSAsim Jamshed 			struct sfbpf_program stream_syn_fcode;
58*76404edcSAsim Jamshed 			struct sfbpf_program stream_orphan_fcode;
59*76404edcSAsim Jamshed 		};
60*76404edcSAsim Jamshed 	};
61*76404edcSAsim Jamshed 
62*76404edcSAsim Jamshed 	struct event_queue *eq;
63*76404edcSAsim Jamshed 
64*76404edcSAsim Jamshed #ifdef NEWEV
65*76404edcSAsim Jamshed 	stree_t *stree_dontcare;
66*76404edcSAsim Jamshed 	stree_t *stree_pre_rcv;
67*76404edcSAsim Jamshed 	stree_t *stree_post_snd;
68*76404edcSAsim Jamshed #else
69*76404edcSAsim Jamshed 	struct ev_base dontcare_evb;
70*76404edcSAsim Jamshed 	struct ev_base pre_tcp_evb;
71*76404edcSAsim Jamshed 	struct ev_base post_tcp_evb;
72*76404edcSAsim Jamshed #endif
73*76404edcSAsim Jamshed 
74*76404edcSAsim Jamshed 	TAILQ_ENTRY(mon_listener) link;
75*76404edcSAsim Jamshed };
76*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
77*76404edcSAsim Jamshed struct mon_stream
78*76404edcSAsim Jamshed {
79*76404edcSAsim Jamshed 	socket_map_t socket;
80*76404edcSAsim Jamshed 	struct tcp_stream *stream;
81*76404edcSAsim Jamshed 	void *uctx;
82*76404edcSAsim Jamshed 
83*76404edcSAsim Jamshed 	/*
84*76404edcSAsim Jamshed 	 * offset that points to the monitoring stream offset.
85*76404edcSAsim Jamshed 	 * This variable will eventually be moved to socket.
86*76404edcSAsim Jamshed 	 */
87*76404edcSAsim Jamshed 	loff_t peek_offset[MOS_SIDE_BOTH];
88*76404edcSAsim Jamshed 	struct mon_listener *monitor_listener;
89*76404edcSAsim Jamshed 
90*76404edcSAsim Jamshed #ifdef NEWEV
91*76404edcSAsim Jamshed 	stree_t *stree_dontcare;
92*76404edcSAsim Jamshed 	stree_t *stree_pre_rcv;
93*76404edcSAsim Jamshed 	stree_t *stree_post_snd;
94*76404edcSAsim Jamshed #else
95*76404edcSAsim Jamshed 	struct ev_pointer dontcare_evp;
96*76404edcSAsim Jamshed 	struct ev_pointer pre_tcp_evp;
97*76404edcSAsim Jamshed 	struct ev_pointer post_tcp_evp;
98*76404edcSAsim Jamshed #endif
99*76404edcSAsim Jamshed 
100*76404edcSAsim Jamshed 	uint8_t client_buf_mgmt: 2,
101*76404edcSAsim Jamshed 		server_buf_mgmt: 2,
102*76404edcSAsim Jamshed 		client_mon: 1,
103*76404edcSAsim Jamshed 		server_mon: 1;
104*76404edcSAsim Jamshed };
105*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
106*76404edcSAsim Jamshed struct socket_map
107*76404edcSAsim Jamshed {
108*76404edcSAsim Jamshed 	int id;
109*76404edcSAsim Jamshed 	int socktype;
110*76404edcSAsim Jamshed 	uint32_t opts;
111*76404edcSAsim Jamshed 	uint8_t forward;
112*76404edcSAsim Jamshed 
113*76404edcSAsim Jamshed 	struct sockaddr_in saddr;
114*76404edcSAsim Jamshed 
115*76404edcSAsim Jamshed 	union {
116*76404edcSAsim Jamshed 		struct tcp_stream *stream;
117*76404edcSAsim Jamshed 		struct tcp_listener *listener;
118*76404edcSAsim Jamshed 		struct mon_listener *monitor_listener;
119*76404edcSAsim Jamshed 		struct mon_stream *monitor_stream;
120*76404edcSAsim Jamshed 		struct mtcp_epoll *ep;
121*76404edcSAsim Jamshed 		struct pipe *pp;
122*76404edcSAsim Jamshed 	};
123*76404edcSAsim Jamshed 
124*76404edcSAsim Jamshed 	uint64_t epoll;			/* registered events */
125*76404edcSAsim Jamshed 	uint64_t events;		/* available events */
126*76404edcSAsim Jamshed 	mtcp_epoll_data_t ep_data;
127*76404edcSAsim Jamshed 
128*76404edcSAsim Jamshed 	TAILQ_ENTRY (socket_map) link;
129*76404edcSAsim Jamshed };
130*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
131*76404edcSAsim Jamshed socket_map_t
132*76404edcSAsim Jamshed AllocateSocket(mctx_t mctx, int socktype);
133*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
134*76404edcSAsim Jamshed void
135*76404edcSAsim Jamshed FreeSocket(mctx_t mctx, int sockid, int socktype);
136*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
137*76404edcSAsim Jamshed socket_map_t
138*76404edcSAsim Jamshed GetSocket(mctx_t mctx, int sockid);
139*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
140*76404edcSAsim Jamshed 
141*76404edcSAsim Jamshed #endif /* __SOCKET_H_ */
142