[Openvpn-devel,3/3] Restore also ping related options on a reconnect

Message ID 20201209142045.4489-3-arne@rfc2549.org
State Superseded
Headers show
Series [Openvpn-devel,1/3] Move restoring pr pull options to initialising of c2 context | expand

Commit Message

Arne Schwabe Dec. 9, 2020, 3:20 a.m. UTC
This fixes the issue that if a client reconnects the next connection
entries inherits the keepalive settings that were pushed or set by
the previous entry. Since UDP+PULL entries have an implicit 120s
timeout, this timeout also got applied to a TCP session after an
UDP entry.

Reported-By: Jan Just Keijser <janjust@nikhef.nl>
Signed-off-by: Arne Schwabe <arne@rfc2549.org>
---
 src/openvpn/options.c | 9 +++++++++
 src/openvpn/options.h | 4 ++++
 2 files changed, 13 insertions(+)

Patch

diff --git a/src/openvpn/options.c b/src/openvpn/options.c
index 9ab2ead2..95201094 100644
--- a/src/openvpn/options.c
+++ b/src/openvpn/options.c
@@ -3600,6 +3600,11 @@  pre_pull_save(struct options *o)
         o->pre_pull->ciphername = o->ciphername;
         o->pre_pull->authname = o->authname;
         o->pre_pull->keysize = o->keysize;
+
+        /* Ping related options should be reset to the config values on reconnect */
+        o->pre_pull->ping_rec_timeout = o->ping_rec_timeout;
+        o->pre_pull->ping_rec_timeout_action = o->ping_rec_timeout_action;
+        o->pre_pull->ping_send_timeout = o->ping_send_timeout;
     }
 
 }
@@ -3651,6 +3656,10 @@  pre_pull_restore(struct options *o, struct gc_arena *gc)
         o->ciphername = pp->ciphername;
         o->authname = pp->authname;
         o->keysize = pp->keysize;
+
+        o->ping_rec_timeout = pp->ping_rec_timeout;
+        o->ping_rec_timeout_action = pp->ping_rec_timeout_action;
+        o->ping_send_timeout = pp->ping_send_timeout;
     }
 
     o->push_continuation = 0;
diff --git a/src/openvpn/options.h b/src/openvpn/options.h
index df0b4030..830ede47 100644
--- a/src/openvpn/options.h
+++ b/src/openvpn/options.h
@@ -79,6 +79,10 @@  struct options_pre_pull
     const char* authname;
     int keysize;
 
+    int ping_send_timeout;
+    int ping_rec_timeout;
+    int ping_rec_timeout_action;
+
     int foreign_option_index;
 };