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
+2 -9
View File
@@ -14,13 +14,11 @@ import (
) )
const ( const (
defaultMTU = 1350 defaultMTU = 1420
defaultReadBufferSize = 4096
) )
type metadata struct { type metadata struct {
config *tun_util.Config config *tun_util.Config
readBufferSize int
} }
func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) { func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) {
@@ -34,11 +32,6 @@ func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) {
gateway = "gw" 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{ config := &tun_util.Config{
Name: mdutil.GetString(md, name), Name: mdutil.GetString(md, name),
Peer: mdutil.GetString(md, peer), Peer: mdutil.GetString(md, peer),
+38 -14
View File
@@ -2,34 +2,58 @@ package tun
import ( import (
"io" "io"
"math"
"github.com/go-gost/core/common/bufpool"
"golang.zx2c4.com/wireguard/tun" "golang.zx2c4.com/wireguard/tun"
) )
const ( const (
tunOffsetBytes = 16 tunOffsetBytes = 16
MaxMessageSize = math.MaxUint16
) )
type tunDevice struct { type tunDevice struct {
dev tun.Device dev tun.Device
readBufferSize int elems [][MaxMessageSize]byte
rbufs [][]byte
wbuf [tunOffsetBytes + MaxMessageSize]byte
} }
func (d *tunDevice) Read(p []byte) (n int, err error) { func (d *tunDevice) Read(p []byte) (n int, err error) {
sizes := [1]int{} if len(d.rbufs) > 0 {
_, err = d.dev.Read([][]byte{p}, sizes[:], 0) n = copy(p, d.rbufs[0])
n = sizes[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 return
} }
func (d *tunDevice) Write(p []byte) (n int, err error) { func (d *tunDevice) Write(p []byte) (n int, err error) {
b := bufpool.Get(tunOffsetBytes + len(p)) buf := d.wbuf[:]
defer bufpool.Put(b) n = copy(buf[tunOffsetBytes:], p)
_, err = d.dev.Write([][]byte{buf[:tunOffsetBytes+n]}, tunOffsetBytes)
copy(b[tunOffsetBytes:], p)
_, err = d.dev.Write([][]byte{b}, tunOffsetBytes)
n = len(p)
return return
} }
@@ -44,8 +68,8 @@ func (l *tunListener) createTunDevice() (dev io.ReadWriteCloser, name string, er
} }
dev = &tunDevice{ dev = &tunDevice{
dev: ifce, dev: ifce,
readBufferSize: l.md.readBufferSize, elems: make([][MaxMessageSize]byte, ifce.BatchSize()),
} }
name, err = ifce.Name() name, err = ifce.Name()