diff --git a/src/tuntap/conn.go b/src/tuntap/conn.go index 0bb4efdc..1881bdea 100644 --- a/src/tuntap/conn.go +++ b/src/tuntap/conn.go @@ -54,13 +54,13 @@ func (s *tunConn) reader() (err error) { s.tun.log.Debugln("Starting conn reader for", s.conn.String()) defer s.tun.log.Debugln("Stopping conn reader for", s.conn.String()) var n int - b := make([]byte, 65535) for { select { case <-s.stop: return nil default: } + b := util.ResizeBytes(util.GetBytes(), 65535) if n, err = s.conn.Read(b); err != nil { if e, eok := err.(yggdrasil.ConnError); eok && !e.Temporary() { if e.Closed() { @@ -71,9 +71,10 @@ func (s *tunConn) reader() (err error) { return e } } else if n > 0 { - bs := append(util.GetBytes(), b[:n]...) - s.tun.send <- bs + s.tun.send <- b[:n] s.stillAlive() + } else { + util.PutBytes(b) } } } diff --git a/src/tuntap/iface.go b/src/tuntap/iface.go index 1cee9b45..670f7829 100644 --- a/src/tuntap/iface.go +++ b/src/tuntap/iface.go @@ -139,8 +139,10 @@ func (tun *TunAdapter) readerPacketHandler(ch chan []byte) { continue } } - // Shift forward to avoid leaking bytes off the front of the slide when we eventually store it - bs = append(recvd[:0], bs...) + if offset != 0 { + // Shift forward to avoid leaking bytes off the front of the slice when we eventually store it + bs = append(recvd[:0], bs...) + } // From the IP header, work out what our source and destination addresses // and node IDs are. We will need these in order to work out where to send // the packet @@ -277,11 +279,12 @@ func (tun *TunAdapter) readerPacketHandler(ch chan []byte) { } func (tun *TunAdapter) reader() error { - recvd := make([]byte, 65535+tun_ETHER_HEADER_LENGTH) toWorker := make(chan []byte, 32) defer close(toWorker) go tun.readerPacketHandler(toWorker) for { + // Get a slice to store the packet in + recvd := util.ResizeBytes(util.GetBytes(), 65535+tun_ETHER_HEADER_LENGTH) // Wait for a packet to be delivered to us through the TUN/TAP adapter n, err := tun.iface.Read(recvd) if err != nil { @@ -291,9 +294,10 @@ func (tun *TunAdapter) reader() error { panic(err) } if n == 0 { + util.PutBytes(recvd) continue } - bs := append(util.GetBytes(), recvd[:n]...) - toWorker <- bs + // Send the packet to the worker + toWorker <- recvd[:n] } }