mirror of
https://github.com/slackhq/nebula.git
synced 2025-11-22 16:34:25 +01:00
block less?
This commit is contained in:
@@ -8,7 +8,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/util"
|
"github.com/slackhq/nebula/util"
|
||||||
)
|
)
|
||||||
@@ -19,7 +18,6 @@ type TunDev interface {
|
|||||||
io.WriteCloser
|
io.WriteCloser
|
||||||
ReadMany([]*packet.VirtIOPacket) (int, error)
|
ReadMany([]*packet.VirtIOPacket) (int, error)
|
||||||
WriteMany([][]byte) (int, error)
|
WriteMany([][]byte) (int, error)
|
||||||
GetQueues() []*virtqueue.SplitQueue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: We may be able to remove routines
|
// TODO: We may be able to remove routines
|
||||||
|
|||||||
@@ -18,7 +18,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/vhostnet"
|
"github.com/slackhq/nebula/overlay/vhostnet"
|
||||||
"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"
|
||||||
"github.com/slackhq/nebula/util"
|
"github.com/slackhq/nebula/util"
|
||||||
@@ -52,10 +51,6 @@ func (t *tun) Networks() []netip.Prefix {
|
|||||||
return t.vpnNetworks
|
return t.vpnNetworks
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *tun) GetQueues() []*virtqueue.SplitQueue {
|
|
||||||
return []*virtqueue.SplitQueue{t.vdev.ReceiveQueue, t.vdev.TransmitQueue}
|
|
||||||
}
|
|
||||||
|
|
||||||
type ifReq struct {
|
type ifReq struct {
|
||||||
Name [16]byte
|
Name [16]byte
|
||||||
Flags uint16
|
Flags uint16
|
||||||
|
|||||||
@@ -252,7 +252,7 @@ func (dev *Device) TransmitPackets(vnethdr virtio.NetHdr, packets [][]byte) erro
|
|||||||
//todo surely there's something better to do here
|
//todo surely there's something better to do here
|
||||||
|
|
||||||
for {
|
for {
|
||||||
txedChains, err := dev.TransmitQueue.BlockAndGetHeads(context.TODO())
|
txedChains, err := dev.TransmitQueue.BlockAndGetHeadsCapped(context.TODO(), len(chainIndexes))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
} else if len(txedChains) == 0 {
|
} else if len(txedChains) == 0 {
|
||||||
@@ -358,8 +358,6 @@ func (dev *Device) ReceivePackets(out []*packet.VirtIOPacket) (int, error) {
|
|||||||
chainsIdx := 0
|
chainsIdx := 0
|
||||||
for numPackets = 0; chainsIdx < len(chains); numPackets++ {
|
for numPackets = 0; chainsIdx < len(chains); numPackets++ {
|
||||||
if numPackets >= len(out) {
|
if numPackets >= len(out) {
|
||||||
//dev.extraRx = chains[chainsIdx:]
|
|
||||||
//return numPackets, nil
|
|
||||||
return numPackets, fmt.Errorf("dropping %d packets, no room", len(chains)-numPackets)
|
return numPackets, fmt.Errorf("dropping %d packets, no room", len(chains)-numPackets)
|
||||||
}
|
}
|
||||||
numChains, err := dev.processChains(out[numPackets], chains[chainsIdx:])
|
numChains, err := dev.processChains(out[numPackets], chains[chainsIdx:])
|
||||||
@@ -370,15 +368,9 @@ func (dev *Device) ReceivePackets(out []*packet.VirtIOPacket) (int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Now that we have copied all buffers, we can recycle the used descriptor chains
|
// Now that we have copied all buffers, we can recycle the used descriptor chains
|
||||||
if err := dev.ReceiveQueue.RecycleDescriptorChains(chains); err != nil {
|
if err = dev.ReceiveQueue.RecycleDescriptorChains(chains); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
//if we don't churn chains, maybe we don't need this?
|
|
||||||
// It's advised to always keep the rx queue fully populated with available buffers which the device can write new packets into.
|
|
||||||
//if err := dev.refillReceiveQueue(); err != nil {
|
|
||||||
// return 0, virtio.NetHdr{}, fmt.Errorf("refill receive queue: %w", err)
|
|
||||||
//}
|
|
||||||
|
|
||||||
return numPackets, nil
|
return numPackets, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -215,23 +215,24 @@ func (sq *SplitQueue) BlockAndGetHeadsCapped(ctx context.Context, maxToTake int)
|
|||||||
if sq.more > 0 {
|
if sq.more > 0 {
|
||||||
stillNeedToTake, out := sq.usedRing.take(maxToTake)
|
stillNeedToTake, out := sq.usedRing.take(maxToTake)
|
||||||
sq.more = stillNeedToTake
|
sq.more = stillNeedToTake
|
||||||
if stillNeedToTake == 0 {
|
|
||||||
_ = sq.epoll.Clear() //???
|
|
||||||
}
|
|
||||||
|
|
||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
//look inside the fridge
|
||||||
|
stillNeedToTake, out := sq.usedRing.take(maxToTake)
|
||||||
|
if len(out) > 0 {
|
||||||
|
sq.more = stillNeedToTake
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
//fridge is empty I guess
|
||||||
|
|
||||||
// Wait for a signal from the device.
|
// Wait for a signal from the device.
|
||||||
if n, err = sq.epoll.Block(); err != nil {
|
if n, err = sq.epoll.Block(); err != nil {
|
||||||
return nil, fmt.Errorf("wait: %w", err)
|
return nil, fmt.Errorf("wait: %w", err)
|
||||||
}
|
}
|
||||||
if n > 0 {
|
if n > 0 {
|
||||||
stillNeedToTake, out := sq.usedRing.take(maxToTake)
|
_ = sq.epoll.Clear() //???
|
||||||
|
stillNeedToTake, out = sq.usedRing.take(maxToTake)
|
||||||
sq.more = stillNeedToTake
|
sq.more = stillNeedToTake
|
||||||
if stillNeedToTake == 0 {
|
|
||||||
_ = sq.epoll.Clear() //???
|
|
||||||
}
|
|
||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user