xref: /dpdk/app/test-compress-perf/comp_perf_options_parse.c (revision 8c7a31317b0ec128d25b30cd56db94c144ceaaa2)
1e0b6287cSTomasz Jozwiak /* SPDX-License-Identifier: BSD-3-Clause
2e0b6287cSTomasz Jozwiak  * Copyright(c) 2018 Intel Corporation
3e0b6287cSTomasz Jozwiak  */
4e0b6287cSTomasz Jozwiak 
5e0b6287cSTomasz Jozwiak #include <getopt.h>
6e0b6287cSTomasz Jozwiak #include <stdint.h>
7e0b6287cSTomasz Jozwiak #include <stdio.h>
8e0b6287cSTomasz Jozwiak #include <string.h>
9e0b6287cSTomasz Jozwiak #include <inttypes.h>
10e0b6287cSTomasz Jozwiak #include <stdlib.h>
11e0b6287cSTomasz Jozwiak #include <errno.h>
12e0b6287cSTomasz Jozwiak 
13e0b6287cSTomasz Jozwiak #include <rte_string_fns.h>
14e0b6287cSTomasz Jozwiak #include <rte_comp.h>
15e0b6287cSTomasz Jozwiak 
16e0b6287cSTomasz Jozwiak #include "comp_perf_options.h"
17e0b6287cSTomasz Jozwiak 
181a9b0f35STomasz Jozwiak #define CPERF_PTEST_TYPE	("ptest")
19e0b6287cSTomasz Jozwiak #define CPERF_DRIVER_NAME	("driver-name")
20e0b6287cSTomasz Jozwiak #define CPERF_TEST_FILE		("input-file")
21e0b6287cSTomasz Jozwiak #define CPERF_SEG_SIZE		("seg-sz")
22e0b6287cSTomasz Jozwiak #define CPERF_BURST_SIZE	("burst-sz")
23e0b6287cSTomasz Jozwiak #define CPERF_EXTENDED_SIZE	("extended-input-sz")
24e0b6287cSTomasz Jozwiak #define CPERF_POOL_SIZE		("pool-sz")
25e0b6287cSTomasz Jozwiak #define CPERF_MAX_SGL_SEGS	("max-num-sgl-segs")
26e0b6287cSTomasz Jozwiak #define CPERF_NUM_ITER		("num-iter")
27e0b6287cSTomasz Jozwiak #define CPERF_OPTYPE		("operation")
28e0b6287cSTomasz Jozwiak #define CPERF_HUFFMAN_ENC	("huffman-enc")
29e0b6287cSTomasz Jozwiak #define CPERF_LEVEL		("compress-level")
30e0b6287cSTomasz Jozwiak #define CPERF_WINDOW_SIZE	("window-sz")
31e0b6287cSTomasz Jozwiak 
32e0b6287cSTomasz Jozwiak struct name_id_map {
33e0b6287cSTomasz Jozwiak 	const char *name;
34e0b6287cSTomasz Jozwiak 	uint32_t id;
35e0b6287cSTomasz Jozwiak };
36e0b6287cSTomasz Jozwiak 
37e0b6287cSTomasz Jozwiak static void
38e0b6287cSTomasz Jozwiak usage(char *progname)
39e0b6287cSTomasz Jozwiak {
40e0b6287cSTomasz Jozwiak 	printf("%s [EAL options] --\n"
411a9b0f35STomasz Jozwiak 		" --ptest benchmark / verify :"
42e0b6287cSTomasz Jozwiak 		" --driver-name NAME: compress driver to use\n"
43e0b6287cSTomasz Jozwiak 		" --input-file NAME: file to compress and decompress\n"
44e0b6287cSTomasz Jozwiak 		" --extended-input-sz N: extend file data up to this size (default: no extension)\n"
45e0b6287cSTomasz Jozwiak 		" --seg-sz N: size of segment to store the data (default: 2048)\n"
46e0b6287cSTomasz Jozwiak 		" --burst-sz N: compress operation burst size\n"
47e0b6287cSTomasz Jozwiak 		" --pool-sz N: mempool size for compress operations/mbufs\n"
48e0b6287cSTomasz Jozwiak 		"		(default: 8192)\n"
49e0b6287cSTomasz Jozwiak 		" --max-num-sgl-segs N: maximum number of segments for each mbuf\n"
50e0b6287cSTomasz Jozwiak 		"		(default: 16)\n"
51e0b6287cSTomasz Jozwiak 		" --num-iter N: number of times the file will be\n"
52e0b6287cSTomasz Jozwiak 		"		compressed/decompressed (default: 10000)\n"
53e0b6287cSTomasz Jozwiak 		" --operation [comp/decomp/comp_and_decomp]: perform test on\n"
54e0b6287cSTomasz Jozwiak 		"		compression, decompression or both operations\n"
55fedfef43STomasz Jozwiak 		" --huffman-enc [fixed/dynamic/default]: Huffman encoding\n"
56fedfef43STomasz Jozwiak 		"		(default: dynamic)\n"
57e0b6287cSTomasz Jozwiak 		" --compress-level N: compression level, which could be a single value, list or range\n"
58e0b6287cSTomasz Jozwiak 		"		(default: range between 1 and 9)\n"
59e0b6287cSTomasz Jozwiak 		" --window-sz N: base two log value of compression window size\n"
60e0b6287cSTomasz Jozwiak 		"		(e.g.: 15 => 32k, default: max supported by PMD)\n"
61e0b6287cSTomasz Jozwiak 		" -h: prints this help\n",
62e0b6287cSTomasz Jozwiak 		progname);
63e0b6287cSTomasz Jozwiak }
64e0b6287cSTomasz Jozwiak 
65e0b6287cSTomasz Jozwiak static int
66e0b6287cSTomasz Jozwiak get_str_key_id_mapping(struct name_id_map *map, unsigned int map_len,
67e0b6287cSTomasz Jozwiak 		const char *str_key)
68e0b6287cSTomasz Jozwiak {
69e0b6287cSTomasz Jozwiak 	unsigned int i;
70e0b6287cSTomasz Jozwiak 
71e0b6287cSTomasz Jozwiak 	for (i = 0; i < map_len; i++) {
72e0b6287cSTomasz Jozwiak 
73e0b6287cSTomasz Jozwiak 		if (strcmp(str_key, map[i].name) == 0)
74e0b6287cSTomasz Jozwiak 			return map[i].id;
75e0b6287cSTomasz Jozwiak 	}
76e0b6287cSTomasz Jozwiak 
77e0b6287cSTomasz Jozwiak 	return -1;
78e0b6287cSTomasz Jozwiak }
79e0b6287cSTomasz Jozwiak 
80e0b6287cSTomasz Jozwiak static int
811a9b0f35STomasz Jozwiak parse_cperf_test_type(struct comp_test_data *test_data, const char *arg)
821a9b0f35STomasz Jozwiak {
831a9b0f35STomasz Jozwiak 	struct name_id_map cperftest_namemap[] = {
841a9b0f35STomasz Jozwiak 		{
851a9b0f35STomasz Jozwiak 			cperf_test_type_strs[CPERF_TEST_TYPE_BENCHMARK],
861a9b0f35STomasz Jozwiak 			CPERF_TEST_TYPE_BENCHMARK
871a9b0f35STomasz Jozwiak 		},
881a9b0f35STomasz Jozwiak 		{
891a9b0f35STomasz Jozwiak 			cperf_test_type_strs[CPERF_TEST_TYPE_VERIFY],
901a9b0f35STomasz Jozwiak 			CPERF_TEST_TYPE_VERIFY
911a9b0f35STomasz Jozwiak 		}
921a9b0f35STomasz Jozwiak 	};
931a9b0f35STomasz Jozwiak 
941a9b0f35STomasz Jozwiak 	int id = get_str_key_id_mapping(
951a9b0f35STomasz Jozwiak 			(struct name_id_map *)cperftest_namemap,
961a9b0f35STomasz Jozwiak 			RTE_DIM(cperftest_namemap), arg);
971a9b0f35STomasz Jozwiak 	if (id < 0) {
981a9b0f35STomasz Jozwiak 		RTE_LOG(ERR, USER1, "failed to parse test type");
991a9b0f35STomasz Jozwiak 		return -1;
1001a9b0f35STomasz Jozwiak 	}
1011a9b0f35STomasz Jozwiak 
102*8c7a3131SArtur Trybula 	test_data->test = (enum cperf_test_type)id;
1031a9b0f35STomasz Jozwiak 
1041a9b0f35STomasz Jozwiak 	return 0;
1051a9b0f35STomasz Jozwiak }
1061a9b0f35STomasz Jozwiak 
1071a9b0f35STomasz Jozwiak static int
108e0b6287cSTomasz Jozwiak parse_uint32_t(uint32_t *value, const char *arg)
109e0b6287cSTomasz Jozwiak {
110e0b6287cSTomasz Jozwiak 	char *end = NULL;
111e0b6287cSTomasz Jozwiak 	unsigned long n = strtoul(arg, &end, 10);
112e0b6287cSTomasz Jozwiak 
113e0b6287cSTomasz Jozwiak 	if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
114e0b6287cSTomasz Jozwiak 		return -1;
115e0b6287cSTomasz Jozwiak 
116e0b6287cSTomasz Jozwiak 	if (n > UINT32_MAX)
117e0b6287cSTomasz Jozwiak 		return -ERANGE;
118e0b6287cSTomasz Jozwiak 
119e0b6287cSTomasz Jozwiak 	*value = (uint32_t) n;
120e0b6287cSTomasz Jozwiak 
121e0b6287cSTomasz Jozwiak 	return 0;
122e0b6287cSTomasz Jozwiak }
123e0b6287cSTomasz Jozwiak 
124e0b6287cSTomasz Jozwiak static int
125e0b6287cSTomasz Jozwiak parse_uint16_t(uint16_t *value, const char *arg)
126e0b6287cSTomasz Jozwiak {
127e0b6287cSTomasz Jozwiak 	uint32_t val = 0;
128e0b6287cSTomasz Jozwiak 	int ret = parse_uint32_t(&val, arg);
129e0b6287cSTomasz Jozwiak 
130e0b6287cSTomasz Jozwiak 	if (ret < 0)
131e0b6287cSTomasz Jozwiak 		return ret;
132e0b6287cSTomasz Jozwiak 
133e0b6287cSTomasz Jozwiak 	if (val > UINT16_MAX)
134e0b6287cSTomasz Jozwiak 		return -ERANGE;
135e0b6287cSTomasz Jozwiak 
136e0b6287cSTomasz Jozwiak 	*value = (uint16_t) val;
137e0b6287cSTomasz Jozwiak 
138e0b6287cSTomasz Jozwiak 	return 0;
139e0b6287cSTomasz Jozwiak }
140e0b6287cSTomasz Jozwiak 
141e0b6287cSTomasz Jozwiak static int
142e0b6287cSTomasz Jozwiak parse_range(const char *arg, uint8_t *min, uint8_t *max, uint8_t *inc)
143e0b6287cSTomasz Jozwiak {
144e0b6287cSTomasz Jozwiak 	char *token;
145e0b6287cSTomasz Jozwiak 	uint8_t number;
146e0b6287cSTomasz Jozwiak 
147e0b6287cSTomasz Jozwiak 	char *copy_arg = strdup(arg);
148e0b6287cSTomasz Jozwiak 
149e0b6287cSTomasz Jozwiak 	if (copy_arg == NULL)
150e0b6287cSTomasz Jozwiak 		return -1;
151e0b6287cSTomasz Jozwiak 
152e0b6287cSTomasz Jozwiak 	errno = 0;
153e0b6287cSTomasz Jozwiak 	token = strtok(copy_arg, ":");
154e0b6287cSTomasz Jozwiak 
155e0b6287cSTomasz Jozwiak 	/* Parse minimum value */
156e0b6287cSTomasz Jozwiak 	if (token != NULL) {
157e0b6287cSTomasz Jozwiak 		number = strtoul(token, NULL, 10);
158e0b6287cSTomasz Jozwiak 
159e0b6287cSTomasz Jozwiak 		if (errno == EINVAL || errno == ERANGE)
160e0b6287cSTomasz Jozwiak 			goto err_range;
161e0b6287cSTomasz Jozwiak 
162e0b6287cSTomasz Jozwiak 		*min = number;
163e0b6287cSTomasz Jozwiak 	} else
164e0b6287cSTomasz Jozwiak 		goto err_range;
165e0b6287cSTomasz Jozwiak 
166e0b6287cSTomasz Jozwiak 	token = strtok(NULL, ":");
167e0b6287cSTomasz Jozwiak 
168e0b6287cSTomasz Jozwiak 	/* Parse increment value */
169e0b6287cSTomasz Jozwiak 	if (token != NULL) {
170e0b6287cSTomasz Jozwiak 		number = strtoul(token, NULL, 10);
171e0b6287cSTomasz Jozwiak 
172e0b6287cSTomasz Jozwiak 		if (errno == EINVAL || errno == ERANGE ||
173e0b6287cSTomasz Jozwiak 				number == 0)
174e0b6287cSTomasz Jozwiak 			goto err_range;
175e0b6287cSTomasz Jozwiak 
176e0b6287cSTomasz Jozwiak 		*inc = number;
177e0b6287cSTomasz Jozwiak 	} else
178e0b6287cSTomasz Jozwiak 		goto err_range;
179e0b6287cSTomasz Jozwiak 
180e0b6287cSTomasz Jozwiak 	token = strtok(NULL, ":");
181e0b6287cSTomasz Jozwiak 
182e0b6287cSTomasz Jozwiak 	/* Parse maximum value */
183e0b6287cSTomasz Jozwiak 	if (token != NULL) {
184e0b6287cSTomasz Jozwiak 		number = strtoul(token, NULL, 10);
185e0b6287cSTomasz Jozwiak 
186e0b6287cSTomasz Jozwiak 		if (errno == EINVAL || errno == ERANGE ||
187e0b6287cSTomasz Jozwiak 				number < *min)
188e0b6287cSTomasz Jozwiak 			goto err_range;
189e0b6287cSTomasz Jozwiak 
190e0b6287cSTomasz Jozwiak 		*max = number;
191e0b6287cSTomasz Jozwiak 	} else
192e0b6287cSTomasz Jozwiak 		goto err_range;
193e0b6287cSTomasz Jozwiak 
194e0b6287cSTomasz Jozwiak 	if (strtok(NULL, ":") != NULL)
195e0b6287cSTomasz Jozwiak 		goto err_range;
196e0b6287cSTomasz Jozwiak 
197e0b6287cSTomasz Jozwiak 	free(copy_arg);
198e0b6287cSTomasz Jozwiak 	return 0;
199e0b6287cSTomasz Jozwiak 
200e0b6287cSTomasz Jozwiak err_range:
201e0b6287cSTomasz Jozwiak 	free(copy_arg);
202e0b6287cSTomasz Jozwiak 	return -1;
203e0b6287cSTomasz Jozwiak }
204e0b6287cSTomasz Jozwiak 
205e0b6287cSTomasz Jozwiak static int
206e0b6287cSTomasz Jozwiak parse_list(const char *arg, uint8_t *list, uint8_t *min, uint8_t *max)
207e0b6287cSTomasz Jozwiak {
208e0b6287cSTomasz Jozwiak 	char *token;
209e0b6287cSTomasz Jozwiak 	uint32_t number;
210e0b6287cSTomasz Jozwiak 	uint8_t count = 0;
211e0b6287cSTomasz Jozwiak 	uint32_t temp_min;
212e0b6287cSTomasz Jozwiak 	uint32_t temp_max;
213e0b6287cSTomasz Jozwiak 
214e0b6287cSTomasz Jozwiak 	char *copy_arg = strdup(arg);
215e0b6287cSTomasz Jozwiak 
216e0b6287cSTomasz Jozwiak 	if (copy_arg == NULL)
217e0b6287cSTomasz Jozwiak 		return -1;
218e0b6287cSTomasz Jozwiak 
219e0b6287cSTomasz Jozwiak 	errno = 0;
220e0b6287cSTomasz Jozwiak 	token = strtok(copy_arg, ",");
221e0b6287cSTomasz Jozwiak 
222e0b6287cSTomasz Jozwiak 	/* Parse first value */
223e0b6287cSTomasz Jozwiak 	if (token != NULL) {
224e0b6287cSTomasz Jozwiak 		number = strtoul(token, NULL, 10);
225e0b6287cSTomasz Jozwiak 
226e0b6287cSTomasz Jozwiak 		if (errno == EINVAL || errno == ERANGE)
227e0b6287cSTomasz Jozwiak 			goto err_list;
228e0b6287cSTomasz Jozwiak 
229e0b6287cSTomasz Jozwiak 		list[count++] = number;
230e0b6287cSTomasz Jozwiak 		temp_min = number;
231e0b6287cSTomasz Jozwiak 		temp_max = number;
232e0b6287cSTomasz Jozwiak 	} else
233e0b6287cSTomasz Jozwiak 		goto err_list;
234e0b6287cSTomasz Jozwiak 
235e0b6287cSTomasz Jozwiak 	token = strtok(NULL, ",");
236e0b6287cSTomasz Jozwiak 
237e0b6287cSTomasz Jozwiak 	while (token != NULL) {
238e0b6287cSTomasz Jozwiak 		if (count == MAX_LIST) {
239e0b6287cSTomasz Jozwiak 			RTE_LOG(WARNING, USER1,
240e0b6287cSTomasz Jozwiak 				"Using only the first %u sizes\n",
241e0b6287cSTomasz Jozwiak 					MAX_LIST);
242e0b6287cSTomasz Jozwiak 			break;
243e0b6287cSTomasz Jozwiak 		}
244e0b6287cSTomasz Jozwiak 
245e0b6287cSTomasz Jozwiak 		number = strtoul(token, NULL, 10);
246e0b6287cSTomasz Jozwiak 
247e0b6287cSTomasz Jozwiak 		if (errno == EINVAL || errno == ERANGE)
248e0b6287cSTomasz Jozwiak 			goto err_list;
249e0b6287cSTomasz Jozwiak 
250e0b6287cSTomasz Jozwiak 		list[count++] = number;
251e0b6287cSTomasz Jozwiak 
252e0b6287cSTomasz Jozwiak 		if (number < temp_min)
253e0b6287cSTomasz Jozwiak 			temp_min = number;
254e0b6287cSTomasz Jozwiak 		if (number > temp_max)
255e0b6287cSTomasz Jozwiak 			temp_max = number;
256e0b6287cSTomasz Jozwiak 
257e0b6287cSTomasz Jozwiak 		token = strtok(NULL, ",");
258e0b6287cSTomasz Jozwiak 	}
259e0b6287cSTomasz Jozwiak 
260e0b6287cSTomasz Jozwiak 	if (min)
261e0b6287cSTomasz Jozwiak 		*min = temp_min;
262e0b6287cSTomasz Jozwiak 	if (max)
263e0b6287cSTomasz Jozwiak 		*max = temp_max;
264e0b6287cSTomasz Jozwiak 
265e0b6287cSTomasz Jozwiak 	free(copy_arg);
266e0b6287cSTomasz Jozwiak 	return count;
267e0b6287cSTomasz Jozwiak 
268e0b6287cSTomasz Jozwiak err_list:
269e0b6287cSTomasz Jozwiak 	free(copy_arg);
270e0b6287cSTomasz Jozwiak 	return -1;
271e0b6287cSTomasz Jozwiak }
272e0b6287cSTomasz Jozwiak 
273e0b6287cSTomasz Jozwiak static int
274e0b6287cSTomasz Jozwiak parse_num_iter(struct comp_test_data *test_data, const char *arg)
275e0b6287cSTomasz Jozwiak {
276e0b6287cSTomasz Jozwiak 	int ret = parse_uint32_t(&test_data->num_iter, arg);
277e0b6287cSTomasz Jozwiak 
278e0b6287cSTomasz Jozwiak 	if (ret) {
279e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Failed to parse total iteration count\n");
280e0b6287cSTomasz Jozwiak 		return -1;
281e0b6287cSTomasz Jozwiak 	}
282e0b6287cSTomasz Jozwiak 
283e0b6287cSTomasz Jozwiak 	if (test_data->num_iter == 0) {
284e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1,
285e0b6287cSTomasz Jozwiak 				"Total number of iterations must be higher than 0\n");
286e0b6287cSTomasz Jozwiak 		return -1;
287e0b6287cSTomasz Jozwiak 	}
288e0b6287cSTomasz Jozwiak 
289e0b6287cSTomasz Jozwiak 	return ret;
290e0b6287cSTomasz Jozwiak }
291e0b6287cSTomasz Jozwiak 
292e0b6287cSTomasz Jozwiak static int
293e0b6287cSTomasz Jozwiak parse_pool_sz(struct comp_test_data *test_data, const char *arg)
294e0b6287cSTomasz Jozwiak {
295e0b6287cSTomasz Jozwiak 	int ret = parse_uint32_t(&test_data->pool_sz, arg);
296e0b6287cSTomasz Jozwiak 
297e0b6287cSTomasz Jozwiak 	if (ret) {
298e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Failed to parse pool size");
299e0b6287cSTomasz Jozwiak 		return -1;
300e0b6287cSTomasz Jozwiak 	}
301e0b6287cSTomasz Jozwiak 
302e0b6287cSTomasz Jozwiak 	if (test_data->pool_sz == 0) {
303e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Pool size must be higher than 0\n");
304e0b6287cSTomasz Jozwiak 		return -1;
305e0b6287cSTomasz Jozwiak 	}
306e0b6287cSTomasz Jozwiak 
307e0b6287cSTomasz Jozwiak 	return ret;
308e0b6287cSTomasz Jozwiak }
309e0b6287cSTomasz Jozwiak 
310e0b6287cSTomasz Jozwiak static int
311e0b6287cSTomasz Jozwiak parse_burst_sz(struct comp_test_data *test_data, const char *arg)
312e0b6287cSTomasz Jozwiak {
313e0b6287cSTomasz Jozwiak 	int ret = parse_uint16_t(&test_data->burst_sz, arg);
314e0b6287cSTomasz Jozwiak 
315e0b6287cSTomasz Jozwiak 	if (ret) {
316e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Failed to parse burst size/s\n");
317e0b6287cSTomasz Jozwiak 		return -1;
318e0b6287cSTomasz Jozwiak 	}
319e0b6287cSTomasz Jozwiak 
320e0b6287cSTomasz Jozwiak 	if (test_data->burst_sz == 0) {
321e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Burst size must be higher than 0\n");
322e0b6287cSTomasz Jozwiak 		return -1;
323e0b6287cSTomasz Jozwiak 	}
324e0b6287cSTomasz Jozwiak 
325e0b6287cSTomasz Jozwiak 	return 0;
326e0b6287cSTomasz Jozwiak }
327e0b6287cSTomasz Jozwiak 
328e0b6287cSTomasz Jozwiak static int
329e0b6287cSTomasz Jozwiak parse_extended_input_sz(struct comp_test_data *test_data, const char *arg)
330e0b6287cSTomasz Jozwiak {
331e0b6287cSTomasz Jozwiak 	uint32_t tmp;
332e0b6287cSTomasz Jozwiak 	int ret = parse_uint32_t(&tmp, arg);
333e0b6287cSTomasz Jozwiak 
334e0b6287cSTomasz Jozwiak 	if (ret) {
335e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Failed to parse extended input size\n");
336e0b6287cSTomasz Jozwiak 		return -1;
337e0b6287cSTomasz Jozwiak 	}
338e0b6287cSTomasz Jozwiak 	test_data->input_data_sz = tmp;
339e0b6287cSTomasz Jozwiak 
340e0b6287cSTomasz Jozwiak 	if (tmp == 0) {
341e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1,
342e0b6287cSTomasz Jozwiak 			"Extended file size must be higher than 0\n");
343e0b6287cSTomasz Jozwiak 		return -1;
344e0b6287cSTomasz Jozwiak 	}
345e0b6287cSTomasz Jozwiak 	return 0;
346e0b6287cSTomasz Jozwiak }
347e0b6287cSTomasz Jozwiak 
348e0b6287cSTomasz Jozwiak static int
349e0b6287cSTomasz Jozwiak parse_seg_sz(struct comp_test_data *test_data, const char *arg)
350e0b6287cSTomasz Jozwiak {
351e0b6287cSTomasz Jozwiak 	int ret = parse_uint16_t(&test_data->seg_sz, arg);
352e0b6287cSTomasz Jozwiak 
353e0b6287cSTomasz Jozwiak 	if (ret) {
354e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Failed to parse segment size\n");
355e0b6287cSTomasz Jozwiak 		return -1;
356e0b6287cSTomasz Jozwiak 	}
357e0b6287cSTomasz Jozwiak 
35827cee417STomasz Jozwiak 	if (test_data->seg_sz < MIN_COMPRESSED_BUF_SIZE) {
35927cee417STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Segment size must be higher than %d\n",
36027cee417STomasz Jozwiak 			MIN_COMPRESSED_BUF_SIZE - 1);
36127cee417STomasz Jozwiak 		return -1;
36227cee417STomasz Jozwiak 	}
36327cee417STomasz Jozwiak 
36427cee417STomasz Jozwiak 	if (test_data->seg_sz > MAX_SEG_SIZE) {
36527cee417STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Segment size must be lower than %d\n",
36627cee417STomasz Jozwiak 			MAX_SEG_SIZE + 1);
367e0b6287cSTomasz Jozwiak 		return -1;
368e0b6287cSTomasz Jozwiak 	}
369e0b6287cSTomasz Jozwiak 
370e0b6287cSTomasz Jozwiak 	return 0;
371e0b6287cSTomasz Jozwiak }
372e0b6287cSTomasz Jozwiak 
373e0b6287cSTomasz Jozwiak static int
374e0b6287cSTomasz Jozwiak parse_max_num_sgl_segs(struct comp_test_data *test_data, const char *arg)
375e0b6287cSTomasz Jozwiak {
376e0b6287cSTomasz Jozwiak 	int ret = parse_uint16_t(&test_data->max_sgl_segs, arg);
377e0b6287cSTomasz Jozwiak 
378e0b6287cSTomasz Jozwiak 	if (ret) {
379e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1,
380e0b6287cSTomasz Jozwiak 			"Failed to parse max number of segments per mbuf chain\n");
381e0b6287cSTomasz Jozwiak 		return -1;
382e0b6287cSTomasz Jozwiak 	}
383e0b6287cSTomasz Jozwiak 
384e0b6287cSTomasz Jozwiak 	if (test_data->max_sgl_segs == 0) {
385e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Max number of segments per mbuf chain "
386e0b6287cSTomasz Jozwiak 			"must be higher than 0\n");
387e0b6287cSTomasz Jozwiak 		return -1;
388e0b6287cSTomasz Jozwiak 	}
389e0b6287cSTomasz Jozwiak 
390e0b6287cSTomasz Jozwiak 	return 0;
391e0b6287cSTomasz Jozwiak }
392e0b6287cSTomasz Jozwiak 
393e0b6287cSTomasz Jozwiak static int
394e0b6287cSTomasz Jozwiak parse_window_sz(struct comp_test_data *test_data, const char *arg)
395e0b6287cSTomasz Jozwiak {
3961f04178dSArtur Trybula 	uint16_t tmp;
3971f04178dSArtur Trybula 	int ret = parse_uint16_t(&tmp, arg);
398e0b6287cSTomasz Jozwiak 
399e0b6287cSTomasz Jozwiak 	if (ret) {
400e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Failed to parse window size\n");
401e0b6287cSTomasz Jozwiak 		return -1;
402e0b6287cSTomasz Jozwiak 	}
4031f04178dSArtur Trybula 	test_data->window_sz = (int)tmp;
404e0b6287cSTomasz Jozwiak 
405e0b6287cSTomasz Jozwiak 	return 0;
406e0b6287cSTomasz Jozwiak }
407e0b6287cSTomasz Jozwiak 
408e0b6287cSTomasz Jozwiak static int
409e0b6287cSTomasz Jozwiak parse_driver_name(struct comp_test_data *test_data, const char *arg)
410e0b6287cSTomasz Jozwiak {
411e0b6287cSTomasz Jozwiak 	if (strlen(arg) > (sizeof(test_data->driver_name) - 1))
412e0b6287cSTomasz Jozwiak 		return -1;
413e0b6287cSTomasz Jozwiak 
4146e37913fSThomas Monjalon 	strlcpy(test_data->driver_name, arg,
415e0b6287cSTomasz Jozwiak 			sizeof(test_data->driver_name));
416e0b6287cSTomasz Jozwiak 
417e0b6287cSTomasz Jozwiak 	return 0;
418e0b6287cSTomasz Jozwiak }
419e0b6287cSTomasz Jozwiak 
420e0b6287cSTomasz Jozwiak static int
421e0b6287cSTomasz Jozwiak parse_test_file(struct comp_test_data *test_data, const char *arg)
422e0b6287cSTomasz Jozwiak {
423e0b6287cSTomasz Jozwiak 	if (strlen(arg) > (sizeof(test_data->input_file) - 1))
424e0b6287cSTomasz Jozwiak 		return -1;
425e0b6287cSTomasz Jozwiak 
4266e37913fSThomas Monjalon 	strlcpy(test_data->input_file, arg, sizeof(test_data->input_file));
427e0b6287cSTomasz Jozwiak 
428e0b6287cSTomasz Jozwiak 	return 0;
429e0b6287cSTomasz Jozwiak }
430e0b6287cSTomasz Jozwiak 
431e0b6287cSTomasz Jozwiak static int
432e0b6287cSTomasz Jozwiak parse_op_type(struct comp_test_data *test_data, const char *arg)
433e0b6287cSTomasz Jozwiak {
434e0b6287cSTomasz Jozwiak 	struct name_id_map optype_namemap[] = {
435e0b6287cSTomasz Jozwiak 		{
436e0b6287cSTomasz Jozwiak 			"comp",
437e0b6287cSTomasz Jozwiak 			COMPRESS_ONLY
438e0b6287cSTomasz Jozwiak 		},
439e0b6287cSTomasz Jozwiak 		{
440e0b6287cSTomasz Jozwiak 			"decomp",
441e0b6287cSTomasz Jozwiak 			DECOMPRESS_ONLY
442e0b6287cSTomasz Jozwiak 		},
443e0b6287cSTomasz Jozwiak 		{
444e0b6287cSTomasz Jozwiak 			"comp_and_decomp",
445e0b6287cSTomasz Jozwiak 			COMPRESS_DECOMPRESS
446e0b6287cSTomasz Jozwiak 		}
447e0b6287cSTomasz Jozwiak 	};
448e0b6287cSTomasz Jozwiak 
449e0b6287cSTomasz Jozwiak 	int id = get_str_key_id_mapping(optype_namemap,
450e0b6287cSTomasz Jozwiak 			RTE_DIM(optype_namemap), arg);
451e0b6287cSTomasz Jozwiak 	if (id < 0) {
452e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Invalid operation type specified\n");
453e0b6287cSTomasz Jozwiak 		return -1;
454e0b6287cSTomasz Jozwiak 	}
455e0b6287cSTomasz Jozwiak 
456e0b6287cSTomasz Jozwiak 	test_data->test_op = (enum comp_operation)id;
457e0b6287cSTomasz Jozwiak 
458e0b6287cSTomasz Jozwiak 	return 0;
459e0b6287cSTomasz Jozwiak }
460e0b6287cSTomasz Jozwiak 
461e0b6287cSTomasz Jozwiak static int
462e0b6287cSTomasz Jozwiak parse_huffman_enc(struct comp_test_data *test_data, const char *arg)
463e0b6287cSTomasz Jozwiak {
464e0b6287cSTomasz Jozwiak 	struct name_id_map huffman_namemap[] = {
465e0b6287cSTomasz Jozwiak 		{
466e0b6287cSTomasz Jozwiak 			"default",
467e0b6287cSTomasz Jozwiak 			RTE_COMP_HUFFMAN_DEFAULT
468e0b6287cSTomasz Jozwiak 		},
469e0b6287cSTomasz Jozwiak 		{
470e0b6287cSTomasz Jozwiak 			"fixed",
471e0b6287cSTomasz Jozwiak 			RTE_COMP_HUFFMAN_FIXED
472fedfef43STomasz Jozwiak 		},
473fedfef43STomasz Jozwiak 		{
474fedfef43STomasz Jozwiak 			"dynamic",
475fedfef43STomasz Jozwiak 			RTE_COMP_HUFFMAN_DYNAMIC
476e0b6287cSTomasz Jozwiak 		}
477e0b6287cSTomasz Jozwiak 	};
478e0b6287cSTomasz Jozwiak 
479e0b6287cSTomasz Jozwiak 	int id = get_str_key_id_mapping(huffman_namemap,
480e0b6287cSTomasz Jozwiak 			RTE_DIM(huffman_namemap), arg);
481e0b6287cSTomasz Jozwiak 	if (id < 0) {
482e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Invalid Huffmane encoding specified\n");
483e0b6287cSTomasz Jozwiak 		return -1;
484e0b6287cSTomasz Jozwiak 	}
485e0b6287cSTomasz Jozwiak 
486e0b6287cSTomasz Jozwiak 	test_data->huffman_enc = (enum rte_comp_huffman)id;
487e0b6287cSTomasz Jozwiak 
488e0b6287cSTomasz Jozwiak 	return 0;
489e0b6287cSTomasz Jozwiak }
490e0b6287cSTomasz Jozwiak 
491e0b6287cSTomasz Jozwiak static int
492e0b6287cSTomasz Jozwiak parse_level(struct comp_test_data *test_data, const char *arg)
493e0b6287cSTomasz Jozwiak {
494e0b6287cSTomasz Jozwiak 	int ret;
495e0b6287cSTomasz Jozwiak 
496e0b6287cSTomasz Jozwiak 	/*
497e0b6287cSTomasz Jozwiak 	 * Try parsing the argument as a range, if it fails,
498e0b6287cSTomasz Jozwiak 	 * arse it as a list
499e0b6287cSTomasz Jozwiak 	 */
500424dd6c8STomasz Jozwiak 	if (parse_range(arg, &test_data->level_lst.min,
501424dd6c8STomasz Jozwiak 			&test_data->level_lst.max,
502424dd6c8STomasz Jozwiak 			&test_data->level_lst.inc) < 0) {
503424dd6c8STomasz Jozwiak 		ret = parse_list(arg, test_data->level_lst.list,
504424dd6c8STomasz Jozwiak 					&test_data->level_lst.min,
505424dd6c8STomasz Jozwiak 					&test_data->level_lst.max);
506e0b6287cSTomasz Jozwiak 		if (ret < 0) {
507e0b6287cSTomasz Jozwiak 			RTE_LOG(ERR, USER1,
508e0b6287cSTomasz Jozwiak 				"Failed to parse compression level/s\n");
509e0b6287cSTomasz Jozwiak 			return -1;
510e0b6287cSTomasz Jozwiak 		}
511424dd6c8STomasz Jozwiak 		test_data->level_lst.count = ret;
512e0b6287cSTomasz Jozwiak 
513424dd6c8STomasz Jozwiak 		if (test_data->level_lst.max > RTE_COMP_LEVEL_MAX) {
514e0b6287cSTomasz Jozwiak 			RTE_LOG(ERR, USER1, "Level cannot be higher than %u\n",
515e0b6287cSTomasz Jozwiak 					RTE_COMP_LEVEL_MAX);
516e0b6287cSTomasz Jozwiak 			return -1;
517e0b6287cSTomasz Jozwiak 		}
518e0b6287cSTomasz Jozwiak 	}
519e0b6287cSTomasz Jozwiak 
520e0b6287cSTomasz Jozwiak 	return 0;
521e0b6287cSTomasz Jozwiak }
522e0b6287cSTomasz Jozwiak 
523e0b6287cSTomasz Jozwiak typedef int (*option_parser_t)(struct comp_test_data *test_data,
524e0b6287cSTomasz Jozwiak 		const char *arg);
525e0b6287cSTomasz Jozwiak 
526e0b6287cSTomasz Jozwiak struct long_opt_parser {
527e0b6287cSTomasz Jozwiak 	const char *lgopt_name;
528e0b6287cSTomasz Jozwiak 	option_parser_t parser_fn;
529e0b6287cSTomasz Jozwiak 
530e0b6287cSTomasz Jozwiak };
531e0b6287cSTomasz Jozwiak 
532e0b6287cSTomasz Jozwiak static struct option lgopts[] = {
5331a9b0f35STomasz Jozwiak 
5341a9b0f35STomasz Jozwiak 	{ CPERF_PTEST_TYPE, required_argument, 0, 0 },
535e0b6287cSTomasz Jozwiak 	{ CPERF_DRIVER_NAME, required_argument, 0, 0 },
536e0b6287cSTomasz Jozwiak 	{ CPERF_TEST_FILE, required_argument, 0, 0 },
537e0b6287cSTomasz Jozwiak 	{ CPERF_SEG_SIZE, required_argument, 0, 0 },
538e0b6287cSTomasz Jozwiak 	{ CPERF_BURST_SIZE, required_argument, 0, 0 },
539e0b6287cSTomasz Jozwiak 	{ CPERF_EXTENDED_SIZE, required_argument, 0, 0 },
540e0b6287cSTomasz Jozwiak 	{ CPERF_POOL_SIZE, required_argument, 0, 0 },
541e0b6287cSTomasz Jozwiak 	{ CPERF_MAX_SGL_SEGS, required_argument, 0, 0},
542e0b6287cSTomasz Jozwiak 	{ CPERF_NUM_ITER, required_argument, 0, 0 },
543e0b6287cSTomasz Jozwiak 	{ CPERF_OPTYPE,	required_argument, 0, 0 },
544e0b6287cSTomasz Jozwiak 	{ CPERF_HUFFMAN_ENC, required_argument, 0, 0 },
545e0b6287cSTomasz Jozwiak 	{ CPERF_LEVEL, required_argument, 0, 0 },
546e0b6287cSTomasz Jozwiak 	{ CPERF_WINDOW_SIZE, required_argument, 0, 0 },
547e0b6287cSTomasz Jozwiak 	{ NULL, 0, 0, 0 }
548e0b6287cSTomasz Jozwiak };
549e0b6287cSTomasz Jozwiak static int
550e0b6287cSTomasz Jozwiak comp_perf_opts_parse_long(int opt_idx, struct comp_test_data *test_data)
551e0b6287cSTomasz Jozwiak {
552e0b6287cSTomasz Jozwiak 	struct long_opt_parser parsermap[] = {
5531a9b0f35STomasz Jozwiak 		{ CPERF_PTEST_TYPE,	parse_cperf_test_type },
554e0b6287cSTomasz Jozwiak 		{ CPERF_DRIVER_NAME,	parse_driver_name },
555e0b6287cSTomasz Jozwiak 		{ CPERF_TEST_FILE,	parse_test_file },
556e0b6287cSTomasz Jozwiak 		{ CPERF_SEG_SIZE,	parse_seg_sz },
557e0b6287cSTomasz Jozwiak 		{ CPERF_BURST_SIZE,	parse_burst_sz },
558e0b6287cSTomasz Jozwiak 		{ CPERF_EXTENDED_SIZE,	parse_extended_input_sz },
559e0b6287cSTomasz Jozwiak 		{ CPERF_POOL_SIZE,	parse_pool_sz },
560e0b6287cSTomasz Jozwiak 		{ CPERF_MAX_SGL_SEGS,	parse_max_num_sgl_segs },
561e0b6287cSTomasz Jozwiak 		{ CPERF_NUM_ITER,	parse_num_iter },
562e0b6287cSTomasz Jozwiak 		{ CPERF_OPTYPE,		parse_op_type },
563e0b6287cSTomasz Jozwiak 		{ CPERF_HUFFMAN_ENC,	parse_huffman_enc },
564e0b6287cSTomasz Jozwiak 		{ CPERF_LEVEL,		parse_level },
565e0b6287cSTomasz Jozwiak 		{ CPERF_WINDOW_SIZE,	parse_window_sz },
566e0b6287cSTomasz Jozwiak 	};
567e0b6287cSTomasz Jozwiak 	unsigned int i;
568e0b6287cSTomasz Jozwiak 
569e0b6287cSTomasz Jozwiak 	for (i = 0; i < RTE_DIM(parsermap); i++) {
570e0b6287cSTomasz Jozwiak 		if (strncmp(lgopts[opt_idx].name, parsermap[i].lgopt_name,
571e0b6287cSTomasz Jozwiak 				strlen(lgopts[opt_idx].name)) == 0)
572e0b6287cSTomasz Jozwiak 			return parsermap[i].parser_fn(test_data, optarg);
573e0b6287cSTomasz Jozwiak 	}
574e0b6287cSTomasz Jozwiak 
575e0b6287cSTomasz Jozwiak 	return -EINVAL;
576e0b6287cSTomasz Jozwiak }
577e0b6287cSTomasz Jozwiak 
578e0b6287cSTomasz Jozwiak int
579e0b6287cSTomasz Jozwiak comp_perf_options_parse(struct comp_test_data *test_data, int argc, char **argv)
580e0b6287cSTomasz Jozwiak {
581e0b6287cSTomasz Jozwiak 	int opt, retval, opt_idx;
582e0b6287cSTomasz Jozwiak 
583e0b6287cSTomasz Jozwiak 	while ((opt = getopt_long(argc, argv, "h", lgopts, &opt_idx)) != EOF) {
584e0b6287cSTomasz Jozwiak 		switch (opt) {
585e0b6287cSTomasz Jozwiak 		case 'h':
586e0b6287cSTomasz Jozwiak 			usage(argv[0]);
587e0b6287cSTomasz Jozwiak 			rte_exit(EXIT_SUCCESS, "Displayed help\n");
588e0b6287cSTomasz Jozwiak 			break;
589e0b6287cSTomasz Jozwiak 		/* long options */
590e0b6287cSTomasz Jozwiak 		case 0:
591e0b6287cSTomasz Jozwiak 			retval = comp_perf_opts_parse_long(opt_idx, test_data);
592e0b6287cSTomasz Jozwiak 			if (retval != 0)
593e0b6287cSTomasz Jozwiak 				return retval;
594e0b6287cSTomasz Jozwiak 
595e0b6287cSTomasz Jozwiak 			break;
596e0b6287cSTomasz Jozwiak 
597e0b6287cSTomasz Jozwiak 		default:
598e0b6287cSTomasz Jozwiak 			usage(argv[0]);
599e0b6287cSTomasz Jozwiak 			return -EINVAL;
600e0b6287cSTomasz Jozwiak 		}
601e0b6287cSTomasz Jozwiak 	}
602e0b6287cSTomasz Jozwiak 
603e0b6287cSTomasz Jozwiak 	return 0;
604e0b6287cSTomasz Jozwiak }
605e0b6287cSTomasz Jozwiak 
606e0b6287cSTomasz Jozwiak void
607e0b6287cSTomasz Jozwiak comp_perf_options_default(struct comp_test_data *test_data)
608e0b6287cSTomasz Jozwiak {
609e0b6287cSTomasz Jozwiak 	test_data->seg_sz = 2048;
610e0b6287cSTomasz Jozwiak 	test_data->burst_sz = 32;
611e0b6287cSTomasz Jozwiak 	test_data->pool_sz = 8192;
612b68a8242STomasz Jozwiak 	test_data->max_sgl_segs = 16;
613e0b6287cSTomasz Jozwiak 	test_data->num_iter = 10000;
614fedfef43STomasz Jozwiak 	test_data->huffman_enc = RTE_COMP_HUFFMAN_DYNAMIC;
615e0b6287cSTomasz Jozwiak 	test_data->test_op = COMPRESS_DECOMPRESS;
616e0b6287cSTomasz Jozwiak 	test_data->window_sz = -1;
617*8c7a3131SArtur Trybula 	test_data->level_lst.min = RTE_COMP_LEVEL_MIN;
618*8c7a3131SArtur Trybula 	test_data->level_lst.max = RTE_COMP_LEVEL_MAX;
619424dd6c8STomasz Jozwiak 	test_data->level_lst.inc = 1;
620424dd6c8STomasz Jozwiak 	test_data->test = CPERF_TEST_TYPE_BENCHMARK;
621e0b6287cSTomasz Jozwiak }
622e0b6287cSTomasz Jozwiak 
623e0b6287cSTomasz Jozwiak int
624e0b6287cSTomasz Jozwiak comp_perf_options_check(struct comp_test_data *test_data)
625e0b6287cSTomasz Jozwiak {
626e0b6287cSTomasz Jozwiak 	if (test_data->driver_name[0] == '\0') {
627e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Driver name has to be set\n");
628e0b6287cSTomasz Jozwiak 		return -1;
629e0b6287cSTomasz Jozwiak 	}
630e0b6287cSTomasz Jozwiak 
631e0b6287cSTomasz Jozwiak 	if (test_data->input_file[0] == '\0') {
632e0b6287cSTomasz Jozwiak 		RTE_LOG(ERR, USER1, "Input file name has to be set\n");
633e0b6287cSTomasz Jozwiak 		return -1;
634e0b6287cSTomasz Jozwiak 	}
635e0b6287cSTomasz Jozwiak 
636e0b6287cSTomasz Jozwiak 	return 0;
637e0b6287cSTomasz Jozwiak }
638