00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <linux/module.h>
00010 #include <linux/kernel.h>
00011 #include "lwip/sys.h"
00012 #include "lwip/api.h"
00013 #include <rtl_sched.h>
00014 #include <rtl_debug.h>
00015
00016
00017 static void
00018 serve_echo(void *arg)
00019 {
00020 struct netconn *newconn;
00021
00022
00023 newconn = (struct netconn *) arg;
00024
00025 rtl_printf("accepted new connection %p by thread 0x%x\n", newconn,(unsigned int)pthread_self());
00026
00027
00028 if(newconn != NULL) {
00029 struct netbuf *buf;
00030 void *data;
00031 u16_t len;
00032
00033 while((buf = netconn_recv(newconn)) != NULL) {
00034 do {
00035 netbuf_data(buf, &data, &len);
00036 rtl_printf("Got : %s\n", data);
00037 } while(netbuf_next(buf) >= 0);
00038 netbuf_delete(buf);
00039 }
00040
00041
00042 netconn_close(newconn);
00043 netconn_delete(newconn);
00044 }
00045 sys_thread_exit();
00046 }
00047
00048
00049 static void
00050 tcpecho_thread(void *arg)
00051 {
00052 struct netconn *conn;
00053
00054
00055 conn = netconn_new(NETCONN_TCP);
00056
00057
00058 netconn_bind(conn, NULL, 7);
00059
00060
00061 netconn_listen(conn);
00062
00063 while(1) {
00064
00065 sys_thread_new(serve_echo, netconn_accept(conn), 0);
00066 }
00067 }
00068
00069
00070 int init_module(void){
00071 printk("\n Multithreaded TCP echo server inserted\n");
00072 sys_thread_new(tcpecho_thread, NULL, 0);
00073 return 0;
00074 }
00075
00076
00077 void cleanup_module(void){
00078 printk("\n Multithreaded TCP echo server removed\n");
00079 }