put linux tx_queue back

This commit is contained in:
Jay Wren
2025-10-23 16:06:13 -04:00
parent 4c0aad1b1f
commit 433c531ae4

View File

@@ -24,6 +24,7 @@ import (
type tun struct { type tun struct {
deviceIndex int deviceIndex int
ioctlFd uintptr ioctlFd uintptr
txQueueLen int
useSystemRoutes bool useSystemRoutes bool
useSystemRoutesBufferSize int useSystemRoutesBufferSize int
} }
@@ -55,6 +56,7 @@ func newTun(c *config.C, l *logrus.Logger, vpnNetworks []netip.Prefix, multiqueu
// Create Linux-specific route manager // Create Linux-specific route manager
routeManager := &tun{ routeManager := &tun{
txQueueLen: c.GetInt("tun.tx_queue", 500),
useSystemRoutes: c.GetBool("tun.use_system_route_table", false), useSystemRoutes: c.GetBool("tun.use_system_route_table", false),
useSystemRoutesBufferSize: c.GetInt("tun.use_system_route_table_buffer_size", 0), useSystemRoutesBufferSize: c.GetInt("tun.use_system_route_table_buffer_size", 0),
} }
@@ -97,6 +99,7 @@ func newTunFromFd(c *config.C, l *logrus.Logger, deviceFd int, vpnNetworks []net
// Create Linux-specific route manager // Create Linux-specific route manager
routeManager := &tun{ routeManager := &tun{
txQueueLen: c.GetInt("tun.tx_queue", 500),
useSystemRoutes: c.GetBool("tun.use_system_route_table", false), useSystemRoutes: c.GetBool("tun.use_system_route_table", false),
useSystemRoutesBufferSize: c.GetInt("tun.use_system_route_table_buffer_size", 0), useSystemRoutesBufferSize: c.GetInt("tun.use_system_route_table_buffer_size", 0),
} }
@@ -147,14 +150,13 @@ func (rm *tun) Activate(t *wgTun) error {
} }
rm.ioctlFd = uintptr(s) rm.ioctlFd = uintptr(s)
// Set the MTU
rm.SetMTU(t, t.MaxMTU) rm.SetMTU(t, t.MaxMTU)
// Set the transmit queue length // Set the transmit queue length
txQueueLen := 500 // default
devName := deviceBytes(name) devName := deviceBytes(name)
ifrq := ifreqQLEN{Name: devName, Value: int32(txQueueLen)} ifrq := ifreqQLEN{Name: devName, Value: int32(rm.txQueueLen)}
if err = ioctl(t.routeManager.ioctlFd, unix.SIOCSIFTXQLEN, uintptr(unsafe.Pointer(&ifrq))); err != nil { if err = ioctl(t.routeManager.ioctlFd, unix.SIOCSIFTXQLEN, uintptr(unsafe.Pointer(&ifrq))); err != nil {
// If we can't set the queue length nebula will still work but it may lead to packet loss
t.l.WithError(err).Error("Failed to set tun tx queue length") t.l.WithError(err).Error("Failed to set tun tx queue length")
} }
@@ -328,8 +330,6 @@ func (rm *tun) NewMultiQueueReader(t *wgTun) (io.ReadWriteCloser, error) {
}, nil }, nil
} }
// Helper functions
func deviceBytes(name string) [16]byte { func deviceBytes(name string) [16]byte {
var o [16]byte var o [16]byte
for i, c := range name { for i, c := range name {