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 #ifdef NEWRB 65 mstream->peek_offset[0] = mstream->peek_offset[1] = 0; 66 #else 67 memset(&mstream->monitor_read, 0, sizeof(mstream->monitor_read)); 68 #endif 69 } 70 /*---------------------------------------------------------------------------*/ 71 /** 72 * XXX - TODO: This is an ugly function.. I will improve it on 2nd iteration 73 */ 74 socket_map_t 75 AllocateSocket(mctx_t mctx, int socktype) 76 { 77 mtcp_manager_t mtcp = g_mtcp[mctx->cpu]; 78 socket_map_t socket = NULL; 79 80 switch (socktype) { 81 case MOS_SOCK_MONITOR_STREAM: 82 mtcp->num_msp++; 83 case MOS_SOCK_MONITOR_STREAM_ACTIVE: 84 case MOS_SOCK_MONITOR_RAW: 85 socket = TAILQ_FIRST(&mtcp->free_msmap); 86 if (!socket) 87 goto alloc_error; 88 TAILQ_REMOVE(&mtcp->free_msmap, socket, link); 89 /* if there is not invalidated events, insert the socket to the end */ 90 /* and find another socket in the free smap list */ 91 if (socket->events) { 92 TRACE_INFO("There are still not invalidate events remaining.\n"); 93 TRACE_DBG("There are still not invalidate events remaining.\n"); 94 TAILQ_INSERT_TAIL(&mtcp->free_msmap, socket, link); 95 socket = NULL; 96 goto alloc_error; 97 } 98 break; 99 100 default: 101 socket = TAILQ_FIRST(&mtcp->free_smap); 102 if (!socket) 103 goto alloc_error; 104 TAILQ_REMOVE(&mtcp->free_smap, socket, link); 105 /* if there is not invalidated events, insert the socket to the end */ 106 /* and find another socket in the free smap list */ 107 if (socket->events) { 108 TRACE_INFO("There are still not invalidate events remaining.\n"); 109 TRACE_DBG("There are still not invalidate events remaining.\n"); 110 TAILQ_INSERT_TAIL(&mtcp->free_smap, socket, link); 111 socket = NULL; 112 goto alloc_error; 113 } 114 socket->stream = NULL; 115 /* 116 * reset a few fields (needed for client socket) 117 * addr = INADDR_ANY, port = INPORT_ANY 118 */ 119 memset(&socket->saddr, 0, sizeof(struct sockaddr_in)); 120 memset(&socket->ep_data, 0, sizeof(mtcp_epoll_data_t)); 121 } 122 123 socket->socktype = socktype; 124 socket->opts = 0; 125 socket->epoll = 0; 126 socket->events = 0; 127 128 return socket; 129 130 alloc_error: 131 TRACE_ERROR("The concurrent sockets are at maximum.\n"); 132 return NULL; 133 } 134 /*---------------------------------------------------------------------------*/ 135 void 136 FreeSocket(mctx_t mctx, int sockid, int socktype) 137 { 138 mtcp_manager_t mtcp = g_mtcp[mctx->cpu]; 139 socket_map_t socket = NULL; 140 141 switch (socktype) { 142 case MOS_SOCK_UNUSED: 143 return; 144 case MOS_SOCK_MONITOR_STREAM_ACTIVE: 145 socket = &mtcp->msmap[sockid]; 146 FreeMonStream(mtcp, socket); 147 TAILQ_INSERT_TAIL(&mtcp->free_msmap, socket, link); 148 break; 149 case MOS_SOCK_MONITOR_STREAM: 150 mtcp->num_msp--; 151 case MOS_SOCK_MONITOR_RAW: 152 socket = &mtcp->msmap[sockid]; 153 FreeMonListener(mtcp, socket); 154 TAILQ_INSERT_TAIL(&mtcp->free_msmap, socket, link); 155 break; 156 default: /* MOS_SOCK_STREAM_* */ 157 socket = &mtcp->smap[sockid]; 158 TAILQ_INSERT_TAIL(&mtcp->free_smap, socket, link); 159 /* insert into free stream map */ 160 mtcp->smap[sockid].stream = NULL; 161 break; 162 } 163 164 socket->socktype = MOS_SOCK_UNUSED; 165 socket->epoll = MOS_EPOLLNONE; 166 } 167 /*---------------------------------------------------------------------------*/ 168 socket_map_t 169 GetSocket(mctx_t mctx, int sockid) 170 { 171 if (sockid < 0 || sockid >= g_config.mos->max_concurrency) { 172 errno = EBADF; 173 return NULL; 174 } 175 176 return &g_mtcp[mctx->cpu]->smap[sockid]; 177 } 178 /*---------------------------------------------------------------------------*/ 179