diff --git a/arch/sim/src/Makefile b/arch/sim/src/Makefile index 70b570e321..f9eaeac498 100644 --- a/arch/sim/src/Makefile +++ b/arch/sim/src/Makefile @@ -51,12 +51,14 @@ CSRCS += up_blockdevice.c up_deviceimage.c endif ifeq ($(CONFIG_NET_UIP),y) CSRCS += up_uipdriver.c +SPECSRCS += up_tapdev.c endif COBJS = $(CSRCS:.c=$(OBJEXT)) +SPECOBJS = $(SPECSRCS:.c=$(OBJEXT)) -SRCS = $(ASRCS) $(CSRCS) -OBJS = $(AOBJS) $(COBJS) +SRCS = $(ASRCS) $(CSRCS) $(SPECSRCS) +OBJS = $(AOBJS) $(COBJS) $(SPECOBJS) LDFLAGS = $(ARCHSCRIPT) EXTRA_LIBS = -lc @@ -77,6 +79,9 @@ $(AOBJS): %$(OBJEXT): %.S $(COBJS) $(LINKOBJS): %$(OBJEXT): %.c $(CC) -c $(CFLAGS) $< -o $@ +$(SPECOBJS): %$(OBJEXT): %.c + $(CC) -c $(HOSTCFLAGS) $< -o $@ + libarch$(LIBEXT): $(OBJS) ( for obj in $(OBJS) ; do \ $(AR) $@ $${obj} || \ diff --git a/arch/sim/src/up_internal.h b/arch/sim/src/up_internal.h index ab3df0ff52..f2a7512a02 100644 --- a/arch/sim/src/up_internal.h +++ b/arch/sim/src/up_internal.h @@ -107,9 +107,18 @@ extern void up_registerblockdevice(void); extern char *up_deviceimage(void); +/* up_tapdev.c ************************************************************/ + +#ifdef CONFIG_NET_UIP +extern unsigned long up_getwalltime( void ); +extern void tapdev_init(void); +extern unsigned int tapdev_read(char *buf, unsigned int buflen); +extern void tapdev_send(char *buf, unsigned int buflen); +#endif + /* up_uipdriver.c *********************************************************/ -#ifdef CONFIG_NET_UIP +#ifdef CONFIG_NET_UIP extern int uipdriver_init(void); extern void uipdriver_loop(void); #endif diff --git a/arch/sim/src/up_tapdev.c b/arch/sim/src/up_tapdev.c new file mode 100644 index 0000000000..e033048468 --- /dev/null +++ b/arch/sim/src/up_tapdev.c @@ -0,0 +1,205 @@ +/**************************************************************************** + * up_tapdev.c + * + * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Based on code from uIP which also has a BSD-like license: + * + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#if 0 +#include "uip/uip.h" +#include +#include +#endif + +#ifdef linux +# include +# include +# include +# define DEVTAP "/dev/net/tun" +#else /* linux */ +# define DEVTAP "/dev/tap0" +#endif /* linux */ + +/**************************************************************************** + * Private Definitions + ****************************************************************************/ + +#define TAPDEV_DEBUG 1 + +#define UIP_DRIPADDR0 192 +#define UIP_DRIPADDR1 168 +#define UIP_DRIPADDR2 0 +#define UIP_DRIPADDR3 1 + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +#ifdef TAPDEV_DEBUG +static int drop = 0; +#endif +static int fd; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +unsigned long up_getwalltime( void ) +{ + struct timeval tm; + (void)gettimeofday(&tm, NULL); + return tm.tv_sec*1000 + tm.tv_usec/1000; +} + +void tapdev_init(void) +{ + char buf[1024]; + + fd = open(DEVTAP, O_RDWR); + if(fd == -1) + { + printf("tapdev: tapdev_init: open"); + return; + } + +#ifdef linux + { + struct ifreq ifr; + memset(&ifr, 0, sizeof(ifr)); + ifr.ifr_flags = IFF_TAP|IFF_NO_PI; + if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0) + { + printf(buf); + return; + } + } +#endif /* Linux */ + + snprintf(buf, sizeof(buf), "ifconfig tap0 inet %d.%d.%d.%d", + UIP_DRIPADDR0, UIP_DRIPADDR1, UIP_DRIPADDR2, UIP_DRIPADDR3); + system(buf); +} + +unsigned int tapdev_read(char *buf, unsigned int buflen) +{ + fd_set fdset; + struct timeval tv; + int ret; + + tv.tv_sec = 0; + tv.tv_usec = 1000; + + FD_ZERO(&fdset); + FD_SET(fd, &fdset); + + ret = select(fd + 1, &fdset, NULL, NULL, &tv); + if(ret == 0) + { + return 0; + } + + ret = read(fd, buf, buflen); + if(ret == -1) + { + printf("tap_dev: tapdev_read: read"); + } + +#ifdef TAPDEV_DEBUG + printf("tap_dev: tapdev_read: read %d bytes\n", ret); + { + int i; + for(i = 0; i < 20; i++) + { + printf("%x ", buf[i]); + } + printf("\n"); + } +#endif + + return ret; +} + +void tapdev_send(char *buf, unsigned int buflen) +{ + int ret; +#ifdef TAPDEV_DEBUG + printf("tapdev_send: sending %d bytes\n", buflen); + + drop++; + if(drop % 8 == 7) + { + printf("Dropped a packet!\n"); + return; + } +#endif + + ret = write(fd, buf, buflen); + if(ret == -1) + { + perror("tap_dev: tapdev_send: write"); + exit(1); + } +} + diff --git a/arch/sim/src/up_uipdriver.c b/arch/sim/src/up_uipdriver.c index e68c4fccd9..883207ab4d 100644 --- a/arch/sim/src/up_uipdriver.c +++ b/arch/sim/src/up_uipdriver.c @@ -44,35 +44,11 @@ #include #include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include #include -#ifdef linux -# include -# include -# include -# define DEVTAP "/dev/net/tun" -#else /* linux */ -# define DEVTAP "/dev/tap0" -#endif /* linux */ - #include "up_internal.h" /**************************************************************************** @@ -81,11 +57,6 @@ #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) -#define UIP_DRIPADDR0 192 -#define UIP_DRIPADDR1 168 -#define UIP_DRIPADDR2 0 -#define UIP_DRIPADDR3 1 - /**************************************************************************** * Private Types ****************************************************************************/ @@ -104,10 +75,6 @@ struct timer * Private Data ****************************************************************************/ -#ifdef CONFIG_DEBUG -static int drop = 0; -#endif -static int fd; static struct timer periodic_timer; static struct timer arp_timer; @@ -115,22 +82,15 @@ static struct timer arp_timer; * Private Functions ****************************************************************************/ -static uint32 gettime( void ) -{ - struct timespec tm; - (void)clock_gettime(CLOCK_REALTIME, &tm); - return tm.tv_sec*1000 + tm.tv_nsec/1000000; -} - static void timer_set( struct timer *t, unsigned int interval ) { t->interval = interval; - t->start = gettime(); + t->start = up_getwalltime(); } static boolean timer_expired( struct timer *t ) { - return (gettime() - t->start) >= t->interval; + return (up_getwalltime() - t->start) >= t->interval; } void timer_reset(struct timer *t) @@ -138,97 +98,6 @@ void timer_reset(struct timer *t) t->start += t->interval; } -static void tapdev_init(void) -{ - char buf[1024]; - - fd = open(DEVTAP, O_RDWR); - if(fd == -1) - { - lib_rawprintf("tapdev: tapdev_init: open"); - return; - } - -#ifdef linux - { - struct ifreq ifr; - memset(&ifr, 0, sizeof(ifr)); - ifr.ifr_flags = IFF_TAP|IFF_NO_PI; - if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0) - { - lib_rawprintf(buf); - return; - } - } -#endif /* Linux */ - - snprintf(buf, sizeof(buf), "ifconfig tap0 inet %d.%d.%d.%d", - UIP_DRIPADDR0, UIP_DRIPADDR1, UIP_DRIPADDR2, UIP_DRIPADDR3); - system(buf); -} - -static unsigned int tapdev_read(void) -{ - fd_set fdset; - struct timeval tv; - int ret; - - tv.tv_sec = 0; - tv.tv_usec = 1000; - - FD_ZERO(&fdset); - FD_SET(fd, &fdset); - - ret = select(fd + 1, &fdset, NULL, NULL, &tv); - if(ret == 0) - { - return 0; - } - ret = read(fd, uip_buf, UIP_BUFSIZE); - if(ret == -1) - { - lib_rawprintf("tap_dev: tapdev_read: read"); - } - - dbg("tap_dev: tapdev_read: read %d bytes\n", ret); - { - int i; - for(i = 0; i < 20; i++) - { - vdbg("%x ", uip_buf[i]); - } - vdbg("\n"); - } - -#ifdef CONFIG_DEBUG - check_checksum(uip_buf, ret); -#endif - return ret; -} - -static void tapdev_send(void) -{ - int ret; -#ifdef CONFIG_DEBUG - dbg("tapdev_send: sending %d bytes\n", uip_len); - check_checksum(uip_buf, uip_len); - - drop++; - if(drop % 8 == 7) - { - dbg("Dropped a packet!\n"); - return; - } -#endif - - ret = write(fd, uip_buf, uip_len); - if(ret == -1) - { - perror("tap_dev: tapdev_send: writev"); - exit(1); - } -} - /**************************************************************************** * Public Functions ****************************************************************************/ @@ -237,7 +106,7 @@ void uipdriver_loop(void) { int i; - uip_len = tapdev_read(); + uip_len = tapdev_read(uip_buf, UIP_BUFSIZE); if (uip_len > 0) { if (BUF->type == htons(UIP_ETHTYPE_IP)) @@ -253,7 +122,7 @@ void uipdriver_loop(void) if (uip_len > 0) { uip_arp_out(); - tapdev_send(); + tapdev_send(uip_buf, uip_len); } } else if (BUF->type == htons(UIP_ETHTYPE_ARP)) @@ -267,7 +136,7 @@ void uipdriver_loop(void) if (uip_len > 0) { - tapdev_send(); + tapdev_send(uip_buf, uip_len); } } } @@ -286,7 +155,7 @@ void uipdriver_loop(void) if (uip_len > 0) { uip_arp_out(); - tapdev_send(); + tapdev_send(uip_buf, uip_len); } } @@ -303,7 +172,7 @@ void uipdriver_loop(void) if (uip_len > 0) { uip_arp_out(); - tapdev_send(); + tapdev_send(uip_buf, uip_len); } } #endif /* UIP_UDP */ @@ -320,8 +189,8 @@ void uipdriver_loop(void) int uipdriver_init(void) { - timer_set(&periodic_timer, CLK_TCK / 2); - timer_set(&arp_timer, CLK_TCK * 10); + timer_set(&periodic_timer, 500); + timer_set(&arp_timer, 10000 ); tapdev_init(); uip_init();