eliminate some more copying between slices

This commit is contained in:
Arceliar 2019-08-04 14:50:19 -05:00
parent f52955ee0f
commit 75b931f37e
2 changed files with 13 additions and 8 deletions

View File

@ -54,13 +54,13 @@ func (s *tunConn) reader() (err error) {
s.tun.log.Debugln("Starting conn reader for", s.conn.String()) s.tun.log.Debugln("Starting conn reader for", s.conn.String())
defer s.tun.log.Debugln("Stopping conn reader for", s.conn.String()) defer s.tun.log.Debugln("Stopping conn reader for", s.conn.String())
var n int var n int
b := make([]byte, 65535)
for { for {
select { select {
case <-s.stop: case <-s.stop:
return nil return nil
default: default:
} }
b := util.ResizeBytes(util.GetBytes(), 65535)
if n, err = s.conn.Read(b); err != nil { if n, err = s.conn.Read(b); err != nil {
if e, eok := err.(yggdrasil.ConnError); eok && !e.Temporary() { if e, eok := err.(yggdrasil.ConnError); eok && !e.Temporary() {
if e.Closed() { if e.Closed() {
@ -71,9 +71,10 @@ func (s *tunConn) reader() (err error) {
return e return e
} }
} else if n > 0 { } else if n > 0 {
bs := append(util.GetBytes(), b[:n]...) s.tun.send <- b[:n]
s.tun.send <- bs
s.stillAlive() s.stillAlive()
} else {
util.PutBytes(b)
} }
} }
} }

View File

@ -139,8 +139,10 @@ func (tun *TunAdapter) readerPacketHandler(ch chan []byte) {
continue continue
} }
} }
// Shift forward to avoid leaking bytes off the front of the slide when we eventually store it 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...) bs = append(recvd[:0], bs...)
}
// From the IP header, work out what our source and destination addresses // 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 // and node IDs are. We will need these in order to work out where to send
// the packet // the packet
@ -277,11 +279,12 @@ func (tun *TunAdapter) readerPacketHandler(ch chan []byte) {
} }
func (tun *TunAdapter) reader() error { func (tun *TunAdapter) reader() error {
recvd := make([]byte, 65535+tun_ETHER_HEADER_LENGTH)
toWorker := make(chan []byte, 32) toWorker := make(chan []byte, 32)
defer close(toWorker) defer close(toWorker)
go tun.readerPacketHandler(toWorker) go tun.readerPacketHandler(toWorker)
for { 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 // Wait for a packet to be delivered to us through the TUN/TAP adapter
n, err := tun.iface.Read(recvd) n, err := tun.iface.Read(recvd)
if err != nil { if err != nil {
@ -291,9 +294,10 @@ func (tun *TunAdapter) reader() error {
panic(err) panic(err)
} }
if n == 0 { if n == 0 {
util.PutBytes(recvd)
continue continue
} }
bs := append(util.GetBytes(), recvd[:n]...) // Send the packet to the worker
toWorker <- bs toWorker <- recvd[:n]
} }
} }