[Openvpn-devel,v1] Reconnect when TCP is on use on network-change management command

Message ID 20250215152456.5691-1-gert@greenie.muc.de
State Accepted
Headers show
Series [Openvpn-devel,v1] Reconnect when TCP is on use on network-change management command | expand

Commit Message

Gert Doering Feb. 15, 2025, 3:24 p.m. UTC
From: Arne Schwabe <arne@rfc2549.org>

On some newer Android handsets, changing to a different network
often does not trigger a TCP reset but continues using the old
connection (e.g. using mobile connection when WiFi becomes available)

Force a reconnect in these situation to have a more expected beheaviour.

Change-Id: Id4febcceecab33ee5189cd67b249a15d12b84799
Signed-off-by: Arne Schwabe <arne@rfc2549.org>
Acked-by: Gert Doering <gert@greenie.muc.de>
---

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/+/891
This mail reflects revision 1 of this Change.

Acked-by according to Gerrit (reflected above):
Gert Doering <gert@greenie.muc.de>

Comments

Gert Doering Feb. 15, 2025, 3:36 p.m. UTC | #1
Tab-vs-Space fixed on the fly.

Your patch has been applied to the master branch.

commit 43abb412dd211836086e27b55f1bcd77626ad6f2
Author: Arne Schwabe
Date:   Sat Feb 15 16:24:56 2025 +0100

     Reconnect when TCP is on use on network-change management command

     Signed-off-by: Arne Schwabe <arne@rfc2549.org>
     Acked-by: Gert Doering <gert@greenie.muc.de>
     Message-Id: <20250215152456.5691-1-gert@greenie.muc.de>
     URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg30908.html
     Signed-off-by: Gert Doering <gert@greenie.muc.de>


--
kind regards,

Gert Doering

Patch

diff --git a/src/openvpn/init.c b/src/openvpn/init.c
index a7f7db4..b5eeeb8 100644
--- a/src/openvpn/init.c
+++ b/src/openvpn/init.c
@@ -4390,6 +4390,15 @@ 
         return -1;
     }
 
+    /* On some newer Android handsets, changing to a different network
+     * often does not trigger a TCP reset but continue using the old
+     * connection (e.g. using mobile connection when WiFi becomes available */
+    struct link_socket_info *lsi = get_link_socket_info(c);
+    if (lsi && proto_is_tcp(lsi->proto) && !samenetwork)
+    {
+        return -2;
+    }
+
     socketfd = c->c2.link_sockets[0]->sd;
     if (!c->options.pull || c->c2.tls_multi->use_peer_id || samenetwork)
     {