From eec70bf2f22028a1cae5fe60f8a89dfbb84bc1b0 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Wed, 17 Jul 2019 13:53:16 +0100 Subject: [PATCH] Remove stillAlive code from TUN/TAP conn as it is no longer required with the new deadlines --- src/tuntap/conn.go | 45 ++++++++++----------------------------------- src/tuntap/tun.go | 1 - 2 files changed, 10 insertions(+), 36 deletions(-) diff --git a/src/tuntap/conn.go b/src/tuntap/conn.go index c5e6e81b..4cc880c1 100644 --- a/src/tuntap/conn.go +++ b/src/tuntap/conn.go @@ -64,16 +64,19 @@ func (s *tunConn) reader() error { s.conn.SetReadDeadline(time.Now().Add(tunConnTimeout)) if n, err = s.conn.Read(b); err != nil { s.tun.log.Errorln(s.conn.String(), "TUN/TAP conn read error:", err) - if e, eok := err.(yggdrasil.ConnError); eok { + if e, eok := err.(yggdrasil.ConnError); eok && !e.Temporary() { s.tun.log.Debugln("Conn reader helper", s, "error:", e) switch { - case e.Temporary(): - fallthrough + // The timeout probably means we've waited for the timeout period and + // nothing has happened so close the connection case e.Timeout(): - read <- false + s.close() continue + // The connection is already closed, so we anticipate that the main + // reader goroutine has already exited. Also stop in that case case e.Closed(): - fallthrough + return + // Some other case that we don't know about - close the connection default: s.close() return @@ -86,7 +89,7 @@ func (s *tunConn) reader() error { }() for { select { - case r, ok := <-read: + case r := <-read: if r && n > 0 { bs := append(util.GetBytes(), b[:n]...) select { @@ -95,9 +98,6 @@ func (s *tunConn) reader() error { util.PutBytes(bs) } } - if ok { - s.stillAlive() // TODO? Only stay alive if we read >0 bytes? - } case <-s.stop: return nil } @@ -123,6 +123,7 @@ func (s *tunConn) writer() error { return errors.New("send closed") } // TODO write timeout and close + s.conn.SetWriteDeadline(time.Now().Add(tunConnTimeout)) if _, err := s.conn.Write(b); err != nil { e, eok := err.(yggdrasil.ConnError) if !eok { @@ -141,32 +142,6 @@ func (s *tunConn) writer() error { } } util.PutBytes(b) - s.stillAlive() - } - } -} - -func (s *tunConn) stillAlive() { - select { - case s.alive <- struct{}{}: - default: - } -} - -func (s *tunConn) checkForTimeouts() error { - timer := time.NewTimer(tunConnTimeout) - defer util.TimerStop(timer) - defer s.close() - for { - select { - case _, ok := <-s.alive: - if !ok { - return errors.New("connection closed") - } - util.TimerStop(timer) - timer.Reset(tunConnTimeout) - case <-timer.C: - return errors.New("timed out") } } } diff --git a/src/tuntap/tun.go b/src/tuntap/tun.go index cc124971..72bdd2f0 100644 --- a/src/tuntap/tun.go +++ b/src/tuntap/tun.go @@ -259,7 +259,6 @@ func (tun *TunAdapter) wrap(conn *yggdrasil.Conn) (c *tunConn, err error) { // Start the connection goroutines go s.reader() go s.writer() - go s.checkForTimeouts() // Return return c, err }