Fix: avoid extra copy on windows

This commit is contained in:
xjasonlyu
2021-02-14 20:25:04 +08:00
parent 361a8133c9
commit 0e1e04acc7
6 changed files with 40 additions and 31 deletions

View File

@@ -0,0 +1,29 @@
// +build darwin freebsd linux,!amd64,!arm64 openbsd
package tun
import (
"github.com/xjasonlyu/tun2socks/common/pool"
)
const offset = 4 /* 4 bytes TUN_PI */
func (t *TUN) Read(packet []byte) (n int, err error) {
buf := pool.Get(offset + len(packet))
defer pool.Put(buf)
if n, err = t.nt.Read(buf, offset); err != nil {
return
}
copy(packet, buf[offset:offset+n])
return
}
func (t *TUN) Write(packet []byte) (int, error) {
buf := pool.Get(offset + len(packet))
defer pool.Put(buf)
copy(buf[offset:], packet)
return t.nt.Write(buf[:offset+len(packet)], offset)
}

View File

@@ -0,0 +1,11 @@
package tun
const offset = 0
func (t *TUN) Read(packet []byte) (int, error) {
return t.nt.Read(packet, offset)
}
func (t *TUN) Write(packet []byte) (int, error) {
return t.nt.Write(packet, offset)
}

View File

@@ -1,5 +0,0 @@
// +build darwin freebsd linux openbsd
package tun
const offset = 4 /* 4 bytes TUN_PI */

View File

@@ -1,3 +0,0 @@
package tun
const offset = 0

View File

@@ -108,5 +108,3 @@ func setMTU(name string, n uint32) error {
return nil
}
var _ = offset /* ignore static check */

View File

@@ -5,7 +5,6 @@ package tun
import (
"fmt"
"github.com/xjasonlyu/tun2socks/common/pool"
"github.com/xjasonlyu/tun2socks/core/device"
"github.com/xjasonlyu/tun2socks/core/device/rwbased"
@@ -48,26 +47,6 @@ func Open(opts ...Option) (device.Device, error) {
return t, nil
}
func (t *TUN) Read(packet []byte) (n int, err error) {
buf := pool.Get(offset + len(packet))
defer pool.Put(buf)
if n, err = t.nt.Read(buf, offset); err != nil {
return
}
copy(packet, buf[offset:offset+n])
return
}
func (t *TUN) Write(packet []byte) (int, error) {
buf := pool.Get(offset + len(packet))
defer pool.Put(buf)
copy(buf[offset:], packet)
return t.nt.Write(buf[:offset+len(packet)], offset)
}
func (t *TUN) Name() string {
name, _ := t.nt.Name()
return name