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