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
] = {};
25 mnl_attr_parse(nlh
, 0, rd_attr_cb
, tb
);
27 if (tb
[RDMA_NLDEV_SYS_ATTR_NETNS_MODE
]) {
32 mnl_attr_get_u8(tb
[RDMA_NLDEV_SYS_ATTR_NETNS_MODE
]);
34 if (netns_mode
<= ARRAY_SIZE(netns_modes_str
))
35 mode_str
= netns_modes_str
[netns_mode
];
40 jsonw_string_field(rd
->jw
, "netns", mode_str
);
42 pr_out("netns %s\n", mode_str
);
47 static int sys_show_no_args(struct rd
*rd
)
52 rd_prepare_msg(rd
, RDMA_NLDEV_CMD_SYS_GET
,
53 &seq
, (NLM_F_REQUEST
| NLM_F_ACK
));
54 ret
= rd_send_msg(rd
);
58 return rd_recv_msg(rd
, sys_show_parse_cb
, rd
, seq
);
61 static int sys_show(struct rd
*rd
)
63 const struct rd_cmd cmds
[] = {
64 { NULL
, sys_show_no_args
},
65 { "netns", sys_show_no_args
},
69 return rd_exec_cmd(rd
, cmds
, "parameter");
72 static int sys_set_netns_cmd(struct rd
*rd
, bool enable
)
76 rd_prepare_msg(rd
, RDMA_NLDEV_CMD_SYS_SET
,
77 &seq
, (NLM_F_REQUEST
| NLM_F_ACK
));
78 mnl_attr_put_u8(rd
->nlh
, RDMA_NLDEV_SYS_ATTR_NETNS_MODE
, enable
);
80 return rd_sendrecv_msg(rd
, seq
);
83 static bool sys_valid_netns_cmd(const char *cmd
)
87 for (i
= 0; i
< ARRAY_SIZE(netns_modes_str
); i
++) {
88 if (!strcmp(cmd
, netns_modes_str
[i
]))
94 static int sys_set_netns_args(struct rd
*rd
)
98 if (rd_no_arg(rd
) || !sys_valid_netns_cmd(rd_argv(rd
))) {
99 pr_err("valid options are: { shared | exclusive }\n");
103 cmd
= (strcmp(rd_argv(rd
), "shared") == 0) ? true : false;
105 return sys_set_netns_cmd(rd
, cmd
);
108 static int sys_set_help(struct rd
*rd
)
110 pr_out("Usage: %s system set [PARAM] value\n", rd
->filename
);
111 pr_out(" system set netns { shared | exclusive }\n");
115 static int sys_set(struct rd
*rd
)
117 const struct rd_cmd cmds
[] = {
118 { NULL
, sys_set_help
},
119 { "help", sys_set_help
},
120 { "netns", sys_set_netns_args
},
124 return rd_exec_cmd(rd
, cmds
, "parameter");
127 int cmd_sys(struct rd
*rd
)
129 const struct rd_cmd cmds
[] = {
131 { "show", sys_show
},
133 { "help", sys_help
},
137 return rd_exec_cmd(rd
, cmds
, "system command");