xref: /mOS-networking-stack/core/src/socket.c (revision 05e3289c)
176404edcSAsim Jamshed #include <string.h>
276404edcSAsim Jamshed 
376404edcSAsim Jamshed #include "mtcp.h"
476404edcSAsim Jamshed #include "socket.h"
576404edcSAsim Jamshed #include "debug.h"
676404edcSAsim Jamshed #include "eventpoll.h"
776404edcSAsim Jamshed #include "timer.h"
876404edcSAsim Jamshed #include "config.h"
976404edcSAsim Jamshed 
1076404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
1176404edcSAsim Jamshed void
FreeMonListener(mtcp_manager_t mtcp,socket_map_t socket)1276404edcSAsim Jamshed FreeMonListener(mtcp_manager_t mtcp, socket_map_t socket)
1376404edcSAsim Jamshed {
1476404edcSAsim Jamshed 	struct mon_listener *monitor = socket->monitor_listener;
1576404edcSAsim Jamshed 
1676404edcSAsim Jamshed #ifdef NEWEV
1776404edcSAsim Jamshed 	stree_dec_ref(mtcp->ev_store, monitor->stree_dontcare);
1876404edcSAsim Jamshed 	stree_dec_ref(mtcp->ev_store, monitor->stree_pre_rcv);
1976404edcSAsim Jamshed 	stree_dec_ref(mtcp->ev_store, monitor->stree_post_snd);
2076404edcSAsim Jamshed 
2176404edcSAsim Jamshed 	monitor->stree_dontcare = NULL;
2276404edcSAsim Jamshed 	monitor->stree_pre_rcv = NULL;
2376404edcSAsim Jamshed 	monitor->stree_post_snd = NULL;
2476404edcSAsim Jamshed #else
2576404edcSAsim Jamshed 	CleanupEvB(mtcp, &monitor->dontcare_evb);
2676404edcSAsim Jamshed 	CleanupEvB(mtcp, &monitor->pre_tcp_evb);
2776404edcSAsim Jamshed 	CleanupEvB(mtcp, &monitor->post_tcp_evb);
2876404edcSAsim Jamshed #endif
2976404edcSAsim Jamshed 
3076404edcSAsim Jamshed 	DestroyEventQueue(monitor->eq);
3176404edcSAsim Jamshed 
3276404edcSAsim Jamshed 	/* Clean up monitor filter */
3376404edcSAsim Jamshed 	if (ISSET_BPFFILTER(&monitor->stream_syn_fcode))
3476404edcSAsim Jamshed 		sfbpf_freecode(&monitor->stream_syn_fcode);
3576404edcSAsim Jamshed 	if (ISSET_BPFFILTER(&monitor->stream_orphan_fcode))
3676404edcSAsim Jamshed 		sfbpf_freecode(&monitor->stream_orphan_fcode);
3776404edcSAsim Jamshed 
3876404edcSAsim Jamshed 	memset(monitor, 0, sizeof(struct mon_listener));
3976404edcSAsim Jamshed }
4076404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
4176404edcSAsim Jamshed static inline void
FreeMonStream(mtcp_manager_t mtcp,socket_map_t socket)4276404edcSAsim Jamshed FreeMonStream(mtcp_manager_t mtcp, socket_map_t socket)
4376404edcSAsim Jamshed {
4476404edcSAsim Jamshed 	struct mon_stream *mstream = socket->monitor_stream;
4576404edcSAsim Jamshed 
4676404edcSAsim Jamshed #ifdef NEWEV
4776404edcSAsim Jamshed 	stree_dec_ref(mtcp->ev_store, mstream->stree_dontcare);
4876404edcSAsim Jamshed 	stree_dec_ref(mtcp->ev_store, mstream->stree_pre_rcv);
4976404edcSAsim Jamshed 	stree_dec_ref(mtcp->ev_store, mstream->stree_post_snd);
5076404edcSAsim Jamshed 
5176404edcSAsim Jamshed 	mstream->stree_dontcare = NULL;
5276404edcSAsim Jamshed 	mstream->stree_pre_rcv = NULL;
5376404edcSAsim Jamshed 	mstream->stree_post_snd = NULL;
5476404edcSAsim Jamshed #else
5576404edcSAsim Jamshed 	CleanupEvP(&mstream->dontcare_evp);
5676404edcSAsim Jamshed 	CleanupEvP(&mstream->pre_tcp_evp);
5776404edcSAsim Jamshed 	CleanupEvP(&mstream->post_tcp_evp);
5876404edcSAsim Jamshed #endif
5976404edcSAsim Jamshed 
6076404edcSAsim Jamshed 	mstream->socket = NULL;
6176404edcSAsim Jamshed 	mstream->stream = NULL;
6276404edcSAsim Jamshed 	mstream->uctx = NULL;
6376404edcSAsim Jamshed 
6476404edcSAsim Jamshed 	mstream->peek_offset[0] = mstream->peek_offset[1] = 0;
6576404edcSAsim Jamshed }
6676404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
6776404edcSAsim Jamshed /**
6876404edcSAsim Jamshed  * XXX - TODO: This is an ugly function.. I will improve it on 2nd iteration
6976404edcSAsim Jamshed  */
7076404edcSAsim Jamshed socket_map_t
AllocateSocket(mctx_t mctx,int socktype)7176404edcSAsim Jamshed AllocateSocket(mctx_t mctx, int socktype)
7276404edcSAsim Jamshed {
7376404edcSAsim Jamshed 	mtcp_manager_t mtcp = g_mtcp[mctx->cpu];
7476404edcSAsim Jamshed 	socket_map_t socket = NULL;
7576404edcSAsim Jamshed 
7676404edcSAsim Jamshed 	switch (socktype) {
7776404edcSAsim Jamshed 	case MOS_SOCK_MONITOR_STREAM:
7876404edcSAsim Jamshed 		mtcp->num_msp++;
7976404edcSAsim Jamshed 	case MOS_SOCK_MONITOR_STREAM_ACTIVE:
8076404edcSAsim Jamshed 	case MOS_SOCK_MONITOR_RAW:
8176404edcSAsim Jamshed 		socket = TAILQ_FIRST(&mtcp->free_msmap);
8276404edcSAsim Jamshed 		if (!socket)
8376404edcSAsim Jamshed 			goto alloc_error;
8476404edcSAsim Jamshed 		TAILQ_REMOVE(&mtcp->free_msmap, socket, link);
8576404edcSAsim Jamshed 		/* if there is not invalidated events, insert the socket to the end */
8676404edcSAsim Jamshed 		/* and find another socket in the free smap list */
8776404edcSAsim Jamshed 		if (socket->events) {
8876404edcSAsim Jamshed 			TRACE_INFO("There are still not invalidate events remaining.\n");
8976404edcSAsim Jamshed 			TRACE_DBG("There are still not invalidate events remaining.\n");
9076404edcSAsim Jamshed 			TAILQ_INSERT_TAIL(&mtcp->free_msmap, socket, link);
9176404edcSAsim Jamshed 			socket = NULL;
9276404edcSAsim Jamshed 			goto alloc_error;
9376404edcSAsim Jamshed 		}
9476404edcSAsim Jamshed 		break;
9576404edcSAsim Jamshed 
9676404edcSAsim Jamshed 	default:
97*05e3289cSYoungGyoun 		mtcp->num_esp++;
9876404edcSAsim Jamshed 		socket = TAILQ_FIRST(&mtcp->free_smap);
9976404edcSAsim Jamshed 		if (!socket)
10076404edcSAsim Jamshed 			goto alloc_error;
10176404edcSAsim Jamshed 		TAILQ_REMOVE(&mtcp->free_smap, socket, link);
10276404edcSAsim Jamshed 		/* if there is not invalidated events, insert the socket to the end */
10376404edcSAsim Jamshed 		/* and find another socket in the free smap list */
10476404edcSAsim Jamshed 		if (socket->events) {
10576404edcSAsim Jamshed 			TRACE_INFO("There are still not invalidate events remaining.\n");
10676404edcSAsim Jamshed 			TRACE_DBG("There are still not invalidate events remaining.\n");
10776404edcSAsim Jamshed 			TAILQ_INSERT_TAIL(&mtcp->free_smap, socket, link);
10876404edcSAsim Jamshed 			socket = NULL;
10976404edcSAsim Jamshed 			goto alloc_error;
11076404edcSAsim Jamshed 		}
11176404edcSAsim Jamshed 		socket->stream = NULL;
11276404edcSAsim Jamshed 		/*
11376404edcSAsim Jamshed 		 * reset a few fields (needed for client socket)
11476404edcSAsim Jamshed 		 * addr = INADDR_ANY, port = INPORT_ANY
11576404edcSAsim Jamshed 		 */
11676404edcSAsim Jamshed 		memset(&socket->saddr, 0, sizeof(struct sockaddr_in));
11776404edcSAsim Jamshed 		memset(&socket->ep_data, 0, sizeof(mtcp_epoll_data_t));
11876404edcSAsim Jamshed 	}
11976404edcSAsim Jamshed 
12076404edcSAsim Jamshed 	socket->socktype = socktype;
12176404edcSAsim Jamshed 	socket->opts = 0;
12276404edcSAsim Jamshed 	socket->epoll = 0;
12376404edcSAsim Jamshed 	socket->events = 0;
12476404edcSAsim Jamshed 
12576404edcSAsim Jamshed 	return socket;
12676404edcSAsim Jamshed 
12776404edcSAsim Jamshed  alloc_error:
12876404edcSAsim Jamshed 	TRACE_ERROR("The concurrent sockets are at maximum.\n");
12976404edcSAsim Jamshed 	return NULL;
13076404edcSAsim Jamshed }
13176404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
13276404edcSAsim Jamshed void
FreeSocket(mctx_t mctx,int sockid,int socktype)13376404edcSAsim Jamshed FreeSocket(mctx_t mctx, int sockid, int socktype)
13476404edcSAsim Jamshed {
13576404edcSAsim Jamshed 	mtcp_manager_t mtcp = g_mtcp[mctx->cpu];
13676404edcSAsim Jamshed 	socket_map_t socket = NULL;
13776404edcSAsim Jamshed 
13876404edcSAsim Jamshed 	switch (socktype) {
13976404edcSAsim Jamshed 	case MOS_SOCK_UNUSED:
14076404edcSAsim Jamshed 		return;
14176404edcSAsim Jamshed 	case MOS_SOCK_MONITOR_STREAM_ACTIVE:
14276404edcSAsim Jamshed 		socket = &mtcp->msmap[sockid];
14376404edcSAsim Jamshed 		FreeMonStream(mtcp, socket);
14476404edcSAsim Jamshed 		TAILQ_INSERT_TAIL(&mtcp->free_msmap, socket, link);
14576404edcSAsim Jamshed 		break;
14676404edcSAsim Jamshed 	case MOS_SOCK_MONITOR_STREAM:
14776404edcSAsim Jamshed 		mtcp->num_msp--;
14876404edcSAsim Jamshed 	case MOS_SOCK_MONITOR_RAW:
14976404edcSAsim Jamshed 		socket = &mtcp->msmap[sockid];
15076404edcSAsim Jamshed 		FreeMonListener(mtcp, socket);
15176404edcSAsim Jamshed 		TAILQ_INSERT_TAIL(&mtcp->free_msmap, socket, link);
15276404edcSAsim Jamshed 		break;
15376404edcSAsim Jamshed 	default: /* MOS_SOCK_STREAM_* */
154*05e3289cSYoungGyoun 		mtcp->num_esp--;
15576404edcSAsim Jamshed 		socket = &mtcp->smap[sockid];
15676404edcSAsim Jamshed 		TAILQ_INSERT_TAIL(&mtcp->free_smap, socket, link);
15776404edcSAsim Jamshed 		/* insert into free stream map */
15876404edcSAsim Jamshed 		mtcp->smap[sockid].stream = NULL;
15976404edcSAsim Jamshed 		break;
16076404edcSAsim Jamshed 	}
16176404edcSAsim Jamshed 
16276404edcSAsim Jamshed 	socket->socktype = MOS_SOCK_UNUSED;
16376404edcSAsim Jamshed 	socket->epoll = MOS_EPOLLNONE;
164a5e1a556SAsim Jamshed 	socket->events = 0;
16576404edcSAsim Jamshed }
16676404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
16776404edcSAsim Jamshed socket_map_t
GetSocket(mctx_t mctx,int sockid)16876404edcSAsim Jamshed GetSocket(mctx_t mctx, int sockid)
16976404edcSAsim Jamshed {
17076404edcSAsim Jamshed 	if (sockid < 0 || sockid >= g_config.mos->max_concurrency) {
17176404edcSAsim Jamshed 		errno = EBADF;
17276404edcSAsim Jamshed 		return NULL;
17376404edcSAsim Jamshed 	}
17476404edcSAsim Jamshed 
17576404edcSAsim Jamshed 	return &g_mtcp[mctx->cpu]->smap[sockid];
17676404edcSAsim Jamshed }
17776404edcSAsim Jamshed /*---------------------------------------------------------------------------*/
178