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 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 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 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: 9776404edcSAsim Jamshed socket = TAILQ_FIRST(&mtcp->free_smap); 9876404edcSAsim Jamshed if (!socket) 9976404edcSAsim Jamshed goto alloc_error; 10076404edcSAsim Jamshed TAILQ_REMOVE(&mtcp->free_smap, socket, link); 10176404edcSAsim Jamshed /* if there is not invalidated events, insert the socket to the end */ 10276404edcSAsim Jamshed /* and find another socket in the free smap list */ 10376404edcSAsim Jamshed if (socket->events) { 10476404edcSAsim Jamshed TRACE_INFO("There are still not invalidate events remaining.\n"); 10576404edcSAsim Jamshed TRACE_DBG("There are still not invalidate events remaining.\n"); 10676404edcSAsim Jamshed TAILQ_INSERT_TAIL(&mtcp->free_smap, socket, link); 10776404edcSAsim Jamshed socket = NULL; 10876404edcSAsim Jamshed goto alloc_error; 10976404edcSAsim Jamshed } 11076404edcSAsim Jamshed socket->stream = NULL; 11176404edcSAsim Jamshed /* 11276404edcSAsim Jamshed * reset a few fields (needed for client socket) 11376404edcSAsim Jamshed * addr = INADDR_ANY, port = INPORT_ANY 11476404edcSAsim Jamshed */ 11576404edcSAsim Jamshed memset(&socket->saddr, 0, sizeof(struct sockaddr_in)); 11676404edcSAsim Jamshed memset(&socket->ep_data, 0, sizeof(mtcp_epoll_data_t)); 11776404edcSAsim Jamshed } 11876404edcSAsim Jamshed 11976404edcSAsim Jamshed socket->socktype = socktype; 12076404edcSAsim Jamshed socket->opts = 0; 12176404edcSAsim Jamshed socket->epoll = 0; 12276404edcSAsim Jamshed socket->events = 0; 12376404edcSAsim Jamshed 12476404edcSAsim Jamshed return socket; 12576404edcSAsim Jamshed 12676404edcSAsim Jamshed alloc_error: 12776404edcSAsim Jamshed TRACE_ERROR("The concurrent sockets are at maximum.\n"); 12876404edcSAsim Jamshed return NULL; 12976404edcSAsim Jamshed } 13076404edcSAsim Jamshed /*---------------------------------------------------------------------------*/ 13176404edcSAsim Jamshed void 13276404edcSAsim Jamshed FreeSocket(mctx_t mctx, int sockid, int socktype) 13376404edcSAsim Jamshed { 13476404edcSAsim Jamshed mtcp_manager_t mtcp = g_mtcp[mctx->cpu]; 13576404edcSAsim Jamshed socket_map_t socket = NULL; 13676404edcSAsim Jamshed 13776404edcSAsim Jamshed switch (socktype) { 13876404edcSAsim Jamshed case MOS_SOCK_UNUSED: 13976404edcSAsim Jamshed return; 14076404edcSAsim Jamshed case MOS_SOCK_MONITOR_STREAM_ACTIVE: 14176404edcSAsim Jamshed socket = &mtcp->msmap[sockid]; 14276404edcSAsim Jamshed FreeMonStream(mtcp, socket); 14376404edcSAsim Jamshed TAILQ_INSERT_TAIL(&mtcp->free_msmap, socket, link); 14476404edcSAsim Jamshed break; 14576404edcSAsim Jamshed case MOS_SOCK_MONITOR_STREAM: 14676404edcSAsim Jamshed mtcp->num_msp--; 14776404edcSAsim Jamshed case MOS_SOCK_MONITOR_RAW: 14876404edcSAsim Jamshed socket = &mtcp->msmap[sockid]; 14976404edcSAsim Jamshed FreeMonListener(mtcp, socket); 15076404edcSAsim Jamshed TAILQ_INSERT_TAIL(&mtcp->free_msmap, socket, link); 15176404edcSAsim Jamshed break; 15276404edcSAsim Jamshed default: /* MOS_SOCK_STREAM_* */ 15376404edcSAsim Jamshed socket = &mtcp->smap[sockid]; 15476404edcSAsim Jamshed TAILQ_INSERT_TAIL(&mtcp->free_smap, socket, link); 15576404edcSAsim Jamshed /* insert into free stream map */ 15676404edcSAsim Jamshed mtcp->smap[sockid].stream = NULL; 15776404edcSAsim Jamshed break; 15876404edcSAsim Jamshed } 15976404edcSAsim Jamshed 16076404edcSAsim Jamshed socket->socktype = MOS_SOCK_UNUSED; 16176404edcSAsim Jamshed socket->epoll = MOS_EPOLLNONE; 162*a5e1a556SAsim Jamshed socket->events = 0; 16376404edcSAsim Jamshed } 16476404edcSAsim Jamshed /*---------------------------------------------------------------------------*/ 16576404edcSAsim Jamshed socket_map_t 16676404edcSAsim Jamshed GetSocket(mctx_t mctx, int sockid) 16776404edcSAsim Jamshed { 16876404edcSAsim Jamshed if (sockid < 0 || sockid >= g_config.mos->max_concurrency) { 16976404edcSAsim Jamshed errno = EBADF; 17076404edcSAsim Jamshed return NULL; 17176404edcSAsim Jamshed } 17276404edcSAsim Jamshed 17376404edcSAsim Jamshed return &g_mtcp[mctx->cpu]->smap[sockid]; 17476404edcSAsim Jamshed } 17576404edcSAsim Jamshed /*---------------------------------------------------------------------------*/ 176