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