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