fix tun device
This commit is contained in:
@@ -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),
|
||||
|
||||
+38
-14
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user