From 4b4fac9184fcea1eab4f4223309211780cee188a Mon Sep 17 00:00:00 2001 From: Gert Doering Date: Sun, 13 Apr 2014 13:12:02 +0200 Subject: IPv6 address/route delete fix for Win8 Use "store=active" for IPv6 address and route deletion - seems to be required on Windows 8 and up, and not doing it will break OpenVPN reconnection (old addresses are not properly deleted, thus address can not be configured on connect). Reported-by: Cedric Signed-off-by: Gert Doering Acked-by: Cedric Tabary Message-Id: <20140413170648.GU16637@greenie.muc.de> URL: http://article.gmane.org/gmane.network.openvpn.devel/8499 --- src/openvpn/route.c | 8 +++++++- src/openvpn/tun.c | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/openvpn/route.c b/src/openvpn/route.c index 825ea47..1d9da42 100644 --- a/src/openvpn/route.c +++ b/src/openvpn/route.c @@ -1958,10 +1958,16 @@ delete_route_ipv6 (const struct route_ipv6 *r6, const struct tuntap *tt, unsigne argv_printf_cat (&argv, "METRIC %d", r->metric); #endif + /* Windows XP to 7 "just delete" routes, wherever they came from, but + * in Windows 8(.1?), if you create them with "store=active", this is + * how you should delete them as well (pointed out by Cedric Tabary) + */ + argv_printf_cat( &argv, " store=active" ); + argv_msg (D_ROUTE, &argv); netcmd_semaphore_lock (); - openvpn_execve_check (&argv, es, 0, "ERROR: Windows route add ipv6 command failed"); + openvpn_execve_check (&argv, es, 0, "ERROR: Windows route delete ipv6 command failed"); netcmd_semaphore_release (); #elif defined (TARGET_SOLARIS) diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c index 4df271d..482f640 100644 --- a/src/openvpn/tun.c +++ b/src/openvpn/tun.c @@ -5305,10 +5305,14 @@ close_tun (struct tuntap *tt) /* remove route pointing to interface */ delete_route_connected_v6_net(tt, NULL); + /* "store=active" is needed in Windows 8(.1) to delete the + * address we added (pointed out by Cedric Tabary). + */ + /* netsh interface ipv6 delete address \"%s\" %s */ ifconfig_ipv6_local = print_in6_addr (tt->local_ipv6, 0, &gc); argv_printf (&argv, - "%s%sc interface ipv6 delete address %s %s", + "%s%sc interface ipv6 delete address %s %s store=active", get_win_sys_path(), NETSH_PATH_SUFFIX, tt->actual_name, -- cgit