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