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