]> git.proxmox.com Git - mirror_iproute2.git/blame - rdma/rdma.c
Merge branch 'main' 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"
fbef6555 8#include "version.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"
7c01e0fc 16 " OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty] -r[aw]}\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' },
7c01e0fc 115 { "raw", no_argument, NULL, 'r' },
486fe5f0
LR
116 { "force", no_argument, NULL, 'f' },
117 { "batch", required_argument, NULL, 'b' },
74bd75c2
LR
118 { NULL, 0, NULL, 0 }
119 };
33115275 120 bool show_driver_details = false;
486fe5f0 121 const char *batch_file = NULL;
74bd75c2 122 bool show_details = false;
ab6e2b7b 123 bool json_output = false;
7c01e0fc 124 bool show_raw = false;
486fe5f0 125 bool force = false;
80c0478f 126 struct rd rd = {};
33115275 127 char *filename;
74bd75c2
LR
128 int opt;
129 int err;
74bd75c2
LR
130 filename = basename(argv[0]);
131
7c01e0fc 132 while ((opt = getopt_long(argc, argv, ":Vhdrpjfb:",
74bd75c2
LR
133 long_options, NULL)) >= 0) {
134 switch (opt) {
135 case 'V':
fbef6555
SH
136 printf("%s utility, iproute2-%s\n",
137 filename, version);
74bd75c2 138 return EXIT_SUCCESS;
ab6e2b7b 139 case 'p':
b0a688a5 140 pretty = 1;
ab6e2b7b 141 break;
74bd75c2 142 case 'd':
33115275
SW
143 if (show_details)
144 show_driver_details = true;
145 else
146 show_details = true;
74bd75c2 147 break;
7c01e0fc
MG
148 case 'r':
149 show_raw = true;
150 break;
ab6e2b7b 151 case 'j':
b0a688a5 152 json_output = 1;
ab6e2b7b 153 break;
486fe5f0
LR
154 case 'f':
155 force = true;
156 break;
157 case 'b':
158 batch_file = optarg;
159 break;
74bd75c2
LR
160 case 'h':
161 help(filename);
162 return EXIT_SUCCESS;
486fe5f0
LR
163 case ':':
164 pr_err("-%c option requires an argument\n", optopt);
165 return EXIT_FAILURE;
74bd75c2
LR
166 default:
167 pr_err("Unknown option.\n");
168 help(filename);
169 return EXIT_FAILURE;
170 }
171 }
172
173 argc -= optind;
174 argv += optind;
175
ab6e2b7b 176 rd.show_details = show_details;
33115275 177 rd.show_driver_details = show_driver_details;
ab6e2b7b 178 rd.json_output = json_output;
b0a688a5 179 rd.pretty_output = pretty;
7c01e0fc 180 rd.show_raw = show_raw;
ab6e2b7b 181
486fe5f0 182 err = rd_init(&rd, filename);
74bd75c2
LR
183 if (err)
184 goto out;
185
486fe5f0
LR
186 if (batch_file)
187 err = rd_batch(&rd, batch_file, force);
188 else
189 err = rd_cmd(&rd, argc, argv);
74bd75c2
LR
190out:
191 /* Always cleanup */
7109f4b2 192 rd_cleanup(&rd);
74bd75c2
LR
193 return err ? EXIT_FAILURE : EXIT_SUCCESS;
194}