summaryrefslogtreecommitdiff
path: root/nuttx/arch
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-08-28 00:18:50 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-08-28 00:18:50 +0000
commit2c857524a54906a5aaa42bdf803dddd6b3b110de (patch)
tree712c76744f67704338718640504615643ac0b08c /nuttx/arch
parentdf850961888239e142c03f386945f41238364344 (diff)
downloadpx4-nuttx-2c857524a54906a5aaa42bdf803dddd6b3b110de.tar.gz
px4-nuttx-2c857524a54906a5aaa42bdf803dddd6b3b110de.tar.bz2
px4-nuttx-2c857524a54906a5aaa42bdf803dddd6b3b110de.zip
Corrects UIP driver build
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@314 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch')
-rw-r--r--nuttx/arch/sim/src/Makefile9
-rw-r--r--nuttx/arch/sim/src/up_internal.h11
-rw-r--r--nuttx/arch/sim/src/up_tapdev.c205
-rw-r--r--nuttx/arch/sim/src/up_uipdriver.c149
4 files changed, 231 insertions, 143 deletions
diff --git a/nuttx/arch/sim/src/Makefile b/nuttx/arch/sim/src/Makefile
index 70b570e32..f9eaeac49 100644
--- a/nuttx/arch/sim/src/Makefile
+++ b/nuttx/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/nuttx/arch/sim/src/up_internal.h b/nuttx/arch/sim/src/up_internal.h
index ab3df0ff5..f2a7512a0 100644
--- a/nuttx/arch/sim/src/up_internal.h
+++ b/nuttx/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/nuttx/arch/sim/src/up_tapdev.c b/nuttx/arch/sim/src/up_tapdev.c
new file mode 100644
index 000000000..e03304846
--- /dev/null
+++ b/nuttx/arch/sim/src/up_tapdev.c
@@ -0,0 +1,205 @@
+/****************************************************************************
+ * up_tapdev.c
+ *
+ * Copyright (C) 2007 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/uio.h>
+#include <sys/socket.h>
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+
+#if 0
+#include "uip/uip.h"
+#include <net/uip/uip-arch.h>
+#include <net/uip/uip-arp.h>
+#endif
+
+#ifdef linux
+# include <sys/ioctl.h>
+# include <linux/if.h>
+# include <linux/if_tun.h>
+# 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/nuttx/arch/sim/src/up_uipdriver.c b/nuttx/arch/sim/src/up_uipdriver.c
index e68c4fccd..883207ab4 100644
--- a/nuttx/arch/sim/src/up_uipdriver.c
+++ b/nuttx/arch/sim/src/up_uipdriver.c
@@ -44,35 +44,11 @@
#include <nuttx/config.h>
#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <sys/uio.h>
-#include <sys/socket.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <fcntl.h>
-#include <string.h>
-#include <time.h>
-#include <errno.h>
-#include <debug.h>
#include <net/uip/uip.h>
#include <net/uip/uip-arch.h>
#include <net/uip/uip-arp.h>
-#ifdef linux
-# include <sys/ioctl.h>
-# include <linux/if.h>
-# include <linux/if_tun.h>
-# 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();