From 496dc94f02a58a210e38cf6b3c97a148719606a4 Mon Sep 17 00:00:00 2001 From: Arceliar Date: Sat, 16 Jun 2018 15:31:25 -0500 Subject: [PATCH] possibly mitigate livelock bug where lossy links lead to constant connect/disconnect cycles due to disagreement about which of the two duplicate autoconnection attempts to use --- src/yggdrasil/tcp.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/yggdrasil/tcp.go b/src/yggdrasil/tcp.go index 48695419..5408b6bf 100644 --- a/src/yggdrasil/tcp.go +++ b/src/yggdrasil/tcp.go @@ -26,6 +26,7 @@ import ( ) const tcp_msgSize = 2048 + 65535 // TODO figure out what makes sense +const tcp_timeout = 6 * time.Second // Wrapper function for non tcp/ip connections. func setNoDelay(c net.Conn, delay bool) { @@ -109,6 +110,8 @@ func (iface *tcpInterface) call(saddr string, socksaddr *string) { } else { iface.calls[saddr] = struct{}{} defer func() { + // Block new calls for a little while, to mitigate livelock scenarios + time.Sleep(tcp_timeout) iface.mutex.Lock() delete(iface.calls, saddr) iface.mutex.Unlock() @@ -162,7 +165,7 @@ func (iface *tcpInterface) handler(sock net.Conn, incoming bool) { if err != nil { return } - timeout := time.Now().Add(6 * time.Second) + timeout := time.Now().Add(tcp_timeout) sock.SetReadDeadline(timeout) _, err = sock.Read(metaBytes) if err != nil { @@ -257,7 +260,7 @@ func (iface *tcpInterface) handler(sock net.Conn, incoming bool) { atomic.AddUint64(&p.bytesSent, uint64(len(tcp_msg)+len(msgLen)+len(msg))) util_putBytes(msg) } - timerInterval := 4 * time.Second + timerInterval := tcp_timeout * 2 / 3 timer := time.NewTimer(timerInterval) defer timer.Stop() for { @@ -334,7 +337,7 @@ func (iface *tcpInterface) reader(sock net.Conn, in func([]byte)) { bs := make([]byte, 2*tcp_msgSize) frag := bs[:0] for { - timeout := time.Now().Add(6 * time.Second) + timeout := time.Now().Add(tcp_timeout) sock.SetReadDeadline(timeout) n, err := sock.Read(bs[len(frag):]) if err != nil || n == 0 {