xref: /dpdk/app/test-pmd/cmdline_cman.c (revision 40aec5241ebd8fce06ff2c2ecca528a36001062b)
1*40aec524SSunil Kumar Kori /* SPDX-License-Identifier: BSD-3-Clause
2*40aec524SSunil Kumar Kori  * Copyright(C) 2022 Marvell International Ltd.
3*40aec524SSunil Kumar Kori  */
4*40aec524SSunil Kumar Kori 
5*40aec524SSunil Kumar Kori #include <stdlib.h>
6*40aec524SSunil Kumar Kori 
7*40aec524SSunil Kumar Kori #include <cmdline_parse.h>
8*40aec524SSunil Kumar Kori #include <cmdline_parse_num.h>
9*40aec524SSunil Kumar Kori #include <cmdline_parse_string.h>
10*40aec524SSunil Kumar Kori 
11*40aec524SSunil Kumar Kori #include <rte_ethdev.h>
12*40aec524SSunil Kumar Kori 
13*40aec524SSunil Kumar Kori #include "testpmd.h"
14*40aec524SSunil Kumar Kori 
15*40aec524SSunil Kumar Kori #define PARSE_DELIMITER				" \f\n\r\t\v"
16*40aec524SSunil Kumar Kori 
17*40aec524SSunil Kumar Kori static int
parse_uint(uint64_t * value,const char * str)18*40aec524SSunil Kumar Kori parse_uint(uint64_t *value, const char *str)
19*40aec524SSunil Kumar Kori {
20*40aec524SSunil Kumar Kori 	char *next = NULL;
21*40aec524SSunil Kumar Kori 	uint64_t n;
22*40aec524SSunil Kumar Kori 
23*40aec524SSunil Kumar Kori 	errno = 0;
24*40aec524SSunil Kumar Kori 	/* Parse number string */
25*40aec524SSunil Kumar Kori 	n = strtol(str, &next, 10);
26*40aec524SSunil Kumar Kori 	if (errno != 0 || str == next || *next != '\0')
27*40aec524SSunil Kumar Kori 		return -1;
28*40aec524SSunil Kumar Kori 
29*40aec524SSunil Kumar Kori 	*value = n;
30*40aec524SSunil Kumar Kori 
31*40aec524SSunil Kumar Kori 	return 0;
32*40aec524SSunil Kumar Kori }
33*40aec524SSunil Kumar Kori 
34*40aec524SSunil Kumar Kori static int
parse_cman_obj_str(char * str,uint64_t * obj)35*40aec524SSunil Kumar Kori parse_cman_obj_str(char *str, uint64_t *obj)
36*40aec524SSunil Kumar Kori {
37*40aec524SSunil Kumar Kori 	char *token;
38*40aec524SSunil Kumar Kori 
39*40aec524SSunil Kumar Kori 	token = strtok_r(str, PARSE_DELIMITER, &str);
40*40aec524SSunil Kumar Kori 	if (token == NULL)
41*40aec524SSunil Kumar Kori 		return 0;
42*40aec524SSunil Kumar Kori 
43*40aec524SSunil Kumar Kori 	if (strcasecmp(token, "queue") == 0)
44*40aec524SSunil Kumar Kori 		*obj = RTE_ETH_CMAN_OBJ_RX_QUEUE;
45*40aec524SSunil Kumar Kori 	else if (strcasecmp(token, "queue_mempool") == 0)
46*40aec524SSunil Kumar Kori 		*obj = RTE_ETH_CMAN_OBJ_RX_QUEUE_MEMPOOL;
47*40aec524SSunil Kumar Kori 	else
48*40aec524SSunil Kumar Kori 		return -1;
49*40aec524SSunil Kumar Kori 
50*40aec524SSunil Kumar Kori 	return 0;
51*40aec524SSunil Kumar Kori }
52*40aec524SSunil Kumar Kori 
53*40aec524SSunil Kumar Kori static int
parse_cman_mode_str(char * str,uint64_t * mode)54*40aec524SSunil Kumar Kori parse_cman_mode_str(char *str, uint64_t *mode)
55*40aec524SSunil Kumar Kori {
56*40aec524SSunil Kumar Kori 	char *token;
57*40aec524SSunil Kumar Kori 
58*40aec524SSunil Kumar Kori 	token = strtok_r(str, PARSE_DELIMITER, &str);
59*40aec524SSunil Kumar Kori 	if (token == NULL)
60*40aec524SSunil Kumar Kori 		return 0;
61*40aec524SSunil Kumar Kori 
62*40aec524SSunil Kumar Kori 	if (strcasecmp(token, "red") == 0)
63*40aec524SSunil Kumar Kori 		*mode = RTE_CMAN_RED;
64*40aec524SSunil Kumar Kori 	else
65*40aec524SSunil Kumar Kori 		return -1;
66*40aec524SSunil Kumar Kori 
67*40aec524SSunil Kumar Kori 	return 0;
68*40aec524SSunil Kumar Kori }
69*40aec524SSunil Kumar Kori 
70*40aec524SSunil Kumar Kori static int
parse_cman_params_str(uint16_t port_id,char * str,struct rte_eth_cman_config * cfg)71*40aec524SSunil Kumar Kori parse_cman_params_str(uint16_t port_id, char *str,
72*40aec524SSunil Kumar Kori 		      struct rte_eth_cman_config *cfg)
73*40aec524SSunil Kumar Kori {
74*40aec524SSunil Kumar Kori 	uint64_t obj = 0, mode = 0, min_th = 0, max_th = 0, maxp_inv = 0;
75*40aec524SSunil Kumar Kori 	struct rte_eth_cman_info info;
76*40aec524SSunil Kumar Kori 	char *token;
77*40aec524SSunil Kumar Kori 	int ret;
78*40aec524SSunil Kumar Kori 
79*40aec524SSunil Kumar Kori 	token = strtok_r(str, PARSE_DELIMITER, &str);
80*40aec524SSunil Kumar Kori 	if (!strcasecmp(token, "default")) {
81*40aec524SSunil Kumar Kori 		ret = rte_eth_cman_config_init(port_id, cfg);
82*40aec524SSunil Kumar Kori 		if (ret) {
83*40aec524SSunil Kumar Kori 			fprintf(stderr, "error in default initialization\n");
84*40aec524SSunil Kumar Kori 			return ret;
85*40aec524SSunil Kumar Kori 		}
86*40aec524SSunil Kumar Kori 		return 0;
87*40aec524SSunil Kumar Kori 	}
88*40aec524SSunil Kumar Kori 
89*40aec524SSunil Kumar Kori 	/* First token: obj name */
90*40aec524SSunil Kumar Kori 	token = strtok_r(str, PARSE_DELIMITER, &str);
91*40aec524SSunil Kumar Kori 	if (token == NULL) {
92*40aec524SSunil Kumar Kori 		fprintf(stderr, "Object param parse error\n");
93*40aec524SSunil Kumar Kori 		goto error;
94*40aec524SSunil Kumar Kori 	}
95*40aec524SSunil Kumar Kori 
96*40aec524SSunil Kumar Kori 	ret = parse_cman_obj_str(token, &obj);
97*40aec524SSunil Kumar Kori 	if (ret) {
98*40aec524SSunil Kumar Kori 		fprintf(stderr, "Object value is invalid\n");
99*40aec524SSunil Kumar Kori 		goto error;
100*40aec524SSunil Kumar Kori 	}
101*40aec524SSunil Kumar Kori 
102*40aec524SSunil Kumar Kori 	/* Second token: mode name */
103*40aec524SSunil Kumar Kori 	token = strtok_r(str, PARSE_DELIMITER, &str);
104*40aec524SSunil Kumar Kori 	if (token == NULL) {
105*40aec524SSunil Kumar Kori 		fprintf(stderr, " Mode param is invalid\n");
106*40aec524SSunil Kumar Kori 		goto error;
107*40aec524SSunil Kumar Kori 	}
108*40aec524SSunil Kumar Kori 
109*40aec524SSunil Kumar Kori 	token = strtok_r(str, PARSE_DELIMITER, &str);
110*40aec524SSunil Kumar Kori 	if (token == NULL) {
111*40aec524SSunil Kumar Kori 		fprintf(stderr, " Mode value is invalid\n");
112*40aec524SSunil Kumar Kori 		goto error;
113*40aec524SSunil Kumar Kori 	}
114*40aec524SSunil Kumar Kori 
115*40aec524SSunil Kumar Kori 	ret = parse_cman_mode_str(token, &mode);
116*40aec524SSunil Kumar Kori 	if (ret) {
117*40aec524SSunil Kumar Kori 		fprintf(stderr, "mode string parse error\n");
118*40aec524SSunil Kumar Kori 		goto error;
119*40aec524SSunil Kumar Kori 	}
120*40aec524SSunil Kumar Kori 
121*40aec524SSunil Kumar Kori 	/* Third token: minimum threshold */
122*40aec524SSunil Kumar Kori 	token = strtok_r(str, PARSE_DELIMITER, &str);
123*40aec524SSunil Kumar Kori 	if (token == NULL) {
124*40aec524SSunil Kumar Kori 		fprintf(stderr, "Minimum threshold parse error\n");
125*40aec524SSunil Kumar Kori 		goto error;
126*40aec524SSunil Kumar Kori 	}
127*40aec524SSunil Kumar Kori 
128*40aec524SSunil Kumar Kori 	ret = parse_uint(&min_th, token);
129*40aec524SSunil Kumar Kori 	if (ret != 0 || min_th > UINT8_MAX) {
130*40aec524SSunil Kumar Kori 		fprintf(stderr, "Minimum threshold is invalid\n");
131*40aec524SSunil Kumar Kori 		goto error;
132*40aec524SSunil Kumar Kori 	}
133*40aec524SSunil Kumar Kori 
134*40aec524SSunil Kumar Kori 	/* Fourth token: maximum threshold */
135*40aec524SSunil Kumar Kori 	token = strtok_r(str, PARSE_DELIMITER, &str);
136*40aec524SSunil Kumar Kori 	if (token == NULL) {
137*40aec524SSunil Kumar Kori 		fprintf(stderr, "Maximum threshold parse error\n");
138*40aec524SSunil Kumar Kori 		goto error;
139*40aec524SSunil Kumar Kori 	}
140*40aec524SSunil Kumar Kori 
141*40aec524SSunil Kumar Kori 	ret = parse_uint(&max_th, token);
142*40aec524SSunil Kumar Kori 	if (ret != 0 || max_th > UINT8_MAX) {
143*40aec524SSunil Kumar Kori 		fprintf(stderr, "Maximum threshold is invalid\n");
144*40aec524SSunil Kumar Kori 		goto error;
145*40aec524SSunil Kumar Kori 	}
146*40aec524SSunil Kumar Kori 
147*40aec524SSunil Kumar Kori 	/* Fifth token: probability inversion */
148*40aec524SSunil Kumar Kori 	token = strtok_r(str, PARSE_DELIMITER, &str);
149*40aec524SSunil Kumar Kori 	if (token == NULL) {
150*40aec524SSunil Kumar Kori 		fprintf(stderr, "Maximum probability inversion parse error\n");
151*40aec524SSunil Kumar Kori 		goto error;
152*40aec524SSunil Kumar Kori 	}
153*40aec524SSunil Kumar Kori 
154*40aec524SSunil Kumar Kori 	ret = parse_uint(&maxp_inv, token);
155*40aec524SSunil Kumar Kori 	if (ret != 0 || maxp_inv == 0 || maxp_inv > UINT16_MAX) {
156*40aec524SSunil Kumar Kori 		fprintf(stderr, "Maximum probability inversion is invalid\n");
157*40aec524SSunil Kumar Kori 		goto error;
158*40aec524SSunil Kumar Kori 	}
159*40aec524SSunil Kumar Kori 
160*40aec524SSunil Kumar Kori 	memset(&info, 0, sizeof(struct rte_eth_cman_info));
161*40aec524SSunil Kumar Kori 	ret = rte_eth_cman_info_get(port_id, &info);
162*40aec524SSunil Kumar Kori 	if (ret) {
163*40aec524SSunil Kumar Kori 		fprintf(stderr, "Congestion management capa get error\n");
164*40aec524SSunil Kumar Kori 		goto error;
165*40aec524SSunil Kumar Kori 	}
166*40aec524SSunil Kumar Kori 
167*40aec524SSunil Kumar Kori 	if (!(info.objs_supported & obj)) {
168*40aec524SSunil Kumar Kori 		fprintf(stderr, "Object type is not supported by driver\n");
169*40aec524SSunil Kumar Kori 		goto error;
170*40aec524SSunil Kumar Kori 	}
171*40aec524SSunil Kumar Kori 
172*40aec524SSunil Kumar Kori 	if (!(info.modes_supported & mode)) {
173*40aec524SSunil Kumar Kori 		fprintf(stderr, "Mode is not supported by driver\n");
174*40aec524SSunil Kumar Kori 		goto error;
175*40aec524SSunil Kumar Kori 	}
176*40aec524SSunil Kumar Kori 
177*40aec524SSunil Kumar Kori 	cfg->obj = obj;
178*40aec524SSunil Kumar Kori 	cfg->mode = mode;
179*40aec524SSunil Kumar Kori 	cfg->mode_param.red.min_th = min_th;
180*40aec524SSunil Kumar Kori 	cfg->mode_param.red.max_th = max_th;
181*40aec524SSunil Kumar Kori 	cfg->mode_param.red.maxp_inv = maxp_inv;
182*40aec524SSunil Kumar Kori 
183*40aec524SSunil Kumar Kori 	return 0;
184*40aec524SSunil Kumar Kori 
185*40aec524SSunil Kumar Kori error:
186*40aec524SSunil Kumar Kori 	return -EINVAL;
187*40aec524SSunil Kumar Kori }
188*40aec524SSunil Kumar Kori 
189*40aec524SSunil Kumar Kori /* *** Show Port Congestion Management Capabilities *** */
190*40aec524SSunil Kumar Kori struct cmd_show_port_cman_capa_result {
191*40aec524SSunil Kumar Kori 	cmdline_fixed_string_t show;
192*40aec524SSunil Kumar Kori 	cmdline_fixed_string_t port;
193*40aec524SSunil Kumar Kori 	cmdline_fixed_string_t cman;
194*40aec524SSunil Kumar Kori 	cmdline_fixed_string_t capa;
195*40aec524SSunil Kumar Kori 	uint16_t port_id;
196*40aec524SSunil Kumar Kori };
197*40aec524SSunil Kumar Kori 
198*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_show_port_cman_capa_show =
199*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(
200*40aec524SSunil Kumar Kori 		struct cmd_show_port_cman_capa_result, show, "show");
201*40aec524SSunil Kumar Kori 
202*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_show_port_cman_capa_port =
203*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(
204*40aec524SSunil Kumar Kori 		struct cmd_show_port_cman_capa_result, port, "port");
205*40aec524SSunil Kumar Kori 
206*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_show_port_cman_capa_cman =
207*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(
208*40aec524SSunil Kumar Kori 		struct cmd_show_port_cman_capa_result, cman, "cman");
209*40aec524SSunil Kumar Kori 
210*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_show_port_cman_capa_capa =
211*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(
212*40aec524SSunil Kumar Kori 		struct cmd_show_port_cman_capa_result, capa, "capa");
213*40aec524SSunil Kumar Kori 
214*40aec524SSunil Kumar Kori static cmdline_parse_token_num_t cmd_show_port_cman_capa_port_id =
215*40aec524SSunil Kumar Kori 	TOKEN_NUM_INITIALIZER(
216*40aec524SSunil Kumar Kori 		struct cmd_show_port_cman_capa_result, port_id, RTE_UINT16);
217*40aec524SSunil Kumar Kori 
cmd_show_port_cman_capa_parsed(void * parsed_result,__rte_unused struct cmdline * cl,__rte_unused void * data)218*40aec524SSunil Kumar Kori static void cmd_show_port_cman_capa_parsed(void *parsed_result,
219*40aec524SSunil Kumar Kori 	__rte_unused struct cmdline *cl,
220*40aec524SSunil Kumar Kori 	__rte_unused void *data)
221*40aec524SSunil Kumar Kori {
222*40aec524SSunil Kumar Kori 	struct cmd_show_port_cman_capa_result *res = parsed_result;
223*40aec524SSunil Kumar Kori 	uint16_t port_id = res->port_id;
224*40aec524SSunil Kumar Kori 	struct rte_eth_cman_info info;
225*40aec524SSunil Kumar Kori 	int ret;
226*40aec524SSunil Kumar Kori 
227*40aec524SSunil Kumar Kori 	memset(&info, 0, sizeof(struct rte_eth_cman_info));
228*40aec524SSunil Kumar Kori 	ret = rte_eth_cman_info_get(port_id, &info);
229*40aec524SSunil Kumar Kori 	if (ret)
230*40aec524SSunil Kumar Kori 		return;
231*40aec524SSunil Kumar Kori 
232*40aec524SSunil Kumar Kori 	printf("\n****   Port Congestion Management Capabilities   ****\n\n");
233*40aec524SSunil Kumar Kori 	printf("modes_supported 0x%" PRIx64 "\n", info.modes_supported);
234*40aec524SSunil Kumar Kori 	printf("objs_supported 0x%" PRIx64 "\n", info.objs_supported);
235*40aec524SSunil Kumar Kori }
236*40aec524SSunil Kumar Kori 
237*40aec524SSunil Kumar Kori cmdline_parse_inst_t cmd_show_port_cman_capa = {
238*40aec524SSunil Kumar Kori 	.f = cmd_show_port_cman_capa_parsed,
239*40aec524SSunil Kumar Kori 	.data = NULL,
240*40aec524SSunil Kumar Kori 	.help_str = "show port cman capa <port_id>",
241*40aec524SSunil Kumar Kori 	.tokens = {
242*40aec524SSunil Kumar Kori 		(void *)&cmd_show_port_cman_capa_show,
243*40aec524SSunil Kumar Kori 		(void *)&cmd_show_port_cman_capa_port,
244*40aec524SSunil Kumar Kori 		(void *)&cmd_show_port_cman_capa_cman,
245*40aec524SSunil Kumar Kori 		(void *)&cmd_show_port_cman_capa_capa,
246*40aec524SSunil Kumar Kori 		(void *)&cmd_show_port_cman_capa_port_id,
247*40aec524SSunil Kumar Kori 		NULL,
248*40aec524SSunil Kumar Kori 	},
249*40aec524SSunil Kumar Kori };
250*40aec524SSunil Kumar Kori 
251*40aec524SSunil Kumar Kori /* *** Show Port Congestion Management configuration *** */
252*40aec524SSunil Kumar Kori struct cmd_show_port_cman_cfg_result {
253*40aec524SSunil Kumar Kori 	cmdline_fixed_string_t show;
254*40aec524SSunil Kumar Kori 	cmdline_fixed_string_t port;
255*40aec524SSunil Kumar Kori 	cmdline_fixed_string_t cman;
256*40aec524SSunil Kumar Kori 	cmdline_fixed_string_t cfg;
257*40aec524SSunil Kumar Kori 	uint16_t port_id;
258*40aec524SSunil Kumar Kori };
259*40aec524SSunil Kumar Kori 
260*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_show_port_cman_cfg_show =
261*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(
262*40aec524SSunil Kumar Kori 		struct cmd_show_port_cman_cfg_result, show, "show");
263*40aec524SSunil Kumar Kori 
264*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_show_port_cman_cfg_port =
265*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(
266*40aec524SSunil Kumar Kori 		struct cmd_show_port_cman_cfg_result, port, "port");
267*40aec524SSunil Kumar Kori 
268*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_show_port_cman_cfg_cman =
269*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(
270*40aec524SSunil Kumar Kori 		struct cmd_show_port_cman_cfg_result, cman, "cman");
271*40aec524SSunil Kumar Kori 
272*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_show_port_cman_cfg_cfg =
273*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(
274*40aec524SSunil Kumar Kori 		struct cmd_show_port_cman_cfg_result, cfg, "config");
275*40aec524SSunil Kumar Kori 
276*40aec524SSunil Kumar Kori static cmdline_parse_token_num_t cmd_show_port_cman_cfg_port_id =
277*40aec524SSunil Kumar Kori 	TOKEN_NUM_INITIALIZER(
278*40aec524SSunil Kumar Kori 		struct cmd_show_port_cman_cfg_result, port_id, RTE_UINT16);
279*40aec524SSunil Kumar Kori 
cmd_show_port_cman_cfg_parsed(void * parsed_result,__rte_unused struct cmdline * cl,__rte_unused void * data)280*40aec524SSunil Kumar Kori static void cmd_show_port_cman_cfg_parsed(void *parsed_result,
281*40aec524SSunil Kumar Kori 	__rte_unused struct cmdline *cl,
282*40aec524SSunil Kumar Kori 	__rte_unused void *data)
283*40aec524SSunil Kumar Kori {
284*40aec524SSunil Kumar Kori 	struct cmd_show_port_cman_cfg_result *res = parsed_result;
285*40aec524SSunil Kumar Kori 	uint16_t port_id = res->port_id;
286*40aec524SSunil Kumar Kori 	struct rte_eth_cman_config cfg;
287*40aec524SSunil Kumar Kori 	int ret;
288*40aec524SSunil Kumar Kori 
289*40aec524SSunil Kumar Kori 	memset(&cfg, 0, sizeof(struct rte_eth_cman_config));
290*40aec524SSunil Kumar Kori 	ret = rte_eth_cman_config_get(port_id, &cfg);
291*40aec524SSunil Kumar Kori 	if (ret)
292*40aec524SSunil Kumar Kori 		return;
293*40aec524SSunil Kumar Kori 
294*40aec524SSunil Kumar Kori 	printf("\n****   Port Congestion Management Configuration   ****\n\n");
295*40aec524SSunil Kumar Kori 	printf("cman object 0x%" PRIx32 "\n", cfg.obj);
296*40aec524SSunil Kumar Kori 	printf("cman Rx queue %" PRIx16 "\n", cfg.obj_param.rx_queue);
297*40aec524SSunil Kumar Kori 	printf("cman mode 0x%" PRIx32 "\n", cfg.mode);
298*40aec524SSunil Kumar Kori 	printf("cman RED min thresh %" PRIx8 "\n", cfg.mode_param.red.min_th);
299*40aec524SSunil Kumar Kori 	printf("cman RED max thresh %" PRIx8 "\n", cfg.mode_param.red.max_th);
300*40aec524SSunil Kumar Kori 	printf("cman RED Prob inversion %" PRIx16 "\n",
301*40aec524SSunil Kumar Kori 		cfg.mode_param.red.maxp_inv);
302*40aec524SSunil Kumar Kori }
303*40aec524SSunil Kumar Kori 
304*40aec524SSunil Kumar Kori cmdline_parse_inst_t cmd_show_port_cman_config = {
305*40aec524SSunil Kumar Kori 	.f = cmd_show_port_cman_cfg_parsed,
306*40aec524SSunil Kumar Kori 	.data = NULL,
307*40aec524SSunil Kumar Kori 	.help_str = "show port cman config <port_id>",
308*40aec524SSunil Kumar Kori 	.tokens = {
309*40aec524SSunil Kumar Kori 		(void *)&cmd_show_port_cman_cfg_show,
310*40aec524SSunil Kumar Kori 		(void *)&cmd_show_port_cman_cfg_port,
311*40aec524SSunil Kumar Kori 		(void *)&cmd_show_port_cman_cfg_cman,
312*40aec524SSunil Kumar Kori 		(void *)&cmd_show_port_cman_cfg_cfg,
313*40aec524SSunil Kumar Kori 		(void *)&cmd_show_port_cman_cfg_port_id,
314*40aec524SSunil Kumar Kori 		NULL,
315*40aec524SSunil Kumar Kori 	},
316*40aec524SSunil Kumar Kori };
317*40aec524SSunil Kumar Kori 
318*40aec524SSunil Kumar Kori /* *** Set Port Congestion Management configuration *** */
319*40aec524SSunil Kumar Kori struct cmd_set_port_cman_cfg_result {
320*40aec524SSunil Kumar Kori 	cmdline_fixed_string_t set;
321*40aec524SSunil Kumar Kori 	cmdline_fixed_string_t port;
322*40aec524SSunil Kumar Kori 	cmdline_fixed_string_t cman;
323*40aec524SSunil Kumar Kori 	cmdline_fixed_string_t cfg;
324*40aec524SSunil Kumar Kori 	uint16_t port_id;
325*40aec524SSunil Kumar Kori 	uint16_t qid;
326*40aec524SSunil Kumar Kori 	cmdline_multi_string_t params;
327*40aec524SSunil Kumar Kori };
328*40aec524SSunil Kumar Kori 
329*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_set_port_cman_cfg_set =
330*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(
331*40aec524SSunil Kumar Kori 		struct cmd_set_port_cman_cfg_result, set, "set");
332*40aec524SSunil Kumar Kori 
333*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_set_port_cman_cfg_port =
334*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(
335*40aec524SSunil Kumar Kori 		struct cmd_set_port_cman_cfg_result, port, "port");
336*40aec524SSunil Kumar Kori 
337*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_set_port_cman_cfg_cman =
338*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(
339*40aec524SSunil Kumar Kori 		struct cmd_set_port_cman_cfg_result, cman, "cman");
340*40aec524SSunil Kumar Kori 
341*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_set_port_cman_cfg_cfg =
342*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(
343*40aec524SSunil Kumar Kori 		struct cmd_set_port_cman_cfg_result, cfg, "config");
344*40aec524SSunil Kumar Kori 
345*40aec524SSunil Kumar Kori static cmdline_parse_token_num_t cmd_set_port_cman_cfg_port_id =
346*40aec524SSunil Kumar Kori 	TOKEN_NUM_INITIALIZER(
347*40aec524SSunil Kumar Kori 		struct cmd_set_port_cman_cfg_result, port_id, RTE_UINT16);
348*40aec524SSunil Kumar Kori 
349*40aec524SSunil Kumar Kori static cmdline_parse_token_num_t cmd_set_port_cman_cfg_qid =
350*40aec524SSunil Kumar Kori 	TOKEN_NUM_INITIALIZER(
351*40aec524SSunil Kumar Kori 		struct cmd_set_port_cman_cfg_result, qid, RTE_UINT16);
352*40aec524SSunil Kumar Kori 
353*40aec524SSunil Kumar Kori static cmdline_parse_token_string_t cmd_set_port_cman_cfg_params =
354*40aec524SSunil Kumar Kori 	TOKEN_STRING_INITIALIZER(struct cmd_set_port_cman_cfg_result,
355*40aec524SSunil Kumar Kori 		params, TOKEN_STRING_MULTI);
356*40aec524SSunil Kumar Kori 
cmd_set_port_cman_cfg_parsed(void * parsed_result,__rte_unused struct cmdline * cl,__rte_unused void * data)357*40aec524SSunil Kumar Kori static void cmd_set_port_cman_cfg_parsed(void *parsed_result,
358*40aec524SSunil Kumar Kori 	__rte_unused struct cmdline *cl,
359*40aec524SSunil Kumar Kori 	__rte_unused void *data)
360*40aec524SSunil Kumar Kori {
361*40aec524SSunil Kumar Kori 	struct cmd_set_port_cman_cfg_result *res = parsed_result;
362*40aec524SSunil Kumar Kori 	uint16_t port_id = res->port_id;
363*40aec524SSunil Kumar Kori 	struct rte_eth_cman_config cfg;
364*40aec524SSunil Kumar Kori 	int ret;
365*40aec524SSunil Kumar Kori 
366*40aec524SSunil Kumar Kori 	ret = parse_cman_params_str(port_id, res->params, &cfg);
367*40aec524SSunil Kumar Kori 	if (ret) {
368*40aec524SSunil Kumar Kori 		fprintf(stderr, "params string parse error\n");
369*40aec524SSunil Kumar Kori 		return;
370*40aec524SSunil Kumar Kori 	}
371*40aec524SSunil Kumar Kori 
372*40aec524SSunil Kumar Kori 	cfg.obj_param.rx_queue = res->qid;
373*40aec524SSunil Kumar Kori 	rte_eth_cman_config_set(port_id, &cfg);
374*40aec524SSunil Kumar Kori }
375*40aec524SSunil Kumar Kori 
376*40aec524SSunil Kumar Kori cmdline_parse_inst_t cmd_set_port_cman_config = {
377*40aec524SSunil Kumar Kori 	.f = cmd_set_port_cman_cfg_parsed,
378*40aec524SSunil Kumar Kori 	.data = NULL,
379*40aec524SSunil Kumar Kori 	.help_str = "set port cman config <port_id> <queue_id> "
380*40aec524SSunil Kumar Kori 		    "default | [obj <queue|queue_mempool> mode red "
381*40aec524SSunil Kumar Kori 		    "<min_thresh> <max_thresh> <prob_inv>]",
382*40aec524SSunil Kumar Kori 	.tokens = {
383*40aec524SSunil Kumar Kori 		(void *)&cmd_set_port_cman_cfg_set,
384*40aec524SSunil Kumar Kori 		(void *)&cmd_set_port_cman_cfg_port,
385*40aec524SSunil Kumar Kori 		(void *)&cmd_set_port_cman_cfg_cman,
386*40aec524SSunil Kumar Kori 		(void *)&cmd_set_port_cman_cfg_cfg,
387*40aec524SSunil Kumar Kori 		(void *)&cmd_set_port_cman_cfg_port_id,
388*40aec524SSunil Kumar Kori 		(void *)&cmd_set_port_cman_cfg_qid,
389*40aec524SSunil Kumar Kori 		(void *)&cmd_set_port_cman_cfg_params,
390*40aec524SSunil Kumar Kori 		NULL,
391*40aec524SSunil Kumar Kori 	},
392*40aec524SSunil Kumar Kori };
393