1 #include <system_def.h>
6 #include <rtems/untar.h>
7 #include <rtems/error.h>
8 #include <rtems/mw_uid.h>
11 #include <lwip/init.h>
14 #include <netif/etharp.h>
16 #include "lwip/tcpip.h"
17 #include "arch/eth_lwip.h"
19 #include "lwip/netbuf.h"
20 #include "lwip/netdb.h"
21 #include "lwip/netifapi.h"
22 #include "lwip/sockets.h"
25 void lwip_echo_task(rtems_task_argument arg)
27 int clientfd = (int) arg;
30 printf("ECHO THREAD STARTED %d\n", clientfd);
32 nbytes=lwip_recv(clientfd, buffer, sizeof(buffer),0);
33 if (nbytes>0) lwip_send(clientfd, buffer, nbytes, 0);
36 printf("ECHO THREAD STOPPED %d\n", clientfd);
37 rtems_task_delete( RTEMS_SELF );
40 void lwip_echo_server(void)
43 struct sockaddr_in sLocalAddr;
45 lSocket = lwip_socket(AF_INET, SOCK_STREAM, 0);
46 if (lSocket < 0) return;
48 memset((char *)&sLocalAddr, 0, sizeof(sLocalAddr));
49 sLocalAddr.sin_family = AF_INET;
50 sLocalAddr.sin_len = sizeof(sLocalAddr);
51 sLocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
52 sLocalAddr.sin_port = 23;
54 if (lwip_bind(lSocket, (struct sockaddr *)&sLocalAddr, sizeof(sLocalAddr)) < 0) {
59 if ( lwip_listen(lSocket, 20) != 0 ){
67 struct sockaddr_in client_addr;
68 int addrlen=sizeof(client_addr);
70 rtems_status_code res;
72 clientfd = lwip_accept(lSocket, (struct sockaddr*)&client_addr, (socklen_t)&addrlen);
74 res = rtems_task_create(rtems_build_name('E', 'C', 'H', '0'+(clientfd & 7)),
75 90, RTEMS_MINIMUM_STACK_SIZE+2048, RTEMS_PREEMPT, 0, &id );
77 if (res != RTEMS_SUCCESSFUL) {
79 printf("ECHO THREAD NOT CREATED %d\n", clientfd);
82 res = rtems_task_start(id, (rtems_task_entry)lwip_echo_task, (rtems_task_argument)clientfd);
83 if (res != RTEMS_SUCCESSFUL) {
84 rtems_task_delete(id);
94 rtems_task_argument argument
97 printf("*** Starting up Task_1 ***\n");
100 rtems_status_code status;
102 eth_lwip_get_dhcp_info();
103 status = rtems_task_wake_after(rtems_clock_get_ticks_per_second()*5);
105 printf("*** Start Echo server ***\n");
107 printf("*** Echo server ended ***\n");
108 rtems_task_suspend( RTEMS_SELF );