xref: /mOS-networking-stack/core/src/socket.c (revision 76404edc)
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