mirror of
https://github.com/vishvananda/netlink
synced 2025-01-29 19:12:44 +00:00
Add devlink command by to get specific device name
Add a command to get information about a specific devlink device referenced by device name (bus, device). Remove unused setupDevlinkKModule(). Signed-off-by: Parav Pandit <parav@mellanox.com>
This commit is contained in:
parent
f504738125
commit
bcb80b237c
@ -165,3 +165,68 @@ func (h *Handle) DevLinkGetDeviceList() ([]*DevlinkDevice, error) {
|
||||
func DevLinkGetDeviceList() ([]*DevlinkDevice, error) {
|
||||
return pkgHandle.DevLinkGetDeviceList()
|
||||
}
|
||||
|
||||
func parseDevlinkDevice(msgs [][]byte) (*DevlinkDevice, error) {
|
||||
m := msgs[0]
|
||||
attrs, err := nl.ParseRouteAttr(m[nl.SizeofGenlmsg:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dev := &DevlinkDevice{}
|
||||
if err = dev.parseAttributes(attrs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return dev, nil
|
||||
}
|
||||
|
||||
func (h *Handle) createCmdReq(cmd uint8, bus string, device string) (*GenlFamily, *nl.NetlinkRequest, error) {
|
||||
f, err := h.GenlFamilyGet(nl.GENL_DEVLINK_NAME)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
msg := &nl.Genlmsg{
|
||||
Command: cmd,
|
||||
Version: nl.GENL_DEVLINK_VERSION,
|
||||
}
|
||||
req := h.newNetlinkRequest(int(f.ID),
|
||||
unix.NLM_F_REQUEST|unix.NLM_F_ACK)
|
||||
req.AddData(msg)
|
||||
|
||||
b := make([]byte, len(bus)+1)
|
||||
copy(b, bus)
|
||||
data := nl.NewRtAttr(nl.DEVLINK_ATTR_BUS_NAME, b)
|
||||
req.AddData(data)
|
||||
|
||||
b = make([]byte, len(device)+1)
|
||||
copy(b, device)
|
||||
data = nl.NewRtAttr(nl.DEVLINK_ATTR_DEV_NAME, b)
|
||||
req.AddData(data)
|
||||
|
||||
return f, req, nil
|
||||
}
|
||||
|
||||
// DevlinkGetDeviceByName provides a pointer to devlink device and nil error,
|
||||
// otherwise returns an error code.
|
||||
func (h *Handle) DevLinkGetDeviceByName(Bus string, Device string) (*DevlinkDevice, error) {
|
||||
f, req, err := h.createCmdReq(nl.DEVLINK_CMD_GET, Bus, Device)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
respmsg, err := req.Execute(unix.NETLINK_GENERIC, 0)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dev, err := parseDevlinkDevice(respmsg)
|
||||
if err == nil {
|
||||
h.getEswitchAttrs(f, dev)
|
||||
}
|
||||
return dev, err
|
||||
}
|
||||
|
||||
// DevlinkGetDeviceByName provides a pointer to devlink device and nil error,
|
||||
// otherwise returns an error code.
|
||||
func DevLinkGetDeviceByName(Bus string, Device string) (*DevlinkDevice, error) {
|
||||
return pkgHandle.DevLinkGetDeviceByName(Bus, Device)
|
||||
}
|
||||
|
@ -3,27 +3,9 @@
|
||||
package netlink
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func setupDevlinkKModule(t *testing.T, name string) {
|
||||
skipUnlessRoot(t)
|
||||
file, err := ioutil.ReadFile("/proc/modules")
|
||||
if err != nil {
|
||||
t.Fatal("Failed to open /proc/modules", err)
|
||||
}
|
||||
for _, line := range strings.Split(string(file), "\n") {
|
||||
n := strings.Split(line, " ")[0]
|
||||
if n == name {
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
t.Skipf("Test requires kmodule %q.", name)
|
||||
}
|
||||
|
||||
func TestDevLinkGetDeviceList(t *testing.T) {
|
||||
minKernelRequired(t, 4, 12)
|
||||
setUpNetlinkTestWithKModule(t, "devlink")
|
||||
@ -32,3 +14,12 @@ func TestDevLinkGetDeviceList(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDevLinkGetDeviceByName(t *testing.T) {
|
||||
minKernelRequired(t, 4, 12)
|
||||
setUpNetlinkTestWithKModule(t, "devlink")
|
||||
_, err := DevLinkGetDeviceByName("foo", "bar")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user