xref: /dpdk/examples/qos_sched/cfg_file.c (revision 92e9fe0d87b1e27306167b56a0c90c471966c630)
13998e2a0SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
23998e2a0SBruce Richardson  * Copyright(c) 2010-2014 Intel Corporation
3de3cfa2cSIntel  */
4de3cfa2cSIntel 
5de3cfa2cSIntel #include <stdio.h>
6de3cfa2cSIntel #include <stdlib.h>
7de3cfa2cSIntel #include <string.h>
8de3cfa2cSIntel #include <ctype.h>
9de3cfa2cSIntel #include <rte_string_fns.h>
10de3cfa2cSIntel #include <rte_sched.h>
11de3cfa2cSIntel 
12de3cfa2cSIntel #include "cfg_file.h"
13de3cfa2cSIntel #include "main.h"
14de3cfa2cSIntel 
15de3cfa2cSIntel 
16de3cfa2cSIntel /** when we resize a file structure, how many extra entries
17de3cfa2cSIntel  * for new sections do we add in */
18de3cfa2cSIntel #define CFG_ALLOC_SECTION_BATCH 8
19de3cfa2cSIntel /** when we resize a section structure, how many extra entries
20de3cfa2cSIntel  * for new entries do we add in */
21de3cfa2cSIntel #define CFG_ALLOC_ENTRY_BATCH 16
22de3cfa2cSIntel 
23345187bdSTimothy Redaelli uint32_t active_queues[RTE_SCHED_QUEUES_PER_PIPE];
24345187bdSTimothy Redaelli uint32_t n_active_queues;
25345187bdSTimothy Redaelli 
26a61b3196SMarcin Danilewicz struct rte_sched_cman_params cman_params;
27a61b3196SMarcin Danilewicz 
parse_u64(const char * entry,uint64_t * val)28*92e9fe0dSMegha Ajmera int parse_u64(const char *entry, uint64_t *val)
29*92e9fe0dSMegha Ajmera {
30*92e9fe0dSMegha Ajmera 	char *endptr;
31*92e9fe0dSMegha Ajmera 	if (!entry || !val)
32*92e9fe0dSMegha Ajmera 		return -EINVAL;
33*92e9fe0dSMegha Ajmera 
34*92e9fe0dSMegha Ajmera 	errno = 0;
35*92e9fe0dSMegha Ajmera 
36*92e9fe0dSMegha Ajmera 	*val = strtoull(entry, &endptr, 0);
37*92e9fe0dSMegha Ajmera 	if (errno == EINVAL || errno == ERANGE || *endptr != '\0')
38*92e9fe0dSMegha Ajmera 		return -EINVAL;
39*92e9fe0dSMegha Ajmera 
40*92e9fe0dSMegha Ajmera 	return 0;
41*92e9fe0dSMegha Ajmera }
42*92e9fe0dSMegha Ajmera 
43de3cfa2cSIntel int
cfg_load_port(struct rte_cfgfile * cfg,struct rte_sched_port_params * port_params)44db935d01SMichal Jastrzebski cfg_load_port(struct rte_cfgfile *cfg, struct rte_sched_port_params *port_params)
45de3cfa2cSIntel {
46de3cfa2cSIntel 	const char *entry;
47de3cfa2cSIntel 
48de3cfa2cSIntel 	if (!cfg || !port_params)
49de3cfa2cSIntel 		return -1;
50de3cfa2cSIntel 
51db935d01SMichal Jastrzebski 	entry = rte_cfgfile_get_entry(cfg, "port", "frame overhead");
52de3cfa2cSIntel 	if (entry)
53de3cfa2cSIntel 		port_params->frame_overhead = (uint32_t)atoi(entry);
54de3cfa2cSIntel 
55db935d01SMichal Jastrzebski 	entry = rte_cfgfile_get_entry(cfg, "port", "number of subports per port");
56de3cfa2cSIntel 	if (entry)
57de3cfa2cSIntel 		port_params->n_subports_per_port = (uint32_t)atoi(entry);
58de3cfa2cSIntel 
59de3cfa2cSIntel 	return 0;
60de3cfa2cSIntel }
61de3cfa2cSIntel 
62de3cfa2cSIntel int
cfg_load_pipe(struct rte_cfgfile * cfg,struct rte_sched_pipe_params * pipe_params)63db935d01SMichal Jastrzebski cfg_load_pipe(struct rte_cfgfile *cfg, struct rte_sched_pipe_params *pipe_params)
64de3cfa2cSIntel {
65*92e9fe0dSMegha Ajmera 	int i, j, ret = 0;
66de3cfa2cSIntel 	char *next;
67de3cfa2cSIntel 	const char *entry;
68de3cfa2cSIntel 	int profiles;
69de3cfa2cSIntel 
70de3cfa2cSIntel 	if (!cfg || !pipe_params)
71de3cfa2cSIntel 		return -1;
72de3cfa2cSIntel 
73db935d01SMichal Jastrzebski 	profiles = rte_cfgfile_num_sections(cfg, "pipe profile", sizeof("pipe profile") - 1);
74b0c1628bSJasvinder Singh 	subport_params[0].n_pipe_profiles = profiles;
75de3cfa2cSIntel 
76de3cfa2cSIntel 	for (j = 0; j < profiles; j++) {
77de3cfa2cSIntel 		char pipe_name[32];
786f41fe75SStephen Hemminger 		snprintf(pipe_name, sizeof(pipe_name), "pipe profile %d", j);
79de3cfa2cSIntel 
80db935d01SMichal Jastrzebski 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tb rate");
81*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tb_rate);
82*92e9fe0dSMegha Ajmera 		if (ret)
83*92e9fe0dSMegha Ajmera 			return ret;
84de3cfa2cSIntel 
85db935d01SMichal Jastrzebski 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tb size");
86*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tb_size);
87*92e9fe0dSMegha Ajmera 		if (ret)
88*92e9fe0dSMegha Ajmera 			return ret;
89de3cfa2cSIntel 
90db935d01SMichal Jastrzebski 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc period");
91*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_period);
92*92e9fe0dSMegha Ajmera 		if (ret)
93*92e9fe0dSMegha Ajmera 			return ret;
94de3cfa2cSIntel 
95db935d01SMichal Jastrzebski 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 0 rate");
96*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[0]);
97*92e9fe0dSMegha Ajmera 		if (ret)
98*92e9fe0dSMegha Ajmera 			return ret;
99de3cfa2cSIntel 
100db935d01SMichal Jastrzebski 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 1 rate");
101*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[1]);
102*92e9fe0dSMegha Ajmera 		if (ret)
103*92e9fe0dSMegha Ajmera 			return ret;
104de3cfa2cSIntel 
105db935d01SMichal Jastrzebski 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 2 rate");
106*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[2]);
107*92e9fe0dSMegha Ajmera 		if (ret)
108*92e9fe0dSMegha Ajmera 			return ret;
109de3cfa2cSIntel 
110db935d01SMichal Jastrzebski 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 3 rate");
111*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[3]);
112*92e9fe0dSMegha Ajmera 		if (ret)
113*92e9fe0dSMegha Ajmera 			return ret;
114de3cfa2cSIntel 
115be1e5332SJasvinder Singh 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 4 rate");
116*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[4]);
117*92e9fe0dSMegha Ajmera 		if (ret)
118*92e9fe0dSMegha Ajmera 			return ret;
119be1e5332SJasvinder Singh 
120be1e5332SJasvinder Singh 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 5 rate");
121*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[5]);
122*92e9fe0dSMegha Ajmera 		if (ret)
123*92e9fe0dSMegha Ajmera 			return ret;
124be1e5332SJasvinder Singh 
125be1e5332SJasvinder Singh 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 6 rate");
126*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[6]);
127*92e9fe0dSMegha Ajmera 		if (ret)
128*92e9fe0dSMegha Ajmera 			return ret;
129be1e5332SJasvinder Singh 
130be1e5332SJasvinder Singh 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 7 rate");
131*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[7]);
132*92e9fe0dSMegha Ajmera 		if (ret)
133*92e9fe0dSMegha Ajmera 			return ret;
134be1e5332SJasvinder Singh 
135be1e5332SJasvinder Singh 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 8 rate");
136*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[8]);
137*92e9fe0dSMegha Ajmera 		if (ret)
138*92e9fe0dSMegha Ajmera 			return ret;
139be1e5332SJasvinder Singh 
140be1e5332SJasvinder Singh 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 9 rate");
141*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[9]);
142*92e9fe0dSMegha Ajmera 		if (ret)
143*92e9fe0dSMegha Ajmera 			return ret;
144be1e5332SJasvinder Singh 
145be1e5332SJasvinder Singh 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 10 rate");
146*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[10]);
147*92e9fe0dSMegha Ajmera 		if (ret)
148*92e9fe0dSMegha Ajmera 			return ret;
149be1e5332SJasvinder Singh 
150be1e5332SJasvinder Singh 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 11 rate");
151*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[11]);
152*92e9fe0dSMegha Ajmera 		if (ret)
153*92e9fe0dSMegha Ajmera 			return ret;
154be1e5332SJasvinder Singh 
155be1e5332SJasvinder Singh 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 12 rate");
156*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &pipe_params[j].tc_rate[12]);
157*92e9fe0dSMegha Ajmera 		if (ret)
158*92e9fe0dSMegha Ajmera 			return ret;
159be1e5332SJasvinder Singh 
160be1e5332SJasvinder Singh 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 12 oversubscription weight");
161de3cfa2cSIntel 		if (entry)
162835c5409SIntel 			pipe_params[j].tc_ov_weight = (uint8_t)atoi(entry);
163de3cfa2cSIntel 
164be1e5332SJasvinder Singh 		entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 12 wrr weights");
165de3cfa2cSIntel 		if (entry) {
166be1e5332SJasvinder Singh 			for (i = 0; i < RTE_SCHED_BE_QUEUES_PER_PIPE; i++) {
167be1e5332SJasvinder Singh 				pipe_params[j].wrr_weights[i] =
168de3cfa2cSIntel 					(uint8_t)strtol(entry, &next, 10);
169de3cfa2cSIntel 				if (next == NULL)
170de3cfa2cSIntel 					break;
171de3cfa2cSIntel 				entry = next;
172de3cfa2cSIntel 			}
173de3cfa2cSIntel 		}
174de3cfa2cSIntel 	}
175de3cfa2cSIntel 	return 0;
176de3cfa2cSIntel }
177de3cfa2cSIntel 
178de3cfa2cSIntel int
cfg_load_subport_profile(struct rte_cfgfile * cfg,struct rte_sched_subport_profile_params * subport_profile)179802d214dSSavinay Dharmappa cfg_load_subport_profile(struct rte_cfgfile *cfg,
180802d214dSSavinay Dharmappa 	struct rte_sched_subport_profile_params *subport_profile)
181802d214dSSavinay Dharmappa {
182*92e9fe0dSMegha Ajmera 	int i, ret = 0;
183802d214dSSavinay Dharmappa 	const char *entry;
184802d214dSSavinay Dharmappa 	int profiles;
185802d214dSSavinay Dharmappa 
186802d214dSSavinay Dharmappa 	if (!cfg || !subport_profile)
187802d214dSSavinay Dharmappa 		return -1;
188802d214dSSavinay Dharmappa 
189802d214dSSavinay Dharmappa 	profiles = rte_cfgfile_num_sections(cfg, "subport profile",
190802d214dSSavinay Dharmappa 					   sizeof("subport profile") - 1);
19185ea681cSMegha Ajmera 	port_params.n_subport_profiles = profiles;
192802d214dSSavinay Dharmappa 
193802d214dSSavinay Dharmappa 	for (i = 0; i < profiles; i++) {
194802d214dSSavinay Dharmappa 		char sec_name[32];
195802d214dSSavinay Dharmappa 		snprintf(sec_name, sizeof(sec_name), "subport profile %d", i);
196802d214dSSavinay Dharmappa 
197802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tb rate");
198*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tb_rate);
199*92e9fe0dSMegha Ajmera 		if (ret)
200*92e9fe0dSMegha Ajmera 			return ret;
201802d214dSSavinay Dharmappa 
202802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tb size");
203*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tb_size);
204*92e9fe0dSMegha Ajmera 		if (ret)
205*92e9fe0dSMegha Ajmera 			return ret;
206802d214dSSavinay Dharmappa 
207802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc period");
208*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_period);
209*92e9fe0dSMegha Ajmera 		if (ret)
210*92e9fe0dSMegha Ajmera 			return ret;
211802d214dSSavinay Dharmappa 
212802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 0 rate");
213*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[0]);
214*92e9fe0dSMegha Ajmera 		if (ret)
215*92e9fe0dSMegha Ajmera 			return ret;
216802d214dSSavinay Dharmappa 
217802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 1 rate");
218*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[1]);
219*92e9fe0dSMegha Ajmera 		if (ret)
220*92e9fe0dSMegha Ajmera 			return ret;
221802d214dSSavinay Dharmappa 
222802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 2 rate");
223*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[2]);
224*92e9fe0dSMegha Ajmera 		if (ret)
225*92e9fe0dSMegha Ajmera 			return ret;
226802d214dSSavinay Dharmappa 
227802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 3 rate");
228*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[3]);
229*92e9fe0dSMegha Ajmera 		if (ret)
230*92e9fe0dSMegha Ajmera 			return ret;
231802d214dSSavinay Dharmappa 
232802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 4 rate");
233*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[4]);
234*92e9fe0dSMegha Ajmera 		if (ret)
235*92e9fe0dSMegha Ajmera 			return ret;
236802d214dSSavinay Dharmappa 
237802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 5 rate");
238*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[5]);
239*92e9fe0dSMegha Ajmera 		if (ret)
240*92e9fe0dSMegha Ajmera 			return ret;
241802d214dSSavinay Dharmappa 
242802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 6 rate");
243*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[6]);
244*92e9fe0dSMegha Ajmera 		if (ret)
245*92e9fe0dSMegha Ajmera 			return ret;
246802d214dSSavinay Dharmappa 
247802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 7 rate");
248*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[7]);
249*92e9fe0dSMegha Ajmera 		if (ret)
250*92e9fe0dSMegha Ajmera 			return ret;
251802d214dSSavinay Dharmappa 
252802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 8 rate");
253*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[8]);
254*92e9fe0dSMegha Ajmera 		if (ret)
255*92e9fe0dSMegha Ajmera 			return ret;
256802d214dSSavinay Dharmappa 
257802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 9 rate");
258*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[9]);
259*92e9fe0dSMegha Ajmera 		if (ret)
260*92e9fe0dSMegha Ajmera 			return ret;
261802d214dSSavinay Dharmappa 
262802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 10 rate");
263*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[10]);
264*92e9fe0dSMegha Ajmera 		if (ret)
265*92e9fe0dSMegha Ajmera 			return ret;
266802d214dSSavinay Dharmappa 
267802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 11 rate");
268*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[11]);
269*92e9fe0dSMegha Ajmera 		if (ret)
270*92e9fe0dSMegha Ajmera 			return ret;
271802d214dSSavinay Dharmappa 
272802d214dSSavinay Dharmappa 		entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 12 rate");
273*92e9fe0dSMegha Ajmera 		ret = parse_u64(entry, &subport_profile[i].tc_rate[12]);
274*92e9fe0dSMegha Ajmera 		if (ret)
275*92e9fe0dSMegha Ajmera 			return ret;
276802d214dSSavinay Dharmappa 	}
277802d214dSSavinay Dharmappa 
278802d214dSSavinay Dharmappa 	return 0;
279802d214dSSavinay Dharmappa }
280802d214dSSavinay Dharmappa 
281802d214dSSavinay Dharmappa int
cfg_load_subport(struct rte_cfgfile * cfg,struct rte_sched_subport_params * subport_params)282db935d01SMichal Jastrzebski cfg_load_subport(struct rte_cfgfile *cfg, struct rte_sched_subport_params *subport_params)
283de3cfa2cSIntel {
284a61b3196SMarcin Danilewicz 	bool cman_enabled = false;
285de3cfa2cSIntel 	const char *entry;
286de3cfa2cSIntel 	int i, j, k;
287de3cfa2cSIntel 
288de3cfa2cSIntel 	if (!cfg || !subport_params)
289de3cfa2cSIntel 		return -1;
290de3cfa2cSIntel 
291de3cfa2cSIntel 	memset(app_pipe_to_profile, -1, sizeof(app_pipe_to_profile));
292b0c1628bSJasvinder Singh 	memset(active_queues, 0, sizeof(active_queues));
293b0c1628bSJasvinder Singh 	n_active_queues = 0;
294b0c1628bSJasvinder Singh 
29506135957SWojciech Liguzinski 	if (rte_cfgfile_has_section(cfg, "red")) {
29606135957SWojciech Liguzinski 		cman_params.cman_mode = RTE_SCHED_CMAN_RED;
297a61b3196SMarcin Danilewicz 		cman_enabled = true;
298b0c1628bSJasvinder Singh 
299b0c1628bSJasvinder Singh 		for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {
300b0c1628bSJasvinder Singh 			char str[32];
301b0c1628bSJasvinder Singh 
30206135957SWojciech Liguzinski 			/* Parse RED min thresholds */
30306135957SWojciech Liguzinski 			snprintf(str, sizeof(str), "tc %d red min", i);
30406135957SWojciech Liguzinski 			entry = rte_cfgfile_get_entry(cfg, "red", str);
305b0c1628bSJasvinder Singh 			if (entry) {
306b0c1628bSJasvinder Singh 				char *next;
307b0c1628bSJasvinder Singh 				/* for each packet colour (green, yellow, red) */
308b0c1628bSJasvinder Singh 				for (j = 0; j < RTE_COLORS; j++) {
30906135957SWojciech Liguzinski 					cman_params.red_params[i][j].min_th
310b0c1628bSJasvinder Singh 						= (uint16_t)strtol(entry, &next, 10);
311b0c1628bSJasvinder Singh 					if (next == NULL)
312b0c1628bSJasvinder Singh 						break;
313b0c1628bSJasvinder Singh 					entry = next;
314b0c1628bSJasvinder Singh 				}
315b0c1628bSJasvinder Singh 			}
316b0c1628bSJasvinder Singh 
31706135957SWojciech Liguzinski 			/* Parse RED max thresholds */
31806135957SWojciech Liguzinski 			snprintf(str, sizeof(str), "tc %d red max", i);
319b0c1628bSJasvinder Singh 			entry = rte_cfgfile_get_entry(cfg, "red", str);
320b0c1628bSJasvinder Singh 			if (entry) {
321b0c1628bSJasvinder Singh 				char *next;
322b0c1628bSJasvinder Singh 				/* for each packet colour (green, yellow, red) */
323b0c1628bSJasvinder Singh 				for (j = 0; j < RTE_COLORS; j++) {
32406135957SWojciech Liguzinski 					cman_params.red_params[i][j].max_th
325b0c1628bSJasvinder Singh 						= (uint16_t)strtol(entry, &next, 10);
326b0c1628bSJasvinder Singh 					if (next == NULL)
327b0c1628bSJasvinder Singh 						break;
328b0c1628bSJasvinder Singh 					entry = next;
329b0c1628bSJasvinder Singh 				}
330b0c1628bSJasvinder Singh 			}
331b0c1628bSJasvinder Singh 
33206135957SWojciech Liguzinski 			/* Parse RED inverse mark probabilities */
33306135957SWojciech Liguzinski 			snprintf(str, sizeof(str), "tc %d red inv prob", i);
334b0c1628bSJasvinder Singh 			entry = rte_cfgfile_get_entry(cfg, "red", str);
335b0c1628bSJasvinder Singh 			if (entry) {
336b0c1628bSJasvinder Singh 				char *next;
337b0c1628bSJasvinder Singh 				/* for each packet colour (green, yellow, red) */
338b0c1628bSJasvinder Singh 				for (j = 0; j < RTE_COLORS; j++) {
33906135957SWojciech Liguzinski 					cman_params.red_params[i][j].maxp_inv
340b0c1628bSJasvinder Singh 						= (uint8_t)strtol(entry, &next, 10);
341b0c1628bSJasvinder Singh 
342b0c1628bSJasvinder Singh 					if (next == NULL)
343b0c1628bSJasvinder Singh 						break;
344b0c1628bSJasvinder Singh 					entry = next;
345b0c1628bSJasvinder Singh 				}
346b0c1628bSJasvinder Singh 			}
347b0c1628bSJasvinder Singh 
34806135957SWojciech Liguzinski 			/* Parse RED EWMA filter weights */
34906135957SWojciech Liguzinski 			snprintf(str, sizeof(str), "tc %d red weight", i);
350b0c1628bSJasvinder Singh 			entry = rte_cfgfile_get_entry(cfg, "red", str);
351b0c1628bSJasvinder Singh 			if (entry) {
352b0c1628bSJasvinder Singh 				char *next;
353b0c1628bSJasvinder Singh 				/* for each packet colour (green, yellow, red) */
354b0c1628bSJasvinder Singh 				for (j = 0; j < RTE_COLORS; j++) {
35506135957SWojciech Liguzinski 					cman_params.red_params[i][j].wq_log2
356b0c1628bSJasvinder Singh 						= (uint8_t)strtol(entry, &next, 10);
357b0c1628bSJasvinder Singh 					if (next == NULL)
358b0c1628bSJasvinder Singh 						break;
359b0c1628bSJasvinder Singh 					entry = next;
360b0c1628bSJasvinder Singh 				}
361b0c1628bSJasvinder Singh 			}
362b0c1628bSJasvinder Singh 		}
363b0c1628bSJasvinder Singh 	}
36406135957SWojciech Liguzinski 
36506135957SWojciech Liguzinski 	if (rte_cfgfile_has_section(cfg, "pie")) {
36606135957SWojciech Liguzinski 		cman_params.cman_mode = RTE_SCHED_CMAN_PIE;
367a61b3196SMarcin Danilewicz 		cman_enabled = true;
36806135957SWojciech Liguzinski 
36906135957SWojciech Liguzinski 		for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {
37006135957SWojciech Liguzinski 			char str[32];
37106135957SWojciech Liguzinski 
37206135957SWojciech Liguzinski 			/* Parse Queue Delay Ref value */
37306135957SWojciech Liguzinski 			snprintf(str, sizeof(str), "tc %d qdelay ref", i);
37406135957SWojciech Liguzinski 			entry = rte_cfgfile_get_entry(cfg, "pie", str);
37506135957SWojciech Liguzinski 			if (entry)
37606135957SWojciech Liguzinski 				cman_params.pie_params[i].qdelay_ref =
37706135957SWojciech Liguzinski 					(uint16_t) atoi(entry);
37806135957SWojciech Liguzinski 
37906135957SWojciech Liguzinski 			/* Parse Max Burst value */
38006135957SWojciech Liguzinski 			snprintf(str, sizeof(str), "tc %d max burst", i);
38106135957SWojciech Liguzinski 			entry = rte_cfgfile_get_entry(cfg, "pie", str);
38206135957SWojciech Liguzinski 			if (entry)
38306135957SWojciech Liguzinski 				cman_params.pie_params[i].max_burst =
38406135957SWojciech Liguzinski 					(uint16_t) atoi(entry);
38506135957SWojciech Liguzinski 
38606135957SWojciech Liguzinski 			/* Parse Update Interval Value */
38706135957SWojciech Liguzinski 			snprintf(str, sizeof(str), "tc %d update interval", i);
38806135957SWojciech Liguzinski 			entry = rte_cfgfile_get_entry(cfg, "pie", str);
38906135957SWojciech Liguzinski 			if (entry)
39006135957SWojciech Liguzinski 				cman_params.pie_params[i].dp_update_interval =
39106135957SWojciech Liguzinski 					(uint16_t) atoi(entry);
39206135957SWojciech Liguzinski 
39306135957SWojciech Liguzinski 			/* Parse Tailq Threshold Value */
39406135957SWojciech Liguzinski 			snprintf(str, sizeof(str), "tc %d tailq th", i);
39506135957SWojciech Liguzinski 			entry = rte_cfgfile_get_entry(cfg, "pie", str);
39606135957SWojciech Liguzinski 			if (entry)
39706135957SWojciech Liguzinski 				cman_params.pie_params[i].tailq_th =
39806135957SWojciech Liguzinski 					(uint16_t) atoi(entry);
39906135957SWojciech Liguzinski 
40006135957SWojciech Liguzinski 		}
40106135957SWojciech Liguzinski 	}
402de3cfa2cSIntel 
403de3cfa2cSIntel 	for (i = 0; i < MAX_SCHED_SUBPORTS; i++) {
404de3cfa2cSIntel 		char sec_name[CFG_NAME_LEN];
4056f41fe75SStephen Hemminger 		snprintf(sec_name, sizeof(sec_name), "subport %d", i);
406de3cfa2cSIntel 
407db935d01SMichal Jastrzebski 		if (rte_cfgfile_has_section(cfg, sec_name)) {
408b0c1628bSJasvinder Singh 			entry = rte_cfgfile_get_entry(cfg, sec_name,
409b0c1628bSJasvinder Singh 				"number of pipes per subport");
410b0c1628bSJasvinder Singh 			if (entry)
411b0c1628bSJasvinder Singh 				subport_params[i].n_pipes_per_subport_enabled =
412b0c1628bSJasvinder Singh 					(uint32_t)atoi(entry);
413b0c1628bSJasvinder Singh 
414b0c1628bSJasvinder Singh 			entry = rte_cfgfile_get_entry(cfg, sec_name, "queue sizes");
415b0c1628bSJasvinder Singh 			if (entry) {
416b0c1628bSJasvinder Singh 				char *next;
417b0c1628bSJasvinder Singh 
418b0c1628bSJasvinder Singh 				for (j = 0; j < RTE_SCHED_TRAFFIC_CLASS_BE; j++) {
419b0c1628bSJasvinder Singh 					subport_params[i].qsize[j] =
420b0c1628bSJasvinder Singh 						(uint16_t)strtol(entry, &next, 10);
421b0c1628bSJasvinder Singh 					if (subport_params[i].qsize[j] != 0) {
422b0c1628bSJasvinder Singh 						active_queues[n_active_queues] = j;
423b0c1628bSJasvinder Singh 						n_active_queues++;
424b0c1628bSJasvinder Singh 					}
425b0c1628bSJasvinder Singh 					if (next == NULL)
426b0c1628bSJasvinder Singh 						break;
427b0c1628bSJasvinder Singh 					entry = next;
428b0c1628bSJasvinder Singh 				}
429b0c1628bSJasvinder Singh 
430b0c1628bSJasvinder Singh 				subport_params[i].qsize[RTE_SCHED_TRAFFIC_CLASS_BE] =
431b0c1628bSJasvinder Singh 					(uint16_t)strtol(entry, &next, 10);
432b0c1628bSJasvinder Singh 
433b0c1628bSJasvinder Singh 				for (j = 0; j < RTE_SCHED_BE_QUEUES_PER_PIPE; j++) {
434b0c1628bSJasvinder Singh 					active_queues[n_active_queues] =
435b0c1628bSJasvinder Singh 						RTE_SCHED_TRAFFIC_CLASS_BE + j;
436b0c1628bSJasvinder Singh 					n_active_queues++;
437b0c1628bSJasvinder Singh 				}
438b0c1628bSJasvinder Singh 			}
439b0c1628bSJasvinder Singh 
440db935d01SMichal Jastrzebski 			int n_entries = rte_cfgfile_section_num_entries(cfg, sec_name);
441db935d01SMichal Jastrzebski 			struct rte_cfgfile_entry entries[n_entries];
442de3cfa2cSIntel 
443db935d01SMichal Jastrzebski 			rte_cfgfile_section_entries(cfg, sec_name, entries, n_entries);
444de3cfa2cSIntel 
445de3cfa2cSIntel 			for (j = 0; j < n_entries; j++) {
446de3cfa2cSIntel 				if (strncmp("pipe", entries[j].name, sizeof("pipe") - 1) == 0) {
447de3cfa2cSIntel 					int profile;
448de3cfa2cSIntel 					char *tokens[2] = {NULL, NULL};
449de3cfa2cSIntel 					int n_tokens;
450de3cfa2cSIntel 					int begin, end;
451de3cfa2cSIntel 
452de3cfa2cSIntel 					profile = atoi(entries[j].value);
453de3cfa2cSIntel 					n_tokens = rte_strsplit(&entries[j].name[sizeof("pipe")],
454de3cfa2cSIntel 							strnlen(entries[j].name, CFG_NAME_LEN), tokens, 2, '-');
455de3cfa2cSIntel 
456de3cfa2cSIntel 					begin =  atoi(tokens[0]);
457de3cfa2cSIntel 					if (n_tokens == 2)
458de3cfa2cSIntel 						end = atoi(tokens[1]);
459de3cfa2cSIntel 					else
460de3cfa2cSIntel 						end = begin;
461de3cfa2cSIntel 
462de3cfa2cSIntel 					if (end >= MAX_SCHED_PIPES || begin > end)
463de3cfa2cSIntel 						return -1;
464de3cfa2cSIntel 
465de3cfa2cSIntel 					for (k = begin; k <= end; k++) {
466de3cfa2cSIntel 						char profile_name[CFG_NAME_LEN];
467de3cfa2cSIntel 
4686f41fe75SStephen Hemminger 						snprintf(profile_name, sizeof(profile_name),
469de3cfa2cSIntel 								"pipe profile %d", profile);
470db935d01SMichal Jastrzebski 						if (rte_cfgfile_has_section(cfg, profile_name))
471de3cfa2cSIntel 							app_pipe_to_profile[i][k] = profile;
472de3cfa2cSIntel 						else
473de3cfa2cSIntel 							rte_exit(EXIT_FAILURE, "Wrong pipe profile %s\n",
474de3cfa2cSIntel 									entries[j].value);
475de3cfa2cSIntel 
476de3cfa2cSIntel 					}
477de3cfa2cSIntel 				}
478de3cfa2cSIntel 			}
479a61b3196SMarcin Danilewicz 			if (cman_enabled)
480a61b3196SMarcin Danilewicz 				subport_params[i].cman_params = &cman_params;
481de3cfa2cSIntel 		}
482de3cfa2cSIntel 	}
483de3cfa2cSIntel 
484de3cfa2cSIntel 	return 0;
485de3cfa2cSIntel }
486