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 #ifdef NEWRB
88*76404edcSAsim Jamshed 	loff_t peek_offset[MOS_SIDE_BOTH];
89*76404edcSAsim Jamshed #else
90*76404edcSAsim Jamshed 	struct {
91*76404edcSAsim Jamshed 		uint32_t head_offset[MOS_SIDE_BOTH];
92*76404edcSAsim Jamshed 		uint8_t overlap[MOS_SIDE_BOTH];
93*76404edcSAsim Jamshed 	} monitor_read;
94*76404edcSAsim Jamshed #endif
95*76404edcSAsim Jamshed 
96*76404edcSAsim Jamshed 	struct mon_listener *monitor_listener;
97*76404edcSAsim Jamshed 
98*76404edcSAsim Jamshed #ifdef NEWEV
99*76404edcSAsim Jamshed 	stree_t *stree_dontcare;
100*76404edcSAsim Jamshed 	stree_t *stree_pre_rcv;
101*76404edcSAsim Jamshed 	stree_t *stree_post_snd;
102*76404edcSAsim Jamshed #else
103*76404edcSAsim Jamshed 	struct ev_pointer dontcare_evp;
104*76404edcSAsim Jamshed 	struct ev_pointer pre_tcp_evp;
105*76404edcSAsim Jamshed 	struct ev_pointer post_tcp_evp;
106*76404edcSAsim Jamshed #endif
107*76404edcSAsim Jamshed 
108*76404edcSAsim Jamshed 	uint8_t client_buf_mgmt: 2,
109*76404edcSAsim Jamshed 		server_buf_mgmt: 2,
110*76404edcSAsim Jamshed 		client_mon: 1,
111*76404edcSAsim Jamshed 		server_mon: 1;
112*76404edcSAsim Jamshed };
113*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
114*76404edcSAsim Jamshed struct socket_map
115*76404edcSAsim Jamshed {
116*76404edcSAsim Jamshed 	int id;
117*76404edcSAsim Jamshed 	int socktype;
118*76404edcSAsim Jamshed 	uint32_t opts;
119*76404edcSAsim Jamshed 	uint8_t forward;
120*76404edcSAsim Jamshed 
121*76404edcSAsim Jamshed 	struct sockaddr_in saddr;
122*76404edcSAsim Jamshed 
123*76404edcSAsim Jamshed 	union {
124*76404edcSAsim Jamshed 		struct tcp_stream *stream;
125*76404edcSAsim Jamshed 		struct tcp_listener *listener;
126*76404edcSAsim Jamshed 		struct mon_listener *monitor_listener;
127*76404edcSAsim Jamshed 		struct mon_stream *monitor_stream;
128*76404edcSAsim Jamshed 		struct mtcp_epoll *ep;
129*76404edcSAsim Jamshed 		struct pipe *pp;
130*76404edcSAsim Jamshed 	};
131*76404edcSAsim Jamshed 
132*76404edcSAsim Jamshed 	uint64_t epoll;			/* registered events */
133*76404edcSAsim Jamshed 	uint64_t events;		/* available events */
134*76404edcSAsim Jamshed 	mtcp_epoll_data_t ep_data;
135*76404edcSAsim Jamshed 
136*76404edcSAsim Jamshed 	TAILQ_ENTRY (socket_map) link;
137*76404edcSAsim Jamshed };
138*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
139*76404edcSAsim Jamshed socket_map_t
140*76404edcSAsim Jamshed AllocateSocket(mctx_t mctx, int socktype);
141*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
142*76404edcSAsim Jamshed void
143*76404edcSAsim Jamshed FreeSocket(mctx_t mctx, int sockid, int socktype);
144*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
145*76404edcSAsim Jamshed socket_map_t
146*76404edcSAsim Jamshed GetSocket(mctx_t mctx, int sockid);
147*76404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
148*76404edcSAsim Jamshed 
149*76404edcSAsim Jamshed #endif /* __SOCKET_H_ */
150