From d8fe2ecdd8dc5caf6f8d6acf2923a0baed64735f Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Wed, 10 Nov 2004 23:20:59 +0000 Subject: [PATCH] Set BSD tuns to broadcast mode. On OpenBSD, this enables IPv6 on the tun device! --- configure.in | 2 +- have.h | 4 ++++ src/bsd/device.c | 24 ++++++++++++++++++++---- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/configure.in b/configure.in index 91545da2..ae154deb 100644 --- a/configure.in +++ b/configure.in @@ -99,7 +99,7 @@ dnl We do this in multiple stages, because unlike Linux all the other operating AC_HEADER_STDC AC_CHECK_HEADERS([stdbool.h syslog.h sys/file.h sys/ioctl.h sys/mman.h sys/param.h sys/socket.h sys/time.h sys/uio.h sys/wait.h netdb.h arpa/inet.h]) -AC_CHECK_HEADERS([net/if.h net/ethernet.h net/if_arp.h netinet/in_systm.h netinet/in.h netinet/in6.h], +AC_CHECK_HEADERS([net/if.h net/if_types.h net/if_tun.h net/if_tap.h net/ethernet.h net/if_arp.h netinet/in_systm.h netinet/in.h netinet/in6.h], [], [], [#include "have.h"] ) AC_CHECK_HEADERS([netinet/if_ether.h netinet/ip.h netinet/ip6.h], diff --git a/have.h b/have.h index 0befb3a5..45acb361 100644 --- a/have.h +++ b/have.h @@ -96,6 +96,10 @@ #include #endif +#ifdef HAVE_NET_IF_TYPES_H +#include +#endif + #ifdef HAVE_NET_IF_TUN_H #include #endif diff --git a/src/bsd/device.c b/src/bsd/device.c index 045fc188..5e7a1988 100644 --- a/src/bsd/device.c +++ b/src/bsd/device.c @@ -49,10 +49,6 @@ static device_type_t device_type = DEVICE_TYPE_TUN; #endif bool setup_device(void) { -#ifdef TUNSIFHEAD - const int zero = 0; - const int one = 1; -#endif char *type; cp(); @@ -91,20 +87,40 @@ bool setup_device(void) { device_type = DEVICE_TYPE_TUN; case DEVICE_TYPE_TUN: #ifdef TUNSIFHEAD + { + const int zero = 0; if(ioctl(device_fd, TUNSIFHEAD, &zero, sizeof zero) == -1) { logger(LOG_ERR, _("System call `%s' failed: %s"), "ioctl", strerror(errno)); return false; } + } +#endif +#if defined(TUNSIFMODE) && defined(IFF_BROADCAST) && defined(IFF_MULTICAST) + { + const int mode = IFF_BROADCAST | IFF_MULTICAST; + ioctl(device_fd, TUNSIFMODE, &mode, sizeof mode); + } #endif + device_info = _("Generic BSD tun device"); break; case DEVICE_TYPE_TUNIFHEAD: #ifdef TUNSIFHEAD + { + const int one = 1; if(ioctl(device_fd, TUNSIFHEAD, &one, sizeof one) == -1) { logger(LOG_ERR, _("System call `%s' failed: %s"), "ioctl", strerror(errno)); return false; } + } #endif +#if defined(TUNSIFMODE) && defined(IFF_BROADCAST) && defined(IFF_MULTICAST) + { + const int mode = IFF_BROADCAST | IFF_MULTICAST; + ioctl(device_fd, TUNSIFMODE, &mode, sizeof mode); + } +#endif + device_info = _("Generic BSD tun device"); break; case DEVICE_TYPE_TAP: -- 2.20.1