diff --git a/src/tuntap/tun.go b/src/tuntap/tun.go index acdcf3a1..d9e0e77e 100644 --- a/src/tuntap/tun.go +++ b/src/tuntap/tun.go @@ -170,7 +170,7 @@ func (tun *TunAdapter) handler() error { // Accept the incoming connection conn, err := tun.listener.Accept() if err != nil { - tun.log.Errorln("TUN/TAP error accepting connection:", err) + tun.log.Errorln("TUN/TAP connection accept error:", err) return err } go tun.connReader(conn) @@ -195,7 +195,7 @@ func (tun *TunAdapter) connReader(conn *yggdrasil.Conn) error { for { n, err := conn.Read(b) if err != nil { - tun.log.Errorln("TUN/TAP read error:", err) + tun.log.Errorln("TUN/TAP conn read error:", err) return err } if n == 0 { @@ -203,11 +203,11 @@ func (tun *TunAdapter) connReader(conn *yggdrasil.Conn) error { } w, err := tun.iface.Write(b[:n]) if err != nil { - tun.log.Errorln("TUN/TAP failed to write to interface:", err) + tun.log.Errorln("TUN/TAP iface write error:", err) continue } if w != n { - tun.log.Errorln("TUN/TAP wrote", w, "instead of", n, "which is bad") + tun.log.Errorln("TUN/TAP iface write len didn't match conn read len") continue } } @@ -231,7 +231,7 @@ func (tun *TunAdapter) ifaceReader() error { if bs[0]&0xf0 == 0x60 { // Check if we have a fully-sized header if len(bs) < 40 { - panic("Tried to send a packet shorter than an IPv6 header...") + continue } // IPv6 address addrlen = 16 @@ -241,14 +241,14 @@ func (tun *TunAdapter) ifaceReader() error { } else if bs[0]&0xf0 == 0x40 { // Check if we have a fully-sized header if len(bs) < 20 { - panic("Tried to send a packet shorter than an IPv4 header...") + continue } // IPv4 address addrlen = 4 copy(srcAddr[:addrlen], bs[12:]) copy(dstAddr[:addrlen], bs[16:]) } else { - // Unknown address length + // Unknown address length or protocol continue } dstNodeID, dstNodeIDMask = dstAddr.GetNodeIDandMask() @@ -258,7 +258,7 @@ func (tun *TunAdapter) ifaceReader() error { tun.mutex.Unlock() w, err := conn.Write(bs) if err != nil { - tun.log.Println("Unable to write to remote:", err) + tun.log.Println("TUN/TAP conn write error:", err) continue } if w != n { @@ -271,7 +271,7 @@ func (tun *TunAdapter) ifaceReader() error { go tun.connReader(&conn) } else { tun.mutex.Unlock() - tun.log.Println("Error dialing:", err) + tun.log.Println("TUN/TAP dial error:", err) } } diff --git a/src/yggdrasil/conn.go b/src/yggdrasil/conn.go index ed9eb6cd..977c7421 100644 --- a/src/yggdrasil/conn.go +++ b/src/yggdrasil/conn.go @@ -2,6 +2,7 @@ package yggdrasil import ( "errors" + "fmt" "sync" "sync/atomic" "time" @@ -21,6 +22,10 @@ type Conn struct { expired bool } +func (c *Conn) String() string { + return fmt.Sprintf("c=%p", c) +} + // This method should only be called from the router goroutine func (c *Conn) startSearch() { searchCompleted := func(sinfo *sessionInfo, err error) { @@ -76,8 +81,8 @@ func (c *Conn) Read(b []byte) (int, error) { if c.session == nil { return 0, errors.New("searching for remote side") } - if !c.session.init.Load().(bool) { - return 0, errors.New("waiting for remote side to accept") + if init, ok := c.session.init.Load().(bool); !ok || (ok && !init) { + return 0, errors.New("waiting for remote side to accept " + c.String()) } select { case p, ok := <-c.session.recv: @@ -129,15 +134,12 @@ func (c *Conn) Write(b []byte) (bytesWritten int, err error) { return 0, errors.New("searching for remote side") } defer util.PutBytes(b) - if !c.session.init.Load().(bool) { - return 0, errors.New("waiting for remote side to accept") + if init, ok := c.session.init.Load().(bool); !ok || (ok && !init) { + return 0, errors.New("waiting for remote side to accept " + c.String()) } - // code isn't multithreaded so appending to this is safe coords := c.session.coords - // Prepare the payload c.session.myNonceMutex.Lock() payload, nonce := crypto.BoxSeal(&c.session.sharedSesKey, b, &c.session.myNonce) - c.session.myNonceMutex.Unlock() defer util.PutBytes(payload) p := wire_trafficPacket{ Coords: coords, @@ -146,6 +148,7 @@ func (c *Conn) Write(b []byte) (bytesWritten int, err error) { Payload: payload, } packet := p.encode() + c.session.myNonceMutex.Unlock() atomic.AddUint64(&c.session.bytesSent, uint64(len(b))) select { case c.session.send <- packet: