diff --git a/listener/tun/metadata.go b/listener/tun/metadata.go index 0b0154d3..ded8cfe1 100644 --- a/listener/tun/metadata.go +++ b/listener/tun/metadata.go @@ -14,13 +14,11 @@ import ( ) const ( - defaultMTU = 1350 - defaultReadBufferSize = 4096 + defaultMTU = 1420 ) type metadata struct { - config *tun_util.Config - readBufferSize int + config *tun_util.Config } 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), diff --git a/listener/tun/tun.go b/listener/tun/tun.go index ba710ee4..975f83d6 100644 --- a/listener/tun/tun.go +++ b/listener/tun/tun.go @@ -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 + dev tun.Device + 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 } @@ -44,8 +68,8 @@ func (l *tunListener) createTunDevice() (dev io.ReadWriteCloser, name string, er } dev = &tunDevice{ - dev: ifce, - readBufferSize: l.md.readBufferSize, + dev: ifce, + elems: make([][MaxMessageSize]byte, ifce.BatchSize()), } name, err = ifce.Name()