---
 src/openvpn/init.c |   11 +++++++++--
 src/openvpn/tun.h  |   11 +++++++++++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/openvpn/init.c b/src/openvpn/init.c
index b7f71c3..e61ca73 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(ifconfig_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 ((ifconfig_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 ((ifconfig_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
-- 
1.7.9.5


Reply via email to