105f1d684SQi Zhang /* SPDX-License-Identifier: BSD-3-Clause
205f1d684SQi Zhang  * Copyright(c) 2018 Intel Corporation.
305f1d684SQi Zhang  */
405f1d684SQi Zhang 
505f1d684SQi Zhang #include <cmdline_rdline.h>
605f1d684SQi Zhang #include <cmdline_parse.h>
705f1d684SQi Zhang #include <cmdline_parse_ipaddr.h>
805f1d684SQi Zhang #include <cmdline_parse_num.h>
905f1d684SQi Zhang #include <cmdline_parse_string.h>
1005f1d684SQi Zhang #include <cmdline.h>
1105f1d684SQi Zhang #include <rte_ethdev.h>
1205f1d684SQi Zhang 
1305f1d684SQi Zhang /**********************************************************/
1405f1d684SQi Zhang 
1505f1d684SQi Zhang struct cmd_help_result {
1605f1d684SQi Zhang 	cmdline_fixed_string_t help;
1705f1d684SQi Zhang };
1805f1d684SQi Zhang 
cmd_help_parsed(__rte_unused void * parsed_result,struct cmdline * cl,__rte_unused void * data)19f2fc83b4SThomas Monjalon static void cmd_help_parsed(__rte_unused void *parsed_result,
2005f1d684SQi Zhang 			    struct cmdline *cl,
21f2fc83b4SThomas Monjalon 			    __rte_unused void *data)
2205f1d684SQi Zhang {
2305f1d684SQi Zhang 	cmdline_printf(cl,
2405f1d684SQi Zhang 		       "commands:\n"
2505f1d684SQi Zhang 		       "- attach <devargs>\n"
2605f1d684SQi Zhang 		       "- detach <devargs>\n"
2705f1d684SQi Zhang 		       "- list\n\n");
2805f1d684SQi Zhang }
2905f1d684SQi Zhang 
3005f1d684SQi Zhang cmdline_parse_token_string_t cmd_help_help =
3105f1d684SQi Zhang 	TOKEN_STRING_INITIALIZER(struct cmd_help_result, help, "help");
3205f1d684SQi Zhang 
3305f1d684SQi Zhang cmdline_parse_inst_t cmd_help = {
3405f1d684SQi Zhang 	.f = cmd_help_parsed,  /* function to call */
3505f1d684SQi Zhang 	.data = NULL,      /* 2nd arg of func */
3605f1d684SQi Zhang 	.help_str = "show help",
3705f1d684SQi Zhang 	.tokens = {        /* token list, NULL terminated */
3805f1d684SQi Zhang 		(void *)&cmd_help_help,
3905f1d684SQi Zhang 		NULL,
4005f1d684SQi Zhang 	},
4105f1d684SQi Zhang };
4205f1d684SQi Zhang 
4305f1d684SQi Zhang /**********************************************************/
4405f1d684SQi Zhang 
4505f1d684SQi Zhang struct cmd_quit_result {
4605f1d684SQi Zhang 	cmdline_fixed_string_t quit;
4705f1d684SQi Zhang };
4805f1d684SQi Zhang 
cmd_quit_parsed(__rte_unused void * parsed_result,struct cmdline * cl,__rte_unused void * data)49f2fc83b4SThomas Monjalon static void cmd_quit_parsed(__rte_unused void *parsed_result,
5005f1d684SQi Zhang 			    struct cmdline *cl,
51f2fc83b4SThomas Monjalon 			    __rte_unused void *data)
5205f1d684SQi Zhang {
5305f1d684SQi Zhang 	cmdline_quit(cl);
5405f1d684SQi Zhang }
5505f1d684SQi Zhang 
5605f1d684SQi Zhang cmdline_parse_token_string_t cmd_quit_quit =
5705f1d684SQi Zhang 	TOKEN_STRING_INITIALIZER(struct cmd_quit_result, quit, "quit");
5805f1d684SQi Zhang 
5905f1d684SQi Zhang cmdline_parse_inst_t cmd_quit = {
6005f1d684SQi Zhang 	.f = cmd_quit_parsed,  /* function to call */
6105f1d684SQi Zhang 	.data = NULL,      /* 2nd arg of func */
6205f1d684SQi Zhang 	.help_str = "quit",
6305f1d684SQi Zhang 	.tokens = {        /* token list, NULL terminated */
6405f1d684SQi Zhang 		(void *)&cmd_quit_quit,
6505f1d684SQi Zhang 		NULL,
6605f1d684SQi Zhang 	},
6705f1d684SQi Zhang };
6805f1d684SQi Zhang 
6905f1d684SQi Zhang /**********************************************************/
7005f1d684SQi Zhang 
7105f1d684SQi Zhang struct cmd_list_result {
7205f1d684SQi Zhang 	cmdline_fixed_string_t list;
7305f1d684SQi Zhang };
7405f1d684SQi Zhang 
cmd_list_parsed(__rte_unused void * parsed_result,struct cmdline * cl,__rte_unused void * data)75f2fc83b4SThomas Monjalon static void cmd_list_parsed(__rte_unused void *parsed_result,
7605f1d684SQi Zhang 			    struct cmdline *cl,
77f2fc83b4SThomas Monjalon 			    __rte_unused void *data)
7805f1d684SQi Zhang {
7905f1d684SQi Zhang 	uint16_t port_id;
8005f1d684SQi Zhang 	char dev_name[RTE_DEV_NAME_MAX_LEN];
8105f1d684SQi Zhang 
8205f1d684SQi Zhang 	cmdline_printf(cl, "list all etherdev\n");
8305f1d684SQi Zhang 
8405f1d684SQi Zhang 	RTE_ETH_FOREACH_DEV(port_id) {
8505f1d684SQi Zhang 		rte_eth_dev_get_name_by_port(port_id, dev_name);
8605f1d684SQi Zhang 		if (strlen(dev_name) > 0)
8705f1d684SQi Zhang 			cmdline_printf(cl, "%d\t%s\n", port_id, dev_name);
8805f1d684SQi Zhang 		else
8905f1d684SQi Zhang 			printf("empty dev_name is not expected!\n");
9005f1d684SQi Zhang 	}
9105f1d684SQi Zhang }
9205f1d684SQi Zhang 
9305f1d684SQi Zhang cmdline_parse_token_string_t cmd_list_list =
9405f1d684SQi Zhang 	TOKEN_STRING_INITIALIZER(struct cmd_list_result, list, "list");
9505f1d684SQi Zhang 
9605f1d684SQi Zhang cmdline_parse_inst_t cmd_list = {
9705f1d684SQi Zhang 	.f = cmd_list_parsed,  /* function to call */
9805f1d684SQi Zhang 	.data = NULL,      /* 2nd arg of func */
9905f1d684SQi Zhang 	.help_str = "list all devices",
10005f1d684SQi Zhang 	.tokens = {        /* token list, NULL terminated */
10105f1d684SQi Zhang 		(void *)&cmd_list_list,
10205f1d684SQi Zhang 		NULL,
10305f1d684SQi Zhang 	},
10405f1d684SQi Zhang };
10505f1d684SQi Zhang 
10605f1d684SQi Zhang /**********************************************************/
10705f1d684SQi Zhang 
10805f1d684SQi Zhang struct cmd_dev_attach_result {
10905f1d684SQi Zhang 	cmdline_fixed_string_t attach;
11005f1d684SQi Zhang 	cmdline_fixed_string_t devargs;
11105f1d684SQi Zhang };
11205f1d684SQi Zhang 
cmd_dev_attach_parsed(void * parsed_result,struct cmdline * cl,__rte_unused void * data)11305f1d684SQi Zhang static void cmd_dev_attach_parsed(void *parsed_result,
11405f1d684SQi Zhang 				  struct cmdline *cl,
115f2fc83b4SThomas Monjalon 				  __rte_unused void *data)
11605f1d684SQi Zhang {
11705f1d684SQi Zhang 	struct cmd_dev_attach_result *res = parsed_result;
11805f1d684SQi Zhang 	struct rte_devargs da;
11905f1d684SQi Zhang 
12005f1d684SQi Zhang 	memset(&da, 0, sizeof(da));
12105f1d684SQi Zhang 
12205f1d684SQi Zhang 	if (rte_devargs_parsef(&da, "%s", res->devargs)) {
12305f1d684SQi Zhang 		cmdline_printf(cl, "cannot parse devargs\n");
12405f1d684SQi Zhang 		return;
12505f1d684SQi Zhang 	}
12605f1d684SQi Zhang 
12705f1d684SQi Zhang 	if (!rte_eal_hotplug_add(da.bus->name, da.name, da.args))
12805f1d684SQi Zhang 		cmdline_printf(cl, "attached device %s\n", da.name);
12905f1d684SQi Zhang 	else
13005f1d684SQi Zhang 		cmdline_printf(cl, "failed to attached device %s\n",
13105f1d684SQi Zhang 				da.name);
13264051bb1SXueming Li 	rte_devargs_reset(&da);
13305f1d684SQi Zhang }
13405f1d684SQi Zhang 
13505f1d684SQi Zhang cmdline_parse_token_string_t cmd_dev_attach_attach =
13605f1d684SQi Zhang 	TOKEN_STRING_INITIALIZER(struct cmd_dev_attach_result, attach,
13705f1d684SQi Zhang 				 "attach");
13805f1d684SQi Zhang cmdline_parse_token_string_t cmd_dev_attach_devargs =
13905f1d684SQi Zhang 	TOKEN_STRING_INITIALIZER(struct cmd_dev_attach_result, devargs, NULL);
14005f1d684SQi Zhang 
14105f1d684SQi Zhang cmdline_parse_inst_t cmd_attach_device = {
14205f1d684SQi Zhang 	.f = cmd_dev_attach_parsed,  /* function to call */
14305f1d684SQi Zhang 	.data = NULL,      /* 2nd arg of func */
14405f1d684SQi Zhang 	.help_str = "attach a device",
14505f1d684SQi Zhang 	.tokens = {        /* token list, NULL terminated */
14605f1d684SQi Zhang 		(void *)&cmd_dev_attach_attach,
14705f1d684SQi Zhang 		(void *)&cmd_dev_attach_devargs,
14805f1d684SQi Zhang 		NULL,
14905f1d684SQi Zhang 	},
15005f1d684SQi Zhang };
15105f1d684SQi Zhang 
15205f1d684SQi Zhang /**********************************************************/
15305f1d684SQi Zhang 
15405f1d684SQi Zhang struct cmd_dev_detach_result {
15505f1d684SQi Zhang 	cmdline_fixed_string_t detach;
15605f1d684SQi Zhang 	cmdline_fixed_string_t devargs;
15705f1d684SQi Zhang };
15805f1d684SQi Zhang 
cmd_dev_detach_parsed(void * parsed_result,struct cmdline * cl,__rte_unused void * data)15905f1d684SQi Zhang static void cmd_dev_detach_parsed(void *parsed_result,
16005f1d684SQi Zhang 				   struct cmdline *cl,
161f2fc83b4SThomas Monjalon 				   __rte_unused void *data)
16205f1d684SQi Zhang {
16305f1d684SQi Zhang 	struct cmd_dev_detach_result *res = parsed_result;
16405f1d684SQi Zhang 	struct rte_devargs da;
16505f1d684SQi Zhang 
16605f1d684SQi Zhang 	memset(&da, 0, sizeof(da));
16705f1d684SQi Zhang 
16805f1d684SQi Zhang 	if (rte_devargs_parsef(&da, "%s", res->devargs)) {
16905f1d684SQi Zhang 		cmdline_printf(cl, "cannot parse devargs\n");
17005f1d684SQi Zhang 		return;
17105f1d684SQi Zhang 	}
17205f1d684SQi Zhang 
17305f1d684SQi Zhang 	printf("detaching...\n");
17405f1d684SQi Zhang 	if (!rte_eal_hotplug_remove(da.bus->name, da.name))
17505f1d684SQi Zhang 		cmdline_printf(cl, "detached device %s\n",
17605f1d684SQi Zhang 			da.name);
17705f1d684SQi Zhang 	else
178*7be78d02SJosh Soref 		cmdline_printf(cl, "failed to detach device %s\n",
17905f1d684SQi Zhang 			da.name);
18064051bb1SXueming Li 	rte_devargs_reset(&da);
18105f1d684SQi Zhang }
18205f1d684SQi Zhang 
18305f1d684SQi Zhang cmdline_parse_token_string_t cmd_dev_detach_detach =
18405f1d684SQi Zhang 	TOKEN_STRING_INITIALIZER(struct cmd_dev_detach_result, detach,
18505f1d684SQi Zhang 				 "detach");
18605f1d684SQi Zhang 
18705f1d684SQi Zhang cmdline_parse_token_string_t cmd_dev_detach_devargs =
18805f1d684SQi Zhang 	TOKEN_STRING_INITIALIZER(struct cmd_dev_detach_result, devargs, NULL);
18905f1d684SQi Zhang 
19005f1d684SQi Zhang cmdline_parse_inst_t cmd_detach_device = {
19105f1d684SQi Zhang 	.f = cmd_dev_detach_parsed,  /* function to call */
19205f1d684SQi Zhang 	.data = NULL,      /* 2nd arg of func */
19305f1d684SQi Zhang 	.help_str = "detach a device",
19405f1d684SQi Zhang 	.tokens = {        /* token list, NULL terminated */
19505f1d684SQi Zhang 		(void *)&cmd_dev_detach_detach,
19605f1d684SQi Zhang 		(void *)&cmd_dev_detach_devargs,
19705f1d684SQi Zhang 		NULL,
19805f1d684SQi Zhang 	},
19905f1d684SQi Zhang };
20005f1d684SQi Zhang 
20105f1d684SQi Zhang /**********************************************************/
20205f1d684SQi Zhang /**********************************************************/
20305f1d684SQi Zhang /****** CONTEXT (list of instruction) */
20405f1d684SQi Zhang 
20505f1d684SQi Zhang cmdline_parse_ctx_t main_ctx[] = {
20605f1d684SQi Zhang 	(cmdline_parse_inst_t *)&cmd_help,
20705f1d684SQi Zhang 	(cmdline_parse_inst_t *)&cmd_quit,
20805f1d684SQi Zhang 	(cmdline_parse_inst_t *)&cmd_list,
20905f1d684SQi Zhang 	(cmdline_parse_inst_t *)&cmd_attach_device,
21005f1d684SQi Zhang 	(cmdline_parse_inst_t *)&cmd_detach_device,
21105f1d684SQi Zhang 	NULL,
21205f1d684SQi Zhang };
213