xref: /dpdk/examples/qos_sched/cmdline.c (revision 7be78d027918dbc846e502780faf94d5acdf5f75)
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 
cmd_help_parsed(__rte_unused void * parsed_result,struct cmdline * cl,__rte_unused void * data)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"
44*7be78d02SJosh Soref 		"    qavg [n|period] X                     : Set number of times and period (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 
cmd_quit_parsed(__rte_unused void * parsed_result,struct cmdline * cl,__rte_unused void * data)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 
cmd_setqavg_parsed(void * parsed_result,__rte_unused struct cmdline * cl,__rte_unused void * data)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,
116c2341bb6SDmitry Kozlyuk 				RTE_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 
cmd_appstats_parsed(__rte_unused void * parsed_result,__rte_unused struct cmdline * cl,__rte_unused void * data)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 
cmd_subportstats_parsed(void * parsed_result,__rte_unused struct cmdline * cl,__rte_unused void * data)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,
191c2341bb6SDmitry Kozlyuk 				RTE_UINT32);
192cfd5c971SIntel cmdline_parse_token_num_t cmd_subportstats_port_number =
193cfd5c971SIntel         TOKEN_NUM_INITIALIZER(struct cmd_subportstats_result, port_number,
194c2341bb6SDmitry Kozlyuk 				RTE_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 
cmd_pipestats_parsed(void * parsed_result,__rte_unused struct cmdline * cl,__rte_unused void * data)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,
239c2341bb6SDmitry Kozlyuk 				RTE_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,
245c2341bb6SDmitry Kozlyuk 				RTE_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,
251c2341bb6SDmitry Kozlyuk 				RTE_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 
cmd_avg_q_parsed(void * parsed_result,__rte_unused struct cmdline * cl,__rte_unused void * data)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,
302c2341bb6SDmitry Kozlyuk 				RTE_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,
308c2341bb6SDmitry Kozlyuk 				RTE_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,
314c2341bb6SDmitry Kozlyuk 				RTE_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,
320c2341bb6SDmitry Kozlyuk 				RTE_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,
326c2341bb6SDmitry Kozlyuk 				RTE_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 
cmd_avg_tcpipe_parsed(void * parsed_result,__rte_unused struct cmdline * cl,__rte_unused void * data)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,
379c2341bb6SDmitry Kozlyuk 				RTE_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,
385c2341bb6SDmitry Kozlyuk 				RTE_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,
391c2341bb6SDmitry Kozlyuk 				RTE_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,
397c2341bb6SDmitry Kozlyuk 				RTE_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 
cmd_avg_pipe_parsed(void * parsed_result,__rte_unused struct cmdline * cl,__rte_unused void * data)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,
446c2341bb6SDmitry Kozlyuk 				RTE_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,
452c2341bb6SDmitry Kozlyuk 				RTE_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,
458c2341bb6SDmitry Kozlyuk 				RTE_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 
cmd_avg_tcsubport_parsed(void * parsed_result,__rte_unused struct cmdline * cl,__rte_unused void * data)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,
505c2341bb6SDmitry Kozlyuk 				RTE_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,
511c2341bb6SDmitry Kozlyuk 				RTE_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,
517c2341bb6SDmitry Kozlyuk 				RTE_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 
cmd_avg_subport_parsed(void * parsed_result,__rte_unused struct cmdline * cl,__rte_unused void * data)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,
562c2341bb6SDmitry Kozlyuk 				RTE_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,
568c2341bb6SDmitry Kozlyuk 				RTE_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 
602cb056611SStephen Hemminger /* prompt function, called from main on MAIN lcore */
603cfd5c971SIntel void
prompt(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