Set BSD tuns to broadcast mode. On OpenBSD, this enables IPv6 on the tun device!
authorGuus Sliepen <guus@tinc-vpn.org>
Wed, 10 Nov 2004 23:20:59 +0000 (23:20 +0000)
committerGuus Sliepen <guus@tinc-vpn.org>
Wed, 10 Nov 2004 23:20:59 +0000 (23:20 +0000)
configure.in
have.h
src/bsd/device.c

index 91545da..ae154de 100644 (file)
@@ -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 0befb3a..45acb36 100644 (file)
--- a/have.h
+++ b/have.h
 #include <net/if.h>
 #endif
 
+#ifdef HAVE_NET_IF_TYPES_H
+#include <net/if_types.h>
+#endif
+
 #ifdef HAVE_NET_IF_TUN_H
 #include <net/if_tun.h>
 #endif
index 045fc18..5e7a198 100644 (file)
@@ -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: