use adaptive reconnect_interval
authorWu, Fengguang <fengguang.wu@intel.com>
Fri, 12 Dec 2008 14:23:43 +0000 (14:23 +0000)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Fri, 12 Dec 2008 14:32:42 +0000 (14:32 +0000)
Start reconnect attempts in 10s interval and enlarge
the interval by 10s each time until it reaches 100s.

This makes reasonable retry density for both small/large reconnect timeouts.

Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
cstp.c
main.c
openconnect.h

diff --git a/cstp.c b/cstp.c
index bb23665..fda4ec4 100644 (file)
--- a/cstp.c
+++ b/cstp.c
@@ -324,15 +324,24 @@ int make_cstp_connection(struct openconnect_info *vpninfo)
 
 static int cstp_reconnect(struct openconnect_info *vpninfo)
 {
-       int retries, nr_retries, ret;
+       int ret;
+       int timeout;
+       int interval;
        
-       nr_retries = vpninfo->reconnect_timeout / vpninfo->reconnect_interval;
+       timeout = vpninfo->reconnect_timeout;
+       interval = vpninfo->reconnect_interval;
 
        while ((ret = make_cstp_connection(vpninfo))) {
-               retries++;
-               if (retries >= nr_retries)
+               if (timeout <= 0)
                        return ret;
-               sleep(vpninfo->reconnect_interval);
+               vpninfo->progress(vpninfo, PRG_INFO,
+                                 "sleep %ds, remain timeout %ds\n",
+                                 interval, timeout);
+               sleep(interval);
+               timeout -= interval;
+               interval += vpninfo->reconnect_interval;
+               if (interval > RECONNECT_INTERVAL_MAX)
+                       interval = RECONNECT_INTERVAL_MAX;
        }
        return 0;
 }
diff --git a/main.c b/main.c
index 4eb1987..156aac4 100644 (file)
--- a/main.c
+++ b/main.c
@@ -157,7 +157,7 @@ int main(int argc, char **argv)
        vpninfo->deflate = 1;
        vpninfo->dtls_attempt_period = 60;
        vpninfo->max_qlen = 10;
-       vpninfo->reconnect_interval = 20;
+       vpninfo->reconnect_interval = RECONNECT_INTERVAL_MIN;
        vpninfo->reconnect_timeout = 300;
 
        if (RAND_bytes(vpninfo->dtls_secret, sizeof(vpninfo->dtls_secret)) != 1) {
index d7638a7..f270384 100644 (file)
@@ -69,6 +69,9 @@ struct split_include {
        struct split_include *next;
 };
 
+#define RECONNECT_INTERVAL_MIN 10
+#define RECONNECT_INTERVAL_MAX 100
+
 struct openconnect_info {
        char *redirect_url;