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