mirror of
https://git.proxmox.com/git/mirror_iproute2
synced 2025-10-13 05:26:03 +00:00

Enrich rdmatool with an option to query rdma subsystem parameter whether rdma devices are shared among multiple network namespaces or exclusive to single network namespace. rdma tool command examples and output. $ rdma system show netns shared $ rdma system set netns exclusive $ rdma system show netns exclusive Reviewed-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Parav Pandit <parav@mellanox.com> Signed-off-by: David Ahern <dsahern@gmail.com>
139 lines
2.7 KiB
C
139 lines
2.7 KiB
C
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
|
|
/*
|
|
* sys.c RDMA tool
|
|
*/
|
|
|
|
#include "rdma.h"
|
|
|
|
static int sys_help(struct rd *rd)
|
|
{
|
|
pr_out("Usage: %s system show [ netns ]\n", rd->filename);
|
|
pr_out(" %s system set netns { shared | exclusive }\n", rd->filename);
|
|
return 0;
|
|
}
|
|
|
|
static const char *netns_modes_str[] = {
|
|
"exclusive",
|
|
"shared",
|
|
};
|
|
|
|
static int sys_show_parse_cb(const struct nlmsghdr *nlh, void *data)
|
|
{
|
|
struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
|
|
struct rd *rd = data;
|
|
|
|
mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
|
|
|
|
if (tb[RDMA_NLDEV_SYS_ATTR_NETNS_MODE]) {
|
|
const char *mode_str;
|
|
uint8_t netns_mode;
|
|
|
|
netns_mode =
|
|
mnl_attr_get_u8(tb[RDMA_NLDEV_SYS_ATTR_NETNS_MODE]);
|
|
|
|
if (netns_mode <= ARRAY_SIZE(netns_modes_str))
|
|
mode_str = netns_modes_str[netns_mode];
|
|
else
|
|
mode_str = "unknown";
|
|
|
|
if (rd->json_output)
|
|
jsonw_string_field(rd->jw, "netns", mode_str);
|
|
else
|
|
pr_out("netns %s\n", mode_str);
|
|
}
|
|
return MNL_CB_OK;
|
|
}
|
|
|
|
static int sys_show_no_args(struct rd *rd)
|
|
{
|
|
uint32_t seq;
|
|
int ret;
|
|
|
|
rd_prepare_msg(rd, RDMA_NLDEV_CMD_SYS_GET,
|
|
&seq, (NLM_F_REQUEST | NLM_F_ACK));
|
|
ret = rd_send_msg(rd);
|
|
if (ret)
|
|
return ret;
|
|
|
|
return rd_recv_msg(rd, sys_show_parse_cb, rd, seq);
|
|
}
|
|
|
|
static int sys_show(struct rd *rd)
|
|
{
|
|
const struct rd_cmd cmds[] = {
|
|
{ NULL, sys_show_no_args},
|
|
{ "netns", sys_show_no_args},
|
|
{ 0 }
|
|
};
|
|
|
|
return rd_exec_cmd(rd, cmds, "parameter");
|
|
}
|
|
|
|
static int sys_set_netns_cmd(struct rd *rd, bool enable)
|
|
{
|
|
uint32_t seq;
|
|
|
|
rd_prepare_msg(rd, RDMA_NLDEV_CMD_SYS_SET,
|
|
&seq, (NLM_F_REQUEST | NLM_F_ACK));
|
|
mnl_attr_put_u8(rd->nlh, RDMA_NLDEV_SYS_ATTR_NETNS_MODE, enable);
|
|
|
|
return rd_sendrecv_msg(rd, seq);
|
|
}
|
|
|
|
static bool sys_valid_netns_cmd(const char *cmd)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(netns_modes_str); i++) {
|
|
if (!strcmp(cmd, netns_modes_str[i]))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static int sys_set_netns_args(struct rd *rd)
|
|
{
|
|
bool cmd;
|
|
|
|
if (rd_no_arg(rd) || !sys_valid_netns_cmd(rd_argv(rd))) {
|
|
pr_err("valid options are: { shared | exclusive }\n");
|
|
return -EINVAL;
|
|
}
|
|
|
|
cmd = (strcmp(rd_argv(rd), "shared") == 0) ? true : false;
|
|
|
|
return sys_set_netns_cmd(rd, cmd);
|
|
}
|
|
|
|
static int sys_set_help(struct rd *rd)
|
|
{
|
|
pr_out("Usage: %s system set [PARAM] value\n", rd->filename);
|
|
pr_out(" system set netns { shared | exclusive }\n");
|
|
return 0;
|
|
}
|
|
|
|
static int sys_set(struct rd *rd)
|
|
{
|
|
const struct rd_cmd cmds[] = {
|
|
{ NULL, sys_set_help },
|
|
{ "help", sys_set_help },
|
|
{ "netns", sys_set_netns_args},
|
|
{ 0 }
|
|
};
|
|
|
|
return rd_exec_cmd(rd, cmds, "parameter");
|
|
}
|
|
|
|
int cmd_sys(struct rd *rd)
|
|
{
|
|
const struct rd_cmd cmds[] = {
|
|
{ NULL, sys_show },
|
|
{ "show", sys_show },
|
|
{ "set", sys_set },
|
|
{ "help", sys_help },
|
|
{ 0 }
|
|
};
|
|
|
|
return rd_exec_cmd(rd, cmds, "system command");
|
|
}
|