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
FreeMonListener(mtcp_manager_t mtcp,socket_map_t socket)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
FreeMonStream(mtcp_manager_t mtcp,socket_map_t socket)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
AllocateSocket(mctx_t mctx,int socktype)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
FreeSocket(mctx_t mctx,int sockid,int socktype)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
GetSocket(mctx_t mctx,int sockid)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