From: Lev Stipakov Date: Mon, 2 Mar 2015 17:58:31 +0000 (+0200) Subject: Fast recovery when host is in unreachable network X-Git-Tag: v2.4_alpha1~228 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=99daa6b19270775006f034f21936c98a9005477d;p=thirdparty%2Fopenvpn.git 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 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 --- diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c index 7a5d38385..513fbae9b 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 {