xref: /nrf52832-nimble/rt-thread/examples/test/net_test.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Net Test Utilities for RT-Thread
3*10465441SEvalZero  */
4*10465441SEvalZero #include <rtthread.h>
5*10465441SEvalZero #include <finsh.h>
6*10465441SEvalZero #include <lwip/api.h>
7*10465441SEvalZero #include <lwip/sockets.h>
8*10465441SEvalZero #include <lwip/init.h>
9*10465441SEvalZero 
10*10465441SEvalZero /*
11*10465441SEvalZero  * UDP echo server
12*10465441SEvalZero  */
13*10465441SEvalZero #define UDP_ECHO_PORT   7
14*10465441SEvalZero rt_thread_t udpecho_tid = RT_NULL;
udpecho_entry(void * parameter)15*10465441SEvalZero void udpecho_entry(void *parameter)
16*10465441SEvalZero {
17*10465441SEvalZero 	struct netconn *conn;
18*10465441SEvalZero 	struct netbuf *buf;
19*10465441SEvalZero 	struct ip_addr *addr;
20*10465441SEvalZero 	unsigned short port;
21*10465441SEvalZero 
22*10465441SEvalZero 	conn = netconn_new(NETCONN_UDP);
23*10465441SEvalZero 	netconn_bind(conn, IP_ADDR_ANY, 7);
24*10465441SEvalZero 
25*10465441SEvalZero 	while(1)
26*10465441SEvalZero 	{
27*10465441SEvalZero         /* received data to buffer */
28*10465441SEvalZero #if LWIP_VERSION_MINOR==3U
29*10465441SEvalZero 		buf = netconn_recv(conn);
30*10465441SEvalZero #else
31*10465441SEvalZero 		netconn_recv(conn, &buf);
32*10465441SEvalZero #endif
33*10465441SEvalZero 
34*10465441SEvalZero 		addr = netbuf_fromaddr(buf);
35*10465441SEvalZero 		port = netbuf_fromport(buf);
36*10465441SEvalZero 
37*10465441SEvalZero    		 /* send the data to buffer */
38*10465441SEvalZero 		netconn_connect(conn, addr, port);
39*10465441SEvalZero 
40*10465441SEvalZero 		/* reset address, and send to client */
41*10465441SEvalZero #if LWIP_VERSION_MINOR==3U
42*10465441SEvalZero 		buf->addr = RT_NULL;
43*10465441SEvalZero #else
44*10465441SEvalZero 		buf->addr = *IP_ADDR_ANY;
45*10465441SEvalZero #endif
46*10465441SEvalZero 
47*10465441SEvalZero 		netconn_send(conn, buf);
48*10465441SEvalZero 
49*10465441SEvalZero 		/* release buffer */
50*10465441SEvalZero 		netbuf_delete(buf);
51*10465441SEvalZero 	}
52*10465441SEvalZero }
53*10465441SEvalZero /*
54*10465441SEvalZero  * UDP socket echo server
55*10465441SEvalZero  */
56*10465441SEvalZero #define UDP_SOCKET_ECHO_PORT	700
57*10465441SEvalZero #define UDP_SOCKET_BUFFER_SIZE	4096
58*10465441SEvalZero rt_thread_t udpecho_socket_tid = RT_NULL;
udpecho_socket_entry(void * parameter)59*10465441SEvalZero void udpecho_socket_entry(void *parameter)
60*10465441SEvalZero {
61*10465441SEvalZero 	int sock;
62*10465441SEvalZero 	int bytes_read;
63*10465441SEvalZero 	char *recv_data;
64*10465441SEvalZero 	rt_uint32_t addr_len;
65*10465441SEvalZero 	struct sockaddr_in server_addr, client_addr;
66*10465441SEvalZero 
67*10465441SEvalZero 	/* allocate the data buffer */
68*10465441SEvalZero 	recv_data = rt_malloc(UDP_SOCKET_BUFFER_SIZE);
69*10465441SEvalZero 	if (recv_data == RT_NULL)
70*10465441SEvalZero 	{
71*10465441SEvalZero 		/* no memory yet */
72*10465441SEvalZero 		rt_kprintf("no memory\n");
73*10465441SEvalZero 		goto _exit;
74*10465441SEvalZero 	}
75*10465441SEvalZero 	/* create a UDP socket */
76*10465441SEvalZero 	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
77*10465441SEvalZero 	{
78*10465441SEvalZero 		rt_kprintf("create socket error\n");
79*10465441SEvalZero 		goto _exit;
80*10465441SEvalZero 	}
81*10465441SEvalZero 
82*10465441SEvalZero 	/* initialize server address */
83*10465441SEvalZero 	server_addr.sin_family = AF_INET;
84*10465441SEvalZero 	server_addr.sin_port = htons(UDP_SOCKET_ECHO_PORT);
85*10465441SEvalZero 	server_addr.sin_addr.s_addr = INADDR_ANY;
86*10465441SEvalZero 	rt_memset(&(server_addr.sin_zero),0, sizeof(server_addr.sin_zero));
87*10465441SEvalZero 
88*10465441SEvalZero 	/* bind socket to server address */
89*10465441SEvalZero 	if (bind(sock,(struct sockaddr *)&server_addr,
90*10465441SEvalZero 			sizeof(struct sockaddr)) == -1)
91*10465441SEvalZero 	{
92*10465441SEvalZero 		/* bind failed */
93*10465441SEvalZero 		rt_kprintf("bind error\n");
94*10465441SEvalZero 		goto _exit;
95*10465441SEvalZero 	}
96*10465441SEvalZero 
97*10465441SEvalZero 	addr_len = sizeof(struct sockaddr);
98*10465441SEvalZero 	while (1)
99*10465441SEvalZero 	{
100*10465441SEvalZero 		/* try to receive from UDP socket */
101*10465441SEvalZero 		bytes_read = recvfrom(sock, recv_data, UDP_SOCKET_BUFFER_SIZE, 0,
102*10465441SEvalZero 							 (struct sockaddr *)&client_addr, &addr_len);
103*10465441SEvalZero 
104*10465441SEvalZero 		/* send back */
105*10465441SEvalZero 		sendto(sock, recv_data, bytes_read, 0,
106*10465441SEvalZero 			(struct sockaddr *)&client_addr, addr_len);
107*10465441SEvalZero 	}
108*10465441SEvalZero 
109*10465441SEvalZero _exit:
110*10465441SEvalZero 	rt_free(recv_data);
111*10465441SEvalZero 	return;
112*10465441SEvalZero }
113*10465441SEvalZero 
114*10465441SEvalZero /*
115*10465441SEvalZero  * TCP echo server
116*10465441SEvalZero  */
117*10465441SEvalZero #define TCP_ECHO_PORT   7
118*10465441SEvalZero rt_thread_t tcpecho_tid = RT_NULL;
tcpecho_entry(void * parameter)119*10465441SEvalZero void tcpecho_entry(void *parameter)
120*10465441SEvalZero {
121*10465441SEvalZero 	struct netconn *conn, *newconn;
122*10465441SEvalZero 	err_t err;
123*10465441SEvalZero 
124*10465441SEvalZero 	/* Create a new connection identifier. */
125*10465441SEvalZero 	conn = netconn_new(NETCONN_TCP);
126*10465441SEvalZero 
127*10465441SEvalZero 	/* Bind connection to well known port number 7. */
128*10465441SEvalZero 	netconn_bind(conn, NULL, TCP_ECHO_PORT);
129*10465441SEvalZero 
130*10465441SEvalZero 	/* Tell connection to go into listening mode. */
131*10465441SEvalZero 	netconn_listen(conn);
132*10465441SEvalZero 
133*10465441SEvalZero 	while(1)
134*10465441SEvalZero 	{
135*10465441SEvalZero 		/* Grab new connection. */
136*10465441SEvalZero #if LWIP_VERSION_MINOR==3U
137*10465441SEvalZero 		newconn = netconn_accept(conn);
138*10465441SEvalZero 		if(newconn != NULL)
139*10465441SEvalZero #else
140*10465441SEvalZero 		err = netconn_accept(conn, &newconn);
141*10465441SEvalZero 		if(err == ERR_OK)
142*10465441SEvalZero #endif
143*10465441SEvalZero 		/* Process the new connection. */
144*10465441SEvalZero 		{
145*10465441SEvalZero 			struct netbuf *buf;
146*10465441SEvalZero 			void *data;
147*10465441SEvalZero 			u16_t len;
148*10465441SEvalZero #if LWIP_VERSION_MINOR==3U
149*10465441SEvalZero 			while((buf = netconn_recv(newconn)) != NULL)
150*10465441SEvalZero #else
151*10465441SEvalZero 			while((err = netconn_recv(newconn, &buf)) == ERR_OK)
152*10465441SEvalZero #endif
153*10465441SEvalZero 			{
154*10465441SEvalZero 				do
155*10465441SEvalZero 				{
156*10465441SEvalZero 					netbuf_data(buf, &data, &len);
157*10465441SEvalZero 					err = netconn_write(newconn, data, len, NETCONN_COPY);
158*10465441SEvalZero 					if(err != ERR_OK){}
159*10465441SEvalZero 				}
160*10465441SEvalZero 				while(netbuf_next(buf) >= 0);
161*10465441SEvalZero 				netbuf_delete(buf);
162*10465441SEvalZero 			}
163*10465441SEvalZero 			/* Close connection and discard connection identifier. */
164*10465441SEvalZero 			netconn_delete(newconn);
165*10465441SEvalZero 		}
166*10465441SEvalZero 	}
167*10465441SEvalZero }
168*10465441SEvalZero 
169*10465441SEvalZero /*
170*10465441SEvalZero  * TCP socket echo server
171*10465441SEvalZero  */
172*10465441SEvalZero #define TCP_SOCKET_ECHO_PORT	700
173*10465441SEvalZero #define TCP_SOCKET_BUFFER_SIZE	4096
174*10465441SEvalZero rt_thread_t tcpecho_socket_tid = RT_NULL;
tcpecho_socket_entry(void * parameter)175*10465441SEvalZero void tcpecho_socket_entry(void *parameter)
176*10465441SEvalZero {
177*10465441SEvalZero    char *recv_data;
178*10465441SEvalZero    rt_uint32_t sin_size;
179*10465441SEvalZero    int sock = -1, connected, bytes_received;
180*10465441SEvalZero    struct sockaddr_in server_addr, client_addr;
181*10465441SEvalZero 
182*10465441SEvalZero 	recv_data = rt_malloc(TCP_SOCKET_BUFFER_SIZE);
183*10465441SEvalZero 	if (recv_data == RT_NULL)
184*10465441SEvalZero 	{
185*10465441SEvalZero 		rt_kprintf("no memory\n");
186*10465441SEvalZero 		goto _exit;
187*10465441SEvalZero 	}
188*10465441SEvalZero 
189*10465441SEvalZero 	/* create a TCP socket */
190*10465441SEvalZero 	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
191*10465441SEvalZero 	{
192*10465441SEvalZero 		rt_kprintf("create socket error\n");
193*10465441SEvalZero 		goto _exit;
194*10465441SEvalZero 	}
195*10465441SEvalZero 
196*10465441SEvalZero 	/* initialize server address */
197*10465441SEvalZero 	server_addr.sin_family = AF_INET;
198*10465441SEvalZero 	server_addr.sin_port = htons(TCP_SOCKET_ECHO_PORT);
199*10465441SEvalZero 	server_addr.sin_addr.s_addr = INADDR_ANY;
200*10465441SEvalZero 	rt_memset(&(server_addr.sin_zero),8, sizeof(server_addr.sin_zero));
201*10465441SEvalZero 
202*10465441SEvalZero 	/* bind to server address */
203*10465441SEvalZero 	if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
204*10465441SEvalZero 	{
205*10465441SEvalZero 		rt_kprintf("bind address failed\n");
206*10465441SEvalZero 		goto _exit;
207*10465441SEvalZero    }
208*10465441SEvalZero 
209*10465441SEvalZero 	/* listen */
210*10465441SEvalZero 	if (listen(sock, 5) == -1)
211*10465441SEvalZero 	{
212*10465441SEvalZero 		rt_kprintf("listen error\n");
213*10465441SEvalZero 		goto _exit;
214*10465441SEvalZero 	}
215*10465441SEvalZero 
216*10465441SEvalZero 	sin_size = sizeof(struct sockaddr_in);
217*10465441SEvalZero 	while(1)
218*10465441SEvalZero 	{
219*10465441SEvalZero 		/* accept client connected */
220*10465441SEvalZero 		connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size);
221*10465441SEvalZero 		if (connected > 0)
222*10465441SEvalZero 		{
223*10465441SEvalZero 			int timeout;
224*10465441SEvalZero 
225*10465441SEvalZero 			/* set timeout option */
226*10465441SEvalZero 			timeout = 5000; /* 5second */
227*10465441SEvalZero 			setsockopt(connected, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
228*10465441SEvalZero 
229*10465441SEvalZero 			/* handle this client */
230*10465441SEvalZero 			while (1)
231*10465441SEvalZero 			{
232*10465441SEvalZero 				/* receive data from this connection */
233*10465441SEvalZero 				bytes_received = recv(connected,recv_data, TCP_SOCKET_BUFFER_SIZE, 0);
234*10465441SEvalZero 				if (bytes_received <= 0)
235*10465441SEvalZero 				{
236*10465441SEvalZero 					rt_kprintf("close client connection, errno: %d\n",
237*10465441SEvalZero 						rt_get_errno());
238*10465441SEvalZero 					/* connection closed. */
239*10465441SEvalZero 					lwip_close(connected);
240*10465441SEvalZero 					break;
241*10465441SEvalZero 				}
242*10465441SEvalZero 
243*10465441SEvalZero 				/* send data to client */
244*10465441SEvalZero 				send(connected, recv_data, bytes_received, 0);
245*10465441SEvalZero 			}
246*10465441SEvalZero 		}
247*10465441SEvalZero    }
248*10465441SEvalZero 
249*10465441SEvalZero _exit:
250*10465441SEvalZero 	/* close socket */
251*10465441SEvalZero 	if (sock != -1) lwip_close(sock);
252*10465441SEvalZero 	rt_free(recv_data);
253*10465441SEvalZero 
254*10465441SEvalZero 	return ;
255*10465441SEvalZero }
256*10465441SEvalZero 
257*10465441SEvalZero /*
258*10465441SEvalZero  * NetIO TCP server
259*10465441SEvalZero  */
260*10465441SEvalZero 
261*10465441SEvalZero /* network test utilities entry */
net_test(void)262*10465441SEvalZero void net_test(void)
263*10465441SEvalZero {
264*10465441SEvalZero 	/* start UDP echo server */
265*10465441SEvalZero 	if (udpecho_tid == RT_NULL)
266*10465441SEvalZero 	{
267*10465441SEvalZero 		udpecho_tid = rt_thread_create("uecho",
268*10465441SEvalZero 									udpecho_entry, RT_NULL,
269*10465441SEvalZero 									512, RT_THREAD_PRIORITY_MAX/2, 5);
270*10465441SEvalZero 		if (udpecho_tid != RT_NULL)
271*10465441SEvalZero 			rt_thread_startup(udpecho_tid);
272*10465441SEvalZero 	}
273*10465441SEvalZero 	if (udpecho_socket_tid == RT_NULL)
274*10465441SEvalZero 	{
275*10465441SEvalZero 		udpecho_socket_tid = rt_thread_create("uecho_s",
276*10465441SEvalZero 									udpecho_socket_entry, RT_NULL,
277*10465441SEvalZero 									512, RT_THREAD_PRIORITY_MAX/2 + 1, 5);
278*10465441SEvalZero 		if (udpecho_socket_tid != RT_NULL)
279*10465441SEvalZero 			rt_thread_startup(udpecho_socket_tid);
280*10465441SEvalZero 	}
281*10465441SEvalZero 
282*10465441SEvalZero 	if (tcpecho_tid == RT_NULL)
283*10465441SEvalZero 	{
284*10465441SEvalZero 		tcpecho_tid = rt_thread_create("techo",
285*10465441SEvalZero 									tcpecho_entry, RT_NULL,
286*10465441SEvalZero 									512, RT_THREAD_PRIORITY_MAX/2 + 2, 5);
287*10465441SEvalZero 		if (tcpecho_tid != RT_NULL)
288*10465441SEvalZero 			rt_thread_startup(tcpecho_tid);
289*10465441SEvalZero 	}
290*10465441SEvalZero 	if (tcpecho_socket_tid == RT_NULL)
291*10465441SEvalZero 	{
292*10465441SEvalZero 		tcpecho_socket_tid = rt_thread_create("techo_s",
293*10465441SEvalZero 									tcpecho_socket_entry, RT_NULL,
294*10465441SEvalZero 									512, RT_THREAD_PRIORITY_MAX/2 + 3, 5);
295*10465441SEvalZero 		if (tcpecho_socket_tid != RT_NULL)
296*10465441SEvalZero 			rt_thread_startup(tcpecho_socket_tid);
297*10465441SEvalZero 	}
298*10465441SEvalZero }
299*10465441SEvalZero FINSH_FUNCTION_EXPORT(net_test, network test);
300*10465441SEvalZero 
301