]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Persist DCO client data channel traffic stats on restart
authorSelva Nair <selva.nair@gmail.com>
Thu, 15 Dec 2022 23:21:04 +0000 (18:21 -0500)
committerGert Doering <gert@greenie.muc.de>
Mon, 19 Dec 2022 18:13:18 +0000 (19:13 +0100)
Signed-off-by: Selva Nair <selva.nair@gmail.com>
Acked-by: Lev Stipakov <lstipakov@gmail.com>
Message-Id: <20221215232104.1181936-1-selva.nair@gmail.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg25742.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
src/openvpn/init.c
src/openvpn/init.h
src/openvpn/manage.c
src/openvpn/manage.h
src/openvpn/openvpn.c

index 219bff84c8888e96c93ca44f5ce0046c34b6f4a7..e36014730cf4f704b9ef76cca2ab5670f9516c06 100644 (file)
@@ -4165,6 +4165,17 @@ uninit_management_callback(void)
 #endif
 }
 
+void
+persist_client_stats(struct context *c)
+{
+#ifdef ENABLE_MANAGEMENT
+    if (management)
+    {
+        man_persist_client_stats(management, c);
+    }
+#endif
+}
+
 /*
  * Initialize a tunnel instance, handle pre and post-init
  * signal settings.
index f53b65eee82a544f134d176eb19779e4952f703c..d0fb6ea131a0e3c42ff7eac46213845d4136c993 100644 (file)
@@ -147,4 +147,6 @@ void write_pid_file(const char *filename, const char *chroot_dir);
 
 void remove_pid_file(void);
 
+void persist_client_stats(struct context *c);
+
 #endif /* ifndef INIT_H */
index 9349b62ad00030419d3c1c5f696e6bf686195a87..b11de224da1768a2e04059f197090b1c32e37f77 100644 (file)
@@ -4068,6 +4068,19 @@ management_check_bytecount(struct context *c, struct management *man, struct tim
     }
 }
 
+/* DCO resets stats on reconnect. Since client expects stats
+ * to be preserved across reconnects, we need to save DCO
+ * stats before tearing the tunnel down.
+ */
+void
+man_persist_client_stats(struct management *man, struct context *c)
+{
+    if (dco_enabled(&c->options) && (dco_get_peer_stats(c) == 0))
+    {
+        management_bytes_client(man, c->c2.dco_read_bytes, c->c2.dco_write_bytes);
+    }
+}
+
 #else  /* ifdef ENABLE_MANAGEMENT */
 
 void
index 700b15cfb8c54c823248fcadc6fa1e75597bdcfc..30291e42b93ee9bc5c6f0a30720cc6dad5e69c84 100644 (file)
@@ -548,6 +548,9 @@ management_bytes_server(struct management *man,
     }
 }
 
+void
+man_persist_client_stats(struct management *man, struct context *c);
+
 #endif /* ifdef ENABLE_MANAGEMENT */
 
 /**
index 15e21452b6f104a4974d9facbf63de15a425ca39..413a750b0728815907ac6a868d48abea7703fd9d 100644 (file)
@@ -97,6 +97,8 @@ tunnel_point_to_point(struct context *c)
         perf_pop();
     }
 
+    persist_client_stats(c);
+
     uninit_management_callback();
 
     /* tear down tunnel instance (unless --persist-tun) */