xref: /mOS-networking-stack/core/src/socket.c (revision 76404edc)
1*76404edcSAsim Jamshed #include <string.h>
2*76404edcSAsim Jamshed 
3*76404edcSAsim Jamshed #include "mtcp.h"
4*76404edcSAsim Jamshed #include "socket.h"
5*76404edcSAsim Jamshed #include "debug.h"
6*76404edcSAsim Jamshed #include "eventpoll.h"
7*76404edcSAsim Jamshed #include "timer.h"
8*76404edcSAsim Jamshed #include "config.h"
9*76404edcSAsim Jamshed 
10*76404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
11*76404edcSAsim Jamshed void
12*76404edcSAsim Jamshed FreeMonListener(mtcp_manager_t mtcp, socket_map_t socket)
13*76404edcSAsim Jamshed {
14*76404edcSAsim Jamshed 	struct mon_listener *monitor = socket->monitor_listener;
15*76404edcSAsim Jamshed 
16*76404edcSAsim Jamshed #ifdef NEWEV
17*76404edcSAsim Jamshed 	stree_dec_ref(mtcp->ev_store, monitor->stree_dontcare);
18*76404edcSAsim Jamshed 	stree_dec_ref(mtcp->ev_store, monitor->stree_pre_rcv);
19*76404edcSAsim Jamshed 	stree_dec_ref(mtcp->ev_store, monitor->stree_post_snd);
20*76404edcSAsim Jamshed 
21*76404edcSAsim Jamshed 	monitor->stree_dontcare = NULL;
22*76404edcSAsim Jamshed 	monitor->stree_pre_rcv = NULL;
23*76404edcSAsim Jamshed 	monitor->stree_post_snd = NULL;
24*76404edcSAsim Jamshed #else
25*76404edcSAsim Jamshed 	CleanupEvB(mtcp, &monitor->dontcare_evb);
26*76404edcSAsim Jamshed 	CleanupEvB(mtcp, &monitor->pre_tcp_evb);
27*76404edcSAsim Jamshed 	CleanupEvB(mtcp, &monitor->post_tcp_evb);
28*76404edcSAsim Jamshed #endif
29*76404edcSAsim Jamshed 
30*76404edcSAsim Jamshed 	DestroyEventQueue(monitor->eq);
31*76404edcSAsim Jamshed 
32*76404edcSAsim Jamshed 	/* Clean up monitor filter */
33*76404edcSAsim Jamshed 	if (ISSET_BPFFILTER(&monitor->stream_syn_fcode))
34*76404edcSAsim Jamshed 		sfbpf_freecode(&monitor->stream_syn_fcode);
35*76404edcSAsim Jamshed 	if (ISSET_BPFFILTER(&monitor->stream_orphan_fcode))
36*76404edcSAsim Jamshed 		sfbpf_freecode(&monitor->stream_orphan_fcode);
37*76404edcSAsim Jamshed 
38*76404edcSAsim Jamshed 	memset(monitor, 0, sizeof(struct mon_listener));
39*76404edcSAsim Jamshed }
40*76404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
41*76404edcSAsim Jamshed static inline void
42*76404edcSAsim Jamshed FreeMonStream(mtcp_manager_t mtcp, socket_map_t socket)
43*76404edcSAsim Jamshed {
44*76404edcSAsim Jamshed 	struct mon_stream *mstream = socket->monitor_stream;
45*76404edcSAsim Jamshed 
46*76404edcSAsim Jamshed #ifdef NEWEV
47*76404edcSAsim Jamshed 	stree_dec_ref(mtcp->ev_store, mstream->stree_dontcare);
48*76404edcSAsim Jamshed 	stree_dec_ref(mtcp->ev_store, mstream->stree_pre_rcv);
49*76404edcSAsim Jamshed 	stree_dec_ref(mtcp->ev_store, mstream->stree_post_snd);
50*76404edcSAsim Jamshed 
51*76404edcSAsim Jamshed 	mstream->stree_dontcare = NULL;
52*76404edcSAsim Jamshed 	mstream->stree_pre_rcv = NULL;
53*76404edcSAsim Jamshed 	mstream->stree_post_snd = NULL;
54*76404edcSAsim Jamshed #else
55*76404edcSAsim Jamshed 	CleanupEvP(&mstream->dontcare_evp);
56*76404edcSAsim Jamshed 	CleanupEvP(&mstream->pre_tcp_evp);
57*76404edcSAsim Jamshed 	CleanupEvP(&mstream->post_tcp_evp);
58*76404edcSAsim Jamshed #endif
59*76404edcSAsim Jamshed 
60*76404edcSAsim Jamshed 	mstream->socket = NULL;
61*76404edcSAsim Jamshed 	mstream->stream = NULL;
62*76404edcSAsim Jamshed 	mstream->uctx = NULL;
63*76404edcSAsim Jamshed 
64*76404edcSAsim Jamshed #ifdef NEWRB
65*76404edcSAsim Jamshed 	mstream->peek_offset[0] = mstream->peek_offset[1] = 0;
66*76404edcSAsim Jamshed #else
67*76404edcSAsim Jamshed 	memset(&mstream->monitor_read, 0, sizeof(mstream->monitor_read));
68*76404edcSAsim Jamshed #endif
69*76404edcSAsim Jamshed }
70*76404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
71*76404edcSAsim Jamshed /**
72*76404edcSAsim Jamshed  * XXX - TODO: This is an ugly function.. I will improve it on 2nd iteration
73*76404edcSAsim Jamshed  */
74*76404edcSAsim Jamshed socket_map_t
75*76404edcSAsim Jamshed AllocateSocket(mctx_t mctx, int socktype)
76*76404edcSAsim Jamshed {
77*76404edcSAsim Jamshed 	mtcp_manager_t mtcp = g_mtcp[mctx->cpu];
78*76404edcSAsim Jamshed 	socket_map_t socket = NULL;
79*76404edcSAsim Jamshed 
80*76404edcSAsim Jamshed 	switch (socktype) {
81*76404edcSAsim Jamshed 	case MOS_SOCK_MONITOR_STREAM:
82*76404edcSAsim Jamshed 		mtcp->num_msp++;
83*76404edcSAsim Jamshed 	case MOS_SOCK_MONITOR_STREAM_ACTIVE:
84*76404edcSAsim Jamshed 	case MOS_SOCK_MONITOR_RAW:
85*76404edcSAsim Jamshed 		socket = TAILQ_FIRST(&mtcp->free_msmap);
86*76404edcSAsim Jamshed 		if (!socket)
87*76404edcSAsim Jamshed 			goto alloc_error;
88*76404edcSAsim Jamshed 		TAILQ_REMOVE(&mtcp->free_msmap, socket, link);
89*76404edcSAsim Jamshed 		/* if there is not invalidated events, insert the socket to the end */
90*76404edcSAsim Jamshed 		/* and find another socket in the free smap list */
91*76404edcSAsim Jamshed 		if (socket->events) {
92*76404edcSAsim Jamshed 			TRACE_INFO("There are still not invalidate events remaining.\n");
93*76404edcSAsim Jamshed 			TRACE_DBG("There are still not invalidate events remaining.\n");
94*76404edcSAsim Jamshed 			TAILQ_INSERT_TAIL(&mtcp->free_msmap, socket, link);
95*76404edcSAsim Jamshed 			socket = NULL;
96*76404edcSAsim Jamshed 			goto alloc_error;
97*76404edcSAsim Jamshed 		}
98*76404edcSAsim Jamshed 		break;
99*76404edcSAsim Jamshed 
100*76404edcSAsim Jamshed 	default:
101*76404edcSAsim Jamshed 		socket = TAILQ_FIRST(&mtcp->free_smap);
102*76404edcSAsim Jamshed 		if (!socket)
103*76404edcSAsim Jamshed 			goto alloc_error;
104*76404edcSAsim Jamshed 		TAILQ_REMOVE(&mtcp->free_smap, socket, link);
105*76404edcSAsim Jamshed 		/* if there is not invalidated events, insert the socket to the end */
106*76404edcSAsim Jamshed 		/* and find another socket in the free smap list */
107*76404edcSAsim Jamshed 		if (socket->events) {
108*76404edcSAsim Jamshed 			TRACE_INFO("There are still not invalidate events remaining.\n");
109*76404edcSAsim Jamshed 			TRACE_DBG("There are still not invalidate events remaining.\n");
110*76404edcSAsim Jamshed 			TAILQ_INSERT_TAIL(&mtcp->free_smap, socket, link);
111*76404edcSAsim Jamshed 			socket = NULL;
112*76404edcSAsim Jamshed 			goto alloc_error;
113*76404edcSAsim Jamshed 		}
114*76404edcSAsim Jamshed 		socket->stream = NULL;
115*76404edcSAsim Jamshed 		/*
116*76404edcSAsim Jamshed 		 * reset a few fields (needed for client socket)
117*76404edcSAsim Jamshed 		 * addr = INADDR_ANY, port = INPORT_ANY
118*76404edcSAsim Jamshed 		 */
119*76404edcSAsim Jamshed 		memset(&socket->saddr, 0, sizeof(struct sockaddr_in));
120*76404edcSAsim Jamshed 		memset(&socket->ep_data, 0, sizeof(mtcp_epoll_data_t));
121*76404edcSAsim Jamshed 	}
122*76404edcSAsim Jamshed 
123*76404edcSAsim Jamshed 	socket->socktype = socktype;
124*76404edcSAsim Jamshed 	socket->opts = 0;
125*76404edcSAsim Jamshed 	socket->epoll = 0;
126*76404edcSAsim Jamshed 	socket->events = 0;
127*76404edcSAsim Jamshed 
128*76404edcSAsim Jamshed 	return socket;
129*76404edcSAsim Jamshed 
130*76404edcSAsim Jamshed  alloc_error:
131*76404edcSAsim Jamshed 	TRACE_ERROR("The concurrent sockets are at maximum.\n");
132*76404edcSAsim Jamshed 	return NULL;
133*76404edcSAsim Jamshed }
134*76404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
135*76404edcSAsim Jamshed void
136*76404edcSAsim Jamshed FreeSocket(mctx_t mctx, int sockid, int socktype)
137*76404edcSAsim Jamshed {
138*76404edcSAsim Jamshed 	mtcp_manager_t mtcp = g_mtcp[mctx->cpu];
139*76404edcSAsim Jamshed 	socket_map_t socket = NULL;
140*76404edcSAsim Jamshed 
141*76404edcSAsim Jamshed 	switch (socktype) {
142*76404edcSAsim Jamshed 	case MOS_SOCK_UNUSED:
143*76404edcSAsim Jamshed 		return;
144*76404edcSAsim Jamshed 	case MOS_SOCK_MONITOR_STREAM_ACTIVE:
145*76404edcSAsim Jamshed 		socket = &mtcp->msmap[sockid];
146*76404edcSAsim Jamshed 		FreeMonStream(mtcp, socket);
147*76404edcSAsim Jamshed 		TAILQ_INSERT_TAIL(&mtcp->free_msmap, socket, link);
148*76404edcSAsim Jamshed 		break;
149*76404edcSAsim Jamshed 	case MOS_SOCK_MONITOR_STREAM:
150*76404edcSAsim Jamshed 		mtcp->num_msp--;
151*76404edcSAsim Jamshed 	case MOS_SOCK_MONITOR_RAW:
152*76404edcSAsim Jamshed 		socket = &mtcp->msmap[sockid];
153*76404edcSAsim Jamshed 		FreeMonListener(mtcp, socket);
154*76404edcSAsim Jamshed 		TAILQ_INSERT_TAIL(&mtcp->free_msmap, socket, link);
155*76404edcSAsim Jamshed 		break;
156*76404edcSAsim Jamshed 	default: /* MOS_SOCK_STREAM_* */
157*76404edcSAsim Jamshed 		socket = &mtcp->smap[sockid];
158*76404edcSAsim Jamshed 		TAILQ_INSERT_TAIL(&mtcp->free_smap, socket, link);
159*76404edcSAsim Jamshed 		/* insert into free stream map */
160*76404edcSAsim Jamshed 		mtcp->smap[sockid].stream = NULL;
161*76404edcSAsim Jamshed 		break;
162*76404edcSAsim Jamshed 	}
163*76404edcSAsim Jamshed 
164*76404edcSAsim Jamshed 	socket->socktype = MOS_SOCK_UNUSED;
165*76404edcSAsim Jamshed 	socket->epoll = MOS_EPOLLNONE;
166*76404edcSAsim Jamshed }
167*76404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
168*76404edcSAsim Jamshed socket_map_t
169*76404edcSAsim Jamshed GetSocket(mctx_t mctx, int sockid)
170*76404edcSAsim Jamshed {
171*76404edcSAsim Jamshed 	if (sockid < 0 || sockid >= g_config.mos->max_concurrency) {
172*76404edcSAsim Jamshed 		errno = EBADF;
173*76404edcSAsim Jamshed 		return NULL;
174*76404edcSAsim Jamshed 	}
175*76404edcSAsim Jamshed 
176*76404edcSAsim Jamshed 	return &g_mtcp[mctx->cpu]->smap[sockid];
177*76404edcSAsim Jamshed }
178*76404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
179