Allow setting DeviceType to tun or tap on Linux.
authorGuus Sliepen <guus@tinc-vpn.org>
Sat, 18 Feb 2012 13:37:52 +0000 (14:37 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Sat, 18 Feb 2012 13:37:52 +0000 (14:37 +0100)
doc/tinc.conf.5.in
doc/tinc.texi
src/linux/device.c
src/net_setup.c

index dd74acf..0fc1ca1 100644 (file)
@@ -219,23 +219,23 @@ it can be used to change the way packets are interpreted:
 
 .Bl -tag -width indent
 
 
 .Bl -tag -width indent
 
-.It tun Pq BSD only
+.It tun Pq BSD and Linux
 Set type to tun.
 Depending on the platform, this can either be with or without an address family header (see below).
 
 Set type to tun.
 Depending on the platform, this can either be with or without an address family header (see below).
 
-.It tunnohead Pq BSD only
+.It tunnohead Pq BSD
 Set type to tun without an address family header.
 Tinc will expect packets read from the virtual network device to start with an IP header.
 On some platforms IPv6 packets cannot be read from or written to the device in this mode.
 
 Set type to tun without an address family header.
 Tinc will expect packets read from the virtual network device to start with an IP header.
 On some platforms IPv6 packets cannot be read from or written to the device in this mode.
 
-.It tunifhead Pq BSD only
+.It tunifhead Pq BSD
 Set type to tun with an address family header.
 Tinc will expect packets read from the virtual network device
 to start with a four byte header containing the address family,
 followed by an IP header.
 This mode should support both IPv4 and IPv6 packets.
 
 Set type to tun with an address family header.
 Tinc will expect packets read from the virtual network device
 to start with a four byte header containing the address family,
 followed by an IP header.
 This mode should support both IPv4 and IPv6 packets.
 
-.It tap Pq BSD only
+.It tap Pq BSD and Linux
 Set type to tap.
 Tinc will expect packets read from the virtual network device
 to start with an Ethernet header.
 Set type to tap.
 Tinc will expect packets read from the virtual network device
 to start with an Ethernet header.
index b7d646d..e69fb7e 100644 (file)
@@ -833,25 +833,25 @@ Also, in case tinc does not seem to correctly interpret packets received from th
 it can be used to change the way packets are interpreted:
 
 @table @asis
 it can be used to change the way packets are interpreted:
 
 @table @asis
-@item tun (BSD only)
+@item tun (BSD and Linux)
 Set type to tun.
 Depending on the platform, this can either be with or without an address family header (see below).
 
 @cindex tunnohead
 Set type to tun.
 Depending on the platform, this can either be with or without an address family header (see below).
 
 @cindex tunnohead
-@item tunnohead (BSD only)
+@item tunnohead (BSD)
 Set type to tun without an address family header.
 Tinc will expect packets read from the virtual network device to start with an IP header.
 On some platforms IPv6 packets cannot be read from or written to the device in this mode.
 
 @cindex tunifhead
 Set type to tun without an address family header.
 Tinc will expect packets read from the virtual network device to start with an IP header.
 On some platforms IPv6 packets cannot be read from or written to the device in this mode.
 
 @cindex tunifhead
-@item tunifhead (BSD only)
+@item tunifhead (BSD)
 Set type to tun with an address family header.
 Tinc will expect packets read from the virtual network device
 to start with a four byte header containing the address family,
 followed by an IP header.
 This mode should support both IPv4 and IPv6 packets.
 
 Set type to tun with an address family header.
 Tinc will expect packets read from the virtual network device
 to start with a four byte header containing the address family,
 followed by an IP header.
 This mode should support both IPv4 and IPv6 packets.
 
-@item tap (BSD only)
+@item tap (BSD and Linux)
 Set type to tap.
 Tinc will expect packets read from the virtual network device
 to start with an Ethernet header.
 Set type to tap.
 Tinc will expect packets read from the virtual network device
 to start with an Ethernet header.
index c06e7b9..93d4b41 100644 (file)
@@ -1,7 +1,7 @@
 /*
     device.c -- Interaction with Linux ethertap and tun/tap device
     Copyright (C) 2001-2005 Ivo Timmermans,
 /*
     device.c -- Interaction with Linux ethertap and tun/tap device
     Copyright (C) 2001-2005 Ivo Timmermans,
-                  2001-2011 Guus Sliepen <guus@tinc-vpn.org>
+                  2001-2012 Guus Sliepen <guus@tinc-vpn.org>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -45,6 +45,7 @@ int device_fd = -1;
 static device_type_t device_type;
 char *device = NULL;
 char *iface = NULL;
 static device_type_t device_type;
 char *device = NULL;
 char *iface = NULL;
+static char *type = NULL;
 static char ifrname[IFNAMSIZ];
 static char *device_info;
 
 static char ifrname[IFNAMSIZ];
 static char *device_info;
 
@@ -76,7 +77,15 @@ static bool setup_device(void) {
        /* Ok now check if this is an old ethertap or a new tun/tap thingie */
 
        memset(&ifr, 0, sizeof(ifr));
        /* Ok now check if this is an old ethertap or a new tun/tap thingie */
 
        memset(&ifr, 0, sizeof(ifr));
-       if(routing_mode == RMODE_ROUTER) {
+
+       get_config_string(lookup_config(config_tree, "DeviceType"), &type);
+
+       if(type && strcasecmp(type, "tun") && strcasecmp(type, "tap")) {
+               logger(LOG_ERR, "Unknown device type %s!", type);
+               return false;
+       }
+
+       if((type && !strcasecmp(type, "tun")) || (!type && routing_mode == RMODE_ROUTER)) {
                ifr.ifr_flags = IFF_TUN;
                device_type = DEVICE_TYPE_TUN;
                device_info = "Linux tun/tap device (tun mode)";
                ifr.ifr_flags = IFF_TUN;
                device_type = DEVICE_TYPE_TUN;
                device_info = "Linux tun/tap device (tun mode)";
@@ -124,6 +133,7 @@ static bool setup_device(void) {
 static void close_device(void) {
        close(device_fd);
 
 static void close_device(void) {
        close(device_fd);
 
+       free(type);
        free(device);
        free(iface);
 }
        free(device);
        free(iface);
 }
index 9cf24bf..3268f5d 100644 (file)
@@ -1,7 +1,7 @@
 /*
     net_setup.c -- Setup.
     Copyright (C) 1998-2005 Ivo Timmermans,
 /*
     net_setup.c -- Setup.
     Copyright (C) 1998-2005 Ivo Timmermans,
-                  2000-2011 Guus Sliepen <guus@tinc-vpn.org>
+                  2000-2012 Guus Sliepen <guus@tinc-vpn.org>
                   2006      Scott Lamb <slamb@slamb.org>
                   2010      Brandon Black <blblack@gmail.com>
 
                   2006      Scott Lamb <slamb@slamb.org>
                   2010      Brandon Black <blblack@gmail.com>
 
@@ -540,6 +540,8 @@ static bool setup_myself(void) {
 
        /* Open device */
 
 
        /* Open device */
 
+       devops = os_devops;
+
        if(get_config_string(lookup_config(config_tree, "DeviceType"), &type)) {
                if(!strcasecmp(type, "dummy"))
                        devops = dummy_devops;
        if(get_config_string(lookup_config(config_tree, "DeviceType"), &type)) {
                if(!strcasecmp(type, "dummy"))
                        devops = dummy_devops;
@@ -553,12 +555,6 @@ static bool setup_myself(void) {
                else if(!strcasecmp(type, "vde"))
                        devops = vde_devops;
 #endif
                else if(!strcasecmp(type, "vde"))
                        devops = vde_devops;
 #endif
-               else {
-                       logger(LOG_ERR, "Unknown device type %s!", type);
-                       return false;
-               }
-       } else {
-               devops = os_devops;
        }
 
        if(!devops.setup())
        }
 
        if(!devops.setup())