x/listener/tun/tun.go
2022-12-23 18:56:58 +08:00

66 lines
1.2 KiB
Go

package tun
import (
"io"
"github.com/go-gost/core/common/bufpool"
"golang.zx2c4.com/wireguard/tun"
)
const (
tunOffsetBytes = 4
)
type tunDevice struct {
dev tun.Device
readBufferSize int
}
func (d *tunDevice) Read(p []byte) (n int, err error) {
rbuf := d.readBufferSize
if rbuf <= tunOffsetBytes {
rbuf = defaultReadBufferSize
}
b := bufpool.Get(rbuf)
defer bufpool.Put(b)
n, err = d.dev.Read(*b, tunOffsetBytes)
if n <= tunOffsetBytes || err != nil {
d.dev.Flush()
if n <= tunOffsetBytes {
err = io.EOF
}
return
}
n = copy(p, (*b)[tunOffsetBytes:tunOffsetBytes+n])
return
}
func (d *tunDevice) Write(p []byte) (n int, err error) {
b := bufpool.Get(tunOffsetBytes + len(p))
defer bufpool.Put(b)
copy((*b)[tunOffsetBytes:], p)
return d.dev.Write(*b, tunOffsetBytes)
}
func (d *tunDevice) Close() error {
return d.dev.Close()
}
func (l *tunListener) createTunDevice() (dev io.ReadWriteCloser, name string, err error) {
ifce, err := tun.CreateTUN(l.md.config.Name, l.md.config.MTU)
if err != nil {
return
}
dev = &tunDevice{
dev: ifce,
readBufferSize: l.md.readBufferSize,
}
name, err = ifce.Name()
return
}