mirror of
https://github.com/vishvananda/netlink.git
synced 2025-09-26 20:01:13 +08:00
Add an API to change net namespace of RDMA device
Add an API to change net namespace of RDMA device similar to $ rdma dev set [DEV] netns NSNAME Signed-off-by: Parav Pandit <parav@mellanox.com>
This commit is contained in:

committed by
Alessandro Boch

parent
d50d15ce3f
commit
123a384710
@@ -31,4 +31,5 @@ const (
|
||||
RDMA_NLDEV_ATTR_PORT_PHYS_STATE = 13
|
||||
RDMA_NLDEV_ATTR_DEV_NODE_TYPE = 14
|
||||
RDMA_NLDEV_SYS_ATTR_NETNS_MODE = 66
|
||||
RDMA_NLDEV_NET_NS_FD = 68
|
||||
)
|
||||
|
@@ -238,3 +238,27 @@ func (h *Handle) RdmaSystemSetNetnsMode(NewMode string) error {
|
||||
_, err = req.Execute(unix.NETLINK_RDMA, 0)
|
||||
return err
|
||||
}
|
||||
|
||||
// RdmaLinkSetNsFd puts the RDMA device into a new network namespace. The
|
||||
// fd must be an open file descriptor to a network namespace.
|
||||
// Similar to: `rdma dev set $dev netns $ns`
|
||||
func RdmaLinkSetNsFd(link *RdmaLink, fd uint32) error {
|
||||
return pkgHandle.RdmaLinkSetNsFd(link, fd)
|
||||
}
|
||||
|
||||
// RdmaLinkSetNsFd puts the RDMA device into a new network namespace. The
|
||||
// fd must be an open file descriptor to a network namespace.
|
||||
// Similar to: `rdma dev set $dev netns $ns`
|
||||
func (h *Handle) RdmaLinkSetNsFd(link *RdmaLink, fd uint32) error {
|
||||
proto := getProtoField(nl.RDMA_NL_NLDEV, nl.RDMA_NLDEV_CMD_SET)
|
||||
req := h.newNetlinkRequest(proto, unix.NLM_F_ACK)
|
||||
|
||||
data := nl.NewRtAttr(nl.RDMA_NLDEV_ATTR_DEV_INDEX,
|
||||
nl.Uint32Attr(link.Attrs.Index))
|
||||
req.AddData(data)
|
||||
|
||||
data = nl.NewRtAttr(nl.RDMA_NLDEV_NET_NS_FD, nl.Uint32Attr(fd))
|
||||
req.AddData(data)
|
||||
|
||||
return execRdmaSetLink(req)
|
||||
}
|
||||
|
@@ -3,6 +3,7 @@
|
||||
package netlink
|
||||
|
||||
import (
|
||||
"github.com/vishvananda/netns"
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
"testing"
|
||||
@@ -99,3 +100,55 @@ func TestRdmaSystemSetNetnsMode(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRdmaLinkSetNsFd(t *testing.T) {
|
||||
minKernelRequired(t, 5, 2)
|
||||
setupRdmaKModule(t, "ib_core")
|
||||
|
||||
mode, err := RdmaSystemGetNetnsMode()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log("current rdma netns mode", mode)
|
||||
err = RdmaSystemSetNetnsMode("exclusive")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
basens, err := netns.Get()
|
||||
if err != nil {
|
||||
RdmaSystemSetNetnsMode(mode)
|
||||
t.Fatal("Failed to get basens")
|
||||
}
|
||||
defer basens.Close()
|
||||
|
||||
newns, err := netns.New()
|
||||
if err != nil {
|
||||
RdmaSystemSetNetnsMode(mode)
|
||||
t.Fatal("Failed to create newns")
|
||||
}
|
||||
|
||||
netns.Set(basens)
|
||||
link, err := RdmaLinkByName("foo")
|
||||
if err != nil {
|
||||
// Remove the namespace as RDMA subsystem requires
|
||||
// no namespace to exist when changing net namespace mode
|
||||
newns.Close()
|
||||
RdmaSystemSetNetnsMode(mode)
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log("rdma link: ", link)
|
||||
|
||||
err = RdmaLinkSetNsFd(link, uint32(newns))
|
||||
if err != nil {
|
||||
newns.Close()
|
||||
RdmaSystemSetNetnsMode(mode)
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
newns.Close()
|
||||
//Set the old mode back at start of the test
|
||||
err = RdmaSystemSetNetnsMode(mode)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user