rdma: add 'link add/delete' commands

Add new 'link' subcommand 'add' and 'delete' to allow binding a soft-rdma
device to a netdev interface.

EG:

rdma link add rxe_eth0 type rxe netdev eth0
rdma link delete rxe_eth0

Signed-off-by: Steve Wise <larrystevenwise@gmail.com>
Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
Steve Wise 2019-04-03 12:10:31 -05:00 committed by David Ahern
parent 8f5cfd23cd
commit 4336c5821a
2 changed files with 80 additions and 0 deletions

View File

@ -9,6 +9,9 @@
static int link_help(struct rd *rd)
{
pr_out("Usage: %s link show [DEV/PORT_INDEX]\n", rd->filename);
pr_out("Usage: %s link add NAME type TYPE netdev NETDEV\n",
rd->filename);
pr_out("Usage: %s link delete NAME\n", rd->filename);
return 0;
}
@ -336,10 +339,85 @@ static int link_show(struct rd *rd)
return rd_exec_link(rd, link_one_show, true);
}
static int link_add_netdev(struct rd *rd)
{
char *link_netdev;
uint32_t seq;
if (rd_no_arg(rd)) {
pr_err("Please provide a net device name.\n");
return -EINVAL;
}
link_netdev = rd_argv(rd);
rd_prepare_msg(rd, RDMA_NLDEV_CMD_NEWLINK, &seq,
(NLM_F_REQUEST | NLM_F_ACK));
mnl_attr_put_strz(rd->nlh, RDMA_NLDEV_ATTR_DEV_NAME, rd->link_name);
mnl_attr_put_strz(rd->nlh, RDMA_NLDEV_ATTR_LINK_TYPE, rd->link_type);
mnl_attr_put_strz(rd->nlh, RDMA_NLDEV_ATTR_NDEV_NAME, link_netdev);
return rd_sendrecv_msg(rd, seq);
}
static int link_add_type(struct rd *rd)
{
const struct rd_cmd cmds[] = {
{ NULL, link_help},
{ "netdev", link_add_netdev},
{ 0 }
};
if (rd_no_arg(rd)) {
pr_err("Please provide a link type name.\n");
return -EINVAL;
}
rd->link_type = rd_argv(rd);
rd_arg_inc(rd);
return rd_exec_cmd(rd, cmds, "parameter");
}
static int link_add(struct rd *rd)
{
const struct rd_cmd cmds[] = {
{ NULL, link_help},
{ "type", link_add_type},
{ 0 }
};
if (rd_no_arg(rd)) {
pr_err("Please provide a link name to add.\n");
return -EINVAL;
}
rd->link_name = rd_argv(rd);
rd_arg_inc(rd);
return rd_exec_cmd(rd, cmds, "parameter");
}
static int _link_del(struct rd *rd)
{
uint32_t seq;
if (!rd_no_arg(rd)) {
pr_err("Unknown parameter %s\n", rd_argv(rd));
return -EINVAL;
}
rd_prepare_msg(rd, RDMA_NLDEV_CMD_DELLINK, &seq,
(NLM_F_REQUEST | NLM_F_ACK));
mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx);
return rd_sendrecv_msg(rd, seq);
}
static int link_del(struct rd *rd)
{
return rd_exec_require_dev(rd, _link_del);
}
int cmd_link(struct rd *rd)
{
const struct rd_cmd cmds[] = {
{ NULL, link_show },
{ "add", link_add },
{ "delete", link_del },
{ "show", link_show },
{ "list", link_show },
{ "help", link_help },

View File

@ -70,6 +70,8 @@ struct rd {
bool pretty_output;
bool suppress_errors;
struct list_head filter_list;
char *link_name;
char *link_type;
};
struct rd_cmd {