return nil
}
+func (n *NetInterface) configureMultiQueue() error {
+ // TODO multiqueue for tap
+ if n.Type() != Veth {
+ return nil
+ }
+ err := linkSetMultiQueue(n.Name())
+ if err != nil {
+ return fmt.Errorf("set multiqueue failed: %v", err)
+ }
+ return nil
+}
+
func (n *NetInterface) configureNetworkNamespace() error {
if n.NetworkNamespace != "" {
err := linkSetNetns(n.name, n.NetworkNamespace)
return err
}
+ if err := n.configureMultiQueue(); err != nil {
+ return err
+ }
+
if err := n.configureNetworkNamespace(); err != nil {
return err
}
return nil
}
+func linkSetMultiQueue(ifName string) error {
+ cmd := exec.Command("ethtool", "-L", ifName, "rx", "4", "tx", "4")
+ fmt.Println("configuring multiqueue for interface:", cmd.String())
+ err := cmd.Run()
+ if err != nil {
+ return fmt.Errorf("error configuring multiqueue '%s: %v", ifName, err)
+ }
+ return nil
+}
+
func newCommand(s []string, ns string) *exec.Cmd {
return appendNetns(s, ns)
}
serverVpp := serverContainer.VppInstance
s.AssertNil(serverVpp.Start())
- idx, err := serverVpp.createAfPacket(s.Interfaces.Server, false)
+ numCpus := uint16(len(serverContainer.AllocatedCpus))
+ numWorkers := uint16(max(numCpus-1, 1))
+ idx, err := serverVpp.createAfPacket(s.Interfaces.Server, false, WithNumRxQueues(numWorkers), WithNumTxQueues(numCpus))
s.AssertNil(err, fmt.Sprint(err))
s.AssertNotEqual(0, idx)
}
clientVpp := clientContainer.VppInstance
s.AssertNil(clientVpp.Start())
- idx, err := clientVpp.createAfPacket(s.Interfaces.Client, false)
+ numCpus := uint16(len(clientContainer.AllocatedCpus))
+ numWorkers := uint16(max(numCpus-1, 1))
+ idx, err := clientVpp.createAfPacket(s.Interfaces.Client, false, WithNumRxQueues(numWorkers), WithNumTxQueues(numCpus))
s.AssertNil(err, fmt.Sprint(err))
s.AssertNotEqual(0, idx)
}
vpp.getSuite().AssertNil(1, "Timeout while waiting for app '%s'", appName)
}
-func (vpp *VppInstance) createAfPacket(veth *NetInterface, IPv6 bool) (interface_types.InterfaceIndex, error) {
+type AfPacketOption func(*af_packet.AfPacketCreateV3)
+
+func WithNumRxQueues(numRxQueues uint16) AfPacketOption {
+ return func(cfg *af_packet.AfPacketCreateV3) {
+ cfg.NumRxQueues = numRxQueues
+ }
+}
+
+func WithNumTxQueues(numTxQueues uint16) AfPacketOption {
+ return func(cfg *af_packet.AfPacketCreateV3) {
+ cfg.NumTxQueues = numTxQueues
+ }
+}
+
+func (vpp *VppInstance) createAfPacket(veth *NetInterface, IPv6 bool, opts ...AfPacketOption) (interface_types.InterfaceIndex, error) {
var ipAddress string
var err error
createReq.HwAddr = veth.HwAddress
}
+ // Apply all optional configs
+ for _, opt := range opts {
+ opt(createReq)
+ }
vpp.getSuite().Log("create af-packet interface " + veth.Name())
if err := vpp.ApiStream.SendMsg(createReq); err != nil {
vpp.getSuite().HstFail()