mirror of
https://github.com/vishvananda/netlink
synced 2025-02-16 12:06:49 +00:00
Add an API to set RDMA subsystem network namespace mode
Add an API to change the RDMA subsystem network namespace mode as either shared or exclusive similar to $ rdma system set netns { shared | exclusive } Signed-off-by: Parav Pandit <parav@mellanox.com>
This commit is contained in:
parent
4666477197
commit
0f040b9e2c
@ -12,6 +12,7 @@ const (
|
||||
RDMA_NLDEV_CMD_GET = 1
|
||||
RDMA_NLDEV_CMD_SET = 2
|
||||
RDMA_NLDEV_CMD_SYS_GET = 6
|
||||
RDMA_NLDEV_CMD_SYS_SET = 7
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -201,3 +201,40 @@ func (h *Handle) RdmaSystemGetNetnsMode() (string, error) {
|
||||
}
|
||||
return executeOneGetRdmaNetnsMode(msgs[0])
|
||||
}
|
||||
|
||||
func netnsModeStringToUint8(mode string) (uint8, error) {
|
||||
switch mode {
|
||||
case "exclusive":
|
||||
return 0, nil
|
||||
case "shared":
|
||||
return 1, nil
|
||||
default:
|
||||
return 0, fmt.Errorf("Invalid mode; %q", mode)
|
||||
}
|
||||
}
|
||||
|
||||
// RdmaSystemSetNetnsMode sets the net namespace mode for RDMA subsystem
|
||||
// Returns nil on success or appropriate error code.
|
||||
// Equivalent to: `rdma system set netns { shared | exclusive }'
|
||||
func RdmaSystemSetNetnsMode(NewMode string) error {
|
||||
return pkgHandle.RdmaSystemSetNetnsMode(NewMode)
|
||||
}
|
||||
|
||||
// RdmaSystemSetNetnsMode sets the net namespace mode for RDMA subsystem
|
||||
// Returns nil on success or appropriate error code.
|
||||
// Equivalent to: `rdma system set netns { shared | exclusive }'
|
||||
func (h *Handle) RdmaSystemSetNetnsMode(NewMode string) error {
|
||||
value, err := netnsModeStringToUint8(NewMode)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
proto := getProtoField(nl.RDMA_NL_NLDEV, nl.RDMA_NLDEV_CMD_SYS_SET)
|
||||
req := h.newNetlinkRequest(proto, unix.NLM_F_ACK)
|
||||
|
||||
data := nl.NewRtAttr(nl.RDMA_NLDEV_SYS_ATTR_NETNS_MODE, []byte{value})
|
||||
req.AddData(data)
|
||||
|
||||
_, err = req.Execute(unix.NETLINK_RDMA, 0)
|
||||
return err
|
||||
}
|
||||
|
@ -62,3 +62,40 @@ func TestRdmaSystemGetNetnsMode(t *testing.T) {
|
||||
}
|
||||
t.Log("rdma system netns mode =", mode)
|
||||
}
|
||||
|
||||
func TestRdmaSystemSetNetnsMode(t *testing.T) {
|
||||
var newMode string
|
||||
var mode string
|
||||
var err error
|
||||
|
||||
minKernelRequired(t, 5, 2)
|
||||
setupRdmaKModule(t, "ib_core")
|
||||
|
||||
mode, err = RdmaSystemGetNetnsMode()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log("current rdma system mode =", mode)
|
||||
|
||||
err = RdmaSystemSetNetnsMode(mode)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
// Flip the mode from current mode
|
||||
if mode == "exclusive" {
|
||||
err = RdmaSystemSetNetnsMode("shared")
|
||||
} else {
|
||||
err = RdmaSystemSetNetnsMode("exclusive")
|
||||
}
|
||||
newMode, err = RdmaSystemGetNetnsMode()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log("new rdma system mode =", newMode)
|
||||
|
||||
// Change back to original mode
|
||||
err = RdmaSystemSetNetnsMode(mode)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user