xref: /dpdk/examples/qos_sched/cmdline.c (revision cfd5c971e5e70995bf2d30d74ed2f12d52c999bd)
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