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:
parent
8f5cfd23cd
commit
4336c5821a
78
rdma/link.c
78
rdma/link.c
|
|
@ -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 },
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue