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) {