]> git.proxmox.com Git - mirror_iproute2.git/blob - rdma/rdma.c
Merge branch 'main' into next
[mirror_iproute2.git] / rdma / rdma.c
1 // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
2 /*
3 * rdma.c RDMA tool
4 * Authors: Leon Romanovsky <leonro@mellanox.com>
5 */
6
7 #include "rdma.h"
8 #include "version.h"
9 #include "color.h"
10
11 static void help(char *name)
12 {
13 pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
14 " %s [ -f[orce] ] -b[atch] filename\n"
15 "where OBJECT := { dev | link | resource | system | statistic | help }\n"
16 " OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty] -r[aw]}\n", name, name);
17 }
18
19 static int cmd_help(struct rd *rd)
20 {
21 help(rd->filename);
22 return 0;
23 }
24
25 static int rd_cmd(struct rd *rd, int argc, char **argv)
26 {
27 const struct rd_cmd cmds[] = {
28 { NULL, cmd_help },
29 { "help", cmd_help },
30 { "dev", cmd_dev },
31 { "link", cmd_link },
32 { "resource", cmd_res },
33 { "system", cmd_sys },
34 { "statistic", cmd_stat },
35 { 0 }
36 };
37
38 rd->argc = argc;
39 rd->argv = argv;
40
41 return rd_exec_cmd(rd, cmds, "object");
42 }
43
44 static 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
80 static int rd_init(struct rd *rd, char *filename)
81 {
82 uint32_t seq;
83 int ret;
84
85 rd->filename = filename;
86 INIT_LIST_HEAD(&rd->dev_map_list);
87 INIT_LIST_HEAD(&rd->filter_list);
88
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
102 static void rd_cleanup(struct rd *rd)
103 {
104 rd_free(rd);
105 }
106
107 int 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' },
112 { "json", no_argument, NULL, 'j' },
113 { "pretty", no_argument, NULL, 'p' },
114 { "details", no_argument, NULL, 'd' },
115 { "raw", no_argument, NULL, 'r' },
116 { "force", no_argument, NULL, 'f' },
117 { "batch", required_argument, NULL, 'b' },
118 { NULL, 0, NULL, 0 }
119 };
120 bool show_driver_details = false;
121 const char *batch_file = NULL;
122 bool show_details = false;
123 bool json_output = false;
124 bool show_raw = false;
125 bool force = false;
126 struct rd rd = {};
127 char *filename;
128 int opt;
129 int err;
130 filename = basename(argv[0]);
131
132 while ((opt = getopt_long(argc, argv, ":Vhdrpjfb:",
133 long_options, NULL)) >= 0) {
134 switch (opt) {
135 case 'V':
136 printf("%s utility, iproute2-%s\n",
137 filename, version);
138 return EXIT_SUCCESS;
139 case 'p':
140 pretty = 1;
141 break;
142 case 'd':
143 if (show_details)
144 show_driver_details = true;
145 else
146 show_details = true;
147 break;
148 case 'r':
149 show_raw = true;
150 break;
151 case 'j':
152 json_output = 1;
153 break;
154 case 'f':
155 force = true;
156 break;
157 case 'b':
158 batch_file = optarg;
159 break;
160 case 'h':
161 help(filename);
162 return EXIT_SUCCESS;
163 case ':':
164 pr_err("-%c option requires an argument\n", optopt);
165 return EXIT_FAILURE;
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
176 rd.show_details = show_details;
177 rd.show_driver_details = show_driver_details;
178 rd.json_output = json_output;
179 rd.pretty_output = pretty;
180 rd.show_raw = show_raw;
181
182 err = rd_init(&rd, filename);
183 if (err)
184 goto out;
185
186 if (batch_file)
187 err = rd_batch(&rd, batch_file, force);
188 else
189 err = rd_cmd(&rd, argc, argv);
190 out:
191 /* Always cleanup */
192 rd_cleanup(&rd);
193 return err ? EXIT_FAILURE : EXIT_SUCCESS;
194 }