@@ -1764,6 +1764,10 @@
/* Using AF_UNIX trumps using DCO */
c->c1.tuntap->backend_driver = DRIVER_AFUNIX;
}
+ else if (is_dev_type(c->options.dev, c->options.dev_type, "null"))
+ {
+ c->c1.tuntap->backend_driver = DRIVER_NULL;
+ }
#ifdef _WIN32
else
{
@@ -1858,7 +1862,12 @@
open_tun_backend(struct context *c)
{
struct tuntap *tt = c->c1.tuntap;
- if (tt->backend_driver == DRIVER_AFUNIX)
+
+ if (tt->backend_driver == DRIVER_NULL)
+ {
+ open_tun_null(c->c1.tuntap);
+ }
+ else if (tt->backend_driver == DRIVER_AFUNIX)
{
open_tun_afunix(&c->options, c->c2.frame.tun_mtu, tt, c->c2.es);
}
@@ -33,7 +33,6 @@
* Tunnel types
*/
#define DEV_TYPE_UNDEF 0
-#define DEV_TYPE_NULL 1
#define DEV_TYPE_TUN 2 /* point-to-point IP tunnel */
#define DEV_TYPE_TAP 3 /* ethernet (802.3) tunnel */
@@ -78,6 +78,9 @@
case DRIVER_AFUNIX:
return "unix";
+ case DRIVER_NULL:
+ return "null";
+
#ifdef HAVE_NET_IF_UTUN_H
case DRIVER_UTUN:
return "utun";
@@ -476,10 +479,6 @@
{
return DEV_TYPE_TAP;
}
- else if (is_dev_type(dev, dev_type, "null"))
- {
- return DEV_TYPE_NULL;
- }
else
{
return DEV_TYPE_UNDEF;
@@ -497,9 +496,6 @@
case DEV_TYPE_TAP:
return "tap";
- case DEV_TYPE_NULL:
- return "null";
-
default:
return "[unknown-dev-type]";
}
@@ -773,8 +769,7 @@
bool tun_p2p = false;
if (tt->type == DEV_TYPE_TAP
- || (tt->type == DEV_TYPE_TUN && tt->topology == TOP_SUBNET)
- || tt->type == DEV_TYPE_NULL)
+ || (tt->type == DEV_TYPE_TUN && tt->topology == TOP_SUBNET))
{
tun_p2p = false;
}
@@ -1751,7 +1746,7 @@
void
undo_ifconfig(struct tuntap *tt, openvpn_net_ctx_t *ctx)
{
- if (tt->type != DEV_TYPE_NULL)
+ if (tt->backend_driver != DRIVER_AFUNIX && tt->backend_driver != DRIVER_NULL)
{
if (tt->did_ifconfig_setup)
{
@@ -1782,13 +1777,6 @@
#endif
}
-static void
-open_null(struct tuntap *tt)
-{
- tt->actual_name = string_alloc("null", NULL);
-}
-
-
#if defined (TARGET_OPENBSD) || (defined(TARGET_DARWIN) && HAVE_NET_IF_UTUN_H)
/*
@@ -1904,78 +1892,72 @@
char dynamic_name[256];
bool dynamic_opened = false;
- if (tt->type == DEV_TYPE_NULL)
+ /*
+ * --dev-node specified, so open an explicit device node
+ */
+ if (dev_node)
{
- open_null(tt);
+ snprintf(tunname, sizeof(tunname), "%s", dev_node);
}
else
{
/*
- * --dev-node specified, so open an explicit device node
+ * dynamic open is indicated by --dev specified without
+ * explicit unit number. Try opening /dev/[dev]n
+ * where n = [0, 255].
*/
- if (dev_node)
+
+ if (!tun_name_is_fixed(dev))
{
- snprintf(tunname, sizeof(tunname), "%s", dev_node);
+ for (int i = 0; i < 256; ++i)
+ {
+ snprintf(tunname, sizeof(tunname),
+ "/dev/%s%d", dev, i);
+ snprintf(dynamic_name, sizeof(dynamic_name),
+ "%s%d", dev, i);
+ if ((tt->fd = open(tunname, O_RDWR)) > 0)
+ {
+ dynamic_opened = true;
+ break;
+ }
+ msg(D_READ_WRITE | M_ERRNO, "Tried opening %s (failed)", tunname);
+ }
+ if (!dynamic_opened)
+ {
+ msg(M_FATAL, "Cannot allocate TUN/TAP dev dynamically");
+ }
}
+ /*
+ * explicit unit number specified
+ */
else
{
- /*
- * dynamic open is indicated by --dev specified without
- * explicit unit number. Try opening /dev/[dev]n
- * where n = [0, 255].
- */
-
- if (!tun_name_is_fixed(dev))
- {
- for (int i = 0; i < 256; ++i)
- {
- snprintf(tunname, sizeof(tunname),
- "/dev/%s%d", dev, i);
- snprintf(dynamic_name, sizeof(dynamic_name),
- "%s%d", dev, i);
- if ((tt->fd = open(tunname, O_RDWR)) > 0)
- {
- dynamic_opened = true;
- break;
- }
- msg(D_READ_WRITE | M_ERRNO, "Tried opening %s (failed)", tunname);
- }
- if (!dynamic_opened)
- {
- msg(M_FATAL, "Cannot allocate TUN/TAP dev dynamically");
- }
- }
- /*
- * explicit unit number specified
- */
- else
- {
- snprintf(tunname, sizeof(tunname), "/dev/%s", dev);
- }
+ snprintf(tunname, sizeof(tunname), "/dev/%s", dev);
}
-
- 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);
- }
- }
-
- set_nonblock(tt->fd);
- set_cloexec(tt->fd); /* don't pass fd to scripts */
- msg(M_INFO, "TUN/TAP device %s opened", tunname);
-
- /* tt->actual_name is passed to up and down scripts and used as the ifconfig dev name */
- tt->actual_name = string_alloc(dynamic_opened ? dynamic_name : dev, NULL);
}
+
+ 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);
+ }
+ }
+
+ set_nonblock(tt->fd);
+ set_cloexec(tt->fd); /* don't pass fd to scripts */
+ msg(M_INFO, "TUN/TAP device %s opened", tunname);
+
+ /* tt->actual_name is passed to up and down scripts and used as the ifconfig dev name */
+ tt->actual_name = string_alloc(dynamic_opened ? dynamic_name : dev, NULL);
+
}
#endif /* !_WIN32 && !TARGET_LINUX && !TARGET_FREEBSD*/
@@ -1987,12 +1969,6 @@
char dynamic_name[256];
bool dynamic_opened = false;
- if (tt->type == DEV_TYPE_NULL)
- {
- open_null(tt);
- return;
- }
-
/*
* unlike "open_tun_generic()", DCO on Linux and FreeBSD follows
* the device naming model of "non-DCO linux", that is:
@@ -2175,14 +2151,7 @@
{
struct ifreq ifr;
- /*
- * We handle --dev null specially, we do not open /dev/null for this.
- */
- if (tt->type == DEV_TYPE_NULL)
- {
- open_null(tt);
- }
- else if (tun_dco_enabled(tt))
+ if (tun_dco_enabled(tt))
{
open_tun_dco_generic(dev, dev_type, tt, ctx);
}
@@ -2407,12 +2376,6 @@
*/
CLEAR(ifr);
- if (tt->type == DEV_TYPE_NULL)
- {
- open_null(tt);
- return;
- }
-
if (tt->type == DEV_TYPE_TUN)
{
ip_node = "/dev/udp";
@@ -3491,12 +3454,6 @@
char dynamic_name[20];
const char *p;
- if (tt->type == DEV_TYPE_NULL)
- {
- open_null(tt);
- return;
- }
-
if (tt->type == DEV_TYPE_TUN)
{
msg(M_FATAL, "no support for 'tun' devices on AIX" );
@@ -6838,12 +6795,7 @@
msg( M_INFO, "open_tun");
- if (tt->type == DEV_TYPE_NULL)
- {
- open_null(tt);
- return;
- }
- else if (tt->type != DEV_TYPE_TAP && tt->type != DEV_TYPE_TUN)
+ if (tt->type != DEV_TYPE_TAP && tt->type != DEV_TYPE_TUN)
{
msg(M_FATAL|M_NOPREFIX, "Unknown virtual device type: '%s'", dev);
}
@@ -54,6 +54,7 @@
* this is always defined. We error out if a user tries to open this type
* on unsupported platforms*/
DRIVER_AFUNIX,
+ DRIVER_NULL,
DRIVER_DCO,
#ifdef HAVE_NET_IF_UTUN_H
DRIVER_UTUN
@@ -790,4 +791,10 @@
{
return tt && tt->type != DEV_TYPE_UNDEF;
}
+
+static inline void
+open_tun_null(struct tuntap *tt)
+{
+ tt->actual_name = string_alloc("null", NULL);
+}
#endif /* TUN_H */
Attention is currently required from: flichtenheld. Hello flichtenheld, I'd like you to do a code review. Please visit http://gerrit.openvpn.net/c/openvpn/+/748?usp=email to review the following change. Change subject: Change dev null to be a driver type instead of a special mode of tun/tap ...................................................................... Change dev null to be a driver type instead of a special mode of tun/tap Change-Id: I5987ebb7c38ab176eed7efc004ea54f606a77a12 Signed-off-by: Arne Schwabe <arne@rfc2549.org> --- M src/openvpn/init.c M src/openvpn/proto.h M src/openvpn/tun.c M src/openvpn/tun.h 4 files changed, 78 insertions(+), 111 deletions(-) git pull ssh://gerrit.openvpn.net:29418/openvpn refs/changes/48/748/1