13998e2a0SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 23998e2a0SBruce Richardson * Copyright(c) 2010-2014 Intel Corporation 3cfd5c971SIntel */ 4cfd5c971SIntel 5cfd5c971SIntel #include <stdio.h> 6cfd5c971SIntel #include <termios.h> 7cfd5c971SIntel #include <inttypes.h> 8cfd5c971SIntel #include <string.h> 9cfd5c971SIntel 10cfd5c971SIntel #include <cmdline_rdline.h> 11cfd5c971SIntel #include <cmdline_parse.h> 12cfd5c971SIntel #include <cmdline_parse_num.h> 13cfd5c971SIntel #include <cmdline_parse_string.h> 14cfd5c971SIntel #include <cmdline_socket.h> 15cfd5c971SIntel #include <cmdline.h> 16cfd5c971SIntel 17cfd5c971SIntel #include "main.h" 18cfd5c971SIntel 19cfd5c971SIntel /* *** Help command with introduction. *** */ 20cfd5c971SIntel struct cmd_help_result { 21cfd5c971SIntel cmdline_fixed_string_t help; 22cfd5c971SIntel }; 23cfd5c971SIntel 24f2fc83b4SThomas Monjalon static void cmd_help_parsed(__rte_unused void *parsed_result, 25cfd5c971SIntel struct cmdline *cl, 26f2fc83b4SThomas Monjalon __rte_unused void *data) 27cfd5c971SIntel { 28cfd5c971SIntel cmdline_printf( 29cfd5c971SIntel cl, 30cfd5c971SIntel "\n" 31cfd5c971SIntel "The following commands are currently available:\n\n" 32cfd5c971SIntel "Control:\n" 33cfd5c971SIntel " quit : Quit the application.\n" 34cfd5c971SIntel "\nStatistics:\n" 35cfd5c971SIntel " stats app : Show app statistics.\n" 36cfd5c971SIntel " stats port X subport Y : Show stats of a specific subport.\n" 37cfd5c971SIntel " stats port X subport Y pipe Z : Show stats of a specific pipe.\n" 38cfd5c971SIntel "\nAverage queue size:\n" 39cfd5c971SIntel " qavg port X subport Y : Show average queue size per subport.\n" 40cfd5c971SIntel " qavg port X subport Y tc Z : Show average queue size per subport and TC.\n" 41cfd5c971SIntel " qavg port X subport Y pipe Z : Show average queue size per pipe.\n" 42cfd5c971SIntel " qavg port X subport Y pipe Z tc A : Show average queue size per pipe and TC.\n" 43cfd5c971SIntel " qavg port X subport Y pipe Z tc A q B : Show average queue size of a specific queue.\n" 44cfd5c971SIntel " qavg [n|period] X : Set number of times and peiod (us).\n\n" 45cfd5c971SIntel ); 46cfd5c971SIntel 47cfd5c971SIntel } 48cfd5c971SIntel 49cfd5c971SIntel cmdline_parse_token_string_t cmd_help_help = 50cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_help_result, help, "help"); 51cfd5c971SIntel 52cfd5c971SIntel cmdline_parse_inst_t cmd_help = { 53cfd5c971SIntel .f = cmd_help_parsed, 54cfd5c971SIntel .data = NULL, 55cfd5c971SIntel .help_str = "show help", 56cfd5c971SIntel .tokens = { 57cfd5c971SIntel (void *)&cmd_help_help, 58cfd5c971SIntel NULL, 59cfd5c971SIntel }, 60cfd5c971SIntel }; 61cfd5c971SIntel 62cfd5c971SIntel /* *** QUIT *** */ 63cfd5c971SIntel struct cmd_quit_result { 64cfd5c971SIntel cmdline_fixed_string_t quit; 65cfd5c971SIntel }; 66cfd5c971SIntel 67f2fc83b4SThomas Monjalon static void cmd_quit_parsed(__rte_unused void *parsed_result, 68cfd5c971SIntel struct cmdline *cl, 69f2fc83b4SThomas Monjalon __rte_unused void *data) 70cfd5c971SIntel { 71cfd5c971SIntel cmdline_quit(cl); 72cfd5c971SIntel } 73cfd5c971SIntel 74cfd5c971SIntel cmdline_parse_token_string_t cmd_quit_quit = 75cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_quit_result, quit, "quit"); 76cfd5c971SIntel 77cfd5c971SIntel cmdline_parse_inst_t cmd_quit = { 78cfd5c971SIntel .f = cmd_quit_parsed, 79cfd5c971SIntel .data = NULL, 80cfd5c971SIntel .help_str = "exit application", 81cfd5c971SIntel .tokens = { 82cfd5c971SIntel (void *)&cmd_quit_quit, 83cfd5c971SIntel NULL, 84cfd5c971SIntel }, 85cfd5c971SIntel }; 86cfd5c971SIntel 87cfd5c971SIntel /* *** SET QAVG PARAMETERS *** */ 88cfd5c971SIntel struct cmd_setqavg_result { 89cfd5c971SIntel cmdline_fixed_string_t qavg_string; 90cfd5c971SIntel cmdline_fixed_string_t param_string; 91cfd5c971SIntel uint32_t number; 92cfd5c971SIntel }; 93cfd5c971SIntel 94cfd5c971SIntel static void cmd_setqavg_parsed(void *parsed_result, 95f2fc83b4SThomas Monjalon __rte_unused struct cmdline *cl, 96f2fc83b4SThomas Monjalon __rte_unused void *data) 97cfd5c971SIntel { 98cfd5c971SIntel struct cmd_setqavg_result *res = parsed_result; 99cfd5c971SIntel 100cfd5c971SIntel if (!strcmp(res->param_string, "period")) 101cfd5c971SIntel qavg_period = res->number; 102cfd5c971SIntel else if (!strcmp(res->param_string, "n")) 103cfd5c971SIntel qavg_ntimes = res->number; 104cfd5c971SIntel else 105cfd5c971SIntel printf("\nUnknown parameter.\n\n"); 106cfd5c971SIntel } 107cfd5c971SIntel 108cfd5c971SIntel cmdline_parse_token_string_t cmd_setqavg_qavg_string = 109cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_setqavg_result, qavg_string, 110cfd5c971SIntel "qavg"); 111cfd5c971SIntel cmdline_parse_token_string_t cmd_setqavg_param_string = 112cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_setqavg_result, param_string, 113cfd5c971SIntel "period#n"); 114cfd5c971SIntel cmdline_parse_token_num_t cmd_setqavg_number = 115cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_setqavg_result, number, 116cfd5c971SIntel UINT32); 117cfd5c971SIntel 118cfd5c971SIntel cmdline_parse_inst_t cmd_setqavg = { 119cfd5c971SIntel .f = cmd_setqavg_parsed, 120cfd5c971SIntel .data = NULL, 121cfd5c971SIntel .help_str = "Show subport stats.", 122cfd5c971SIntel .tokens = { 123cfd5c971SIntel (void *)&cmd_setqavg_qavg_string, 124cfd5c971SIntel (void *)&cmd_setqavg_param_string, 125cfd5c971SIntel (void *)&cmd_setqavg_number, 126cfd5c971SIntel NULL, 127cfd5c971SIntel }, 128cfd5c971SIntel }; 129cfd5c971SIntel 130cfd5c971SIntel /* *** SHOW APP STATS *** */ 131cfd5c971SIntel struct cmd_appstats_result { 132cfd5c971SIntel cmdline_fixed_string_t stats_string; 133cfd5c971SIntel cmdline_fixed_string_t app_string; 134cfd5c971SIntel }; 135cfd5c971SIntel 136f2fc83b4SThomas Monjalon static void cmd_appstats_parsed(__rte_unused void *parsed_result, 137f2fc83b4SThomas Monjalon __rte_unused struct cmdline *cl, 138f2fc83b4SThomas Monjalon __rte_unused void *data) 139cfd5c971SIntel { 140cfd5c971SIntel app_stat(); 141cfd5c971SIntel } 142cfd5c971SIntel 143cfd5c971SIntel cmdline_parse_token_string_t cmd_appstats_stats_string = 144cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_appstats_result, stats_string, 145cfd5c971SIntel "stats"); 146cfd5c971SIntel cmdline_parse_token_string_t cmd_appstats_app_string = 147cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_appstats_result, app_string, 148cfd5c971SIntel "app"); 149cfd5c971SIntel 150cfd5c971SIntel cmdline_parse_inst_t cmd_appstats = { 151cfd5c971SIntel .f = cmd_appstats_parsed, 152cfd5c971SIntel .data = NULL, 153cfd5c971SIntel .help_str = "Show app stats.", 154cfd5c971SIntel .tokens = { 155cfd5c971SIntel (void *)&cmd_appstats_stats_string, 156cfd5c971SIntel (void *)&cmd_appstats_app_string, 157cfd5c971SIntel NULL, 158cfd5c971SIntel }, 159cfd5c971SIntel }; 160cfd5c971SIntel 161cfd5c971SIntel /* *** SHOW SUBPORT STATS *** */ 162cfd5c971SIntel struct cmd_subportstats_result { 163cfd5c971SIntel cmdline_fixed_string_t stats_string; 164cfd5c971SIntel cmdline_fixed_string_t port_string; 16547523597SZhiyong Yang uint16_t port_number; 166cfd5c971SIntel cmdline_fixed_string_t subport_string; 167cfd5c971SIntel uint32_t subport_number; 168cfd5c971SIntel }; 169cfd5c971SIntel 170cfd5c971SIntel static void cmd_subportstats_parsed(void *parsed_result, 171f2fc83b4SThomas Monjalon __rte_unused struct cmdline *cl, 172f2fc83b4SThomas Monjalon __rte_unused void *data) 173cfd5c971SIntel { 174cfd5c971SIntel struct cmd_subportstats_result *res = parsed_result; 175cfd5c971SIntel 176cfd5c971SIntel if (subport_stat(res->port_number, res->subport_number) < 0) 177cfd5c971SIntel printf ("\nStats not available for these parameters. Check that both the port and subport are correct.\n\n"); 178cfd5c971SIntel } 179cfd5c971SIntel 180cfd5c971SIntel cmdline_parse_token_string_t cmd_subportstats_stats_string = 181cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_subportstats_result, stats_string, 182cfd5c971SIntel "stats"); 183cfd5c971SIntel cmdline_parse_token_string_t cmd_subportstats_port_string = 184cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_subportstats_result, port_string, 185cfd5c971SIntel "port"); 186cfd5c971SIntel cmdline_parse_token_string_t cmd_subportstats_subport_string = 187cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_subportstats_result, subport_string, 188cfd5c971SIntel "subport"); 189cfd5c971SIntel cmdline_parse_token_num_t cmd_subportstats_subport_number = 190cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_subportstats_result, subport_number, 191cfd5c971SIntel UINT32); 192cfd5c971SIntel cmdline_parse_token_num_t cmd_subportstats_port_number = 193cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_subportstats_result, port_number, 19447523597SZhiyong Yang UINT16); 195cfd5c971SIntel 196cfd5c971SIntel cmdline_parse_inst_t cmd_subportstats = { 197cfd5c971SIntel .f = cmd_subportstats_parsed, 198cfd5c971SIntel .data = NULL, 199cfd5c971SIntel .help_str = "Show subport stats.", 200cfd5c971SIntel .tokens = { 201cfd5c971SIntel (void *)&cmd_subportstats_stats_string, 202cfd5c971SIntel (void *)&cmd_subportstats_port_string, 203cfd5c971SIntel (void *)&cmd_subportstats_port_number, 204cfd5c971SIntel (void *)&cmd_subportstats_subport_string, 205cfd5c971SIntel (void *)&cmd_subportstats_subport_number, 206cfd5c971SIntel NULL, 207cfd5c971SIntel }, 208cfd5c971SIntel }; 209cfd5c971SIntel 210cfd5c971SIntel /* *** SHOW PIPE STATS *** */ 211cfd5c971SIntel struct cmd_pipestats_result { 212cfd5c971SIntel cmdline_fixed_string_t stats_string; 213cfd5c971SIntel cmdline_fixed_string_t port_string; 21447523597SZhiyong Yang uint16_t port_number; 215cfd5c971SIntel cmdline_fixed_string_t subport_string; 216cfd5c971SIntel uint32_t subport_number; 217cfd5c971SIntel cmdline_fixed_string_t pipe_string; 218cfd5c971SIntel uint32_t pipe_number; 219cfd5c971SIntel }; 220cfd5c971SIntel 221cfd5c971SIntel static void cmd_pipestats_parsed(void *parsed_result, 222f2fc83b4SThomas Monjalon __rte_unused struct cmdline *cl, 223f2fc83b4SThomas Monjalon __rte_unused void *data) 224cfd5c971SIntel { 225cfd5c971SIntel struct cmd_pipestats_result *res = parsed_result; 226cfd5c971SIntel 227cfd5c971SIntel if (pipe_stat(res->port_number, res->subport_number, res->pipe_number) < 0) 228cfd5c971SIntel printf ("\nStats not available for these parameters. Check that both the port and subport are correct.\n\n"); 229cfd5c971SIntel } 230cfd5c971SIntel 231cfd5c971SIntel cmdline_parse_token_string_t cmd_pipestats_stats_string = 232cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_pipestats_result, stats_string, 233cfd5c971SIntel "stats"); 234cfd5c971SIntel cmdline_parse_token_string_t cmd_pipestats_port_string = 235cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_pipestats_result, port_string, 236cfd5c971SIntel "port"); 237cfd5c971SIntel cmdline_parse_token_num_t cmd_pipestats_port_number = 238cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_pipestats_result, port_number, 23947523597SZhiyong Yang UINT16); 240cfd5c971SIntel cmdline_parse_token_string_t cmd_pipestats_subport_string = 241cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_pipestats_result, subport_string, 242cfd5c971SIntel "subport"); 243cfd5c971SIntel cmdline_parse_token_num_t cmd_pipestats_subport_number = 244cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_pipestats_result, subport_number, 245cfd5c971SIntel UINT32); 246cfd5c971SIntel cmdline_parse_token_string_t cmd_pipestats_pipe_string = 247cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_pipestats_result, pipe_string, 248cfd5c971SIntel "pipe"); 249cfd5c971SIntel cmdline_parse_token_num_t cmd_pipestats_pipe_number = 250cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_pipestats_result, pipe_number, 251cfd5c971SIntel UINT32); 252cfd5c971SIntel 253cfd5c971SIntel cmdline_parse_inst_t cmd_pipestats = { 254cfd5c971SIntel .f = cmd_pipestats_parsed, 255cfd5c971SIntel .data = NULL, 256cfd5c971SIntel .help_str = "Show pipe stats.", 257cfd5c971SIntel .tokens = { 258cfd5c971SIntel (void *)&cmd_pipestats_stats_string, 259cfd5c971SIntel (void *)&cmd_pipestats_port_string, 260cfd5c971SIntel (void *)&cmd_pipestats_port_number, 261cfd5c971SIntel (void *)&cmd_pipestats_subport_string, 262cfd5c971SIntel (void *)&cmd_pipestats_subport_number, 263cfd5c971SIntel (void *)&cmd_pipestats_pipe_string, 264cfd5c971SIntel (void *)&cmd_pipestats_pipe_number, 265cfd5c971SIntel NULL, 266cfd5c971SIntel }, 267cfd5c971SIntel }; 268cfd5c971SIntel 269cfd5c971SIntel /* *** SHOW AVERAGE QUEUE SIZE (QUEUE) *** */ 270cfd5c971SIntel struct cmd_avg_q_result { 271cfd5c971SIntel cmdline_fixed_string_t qavg_string; 272cfd5c971SIntel cmdline_fixed_string_t port_string; 27347523597SZhiyong Yang uint16_t port_number; 274cfd5c971SIntel cmdline_fixed_string_t subport_string; 275cfd5c971SIntel uint32_t subport_number; 276cfd5c971SIntel cmdline_fixed_string_t pipe_string; 277cfd5c971SIntel uint32_t pipe_number; 278cfd5c971SIntel cmdline_fixed_string_t tc_string; 279cfd5c971SIntel uint8_t tc_number; 280cfd5c971SIntel cmdline_fixed_string_t q_string; 281cfd5c971SIntel uint8_t q_number; 282cfd5c971SIntel }; 283cfd5c971SIntel 284cfd5c971SIntel static void cmd_avg_q_parsed(void *parsed_result, 285f2fc83b4SThomas Monjalon __rte_unused struct cmdline *cl, 286f2fc83b4SThomas Monjalon __rte_unused void *data) 287cfd5c971SIntel { 288cfd5c971SIntel struct cmd_avg_q_result *res = parsed_result; 289cfd5c971SIntel 290cfd5c971SIntel if (qavg_q(res->port_number, res->subport_number, res->pipe_number, res->tc_number, res->q_number) < 0) 291cfd5c971SIntel printf ("\nStats not available for these parameters. Check that both the port and subport are correct.\n\n"); 292cfd5c971SIntel } 293cfd5c971SIntel 294cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_q_qavg_string = 295cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_q_result, qavg_string, 296cfd5c971SIntel "qavg"); 297cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_q_port_string = 298cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_q_result, port_string, 299cfd5c971SIntel "port"); 300cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_q_port_number = 301cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_q_result, port_number, 30247523597SZhiyong Yang UINT16); 303cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_q_subport_string = 304cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_q_result, subport_string, 305cfd5c971SIntel "subport"); 306cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_q_subport_number = 307cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_q_result, subport_number, 308cfd5c971SIntel UINT32); 309cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_q_pipe_string = 310cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_q_result, pipe_string, 311cfd5c971SIntel "pipe"); 312cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_q_pipe_number = 313cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_q_result, pipe_number, 314cfd5c971SIntel UINT32); 315cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_q_tc_string = 316cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_q_result, tc_string, 317cfd5c971SIntel "tc"); 318cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_q_tc_number = 319cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_q_result, tc_number, 320cfd5c971SIntel UINT8); 321cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_q_q_string = 322cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_q_result, q_string, 323cfd5c971SIntel "q"); 324cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_q_q_number = 325cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_q_result, q_number, 326cfd5c971SIntel UINT8); 327cfd5c971SIntel 328cfd5c971SIntel cmdline_parse_inst_t cmd_avg_q = { 329cfd5c971SIntel .f = cmd_avg_q_parsed, 330cfd5c971SIntel .data = NULL, 331cfd5c971SIntel .help_str = "Show pipe stats.", 332cfd5c971SIntel .tokens = { 333cfd5c971SIntel (void *)&cmd_avg_q_qavg_string, 334cfd5c971SIntel (void *)&cmd_avg_q_port_string, 335cfd5c971SIntel (void *)&cmd_avg_q_port_number, 336cfd5c971SIntel (void *)&cmd_avg_q_subport_string, 337cfd5c971SIntel (void *)&cmd_avg_q_subport_number, 338cfd5c971SIntel (void *)&cmd_avg_q_pipe_string, 339cfd5c971SIntel (void *)&cmd_avg_q_pipe_number, 340cfd5c971SIntel (void *)&cmd_avg_q_tc_string, 341cfd5c971SIntel (void *)&cmd_avg_q_tc_number, 342cfd5c971SIntel (void *)&cmd_avg_q_q_string, 343cfd5c971SIntel (void *)&cmd_avg_q_q_number, 344cfd5c971SIntel NULL, 345cfd5c971SIntel }, 346cfd5c971SIntel }; 347cfd5c971SIntel 348cfd5c971SIntel /* *** SHOW AVERAGE QUEUE SIZE (tc/pipe) *** */ 349cfd5c971SIntel struct cmd_avg_tcpipe_result { 350cfd5c971SIntel cmdline_fixed_string_t qavg_string; 351cfd5c971SIntel cmdline_fixed_string_t port_string; 35247523597SZhiyong Yang uint16_t port_number; 353cfd5c971SIntel cmdline_fixed_string_t subport_string; 354cfd5c971SIntel uint32_t subport_number; 355cfd5c971SIntel cmdline_fixed_string_t pipe_string; 356cfd5c971SIntel uint32_t pipe_number; 357cfd5c971SIntel cmdline_fixed_string_t tc_string; 358cfd5c971SIntel uint8_t tc_number; 359cfd5c971SIntel }; 360cfd5c971SIntel 361cfd5c971SIntel static void cmd_avg_tcpipe_parsed(void *parsed_result, 362f2fc83b4SThomas Monjalon __rte_unused struct cmdline *cl, 363f2fc83b4SThomas Monjalon __rte_unused void *data) 364cfd5c971SIntel { 365cfd5c971SIntel struct cmd_avg_tcpipe_result *res = parsed_result; 366cfd5c971SIntel 367cfd5c971SIntel if (qavg_tcpipe(res->port_number, res->subport_number, res->pipe_number, res->tc_number) < 0) 368cfd5c971SIntel printf ("\nStats not available for these parameters. Check that both the port and subport are correct.\n\n"); 369cfd5c971SIntel } 370cfd5c971SIntel 371cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_tcpipe_qavg_string = 372cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_tcpipe_result, qavg_string, 373cfd5c971SIntel "qavg"); 374cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_tcpipe_port_string = 375cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_tcpipe_result, port_string, 376cfd5c971SIntel "port"); 377cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_tcpipe_port_number = 378cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_tcpipe_result, port_number, 37947523597SZhiyong Yang UINT16); 380cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_tcpipe_subport_string = 381cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_tcpipe_result, subport_string, 382cfd5c971SIntel "subport"); 383cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_tcpipe_subport_number = 384cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_tcpipe_result, subport_number, 385cfd5c971SIntel UINT32); 386cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_tcpipe_pipe_string = 387cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_tcpipe_result, pipe_string, 388cfd5c971SIntel "pipe"); 389cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_tcpipe_pipe_number = 390cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_tcpipe_result, pipe_number, 391cfd5c971SIntel UINT32); 392cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_tcpipe_tc_string = 393cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_tcpipe_result, tc_string, 394cfd5c971SIntel "tc"); 395cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_tcpipe_tc_number = 396cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_tcpipe_result, tc_number, 397cfd5c971SIntel UINT8); 398cfd5c971SIntel 399cfd5c971SIntel cmdline_parse_inst_t cmd_avg_tcpipe = { 400cfd5c971SIntel .f = cmd_avg_tcpipe_parsed, 401cfd5c971SIntel .data = NULL, 402cfd5c971SIntel .help_str = "Show pipe stats.", 403cfd5c971SIntel .tokens = { 404cfd5c971SIntel (void *)&cmd_avg_tcpipe_qavg_string, 405cfd5c971SIntel (void *)&cmd_avg_tcpipe_port_string, 406cfd5c971SIntel (void *)&cmd_avg_tcpipe_port_number, 407cfd5c971SIntel (void *)&cmd_avg_tcpipe_subport_string, 408cfd5c971SIntel (void *)&cmd_avg_tcpipe_subport_number, 409cfd5c971SIntel (void *)&cmd_avg_tcpipe_pipe_string, 410cfd5c971SIntel (void *)&cmd_avg_tcpipe_pipe_number, 411cfd5c971SIntel (void *)&cmd_avg_tcpipe_tc_string, 412cfd5c971SIntel (void *)&cmd_avg_tcpipe_tc_number, 413cfd5c971SIntel NULL, 414cfd5c971SIntel }, 415cfd5c971SIntel }; 416cfd5c971SIntel 417cfd5c971SIntel /* *** SHOW AVERAGE QUEUE SIZE (pipe) *** */ 418cfd5c971SIntel struct cmd_avg_pipe_result { 419cfd5c971SIntel cmdline_fixed_string_t qavg_string; 420cfd5c971SIntel cmdline_fixed_string_t port_string; 42147523597SZhiyong Yang uint16_t port_number; 422cfd5c971SIntel cmdline_fixed_string_t subport_string; 423cfd5c971SIntel uint32_t subport_number; 424cfd5c971SIntel cmdline_fixed_string_t pipe_string; 425cfd5c971SIntel uint32_t pipe_number; 426cfd5c971SIntel }; 427cfd5c971SIntel 428cfd5c971SIntel static void cmd_avg_pipe_parsed(void *parsed_result, 429f2fc83b4SThomas Monjalon __rte_unused struct cmdline *cl, 430f2fc83b4SThomas Monjalon __rte_unused void *data) 431cfd5c971SIntel { 432cfd5c971SIntel struct cmd_avg_pipe_result *res = parsed_result; 433cfd5c971SIntel 434cfd5c971SIntel if (qavg_pipe(res->port_number, res->subport_number, res->pipe_number) < 0) 435cfd5c971SIntel printf ("\nStats not available for these parameters. Check that both the port and subport are correct.\n\n"); 436cfd5c971SIntel } 437cfd5c971SIntel 438cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_pipe_qavg_string = 439cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_pipe_result, qavg_string, 440cfd5c971SIntel "qavg"); 441cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_pipe_port_string = 442cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_pipe_result, port_string, 443cfd5c971SIntel "port"); 444cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_pipe_port_number = 445cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_pipe_result, port_number, 44647523597SZhiyong Yang UINT16); 447cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_pipe_subport_string = 448cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_pipe_result, subport_string, 449cfd5c971SIntel "subport"); 450cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_pipe_subport_number = 451cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_pipe_result, subport_number, 452cfd5c971SIntel UINT32); 453cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_pipe_pipe_string = 454cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_pipe_result, pipe_string, 455cfd5c971SIntel "pipe"); 456cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_pipe_pipe_number = 457cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_pipe_result, pipe_number, 458cfd5c971SIntel UINT32); 459cfd5c971SIntel 460cfd5c971SIntel cmdline_parse_inst_t cmd_avg_pipe = { 461cfd5c971SIntel .f = cmd_avg_pipe_parsed, 462cfd5c971SIntel .data = NULL, 463cfd5c971SIntel .help_str = "Show pipe stats.", 464cfd5c971SIntel .tokens = { 465cfd5c971SIntel (void *)&cmd_avg_pipe_qavg_string, 466cfd5c971SIntel (void *)&cmd_avg_pipe_port_string, 467cfd5c971SIntel (void *)&cmd_avg_pipe_port_number, 468cfd5c971SIntel (void *)&cmd_avg_pipe_subport_string, 469cfd5c971SIntel (void *)&cmd_avg_pipe_subport_number, 470cfd5c971SIntel (void *)&cmd_avg_pipe_pipe_string, 471cfd5c971SIntel (void *)&cmd_avg_pipe_pipe_number, 472cfd5c971SIntel NULL, 473cfd5c971SIntel }, 474cfd5c971SIntel }; 475cfd5c971SIntel 476cfd5c971SIntel /* *** SHOW AVERAGE QUEUE SIZE (tc/subport) *** */ 477cfd5c971SIntel struct cmd_avg_tcsubport_result { 478cfd5c971SIntel cmdline_fixed_string_t qavg_string; 479cfd5c971SIntel cmdline_fixed_string_t port_string; 48047523597SZhiyong Yang uint16_t port_number; 481cfd5c971SIntel cmdline_fixed_string_t subport_string; 482cfd5c971SIntel uint32_t subport_number; 483cfd5c971SIntel cmdline_fixed_string_t tc_string; 484cfd5c971SIntel uint8_t tc_number; 485cfd5c971SIntel }; 486cfd5c971SIntel 487cfd5c971SIntel static void cmd_avg_tcsubport_parsed(void *parsed_result, 488f2fc83b4SThomas Monjalon __rte_unused struct cmdline *cl, 489f2fc83b4SThomas Monjalon __rte_unused void *data) 490cfd5c971SIntel { 491cfd5c971SIntel struct cmd_avg_tcsubport_result *res = parsed_result; 492cfd5c971SIntel 493cfd5c971SIntel if (qavg_tcsubport(res->port_number, res->subport_number, res->tc_number) < 0) 494cfd5c971SIntel printf ("\nStats not available for these parameters. Check that both the port and subport are correct.\n\n"); 495cfd5c971SIntel } 496cfd5c971SIntel 497cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_tcsubport_qavg_string = 498cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_tcsubport_result, qavg_string, 499cfd5c971SIntel "qavg"); 500cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_tcsubport_port_string = 501cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_tcsubport_result, port_string, 502cfd5c971SIntel "port"); 503cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_tcsubport_port_number = 504cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_tcsubport_result, port_number, 50547523597SZhiyong Yang UINT16); 506cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_tcsubport_subport_string = 507cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_tcsubport_result, subport_string, 508cfd5c971SIntel "subport"); 509cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_tcsubport_subport_number = 510cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_tcsubport_result, subport_number, 511cfd5c971SIntel UINT32); 512cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_tcsubport_tc_string = 513cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_tcsubport_result, tc_string, 514cfd5c971SIntel "tc"); 515cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_tcsubport_tc_number = 516cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_tcsubport_result, tc_number, 517cfd5c971SIntel UINT8); 518cfd5c971SIntel 519cfd5c971SIntel cmdline_parse_inst_t cmd_avg_tcsubport = { 520cfd5c971SIntel .f = cmd_avg_tcsubport_parsed, 521cfd5c971SIntel .data = NULL, 522cfd5c971SIntel .help_str = "Show pipe stats.", 523cfd5c971SIntel .tokens = { 524cfd5c971SIntel (void *)&cmd_avg_tcsubport_qavg_string, 525cfd5c971SIntel (void *)&cmd_avg_tcsubport_port_string, 526cfd5c971SIntel (void *)&cmd_avg_tcsubport_port_number, 527cfd5c971SIntel (void *)&cmd_avg_tcsubport_subport_string, 528cfd5c971SIntel (void *)&cmd_avg_tcsubport_subport_number, 529cfd5c971SIntel (void *)&cmd_avg_tcsubport_tc_string, 530cfd5c971SIntel (void *)&cmd_avg_tcsubport_tc_number, 531cfd5c971SIntel NULL, 532cfd5c971SIntel }, 533cfd5c971SIntel }; 534cfd5c971SIntel 535cfd5c971SIntel /* *** SHOW AVERAGE QUEUE SIZE (subport) *** */ 536cfd5c971SIntel struct cmd_avg_subport_result { 537cfd5c971SIntel cmdline_fixed_string_t qavg_string; 538cfd5c971SIntel cmdline_fixed_string_t port_string; 53947523597SZhiyong Yang uint16_t port_number; 540cfd5c971SIntel cmdline_fixed_string_t subport_string; 541cfd5c971SIntel uint32_t subport_number; 542cfd5c971SIntel }; 543cfd5c971SIntel 544cfd5c971SIntel static void cmd_avg_subport_parsed(void *parsed_result, 545f2fc83b4SThomas Monjalon __rte_unused struct cmdline *cl, 546f2fc83b4SThomas Monjalon __rte_unused void *data) 547cfd5c971SIntel { 548cfd5c971SIntel struct cmd_avg_subport_result *res = parsed_result; 549cfd5c971SIntel 550cfd5c971SIntel if (qavg_subport(res->port_number, res->subport_number) < 0) 551cfd5c971SIntel printf ("\nStats not available for these parameters. Check that both the port and subport are correct.\n\n"); 552cfd5c971SIntel } 553cfd5c971SIntel 554cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_subport_qavg_string = 555cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_subport_result, qavg_string, 556cfd5c971SIntel "qavg"); 557cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_subport_port_string = 558cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_subport_result, port_string, 559cfd5c971SIntel "port"); 560cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_subport_port_number = 561cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_subport_result, port_number, 56247523597SZhiyong Yang UINT16); 563cfd5c971SIntel cmdline_parse_token_string_t cmd_avg_subport_subport_string = 564cfd5c971SIntel TOKEN_STRING_INITIALIZER(struct cmd_avg_subport_result, subport_string, 565cfd5c971SIntel "subport"); 566cfd5c971SIntel cmdline_parse_token_num_t cmd_avg_subport_subport_number = 567cfd5c971SIntel TOKEN_NUM_INITIALIZER(struct cmd_avg_subport_result, subport_number, 568cfd5c971SIntel UINT32); 569cfd5c971SIntel 570cfd5c971SIntel cmdline_parse_inst_t cmd_avg_subport = { 571cfd5c971SIntel .f = cmd_avg_subport_parsed, 572cfd5c971SIntel .data = NULL, 573cfd5c971SIntel .help_str = "Show pipe stats.", 574cfd5c971SIntel .tokens = { 575cfd5c971SIntel (void *)&cmd_avg_subport_qavg_string, 576cfd5c971SIntel (void *)&cmd_avg_subport_port_string, 577cfd5c971SIntel (void *)&cmd_avg_subport_port_number, 578cfd5c971SIntel (void *)&cmd_avg_subport_subport_string, 579cfd5c971SIntel (void *)&cmd_avg_subport_subport_number, 580cfd5c971SIntel NULL, 581cfd5c971SIntel }, 582cfd5c971SIntel }; 583cfd5c971SIntel 584cfd5c971SIntel /* ******************************************************************************** */ 585cfd5c971SIntel 586cfd5c971SIntel /* list of instructions */ 587cfd5c971SIntel cmdline_parse_ctx_t main_ctx[] = { 588cfd5c971SIntel (cmdline_parse_inst_t *)&cmd_help, 589cfd5c971SIntel (cmdline_parse_inst_t *)&cmd_setqavg, 590cfd5c971SIntel (cmdline_parse_inst_t *)&cmd_appstats, 591cfd5c971SIntel (cmdline_parse_inst_t *)&cmd_subportstats, 592cfd5c971SIntel (cmdline_parse_inst_t *)&cmd_pipestats, 593cfd5c971SIntel (cmdline_parse_inst_t *)&cmd_avg_q, 594cfd5c971SIntel (cmdline_parse_inst_t *)&cmd_avg_tcpipe, 595cfd5c971SIntel (cmdline_parse_inst_t *)&cmd_avg_pipe, 596cfd5c971SIntel (cmdline_parse_inst_t *)&cmd_avg_tcsubport, 597cfd5c971SIntel (cmdline_parse_inst_t *)&cmd_avg_subport, 598cfd5c971SIntel (cmdline_parse_inst_t *)&cmd_quit, 599cfd5c971SIntel NULL, 600cfd5c971SIntel }; 601cfd5c971SIntel 602*cb056611SStephen Hemminger /* prompt function, called from main on MAIN lcore */ 603cfd5c971SIntel void 604cfd5c971SIntel prompt(void) 605cfd5c971SIntel { 606cfd5c971SIntel struct cmdline *cl; 607cfd5c971SIntel 608cfd5c971SIntel cl = cmdline_stdin_new(main_ctx, "qos_sched> "); 609cfd5c971SIntel if (cl == NULL) { 610cfd5c971SIntel return; 611cfd5c971SIntel } 612cfd5c971SIntel cmdline_interact(cl); 613cfd5c971SIntel cmdline_stdin_exit(cl); 614cfd5c971SIntel } 615