- When the number of retries per remote exceeds a limit
  (hard coded to 5), double the restart pause interval
  for each additional retry per remote.
- Trigger a SIGHUP to reset the retry count when the pause
  interval exceeds 1024 times the base value of restart pause.

The base value of restart pause is set using --connect-retry
(5 seconds by default). If it is set to zero no slow-down
will happen.

Signed-off-by: Selva Nair <selva.n...@gmail.com>
---
 src/openvpn/init.c |   12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/src/openvpn/init.c b/src/openvpn/init.c
index 498d36f..45e8878 100644
--- a/src/openvpn/init.c
+++ b/src/openvpn/init.c
@@ -1955,6 +1955,7 @@ static void
 socket_restart_pause (struct context *c)
 {
   int sec = 2;
+  int backoff = 0;

   switch (c->options.ce.proto)
     {
@@ -1977,6 +1978,17 @@ socket_restart_pause (struct context *c)
     sec = 10;
 #endif

+  /* Slow down reconnection after 5 retries per remote */
+  backoff = (c->options.unsuccessful_attempts / 
c->options.connection_list->len) - 5;
+  if (backoff > 0)
+    sec <<= min_int (backoff, 10);
+
+  if (backoff > 10 && sec > 0)
+    {
+      register_signal (c, SIGHUP, "Too many restarts");
+      return;
+    }
+
   if (c->persist.restart_sleep_seconds > 0 && c->persist.restart_sleep_seconds 
> sec)
     sec = c->persist.restart_sleep_seconds;
   else if (c->persist.restart_sleep_seconds == -1)
-- 
1.7.10.4


Reply via email to