mirror of
https://github.com/vishvananda/netlink
synced 2025-03-09 14:57:50 +00:00
rdma: support rdma link add/del functionality
Signed-off-by: Wei Fu <fuweid89@gmail.com>
This commit is contained in:
parent
626202eca8
commit
c33185cb84
@ -11,6 +11,8 @@ const (
|
|||||||
const (
|
const (
|
||||||
RDMA_NLDEV_CMD_GET = 1
|
RDMA_NLDEV_CMD_GET = 1
|
||||||
RDMA_NLDEV_CMD_SET = 2
|
RDMA_NLDEV_CMD_SET = 2
|
||||||
|
RDMA_NLDEV_CMD_NEWLINK = 3
|
||||||
|
RDMA_NLDEV_CMD_DELLINK = 4
|
||||||
RDMA_NLDEV_CMD_SYS_GET = 6
|
RDMA_NLDEV_CMD_SYS_GET = 6
|
||||||
RDMA_NLDEV_CMD_SYS_SET = 7
|
RDMA_NLDEV_CMD_SYS_SET = 7
|
||||||
)
|
)
|
||||||
@ -30,6 +32,8 @@ const (
|
|||||||
RDMA_NLDEV_ATTR_PORT_STATE = 12
|
RDMA_NLDEV_ATTR_PORT_STATE = 12
|
||||||
RDMA_NLDEV_ATTR_PORT_PHYS_STATE = 13
|
RDMA_NLDEV_ATTR_PORT_PHYS_STATE = 13
|
||||||
RDMA_NLDEV_ATTR_DEV_NODE_TYPE = 14
|
RDMA_NLDEV_ATTR_DEV_NODE_TYPE = 14
|
||||||
|
RDMA_NLDEV_ATTR_NDEV_NAME = 51
|
||||||
|
RDMA_NLDEV_ATTR_LINK_TYPE = 65
|
||||||
RDMA_NLDEV_SYS_ATTR_NETNS_MODE = 66
|
RDMA_NLDEV_SYS_ATTR_NETNS_MODE = 66
|
||||||
RDMA_NLDEV_NET_NS_FD = 68
|
RDMA_NLDEV_NET_NS_FD = 68
|
||||||
)
|
)
|
||||||
|
@ -278,3 +278,54 @@ func (h *Handle) RdmaLinkSetNsFd(link *RdmaLink, fd uint32) error {
|
|||||||
|
|
||||||
return execRdmaSetLink(req)
|
return execRdmaSetLink(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RdmaLinkDel deletes an rdma link
|
||||||
|
//
|
||||||
|
// Similar to: rdma link delete NAME
|
||||||
|
// REF: https://man7.org/linux/man-pages/man8/rdma-link.8.html
|
||||||
|
func RdmaLinkDel(name string) error {
|
||||||
|
return pkgHandle.RdmaLinkDel(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RdmaLinkDel deletes an rdma link.
|
||||||
|
func (h *Handle) RdmaLinkDel(name string) error {
|
||||||
|
link, err := h.RdmaLinkByName(name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
proto := getProtoField(nl.RDMA_NL_NLDEV, nl.RDMA_NLDEV_CMD_DELLINK)
|
||||||
|
req := h.newNetlinkRequest(proto, unix.NLM_F_ACK)
|
||||||
|
|
||||||
|
b := make([]byte, 4)
|
||||||
|
native.PutUint32(b, link.Attrs.Index)
|
||||||
|
req.AddData(nl.NewRtAttr(nl.RDMA_NLDEV_ATTR_DEV_INDEX, b))
|
||||||
|
|
||||||
|
_, err = req.Execute(unix.NETLINK_RDMA, 0)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// RdmaLinkAdd adds an rdma link for the specified type to the network device.
|
||||||
|
// Similar to: rdma link add NAME type TYPE netdev NETDEV
|
||||||
|
// NAME - specifies the new name of the rdma link to add
|
||||||
|
// TYPE - specifies which rdma type to use. Link types:
|
||||||
|
// rxe - Soft RoCE driver
|
||||||
|
// siw - Soft iWARP driver
|
||||||
|
// NETDEV - specifies the network device to which the link is bound
|
||||||
|
//
|
||||||
|
// REF: https://man7.org/linux/man-pages/man8/rdma-link.8.html
|
||||||
|
func RdmaLinkAdd(linkName, linkType, netdev string) error {
|
||||||
|
return pkgHandle.RdmaLinkAdd(linkName, linkType, netdev)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RdmaLinkAdd adds an rdma link for the specified type to the network device.
|
||||||
|
func (h *Handle) RdmaLinkAdd(linkName string, linkType string, netdev string) error {
|
||||||
|
proto := getProtoField(nl.RDMA_NL_NLDEV, nl.RDMA_NLDEV_CMD_NEWLINK)
|
||||||
|
req := h.newNetlinkRequest(proto, unix.NLM_F_ACK)
|
||||||
|
|
||||||
|
req.AddData(nl.NewRtAttr(nl.RDMA_NLDEV_ATTR_DEV_NAME, nl.ZeroTerminated(linkName)))
|
||||||
|
req.AddData(nl.NewRtAttr(nl.RDMA_NLDEV_ATTR_LINK_TYPE, nl.ZeroTerminated(linkType)))
|
||||||
|
req.AddData(nl.NewRtAttr(nl.RDMA_NLDEV_ATTR_NDEV_NAME, nl.ZeroTerminated(netdev)))
|
||||||
|
_, err := req.Execute(unix.NETLINK_RDMA, 0)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
@ -3,10 +3,11 @@
|
|||||||
package netlink
|
package netlink
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/vishvananda/netns"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/vishvananda/netns"
|
||||||
)
|
)
|
||||||
|
|
||||||
func setupRdmaKModule(t *testing.T, name string) {
|
func setupRdmaKModule(t *testing.T, name string) {
|
||||||
@ -165,3 +166,42 @@ func TestRdmaLinkList(t *testing.T) {
|
|||||||
t.Logf("%d: %s", link.Attrs.Index, link.Attrs.Name)
|
t.Logf("%d: %s", link.Attrs.Index, link.Attrs.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRdmaLinkAddAndDel(t *testing.T) {
|
||||||
|
// related commit is https://github.com/torvalds/linux/commit/3856ec4b93c9463d36ee39098dde1fbbd29ec6dd.
|
||||||
|
minKernelRequired(t, 5, 1)
|
||||||
|
setupRdmaKModule(t, "rdma_rxe")
|
||||||
|
|
||||||
|
checkPresence := func(name string, exist bool) {
|
||||||
|
links, err := RdmaLinkList()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
found := false
|
||||||
|
for _, link := range links {
|
||||||
|
if link.Attrs.Name == name {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if found != exist {
|
||||||
|
t.Fatalf("expected rdma link %s presence=%v, but got presence=%v", name, exist, found)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
linkName := t.Name()
|
||||||
|
|
||||||
|
if err := RdmaLinkAdd(linkName, "rxe", "lo"); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
checkPresence(linkName, true)
|
||||||
|
|
||||||
|
if err := RdmaLinkDel(linkName); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
checkPresence(linkName, false)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user