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>
15 #include <lwip/tcp_impl.h>
17 #include "lwip/tcpip.h"
18 #include "arch/eth_lwip.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"
27 void lwip_echo_task(rtems_task_argument arg)
29 int clientfd = (int) arg;
32 printf("ECHO THREAD STARTED %d\n", clientfd);
34 nbytes=lwip_recv(clientfd, buffer, sizeof(buffer),0);
35 if (nbytes>0) lwip_send(clientfd, buffer, nbytes, 0);
38 printf("ECHO THREAD STOPPED %d\n", clientfd);
39 rtems_task_delete( RTEMS_SELF );
42 void lwip_echo_server(void)
45 struct sockaddr_in sLocalAddr;
47 lSocket = lwip_socket(AF_INET, SOCK_STREAM, 0);
48 if (lSocket < 0) return;
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;
56 if (lwip_bind(lSocket, (struct sockaddr *)&sLocalAddr, sizeof(sLocalAddr)) < 0) {
61 if ( lwip_listen(lSocket, 20) != 0 ){
69 struct sockaddr_in client_addr;
70 int addrlen=sizeof(client_addr);
72 rtems_status_code res;
74 clientfd = lwip_accept(lSocket, (struct sockaddr*)&client_addr, (socklen_t)&addrlen);
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 );
79 if (res != RTEMS_SUCCESSFUL) {
81 printf("ECHO THREAD NOT CREATED %d\n", clientfd);
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);
96 rtems_task_argument argument
99 printf("*** Starting up Task_1 ***\n");
102 rtems_status_code status;
104 eth_lwip_get_dhcp_info();
105 status = rtems_task_wake_after(rtems_clock_get_ticks_per_second()*5);
107 printf("*** Start Echo server ***\n");
109 printf("*** Echo server ended ***\n");
110 rtems_task_suspend( RTEMS_SELF );