* bug fixes and cleanups by John Hay <jhay@meraka.org.za> for FreeBSD
authorBernd Petrovitsch <bernd@firmix.at>
Thu, 4 Oct 2007 22:27:31 +0000 (22:27 +0000)
committerBernd Petrovitsch <bernd@firmix.at>
Thu, 4 Oct 2007 22:27:31 +0000 (22:27 +0000)
CHANGELOG
make/Makefile.fbsd
src/bsd/kernel_routes.c
src/bsd/net.c

index 3c78cb4..79cc905 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,5 @@
 This file states changes as of version 0.2.4:
-$Id: CHANGELOG,v 1.92 2007/09/17 22:27:24 bernd67 Exp $
+$Id: CHANGELOG,v 1.93 2007/10/04 22:27:31 bernd67 Exp $
 
 0.5.4 ---------------------------------------------------------------------
 
@@ -142,6 +142,9 @@ olsr_makefile_make_use_of_exename.patch
 PATCHES by John Hay <jhay@meraka.org.za>
 - update to new FreeBSD WLAN API
 - do not require /bin/bash, use /bin/sh
+- Fixed alignment so that olsrd runs on FreeBSD/arm
+- allow more interface in an IPv6 subnet on FreeBSD
+- use PREFIX and DESTDIR as all the other Makefile.$OS also for FreeBSD
 
 PATCH by Andreas Jacobs <jacobs@i4.informatik.rwth-aachen.de>
 - fix the loss link quality calculation for "windows size % 4 != 0"
index f9b2cea..d3eb242 100644 (file)
@@ -2,12 +2,12 @@
 # FREEBSD SPECIFIC CONFIGURATION
 #
 
-DESTDIR ?= /usr/local
-SBINDIR = $(DESTDIR)/sbin
-ETCDIR = $(DESTDIR)/etc
-LIBDIR = $(DESTDIR)/lib
-DOCDIR = $(DESTDIR)/share/doc
-MANDIR = $(DESTDIR)/man
+PREFIX ?= /usr/local
+SBINDIR = $(PREFIX)/sbin
+ETCDIR = $(PREFIX)/etc
+LIBDIR = $(PREFIX)/lib
+DOCDIR = $(PREFIX)/share/doc
+MANDIR = $(PREFIX)/man
 
 SRCS +=                $(wildcard src/bsd/*.c) $(wildcard src/unix/*.c)
 HDRS +=                $(wildcard src/bsd/*.h) $(wildcard src/unix/*.h)
@@ -22,8 +22,8 @@ endif
 
 ifdef LIBNET
 
-CPPFLAGS +=    -DSPOOF -I$(DESTDIR)/include
-LIBS +=                -L$(DESTDIR)/lib -lnet
+CPPFLAGS +=    -DSPOOF -I$(PREFIX)/include
+LIBS +=                -L$(PREFIX)/lib -lnet
 
 endif
 
index 19661b6..63c59a3 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: kernel_routes.c,v 1.13 2007/09/05 16:17:36 bernd67 Exp $
+ * $Id: kernel_routes.c,v 1.14 2007/10/04 22:27:31 bernd67 Exp $
  */
 
 
@@ -223,6 +223,14 @@ static int add_del_route6(struct rt_entry *rt, int add)
   {
     memcpy(&sin6.sin6_addr.s6_addr, &nexthop->gateway.v6, sizeof(struct in6_addr));
 
+    memset(&sin6.sin6_addr.s6_addr, 0, 8);
+    sin6.sin6_addr.s6_addr[0] = 0xfe;
+    sin6.sin6_addr.s6_addr[1] = 0x80;
+    sin6.sin6_scope_id = nexthop->iif_index;
+#ifdef __KAME__
+    *(u_int16_t *)&sin6.sin6_addr.s6_addr[2] = htons(sin6.sin6_scope_id);
+    sin6.sin6_scope_id = 0;
+#endif
     memcpy(walker, &sin6, sizeof (sin6));
     walker += step;
   }
@@ -231,19 +239,19 @@ static int add_del_route6(struct rt_entry *rt, int add)
 
   else
   {
-    // Sven-Ola: This looks really ugly (please compar to IPv4 above)
-    struct interface* iface = if_ifwithindex(nexthop->iif_index);
-    if (NULL == iface)
-    {
-      fprintf(stderr, "interface %s not found\n", if_ifwithindex_name(nexthop->iif_index));
-      return -1;
-    }
-    memcpy(&sin6.sin6_addr.s6_addr, &iface->int6_addr.sin6_addr.s6_addr,
-      sizeof(struct in6_addr));
+    memcpy(&sin6.sin6_addr.s6_addr,  &rt->rt_dst.prefix.v6, sizeof(struct in6_addr));
+    memset(&sin6.sin6_addr.s6_addr, 0, 8);
+    sin6.sin6_addr.s6_addr[0] = 0xfe;
+    sin6.sin6_addr.s6_addr[1] = 0x80;
+    sin6.sin6_scope_id = nexthop->iif_index;
+#ifdef __KAME__
+    *(u_int16_t *)&sin6.sin6_addr.s6_addr[2] = htons(sin6.sin6_scope_id);
+    sin6.sin6_scope_id = 0;
+#endif
 
     memcpy(walker, &sin6, sizeof (sin6));
     walker += step;
-    rtm->rtm_flags |= RTF_LLINFO;
+    rtm->rtm_flags |= RTF_GATEWAY;
   }
 
   if ((rtm->rtm_flags & RTF_HOST) == 0)
@@ -254,22 +262,41 @@ static int add_del_route6(struct rt_entry *rt, int add)
     rtm->rtm_addrs |= RTA_NETMASK;
   }
 
-  if ((rtm->rtm_flags & RTF_GATEWAY) != 0)
-  {
-    strcpy(&sdl.sdl_data[0], if_ifwithindex_name(nexthop->iif_index));
-    sdl.sdl_nlen = (u_char)strlen((char*)&sdl.sdl_data[0]);
-    memcpy(walker, &sdl, sizeof (sdl));
-    walker += step_dl;
-    rtm->rtm_addrs |= RTA_IFP;
-  }
-
   rtm->rtm_msglen = (unsigned short)(walker - buff);
 
   len = write(olsr_cnf->rts, buff, rtm->rtm_msglen);
-
-  if (len < rtm->rtm_msglen)
+  if (len < 0 && !(errno == EEXIST || errno == ESRCH))
     fprintf(stderr, "cannot write to routing socket: %s\n", strerror(errno));
 
+  /* If we get an EEXIST error while adding, delete and retry. */
+  if (len < 0 && errno == EEXIST && rtm->rtm_type == RTM_ADD) {
+    struct rt_msghdr *drtm;
+    unsigned char dbuff[512];
+
+    memset(dbuff, 0, sizeof (dbuff));
+    drtm = (struct rt_msghdr *)dbuff;
+    drtm->rtm_version = RTM_VERSION;
+    drtm->rtm_type = RTM_DELETE;
+    drtm->rtm_addrs = RTA_DST;
+    drtm->rtm_index = 0;
+    drtm->rtm_flags = olsr_rt_flags(rt);
+    drtm->rtm_seq = ++seq;
+
+    walker = dbuff + sizeof (struct rt_msghdr);
+    memcpy(&sin6.sin6_addr.s6_addr, &rt->rt_dst.prefix.v6,
+       sizeof(struct in6_addr));
+    memcpy(walker, &sin6, sizeof (sin6));
+    walker += step;
+    drtm->rtm_msglen = (unsigned short)(walker - dbuff);
+    len = write(olsr_cnf->rts, dbuff, drtm->rtm_msglen);
+    if (len < 0)
+      fprintf(stderr, "cannot delete route: %s\n", strerror(errno));
+    rtm->rtm_seq = ++seq;
+    len = write(olsr_cnf->rts, buff, rtm->rtm_msglen);
+    if (len < 0)
+      fprintf(stderr, "still cannot add route: %s\n", strerror(errno));
+  }
+
   return 0;
 }
 
index 4c60f7c..2724643 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.c,v 1.37 2007/09/07 08:53:36 bernd67 Exp $
+ * $Id: net.c,v 1.38 2007/10/04 22:27:31 bernd67 Exp $
  */
 
 #include "defs.h"
@@ -727,6 +727,10 @@ olsr_recvfrom(int  s,
 {
   struct msghdr mhdr;
   struct iovec iov;
+  union {
+       struct cmsghdr cmsg;
+       unsigned char chdr[4096];
+  } cmu;
   struct cmsghdr *cm;
   struct sockaddr_dl *sdl;
   struct sockaddr_in *sin = (struct sockaddr_in *) from; //XXX
@@ -736,20 +740,19 @@ olsr_recvfrom(int  s,
   struct interface *ifc;
   char addrstr[INET6_ADDRSTRLEN];
   char iname[IFNAMSIZ];
-  unsigned char chdr[4096];
   int count;
 
-  bzero(&mhdr, sizeof(mhdr));
-  bzero(&iov, sizeof(iov));
+  memset(&mhdr, 0, sizeof(mhdr));
+  memset(&iov, 0, sizeof(iov));
 
   mhdr.msg_name = (caddr_t) from;
   mhdr.msg_namelen = *fromlen;
   mhdr.msg_iov = &iov;
   mhdr.msg_iovlen = 1;
-  mhdr.msg_control = (caddr_t) chdr;
-  mhdr.msg_controllen = sizeof (chdr);
+  mhdr.msg_control = (caddr_t) &cmu;
+  mhdr.msg_controllen = sizeof (cmu);
 
-  iov.iov_len = MAXMESSAGESIZE;
+  iov.iov_len = len;
   iov.iov_base = buf;
 
   count = recvmsg (s, &mhdr, MSG_DONTWAIT);
@@ -775,9 +778,9 @@ olsr_recvfrom(int  s,
     }
   else
     {
-      cm = (struct cmsghdr *) chdr;
+      cm = &cmu.cmsg;
       sdl = (struct sockaddr_dl *) CMSG_DATA (cm);
-      bzero (iname, sizeof (iname));
+      memset (iname, 0, sizeof (iname));
       memcpy (iname, sdl->sdl_data, sdl->sdl_nlen);
     }