mirror of https://github.com/vishvananda/netlink
Add devlink command to query devlink port list
Add devlink command to get list of devlink ports and their common attributes. Signed-off-by: Parav Pandit <parav@mellanox.com>
This commit is contained in:
parent
ffba2c833f
commit
ff8f17bc19
|
@ -27,6 +27,18 @@ type DevlinkDevice struct {
|
||||||
Attrs DevlinkDevAttrs
|
Attrs DevlinkDevAttrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DevlinkPort represents port and its attributes
|
||||||
|
type DevlinkPort struct {
|
||||||
|
BusName string
|
||||||
|
DeviceName string
|
||||||
|
PortIndex uint32
|
||||||
|
PortType uint16
|
||||||
|
NetdeviceName string
|
||||||
|
NetdevIfIndex uint32
|
||||||
|
RdmaDeviceName string
|
||||||
|
PortFlavour uint16
|
||||||
|
}
|
||||||
|
|
||||||
func parseDevLinkDeviceList(msgs [][]byte) ([]*DevlinkDevice, error) {
|
func parseDevLinkDeviceList(msgs [][]byte) ([]*DevlinkDevice, error) {
|
||||||
devices := make([]*DevlinkDevice, 0, len(msgs))
|
devices := make([]*DevlinkDevice, 0, len(msgs))
|
||||||
for _, m := range msgs {
|
for _, m := range msgs {
|
||||||
|
@ -270,3 +282,74 @@ func (h *Handle) DevLinkSetEswitchMode(Dev *DevlinkDevice, NewMode string) error
|
||||||
func DevLinkSetEswitchMode(Dev *DevlinkDevice, NewMode string) error {
|
func DevLinkSetEswitchMode(Dev *DevlinkDevice, NewMode string) error {
|
||||||
return pkgHandle.DevLinkSetEswitchMode(Dev, NewMode)
|
return pkgHandle.DevLinkSetEswitchMode(Dev, NewMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (port *DevlinkPort) parseAttributes(attrs []syscall.NetlinkRouteAttr) error {
|
||||||
|
for _, a := range attrs {
|
||||||
|
switch a.Attr.Type {
|
||||||
|
case nl.DEVLINK_ATTR_BUS_NAME:
|
||||||
|
port.BusName = string(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_DEV_NAME:
|
||||||
|
port.DeviceName = string(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_PORT_INDEX:
|
||||||
|
port.PortIndex = native.Uint32(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_PORT_TYPE:
|
||||||
|
port.PortType = native.Uint16(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_PORT_NETDEV_NAME:
|
||||||
|
port.NetdeviceName = string(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_PORT_NETDEV_IFINDEX:
|
||||||
|
port.NetdevIfIndex = native.Uint32(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_PORT_IBDEV_NAME:
|
||||||
|
port.RdmaDeviceName = string(a.Value)
|
||||||
|
case nl.DEVLINK_ATTR_PORT_FLAVOUR:
|
||||||
|
port.PortFlavour = native.Uint16(a.Value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseDevLinkAllPortList(msgs [][]byte) ([]*DevlinkPort, error) {
|
||||||
|
ports := make([]*DevlinkPort, 0, len(msgs))
|
||||||
|
for _, m := range msgs {
|
||||||
|
attrs, err := nl.ParseRouteAttr(m[nl.SizeofGenlmsg:])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
port := &DevlinkPort{}
|
||||||
|
if err = port.parseAttributes(attrs); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ports = append(ports, port)
|
||||||
|
}
|
||||||
|
return ports, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DevLinkGetPortList provides a pointer to devlink ports and nil error,
|
||||||
|
// otherwise returns an error code.
|
||||||
|
func (h *Handle) DevLinkGetAllPortList() ([]*DevlinkPort, error) {
|
||||||
|
f, err := h.GenlFamilyGet(nl.GENL_DEVLINK_NAME)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
msg := &nl.Genlmsg{
|
||||||
|
Command: nl.DEVLINK_CMD_PORT_GET,
|
||||||
|
Version: nl.GENL_DEVLINK_VERSION,
|
||||||
|
}
|
||||||
|
req := h.newNetlinkRequest(int(f.ID),
|
||||||
|
unix.NLM_F_REQUEST|unix.NLM_F_ACK|unix.NLM_F_DUMP)
|
||||||
|
req.AddData(msg)
|
||||||
|
msgs, err := req.Execute(unix.NETLINK_GENERIC, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ports, err := parseDevLinkAllPortList(msgs)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return ports, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DevLinkGetPortList provides a pointer to devlink ports and nil error,
|
||||||
|
// otherwise returns an error code.
|
||||||
|
func DevLinkGetAllPortList() ([]*DevlinkPort, error) {
|
||||||
|
return pkgHandle.DevLinkGetAllPortList()
|
||||||
|
}
|
||||||
|
|
|
@ -40,3 +40,15 @@ func TestDevLinkSetEswitchMode(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDevLinkGetAllPortList(t *testing.T) {
|
||||||
|
minKernelRequired(t, 5, 4)
|
||||||
|
ports, err := DevLinkGetAllPortList()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log("devlink port count = ", len(ports))
|
||||||
|
for _, port := range ports {
|
||||||
|
t.Log(*port)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ const (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
DEVLINK_CMD_GET = 1
|
DEVLINK_CMD_GET = 1
|
||||||
|
DEVLINK_CMD_PORT_GET = 5
|
||||||
DEVLINK_CMD_ESWITCH_GET = 29
|
DEVLINK_CMD_ESWITCH_GET = 29
|
||||||
DEVLINK_CMD_ESWITCH_SET = 30
|
DEVLINK_CMD_ESWITCH_SET = 30
|
||||||
)
|
)
|
||||||
|
@ -17,9 +18,15 @@ const (
|
||||||
const (
|
const (
|
||||||
DEVLINK_ATTR_BUS_NAME = 1
|
DEVLINK_ATTR_BUS_NAME = 1
|
||||||
DEVLINK_ATTR_DEV_NAME = 2
|
DEVLINK_ATTR_DEV_NAME = 2
|
||||||
|
DEVLINK_ATTR_PORT_INDEX = 3
|
||||||
|
DEVLINK_ATTR_PORT_TYPE = 4
|
||||||
|
DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 6
|
||||||
|
DEVLINK_ATTR_PORT_NETDEV_NAME = 7
|
||||||
|
DEVLINK_ATTR_PORT_IBDEV_NAME = 8
|
||||||
DEVLINK_ATTR_ESWITCH_MODE = 25
|
DEVLINK_ATTR_ESWITCH_MODE = 25
|
||||||
DEVLINK_ATTR_ESWITCH_INLINE_MODE = 26
|
DEVLINK_ATTR_ESWITCH_INLINE_MODE = 26
|
||||||
DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 62
|
DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 62
|
||||||
|
DEVLINK_ATTR_PORT_FLAVOUR = 77
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -38,3 +45,19 @@ const (
|
||||||
DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0
|
DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0
|
||||||
DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 1
|
DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
DEVLINK_PORT_FLAVOUR_PHYSICAL = 0
|
||||||
|
DEVLINK_PORT_FLAVOUR_CPU = 1
|
||||||
|
DEVLINK_PORT_FLAVOUR_DSA = 2
|
||||||
|
DEVLINK_PORT_FLAVOUR_PCI_PF = 3
|
||||||
|
DEVLINK_PORT_FLAVOUR_PCI_VF = 4
|
||||||
|
DEVLINK_PORT_FLAVOUR_VIRTUAL = 5
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
DEVLINK_PORT_TYPE_NOTSET = 0
|
||||||
|
DEVLINK_PORT_TYPE_AUTO = 1
|
||||||
|
DEVLINK_PORT_TYPE_ETH = 2
|
||||||
|
DEVLINK_PORT_TYPE_IB = 3
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue