mirror of
https://github.com/vishvananda/netlink.git
synced 2025-10-24 16:30:20 +08:00
Add devlink port function set attribute
Add ability to set port function attributes such as state and hardware address. Signed-off-by: Parav Pandit <parav@nvidia.com>
This commit is contained in:
committed by
Alessandro Boch
parent
22c099edb4
commit
77f3f25cb4
@@ -34,6 +34,13 @@ type DevlinkPortFn struct {
|
|||||||
OpState uint8
|
OpState uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DevlinkPortFnSetAttrs represents attributes to set
|
||||||
|
type DevlinkPortFnSetAttrs struct {
|
||||||
|
FnAttrs DevlinkPortFn
|
||||||
|
HwAddrValid bool
|
||||||
|
StateValid bool
|
||||||
|
}
|
||||||
|
|
||||||
// DevlinkPort represents port and its attributes
|
// DevlinkPort represents port and its attributes
|
||||||
type DevlinkPort struct {
|
type DevlinkPort struct {
|
||||||
BusName string
|
BusName string
|
||||||
@@ -472,3 +479,34 @@ func (h *Handle) DevLinkPortDel(Bus string, Device string, PortIndex uint32) err
|
|||||||
func DevLinkPortDel(Bus string, Device string, PortIndex uint32) error {
|
func DevLinkPortDel(Bus string, Device string, PortIndex uint32) error {
|
||||||
return pkgHandle.DevLinkPortDel(Bus, Device, PortIndex)
|
return pkgHandle.DevLinkPortDel(Bus, Device, PortIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DevlinkPortFnSet sets one or more port function attributes specified by the attribute mask.
|
||||||
|
// It returns 0 on success or error code.
|
||||||
|
func (h *Handle) DevlinkPortFnSet(Bus string, Device string, PortIndex uint32, FnAttrs DevlinkPortFnSetAttrs) error {
|
||||||
|
_, req, err := h.createCmdReq(nl.DEVLINK_CMD_PORT_SET, Bus, Device)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
req.AddData(nl.NewRtAttr(nl.DEVLINK_ATTR_PORT_INDEX, nl.Uint32Attr(PortIndex)))
|
||||||
|
|
||||||
|
fnAttr := nl.NewRtAttr(nl.DEVLINK_ATTR_PORT_FUNCTION|unix.NLA_F_NESTED, nil)
|
||||||
|
|
||||||
|
if FnAttrs.HwAddrValid == true {
|
||||||
|
fnAttr.AddRtAttr(nl.DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR, []byte(FnAttrs.FnAttrs.HwAddr))
|
||||||
|
}
|
||||||
|
|
||||||
|
if FnAttrs.StateValid == true {
|
||||||
|
fnAttr.AddRtAttr(nl.DEVLINK_PORT_FN_ATTR_STATE, nl.Uint8Attr(FnAttrs.FnAttrs.State))
|
||||||
|
}
|
||||||
|
req.AddData(fnAttr)
|
||||||
|
|
||||||
|
_, err = req.Execute(unix.NETLINK_GENERIC, 0)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DevlinkPortFnSet sets one or more port function attributes specified by the attribute mask.
|
||||||
|
// It returns 0 on success or error code.
|
||||||
|
func DevlinkPortFnSet(Bus string, Device string, PortIndex uint32, FnAttrs DevlinkPortFnSetAttrs) error {
|
||||||
|
return pkgHandle.DevlinkPortFnSet(Bus, Device, PortIndex, FnAttrs)
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,8 +3,9 @@
|
|||||||
package netlink
|
package netlink
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
|
||||||
"flag"
|
"flag"
|
||||||
|
"net"
|
||||||
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDevLinkGetDeviceList(t *testing.T) {
|
func TestDevLinkGetDeviceList(t *testing.T) {
|
||||||
@@ -77,7 +78,62 @@ func TestDevLinkAddDelSfPort(t *testing.T) {
|
|||||||
}
|
}
|
||||||
t.Log(*port)
|
t.Log(*port)
|
||||||
if port.Fn != nil {
|
if port.Fn != nil {
|
||||||
t.Log("function attributes = " , *port.Fn)
|
t.Log("function attributes = ", *port.Fn)
|
||||||
|
}
|
||||||
|
err2 = DevLinkPortDel(dev.BusName, dev.DeviceName, port.PortIndex)
|
||||||
|
if err2 != nil {
|
||||||
|
t.Fatal(err2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDevLinkSfPortFnSet(t *testing.T) {
|
||||||
|
var addAttrs DevLinkPortAddAttrs
|
||||||
|
var stateAttr DevlinkPortFnSetAttrs
|
||||||
|
|
||||||
|
minKernelRequired(t, 5, 12)
|
||||||
|
if bus == "" || device == "" {
|
||||||
|
t.Log("devlink bus and device are empty, skipping test")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dev, err := DevLinkGetDeviceByName(bus, device)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
addAttrs.SfNumberValid = true
|
||||||
|
addAttrs.SfNumber = uint32(sfnum)
|
||||||
|
addAttrs.PfNumber = 0
|
||||||
|
port, err2 := DevLinkPortAdd(dev.BusName, dev.DeviceName, 7, addAttrs)
|
||||||
|
if err2 != nil {
|
||||||
|
t.Fatal(err2)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.Log(*port)
|
||||||
|
if port.Fn != nil {
|
||||||
|
t.Log("function attributes = ", *port.Fn)
|
||||||
|
}
|
||||||
|
macAttr := DevlinkPortFnSetAttrs{
|
||||||
|
FnAttrs: DevlinkPortFn{
|
||||||
|
HwAddr: net.HardwareAddr{0x00, 0x11, 0x22, 0x33, 0x44, 0x55},
|
||||||
|
},
|
||||||
|
HwAddrValid: true,
|
||||||
|
}
|
||||||
|
err2 = DevlinkPortFnSet(dev.BusName, dev.DeviceName, port.PortIndex, macAttr)
|
||||||
|
if err2 != nil {
|
||||||
|
t.Log("function mac set err = ", err2)
|
||||||
|
}
|
||||||
|
stateAttr.FnAttrs.State = 1
|
||||||
|
stateAttr.StateValid = true
|
||||||
|
err2 = DevlinkPortFnSet(dev.BusName, dev.DeviceName, port.PortIndex, stateAttr)
|
||||||
|
if err2 != nil {
|
||||||
|
t.Log("function state set err = ", err2)
|
||||||
|
}
|
||||||
|
|
||||||
|
port, err3 := DevLinkGetPortByIndex(dev.BusName, dev.DeviceName, port.PortIndex)
|
||||||
|
if err3 == nil {
|
||||||
|
t.Log(*port)
|
||||||
|
t.Log(*port.Fn)
|
||||||
}
|
}
|
||||||
err2 = DevLinkPortDel(dev.BusName, dev.DeviceName, port.PortIndex)
|
err2 = DevLinkPortDel(dev.BusName, dev.DeviceName, port.PortIndex)
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user