fix tun device

This commit is contained in:
ginuerzh
2025-02-11 23:12:46 +08:00
parent 2132268780
commit 75a106ee84
2 changed files with 40 additions and 23 deletions
+1 -8
View File
@@ -14,13 +14,11 @@ import (
)
const (
defaultMTU = 1350
defaultReadBufferSize = 4096
defaultMTU = 1420
)
type metadata struct {
config *tun_util.Config
readBufferSize int
}
func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) {
@@ -34,11 +32,6 @@ func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) {
gateway = "gw"
)
l.md.readBufferSize = mdutil.GetInt(md, "tun.rbuf", "rbuf", "readBufferSize")
if l.md.readBufferSize <= 0 {
l.md.readBufferSize = defaultReadBufferSize
}
config := &tun_util.Config{
Name: mdutil.GetString(md, name),
Peer: mdutil.GetString(md, peer),
+36 -12
View File
@@ -2,34 +2,58 @@ package tun
import (
"io"
"math"
"github.com/go-gost/core/common/bufpool"
"golang.zx2c4.com/wireguard/tun"
)
const (
tunOffsetBytes = 16
MaxMessageSize = math.MaxUint16
)
type tunDevice struct {
dev tun.Device
readBufferSize int
elems [][MaxMessageSize]byte
rbufs [][]byte
wbuf [tunOffsetBytes + MaxMessageSize]byte
}
func (d *tunDevice) Read(p []byte) (n int, err error) {
sizes := [1]int{}
_, err = d.dev.Read([][]byte{p}, sizes[:], 0)
n = sizes[0]
if len(d.rbufs) > 0 {
n = copy(p, d.rbufs[0])
d.rbufs = d.rbufs[1:]
return
}
sizes := make([]int, len(d.elems))
bufs := make([][]byte, len(d.elems))
for i := range d.elems {
bufs[i] = d.elems[i][:]
}
nn, err := d.dev.Read(bufs, sizes, 0)
if err != nil {
return
}
for i := 0; i < nn; i++ {
if sizes[i] <= 0 {
continue
}
d.rbufs = append(d.rbufs, bufs[i][:sizes[i]])
}
n = copy(p, d.rbufs[0])
d.rbufs = d.rbufs[1:]
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)
_, err = d.dev.Write([][]byte{b}, tunOffsetBytes)
n = len(p)
buf := d.wbuf[:]
n = copy(buf[tunOffsetBytes:], p)
_, err = d.dev.Write([][]byte{buf[:tunOffsetBytes+n]}, tunOffsetBytes)
return
}
@@ -45,7 +69,7 @@ func (l *tunListener) createTunDevice() (dev io.ReadWriteCloser, name string, er
dev = &tunDevice{
dev: ifce,
readBufferSize: l.md.readBufferSize,
elems: make([][MaxMessageSize]byte, ifce.BatchSize()),
}
name, err = ifce.Name()