[Openvpn-devel,v2] Preserve ifconfig(_ipv6)_local across reconnect

Message ID 20251009171916.12811-1-gert@greenie.muc.de
State New
Headers show
Series [Openvpn-devel,v2] Preserve ifconfig(_ipv6)_local across reconnect | expand

Commit Message

Gert Doering Oct. 9, 2025, 5:19 p.m. UTC
From: Lev Stipakov <lev@openvpn.net>

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 <lev@openvpn.net>
Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1248
---

This change was reviewed on Gerrit and approved by at least one
developer. I request to merge it to master.

Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1248
This mail reflects revision 2 of this Change.

Acked-by according to Gerrit (reflected above):

Comments

Gert Doering Oct. 9, 2025, 5:33 p.m. UTC | #1
Tested, fixes a larger part of the issue in #850, opens the way for a
new issue in #863 (something "not working right" that was working "not
at all" without this).

Your patch has been applied to the master branch.

commit 8a8360fc176b3996bfefee0ea894dc5c8a9ead1a
Author: Lev Stipakov
Date:   Thu Oct 9 19:19:11 2025 +0200

     Preserve ifconfig(_ipv6)_local across reconnect

     Signed-off-by: Lev Stipakov <lev@openvpn.net>
     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 <gert@greenie.muc.de>


--
kind regards,

Gert Doering

Patch

diff --git a/src/openvpn/options.c b/src/openvpn/options.c
index f35738d..d1ce551 100644
--- a/src/openvpn/options.c
+++ b/src/openvpn/options.c
@@ -3143,6 +3143,9 @@ 
         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 @@ 
             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 b033068..445fd25 100644
--- a/src/openvpn/options.h
+++ b/src/openvpn/options.h
@@ -64,6 +64,9 @@ 
     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;