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