fix BatchRead interface & make batch size configurable

This commit is contained in:
Jay Wren
2025-10-23 14:37:26 -04:00
parent 0827a6f1c5
commit 8281b1699f
8 changed files with 29 additions and 60 deletions

View File

@@ -258,7 +258,6 @@ func (rm *tun) NewMultiQueueReader(t *wgTun) (io.ReadWriteCloser, error) {
return &wgTunReader{
parent: t,
tunDevice: t.tunDevice,
batchSize: 64,
offset: 0,
l: t.l,
}, nil

View File

@@ -214,7 +214,6 @@ func (rm *tun) NewMultiQueueReader(t *wgTun) (io.ReadWriteCloser, error) {
return &wgTunReader{
parent: t,
tunDevice: t.tunDevice,
batchSize: 64,
offset: 0,
l: t.l,
}, nil

View File

@@ -323,7 +323,6 @@ func (rm *tun) NewMultiQueueReader(t *wgTun) (io.ReadWriteCloser, error) {
return &wgTunReader{
parent: t,
tunDevice: t.tunDevice,
batchSize: 64, // Default batch size
offset: 0,
l: t.l,
}, nil

View File

@@ -196,7 +196,6 @@ func (rm *tun) NewMultiQueueReader(t *wgTun) (io.ReadWriteCloser, error) {
return &wgTunReader{
parent: t,
tunDevice: t.tunDevice,
batchSize: 64,
offset: 0,
l: t.l,
}, nil

View File

@@ -7,7 +7,6 @@ import (
"fmt"
"io"
"net/netip"
"sync"
"sync/atomic"
"github.com/gaissmai/bart"
@@ -37,7 +36,7 @@ type wgTun struct {
// BatchReader interface for readers that support vectorized I/O
type BatchReader interface {
BatchRead() ([][]byte, []int, error)
BatchRead(buffers [][]byte, sizes []int) (int, error)
}
// BatchWriter interface for writers that support vectorized I/O
@@ -47,24 +46,12 @@ type BatchWriter interface {
// wgTunReader wraps a single TUN queue for multi-queue support
type wgTunReader struct {
parent *wgTun
tunDevice wgtun.Device
buffers [][]byte
sizes []int
offset int
batchSize int
l *logrus.Logger
parent *wgTun
tunDevice wgtun.Device
offset int
l *logrus.Logger
}
var (
bufferPool = sync.Pool{
New: func() interface{} {
buf := make([]byte, 9001) // MTU size
return &buf
},
}
)
func (t *wgTun) Networks() []netip.Prefix {
return t.vpnNetworks
}
@@ -210,23 +197,9 @@ func (t *wgTun) reload(c *config.C, initial bool) error {
}
// BatchRead reads multiple packets from the TUN device using vectorized I/O
func (r *wgTunReader) BatchRead() ([][]byte, []int, error) {
// Reuse buffers from pool
if len(r.buffers) == 0 {
r.buffers = make([][]byte, r.batchSize)
r.sizes = make([]int, r.batchSize)
for i := 0; i < r.batchSize; i++ {
buf := bufferPool.Get().(*[]byte)
r.buffers[i] = (*buf)[:cap(*buf)]
}
}
n, err := r.tunDevice.Read(r.buffers, r.sizes, r.offset)
if err != nil {
return nil, nil, err
}
return r.buffers[:n], r.sizes[:n], nil
// The caller provides buffers and sizes slices, and this function returns the number of packets read.
func (r *wgTunReader) BatchRead(buffers [][]byte, sizes []int) (int, error) {
return r.tunDevice.Read(buffers, sizes, r.offset)
}
// Read implements io.Reader for wgTunReader (single packet for compatibility)
@@ -262,16 +235,6 @@ func (r *wgTunReader) BatchWrite(packets [][]byte) (int, error) {
}
func (r *wgTunReader) Close() error {
// Return buffers to pool
for i := range r.buffers {
if r.buffers[i] != nil {
bufferPool.Put(&r.buffers[i])
r.buffers[i] = nil
}
}
r.buffers = nil
r.sizes = nil
if r.tunDevice != nil {
return r.tunDevice.Close()
}

View File

@@ -175,7 +175,6 @@ func (rm *tun) NewMultiQueueReader(t *wgTun) (io.ReadWriteCloser, error) {
return &wgTunReader{
parent: t,
tunDevice: t.tunDevice,
batchSize: 64,
offset: 0,
l: t.l,
}, nil