]> git.proxmox.com Git - mirror_iproute2.git/blame - rdma/rdma.c
Merge branch 'master' into next
[mirror_iproute2.git] / rdma / rdma.c
CommitLineData
835d8321 1// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
74bd75c2
LR
2/*
3 * rdma.c RDMA tool
74bd75c2
LR
4 * Authors: Leon Romanovsky <leonro@mellanox.com>
5 */
6
7#include "rdma.h"
8#include "SNAPSHOT.h"
b0a688a5 9#include "color.h"
74bd75c2
LR
10
11static void help(char *name)
12{
13 pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
486fe5f0 14 " %s [ -f[orce] ] -b[atch] filename\n"
5937552b 15 "where OBJECT := { dev | link | resource | system | statistic | help }\n"
486fe5f0 16 " OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty]}\n", name, name);
74bd75c2
LR
17}
18
19static int cmd_help(struct rd *rd)
20{
21 help(rd->filename);
22 return 0;
23}
24
486fe5f0 25static int rd_cmd(struct rd *rd, int argc, char **argv)
74bd75c2
LR
26{
27 const struct rd_cmd cmds[] = {
28 { NULL, cmd_help },
29 { "help", cmd_help },
40df8263 30 { "dev", cmd_dev },
da990ab4 31 { "link", cmd_link },
923aa825 32 { "resource", cmd_res },
c4572a46 33 { "system", cmd_sys },
5937552b 34 { "statistic", cmd_stat },
74bd75c2
LR
35 { 0 }
36 };
37
486fe5f0
LR
38 rd->argc = argc;
39 rd->argv = argv;
40
74bd75c2
LR
41 return rd_exec_cmd(rd, cmds, "object");
42}
43
486fe5f0
LR
44static int rd_batch(struct rd *rd, const char *name, bool force)
45{
46 char *line = NULL;
47 size_t len = 0;
48 int ret = 0;
49
50 if (name && strcmp(name, "-") != 0) {
51 if (!freopen(name, "r", stdin)) {
52 pr_err("Cannot open file \"%s\" for reading: %s\n",
53 name, strerror(errno));
54 return errno;
55 }
56 }
57
58 cmdlineno = 0;
59 while (getcmdline(&line, &len, stdin) != -1) {
60 char *largv[512];
61 int largc;
62
63 largc = makeargs(line, largv, ARRAY_SIZE(largv));
64 if (!largc)
65 continue; /* blank line */
66
67 ret = rd_cmd(rd, largc, largv);
68 if (ret) {
69 pr_err("Command failed %s:%d\n", name, cmdlineno);
70 if (!force)
71 break;
72 }
73 }
74
75 free(line);
76
77 return ret;
78}
79
80static int rd_init(struct rd *rd, char *filename)
74bd75c2
LR
81{
82 uint32_t seq;
83 int ret;
84
85 rd->filename = filename;
74bd75c2 86 INIT_LIST_HEAD(&rd->dev_map_list);
1174be72 87 INIT_LIST_HEAD(&rd->filter_list);
ab6e2b7b 88
74bd75c2
LR
89 rd->buff = malloc(MNL_SOCKET_BUFFER_SIZE);
90 if (!rd->buff)
91 return -ENOMEM;
92
93 rd_prepare_msg(rd, RDMA_NLDEV_CMD_GET,
94 &seq, (NLM_F_REQUEST | NLM_F_ACK | NLM_F_DUMP));
95 ret = rd_send_msg(rd);
96 if (ret)
97 return ret;
98
99 return rd_recv_msg(rd, rd_dev_init_cb, rd, seq);
100}
101
7109f4b2 102static void rd_cleanup(struct rd *rd)
74bd75c2 103{
5fc17280 104 rd_free(rd);
74bd75c2
LR
105}
106
107int main(int argc, char **argv)
108{
109 static const struct option long_options[] = {
110 { "version", no_argument, NULL, 'V' },
111 { "help", no_argument, NULL, 'h' },
ab6e2b7b
LR
112 { "json", no_argument, NULL, 'j' },
113 { "pretty", no_argument, NULL, 'p' },
74bd75c2 114 { "details", no_argument, NULL, 'd' },
486fe5f0
LR
115 { "force", no_argument, NULL, 'f' },
116 { "batch", required_argument, NULL, 'b' },
74bd75c2
LR
117 { NULL, 0, NULL, 0 }
118 };
33115275 119 bool show_driver_details = false;
486fe5f0 120 const char *batch_file = NULL;
74bd75c2 121 bool show_details = false;
ab6e2b7b 122 bool json_output = false;
486fe5f0 123 bool force = false;
80c0478f 124 struct rd rd = {};
33115275 125 char *filename;
74bd75c2
LR
126 int opt;
127 int err;
74bd75c2
LR
128 filename = basename(argv[0]);
129
486fe5f0 130 while ((opt = getopt_long(argc, argv, ":Vhdpjfb:",
74bd75c2
LR
131 long_options, NULL)) >= 0) {
132 switch (opt) {
133 case 'V':
134 printf("%s utility, iproute2-ss%s\n",
135 filename, SNAPSHOT);
136 return EXIT_SUCCESS;
ab6e2b7b 137 case 'p':
b0a688a5 138 pretty = 1;
ab6e2b7b 139 break;
74bd75c2 140 case 'd':
33115275
SW
141 if (show_details)
142 show_driver_details = true;
143 else
144 show_details = true;
74bd75c2 145 break;
ab6e2b7b 146 case 'j':
b0a688a5 147 json_output = 1;
ab6e2b7b 148 break;
486fe5f0
LR
149 case 'f':
150 force = true;
151 break;
152 case 'b':
153 batch_file = optarg;
154 break;
74bd75c2
LR
155 case 'h':
156 help(filename);
157 return EXIT_SUCCESS;
486fe5f0
LR
158 case ':':
159 pr_err("-%c option requires an argument\n", optopt);
160 return EXIT_FAILURE;
74bd75c2
LR
161 default:
162 pr_err("Unknown option.\n");
163 help(filename);
164 return EXIT_FAILURE;
165 }
166 }
167
168 argc -= optind;
169 argv += optind;
170
ab6e2b7b 171 rd.show_details = show_details;
33115275 172 rd.show_driver_details = show_driver_details;
ab6e2b7b 173 rd.json_output = json_output;
b0a688a5 174 rd.pretty_output = pretty;
ab6e2b7b 175
486fe5f0 176 err = rd_init(&rd, filename);
74bd75c2
LR
177 if (err)
178 goto out;
179
486fe5f0
LR
180 if (batch_file)
181 err = rd_batch(&rd, batch_file, force);
182 else
183 err = rd_cmd(&rd, argc, argv);
74bd75c2
LR
184out:
185 /* Always cleanup */
7109f4b2 186 rd_cleanup(&rd);
74bd75c2
LR
187 return err ? EXIT_FAILURE : EXIT_SUCCESS;
188}