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