From: Lev Stipakov Date: Thu, 9 Oct 2025 17:19:11 +0000 (+0200) Subject: Preserve ifconfig(_ipv6)_local across reconnect X-Git-Tag: v2.7_beta3~12 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8a8360fc176b3996bfefee0ea894dc5c8a9ead1a;p=thirdparty%2Fopenvpn.git Preserve ifconfig(_ipv6)_local across reconnect Turns out that ifconfig_(ipv6)_local options are set once and are not reset on a reconnect. Consider following scenario: - connect first time, server pushes ifconfig-ipv6 - add a ipv6 network route because ifconfig_ipv6_local is set - reconnect, server doesn't push ifconfig-ipv6 Because of ifconfig_ipv6_local is not reset and holds the value set by the first connect, client adds a ipv6 network route - but this is wrong, since ipv6 wasn't pushed this time by the server. Fix by saving/restoring ifconfig(_ipv6)_local in a struct options_pre_connect along with other options which preserves the initial values until --pull modifications are applied. Github: OpenVPN/openvpn#850 Change-Id: I9b099924286f9bccb6833e1e40606abe72714bbb Signed-off-by: Lev Stipakov Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1248 Message-Id: <20251009171916.12811-1-gert@greenie.muc.de> URL: https://sourceforge.net/p/openvpn/mailman/message/59244523/ Signed-off-by: Gert Doering --- diff --git a/src/openvpn/options.c b/src/openvpn/options.c index f2e6dec7a..fabcc1ea6 100644 --- a/src/openvpn/options.c +++ b/src/openvpn/options.c @@ -3143,6 +3143,9 @@ pre_connect_save(struct options *o) o->pre_connect->client_nat_defined = true; } + o->pre_connect->ifconfig_local = o->ifconfig_local; + o->pre_connect->ifconfig_ipv6_local = o->ifconfig_ipv6_local; + o->pre_connect->route_default_gateway = o->route_default_gateway; o->pre_connect->route_ipv6_default_gateway = o->route_ipv6_default_gateway; @@ -3193,6 +3196,9 @@ pre_connect_restore(struct options *o, struct gc_arena *gc) o->routes_ipv6 = NULL; } + o->ifconfig_local = pp->ifconfig_local; + o->ifconfig_ipv6_local = pp->ifconfig_ipv6_local; + o->route_default_gateway = pp->route_default_gateway; o->route_ipv6_default_gateway = pp->route_ipv6_default_gateway; diff --git a/src/openvpn/options.h b/src/openvpn/options.h index f0389752b..6ecf4f81b 100644 --- a/src/openvpn/options.h +++ b/src/openvpn/options.h @@ -64,6 +64,9 @@ struct options_pre_connect bool tuntap_options_defined; struct tuntap_options tuntap_options; + const char *ifconfig_local; + const char *ifconfig_ipv6_local; + bool routes_defined; struct route_option_list *routes;