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