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:
Parav Pandit 2019-06-04 08:59:43 -05:00 committed by Alessandro Boch
parent 4666477197
commit 0f040b9e2c
3 changed files with 75 additions and 0 deletions

View File

@ -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 (

View File

@ -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
}

View File

@ -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)
}
}