Make plain sendto() work for IPv4 by setting the IP_MULTICAST_IF
socket option. This allows us to drop the dependency on net/libnet
and stop using the associated sendto() replacement hack (which
supports only IPv4).

Make IPv6 work: Fix adding/deleting routes, and don't complain
about a missing net.inet6.icmp6.rediraccept sysctl. 

Also enable the verbose build so build logs show the commands
being used to compile things.

Index: Makefile
===================================================================
RCS file: /cvs/ports/net/olsrd/Makefile,v
retrieving revision 1.29
diff -u -p -r1.29 Makefile
--- Makefile    4 Jun 2017 11:45:04 -0000       1.29
+++ Makefile    18 Jun 2017 12:14:01 -0000
@@ -7,7 +7,7 @@ VERSION=                0.9.6.1
 DISTNAME=              olsrd-${VERSION}
 PKGNAME-main=          olsrd-${VERSION}
 PKGNAME-gui=           olsrd-gui-${VERSION}
-PKGNAME-plugins=       olsrd-plugins-${VERSION}
+REVISION-main=         0
 
 CATEGORIES=    net
 
@@ -23,8 +23,7 @@ MULTI_PACKAGES= -main -gui
 
 BUILD_DEPENDS= devel/bison
 
-LIB_DEPENDS-main= net/libnet/1.1
-WANTLIB-main=  c lib/libnet-1.1/net=11
+WANTLIB-main=  c
 
 LIB_DEPENDS-gui= x11/gtk+2
 WANTLIB-gui=   ${MODGETTEXT_WANTLIB}
@@ -41,11 +40,12 @@ NO_TEST=    Yes
 MODULES=       devel/gettext
 
 ALL_TARGET=    build_all
-MAKE_FLAGS=    CC="${CC}" OS=obsd LIBNET=1
+MAKE_FLAGS=    CC="${CC}" OS=obsd VERBOSE=1
 .ifdef DEBUG
 MAKE_FLAGS+=   DEBUG=1
+.else
+MAKE_FLAGS+=   DEBUG=0
 .endif
-CPPFLAGS+=     "-I${PREFIX}/libnet-1.1"
 FAKE_FLAGS=    SBINDIR=${DESTDIR}/${PREFIX}/sbin \
                ETCDIR=${DESTDIR}/${PREFIX}/share/examples/olsrd \
                LIBDIR=${DESTDIR}/${PREFIX}/lib/olsrd-plugins \
@@ -56,7 +56,7 @@ pre-configure:
        ${SUBST_CMD} ${WRKSRC}/src/plugin_loader.c
 
 post-build:
-       cd ${WRKSRC}/gui/linux-gtk; ${SETENV} ${MAKE_ENV} ${MAKE_PROGRAM}
+       cd ${WRKSRC}/gui/linux-gtk; ${SETENV} ${MAKE_ENV} ${MAKE_PROGRAM} 
${MAKE_FLAGS}
 
 INSTALL_TARGET=        install_all
 
Index: patches/patch-make_hash_source_sh
===================================================================
RCS file: patches/patch-make_hash_source_sh
diff -N patches/patch-make_hash_source_sh
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-make_hash_source_sh   18 Jun 2017 12:08:07 -0000
@@ -0,0 +1,24 @@
+$OpenBSD$
+
+Index: make/hash_source.sh
+--- make/hash_source.sh.orig
++++ make/hash_source.sh
+@@ -96,14 +96,16 @@ if [ ! -e "$buildDataTxt" ]; then
+   if [ "$verbose" = "0" ]; then
+     cp -p "$tmpBuildDataTxt" "$buildDataTxt"
+   else
+-    cp -p -v "$tmpBuildDataTxt" "$buildDataTxt"
++    echo cp -p "$tmpBuildDataTxt" "$buildDataTxt"
++    cp -p "$tmpBuildDataTxt" "$buildDataTxt"
+   fi
+ elif [ -n "$(diff -I "^const char build_date\[\].*\$" "$tmpBuildDataTxt" 
"$buildDataTxt" | sed 's/"/\\"/g')" ]; then
+   echo "[UPDATE] $buildDataTxt"
+   if [ "$verbose" = "0" ]; then
+     cp -p "$tmpBuildDataTxt" "$buildDataTxt"
+   else
+-    cp -p -v "$tmpBuildDataTxt" "$buildDataTxt"
++    echo cp -p "$tmpBuildDataTxt" "$buildDataTxt"
++    cp -p "$tmpBuildDataTxt" "$buildDataTxt"
+   fi
+ fi
+ rm -f "$tmpBuildDataTxt"
Index: patches/patch-src_bsd_kernel_routes_c
===================================================================
RCS file: /cvs/ports/net/olsrd/patches/patch-src_bsd_kernel_routes_c,v
retrieving revision 1.2
diff -u -p -r1.2 patch-src_bsd_kernel_routes_c
--- patches/patch-src_bsd_kernel_routes_c       4 Jun 2017 11:45:04 -0000       
1.2
+++ patches/patch-src_bsd_kernel_routes_c       18 Jun 2017 18:58:12 -0000
@@ -49,7 +49,58 @@ Index: src/bsd/kernel_routes.c
  
    /* walk to the end of the header */
    walker = buff + sizeof(struct rt_msghdr);
-@@ -389,6 +405,9 @@ add_del_route6(const struct rt_entry *rt, int add)
+@@ -322,13 +338,15 @@ add_del_route6(const struct rt_entry *rt, int add)
+   nexthop = olsr_get_nh(rt);
+   if (0 != (rtm->rtm_flags & RTF_GATEWAY)) {
+     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;
++    if (IN6_IS_ADDR_LINKLOCAL(&sin6.sin6_addr))
++      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;
++  if (IN6_IS_ADDR_LINKLOCAL(&sin6.sin6_addr))
++    {
++      uint16_t tmp16 = htons(sin6.sin6_scope_id);
++      memcpy(&sin6.sin6_addr.s6_addr[2], &tmp16, sizeof(uint16_t));
++      sin6.sin6_scope_id = 0;
++    }
+ #endif /* __KAME__ */
+     memcpy(walker, &sin6, sizeof(sin6));
+     walker += sin_size;
+@@ -336,22 +354,15 @@ add_del_route6(const struct rt_entry *rt, int add)
+   }
+   else {
+     /*
+-     * Host is directly reachable, so add
+-     * the output interface MAC address.
++     * Host is directly reachable, add a cloning route.
+      */
+-    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;
++    sdl.sdl_index = nexthop->iif_index;
+     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 /* __KAME__ */
+-    memcpy(walker, &sin6, sizeof(sin6));
+-    walker += sin_size;
++    memcpy(walker, &sdl, sizeof(sdl));
++    walker += sdl_size;
+     rtm->rtm_addrs |= RTA_GATEWAY;
+-    rtm->rtm_flags |= RTF_GATEWAY;
++    rtm->rtm_flags |= RTF_CLONING;
++    rtm->rtm_flags &= ~RTF_GATEWAY;
+   }
+ 
+   /**********************************************************************
+@@ -389,12 +400,21 @@ add_del_route6(const struct rt_entry *rt, int add)
      drtm->rtm_index = 0;
      drtm->rtm_flags = olsr_rt_flags(rt, add);
      drtm->rtm_seq = ++seq;
@@ -59,3 +110,15 @@ Index: src/bsd/kernel_routes.c
  
      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 += sin_size;
+     drtm->rtm_addrs = RTA_DST;
++    if (0 == (drtm->rtm_flags & RTF_HOST)) {
++      olsr_prefix_to_netmask((union olsr_ip_addr *)&sin6.sin6_addr, 
rt->rt_dst.prefix_len);
++      memcpy(walker, &sin6, sizeof(sin6));
++      walker += sin_size;
++      drtm->rtm_addrs |= RTA_NETMASK;
++    }
+     drtm->rtm_msglen = (unsigned short)(walker - dbuff);
+     len = write(olsr_cnf->rts, dbuff, drtm->rtm_msglen);
+     if (len < 0) {
Index: patches/patch-src_bsd_net_c
===================================================================
RCS file: /cvs/ports/net/olsrd/patches/patch-src_bsd_net_c,v
retrieving revision 1.4
diff -u -p -r1.4 patch-src_bsd_net_c
--- patches/patch-src_bsd_net_c 4 Jun 2017 11:45:04 -0000       1.4
+++ patches/patch-src_bsd_net_c 18 Jun 2017 12:08:46 -0000
@@ -47,7 +47,31 @@ Index: src/bsd/net.c
  #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ */
  
  #ifdef __APPLE__
-@@ -747,39 +742,12 @@ olsr_select(int nfds, fd_set * readfds, fd_set * write
+@@ -196,7 +191,11 @@ net_os_set_global_ifoptions(void) {
+   if (olsr_cnf->ip_version == AF_INET)
+     name = "net.inet.icmp.rediraccept";
+   else
++#if defined(__OpenBSD__)
++    ignore_redir = 1; 
++#else
+     name = "net.inet6.icmp6.rediraccept";
++#endif
+ 
+   ignore_redir = set_sysctl_int(name, 0);
+ #elif defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__
+@@ -341,6 +340,11 @@ getsocket(int bufspace, struct interface_olsr *ifp __a
+     return -1;
+   }
+ 
++  if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, 
&ifp->int_addr.sin_addr.s_addr, sizeof(struct in_addr)) < 0) {
++    perror("Set multicast if");
++    return -1;
++  }
++
+   if(bufspace > 0) {
+     for (on = bufspace;; on -= 1024) {
+       if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&on, sizeof(on)) == 
0)
+@@ -747,39 +751,12 @@ olsr_select(int nfds, fd_set * readfds, fd_set * write
  int
  check_wireless_interface(char *ifname)
  {

Reply via email to