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 (
|
||||
RDMA_NLDEV_CMD_GET = 1
|
||||
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_SET = 7
|
||||
)
|
||||
@ -30,6 +32,8 @@ const (
|
||||
RDMA_NLDEV_ATTR_PORT_STATE = 12
|
||||
RDMA_NLDEV_ATTR_PORT_PHYS_STATE = 13
|
||||
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_NET_NS_FD = 68
|
||||
)
|
||||
|
@ -278,3 +278,54 @@ func (h *Handle) RdmaLinkSetNsFd(link *RdmaLink, fd uint32) error {
|
||||
|
||||
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
|
||||
|
||||
import (
|
||||
"github.com/vishvananda/netns"
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/vishvananda/netns"
|
||||
)
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
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