summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGert Doering <gert@greenie.muc.de>2012-08-16 20:09:09 +0200
committerDavid Sommerseth <davids@redhat.com>2012-09-02 20:28:53 +0200
commit3630a7a50099874d55bf8e212ad4a97d6e70966f (patch)
tree9e7d141345c64283dd77564d5cd45f9e0a584204
parent7f696549251d853a9f40a373501b86cc6e5301e3 (diff)
downloadopenvpn-3630a7a50099874d55bf8e212ad4a97d6e70966f.tar.gz
openvpn-3630a7a50099874d55bf8e212ad4a97d6e70966f.tar.xz
openvpn-3630a7a50099874d55bf8e212ad4a97d6e70966f.zip
Keep pre-existing tun/tap devices around on *BSD
This amends commit 62c613d46dc49 to check whether a named tun/tap device ("--dev tunX" instead of "--dev tun") exists before OpenVPN started - if yes, keep around at program end. If no, destroy. Also has a spelling fix, and changes clear_tuntap() to be "static" (only ever called from within tun.c). Tested on FreeBSD 7.4, FreeBSD 9.0, NetBSD 5.1, OpenBSD 4.9 Signed-off-by: Gert Doering <gert@greenie.muc.de> Acked-by: Eric Crist <ecrist@secure-computing.net> Signed-off-by: David Sommerseth <davids@redhat.com>
-rw-r--r--src/openvpn/tun.c22
-rw-r--r--src/openvpn/tun.h4
2 files changed, 20 insertions, 6 deletions
diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c
index 6218b73..3d60857 100644
--- a/src/openvpn/tun.c
+++ b/src/openvpn/tun.c
@@ -890,7 +890,7 @@ do_ifconfig (struct tuntap *tt,
#elif defined(TARGET_OPENBSD)
/*
- * On OpenBSD, tun interfaces are persistant if created with
+ * On OpenBSD, tun interfaces are persistent if created with
* "ifconfig tunX create", and auto-destroyed if created by
* opening "/dev/tunX" (so we just use the /dev/tunX)
*/
@@ -1235,7 +1235,7 @@ do_ifconfig (struct tuntap *tt,
gc_free (&gc);
}
-void
+static void
clear_tuntap (struct tuntap *tuntap)
{
CLEAR (*tuntap);
@@ -1344,6 +1344,13 @@ open_tun_generic (const char *dev, const char *dev_type, const char *dev_node,
if (!dynamic_opened)
{
+ /* has named device existed before? if so, don't destroy at end */
+ if ( if_nametoindex( dev ) > 0 )
+ {
+ msg (M_INFO, "TUN/TAP device %s exists previously, keep at program end", dev );
+ tt->persistent_if = true;
+ }
+
if ((tt->fd = open (tunname, O_RDWR)) < 0)
msg (M_ERR, "Cannot open TUN/TAP dev %s", tunname);
}
@@ -2030,7 +2037,7 @@ close_tun (struct tuntap* tt)
{
/* only *TAP* devices need destroying, tun devices auto-self-destruct
*/
- if (tt && tt->type == DEV_TYPE_TUN )
+ if (tt && (tt->type == DEV_TYPE_TUN || tt->persistent_if ) )
{
close_tun_generic (tt);
free(tt);
@@ -2165,7 +2172,7 @@ close_tun (struct tuntap *tt)
{
/* only tun devices need destroying, tap devices auto-self-destruct
*/
- if (tt && tt->type != DEV_TYPE_TUN )
+ if (tt && ( tt->type != DEV_TYPE_TUN || tt->persistent_if ) )
{
close_tun_generic (tt);
free(tt);
@@ -2303,7 +2310,12 @@ open_tun (const char *dev, const char *dev_type, const char *dev_node, struct tu
void
close_tun (struct tuntap *tt)
{
- if (tt)
+ if (tt && tt->persistent_if ) /* keep pre-existing if around */
+ {
+ close_tun_generic (tt);
+ free (tt);
+ }
+ else if (tt) /* close and destroy */
{
struct gc_arena gc = gc_new ();
struct argv argv;
diff --git a/src/openvpn/tun.h b/src/openvpn/tun.h
index 9bd990f..8622bf8 100644
--- a/src/openvpn/tun.h
+++ b/src/openvpn/tun.h
@@ -137,6 +137,8 @@ struct tuntap
bool ipv6;
+ bool persistent_if; /* if existed before, keep on program end */
+
struct tuntap_options options; /* options set on command line */
char *actual_name; /* actual name of TUN/TAP dev, usually including unit number */
@@ -201,7 +203,7 @@ tuntap_defined (const struct tuntap *tt)
* Function prototypes
*/
-void clear_tuntap (struct tuntap *tuntap);
+static void clear_tuntap (struct tuntap *tuntap);
void open_tun (const char *dev, const char *dev_type, const char *dev_node,
struct tuntap *tt);