mirror of
https://github.com/slackhq/nebula.git
synced 2025-11-23 00:44:25 +01:00
multiqueue but it doesn't help
This commit is contained in:
@@ -301,7 +301,7 @@ func (f *Interface) listenOut(q int) {
|
|||||||
for i := 0; i < len(toSend); i += batch {
|
for i := 0; i < len(toSend); i += batch {
|
||||||
x := min(len(toSend[i:]), batch)
|
x := min(len(toSend[i:]), batch)
|
||||||
toSendThisTime := toSend[i : i+x]
|
toSendThisTime := toSend[i : i+x]
|
||||||
_, err := f.readers[q].WriteMany(toSendThisTime)
|
_, err := f.readers[q].WriteMany(toSendThisTime, q)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
f.l.WithError(err).Error("Failed to write messages")
|
f.l.WithError(err).Error("Failed to write messages")
|
||||||
}
|
}
|
||||||
@@ -332,7 +332,7 @@ func (f *Interface) listenIn(reader overlay.TunDev, queueNum int) {
|
|||||||
|
|
||||||
for {
|
for {
|
||||||
|
|
||||||
n, err := reader.ReadMany(packets)
|
n, err := reader.ReadMany(packets, queueNum)
|
||||||
//todo!!
|
//todo!!
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, os.ErrClosed) && f.closed.Load() {
|
if errors.Is(err, os.ErrClosed) && f.closed.Load() {
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ const DefaultMTU = 1300
|
|||||||
|
|
||||||
type TunDev interface {
|
type TunDev interface {
|
||||||
io.WriteCloser
|
io.WriteCloser
|
||||||
ReadMany([]*packet.VirtIOPacket) (int, error)
|
ReadMany(x []*packet.VirtIOPacket, q int) (int, error)
|
||||||
WriteMany([][]byte) (int, error)
|
WriteMany(x [][]byte, q int) (int, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: We may be able to remove routines
|
// TODO: We may be able to remove routines
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ func (t *disabledTun) Write(b []byte) (int, error) {
|
|||||||
return len(b), nil
|
return len(b), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *disabledTun) WriteMany(b [][]byte) (int, error) {
|
func (t *disabledTun) WriteMany(b [][]byte, _ int) (int, error) {
|
||||||
out := 0
|
out := 0
|
||||||
for i := range b {
|
for i := range b {
|
||||||
x, err := t.Write(b[i])
|
x, err := t.Write(b[i])
|
||||||
@@ -123,7 +123,7 @@ func (t *disabledTun) WriteMany(b [][]byte) (int, error) {
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *disabledTun) ReadMany(b []*packet.VirtIOPacket) (int, error) {
|
func (t *disabledTun) ReadMany(b []*packet.VirtIOPacket, _ int) (int, error) {
|
||||||
return t.Read(b[0].Payload)
|
return t.Read(b[0].Payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"syscall"
|
|
||||||
"time"
|
"time"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
@@ -29,7 +28,7 @@ import (
|
|||||||
type tun struct {
|
type tun struct {
|
||||||
file *os.File
|
file *os.File
|
||||||
fd int
|
fd int
|
||||||
vdev *vhostnet.Device
|
vdev []*vhostnet.Device
|
||||||
Device string
|
Device string
|
||||||
vpnNetworks []netip.Prefix
|
vpnNetworks []netip.Prefix
|
||||||
MaxMTU int
|
MaxMTU int
|
||||||
@@ -108,7 +107,7 @@ func newTun(c *config.C, l *logrus.Logger, vpnNetworks []netip.Prefix, multiqueu
|
|||||||
var req ifReq
|
var req ifReq
|
||||||
req.Flags = uint16(unix.IFF_TUN | unix.IFF_NO_PI | unix.IFF_TUN_EXCL | unix.IFF_VNET_HDR)
|
req.Flags = uint16(unix.IFF_TUN | unix.IFF_NO_PI | unix.IFF_TUN_EXCL | unix.IFF_VNET_HDR)
|
||||||
if multiqueue {
|
if multiqueue {
|
||||||
//req.Flags |= unix.IFF_MULTI_QUEUE
|
req.Flags |= unix.IFF_MULTI_QUEUE
|
||||||
}
|
}
|
||||||
copy(req.Name[:], c.GetString("tun.dev", ""))
|
copy(req.Name[:], c.GetString("tun.dev", ""))
|
||||||
if err = ioctl(uintptr(fd), uintptr(unix.TUNSETIFF), uintptr(unsafe.Pointer(&req))); err != nil {
|
if err = ioctl(uintptr(fd), uintptr(unix.TUNSETIFF), uintptr(unsafe.Pointer(&req))); err != nil {
|
||||||
@@ -135,17 +134,6 @@ func newTun(c *config.C, l *logrus.Logger, vpnNetworks []netip.Prefix, multiqueu
|
|||||||
return nil, fmt.Errorf("set offloads: %w", err)
|
return nil, fmt.Errorf("set offloads: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
//name := strings.Trim(c.GetString("tun.dev", ""), "\x00")
|
|
||||||
//tundev, err := tuntap.NewDevice(
|
|
||||||
// tuntap.WithName(name),
|
|
||||||
// tuntap.WithDeviceType(tuntap.DeviceTypeTUN), //todo wtf
|
|
||||||
// tuntap.WithVirtioNetHdr(true), //todo hmm
|
|
||||||
// tuntap.WithOffloads(unix.TUN_F_CSUM|unix.TUN_F_USO4|unix.TUN_F_USO6), //todo
|
|
||||||
//)
|
|
||||||
//if err != nil {
|
|
||||||
// return nil, err
|
|
||||||
//}
|
|
||||||
|
|
||||||
t, err := newTunGeneric(c, l, file, vpnNetworks)
|
t, err := newTunGeneric(c, l, file, vpnNetworks)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -160,7 +148,7 @@ func newTun(c *config.C, l *logrus.Logger, vpnNetworks []netip.Prefix, multiqueu
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
t.vdev = vdev
|
t.vdev = []*vhostnet.Device{vdev}
|
||||||
|
|
||||||
return t, nil
|
return t, nil
|
||||||
}
|
}
|
||||||
@@ -259,22 +247,29 @@ func (t *tun) reload(c *config.C, initial bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *tun) NewMultiQueueReader() (TunDev, error) {
|
func (t *tun) NewMultiQueueReader() (TunDev, error) {
|
||||||
//fd, err := unix.Open("/dev/net/tun", os.O_RDWR, 0)
|
fd, err := unix.Open("/dev/net/tun", os.O_RDWR, 0)
|
||||||
//if err != nil {
|
if err != nil {
|
||||||
// return nil, err
|
return nil, err
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//var req ifReq
|
|
||||||
//req.Flags = uint16(unix.IFF_TUN | unix.IFF_NO_PI | unix.IFF_MULTI_QUEUE)
|
|
||||||
//copy(req.Name[:], t.Device)
|
|
||||||
//if err = ioctl(uintptr(fd), uintptr(unix.TUNSETIFF), uintptr(unsafe.Pointer(&req))); err != nil {
|
|
||||||
// return nil, err
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//file := os.NewFile(uintptr(fd), "/dev/net/tun")
|
|
||||||
|
|
||||||
//return file, nil
|
var req ifReq
|
||||||
return nil, syscall.ENOTSUP
|
req.Flags = uint16(unix.IFF_TUN | unix.IFF_NO_PI | unix.IFF_MULTI_QUEUE)
|
||||||
|
copy(req.Name[:], t.Device)
|
||||||
|
if err = ioctl(uintptr(fd), uintptr(unix.TUNSETIFF), uintptr(unsafe.Pointer(&req))); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
vdev, err := vhostnet.NewDevice(
|
||||||
|
vhostnet.WithBackendFD(fd),
|
||||||
|
vhostnet.WithQueueSize(8192), //todo config
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
t.vdev = append(t.vdev, vdev)
|
||||||
|
|
||||||
|
return t, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *tun) RoutesFor(ip netip.Addr) routing.Gateways {
|
func (t *tun) RoutesFor(ip netip.Addr) routing.Gateways {
|
||||||
@@ -694,8 +689,10 @@ func (t *tun) Close() error {
|
|||||||
close(t.routeChan)
|
close(t.routeChan)
|
||||||
}
|
}
|
||||||
|
|
||||||
if t.vdev != nil {
|
for _, v := range t.vdev {
|
||||||
_ = t.vdev.Close()
|
if v != nil {
|
||||||
|
_ = v.Close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if t.file != nil {
|
if t.file != nil {
|
||||||
@@ -709,8 +706,8 @@ func (t *tun) Close() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *tun) ReadMany(p []*packet.VirtIOPacket) (int, error) {
|
func (t *tun) ReadMany(p []*packet.VirtIOPacket, q int) (int, error) {
|
||||||
n, err := t.vdev.ReceivePackets(p) //we are TXing
|
n, err := t.vdev[q].ReceivePackets(p) //we are TXing
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
@@ -730,7 +727,7 @@ func (t *tun) Write(b []byte) (int, error) {
|
|||||||
NumBuffers: 0,
|
NumBuffers: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
err := t.vdev.TransmitPackets(hdr, [][]byte{b})
|
err := t.vdev[0].TransmitPackets(hdr, [][]byte{b})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.l.WithError(err).Error("Transmitting packet")
|
t.l.WithError(err).Error("Transmitting packet")
|
||||||
return 0, err
|
return 0, err
|
||||||
@@ -738,7 +735,7 @@ func (t *tun) Write(b []byte) (int, error) {
|
|||||||
return maximum, nil
|
return maximum, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *tun) WriteMany(b [][]byte) (int, error) {
|
func (t *tun) WriteMany(b [][]byte, q int) (int, error) {
|
||||||
maximum := len(b) //we are RXing
|
maximum := len(b) //we are RXing
|
||||||
if maximum == 0 {
|
if maximum == 0 {
|
||||||
return 0, nil
|
return 0, nil
|
||||||
@@ -753,7 +750,7 @@ func (t *tun) WriteMany(b [][]byte) (int, error) {
|
|||||||
NumBuffers: 0,
|
NumBuffers: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
err := t.vdev.TransmitPackets(hdr, b)
|
err := t.vdev[q].TransmitPackets(hdr, b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.l.WithError(err).Error("Transmitting packet")
|
t.l.WithError(err).Error("Transmitting packet")
|
||||||
return 0, err
|
return 0, err
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import (
|
|||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/slackhq/nebula/config"
|
"github.com/slackhq/nebula/config"
|
||||||
"github.com/slackhq/nebula/overlay/virtqueue"
|
|
||||||
"github.com/slackhq/nebula/packet"
|
"github.com/slackhq/nebula/packet"
|
||||||
"github.com/slackhq/nebula/routing"
|
"github.com/slackhq/nebula/routing"
|
||||||
)
|
)
|
||||||
@@ -68,11 +67,11 @@ func (d *UserDevice) Close() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *UserDevice) ReadMany(b []*packet.VirtIOPacket) (int, error) {
|
func (d *UserDevice) ReadMany(b []*packet.VirtIOPacket, _ int) (int, error) {
|
||||||
return d.Read(b[0].Payload)
|
return d.Read(b[0].Payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *UserDevice) WriteMany(b [][]byte) (int, error) {
|
func (d *UserDevice) WriteMany(b [][]byte, _ int) (int, error) {
|
||||||
out := 0
|
out := 0
|
||||||
for i := range b {
|
for i := range b {
|
||||||
x, err := d.Write(b[i])
|
x, err := d.Write(b[i])
|
||||||
@@ -83,7 +82,3 @@ func (d *UserDevice) WriteMany(b [][]byte) (int, error) {
|
|||||||
}
|
}
|
||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*UserDevice) GetQueues() []*virtqueue.SplitQueue {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ func NewDevice(options ...Option) (*Device, error) {
|
|||||||
|
|
||||||
// Advertise the supported features. This isn't much for now.
|
// Advertise the supported features. This isn't much for now.
|
||||||
// TODO: Add feature options and implement proper feature negotiation.
|
// TODO: Add feature options and implement proper feature negotiation.
|
||||||
getFeatures, err := vhost.GetFeatures(dev.controlFD)
|
getFeatures, err := vhost.GetFeatures(dev.controlFD) //0x1033D008000 but why
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("get features: %w", err)
|
return nil, fmt.Errorf("get features: %w", err)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user