summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne Schwabe <arne@rfc2549.org>2013-04-28 16:32:39 +0200
committerGert Doering <gert@greenie.muc.de>2013-05-01 11:42:56 +0200
commit94e6a2daad7039e3938876e0124ec7d2bb7e9728 (patch)
tree186791f221aa6127f84a3dd6dd52da6bfe4c3d43
parentfb6210418162ec036289117f6f1b6705b1d0d1d4 (diff)
downloadopenvpn-94e6a2daad7039e3938876e0124ec7d2bb7e9728.tar.gz
openvpn-94e6a2daad7039e3938876e0124ec7d2bb7e9728.tar.xz
openvpn-94e6a2daad7039e3938876e0124ec7d2bb7e9728.zip
Allow routes to be set before opening tun, similar to ifconfig before opening tun
Acked-by: Gert Doering <gert@greenie.muc.de> Message-Id: <1367159559-22947-1-git-send-email-arne@rfc2549.org> URL: http://article.gmane.org/gmane.network.openvpn.devel/7564 Signed-off-by: Gert Doering <gert@greenie.muc.de>
-rw-r--r--src/openvpn/init.c11
-rw-r--r--src/openvpn/tun.h11
2 files changed, 20 insertions, 2 deletions
diff --git a/src/openvpn/init.c b/src/openvpn/init.c
index 979ba23..e7c16e0 100644
--- a/src/openvpn/init.c
+++ b/src/openvpn/init.c
@@ -1429,6 +1429,13 @@ do_open_tun (struct context *c)
do_ifconfig (c->c1.tuntap, guess, TUN_MTU_SIZE (&c->c2.frame), c->c2.es);
}
+ /* possibly add routes */
+ if (route_order() == ROUTE_BEFORE_TUN) {
+ /* Ignore route_delay, would cause ROUTE_BEFORE_TUN to be ignored */
+ do_route (&c->options, c->c1.route_list, c->c1.route_ipv6_list,
+ c->c1.tuntap, c->plugins, c->c2.es);
+ }
+
/* open the tun device */
open_tun (c->options.dev, c->options.dev_type, c->options.dev_node,
c->c1.tuntap);
@@ -1460,7 +1467,7 @@ do_open_tun (struct context *c)
c->c2.es);
/* possibly add routes */
- if (!c->options.route_delay_defined)
+ if ((route_order() == ROUTE_AFTER_TUN) && (!c->options.route_delay_defined))
do_route (&c->options, c->c1.route_list, c->c1.route_ipv6_list,
c->c1.tuntap, c->plugins, c->c2.es);
@@ -1668,7 +1675,7 @@ do_up (struct context *c, bool pulled_options, unsigned int option_types_found)
#endif
/* if --route-delay was specified, start timer */
- if (c->options.route_delay_defined)
+ if ((route_order() == ROUTE_AFTER_TUN) && c->options.route_delay_defined)
{
event_timeout_init (&c->c2.route_wakeup, c->options.route_delay, now);
event_timeout_init (&c->c2.route_wakeup_expire, c->options.route_delay + c->options.route_delay_window, now);
diff --git a/src/openvpn/tun.h b/src/openvpn/tun.h
index c3fc62e..63e4b5c 100644
--- a/src/openvpn/tun.h
+++ b/src/openvpn/tun.h
@@ -297,6 +297,17 @@ ifconfig_order(void)
#endif
}
+#define ROUTE_BEFORE_TUN 0
+#define ROUTE_AFTER_TUN 1
+#define ROUTE_ORDER_DEFAULT ROUTE_AFTER_TUN
+
+static inline int
+route_order(void)
+{
+ return ROUTE_ORDER_DEFAULT;
+}
+
+
#ifdef WIN32
#define TUN_PASS_BUFFER