|
4 | 4 | * Authors: Leon Romanovsky <leonro@mellanox.com>
|
5 | 5 | */
|
6 | 6 |
|
| 7 | +#include <fcntl.h> |
7 | 8 | #include "rdma.h"
|
8 | 9 |
|
9 | 10 | static int dev_help(struct rd *rd)
|
10 | 11 | {
|
11 | 12 | pr_out("Usage: %s dev show [DEV]\n", rd->filename);
|
12 | 13 | pr_out(" %s dev set [DEV] name DEVNAME\n", rd->filename);
|
| 14 | + pr_out(" %s dev set [DEV] netns NSNAME\n", rd->filename); |
13 | 15 | return 0;
|
14 | 16 | }
|
15 | 17 |
|
@@ -272,11 +274,46 @@ static int dev_set_name(struct rd *rd)
|
272 | 274 | return rd_sendrecv_msg(rd, seq);
|
273 | 275 | }
|
274 | 276 |
|
| 277 | +static int dev_set_netns(struct rd *rd) |
| 278 | +{ |
| 279 | + char *netns_path; |
| 280 | + uint32_t seq; |
| 281 | + int netns; |
| 282 | + int ret; |
| 283 | + |
| 284 | + if (rd_no_arg(rd)) { |
| 285 | + pr_err("Please provide device name.\n"); |
| 286 | + return -EINVAL; |
| 287 | + } |
| 288 | + |
| 289 | + if (asprintf(&netns_path, "%s/%s", NETNS_RUN_DIR, rd_argv(rd)) < 0) |
| 290 | + return -ENOMEM; |
| 291 | + |
| 292 | + netns = open(netns_path, O_RDONLY | O_CLOEXEC); |
| 293 | + if (netns < 0) { |
| 294 | + fprintf(stderr, "Cannot open network namespace \"%s\": %s\n", |
| 295 | + rd_argv(rd), strerror(errno)); |
| 296 | + ret = -EINVAL; |
| 297 | + goto done; |
| 298 | + } |
| 299 | + |
| 300 | + rd_prepare_msg(rd, RDMA_NLDEV_CMD_SET, |
| 301 | + &seq, (NLM_F_REQUEST | NLM_F_ACK)); |
| 302 | + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); |
| 303 | + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_NET_NS_FD, netns); |
| 304 | + ret = rd_sendrecv_msg(rd, seq); |
| 305 | + close(netns); |
| 306 | +done: |
| 307 | + free(netns_path); |
| 308 | + return ret; |
| 309 | +} |
| 310 | + |
275 | 311 | static int dev_one_set(struct rd *rd)
|
276 | 312 | {
|
277 | 313 | const struct rd_cmd cmds[] = {
|
278 | 314 | { NULL, dev_help},
|
279 | 315 | { "name", dev_set_name},
|
| 316 | + { "netns", dev_set_netns}, |
280 | 317 | { 0 }
|
281 | 318 | };
|
282 | 319 |
|
|
0 commit comments