Hi,

On Sun, Oct 09, 2016 at 05:06:59PM +0200, Gert Doering wrote:
> Running more tests with that hunk reverted next...

With the following patch applied on top of Heiko's patch

diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c
index 4a11d10..1250547 100644
--- a/src/openvpn/tun.c
+++ b/src/openvpn/tun.c
@@ -1373,11 +1373,13 @@ do_ifconfig (struct tuntap *tt,
        else
          {
            /* example: netsh interface ipv6 set address interface=42 
2001:608:8003::d store=active */
+           char iface[64];
+           openvpn_snprintf(iface, sizeof(iface), "interface=%lu", 
tt->adapter_index );
            argv_printf (&argv,
-                        "%s%sc interface ipv6 set address interface=%lu %s 
store=active",
+                        "%s%sc interface ipv6 set address %s %s store=active",
                         get_win_sys_path(),
                         NETSH_PATH_SUFFIX,
-                        tt->adapter_index,
+                        iface,
                         ifconfig_ipv6_local );
            netsh_command (&argv, 4, M_FATAL);
          }


... the resulting binary now actually works :-) - tested on win7, without(!)
iservice (because Heiko already tested that), testing all the variants
of "--ip-win32".  Only a single tap adapter in the system, but will test
with 2-3 taps next (and trying to run multiple instances).

I've done a "v2" of Heiko's patch with that change included, which I'll
append below.  Samuli, could you build us a windows installer with master
plus that patch, for "windows early alpha testing"?  If that change 
works for people, we are very close to 2.4_alpha1...

gert
-- 
USENET is *not* the non-clickable part of WWW!
                                                           //www.muc.de/~gert/
Gert Doering - Munich, Germany                             g...@greenie.muc.de
fax: +49-89-35655025                        g...@net.informatik.tu-muenchen.de
From a98ac9043ea9445537936a88808d3d1939102e39 Mon Sep 17 00:00:00 2001
From: Heiko Hund <heiko.h...@sophos.com>
Date: Fri, 24 Jun 2016 18:01:41 +0200
Subject: [PATCH] Windows: do_ifconfig() after open_tun()

When you had multiple TAP adapters and IPv6 configured you got an error
message about "you must also specify --dev-node" and openvpn exited.
Very inconvenient especially since this is only due to the fact that
Windows tries to set the adapter address before it is opened; for no
good reason.

This patch changes the order to IFCONFIG_AFTER_TUN_OPEN, moves some
initialization code to init_tun, where it belongs, and removes duplicate
code that is now no longer needed.

v2: do not use "%lu" in argv_printf(), crashes non-iservice usage

Signed-off-by: Heiko Hund <heiko.h...@sophos.com>
Signed-off-by: Gert Doering <g...@greenie.muc.de>
---
 src/openvpn/tun.c | 54 ++++++++++++++++++------------------------------------
 src/openvpn/tun.h |  2 +-
 2 files changed, 19 insertions(+), 37 deletions(-)

diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c
index b7a29f7..1250547 100644
--- a/src/openvpn/tun.c
+++ b/src/openvpn/tun.c
@@ -611,6 +611,21 @@ init_tun (const char *dev,       /* --dev option */
 	  tt->broadcast = generate_ifconfig_broadcast_addr (tt->local, tt->remote_netmask);
 	}
 
+#ifdef WIN32
+      /*
+       * Make sure that both ifconfig addresses are part of the
+       * same .252 subnet.
+       */
+      if (tun)
+        {
+          verify_255_255_255_252 (tt->local, tt->remote_netmask);
+          tt->adapter_netmask = ~3;
+        }
+      else
+        {
+          tt->adapter_netmask = tt->remote_netmask;
+        }
+#endif
 
       tt->did_ifconfig_setup = true;
     }
@@ -1327,19 +1342,7 @@ do_ifconfig (struct tuntap *tt,
       }
 #elif defined (WIN32)
       {
-	/*
-	 * Make sure that both ifconfig addresses are part of the
-	 * same .252 subnet.
-	 */
-	if (tun)
-	  {
-	    verify_255_255_255_252 (tt->local, tt->remote_netmask);
-	    tt->adapter_netmask = ~3;
-	  }
-	else
-	  {
-	    tt->adapter_netmask = tt->remote_netmask;
-	  }
+        ASSERT (actual != NULL);
 
 	switch (tt->options.ip_win32_type)
 	  {
@@ -1350,9 +1353,6 @@ do_ifconfig (struct tuntap *tt,
 		 print_in_addr_t (tt->adapter_netmask, 0, &gc));
 	    break;
 	  case IPW32_SET_NETSH:
-	    if (!strcmp (actual, "NULL"))
-	      msg (M_FATAL, "Error: When using --ip-win32 netsh, if you have more than one TAP-Windows adapter, you must also specify --dev-node");
-
 	    netsh_ifconfig (&tt->options,
 			    actual,
 			    tt->local,
@@ -1366,25 +1366,6 @@ do_ifconfig (struct tuntap *tt,
 
     if ( do_ipv6 )
       {
-	char * saved_actual;
-	char iface[64];
-	DWORD idx;
-
-	if (!strcmp (actual, "NULL"))
-	  msg (M_FATAL, "Error: When using --tun-ipv6, if you have more than one TAP-Windows adapter, you must also specify --dev-node");
-
-	idx = get_adapter_index_flexible(actual);
-	openvpn_snprintf(iface, sizeof(iface), "interface=%lu", idx);
-
-	/* on windows, OpenVPN does ifconfig first, open_tun later, so
-	 * tt->actual_name might not yet be initialized, but routing code
-	 * needs to know interface name - point to "actual", restore later
-	 */
-	saved_actual = tt->actual_name;
-	tt->actual_name = (char*) actual;
-	/* we use adapter_index in add_route_ipv6 */
-	tt->adapter_index = idx;
-
 	if (tt->options.msg_channel)
 	  {
 	    do_address_service (true, AF_INET6, tt);
@@ -1392,6 +1373,8 @@ do_ifconfig (struct tuntap *tt,
 	else
 	  {
 	    /* example: netsh interface ipv6 set address interface=42 2001:608:8003::d store=active */
+	    char iface[64];
+	    openvpn_snprintf(iface, sizeof(iface), "interface=%lu", tt->adapter_index );
 	    argv_printf (&argv,
 			 "%s%sc interface ipv6 set address %s %s store=active",
 			 get_win_sys_path(),
@@ -1403,7 +1386,6 @@ do_ifconfig (struct tuntap *tt,
 
 	/* explicit route needed */
 	add_route_connected_v6_net(tt, es);
-	tt->actual_name = saved_actual;
       }
 #else
       msg (M_FATAL, "Sorry, but I don't know how to do 'ifconfig' commands on this operating system.  You should ifconfig your TUN/TAP device manually or use an --up script.");
diff --git a/src/openvpn/tun.h b/src/openvpn/tun.h
index 4e93a3f..1ccf378 100644
--- a/src/openvpn/tun.h
+++ b/src/openvpn/tun.h
@@ -301,7 +301,7 @@ ifconfig_order(void)
 #elif defined(TARGET_NETBSD)
   return IFCONFIG_AFTER_TUN_OPEN;
 #elif defined(WIN32)
-  return IFCONFIG_BEFORE_TUN_OPEN;
+  return IFCONFIG_AFTER_TUN_OPEN;
 #elif defined(TARGET_ANDROID)
   return IFCONFIG_BEFORE_TUN_OPEN;
 #else
-- 
1.9.1

Attachment: signature.asc
Description: PGP signature

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to