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