1 // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
8 static int sys_help(struct rd
*rd
)
10 pr_out("Usage: %s system show [ netns ]\n", rd
->filename
);
11 pr_out(" %s system set netns { shared | exclusive }\n", rd
->filename
);
15 static const char *netns_modes_str
[] = {
20 static int sys_show_parse_cb(const struct nlmsghdr
*nlh
, void *data
)
22 struct nlattr
*tb
[RDMA_NLDEV_ATTR_MAX
] = {};
24 mnl_attr_parse(nlh
, 0, rd_attr_cb
, tb
);
26 if (tb
[RDMA_NLDEV_SYS_ATTR_NETNS_MODE
]) {
31 mnl_attr_get_u8(tb
[RDMA_NLDEV_SYS_ATTR_NETNS_MODE
]);
33 if (netns_mode
< ARRAY_SIZE(netns_modes_str
))
34 mode_str
= netns_modes_str
[netns_mode
];
38 print_color_string(PRINT_ANY
, COLOR_NONE
, "netns", "netns %s\n",
44 static int sys_show_no_args(struct rd
*rd
)
49 rd_prepare_msg(rd
, RDMA_NLDEV_CMD_SYS_GET
,
50 &seq
, (NLM_F_REQUEST
| NLM_F_ACK
));
51 ret
= rd_send_msg(rd
);
55 return rd_recv_msg(rd
, sys_show_parse_cb
, rd
, seq
);
58 static int sys_show(struct rd
*rd
)
60 const struct rd_cmd cmds
[] = {
61 { NULL
, sys_show_no_args
},
62 { "netns", sys_show_no_args
},
66 return rd_exec_cmd(rd
, cmds
, "parameter");
69 static int sys_set_netns_cmd(struct rd
*rd
, bool enable
)
73 rd_prepare_msg(rd
, RDMA_NLDEV_CMD_SYS_SET
,
74 &seq
, (NLM_F_REQUEST
| NLM_F_ACK
));
75 mnl_attr_put_u8(rd
->nlh
, RDMA_NLDEV_SYS_ATTR_NETNS_MODE
, enable
);
77 return rd_sendrecv_msg(rd
, seq
);
80 static bool sys_valid_netns_cmd(const char *cmd
)
84 for (i
= 0; i
< ARRAY_SIZE(netns_modes_str
); i
++) {
85 if (!strcmp(cmd
, netns_modes_str
[i
]))
91 static int sys_set_netns_args(struct rd
*rd
)
95 if (rd_no_arg(rd
) || !sys_valid_netns_cmd(rd_argv(rd
))) {
96 pr_err("valid options are: { shared | exclusive }\n");
100 cmd
= (strcmp(rd_argv(rd
), "shared") == 0) ? true : false;
102 return sys_set_netns_cmd(rd
, cmd
);
105 static int sys_set_help(struct rd
*rd
)
107 pr_out("Usage: %s system set [PARAM] value\n", rd
->filename
);
108 pr_out(" system set netns { shared | exclusive }\n");
112 static int sys_set(struct rd
*rd
)
114 const struct rd_cmd cmds
[] = {
115 { NULL
, sys_set_help
},
116 { "help", sys_set_help
},
117 { "netns", sys_set_netns_args
},
121 return rd_exec_cmd(rd
, cmds
, "parameter");
124 int cmd_sys(struct rd
*rd
)
126 const struct rd_cmd cmds
[] = {
128 { "show", sys_show
},
130 { "help", sys_help
},
134 return rd_exec_cmd(rd
, cmds
, "system command");