1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606 * Copyright(c) 2018 Intel Corporation.
3d30ea906Sjfb8856606 */
4d30ea906Sjfb8856606
5d30ea906Sjfb8856606 #include <cmdline_rdline.h>
6d30ea906Sjfb8856606 #include <cmdline_parse.h>
7d30ea906Sjfb8856606 #include <cmdline_parse_ipaddr.h>
8d30ea906Sjfb8856606 #include <cmdline_parse_num.h>
9d30ea906Sjfb8856606 #include <cmdline_parse_string.h>
10d30ea906Sjfb8856606 #include <cmdline.h>
11d30ea906Sjfb8856606 #include <rte_ethdev.h>
12d30ea906Sjfb8856606
13d30ea906Sjfb8856606 /**********************************************************/
14d30ea906Sjfb8856606
15d30ea906Sjfb8856606 struct cmd_help_result {
16d30ea906Sjfb8856606 cmdline_fixed_string_t help;
17d30ea906Sjfb8856606 };
18d30ea906Sjfb8856606
cmd_help_parsed(__rte_unused void * parsed_result,struct cmdline * cl,__rte_unused void * data)19*2d9fd380Sjfb8856606 static void cmd_help_parsed(__rte_unused void *parsed_result,
20d30ea906Sjfb8856606 struct cmdline *cl,
21*2d9fd380Sjfb8856606 __rte_unused void *data)
22d30ea906Sjfb8856606 {
23d30ea906Sjfb8856606 cmdline_printf(cl,
24d30ea906Sjfb8856606 "commands:\n"
25d30ea906Sjfb8856606 "- attach <devargs>\n"
26d30ea906Sjfb8856606 "- detach <devargs>\n"
27d30ea906Sjfb8856606 "- list\n\n");
28d30ea906Sjfb8856606 }
29d30ea906Sjfb8856606
30d30ea906Sjfb8856606 cmdline_parse_token_string_t cmd_help_help =
31d30ea906Sjfb8856606 TOKEN_STRING_INITIALIZER(struct cmd_help_result, help, "help");
32d30ea906Sjfb8856606
33d30ea906Sjfb8856606 cmdline_parse_inst_t cmd_help = {
34d30ea906Sjfb8856606 .f = cmd_help_parsed, /* function to call */
35d30ea906Sjfb8856606 .data = NULL, /* 2nd arg of func */
36d30ea906Sjfb8856606 .help_str = "show help",
37d30ea906Sjfb8856606 .tokens = { /* token list, NULL terminated */
38d30ea906Sjfb8856606 (void *)&cmd_help_help,
39d30ea906Sjfb8856606 NULL,
40d30ea906Sjfb8856606 },
41d30ea906Sjfb8856606 };
42d30ea906Sjfb8856606
43d30ea906Sjfb8856606 /**********************************************************/
44d30ea906Sjfb8856606
45d30ea906Sjfb8856606 struct cmd_quit_result {
46d30ea906Sjfb8856606 cmdline_fixed_string_t quit;
47d30ea906Sjfb8856606 };
48d30ea906Sjfb8856606
cmd_quit_parsed(__rte_unused void * parsed_result,struct cmdline * cl,__rte_unused void * data)49*2d9fd380Sjfb8856606 static void cmd_quit_parsed(__rte_unused void *parsed_result,
50d30ea906Sjfb8856606 struct cmdline *cl,
51*2d9fd380Sjfb8856606 __rte_unused void *data)
52d30ea906Sjfb8856606 {
53d30ea906Sjfb8856606 cmdline_quit(cl);
54d30ea906Sjfb8856606 }
55d30ea906Sjfb8856606
56d30ea906Sjfb8856606 cmdline_parse_token_string_t cmd_quit_quit =
57d30ea906Sjfb8856606 TOKEN_STRING_INITIALIZER(struct cmd_quit_result, quit, "quit");
58d30ea906Sjfb8856606
59d30ea906Sjfb8856606 cmdline_parse_inst_t cmd_quit = {
60d30ea906Sjfb8856606 .f = cmd_quit_parsed, /* function to call */
61d30ea906Sjfb8856606 .data = NULL, /* 2nd arg of func */
62d30ea906Sjfb8856606 .help_str = "quit",
63d30ea906Sjfb8856606 .tokens = { /* token list, NULL terminated */
64d30ea906Sjfb8856606 (void *)&cmd_quit_quit,
65d30ea906Sjfb8856606 NULL,
66d30ea906Sjfb8856606 },
67d30ea906Sjfb8856606 };
68d30ea906Sjfb8856606
69d30ea906Sjfb8856606 /**********************************************************/
70d30ea906Sjfb8856606
71d30ea906Sjfb8856606 struct cmd_list_result {
72d30ea906Sjfb8856606 cmdline_fixed_string_t list;
73d30ea906Sjfb8856606 };
74d30ea906Sjfb8856606
cmd_list_parsed(__rte_unused void * parsed_result,struct cmdline * cl,__rte_unused void * data)75*2d9fd380Sjfb8856606 static void cmd_list_parsed(__rte_unused void *parsed_result,
76d30ea906Sjfb8856606 struct cmdline *cl,
77*2d9fd380Sjfb8856606 __rte_unused void *data)
78d30ea906Sjfb8856606 {
79d30ea906Sjfb8856606 uint16_t port_id;
80d30ea906Sjfb8856606 char dev_name[RTE_DEV_NAME_MAX_LEN];
81d30ea906Sjfb8856606
82d30ea906Sjfb8856606 cmdline_printf(cl, "list all etherdev\n");
83d30ea906Sjfb8856606
84d30ea906Sjfb8856606 RTE_ETH_FOREACH_DEV(port_id) {
85d30ea906Sjfb8856606 rte_eth_dev_get_name_by_port(port_id, dev_name);
86d30ea906Sjfb8856606 if (strlen(dev_name) > 0)
87d30ea906Sjfb8856606 cmdline_printf(cl, "%d\t%s\n", port_id, dev_name);
88d30ea906Sjfb8856606 else
89d30ea906Sjfb8856606 printf("empty dev_name is not expected!\n");
90d30ea906Sjfb8856606 }
91d30ea906Sjfb8856606 }
92d30ea906Sjfb8856606
93d30ea906Sjfb8856606 cmdline_parse_token_string_t cmd_list_list =
94d30ea906Sjfb8856606 TOKEN_STRING_INITIALIZER(struct cmd_list_result, list, "list");
95d30ea906Sjfb8856606
96d30ea906Sjfb8856606 cmdline_parse_inst_t cmd_list = {
97d30ea906Sjfb8856606 .f = cmd_list_parsed, /* function to call */
98d30ea906Sjfb8856606 .data = NULL, /* 2nd arg of func */
99d30ea906Sjfb8856606 .help_str = "list all devices",
100d30ea906Sjfb8856606 .tokens = { /* token list, NULL terminated */
101d30ea906Sjfb8856606 (void *)&cmd_list_list,
102d30ea906Sjfb8856606 NULL,
103d30ea906Sjfb8856606 },
104d30ea906Sjfb8856606 };
105d30ea906Sjfb8856606
106d30ea906Sjfb8856606 /**********************************************************/
107d30ea906Sjfb8856606
108d30ea906Sjfb8856606 struct cmd_dev_attach_result {
109d30ea906Sjfb8856606 cmdline_fixed_string_t attach;
110d30ea906Sjfb8856606 cmdline_fixed_string_t devargs;
111d30ea906Sjfb8856606 };
112d30ea906Sjfb8856606
cmd_dev_attach_parsed(void * parsed_result,struct cmdline * cl,__rte_unused void * data)113d30ea906Sjfb8856606 static void cmd_dev_attach_parsed(void *parsed_result,
114d30ea906Sjfb8856606 struct cmdline *cl,
115*2d9fd380Sjfb8856606 __rte_unused void *data)
116d30ea906Sjfb8856606 {
117d30ea906Sjfb8856606 struct cmd_dev_attach_result *res = parsed_result;
118d30ea906Sjfb8856606 struct rte_devargs da;
119d30ea906Sjfb8856606
120d30ea906Sjfb8856606 memset(&da, 0, sizeof(da));
121d30ea906Sjfb8856606
122d30ea906Sjfb8856606 if (rte_devargs_parsef(&da, "%s", res->devargs)) {
123d30ea906Sjfb8856606 cmdline_printf(cl, "cannot parse devargs\n");
124d30ea906Sjfb8856606 if (da.args)
125d30ea906Sjfb8856606 free(da.args);
126d30ea906Sjfb8856606 return;
127d30ea906Sjfb8856606 }
128d30ea906Sjfb8856606
129d30ea906Sjfb8856606 if (!rte_eal_hotplug_add(da.bus->name, da.name, da.args))
130d30ea906Sjfb8856606 cmdline_printf(cl, "attached device %s\n", da.name);
131d30ea906Sjfb8856606 else
132d30ea906Sjfb8856606 cmdline_printf(cl, "failed to attached device %s\n",
133d30ea906Sjfb8856606 da.name);
134d30ea906Sjfb8856606 }
135d30ea906Sjfb8856606
136d30ea906Sjfb8856606 cmdline_parse_token_string_t cmd_dev_attach_attach =
137d30ea906Sjfb8856606 TOKEN_STRING_INITIALIZER(struct cmd_dev_attach_result, attach,
138d30ea906Sjfb8856606 "attach");
139d30ea906Sjfb8856606 cmdline_parse_token_string_t cmd_dev_attach_devargs =
140d30ea906Sjfb8856606 TOKEN_STRING_INITIALIZER(struct cmd_dev_attach_result, devargs, NULL);
141d30ea906Sjfb8856606
142d30ea906Sjfb8856606 cmdline_parse_inst_t cmd_attach_device = {
143d30ea906Sjfb8856606 .f = cmd_dev_attach_parsed, /* function to call */
144d30ea906Sjfb8856606 .data = NULL, /* 2nd arg of func */
145d30ea906Sjfb8856606 .help_str = "attach a device",
146d30ea906Sjfb8856606 .tokens = { /* token list, NULL terminated */
147d30ea906Sjfb8856606 (void *)&cmd_dev_attach_attach,
148d30ea906Sjfb8856606 (void *)&cmd_dev_attach_devargs,
149d30ea906Sjfb8856606 NULL,
150d30ea906Sjfb8856606 },
151d30ea906Sjfb8856606 };
152d30ea906Sjfb8856606
153d30ea906Sjfb8856606 /**********************************************************/
154d30ea906Sjfb8856606
155d30ea906Sjfb8856606 struct cmd_dev_detach_result {
156d30ea906Sjfb8856606 cmdline_fixed_string_t detach;
157d30ea906Sjfb8856606 cmdline_fixed_string_t devargs;
158d30ea906Sjfb8856606 };
159d30ea906Sjfb8856606
cmd_dev_detach_parsed(void * parsed_result,struct cmdline * cl,__rte_unused void * data)160d30ea906Sjfb8856606 static void cmd_dev_detach_parsed(void *parsed_result,
161d30ea906Sjfb8856606 struct cmdline *cl,
162*2d9fd380Sjfb8856606 __rte_unused void *data)
163d30ea906Sjfb8856606 {
164d30ea906Sjfb8856606 struct cmd_dev_detach_result *res = parsed_result;
165d30ea906Sjfb8856606 struct rte_devargs da;
166d30ea906Sjfb8856606
167d30ea906Sjfb8856606 memset(&da, 0, sizeof(da));
168d30ea906Sjfb8856606
169d30ea906Sjfb8856606 if (rte_devargs_parsef(&da, "%s", res->devargs)) {
170d30ea906Sjfb8856606 cmdline_printf(cl, "cannot parse devargs\n");
171d30ea906Sjfb8856606 if (da.args)
172d30ea906Sjfb8856606 free(da.args);
173d30ea906Sjfb8856606 return;
174d30ea906Sjfb8856606 }
175d30ea906Sjfb8856606
176d30ea906Sjfb8856606 printf("detaching...\n");
177d30ea906Sjfb8856606 if (!rte_eal_hotplug_remove(da.bus->name, da.name))
178d30ea906Sjfb8856606 cmdline_printf(cl, "detached device %s\n",
179d30ea906Sjfb8856606 da.name);
180d30ea906Sjfb8856606 else
181d30ea906Sjfb8856606 cmdline_printf(cl, "failed to dettach device %s\n",
182d30ea906Sjfb8856606 da.name);
183d30ea906Sjfb8856606 }
184d30ea906Sjfb8856606
185d30ea906Sjfb8856606 cmdline_parse_token_string_t cmd_dev_detach_detach =
186d30ea906Sjfb8856606 TOKEN_STRING_INITIALIZER(struct cmd_dev_detach_result, detach,
187d30ea906Sjfb8856606 "detach");
188d30ea906Sjfb8856606
189d30ea906Sjfb8856606 cmdline_parse_token_string_t cmd_dev_detach_devargs =
190d30ea906Sjfb8856606 TOKEN_STRING_INITIALIZER(struct cmd_dev_detach_result, devargs, NULL);
191d30ea906Sjfb8856606
192d30ea906Sjfb8856606 cmdline_parse_inst_t cmd_detach_device = {
193d30ea906Sjfb8856606 .f = cmd_dev_detach_parsed, /* function to call */
194d30ea906Sjfb8856606 .data = NULL, /* 2nd arg of func */
195d30ea906Sjfb8856606 .help_str = "detach a device",
196d30ea906Sjfb8856606 .tokens = { /* token list, NULL terminated */
197d30ea906Sjfb8856606 (void *)&cmd_dev_detach_detach,
198d30ea906Sjfb8856606 (void *)&cmd_dev_detach_devargs,
199d30ea906Sjfb8856606 NULL,
200d30ea906Sjfb8856606 },
201d30ea906Sjfb8856606 };
202d30ea906Sjfb8856606
203d30ea906Sjfb8856606 /**********************************************************/
204d30ea906Sjfb8856606 /**********************************************************/
205d30ea906Sjfb8856606 /****** CONTEXT (list of instruction) */
206d30ea906Sjfb8856606
207d30ea906Sjfb8856606 cmdline_parse_ctx_t main_ctx[] = {
208d30ea906Sjfb8856606 (cmdline_parse_inst_t *)&cmd_help,
209d30ea906Sjfb8856606 (cmdline_parse_inst_t *)&cmd_quit,
210d30ea906Sjfb8856606 (cmdline_parse_inst_t *)&cmd_list,
211d30ea906Sjfb8856606 (cmdline_parse_inst_t *)&cmd_attach_device,
212d30ea906Sjfb8856606 (cmdline_parse_inst_t *)&cmd_detach_device,
213d30ea906Sjfb8856606 NULL,
214d30ea906Sjfb8856606 };
215