summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLev Stipakov <lstipakov@gmail.com>2015-03-02 19:58:31 +0200
committerGert Doering <gert@greenie.muc.de>2015-10-10 10:21:59 +0200
commit99daa6b19270775006f034f21936c98a9005477d (patch)
tree0185b8709a777e16f36b033d531fed951fac4143
parentf7ef7522f5c7e6d4abfa5a0378c2e2ad265c65ec (diff)
downloadopenvpn-99daa6b19270775006f034f21936c98a9005477d.zip
openvpn-99daa6b19270775006f034f21936c98a9005477d.tar.gz
openvpn-99daa6b19270775006f034f21936c98a9005477d.tar.xz
Fast recovery when host is in unreachable network
When client connects to the server which is in unreachable network (for example hostname got resolved into ipv6 address and client has no ipv6), throw SIGUSR1 and connect to the next server without waiting 60 seconds for "TLS key negotiation failed". Acked-by: Arne Schwabe <arne@rfc2549.org> Message-Id: <1425319111-21291-1-git-send-email-lstipakov@gmail.com> URL: http://article.gmane.org/gmane.network.openvpn.devel/9498 Signed-off-by: Gert Doering <gert@greenie.muc.de>
-rw-r--r--src/openvpn/forward.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c
index 7a5d383..513fbae 100644
--- a/src/openvpn/forward.c
+++ b/src/openvpn/forward.c
@@ -1093,6 +1093,7 @@ void
process_outgoing_link (struct context *c)
{
struct gc_arena gc = gc_new ();
+ int error_code = 0;
perf_push (PERF_PROC_OUT_LINK);
@@ -1180,6 +1181,7 @@ process_outgoing_link (struct context *c)
}
/* Check return status */
+ error_code = openvpn_errno();
check_status (size, "write", c->c2.link_socket, NULL);
if (size > 0)
@@ -1196,6 +1198,14 @@ process_outgoing_link (struct context *c)
/* if not a ping/control message, indicate activity regarding --inactive parameter */
if (c->c2.buf.len > 0 )
register_activity (c, size);
+
+ /* for unreachable network and "connecting" state switch to the next host */
+ if (size < 0 && ENETUNREACH == error_code && !tls_initial_packet_received (c->c2.tls_multi)
+ && c->options.mode == MODE_POINT_TO_POINT)
+ {
+ msg (M_INFO, "Network unreachable, restarting");
+ register_signal (c, SIGUSR1, "network-unreachable");
+ }
}
else
{