]> rtime.felk.cvut.cz Git - rtems-devel.git/blob - rtems-omk-template/applwiptest/task_1.c
ab91d3a1860346dd505844b239fee7eff59689ca
[rtems-devel.git] / rtems-omk-template / applwiptest / task_1.c
1 #include <system_def.h>
2 #include "system.h"
3 #include "app_def.h"
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <rtems/untar.h>
7 #include <rtems/error.h>
8 #include <rtems/mw_uid.h>
9 #include <errno.h>
10
11 #include <lwip/init.h>
12 #include "lwip/err.h"
13 #include "lwip/tcp.h"
14 #include <netif/etharp.h>
15 #include <lwip/tcp_impl.h>
16
17 #include "lwip/tcpip.h"
18 #include "arch/eth_lwip.h"
19 #include "lwip/api.h"
20 #include "lwip/netbuf.h"
21 #include "lwip/netdb.h"
22 #include "lwip/netifapi.h"
23 #include "lwip/pppapi.h"
24 #include "lwip/sockets.h"
25 #include "lwip/sys.h"
26
27 void lwip_echo_task(rtems_task_argument arg)
28 {
29   int clientfd = (int) arg;
30   char buffer[1024];
31   int nbytes;
32   printf("ECHO THREAD STARTED %d\n", clientfd);
33   do{
34     nbytes=lwip_recv(clientfd, buffer, sizeof(buffer),0);
35     if (nbytes>0) lwip_send(clientfd, buffer, nbytes, 0);
36   } while (nbytes>0);
37   lwip_close(clientfd);
38   printf("ECHO THREAD STOPPED %d\n", clientfd);
39   rtems_task_delete( RTEMS_SELF );
40 }
41
42 void lwip_echo_server(void)
43 {
44   int lSocket;
45   struct sockaddr_in sLocalAddr;
46
47   lSocket = lwip_socket(AF_INET, SOCK_STREAM, 0);
48   if (lSocket < 0) return;
49
50   memset((char *)&sLocalAddr, 0, sizeof(sLocalAddr));
51   sLocalAddr.sin_family = AF_INET;
52   sLocalAddr.sin_len = sizeof(sLocalAddr);
53   sLocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
54   sLocalAddr.sin_port = 23;
55
56   if (lwip_bind(lSocket, (struct sockaddr *)&sLocalAddr, sizeof(sLocalAddr)) < 0) {
57           lwip_close(lSocket);
58           return;
59   }
60
61   if ( lwip_listen(lSocket, 20) != 0 ){
62           lwip_close(lSocket);
63           return;
64   }
65
66   while (1)
67   {
68         int clientfd;
69         struct sockaddr_in client_addr;
70         int addrlen=sizeof(client_addr);
71         rtems_id id;
72         rtems_status_code res;
73
74         clientfd = lwip_accept(lSocket, (struct sockaddr*)&client_addr, (socklen_t)&addrlen);
75         if (clientfd>0){
76           res = rtems_task_create(rtems_build_name('E', 'C', 'H', '0'+(clientfd & 7)),
77             90, RTEMS_MINIMUM_STACK_SIZE+2048, RTEMS_PREEMPT, 0, &id );
78
79           if (res != RTEMS_SUCCESSFUL) {
80             lwip_close(clientfd);
81             printf("ECHO THREAD NOT CREATED %d\n", clientfd);
82             continue;
83           }
84           res = rtems_task_start(id, (rtems_task_entry)lwip_echo_task, (rtems_task_argument)clientfd);
85           if (res != RTEMS_SUCCESSFUL) {
86             rtems_task_delete(id);
87             lwip_close(clientfd);
88             continue;
89           }
90         }
91   }
92   lwip_close(lSocket);
93 }
94
95 rtems_task Task_1(
96   rtems_task_argument argument
97 )
98 {
99   printf("*** Starting up Task_1 ***\n");
100   
101   int loops = 3;
102   rtems_status_code status;
103   while(loops--){
104     eth_lwip_get_dhcp_info();
105     status = rtems_task_wake_after(rtems_clock_get_ticks_per_second()*5);
106   }
107   printf("*** Start Echo server ***\n");
108   lwip_echo_server();
109   printf("*** Echo server ended ***\n");
110   rtems_task_suspend( RTEMS_SELF );
111 }
112