1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
29df7ffd1STomasz Jozwiak * Copyright(c) 2018 - 2019 Intel Corporation
3a9de470cSBruce Richardson */
4a9de470cSBruce Richardson #include <string.h>
5a9de470cSBruce Richardson #include <zlib.h>
6a9de470cSBruce Richardson #include <math.h>
79df7ffd1STomasz Jozwiak #include <stdlib.h>
8890028e2SBruce Richardson #include <unistd.h>
9db06104cSAdam Dybkowski #include <stdio.h>
10a9de470cSBruce Richardson
11a9de470cSBruce Richardson #include <rte_cycles.h>
12a9de470cSBruce Richardson #include <rte_malloc.h>
13a9de470cSBruce Richardson #include <rte_mempool.h>
14a9de470cSBruce Richardson #include <rte_mbuf.h>
15a9de470cSBruce Richardson #include <rte_compressdev.h>
16a9de470cSBruce Richardson #include <rte_string_fns.h>
17a9de470cSBruce Richardson
18a9de470cSBruce Richardson #include "test_compressdev_test_buffer.h"
19a9de470cSBruce Richardson #include "test.h"
20a9de470cSBruce Richardson
21a9de470cSBruce Richardson #define DIV_CEIL(a, b) ((a) / (b) + ((a) % (b) != 0))
22a9de470cSBruce Richardson
23a9de470cSBruce Richardson #define DEFAULT_WINDOW_SIZE 15
24a9de470cSBruce Richardson #define DEFAULT_MEM_LEVEL 8
25a9de470cSBruce Richardson #define MAX_DEQD_RETRIES 10
26a9de470cSBruce Richardson #define DEQUEUE_WAIT_TIME 10000
27a9de470cSBruce Richardson
28a9de470cSBruce Richardson /*
29a9de470cSBruce Richardson * 30% extra size for compressed data compared to original data,
30a9de470cSBruce Richardson * in case data size cannot be reduced and it is actually bigger
31a9de470cSBruce Richardson * due to the compress block headers
32a9de470cSBruce Richardson */
33a9de470cSBruce Richardson #define COMPRESS_BUF_SIZE_RATIO 1.3
34db06104cSAdam Dybkowski #define COMPRESS_BUF_SIZE_RATIO_DISABLED 1.0
352437fbbcSArtur Trybula #define COMPRESS_BUF_SIZE_RATIO_OVERFLOW 0.2
36a9de470cSBruce Richardson #define NUM_LARGE_MBUFS 16
37a9de470cSBruce Richardson #define SMALL_SEG_SIZE 256
38a9de470cSBruce Richardson #define MAX_SEGS 16
39a9de470cSBruce Richardson #define NUM_OPS 16
40a9de470cSBruce Richardson #define NUM_MAX_XFORMS 16
41a9de470cSBruce Richardson #define NUM_MAX_INFLIGHT_OPS 128
42a9de470cSBruce Richardson #define CACHE_SIZE 0
43a9de470cSBruce Richardson
44a9de470cSBruce Richardson #define ZLIB_CRC_CHECKSUM_WINDOW_BITS 31
45a9de470cSBruce Richardson #define ZLIB_HEADER_SIZE 2
46a9de470cSBruce Richardson #define ZLIB_TRAILER_SIZE 4
47a9de470cSBruce Richardson #define GZIP_HEADER_SIZE 10
48a9de470cSBruce Richardson #define GZIP_TRAILER_SIZE 8
49a9de470cSBruce Richardson
50a9de470cSBruce Richardson #define OUT_OF_SPACE_BUF 1
51a9de470cSBruce Richardson
529df7ffd1STomasz Jozwiak #define MAX_MBUF_SEGMENT_SIZE 65535
539df7ffd1STomasz Jozwiak #define MAX_DATA_MBUF_SIZE (MAX_MBUF_SEGMENT_SIZE - RTE_PKTMBUF_HEADROOM)
54db06104cSAdam Dybkowski #define NUM_BIG_MBUFS (512 + 1)
55db06104cSAdam Dybkowski #define BIG_DATA_TEST_SIZE (MAX_DATA_MBUF_SIZE * 2)
56db06104cSAdam Dybkowski
57db06104cSAdam Dybkowski /* constants for "im buffer" tests start here */
58db06104cSAdam Dybkowski
59db06104cSAdam Dybkowski /* number of mbufs lower than number of inflight ops */
60db06104cSAdam Dybkowski #define IM_BUF_NUM_MBUFS 3
61db06104cSAdam Dybkowski /* above threshold (QAT_FALLBACK_THLD) and below max mbuf size */
62db06104cSAdam Dybkowski #define IM_BUF_DATA_TEST_SIZE_LB 59600
63db06104cSAdam Dybkowski /* data size smaller than the queue capacity */
64db06104cSAdam Dybkowski #define IM_BUF_DATA_TEST_SIZE_SGL (MAX_DATA_MBUF_SIZE * IM_BUF_NUM_MBUFS)
65db06104cSAdam Dybkowski /* number of mbufs bigger than number of inflight ops */
66db06104cSAdam Dybkowski #define IM_BUF_NUM_MBUFS_OVER (NUM_MAX_INFLIGHT_OPS + 1)
67db06104cSAdam Dybkowski /* data size bigger than the queue capacity */
68db06104cSAdam Dybkowski #define IM_BUF_DATA_TEST_SIZE_OVER (MAX_DATA_MBUF_SIZE * IM_BUF_NUM_MBUFS_OVER)
69db06104cSAdam Dybkowski /* number of mid-size mbufs */
70db06104cSAdam Dybkowski #define IM_BUF_NUM_MBUFS_MID ((NUM_MAX_INFLIGHT_OPS / 3) + 1)
71db06104cSAdam Dybkowski /* capacity of mid-size mbufs */
72db06104cSAdam Dybkowski #define IM_BUF_DATA_TEST_SIZE_MID (MAX_DATA_MBUF_SIZE * IM_BUF_NUM_MBUFS_MID)
73db06104cSAdam Dybkowski
749df7ffd1STomasz Jozwiak
75a9de470cSBruce Richardson const char *
76a9de470cSBruce Richardson huffman_type_strings[] = {
77a9de470cSBruce Richardson [RTE_COMP_HUFFMAN_DEFAULT] = "PMD default",
78a9de470cSBruce Richardson [RTE_COMP_HUFFMAN_FIXED] = "Fixed",
79a9de470cSBruce Richardson [RTE_COMP_HUFFMAN_DYNAMIC] = "Dynamic"
80a9de470cSBruce Richardson };
81a9de470cSBruce Richardson
82a9de470cSBruce Richardson enum zlib_direction {
83a9de470cSBruce Richardson ZLIB_NONE,
84a9de470cSBruce Richardson ZLIB_COMPRESS,
85a9de470cSBruce Richardson ZLIB_DECOMPRESS,
86a9de470cSBruce Richardson ZLIB_ALL
87a9de470cSBruce Richardson };
88a9de470cSBruce Richardson
89a9de470cSBruce Richardson enum varied_buff {
90a9de470cSBruce Richardson LB_BOTH = 0, /* both input and output are linear*/
91a9de470cSBruce Richardson SGL_BOTH, /* both input and output are chained */
92a9de470cSBruce Richardson SGL_TO_LB, /* input buffer is chained */
93a9de470cSBruce Richardson LB_TO_SGL /* output buffer is chained */
94a9de470cSBruce Richardson };
95a9de470cSBruce Richardson
962437fbbcSArtur Trybula enum overflow_test {
972437fbbcSArtur Trybula OVERFLOW_DISABLED,
982437fbbcSArtur Trybula OVERFLOW_ENABLED
992437fbbcSArtur Trybula };
1002437fbbcSArtur Trybula
101db06104cSAdam Dybkowski enum ratio_switch {
102db06104cSAdam Dybkowski RATIO_DISABLED,
103db06104cSAdam Dybkowski RATIO_ENABLED
104db06104cSAdam Dybkowski };
105db06104cSAdam Dybkowski
1066bbc5a92SArtur Trybula enum operation_type {
1076bbc5a92SArtur Trybula OPERATION_COMPRESSION,
1086bbc5a92SArtur Trybula OPERATION_DECOMPRESSION
1096bbc5a92SArtur Trybula };
1106bbc5a92SArtur Trybula
111a9de470cSBruce Richardson struct priv_op_data {
112a9de470cSBruce Richardson uint16_t orig_idx;
113a9de470cSBruce Richardson };
114a9de470cSBruce Richardson
115a9de470cSBruce Richardson struct comp_testsuite_params {
116a9de470cSBruce Richardson struct rte_mempool *large_mbuf_pool;
117a9de470cSBruce Richardson struct rte_mempool *small_mbuf_pool;
1189df7ffd1STomasz Jozwiak struct rte_mempool *big_mbuf_pool;
119a9de470cSBruce Richardson struct rte_mempool *op_pool;
120a9de470cSBruce Richardson struct rte_comp_xform *def_comp_xform;
121a9de470cSBruce Richardson struct rte_comp_xform *def_decomp_xform;
122a9de470cSBruce Richardson };
123a9de470cSBruce Richardson
124a9de470cSBruce Richardson struct interim_data_params {
125a9de470cSBruce Richardson const char * const *test_bufs;
126a9de470cSBruce Richardson unsigned int num_bufs;
127a9de470cSBruce Richardson uint16_t *buf_idx;
128a9de470cSBruce Richardson struct rte_comp_xform **compress_xforms;
129a9de470cSBruce Richardson struct rte_comp_xform **decompress_xforms;
130a9de470cSBruce Richardson unsigned int num_xforms;
131a9de470cSBruce Richardson };
132a9de470cSBruce Richardson
133a9de470cSBruce Richardson struct test_data_params {
13407b810c5SAdam Dybkowski enum rte_comp_op_type compress_state;
13507b810c5SAdam Dybkowski enum rte_comp_op_type decompress_state;
136a9de470cSBruce Richardson enum varied_buff buff_type;
137a9de470cSBruce Richardson enum zlib_direction zlib_dir;
138a9de470cSBruce Richardson unsigned int out_of_space;
1399df7ffd1STomasz Jozwiak unsigned int big_data;
14007b810c5SAdam Dybkowski /* stateful decompression specific parameters */
14107b810c5SAdam Dybkowski unsigned int decompress_output_block_size;
14207b810c5SAdam Dybkowski unsigned int decompress_steps_max;
1433fc3996fSAdam Dybkowski /* external mbufs specific parameters */
1443fc3996fSAdam Dybkowski unsigned int use_external_mbufs;
1453fc3996fSAdam Dybkowski unsigned int inbuf_data_size;
1463fc3996fSAdam Dybkowski const struct rte_memzone *inbuf_memzone;
1473fc3996fSAdam Dybkowski const struct rte_memzone *compbuf_memzone;
1483fc3996fSAdam Dybkowski const struct rte_memzone *uncompbuf_memzone;
1492437fbbcSArtur Trybula /* overflow test activation */
1502437fbbcSArtur Trybula enum overflow_test overflow;
151db06104cSAdam Dybkowski enum ratio_switch ratio;
152a9de470cSBruce Richardson };
153a9de470cSBruce Richardson
1546bbc5a92SArtur Trybula struct test_private_arrays {
1556bbc5a92SArtur Trybula struct rte_mbuf **uncomp_bufs;
1566bbc5a92SArtur Trybula struct rte_mbuf **comp_bufs;
1576bbc5a92SArtur Trybula struct rte_comp_op **ops;
1586bbc5a92SArtur Trybula struct rte_comp_op **ops_processed;
1596bbc5a92SArtur Trybula void **priv_xforms;
1606bbc5a92SArtur Trybula uint64_t *compress_checksum;
1616bbc5a92SArtur Trybula uint32_t *compressed_data_size;
1626bbc5a92SArtur Trybula void **stream;
1636bbc5a92SArtur Trybula char **all_decomp_data;
1646bbc5a92SArtur Trybula unsigned int *decomp_produced_data_size;
1656bbc5a92SArtur Trybula uint16_t num_priv_xforms;
1666bbc5a92SArtur Trybula };
1676bbc5a92SArtur Trybula
168a9de470cSBruce Richardson static struct comp_testsuite_params testsuite_params = { 0 };
169a9de470cSBruce Richardson
170db06104cSAdam Dybkowski
171a9de470cSBruce Richardson static void
testsuite_teardown(void)172a9de470cSBruce Richardson testsuite_teardown(void)
173a9de470cSBruce Richardson {
174a9de470cSBruce Richardson struct comp_testsuite_params *ts_params = &testsuite_params;
175a9de470cSBruce Richardson
176a9de470cSBruce Richardson if (rte_mempool_in_use_count(ts_params->large_mbuf_pool))
177a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Large mbuf pool still has unfreed bufs\n");
178a9de470cSBruce Richardson if (rte_mempool_in_use_count(ts_params->small_mbuf_pool))
179a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Small mbuf pool still has unfreed bufs\n");
1809df7ffd1STomasz Jozwiak if (rte_mempool_in_use_count(ts_params->big_mbuf_pool))
1819df7ffd1STomasz Jozwiak RTE_LOG(ERR, USER1, "Big mbuf pool still has unfreed bufs\n");
182a9de470cSBruce Richardson if (rte_mempool_in_use_count(ts_params->op_pool))
183a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "op pool still has unfreed ops\n");
184a9de470cSBruce Richardson
185a9de470cSBruce Richardson rte_mempool_free(ts_params->large_mbuf_pool);
186a9de470cSBruce Richardson rte_mempool_free(ts_params->small_mbuf_pool);
1879df7ffd1STomasz Jozwiak rte_mempool_free(ts_params->big_mbuf_pool);
188a9de470cSBruce Richardson rte_mempool_free(ts_params->op_pool);
189a9de470cSBruce Richardson rte_free(ts_params->def_comp_xform);
190a9de470cSBruce Richardson rte_free(ts_params->def_decomp_xform);
191a9de470cSBruce Richardson }
192a9de470cSBruce Richardson
193a9de470cSBruce Richardson static int
testsuite_setup(void)194a9de470cSBruce Richardson testsuite_setup(void)
195a9de470cSBruce Richardson {
196a9de470cSBruce Richardson struct comp_testsuite_params *ts_params = &testsuite_params;
197a9de470cSBruce Richardson uint32_t max_buf_size = 0;
198a9de470cSBruce Richardson unsigned int i;
199a9de470cSBruce Richardson
200a9de470cSBruce Richardson if (rte_compressdev_count() == 0) {
201e0f4a0edSDavid Marchand RTE_LOG(WARNING, USER1, "Need at least one compress device\n");
202e0f4a0edSDavid Marchand return TEST_SKIPPED;
203a9de470cSBruce Richardson }
204a9de470cSBruce Richardson
205a9de470cSBruce Richardson RTE_LOG(NOTICE, USER1, "Running tests on device %s\n",
206a9de470cSBruce Richardson rte_compressdev_name_get(0));
207a9de470cSBruce Richardson
208a9de470cSBruce Richardson for (i = 0; i < RTE_DIM(compress_test_bufs); i++)
209a9de470cSBruce Richardson max_buf_size = RTE_MAX(max_buf_size,
210a9de470cSBruce Richardson strlen(compress_test_bufs[i]) + 1);
211a9de470cSBruce Richardson
212a9de470cSBruce Richardson /*
213a9de470cSBruce Richardson * Buffers to be used in compression and decompression.
214a9de470cSBruce Richardson * Since decompressed data might be larger than
215a9de470cSBruce Richardson * compressed data (due to block header),
216a9de470cSBruce Richardson * buffers should be big enough for both cases.
217a9de470cSBruce Richardson */
218a9de470cSBruce Richardson max_buf_size *= COMPRESS_BUF_SIZE_RATIO;
219a9de470cSBruce Richardson ts_params->large_mbuf_pool = rte_pktmbuf_pool_create("large_mbuf_pool",
220a9de470cSBruce Richardson NUM_LARGE_MBUFS,
221a9de470cSBruce Richardson CACHE_SIZE, 0,
222a9de470cSBruce Richardson max_buf_size + RTE_PKTMBUF_HEADROOM,
223a9de470cSBruce Richardson rte_socket_id());
224a9de470cSBruce Richardson if (ts_params->large_mbuf_pool == NULL) {
225a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Large mbuf pool could not be created\n");
226a9de470cSBruce Richardson return TEST_FAILED;
227a9de470cSBruce Richardson }
228a9de470cSBruce Richardson
229a9de470cSBruce Richardson /* Create mempool with smaller buffers for SGL testing */
230a9de470cSBruce Richardson ts_params->small_mbuf_pool = rte_pktmbuf_pool_create("small_mbuf_pool",
231a9de470cSBruce Richardson NUM_LARGE_MBUFS * MAX_SEGS,
232a9de470cSBruce Richardson CACHE_SIZE, 0,
233a9de470cSBruce Richardson SMALL_SEG_SIZE + RTE_PKTMBUF_HEADROOM,
234a9de470cSBruce Richardson rte_socket_id());
235a9de470cSBruce Richardson if (ts_params->small_mbuf_pool == NULL) {
236a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Small mbuf pool could not be created\n");
237a9de470cSBruce Richardson goto exit;
238a9de470cSBruce Richardson }
239a9de470cSBruce Richardson
2409df7ffd1STomasz Jozwiak /* Create mempool with big buffers for SGL testing */
2419df7ffd1STomasz Jozwiak ts_params->big_mbuf_pool = rte_pktmbuf_pool_create("big_mbuf_pool",
2429df7ffd1STomasz Jozwiak NUM_BIG_MBUFS + 1,
2439df7ffd1STomasz Jozwiak CACHE_SIZE, 0,
2449df7ffd1STomasz Jozwiak MAX_MBUF_SEGMENT_SIZE,
2459df7ffd1STomasz Jozwiak rte_socket_id());
2469df7ffd1STomasz Jozwiak if (ts_params->big_mbuf_pool == NULL) {
2479df7ffd1STomasz Jozwiak RTE_LOG(ERR, USER1, "Big mbuf pool could not be created\n");
2489df7ffd1STomasz Jozwiak goto exit;
2499df7ffd1STomasz Jozwiak }
2509df7ffd1STomasz Jozwiak
251a9de470cSBruce Richardson ts_params->op_pool = rte_comp_op_pool_create("op_pool", NUM_OPS,
252a9de470cSBruce Richardson 0, sizeof(struct priv_op_data),
253a9de470cSBruce Richardson rte_socket_id());
254a9de470cSBruce Richardson if (ts_params->op_pool == NULL) {
255a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Operation pool could not be created\n");
256a9de470cSBruce Richardson goto exit;
257a9de470cSBruce Richardson }
258a9de470cSBruce Richardson
259a9de470cSBruce Richardson ts_params->def_comp_xform =
260a9de470cSBruce Richardson rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
261a9de470cSBruce Richardson if (ts_params->def_comp_xform == NULL) {
262a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
263a9de470cSBruce Richardson "Default compress xform could not be created\n");
264a9de470cSBruce Richardson goto exit;
265a9de470cSBruce Richardson }
266a9de470cSBruce Richardson ts_params->def_decomp_xform =
267a9de470cSBruce Richardson rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
268a9de470cSBruce Richardson if (ts_params->def_decomp_xform == NULL) {
269a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
270a9de470cSBruce Richardson "Default decompress xform could not be created\n");
271a9de470cSBruce Richardson goto exit;
272a9de470cSBruce Richardson }
273a9de470cSBruce Richardson
274a9de470cSBruce Richardson /* Initializes default values for compress/decompress xforms */
275a9de470cSBruce Richardson ts_params->def_comp_xform->type = RTE_COMP_COMPRESS;
276a9de470cSBruce Richardson ts_params->def_comp_xform->compress.algo = RTE_COMP_ALGO_DEFLATE,
277a9de470cSBruce Richardson ts_params->def_comp_xform->compress.deflate.huffman =
278a9de470cSBruce Richardson RTE_COMP_HUFFMAN_DEFAULT;
279a9de470cSBruce Richardson ts_params->def_comp_xform->compress.level = RTE_COMP_LEVEL_PMD_DEFAULT;
280a9de470cSBruce Richardson ts_params->def_comp_xform->compress.chksum = RTE_COMP_CHECKSUM_NONE;
281a9de470cSBruce Richardson ts_params->def_comp_xform->compress.window_size = DEFAULT_WINDOW_SIZE;
282a9de470cSBruce Richardson
283a9de470cSBruce Richardson ts_params->def_decomp_xform->type = RTE_COMP_DECOMPRESS;
284a9de470cSBruce Richardson ts_params->def_decomp_xform->decompress.algo = RTE_COMP_ALGO_DEFLATE,
285a9de470cSBruce Richardson ts_params->def_decomp_xform->decompress.chksum = RTE_COMP_CHECKSUM_NONE;
286a9de470cSBruce Richardson ts_params->def_decomp_xform->decompress.window_size = DEFAULT_WINDOW_SIZE;
287a9de470cSBruce Richardson
288a9de470cSBruce Richardson return TEST_SUCCESS;
289a9de470cSBruce Richardson
290a9de470cSBruce Richardson exit:
291a9de470cSBruce Richardson testsuite_teardown();
292a9de470cSBruce Richardson
293a9de470cSBruce Richardson return TEST_FAILED;
294a9de470cSBruce Richardson }
295a9de470cSBruce Richardson
296a9de470cSBruce Richardson static int
generic_ut_setup(void)297a9de470cSBruce Richardson generic_ut_setup(void)
298a9de470cSBruce Richardson {
299a9de470cSBruce Richardson /* Configure compressdev (one device, one queue pair) */
300a9de470cSBruce Richardson struct rte_compressdev_config config = {
301a9de470cSBruce Richardson .socket_id = rte_socket_id(),
302a9de470cSBruce Richardson .nb_queue_pairs = 1,
303a9de470cSBruce Richardson .max_nb_priv_xforms = NUM_MAX_XFORMS,
30407b810c5SAdam Dybkowski .max_nb_streams = 1
305a9de470cSBruce Richardson };
306a9de470cSBruce Richardson
307a9de470cSBruce Richardson if (rte_compressdev_configure(0, &config) < 0) {
308a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Device configuration failed\n");
309a9de470cSBruce Richardson return -1;
310a9de470cSBruce Richardson }
311a9de470cSBruce Richardson
312a9de470cSBruce Richardson if (rte_compressdev_queue_pair_setup(0, 0, NUM_MAX_INFLIGHT_OPS,
313a9de470cSBruce Richardson rte_socket_id()) < 0) {
314a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Queue pair setup failed\n");
315a9de470cSBruce Richardson return -1;
316a9de470cSBruce Richardson }
317a9de470cSBruce Richardson
318a9de470cSBruce Richardson if (rte_compressdev_start(0) < 0) {
319a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Device could not be started\n");
320a9de470cSBruce Richardson return -1;
321a9de470cSBruce Richardson }
322a9de470cSBruce Richardson
323a9de470cSBruce Richardson return 0;
324a9de470cSBruce Richardson }
325a9de470cSBruce Richardson
326a9de470cSBruce Richardson static void
generic_ut_teardown(void)327a9de470cSBruce Richardson generic_ut_teardown(void)
328a9de470cSBruce Richardson {
329a9de470cSBruce Richardson rte_compressdev_stop(0);
330a9de470cSBruce Richardson if (rte_compressdev_close(0) < 0)
331a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Device could not be closed\n");
332a9de470cSBruce Richardson }
333a9de470cSBruce Richardson
334a9de470cSBruce Richardson static int
test_compressdev_invalid_configuration(void)335a9de470cSBruce Richardson test_compressdev_invalid_configuration(void)
336a9de470cSBruce Richardson {
337a9de470cSBruce Richardson struct rte_compressdev_config invalid_config;
338a9de470cSBruce Richardson struct rte_compressdev_config valid_config = {
339a9de470cSBruce Richardson .socket_id = rte_socket_id(),
340a9de470cSBruce Richardson .nb_queue_pairs = 1,
341a9de470cSBruce Richardson .max_nb_priv_xforms = NUM_MAX_XFORMS,
34207b810c5SAdam Dybkowski .max_nb_streams = 1
343a9de470cSBruce Richardson };
344a9de470cSBruce Richardson struct rte_compressdev_info dev_info;
345a9de470cSBruce Richardson
346db06104cSAdam Dybkowski RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
347db06104cSAdam Dybkowski
348a9de470cSBruce Richardson /* Invalid configuration with 0 queue pairs */
349a9de470cSBruce Richardson memcpy(&invalid_config, &valid_config,
350a9de470cSBruce Richardson sizeof(struct rte_compressdev_config));
351a9de470cSBruce Richardson invalid_config.nb_queue_pairs = 0;
352a9de470cSBruce Richardson
353a9de470cSBruce Richardson TEST_ASSERT_FAIL(rte_compressdev_configure(0, &invalid_config),
354a9de470cSBruce Richardson "Device configuration was successful "
355a9de470cSBruce Richardson "with no queue pairs (invalid)\n");
356a9de470cSBruce Richardson
357a9de470cSBruce Richardson /*
358a9de470cSBruce Richardson * Invalid configuration with too many queue pairs
359a9de470cSBruce Richardson * (if there is an actual maximum number of queue pairs)
360a9de470cSBruce Richardson */
361a9de470cSBruce Richardson rte_compressdev_info_get(0, &dev_info);
362a9de470cSBruce Richardson if (dev_info.max_nb_queue_pairs != 0) {
363a9de470cSBruce Richardson memcpy(&invalid_config, &valid_config,
364a9de470cSBruce Richardson sizeof(struct rte_compressdev_config));
365a9de470cSBruce Richardson invalid_config.nb_queue_pairs = dev_info.max_nb_queue_pairs + 1;
366a9de470cSBruce Richardson
367a9de470cSBruce Richardson TEST_ASSERT_FAIL(rte_compressdev_configure(0, &invalid_config),
368a9de470cSBruce Richardson "Device configuration was successful "
369a9de470cSBruce Richardson "with too many queue pairs (invalid)\n");
370a9de470cSBruce Richardson }
371a9de470cSBruce Richardson
372a9de470cSBruce Richardson /* Invalid queue pair setup, with no number of queue pairs set */
373a9de470cSBruce Richardson TEST_ASSERT_FAIL(rte_compressdev_queue_pair_setup(0, 0,
374a9de470cSBruce Richardson NUM_MAX_INFLIGHT_OPS, rte_socket_id()),
375a9de470cSBruce Richardson "Queue pair setup was successful "
376a9de470cSBruce Richardson "with no queue pairs set (invalid)\n");
377a9de470cSBruce Richardson
378a9de470cSBruce Richardson return TEST_SUCCESS;
379a9de470cSBruce Richardson }
380a9de470cSBruce Richardson
381a9de470cSBruce Richardson static int
compare_buffers(const char * buffer1,uint32_t buffer1_len,const char * buffer2,uint32_t buffer2_len)382a9de470cSBruce Richardson compare_buffers(const char *buffer1, uint32_t buffer1_len,
383a9de470cSBruce Richardson const char *buffer2, uint32_t buffer2_len)
384a9de470cSBruce Richardson {
385a9de470cSBruce Richardson if (buffer1_len != buffer2_len) {
386a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Buffer lengths are different\n");
387a9de470cSBruce Richardson return -1;
388a9de470cSBruce Richardson }
389a9de470cSBruce Richardson
390a9de470cSBruce Richardson if (memcmp(buffer1, buffer2, buffer1_len) != 0) {
391a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Buffers are different\n");
392a9de470cSBruce Richardson return -1;
393a9de470cSBruce Richardson }
394a9de470cSBruce Richardson
395a9de470cSBruce Richardson return 0;
396a9de470cSBruce Richardson }
397a9de470cSBruce Richardson
398a9de470cSBruce Richardson /*
399a9de470cSBruce Richardson * Maps compressdev and Zlib flush flags
400a9de470cSBruce Richardson */
401a9de470cSBruce Richardson static int
map_zlib_flush_flag(enum rte_comp_flush_flag flag)402a9de470cSBruce Richardson map_zlib_flush_flag(enum rte_comp_flush_flag flag)
403a9de470cSBruce Richardson {
404a9de470cSBruce Richardson switch (flag) {
405a9de470cSBruce Richardson case RTE_COMP_FLUSH_NONE:
406a9de470cSBruce Richardson return Z_NO_FLUSH;
407a9de470cSBruce Richardson case RTE_COMP_FLUSH_SYNC:
408a9de470cSBruce Richardson return Z_SYNC_FLUSH;
409a9de470cSBruce Richardson case RTE_COMP_FLUSH_FULL:
410a9de470cSBruce Richardson return Z_FULL_FLUSH;
411a9de470cSBruce Richardson case RTE_COMP_FLUSH_FINAL:
412a9de470cSBruce Richardson return Z_FINISH;
413a9de470cSBruce Richardson /*
414a9de470cSBruce Richardson * There should be only the values above,
415a9de470cSBruce Richardson * so this should never happen
416a9de470cSBruce Richardson */
417a9de470cSBruce Richardson default:
418a9de470cSBruce Richardson return -1;
419a9de470cSBruce Richardson }
420a9de470cSBruce Richardson }
421a9de470cSBruce Richardson
422a9de470cSBruce Richardson static int
compress_zlib(struct rte_comp_op * op,const struct rte_comp_xform * xform,int mem_level)423a9de470cSBruce Richardson compress_zlib(struct rte_comp_op *op,
424a9de470cSBruce Richardson const struct rte_comp_xform *xform, int mem_level)
425a9de470cSBruce Richardson {
426a9de470cSBruce Richardson z_stream stream;
427a9de470cSBruce Richardson int zlib_flush;
428a9de470cSBruce Richardson int strategy, window_bits, comp_level;
429a9de470cSBruce Richardson int ret = TEST_FAILED;
430a9de470cSBruce Richardson uint8_t *single_src_buf = NULL;
431a9de470cSBruce Richardson uint8_t *single_dst_buf = NULL;
432a9de470cSBruce Richardson
433a9de470cSBruce Richardson /* initialize zlib stream */
434a9de470cSBruce Richardson stream.zalloc = Z_NULL;
435a9de470cSBruce Richardson stream.zfree = Z_NULL;
436a9de470cSBruce Richardson stream.opaque = Z_NULL;
437a9de470cSBruce Richardson
438a9de470cSBruce Richardson if (xform->compress.deflate.huffman == RTE_COMP_HUFFMAN_FIXED)
439a9de470cSBruce Richardson strategy = Z_FIXED;
440a9de470cSBruce Richardson else
441a9de470cSBruce Richardson strategy = Z_DEFAULT_STRATEGY;
442a9de470cSBruce Richardson
443a9de470cSBruce Richardson /*
444a9de470cSBruce Richardson * Window bits is the base two logarithm of the window size (in bytes).
445a9de470cSBruce Richardson * When doing raw DEFLATE, this number will be negative.
446a9de470cSBruce Richardson */
447a9de470cSBruce Richardson window_bits = -(xform->compress.window_size);
448a9de470cSBruce Richardson if (xform->compress.chksum == RTE_COMP_CHECKSUM_ADLER32)
449a9de470cSBruce Richardson window_bits *= -1;
450a9de470cSBruce Richardson else if (xform->compress.chksum == RTE_COMP_CHECKSUM_CRC32)
451a9de470cSBruce Richardson window_bits = ZLIB_CRC_CHECKSUM_WINDOW_BITS;
452a9de470cSBruce Richardson
453a9de470cSBruce Richardson comp_level = xform->compress.level;
454a9de470cSBruce Richardson
455a9de470cSBruce Richardson if (comp_level != RTE_COMP_LEVEL_NONE)
456a9de470cSBruce Richardson ret = deflateInit2(&stream, comp_level, Z_DEFLATED,
457a9de470cSBruce Richardson window_bits, mem_level, strategy);
458a9de470cSBruce Richardson else
459a9de470cSBruce Richardson ret = deflateInit(&stream, Z_NO_COMPRESSION);
460a9de470cSBruce Richardson
461a9de470cSBruce Richardson if (ret != Z_OK) {
462a9de470cSBruce Richardson printf("Zlib deflate could not be initialized\n");
463a9de470cSBruce Richardson goto exit;
464a9de470cSBruce Richardson }
465a9de470cSBruce Richardson
466a9de470cSBruce Richardson /* Assuming stateless operation */
467a9de470cSBruce Richardson /* SGL Input */
468a9de470cSBruce Richardson if (op->m_src->nb_segs > 1) {
469a9de470cSBruce Richardson single_src_buf = rte_malloc(NULL,
470a9de470cSBruce Richardson rte_pktmbuf_pkt_len(op->m_src), 0);
471a9de470cSBruce Richardson if (single_src_buf == NULL) {
472a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Buffer could not be allocated\n");
473a9de470cSBruce Richardson goto exit;
474a9de470cSBruce Richardson }
475a9de470cSBruce Richardson
476a9de470cSBruce Richardson if (rte_pktmbuf_read(op->m_src, op->src.offset,
477a9de470cSBruce Richardson rte_pktmbuf_pkt_len(op->m_src) -
478a9de470cSBruce Richardson op->src.offset,
479a9de470cSBruce Richardson single_src_buf) == NULL) {
480a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
481a9de470cSBruce Richardson "Buffer could not be read entirely\n");
482a9de470cSBruce Richardson goto exit;
483a9de470cSBruce Richardson }
484a9de470cSBruce Richardson
485a9de470cSBruce Richardson stream.avail_in = op->src.length;
486a9de470cSBruce Richardson stream.next_in = single_src_buf;
487a9de470cSBruce Richardson
488a9de470cSBruce Richardson } else {
489a9de470cSBruce Richardson stream.avail_in = op->src.length;
490a9de470cSBruce Richardson stream.next_in = rte_pktmbuf_mtod_offset(op->m_src, uint8_t *,
491a9de470cSBruce Richardson op->src.offset);
492a9de470cSBruce Richardson }
493a9de470cSBruce Richardson /* SGL output */
494a9de470cSBruce Richardson if (op->m_dst->nb_segs > 1) {
495a9de470cSBruce Richardson
496a9de470cSBruce Richardson single_dst_buf = rte_malloc(NULL,
497a9de470cSBruce Richardson rte_pktmbuf_pkt_len(op->m_dst), 0);
498a9de470cSBruce Richardson if (single_dst_buf == NULL) {
499a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
500a9de470cSBruce Richardson "Buffer could not be allocated\n");
501a9de470cSBruce Richardson goto exit;
502a9de470cSBruce Richardson }
503a9de470cSBruce Richardson
504a9de470cSBruce Richardson stream.avail_out = op->m_dst->pkt_len;
505a9de470cSBruce Richardson stream.next_out = single_dst_buf;
506a9de470cSBruce Richardson
507a9de470cSBruce Richardson } else {/* linear output */
508a9de470cSBruce Richardson stream.avail_out = op->m_dst->data_len;
509a9de470cSBruce Richardson stream.next_out = rte_pktmbuf_mtod_offset(op->m_dst, uint8_t *,
510a9de470cSBruce Richardson op->dst.offset);
511a9de470cSBruce Richardson }
512a9de470cSBruce Richardson
513a9de470cSBruce Richardson /* Stateless operation, all buffer will be compressed in one go */
514a9de470cSBruce Richardson zlib_flush = map_zlib_flush_flag(op->flush_flag);
515a9de470cSBruce Richardson ret = deflate(&stream, zlib_flush);
516a9de470cSBruce Richardson
517a9de470cSBruce Richardson if (stream.avail_in != 0) {
518a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Buffer could not be read entirely\n");
519a9de470cSBruce Richardson goto exit;
520a9de470cSBruce Richardson }
521a9de470cSBruce Richardson
522a9de470cSBruce Richardson if (ret != Z_STREAM_END)
523a9de470cSBruce Richardson goto exit;
524a9de470cSBruce Richardson
525a9de470cSBruce Richardson /* Copy data to destination SGL */
526a9de470cSBruce Richardson if (op->m_dst->nb_segs > 1) {
527a9de470cSBruce Richardson uint32_t remaining_data = stream.total_out;
528a9de470cSBruce Richardson uint8_t *src_data = single_dst_buf;
529a9de470cSBruce Richardson struct rte_mbuf *dst_buf = op->m_dst;
530a9de470cSBruce Richardson
531a9de470cSBruce Richardson while (remaining_data > 0) {
532a9de470cSBruce Richardson uint8_t *dst_data = rte_pktmbuf_mtod_offset(dst_buf,
533a9de470cSBruce Richardson uint8_t *, op->dst.offset);
534a9de470cSBruce Richardson /* Last segment */
535a9de470cSBruce Richardson if (remaining_data < dst_buf->data_len) {
536a9de470cSBruce Richardson memcpy(dst_data, src_data, remaining_data);
537a9de470cSBruce Richardson remaining_data = 0;
538a9de470cSBruce Richardson } else {
539a9de470cSBruce Richardson memcpy(dst_data, src_data, dst_buf->data_len);
540a9de470cSBruce Richardson remaining_data -= dst_buf->data_len;
541a9de470cSBruce Richardson src_data += dst_buf->data_len;
542a9de470cSBruce Richardson dst_buf = dst_buf->next;
543a9de470cSBruce Richardson }
544a9de470cSBruce Richardson }
545a9de470cSBruce Richardson }
546a9de470cSBruce Richardson
547a9de470cSBruce Richardson op->consumed = stream.total_in;
548a9de470cSBruce Richardson if (xform->compress.chksum == RTE_COMP_CHECKSUM_ADLER32) {
549a9de470cSBruce Richardson rte_pktmbuf_adj(op->m_dst, ZLIB_HEADER_SIZE);
550a9de470cSBruce Richardson rte_pktmbuf_trim(op->m_dst, ZLIB_TRAILER_SIZE);
551a9de470cSBruce Richardson op->produced = stream.total_out - (ZLIB_HEADER_SIZE +
552a9de470cSBruce Richardson ZLIB_TRAILER_SIZE);
553a9de470cSBruce Richardson } else if (xform->compress.chksum == RTE_COMP_CHECKSUM_CRC32) {
554a9de470cSBruce Richardson rte_pktmbuf_adj(op->m_dst, GZIP_HEADER_SIZE);
555a9de470cSBruce Richardson rte_pktmbuf_trim(op->m_dst, GZIP_TRAILER_SIZE);
556a9de470cSBruce Richardson op->produced = stream.total_out - (GZIP_HEADER_SIZE +
557a9de470cSBruce Richardson GZIP_TRAILER_SIZE);
558a9de470cSBruce Richardson } else
559a9de470cSBruce Richardson op->produced = stream.total_out;
560a9de470cSBruce Richardson
561a9de470cSBruce Richardson op->status = RTE_COMP_OP_STATUS_SUCCESS;
562a9de470cSBruce Richardson op->output_chksum = stream.adler;
563a9de470cSBruce Richardson
564a9de470cSBruce Richardson deflateReset(&stream);
565a9de470cSBruce Richardson
566a9de470cSBruce Richardson ret = 0;
567a9de470cSBruce Richardson exit:
568a9de470cSBruce Richardson deflateEnd(&stream);
569a9de470cSBruce Richardson rte_free(single_src_buf);
570a9de470cSBruce Richardson rte_free(single_dst_buf);
571a9de470cSBruce Richardson
572a9de470cSBruce Richardson return ret;
573a9de470cSBruce Richardson }
574a9de470cSBruce Richardson
575a9de470cSBruce Richardson static int
decompress_zlib(struct rte_comp_op * op,const struct rte_comp_xform * xform)576a9de470cSBruce Richardson decompress_zlib(struct rte_comp_op *op,
577a9de470cSBruce Richardson const struct rte_comp_xform *xform)
578a9de470cSBruce Richardson {
579a9de470cSBruce Richardson z_stream stream;
580a9de470cSBruce Richardson int window_bits;
581a9de470cSBruce Richardson int zlib_flush;
582a9de470cSBruce Richardson int ret = TEST_FAILED;
583a9de470cSBruce Richardson uint8_t *single_src_buf = NULL;
584a9de470cSBruce Richardson uint8_t *single_dst_buf = NULL;
585a9de470cSBruce Richardson
586a9de470cSBruce Richardson /* initialize zlib stream */
587a9de470cSBruce Richardson stream.zalloc = Z_NULL;
588a9de470cSBruce Richardson stream.zfree = Z_NULL;
589a9de470cSBruce Richardson stream.opaque = Z_NULL;
590a9de470cSBruce Richardson
591a9de470cSBruce Richardson /*
592a9de470cSBruce Richardson * Window bits is the base two logarithm of the window size (in bytes).
593a9de470cSBruce Richardson * When doing raw DEFLATE, this number will be negative.
594a9de470cSBruce Richardson */
595a9de470cSBruce Richardson window_bits = -(xform->decompress.window_size);
596a9de470cSBruce Richardson ret = inflateInit2(&stream, window_bits);
597a9de470cSBruce Richardson
598a9de470cSBruce Richardson if (ret != Z_OK) {
599a9de470cSBruce Richardson printf("Zlib deflate could not be initialized\n");
600a9de470cSBruce Richardson goto exit;
601a9de470cSBruce Richardson }
602a9de470cSBruce Richardson
603a9de470cSBruce Richardson /* Assuming stateless operation */
604a9de470cSBruce Richardson /* SGL */
605a9de470cSBruce Richardson if (op->m_src->nb_segs > 1) {
606a9de470cSBruce Richardson single_src_buf = rte_malloc(NULL,
607a9de470cSBruce Richardson rte_pktmbuf_pkt_len(op->m_src), 0);
608a9de470cSBruce Richardson if (single_src_buf == NULL) {
609a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Buffer could not be allocated\n");
610a9de470cSBruce Richardson goto exit;
611a9de470cSBruce Richardson }
612a9de470cSBruce Richardson single_dst_buf = rte_malloc(NULL,
613a9de470cSBruce Richardson rte_pktmbuf_pkt_len(op->m_dst), 0);
614a9de470cSBruce Richardson if (single_dst_buf == NULL) {
615a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Buffer could not be allocated\n");
616a9de470cSBruce Richardson goto exit;
617a9de470cSBruce Richardson }
618a9de470cSBruce Richardson if (rte_pktmbuf_read(op->m_src, 0,
619a9de470cSBruce Richardson rte_pktmbuf_pkt_len(op->m_src),
620a9de470cSBruce Richardson single_src_buf) == NULL) {
621a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
622a9de470cSBruce Richardson "Buffer could not be read entirely\n");
623a9de470cSBruce Richardson goto exit;
624a9de470cSBruce Richardson }
625a9de470cSBruce Richardson
626a9de470cSBruce Richardson stream.avail_in = op->src.length;
627a9de470cSBruce Richardson stream.next_in = single_src_buf;
628a9de470cSBruce Richardson stream.avail_out = rte_pktmbuf_pkt_len(op->m_dst);
629a9de470cSBruce Richardson stream.next_out = single_dst_buf;
630a9de470cSBruce Richardson
631a9de470cSBruce Richardson } else {
632a9de470cSBruce Richardson stream.avail_in = op->src.length;
633a9de470cSBruce Richardson stream.next_in = rte_pktmbuf_mtod(op->m_src, uint8_t *);
634a9de470cSBruce Richardson stream.avail_out = op->m_dst->data_len;
635a9de470cSBruce Richardson stream.next_out = rte_pktmbuf_mtod(op->m_dst, uint8_t *);
636a9de470cSBruce Richardson }
637a9de470cSBruce Richardson
638a9de470cSBruce Richardson /* Stateless operation, all buffer will be compressed in one go */
639a9de470cSBruce Richardson zlib_flush = map_zlib_flush_flag(op->flush_flag);
640a9de470cSBruce Richardson ret = inflate(&stream, zlib_flush);
641a9de470cSBruce Richardson
642a9de470cSBruce Richardson if (stream.avail_in != 0) {
643a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Buffer could not be read entirely\n");
644a9de470cSBruce Richardson goto exit;
645a9de470cSBruce Richardson }
646a9de470cSBruce Richardson
647a9de470cSBruce Richardson if (ret != Z_STREAM_END)
648a9de470cSBruce Richardson goto exit;
649a9de470cSBruce Richardson
650a9de470cSBruce Richardson if (op->m_src->nb_segs > 1) {
651a9de470cSBruce Richardson uint32_t remaining_data = stream.total_out;
652a9de470cSBruce Richardson uint8_t *src_data = single_dst_buf;
653a9de470cSBruce Richardson struct rte_mbuf *dst_buf = op->m_dst;
654a9de470cSBruce Richardson
655a9de470cSBruce Richardson while (remaining_data > 0) {
656a9de470cSBruce Richardson uint8_t *dst_data = rte_pktmbuf_mtod(dst_buf,
657a9de470cSBruce Richardson uint8_t *);
658a9de470cSBruce Richardson /* Last segment */
659a9de470cSBruce Richardson if (remaining_data < dst_buf->data_len) {
660a9de470cSBruce Richardson memcpy(dst_data, src_data, remaining_data);
661a9de470cSBruce Richardson remaining_data = 0;
662a9de470cSBruce Richardson } else {
663a9de470cSBruce Richardson memcpy(dst_data, src_data, dst_buf->data_len);
664a9de470cSBruce Richardson remaining_data -= dst_buf->data_len;
665a9de470cSBruce Richardson src_data += dst_buf->data_len;
666a9de470cSBruce Richardson dst_buf = dst_buf->next;
667a9de470cSBruce Richardson }
668a9de470cSBruce Richardson }
669a9de470cSBruce Richardson }
670a9de470cSBruce Richardson
671a9de470cSBruce Richardson op->consumed = stream.total_in;
672a9de470cSBruce Richardson op->produced = stream.total_out;
673a9de470cSBruce Richardson op->status = RTE_COMP_OP_STATUS_SUCCESS;
674a9de470cSBruce Richardson
675a9de470cSBruce Richardson inflateReset(&stream);
676a9de470cSBruce Richardson
677a9de470cSBruce Richardson ret = 0;
678a9de470cSBruce Richardson exit:
679a9de470cSBruce Richardson inflateEnd(&stream);
680a9de470cSBruce Richardson
681a9de470cSBruce Richardson return ret;
682a9de470cSBruce Richardson }
683a9de470cSBruce Richardson
684a9de470cSBruce Richardson static int
prepare_sgl_bufs(const char * test_buf,struct rte_mbuf * head_buf,uint32_t total_data_size,struct rte_mempool * small_mbuf_pool,struct rte_mempool * large_mbuf_pool,uint8_t limit_segs_in_sgl,uint16_t seg_size)685a9de470cSBruce Richardson prepare_sgl_bufs(const char *test_buf, struct rte_mbuf *head_buf,
686a9de470cSBruce Richardson uint32_t total_data_size,
687a9de470cSBruce Richardson struct rte_mempool *small_mbuf_pool,
688a9de470cSBruce Richardson struct rte_mempool *large_mbuf_pool,
6899df7ffd1STomasz Jozwiak uint8_t limit_segs_in_sgl,
6909df7ffd1STomasz Jozwiak uint16_t seg_size)
691a9de470cSBruce Richardson {
692a9de470cSBruce Richardson uint32_t remaining_data = total_data_size;
6939df7ffd1STomasz Jozwiak uint16_t num_remaining_segs = DIV_CEIL(remaining_data, seg_size);
694a9de470cSBruce Richardson struct rte_mempool *pool;
695a9de470cSBruce Richardson struct rte_mbuf *next_seg;
696a9de470cSBruce Richardson uint32_t data_size;
697a9de470cSBruce Richardson char *buf_ptr;
698a9de470cSBruce Richardson const char *data_ptr = test_buf;
699a9de470cSBruce Richardson uint16_t i;
700a9de470cSBruce Richardson int ret;
701a9de470cSBruce Richardson
702a9de470cSBruce Richardson if (limit_segs_in_sgl != 0 && num_remaining_segs > limit_segs_in_sgl)
703a9de470cSBruce Richardson num_remaining_segs = limit_segs_in_sgl - 1;
704a9de470cSBruce Richardson
705a9de470cSBruce Richardson /*
706a9de470cSBruce Richardson * Allocate data in the first segment (header) and
707a9de470cSBruce Richardson * copy data if test buffer is provided
708a9de470cSBruce Richardson */
7099df7ffd1STomasz Jozwiak if (remaining_data < seg_size)
710a9de470cSBruce Richardson data_size = remaining_data;
711a9de470cSBruce Richardson else
7129df7ffd1STomasz Jozwiak data_size = seg_size;
7136bbc5a92SArtur Trybula
714a9de470cSBruce Richardson buf_ptr = rte_pktmbuf_append(head_buf, data_size);
715a9de470cSBruce Richardson if (buf_ptr == NULL) {
716a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
717a9de470cSBruce Richardson "Not enough space in the 1st buffer\n");
718a9de470cSBruce Richardson return -1;
719a9de470cSBruce Richardson }
720a9de470cSBruce Richardson
721a9de470cSBruce Richardson if (data_ptr != NULL) {
722a9de470cSBruce Richardson /* Copy characters without NULL terminator */
723db06104cSAdam Dybkowski memcpy(buf_ptr, data_ptr, data_size);
724a9de470cSBruce Richardson data_ptr += data_size;
725a9de470cSBruce Richardson }
726a9de470cSBruce Richardson remaining_data -= data_size;
727a9de470cSBruce Richardson num_remaining_segs--;
728a9de470cSBruce Richardson
729a9de470cSBruce Richardson /*
730a9de470cSBruce Richardson * Allocate the rest of the segments,
731a9de470cSBruce Richardson * copy the rest of the data and chain the segments.
732a9de470cSBruce Richardson */
733a9de470cSBruce Richardson for (i = 0; i < num_remaining_segs; i++) {
734a9de470cSBruce Richardson
735a9de470cSBruce Richardson if (i == (num_remaining_segs - 1)) {
736a9de470cSBruce Richardson /* last segment */
7379df7ffd1STomasz Jozwiak if (remaining_data > seg_size)
738a9de470cSBruce Richardson pool = large_mbuf_pool;
739a9de470cSBruce Richardson else
740a9de470cSBruce Richardson pool = small_mbuf_pool;
741a9de470cSBruce Richardson data_size = remaining_data;
742a9de470cSBruce Richardson } else {
7439df7ffd1STomasz Jozwiak data_size = seg_size;
744a9de470cSBruce Richardson pool = small_mbuf_pool;
745a9de470cSBruce Richardson }
746a9de470cSBruce Richardson
747a9de470cSBruce Richardson next_seg = rte_pktmbuf_alloc(pool);
748a9de470cSBruce Richardson if (next_seg == NULL) {
749a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
750a9de470cSBruce Richardson "New segment could not be allocated "
751a9de470cSBruce Richardson "from the mempool\n");
752a9de470cSBruce Richardson return -1;
753a9de470cSBruce Richardson }
754a9de470cSBruce Richardson buf_ptr = rte_pktmbuf_append(next_seg, data_size);
755a9de470cSBruce Richardson if (buf_ptr == NULL) {
756a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
757a9de470cSBruce Richardson "Not enough space in the buffer\n");
758a9de470cSBruce Richardson rte_pktmbuf_free(next_seg);
759a9de470cSBruce Richardson return -1;
760a9de470cSBruce Richardson }
761a9de470cSBruce Richardson if (data_ptr != NULL) {
762a9de470cSBruce Richardson /* Copy characters without NULL terminator */
763db06104cSAdam Dybkowski memcpy(buf_ptr, data_ptr, data_size);
764a9de470cSBruce Richardson data_ptr += data_size;
765a9de470cSBruce Richardson }
766a9de470cSBruce Richardson remaining_data -= data_size;
767a9de470cSBruce Richardson
768a9de470cSBruce Richardson ret = rte_pktmbuf_chain(head_buf, next_seg);
769a9de470cSBruce Richardson if (ret != 0) {
770a9de470cSBruce Richardson rte_pktmbuf_free(next_seg);
771a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
772a9de470cSBruce Richardson "Segment could not chained\n");
773a9de470cSBruce Richardson return -1;
774a9de470cSBruce Richardson }
775a9de470cSBruce Richardson }
776a9de470cSBruce Richardson
777a9de470cSBruce Richardson return 0;
778a9de470cSBruce Richardson }
779a9de470cSBruce Richardson
7803fc3996fSAdam Dybkowski static void
extbuf_free_callback(void * addr __rte_unused,void * opaque __rte_unused)7813fc3996fSAdam Dybkowski extbuf_free_callback(void *addr __rte_unused, void *opaque __rte_unused)
7823fc3996fSAdam Dybkowski {
7833fc3996fSAdam Dybkowski }
7843fc3996fSAdam Dybkowski
7852437fbbcSArtur Trybula static int
test_run_enqueue_dequeue(struct rte_comp_op ** ops,struct rte_comp_op ** ops_processed,unsigned int num_bufs)7866bbc5a92SArtur Trybula test_run_enqueue_dequeue(struct rte_comp_op **ops,
7876bbc5a92SArtur Trybula struct rte_comp_op **ops_processed,
7886bbc5a92SArtur Trybula unsigned int num_bufs)
7892437fbbcSArtur Trybula {
7902437fbbcSArtur Trybula uint16_t num_enqd, num_deqd, num_total_deqd;
7912437fbbcSArtur Trybula unsigned int deqd_retries = 0;
792db06104cSAdam Dybkowski int res = 0;
7932437fbbcSArtur Trybula
7942437fbbcSArtur Trybula /* Enqueue and dequeue all operations */
7952437fbbcSArtur Trybula num_enqd = rte_compressdev_enqueue_burst(0, 0, ops, num_bufs);
7962437fbbcSArtur Trybula if (num_enqd < num_bufs) {
7972437fbbcSArtur Trybula RTE_LOG(ERR, USER1,
7982437fbbcSArtur Trybula "Some operations could not be enqueued\n");
799db06104cSAdam Dybkowski res = -1;
8002437fbbcSArtur Trybula }
8012437fbbcSArtur Trybula
802db06104cSAdam Dybkowski /* dequeue ops even on error (same number of ops as was enqueued) */
803db06104cSAdam Dybkowski
8042437fbbcSArtur Trybula num_total_deqd = 0;
805db06104cSAdam Dybkowski while (num_total_deqd < num_enqd) {
8062437fbbcSArtur Trybula /*
8072437fbbcSArtur Trybula * If retrying a dequeue call, wait for 10 ms to allow
8082437fbbcSArtur Trybula * enough time to the driver to process the operations
8092437fbbcSArtur Trybula */
8102437fbbcSArtur Trybula if (deqd_retries != 0) {
8112437fbbcSArtur Trybula /*
8122437fbbcSArtur Trybula * Avoid infinite loop if not all the
8132437fbbcSArtur Trybula * operations get out of the device
8142437fbbcSArtur Trybula */
8152437fbbcSArtur Trybula if (deqd_retries == MAX_DEQD_RETRIES) {
8162437fbbcSArtur Trybula RTE_LOG(ERR, USER1,
8172437fbbcSArtur Trybula "Not all operations could be dequeued\n");
818db06104cSAdam Dybkowski res = -1;
819db06104cSAdam Dybkowski break;
8202437fbbcSArtur Trybula }
8212437fbbcSArtur Trybula usleep(DEQUEUE_WAIT_TIME);
8222437fbbcSArtur Trybula }
8232437fbbcSArtur Trybula num_deqd = rte_compressdev_dequeue_burst(0, 0,
8242437fbbcSArtur Trybula &ops_processed[num_total_deqd], num_bufs);
8252437fbbcSArtur Trybula num_total_deqd += num_deqd;
8262437fbbcSArtur Trybula deqd_retries++;
8272437fbbcSArtur Trybula
828db06104cSAdam Dybkowski }
8292437fbbcSArtur Trybula
830db06104cSAdam Dybkowski return res;
8312437fbbcSArtur Trybula }
8322437fbbcSArtur Trybula
8336bbc5a92SArtur Trybula /**
8346bbc5a92SArtur Trybula * Arrays initialization. Input buffers preparation for compression.
8356bbc5a92SArtur Trybula *
8366bbc5a92SArtur Trybula * API that initializes all the private arrays to NULL
8376bbc5a92SArtur Trybula * and allocates input buffers to perform compression operations.
8386bbc5a92SArtur Trybula *
8396bbc5a92SArtur Trybula * @param int_data
8406bbc5a92SArtur Trybula * Interim data containing session/transformation objects.
8416bbc5a92SArtur Trybula * @param test_data
8426bbc5a92SArtur Trybula * The test parameters set by users (command line parameters).
8436bbc5a92SArtur Trybula * @param test_priv_data
8446bbc5a92SArtur Trybula * A container used for aggregation all the private test arrays.
8456bbc5a92SArtur Trybula * @return
8466bbc5a92SArtur Trybula * - 0: On success.
8476bbc5a92SArtur Trybula * - -1: On error.
848a9de470cSBruce Richardson */
849a9de470cSBruce Richardson static int
test_setup_com_bufs(const struct interim_data_params * int_data,const struct test_data_params * test_data,const struct test_private_arrays * test_priv_data)8506bbc5a92SArtur Trybula test_setup_com_bufs(const struct interim_data_params *int_data,
8516bbc5a92SArtur Trybula const struct test_data_params *test_data,
8526bbc5a92SArtur Trybula const struct test_private_arrays *test_priv_data)
853a9de470cSBruce Richardson {
8546bbc5a92SArtur Trybula /* local variables: */
8556bbc5a92SArtur Trybula unsigned int i;
8566bbc5a92SArtur Trybula uint32_t data_size;
8576bbc5a92SArtur Trybula char *buf_ptr;
8586bbc5a92SArtur Trybula int ret;
8596bbc5a92SArtur Trybula char **all_decomp_data = test_priv_data->all_decomp_data;
8606bbc5a92SArtur Trybula
861a9de470cSBruce Richardson struct comp_testsuite_params *ts_params = &testsuite_params;
8626bbc5a92SArtur Trybula
8636bbc5a92SArtur Trybula /* from int_data: */
864a9de470cSBruce Richardson const char * const *test_bufs = int_data->test_bufs;
865a9de470cSBruce Richardson unsigned int num_bufs = int_data->num_bufs;
8666bbc5a92SArtur Trybula
8676bbc5a92SArtur Trybula /* from test_data: */
868a9de470cSBruce Richardson unsigned int buff_type = test_data->buff_type;
8699df7ffd1STomasz Jozwiak unsigned int big_data = test_data->big_data;
8706bbc5a92SArtur Trybula
8716bbc5a92SArtur Trybula /* from test_priv_data: */
8726bbc5a92SArtur Trybula struct rte_mbuf **uncomp_bufs = test_priv_data->uncomp_bufs;
873a9de470cSBruce Richardson struct rte_mempool *buf_pool;
87407b810c5SAdam Dybkowski
8756bbc5a92SArtur Trybula static struct rte_mbuf_ext_shared_info inbuf_info;
876a9de470cSBruce Richardson
8776bbc5a92SArtur Trybula size_t array_size = sizeof(void *) * num_bufs;
87898af2ecaSAdam Dybkowski
879a9de470cSBruce Richardson /* Initialize all arrays to NULL */
8806bbc5a92SArtur Trybula memset(test_priv_data->uncomp_bufs, 0, array_size);
8816bbc5a92SArtur Trybula memset(test_priv_data->comp_bufs, 0, array_size);
8826bbc5a92SArtur Trybula memset(test_priv_data->ops, 0, array_size);
8836bbc5a92SArtur Trybula memset(test_priv_data->ops_processed, 0, array_size);
8846bbc5a92SArtur Trybula memset(test_priv_data->priv_xforms, 0, array_size);
8856bbc5a92SArtur Trybula memset(test_priv_data->compressed_data_size,
8866bbc5a92SArtur Trybula 0, sizeof(uint32_t) * num_bufs);
887a9de470cSBruce Richardson
8886bbc5a92SArtur Trybula if (test_data->decompress_state == RTE_COMP_OP_STATEFUL) {
88907b810c5SAdam Dybkowski data_size = strlen(test_bufs[0]) + 1;
8906bbc5a92SArtur Trybula *all_decomp_data = rte_malloc(NULL, data_size,
89107b810c5SAdam Dybkowski RTE_CACHE_LINE_SIZE);
89207b810c5SAdam Dybkowski }
89307b810c5SAdam Dybkowski
8949df7ffd1STomasz Jozwiak if (big_data)
8959df7ffd1STomasz Jozwiak buf_pool = ts_params->big_mbuf_pool;
8969df7ffd1STomasz Jozwiak else if (buff_type == SGL_BOTH)
897a9de470cSBruce Richardson buf_pool = ts_params->small_mbuf_pool;
898a9de470cSBruce Richardson else
899a9de470cSBruce Richardson buf_pool = ts_params->large_mbuf_pool;
900a9de470cSBruce Richardson
9016bbc5a92SArtur Trybula /* for compression uncomp_bufs is used as a source buffer */
9026bbc5a92SArtur Trybula /* allocation from buf_pool (mempool type) */
903a9de470cSBruce Richardson ret = rte_pktmbuf_alloc_bulk(buf_pool,
904a9de470cSBruce Richardson uncomp_bufs, num_bufs);
905a9de470cSBruce Richardson if (ret < 0) {
906a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
907a9de470cSBruce Richardson "Source mbufs could not be allocated "
908a9de470cSBruce Richardson "from the mempool\n");
9096bbc5a92SArtur Trybula return -1;
910a9de470cSBruce Richardson }
911a9de470cSBruce Richardson
9123fc3996fSAdam Dybkowski if (test_data->use_external_mbufs) {
9133fc3996fSAdam Dybkowski inbuf_info.free_cb = extbuf_free_callback;
9143fc3996fSAdam Dybkowski inbuf_info.fcb_opaque = NULL;
9153fc3996fSAdam Dybkowski rte_mbuf_ext_refcnt_set(&inbuf_info, 1);
9163fc3996fSAdam Dybkowski for (i = 0; i < num_bufs; i++) {
9173fc3996fSAdam Dybkowski rte_pktmbuf_attach_extbuf(uncomp_bufs[i],
9183fc3996fSAdam Dybkowski test_data->inbuf_memzone->addr,
9193fc3996fSAdam Dybkowski test_data->inbuf_memzone->iova,
9203fc3996fSAdam Dybkowski test_data->inbuf_data_size,
9213fc3996fSAdam Dybkowski &inbuf_info);
9226bbc5a92SArtur Trybula buf_ptr = rte_pktmbuf_append(uncomp_bufs[i],
9233fc3996fSAdam Dybkowski test_data->inbuf_data_size);
9246bbc5a92SArtur Trybula if (buf_ptr == NULL) {
9256bbc5a92SArtur Trybula RTE_LOG(ERR, USER1,
9266bbc5a92SArtur Trybula "Append extra bytes to the source mbuf failed\n");
9276bbc5a92SArtur Trybula return -1;
9286bbc5a92SArtur Trybula }
9293fc3996fSAdam Dybkowski }
9303fc3996fSAdam Dybkowski } else if (buff_type == SGL_BOTH || buff_type == SGL_TO_LB) {
931a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
932a9de470cSBruce Richardson data_size = strlen(test_bufs[i]) + 1;
933a9de470cSBruce Richardson if (prepare_sgl_bufs(test_bufs[i], uncomp_bufs[i],
934a9de470cSBruce Richardson data_size,
9359df7ffd1STomasz Jozwiak big_data ? buf_pool : ts_params->small_mbuf_pool,
9369df7ffd1STomasz Jozwiak big_data ? buf_pool : ts_params->large_mbuf_pool,
9379df7ffd1STomasz Jozwiak big_data ? 0 : MAX_SEGS,
9389df7ffd1STomasz Jozwiak big_data ? MAX_DATA_MBUF_SIZE : SMALL_SEG_SIZE) < 0)
9396bbc5a92SArtur Trybula return -1;
940a9de470cSBruce Richardson }
941a9de470cSBruce Richardson } else {
942a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
943a9de470cSBruce Richardson data_size = strlen(test_bufs[i]) + 1;
9446bbc5a92SArtur Trybula
945a9de470cSBruce Richardson buf_ptr = rte_pktmbuf_append(uncomp_bufs[i], data_size);
9462437fbbcSArtur Trybula if (buf_ptr == NULL) {
9472437fbbcSArtur Trybula RTE_LOG(ERR, USER1,
9482437fbbcSArtur Trybula "Append extra bytes to the source mbuf failed\n");
9496bbc5a92SArtur Trybula return -1;
9502437fbbcSArtur Trybula }
951f9acaf84SBruce Richardson strlcpy(buf_ptr, test_bufs[i], data_size);
952a9de470cSBruce Richardson }
953a9de470cSBruce Richardson }
954a9de470cSBruce Richardson
9556bbc5a92SArtur Trybula return 0;
956a9de470cSBruce Richardson }
957a9de470cSBruce Richardson
9586bbc5a92SArtur Trybula /**
9596bbc5a92SArtur Trybula * Data size calculation (for both compression and decompression).
9606bbc5a92SArtur Trybula *
9616bbc5a92SArtur Trybula * Calculate size of anticipated output buffer required for both
9626bbc5a92SArtur Trybula * compression and decompression operations based on input int_data.
9636bbc5a92SArtur Trybula *
9646bbc5a92SArtur Trybula * @param op_type
9656bbc5a92SArtur Trybula * Operation type: compress or decompress
9666bbc5a92SArtur Trybula * @param out_of_space_and_zlib
9676bbc5a92SArtur Trybula * Boolean value to switch into "out of space" buffer if set.
9686bbc5a92SArtur Trybula * To test "out-of-space" data size, zlib_decompress must be set as well.
9696bbc5a92SArtur Trybula * @param test_priv_data
9706bbc5a92SArtur Trybula * A container used for aggregation all the private test arrays.
9716bbc5a92SArtur Trybula * @param int_data
9726bbc5a92SArtur Trybula * Interim data containing session/transformation objects.
9736bbc5a92SArtur Trybula * @param test_data
9746bbc5a92SArtur Trybula * The test parameters set by users (command line parameters).
9756bbc5a92SArtur Trybula * @param i
9766bbc5a92SArtur Trybula * current buffer index
9776bbc5a92SArtur Trybula * @return
9786bbc5a92SArtur Trybula * data size
9796bbc5a92SArtur Trybula */
9806bbc5a92SArtur Trybula static inline uint32_t
test_mbufs_calculate_data_size(enum operation_type op_type,unsigned int out_of_space_and_zlib,const struct test_private_arrays * test_priv_data,const struct interim_data_params * int_data,const struct test_data_params * test_data,unsigned int i)9816bbc5a92SArtur Trybula test_mbufs_calculate_data_size(
9826bbc5a92SArtur Trybula enum operation_type op_type,
9836bbc5a92SArtur Trybula unsigned int out_of_space_and_zlib,
9846bbc5a92SArtur Trybula const struct test_private_arrays *test_priv_data,
9856bbc5a92SArtur Trybula const struct interim_data_params *int_data,
9866bbc5a92SArtur Trybula const struct test_data_params *test_data,
9876bbc5a92SArtur Trybula unsigned int i)
9886bbc5a92SArtur Trybula {
9896bbc5a92SArtur Trybula /* local variables: */
9906bbc5a92SArtur Trybula uint32_t data_size;
9916bbc5a92SArtur Trybula struct priv_op_data *priv_data;
992db06104cSAdam Dybkowski float ratio_val;
993db06104cSAdam Dybkowski enum ratio_switch ratio = test_data->ratio;
994db06104cSAdam Dybkowski
9956bbc5a92SArtur Trybula uint8_t not_zlib_compr; /* true if zlib isn't current compression dev */
9966bbc5a92SArtur Trybula enum overflow_test overflow = test_data->overflow;
997a9de470cSBruce Richardson
9986bbc5a92SArtur Trybula /* from test_priv_data: */
9996bbc5a92SArtur Trybula struct rte_comp_op **ops_processed = test_priv_data->ops_processed;
1000a9de470cSBruce Richardson
10016bbc5a92SArtur Trybula /* from int_data: */
10026bbc5a92SArtur Trybula const char * const *test_bufs = int_data->test_bufs;
10036bbc5a92SArtur Trybula
10046bbc5a92SArtur Trybula if (out_of_space_and_zlib)
1005a9de470cSBruce Richardson data_size = OUT_OF_SPACE_BUF;
10062437fbbcSArtur Trybula else {
10076bbc5a92SArtur Trybula if (op_type == OPERATION_COMPRESSION) {
10086bbc5a92SArtur Trybula not_zlib_compr = (test_data->zlib_dir == ZLIB_DECOMPRESS
10096bbc5a92SArtur Trybula || test_data->zlib_dir == ZLIB_NONE);
10106bbc5a92SArtur Trybula
1011db06104cSAdam Dybkowski ratio_val = (ratio == RATIO_ENABLED) ?
1012db06104cSAdam Dybkowski COMPRESS_BUF_SIZE_RATIO :
1013db06104cSAdam Dybkowski COMPRESS_BUF_SIZE_RATIO_DISABLED;
1014db06104cSAdam Dybkowski
1015db06104cSAdam Dybkowski ratio_val = (not_zlib_compr &&
10166bbc5a92SArtur Trybula (overflow == OVERFLOW_ENABLED)) ?
10172437fbbcSArtur Trybula COMPRESS_BUF_SIZE_RATIO_OVERFLOW :
1018db06104cSAdam Dybkowski ratio_val;
1019a9de470cSBruce Richardson
1020db06104cSAdam Dybkowski data_size = strlen(test_bufs[i]) * ratio_val;
10216bbc5a92SArtur Trybula } else {
10226bbc5a92SArtur Trybula priv_data = (struct priv_op_data *)
10236bbc5a92SArtur Trybula (ops_processed[i] + 1);
10246bbc5a92SArtur Trybula data_size = strlen(test_bufs[priv_data->orig_idx]) + 1;
10252437fbbcSArtur Trybula }
10266bbc5a92SArtur Trybula }
10276bbc5a92SArtur Trybula
10286bbc5a92SArtur Trybula return data_size;
10296bbc5a92SArtur Trybula }
10306bbc5a92SArtur Trybula
10316bbc5a92SArtur Trybula
10326bbc5a92SArtur Trybula /**
10336bbc5a92SArtur Trybula * Memory buffers preparation (for both compression and decompression).
10346bbc5a92SArtur Trybula *
10356bbc5a92SArtur Trybula * Function allocates output buffers to perform compression
10366bbc5a92SArtur Trybula * or decompression operations depending on value of op_type.
10376bbc5a92SArtur Trybula *
10386bbc5a92SArtur Trybula * @param op_type
10396bbc5a92SArtur Trybula * Operation type: compress or decompress
10406bbc5a92SArtur Trybula * @param out_of_space_and_zlib
10416bbc5a92SArtur Trybula * Boolean value to switch into "out of space" buffer if set.
10426bbc5a92SArtur Trybula * To test "out-of-space" data size, zlib_decompress must be set as well.
10436bbc5a92SArtur Trybula * @param test_priv_data
10446bbc5a92SArtur Trybula * A container used for aggregation all the private test arrays.
10456bbc5a92SArtur Trybula * @param int_data
10466bbc5a92SArtur Trybula * Interim data containing session/transformation objects.
10476bbc5a92SArtur Trybula * @param test_data
10486bbc5a92SArtur Trybula * The test parameters set by users (command line parameters).
10496bbc5a92SArtur Trybula * @param current_extbuf_info,
10506bbc5a92SArtur Trybula * The structure containing all the information related to external mbufs
10516bbc5a92SArtur Trybula * @return
10526bbc5a92SArtur Trybula * - 0: On success.
10536bbc5a92SArtur Trybula * - -1: On error.
10546bbc5a92SArtur Trybula */
10556bbc5a92SArtur Trybula static int
test_setup_output_bufs(enum operation_type op_type,unsigned int out_of_space_and_zlib,const struct test_private_arrays * test_priv_data,const struct interim_data_params * int_data,const struct test_data_params * test_data,struct rte_mbuf_ext_shared_info * current_extbuf_info)10566bbc5a92SArtur Trybula test_setup_output_bufs(
10576bbc5a92SArtur Trybula enum operation_type op_type,
10586bbc5a92SArtur Trybula unsigned int out_of_space_and_zlib,
10596bbc5a92SArtur Trybula const struct test_private_arrays *test_priv_data,
10606bbc5a92SArtur Trybula const struct interim_data_params *int_data,
10616bbc5a92SArtur Trybula const struct test_data_params *test_data,
10626bbc5a92SArtur Trybula struct rte_mbuf_ext_shared_info *current_extbuf_info)
10636bbc5a92SArtur Trybula {
10646bbc5a92SArtur Trybula /* local variables: */
10656bbc5a92SArtur Trybula unsigned int i;
10666bbc5a92SArtur Trybula uint32_t data_size;
10676bbc5a92SArtur Trybula int ret;
10686bbc5a92SArtur Trybula char *buf_ptr;
10696bbc5a92SArtur Trybula
10706bbc5a92SArtur Trybula /* from test_priv_data: */
10716bbc5a92SArtur Trybula struct rte_mbuf **current_bufs;
10726bbc5a92SArtur Trybula
10736bbc5a92SArtur Trybula /* from int_data: */
10746bbc5a92SArtur Trybula unsigned int num_bufs = int_data->num_bufs;
10756bbc5a92SArtur Trybula
10766bbc5a92SArtur Trybula /* from test_data: */
10776bbc5a92SArtur Trybula unsigned int buff_type = test_data->buff_type;
10786bbc5a92SArtur Trybula unsigned int big_data = test_data->big_data;
10796bbc5a92SArtur Trybula const struct rte_memzone *current_memzone;
10806bbc5a92SArtur Trybula
10816bbc5a92SArtur Trybula struct comp_testsuite_params *ts_params = &testsuite_params;
10826bbc5a92SArtur Trybula struct rte_mempool *buf_pool;
10836bbc5a92SArtur Trybula
10846bbc5a92SArtur Trybula if (big_data)
10856bbc5a92SArtur Trybula buf_pool = ts_params->big_mbuf_pool;
10866bbc5a92SArtur Trybula else if (buff_type == SGL_BOTH)
10876bbc5a92SArtur Trybula buf_pool = ts_params->small_mbuf_pool;
10886bbc5a92SArtur Trybula else
10896bbc5a92SArtur Trybula buf_pool = ts_params->large_mbuf_pool;
10906bbc5a92SArtur Trybula
10916bbc5a92SArtur Trybula if (op_type == OPERATION_COMPRESSION)
10926bbc5a92SArtur Trybula current_bufs = test_priv_data->comp_bufs;
10936bbc5a92SArtur Trybula else
10946bbc5a92SArtur Trybula current_bufs = test_priv_data->uncomp_bufs;
10956bbc5a92SArtur Trybula
10966bbc5a92SArtur Trybula /* the mbufs allocation*/
10976bbc5a92SArtur Trybula ret = rte_pktmbuf_alloc_bulk(buf_pool, current_bufs, num_bufs);
10986bbc5a92SArtur Trybula if (ret < 0) {
10996bbc5a92SArtur Trybula RTE_LOG(ERR, USER1,
11006bbc5a92SArtur Trybula "Destination mbufs could not be allocated "
11016bbc5a92SArtur Trybula "from the mempool\n");
11026bbc5a92SArtur Trybula return -1;
11036bbc5a92SArtur Trybula }
11046bbc5a92SArtur Trybula
11056bbc5a92SArtur Trybula if (test_data->use_external_mbufs) {
11066bbc5a92SArtur Trybula current_extbuf_info->free_cb = extbuf_free_callback;
11076bbc5a92SArtur Trybula current_extbuf_info->fcb_opaque = NULL;
11086bbc5a92SArtur Trybula rte_mbuf_ext_refcnt_set(current_extbuf_info, 1);
11096bbc5a92SArtur Trybula if (op_type == OPERATION_COMPRESSION)
11106bbc5a92SArtur Trybula current_memzone = test_data->compbuf_memzone;
11116bbc5a92SArtur Trybula else
11126bbc5a92SArtur Trybula current_memzone = test_data->uncompbuf_memzone;
11136bbc5a92SArtur Trybula
11146bbc5a92SArtur Trybula for (i = 0; i < num_bufs; i++) {
11156bbc5a92SArtur Trybula rte_pktmbuf_attach_extbuf(current_bufs[i],
11166bbc5a92SArtur Trybula current_memzone->addr,
11176bbc5a92SArtur Trybula current_memzone->iova,
11186bbc5a92SArtur Trybula current_memzone->len,
11196bbc5a92SArtur Trybula current_extbuf_info);
11206bbc5a92SArtur Trybula rte_pktmbuf_append(current_bufs[i],
11216bbc5a92SArtur Trybula current_memzone->len);
11226bbc5a92SArtur Trybula }
11236bbc5a92SArtur Trybula } else {
11246bbc5a92SArtur Trybula for (i = 0; i < num_bufs; i++) {
11256bbc5a92SArtur Trybula
1126db06104cSAdam Dybkowski enum rte_comp_huffman comp_huffman =
1127db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman;
1128db06104cSAdam Dybkowski
11296bbc5a92SArtur Trybula /* data size calculation */
11306bbc5a92SArtur Trybula data_size = test_mbufs_calculate_data_size(
11316bbc5a92SArtur Trybula op_type,
11326bbc5a92SArtur Trybula out_of_space_and_zlib,
11336bbc5a92SArtur Trybula test_priv_data,
11346bbc5a92SArtur Trybula int_data,
11356bbc5a92SArtur Trybula test_data,
11366bbc5a92SArtur Trybula i);
11376bbc5a92SArtur Trybula
1138db06104cSAdam Dybkowski if (comp_huffman != RTE_COMP_HUFFMAN_DYNAMIC) {
1139db06104cSAdam Dybkowski if (op_type == OPERATION_DECOMPRESSION)
1140db06104cSAdam Dybkowski data_size *= COMPRESS_BUF_SIZE_RATIO;
1141db06104cSAdam Dybkowski }
1142db06104cSAdam Dybkowski
11436bbc5a92SArtur Trybula /* data allocation */
11446bbc5a92SArtur Trybula if (buff_type == SGL_BOTH || buff_type == LB_TO_SGL) {
11456bbc5a92SArtur Trybula ret = prepare_sgl_bufs(NULL, current_bufs[i],
11466bbc5a92SArtur Trybula data_size,
11476bbc5a92SArtur Trybula big_data ? buf_pool :
11486bbc5a92SArtur Trybula ts_params->small_mbuf_pool,
11496bbc5a92SArtur Trybula big_data ? buf_pool :
11506bbc5a92SArtur Trybula ts_params->large_mbuf_pool,
11516bbc5a92SArtur Trybula big_data ? 0 : MAX_SEGS,
11526bbc5a92SArtur Trybula big_data ? MAX_DATA_MBUF_SIZE :
11536bbc5a92SArtur Trybula SMALL_SEG_SIZE);
11546bbc5a92SArtur Trybula if (ret < 0)
11556bbc5a92SArtur Trybula return -1;
11566bbc5a92SArtur Trybula } else {
11576bbc5a92SArtur Trybula buf_ptr = rte_pktmbuf_append(current_bufs[i],
11586bbc5a92SArtur Trybula data_size);
11592437fbbcSArtur Trybula if (buf_ptr == NULL) {
11602437fbbcSArtur Trybula RTE_LOG(ERR, USER1,
11612437fbbcSArtur Trybula "Append extra bytes to the destination mbuf failed\n");
11626bbc5a92SArtur Trybula return -1;
11632437fbbcSArtur Trybula }
1164a9de470cSBruce Richardson }
1165a9de470cSBruce Richardson }
11666bbc5a92SArtur Trybula }
11676bbc5a92SArtur Trybula
11686bbc5a92SArtur Trybula return 0;
11696bbc5a92SArtur Trybula }
11706bbc5a92SArtur Trybula
11716bbc5a92SArtur Trybula /**
11726bbc5a92SArtur Trybula * The main compression function.
11736bbc5a92SArtur Trybula *
11746bbc5a92SArtur Trybula * Function performs compression operation.
11756bbc5a92SArtur Trybula * Operation(s) configuration, depending on CLI parameters.
11766bbc5a92SArtur Trybula * Operation(s) processing.
11776bbc5a92SArtur Trybula *
11786bbc5a92SArtur Trybula * @param int_data
11796bbc5a92SArtur Trybula * Interim data containing session/transformation objects.
11806bbc5a92SArtur Trybula * @param test_data
11816bbc5a92SArtur Trybula * The test parameters set by users (command line parameters).
11826bbc5a92SArtur Trybula * @param test_priv_data
11836bbc5a92SArtur Trybula * A container used for aggregation all the private test arrays.
11846bbc5a92SArtur Trybula * @return
11856bbc5a92SArtur Trybula * - 0: On success.
11866bbc5a92SArtur Trybula * - -1: On error.
11876bbc5a92SArtur Trybula */
11886bbc5a92SArtur Trybula static int
test_deflate_comp_run(const struct interim_data_params * int_data,const struct test_data_params * test_data,const struct test_private_arrays * test_priv_data)11896bbc5a92SArtur Trybula test_deflate_comp_run(const struct interim_data_params *int_data,
11906bbc5a92SArtur Trybula const struct test_data_params *test_data,
11916bbc5a92SArtur Trybula const struct test_private_arrays *test_priv_data)
11926bbc5a92SArtur Trybula {
11936bbc5a92SArtur Trybula /* local variables: */
11946bbc5a92SArtur Trybula struct priv_op_data *priv_data;
11956bbc5a92SArtur Trybula unsigned int i;
11966bbc5a92SArtur Trybula uint16_t num_priv_xforms = 0;
11976bbc5a92SArtur Trybula int ret;
11986bbc5a92SArtur Trybula int ret_status = 0;
11996bbc5a92SArtur Trybula char *buf_ptr;
12006bbc5a92SArtur Trybula
12016bbc5a92SArtur Trybula struct comp_testsuite_params *ts_params = &testsuite_params;
12026bbc5a92SArtur Trybula
12036bbc5a92SArtur Trybula /* from test_data: */
12046bbc5a92SArtur Trybula enum rte_comp_op_type operation_type = test_data->compress_state;
12056bbc5a92SArtur Trybula unsigned int zlib_compress =
12066bbc5a92SArtur Trybula (test_data->zlib_dir == ZLIB_ALL ||
12076bbc5a92SArtur Trybula test_data->zlib_dir == ZLIB_COMPRESS);
12086bbc5a92SArtur Trybula
12096bbc5a92SArtur Trybula /* from int_data: */
12106bbc5a92SArtur Trybula struct rte_comp_xform **compress_xforms = int_data->compress_xforms;
12116bbc5a92SArtur Trybula unsigned int num_xforms = int_data->num_xforms;
12126bbc5a92SArtur Trybula unsigned int num_bufs = int_data->num_bufs;
12136bbc5a92SArtur Trybula
12146bbc5a92SArtur Trybula /* from test_priv_data: */
12156bbc5a92SArtur Trybula struct rte_mbuf **comp_bufs = test_priv_data->comp_bufs;
12166bbc5a92SArtur Trybula struct rte_mbuf **uncomp_bufs = test_priv_data->uncomp_bufs;
12176bbc5a92SArtur Trybula struct rte_comp_op **ops = test_priv_data->ops;
12186bbc5a92SArtur Trybula struct rte_comp_op **ops_processed = test_priv_data->ops_processed;
12196bbc5a92SArtur Trybula void **priv_xforms = test_priv_data->priv_xforms;
12206bbc5a92SArtur Trybula
12216bbc5a92SArtur Trybula const struct rte_compressdev_capabilities *capa =
12226bbc5a92SArtur Trybula rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
1223a9de470cSBruce Richardson
1224a9de470cSBruce Richardson /* Build the compression operations */
1225a9de470cSBruce Richardson ret = rte_comp_op_bulk_alloc(ts_params->op_pool, ops, num_bufs);
1226a9de470cSBruce Richardson if (ret < 0) {
1227a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
1228a9de470cSBruce Richardson "Compress operations could not be allocated "
1229a9de470cSBruce Richardson "from the mempool\n");
12306bbc5a92SArtur Trybula ret_status = -1;
1231a9de470cSBruce Richardson goto exit;
1232a9de470cSBruce Richardson }
1233a9de470cSBruce Richardson
1234a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
1235a9de470cSBruce Richardson ops[i]->m_src = uncomp_bufs[i];
1236a9de470cSBruce Richardson ops[i]->m_dst = comp_bufs[i];
1237a9de470cSBruce Richardson ops[i]->src.offset = 0;
1238a9de470cSBruce Richardson ops[i]->src.length = rte_pktmbuf_pkt_len(uncomp_bufs[i]);
1239a9de470cSBruce Richardson ops[i]->dst.offset = 0;
12406bbc5a92SArtur Trybula
1241db06104cSAdam Dybkowski RTE_LOG(DEBUG, USER1,
1242db06104cSAdam Dybkowski "Uncompressed buffer length = %u compressed buffer length = %u",
1243db06104cSAdam Dybkowski rte_pktmbuf_pkt_len(uncomp_bufs[i]),
1244db06104cSAdam Dybkowski rte_pktmbuf_pkt_len(comp_bufs[i]));
1245db06104cSAdam Dybkowski
12466bbc5a92SArtur Trybula if (operation_type == RTE_COMP_OP_STATELESS) {
1247a9de470cSBruce Richardson ops[i]->flush_flag = RTE_COMP_FLUSH_FINAL;
12486bbc5a92SArtur Trybula } else {
1249a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
12506bbc5a92SArtur Trybula "Compression: stateful operations are not "
12516bbc5a92SArtur Trybula "supported in these tests yet\n");
12526bbc5a92SArtur Trybula ret_status = -1;
1253a9de470cSBruce Richardson goto exit;
1254a9de470cSBruce Richardson }
1255a9de470cSBruce Richardson ops[i]->input_chksum = 0;
1256a9de470cSBruce Richardson /*
1257a9de470cSBruce Richardson * Store original operation index in private data,
1258a9de470cSBruce Richardson * since ordering does not have to be maintained,
12597be78d02SJosh Soref * when dequeuing from compressdev, so a comparison
1260a9de470cSBruce Richardson * at the end of the test can be done.
1261a9de470cSBruce Richardson */
1262a9de470cSBruce Richardson priv_data = (struct priv_op_data *) (ops[i] + 1);
1263a9de470cSBruce Richardson priv_data->orig_idx = i;
1264a9de470cSBruce Richardson }
1265a9de470cSBruce Richardson
1266a9de470cSBruce Richardson /* Compress data (either with Zlib API or compressdev API */
12676bbc5a92SArtur Trybula if (zlib_compress) {
1268a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
1269a9de470cSBruce Richardson const struct rte_comp_xform *compress_xform =
1270a9de470cSBruce Richardson compress_xforms[i % num_xforms];
1271a9de470cSBruce Richardson ret = compress_zlib(ops[i], compress_xform,
1272a9de470cSBruce Richardson DEFAULT_MEM_LEVEL);
12736bbc5a92SArtur Trybula if (ret < 0) {
12746bbc5a92SArtur Trybula ret_status = -1;
1275a9de470cSBruce Richardson goto exit;
12766bbc5a92SArtur Trybula }
1277a9de470cSBruce Richardson
1278a9de470cSBruce Richardson ops_processed[i] = ops[i];
1279a9de470cSBruce Richardson }
1280a9de470cSBruce Richardson } else {
1281a9de470cSBruce Richardson /* Create compress private xform data */
1282a9de470cSBruce Richardson for (i = 0; i < num_xforms; i++) {
1283a9de470cSBruce Richardson ret = rte_compressdev_private_xform_create(0,
12846bbc5a92SArtur Trybula (const struct rte_comp_xform *)
12856bbc5a92SArtur Trybula compress_xforms[i],
1286a9de470cSBruce Richardson &priv_xforms[i]);
1287a9de470cSBruce Richardson if (ret < 0) {
1288a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
1289a9de470cSBruce Richardson "Compression private xform "
1290a9de470cSBruce Richardson "could not be created\n");
12916bbc5a92SArtur Trybula ret_status = -1;
1292a9de470cSBruce Richardson goto exit;
1293a9de470cSBruce Richardson }
1294a9de470cSBruce Richardson num_priv_xforms++;
1295a9de470cSBruce Richardson }
12962437fbbcSArtur Trybula if (capa->comp_feature_flags &
12972437fbbcSArtur Trybula RTE_COMP_FF_SHAREABLE_PRIV_XFORM) {
1298a9de470cSBruce Richardson /* Attach shareable private xform data to ops */
1299a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++)
13006bbc5a92SArtur Trybula ops[i]->private_xform =
13016bbc5a92SArtur Trybula priv_xforms[i % num_xforms];
1302a9de470cSBruce Richardson } else {
1303a9de470cSBruce Richardson /* Create rest of the private xforms for the other ops */
1304a9de470cSBruce Richardson for (i = num_xforms; i < num_bufs; i++) {
1305a9de470cSBruce Richardson ret = rte_compressdev_private_xform_create(0,
1306a9de470cSBruce Richardson compress_xforms[i % num_xforms],
1307a9de470cSBruce Richardson &priv_xforms[i]);
1308a9de470cSBruce Richardson if (ret < 0) {
1309a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
1310a9de470cSBruce Richardson "Compression private xform "
1311a9de470cSBruce Richardson "could not be created\n");
13126bbc5a92SArtur Trybula ret_status = -1;
1313a9de470cSBruce Richardson goto exit;
1314a9de470cSBruce Richardson }
1315a9de470cSBruce Richardson num_priv_xforms++;
1316a9de470cSBruce Richardson }
1317a9de470cSBruce Richardson /* Attach non shareable private xform data to ops */
1318a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++)
1319a9de470cSBruce Richardson ops[i]->private_xform = priv_xforms[i];
1320a9de470cSBruce Richardson }
1321a9de470cSBruce Richardson
13222437fbbcSArtur Trybula recovery_lb:
13236bbc5a92SArtur Trybula ret = test_run_enqueue_dequeue(ops, ops_processed, num_bufs);
13242437fbbcSArtur Trybula if (ret < 0) {
1325a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
13266bbc5a92SArtur Trybula "Compression: enqueue/dequeue operation failed\n");
13276bbc5a92SArtur Trybula ret_status = -1;
1328a9de470cSBruce Richardson goto exit;
1329a9de470cSBruce Richardson }
1330a9de470cSBruce Richardson
13312437fbbcSArtur Trybula for (i = 0; i < num_bufs; i++) {
13326bbc5a92SArtur Trybula test_priv_data->compressed_data_size[i] +=
13336bbc5a92SArtur Trybula ops_processed[i]->produced;
13342437fbbcSArtur Trybula
13352437fbbcSArtur Trybula if (ops_processed[i]->status ==
13362437fbbcSArtur Trybula RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) {
13372437fbbcSArtur Trybula
13382437fbbcSArtur Trybula ops[i]->status =
13392437fbbcSArtur Trybula RTE_COMP_OP_STATUS_NOT_PROCESSED;
13402437fbbcSArtur Trybula ops[i]->src.offset +=
13412437fbbcSArtur Trybula ops_processed[i]->consumed;
13422437fbbcSArtur Trybula ops[i]->src.length -=
13432437fbbcSArtur Trybula ops_processed[i]->consumed;
13442437fbbcSArtur Trybula ops[i]->dst.offset +=
13452437fbbcSArtur Trybula ops_processed[i]->produced;
13462437fbbcSArtur Trybula
13472437fbbcSArtur Trybula buf_ptr = rte_pktmbuf_append(
13482437fbbcSArtur Trybula ops[i]->m_dst,
13492437fbbcSArtur Trybula ops_processed[i]->produced);
13502437fbbcSArtur Trybula
13512437fbbcSArtur Trybula if (buf_ptr == NULL) {
1352a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
13532437fbbcSArtur Trybula "Data recovery: append extra bytes to the current mbuf failed\n");
13546bbc5a92SArtur Trybula ret_status = -1;
1355a9de470cSBruce Richardson goto exit;
1356a9de470cSBruce Richardson }
13572437fbbcSArtur Trybula goto recovery_lb;
1358a9de470cSBruce Richardson }
13592437fbbcSArtur Trybula }
13606bbc5a92SArtur Trybula }
13616bbc5a92SArtur Trybula
13626bbc5a92SArtur Trybula exit:
13636bbc5a92SArtur Trybula /* Free resources */
13646bbc5a92SArtur Trybula if (ret_status < 0)
13656bbc5a92SArtur Trybula for (i = 0; i < num_bufs; i++) {
13666bbc5a92SArtur Trybula rte_comp_op_free(ops[i]);
1367db06104cSAdam Dybkowski ops[i] = NULL;
13686bbc5a92SArtur Trybula ops_processed[i] = NULL;
13696bbc5a92SArtur Trybula }
1370a9de470cSBruce Richardson
1371a9de470cSBruce Richardson /* Free compress private xforms */
1372a9de470cSBruce Richardson for (i = 0; i < num_priv_xforms; i++) {
13736bbc5a92SArtur Trybula if (priv_xforms[i] != NULL) {
1374a9de470cSBruce Richardson rte_compressdev_private_xform_free(0, priv_xforms[i]);
1375a9de470cSBruce Richardson priv_xforms[i] = NULL;
1376a9de470cSBruce Richardson }
1377a9de470cSBruce Richardson }
1378a9de470cSBruce Richardson
13796bbc5a92SArtur Trybula return ret_status;
13806bbc5a92SArtur Trybula }
13816bbc5a92SArtur Trybula
13826bbc5a92SArtur Trybula /**
13836bbc5a92SArtur Trybula * Prints out the test report. Memory freeing.
13846bbc5a92SArtur Trybula *
13856bbc5a92SArtur Trybula * Called after successful compression.
13866bbc5a92SArtur Trybula * Operation(s) status validation and decompression buffers freeing.
13876bbc5a92SArtur Trybula
13886bbc5a92SArtur Trybula * -1 returned if function fail.
13896bbc5a92SArtur Trybula *
13906bbc5a92SArtur Trybula * @param int_data
13916bbc5a92SArtur Trybula * Interim data containing session/transformation objects.
13926bbc5a92SArtur Trybula * @param test_data
13936bbc5a92SArtur Trybula * The test parameters set by users (command line parameters).
13946bbc5a92SArtur Trybula * @param test_priv_data
13956bbc5a92SArtur Trybula * A container used for aggregation all the private test arrays.
13966bbc5a92SArtur Trybula * @return
13976bbc5a92SArtur Trybula * - 2: Some operation is not supported
13986bbc5a92SArtur Trybula * - 1: Decompression should be skipped
13996bbc5a92SArtur Trybula * - 0: On success.
14006bbc5a92SArtur Trybula * - -1: On error.
14016bbc5a92SArtur Trybula */
14026bbc5a92SArtur Trybula static int
test_deflate_comp_finalize(const struct interim_data_params * int_data,const struct test_data_params * test_data,const struct test_private_arrays * test_priv_data)14036bbc5a92SArtur Trybula test_deflate_comp_finalize(const struct interim_data_params *int_data,
14046bbc5a92SArtur Trybula const struct test_data_params *test_data,
14056bbc5a92SArtur Trybula const struct test_private_arrays *test_priv_data)
14066bbc5a92SArtur Trybula {
14076bbc5a92SArtur Trybula /* local variables: */
14086bbc5a92SArtur Trybula unsigned int i;
14096bbc5a92SArtur Trybula struct priv_op_data *priv_data;
14106bbc5a92SArtur Trybula
14116bbc5a92SArtur Trybula /* from int_data: */
14126bbc5a92SArtur Trybula unsigned int num_xforms = int_data->num_xforms;
14136bbc5a92SArtur Trybula struct rte_comp_xform **compress_xforms = int_data->compress_xforms;
14146bbc5a92SArtur Trybula unsigned int num_bufs = int_data->num_bufs;
14156bbc5a92SArtur Trybula
14166bbc5a92SArtur Trybula /* from test_priv_data: */
14176bbc5a92SArtur Trybula struct rte_comp_op **ops_processed = test_priv_data->ops_processed;
14186bbc5a92SArtur Trybula uint64_t *compress_checksum = test_priv_data->compress_checksum;
14196bbc5a92SArtur Trybula struct rte_mbuf **uncomp_bufs = test_priv_data->uncomp_bufs;
14206bbc5a92SArtur Trybula struct rte_comp_op **ops = test_priv_data->ops;
14216bbc5a92SArtur Trybula
14226bbc5a92SArtur Trybula /* from test_data: */
14236bbc5a92SArtur Trybula unsigned int out_of_space = test_data->out_of_space;
14246bbc5a92SArtur Trybula unsigned int zlib_compress =
14256bbc5a92SArtur Trybula (test_data->zlib_dir == ZLIB_ALL ||
14266bbc5a92SArtur Trybula test_data->zlib_dir == ZLIB_COMPRESS);
14276bbc5a92SArtur Trybula unsigned int zlib_decompress =
14286bbc5a92SArtur Trybula (test_data->zlib_dir == ZLIB_ALL ||
14296bbc5a92SArtur Trybula test_data->zlib_dir == ZLIB_DECOMPRESS);
14306bbc5a92SArtur Trybula
1431a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
1432a9de470cSBruce Richardson priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
1433a9de470cSBruce Richardson uint16_t xform_idx = priv_data->orig_idx % num_xforms;
1434a9de470cSBruce Richardson const struct rte_comp_compress_xform *compress_xform =
1435a9de470cSBruce Richardson &compress_xforms[xform_idx]->compress;
1436a9de470cSBruce Richardson enum rte_comp_huffman huffman_type =
1437a9de470cSBruce Richardson compress_xform->deflate.huffman;
1438a9de470cSBruce Richardson char engine[] = "zlib (directly, not PMD)";
14396bbc5a92SArtur Trybula if (zlib_decompress)
1440a9de470cSBruce Richardson strlcpy(engine, "PMD", sizeof(engine));
1441a9de470cSBruce Richardson
1442a9de470cSBruce Richardson RTE_LOG(DEBUG, USER1, "Buffer %u compressed by %s from %u to"
1443a9de470cSBruce Richardson " %u bytes (level = %d, huffman = %s)\n",
144496fe84f4SRebecca Troy i, engine,
1445a9de470cSBruce Richardson ops_processed[i]->consumed, ops_processed[i]->produced,
1446a9de470cSBruce Richardson compress_xform->level,
1447a9de470cSBruce Richardson huffman_type_strings[huffman_type]);
1448a9de470cSBruce Richardson RTE_LOG(DEBUG, USER1, "Compression ratio = %.2f\n",
1449a9de470cSBruce Richardson ops_processed[i]->consumed == 0 ? 0 :
1450a9de470cSBruce Richardson (float)ops_processed[i]->produced /
1451a9de470cSBruce Richardson ops_processed[i]->consumed * 100);
1452a9de470cSBruce Richardson if (compress_xform->chksum != RTE_COMP_CHECKSUM_NONE)
1453a9de470cSBruce Richardson compress_checksum[i] = ops_processed[i]->output_chksum;
1454a9de470cSBruce Richardson ops[i] = NULL;
1455a9de470cSBruce Richardson }
1456a9de470cSBruce Richardson
1457a9de470cSBruce Richardson /*
1458a9de470cSBruce Richardson * Check operation status and free source mbufs (destination mbuf and
1459a9de470cSBruce Richardson * compress operation information is needed for the decompression stage)
1460a9de470cSBruce Richardson */
1461a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
14626bbc5a92SArtur Trybula if (out_of_space && !zlib_compress) {
1463a9de470cSBruce Richardson if (ops_processed[i]->status !=
1464a9de470cSBruce Richardson RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) {
1465a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
1466a9de470cSBruce Richardson "Operation without expected out of "
1467a9de470cSBruce Richardson "space status error\n");
14686bbc5a92SArtur Trybula return -1;
1469a9de470cSBruce Richardson } else
1470a9de470cSBruce Richardson continue;
1471a9de470cSBruce Richardson }
1472a9de470cSBruce Richardson
1473a9de470cSBruce Richardson if (ops_processed[i]->status != RTE_COMP_OP_STATUS_SUCCESS) {
14746bbc5a92SArtur Trybula if (test_data->overflow == OVERFLOW_ENABLED) {
14752437fbbcSArtur Trybula if (ops_processed[i]->status ==
14762437fbbcSArtur Trybula RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) {
14772437fbbcSArtur Trybula RTE_LOG(INFO, USER1,
14782437fbbcSArtur Trybula "Out-of-space-recoverable functionality"
14792437fbbcSArtur Trybula " is not supported on this device\n");
14806bbc5a92SArtur Trybula return 2;
14812437fbbcSArtur Trybula }
14822437fbbcSArtur Trybula }
14836bbc5a92SArtur Trybula
1484a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
1485db06104cSAdam Dybkowski "Comp: Some operations were not successful\n");
14866bbc5a92SArtur Trybula return -1;
1487a9de470cSBruce Richardson }
1488a9de470cSBruce Richardson priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
1489a9de470cSBruce Richardson rte_pktmbuf_free(uncomp_bufs[priv_data->orig_idx]);
1490a9de470cSBruce Richardson uncomp_bufs[priv_data->orig_idx] = NULL;
1491a9de470cSBruce Richardson }
1492a9de470cSBruce Richardson
14936bbc5a92SArtur Trybula if (out_of_space && !zlib_compress)
14946bbc5a92SArtur Trybula return 1;
14956bbc5a92SArtur Trybula
14966bbc5a92SArtur Trybula return 0;
1497a9de470cSBruce Richardson }
1498a9de470cSBruce Richardson
14996bbc5a92SArtur Trybula /**
15006bbc5a92SArtur Trybula * The main decompression function.
15016bbc5a92SArtur Trybula *
15026bbc5a92SArtur Trybula * Function performs decompression operation.
15036bbc5a92SArtur Trybula * Operation(s) configuration, depending on CLI parameters.
15046bbc5a92SArtur Trybula * Operation(s) processing.
15056bbc5a92SArtur Trybula *
15066bbc5a92SArtur Trybula * @param int_data
15076bbc5a92SArtur Trybula * Interim data containing session/transformation objects.
15086bbc5a92SArtur Trybula * @param test_data
15096bbc5a92SArtur Trybula * The test parameters set by users (command line parameters).
15106bbc5a92SArtur Trybula * @param test_priv_data
15116bbc5a92SArtur Trybula * A container used for aggregation all the private test arrays.
15126bbc5a92SArtur Trybula * @return
15136bbc5a92SArtur Trybula * - 0: On success.
15146bbc5a92SArtur Trybula * - -1: On error.
15156bbc5a92SArtur Trybula */
15166bbc5a92SArtur Trybula static int
test_deflate_decomp_run(const struct interim_data_params * int_data,const struct test_data_params * test_data,struct test_private_arrays * test_priv_data)15176bbc5a92SArtur Trybula test_deflate_decomp_run(const struct interim_data_params *int_data,
15186bbc5a92SArtur Trybula const struct test_data_params *test_data,
15196bbc5a92SArtur Trybula struct test_private_arrays *test_priv_data)
15206bbc5a92SArtur Trybula {
1521a9de470cSBruce Richardson
15226bbc5a92SArtur Trybula /* local variables: */
15236bbc5a92SArtur Trybula struct priv_op_data *priv_data;
15246bbc5a92SArtur Trybula unsigned int i;
15256bbc5a92SArtur Trybula uint16_t num_priv_xforms = 0;
15266bbc5a92SArtur Trybula int ret;
15276bbc5a92SArtur Trybula int ret_status = 0;
1528a9de470cSBruce Richardson
15296bbc5a92SArtur Trybula struct comp_testsuite_params *ts_params = &testsuite_params;
1530a9de470cSBruce Richardson
15316bbc5a92SArtur Trybula /* from test_data: */
15326bbc5a92SArtur Trybula enum rte_comp_op_type operation_type = test_data->decompress_state;
15336bbc5a92SArtur Trybula unsigned int zlib_decompress =
15346bbc5a92SArtur Trybula (test_data->zlib_dir == ZLIB_ALL ||
15356bbc5a92SArtur Trybula test_data->zlib_dir == ZLIB_DECOMPRESS);
1536a9de470cSBruce Richardson
15376bbc5a92SArtur Trybula /* from int_data: */
15386bbc5a92SArtur Trybula struct rte_comp_xform **decompress_xforms = int_data->decompress_xforms;
15396bbc5a92SArtur Trybula unsigned int num_xforms = int_data->num_xforms;
15406bbc5a92SArtur Trybula unsigned int num_bufs = int_data->num_bufs;
1541a9de470cSBruce Richardson
15426bbc5a92SArtur Trybula /* from test_priv_data: */
15436bbc5a92SArtur Trybula struct rte_mbuf **uncomp_bufs = test_priv_data->uncomp_bufs;
1544db06104cSAdam Dybkowski struct rte_mbuf **comp_bufs = test_priv_data->comp_bufs;
15456bbc5a92SArtur Trybula struct rte_comp_op **ops = test_priv_data->ops;
15466bbc5a92SArtur Trybula struct rte_comp_op **ops_processed = test_priv_data->ops_processed;
15476bbc5a92SArtur Trybula void **priv_xforms = test_priv_data->priv_xforms;
15486bbc5a92SArtur Trybula uint32_t *compressed_data_size = test_priv_data->compressed_data_size;
15496bbc5a92SArtur Trybula void **stream = test_priv_data->stream;
15506bbc5a92SArtur Trybula
15516bbc5a92SArtur Trybula const struct rte_compressdev_capabilities *capa =
15526bbc5a92SArtur Trybula rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
15536bbc5a92SArtur Trybula
1554a9de470cSBruce Richardson ret = rte_comp_op_bulk_alloc(ts_params->op_pool, ops, num_bufs);
1555a9de470cSBruce Richardson if (ret < 0) {
1556a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
1557a9de470cSBruce Richardson "Decompress operations could not be allocated "
1558a9de470cSBruce Richardson "from the mempool\n");
15596bbc5a92SArtur Trybula ret_status = -1;
1560a9de470cSBruce Richardson goto exit;
1561a9de470cSBruce Richardson }
1562a9de470cSBruce Richardson
1563a9de470cSBruce Richardson /* Source buffer is the compressed data from the previous operations */
1564a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
1565db06104cSAdam Dybkowski ops[i]->m_src = comp_bufs[i];
1566a9de470cSBruce Richardson ops[i]->m_dst = uncomp_bufs[i];
1567a9de470cSBruce Richardson ops[i]->src.offset = 0;
1568a9de470cSBruce Richardson /*
1569a9de470cSBruce Richardson * Set the length of the compressed data to the
1570a9de470cSBruce Richardson * number of bytes that were produced in the previous stage
1571a9de470cSBruce Richardson */
15726bbc5a92SArtur Trybula
15732437fbbcSArtur Trybula if (compressed_data_size[i])
15742437fbbcSArtur Trybula ops[i]->src.length = compressed_data_size[i];
15752437fbbcSArtur Trybula else
1576a9de470cSBruce Richardson ops[i]->src.length = ops_processed[i]->produced;
157707b810c5SAdam Dybkowski
1578a9de470cSBruce Richardson ops[i]->dst.offset = 0;
15796bbc5a92SArtur Trybula
15806bbc5a92SArtur Trybula if (operation_type == RTE_COMP_OP_STATELESS) {
1581a9de470cSBruce Richardson ops[i]->flush_flag = RTE_COMP_FLUSH_FINAL;
158207b810c5SAdam Dybkowski ops[i]->op_type = RTE_COMP_OP_STATELESS;
15836bbc5a92SArtur Trybula } else if (!zlib_decompress) {
158407b810c5SAdam Dybkowski ops[i]->flush_flag = RTE_COMP_FLUSH_SYNC;
158507b810c5SAdam Dybkowski ops[i]->op_type = RTE_COMP_OP_STATEFUL;
1586a9de470cSBruce Richardson } else {
1587a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
15886bbc5a92SArtur Trybula "Decompression: stateful operations are"
15896bbc5a92SArtur Trybula " not supported in these tests yet\n");
15906bbc5a92SArtur Trybula ret_status = -1;
1591a9de470cSBruce Richardson goto exit;
1592a9de470cSBruce Richardson }
1593a9de470cSBruce Richardson ops[i]->input_chksum = 0;
1594a9de470cSBruce Richardson /*
1595a9de470cSBruce Richardson * Copy private data from previous operations,
1596a9de470cSBruce Richardson * to keep the pointer to the original buffer
1597a9de470cSBruce Richardson */
1598a9de470cSBruce Richardson memcpy(ops[i] + 1, ops_processed[i] + 1,
1599a9de470cSBruce Richardson sizeof(struct priv_op_data));
1600a9de470cSBruce Richardson }
1601a9de470cSBruce Richardson
1602a9de470cSBruce Richardson /*
1603a9de470cSBruce Richardson * Free the previous compress operations,
1604a9de470cSBruce Richardson * as they are not needed anymore
1605a9de470cSBruce Richardson */
1606a9de470cSBruce Richardson rte_comp_op_bulk_free(ops_processed, num_bufs);
1607a9de470cSBruce Richardson
1608a9de470cSBruce Richardson /* Decompress data (either with Zlib API or compressdev API */
16096bbc5a92SArtur Trybula if (zlib_decompress) {
1610a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
1611a9de470cSBruce Richardson priv_data = (struct priv_op_data *)(ops[i] + 1);
1612a9de470cSBruce Richardson uint16_t xform_idx = priv_data->orig_idx % num_xforms;
1613a9de470cSBruce Richardson const struct rte_comp_xform *decompress_xform =
1614a9de470cSBruce Richardson decompress_xforms[xform_idx];
1615a9de470cSBruce Richardson
1616a9de470cSBruce Richardson ret = decompress_zlib(ops[i], decompress_xform);
16176bbc5a92SArtur Trybula if (ret < 0) {
16186bbc5a92SArtur Trybula ret_status = -1;
1619a9de470cSBruce Richardson goto exit;
16206bbc5a92SArtur Trybula }
1621a9de470cSBruce Richardson
1622a9de470cSBruce Richardson ops_processed[i] = ops[i];
1623a9de470cSBruce Richardson }
1624a9de470cSBruce Richardson } else {
16256bbc5a92SArtur Trybula if (operation_type == RTE_COMP_OP_STATELESS) {
1626a9de470cSBruce Richardson /* Create decompress private xform data */
1627a9de470cSBruce Richardson for (i = 0; i < num_xforms; i++) {
1628a9de470cSBruce Richardson ret = rte_compressdev_private_xform_create(0,
162907b810c5SAdam Dybkowski (const struct rte_comp_xform *)
163007b810c5SAdam Dybkowski decompress_xforms[i],
1631a9de470cSBruce Richardson &priv_xforms[i]);
1632a9de470cSBruce Richardson if (ret < 0) {
1633a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
1634a9de470cSBruce Richardson "Decompression private xform "
1635a9de470cSBruce Richardson "could not be created\n");
16366bbc5a92SArtur Trybula ret_status = -1;
1637a9de470cSBruce Richardson goto exit;
1638a9de470cSBruce Richardson }
1639a9de470cSBruce Richardson num_priv_xforms++;
1640a9de470cSBruce Richardson }
1641a9de470cSBruce Richardson
164207b810c5SAdam Dybkowski if (capa->comp_feature_flags &
164307b810c5SAdam Dybkowski RTE_COMP_FF_SHAREABLE_PRIV_XFORM) {
1644a9de470cSBruce Richardson /* Attach shareable private xform data to ops */
1645a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
164607b810c5SAdam Dybkowski priv_data = (struct priv_op_data *)
164707b810c5SAdam Dybkowski (ops[i] + 1);
164807b810c5SAdam Dybkowski uint16_t xform_idx =
164907b810c5SAdam Dybkowski priv_data->orig_idx % num_xforms;
165007b810c5SAdam Dybkowski ops[i]->private_xform =
165107b810c5SAdam Dybkowski priv_xforms[xform_idx];
1652a9de470cSBruce Richardson }
1653a9de470cSBruce Richardson } else {
165407b810c5SAdam Dybkowski /* Create rest of the private xforms */
165507b810c5SAdam Dybkowski /* for the other ops */
1656a9de470cSBruce Richardson for (i = num_xforms; i < num_bufs; i++) {
165707b810c5SAdam Dybkowski ret =
165807b810c5SAdam Dybkowski rte_compressdev_private_xform_create(0,
1659a9de470cSBruce Richardson decompress_xforms[i % num_xforms],
1660a9de470cSBruce Richardson &priv_xforms[i]);
1661a9de470cSBruce Richardson if (ret < 0) {
1662a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
16636bbc5a92SArtur Trybula "Decompression private xform"
16646bbc5a92SArtur Trybula " could not be created\n");
16656bbc5a92SArtur Trybula ret_status = -1;
1666a9de470cSBruce Richardson goto exit;
1667a9de470cSBruce Richardson }
1668a9de470cSBruce Richardson num_priv_xforms++;
1669a9de470cSBruce Richardson }
1670a9de470cSBruce Richardson
167107b810c5SAdam Dybkowski /* Attach non shareable private xform data */
167207b810c5SAdam Dybkowski /* to ops */
1673a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
167407b810c5SAdam Dybkowski priv_data = (struct priv_op_data *)
167507b810c5SAdam Dybkowski (ops[i] + 1);
167607b810c5SAdam Dybkowski uint16_t xform_idx =
167707b810c5SAdam Dybkowski priv_data->orig_idx;
167807b810c5SAdam Dybkowski ops[i]->private_xform =
167907b810c5SAdam Dybkowski priv_xforms[xform_idx];
1680a9de470cSBruce Richardson }
1681a9de470cSBruce Richardson }
168207b810c5SAdam Dybkowski } else {
168307b810c5SAdam Dybkowski /* Create a stream object for stateful decompression */
168407b810c5SAdam Dybkowski ret = rte_compressdev_stream_create(0,
16856bbc5a92SArtur Trybula decompress_xforms[0], stream);
168607b810c5SAdam Dybkowski if (ret < 0) {
168707b810c5SAdam Dybkowski RTE_LOG(ERR, USER1,
168807b810c5SAdam Dybkowski "Decompression stream could not be created, error %d\n",
168907b810c5SAdam Dybkowski ret);
16906bbc5a92SArtur Trybula ret_status = -1;
169107b810c5SAdam Dybkowski goto exit;
169207b810c5SAdam Dybkowski }
169307b810c5SAdam Dybkowski /* Attach stream to ops */
169407b810c5SAdam Dybkowski for (i = 0; i < num_bufs; i++)
16956bbc5a92SArtur Trybula ops[i]->stream = *stream;
169607b810c5SAdam Dybkowski }
1697a9de470cSBruce Richardson
16986bbc5a92SArtur Trybula test_priv_data->num_priv_xforms = num_priv_xforms;
1699a9de470cSBruce Richardson }
1700a9de470cSBruce Richardson
17016bbc5a92SArtur Trybula exit:
17026bbc5a92SArtur Trybula return ret_status;
17036bbc5a92SArtur Trybula }
17046bbc5a92SArtur Trybula
17056bbc5a92SArtur Trybula /**
17066bbc5a92SArtur Trybula * Prints out the test report. Memory freeing.
17076bbc5a92SArtur Trybula *
17086bbc5a92SArtur Trybula * Called after successful decompression.
17096bbc5a92SArtur Trybula * Operation(s) status validation and compression buffers freeing.
17106bbc5a92SArtur Trybula
17116bbc5a92SArtur Trybula * -1 returned if function fail.
17126bbc5a92SArtur Trybula *
17136bbc5a92SArtur Trybula * @param int_data
17146bbc5a92SArtur Trybula * Interim data containing session/transformation objects.
17156bbc5a92SArtur Trybula * @param test_data
17166bbc5a92SArtur Trybula * The test parameters set by users (command line parameters).
17176bbc5a92SArtur Trybula * @param test_priv_data
17186bbc5a92SArtur Trybula * A container used for aggregation all the private test arrays.
17196bbc5a92SArtur Trybula * @return
17206bbc5a92SArtur Trybula * - 2: Next step must be executed by the caller (stateful decompression only)
17216bbc5a92SArtur Trybula * - 1: On success (caller should stop and exit)
17226bbc5a92SArtur Trybula * - 0: On success.
17236bbc5a92SArtur Trybula * - -1: On error.
1724a9de470cSBruce Richardson */
17256bbc5a92SArtur Trybula static int
test_deflate_decomp_finalize(const struct interim_data_params * int_data,const struct test_data_params * test_data,const struct test_private_arrays * test_priv_data)17266bbc5a92SArtur Trybula test_deflate_decomp_finalize(const struct interim_data_params *int_data,
17276bbc5a92SArtur Trybula const struct test_data_params *test_data,
17286bbc5a92SArtur Trybula const struct test_private_arrays *test_priv_data)
17296bbc5a92SArtur Trybula {
17306bbc5a92SArtur Trybula /* local variables: */
17316bbc5a92SArtur Trybula unsigned int i;
17326bbc5a92SArtur Trybula struct priv_op_data *priv_data;
17336bbc5a92SArtur Trybula static unsigned int step;
1734a9de470cSBruce Richardson
17356bbc5a92SArtur Trybula /* from int_data: */
17366bbc5a92SArtur Trybula unsigned int num_bufs = int_data->num_bufs;
17376bbc5a92SArtur Trybula const char * const *test_bufs = int_data->test_bufs;
17386bbc5a92SArtur Trybula struct rte_comp_xform **compress_xforms = int_data->compress_xforms;
17396bbc5a92SArtur Trybula
17406bbc5a92SArtur Trybula /* from test_priv_data: */
17416bbc5a92SArtur Trybula struct rte_comp_op **ops_processed = test_priv_data->ops_processed;
17426bbc5a92SArtur Trybula struct rte_mbuf **comp_bufs = test_priv_data->comp_bufs;
17436bbc5a92SArtur Trybula struct rte_comp_op **ops = test_priv_data->ops;
17446bbc5a92SArtur Trybula uint64_t *compress_checksum = test_priv_data->compress_checksum;
17456bbc5a92SArtur Trybula unsigned int *decomp_produced_data_size =
17466bbc5a92SArtur Trybula test_priv_data->decomp_produced_data_size;
17476bbc5a92SArtur Trybula char **all_decomp_data = test_priv_data->all_decomp_data;
17486bbc5a92SArtur Trybula
17496bbc5a92SArtur Trybula /* from test_data: */
17506bbc5a92SArtur Trybula unsigned int out_of_space = test_data->out_of_space;
17516bbc5a92SArtur Trybula enum rte_comp_op_type operation_type = test_data->decompress_state;
17526bbc5a92SArtur Trybula
17536bbc5a92SArtur Trybula unsigned int zlib_compress =
17546bbc5a92SArtur Trybula (test_data->zlib_dir == ZLIB_ALL ||
17556bbc5a92SArtur Trybula test_data->zlib_dir == ZLIB_COMPRESS);
17566bbc5a92SArtur Trybula unsigned int zlib_decompress =
17576bbc5a92SArtur Trybula (test_data->zlib_dir == ZLIB_ALL ||
17586bbc5a92SArtur Trybula test_data->zlib_dir == ZLIB_DECOMPRESS);
1759a9de470cSBruce Richardson
1760a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
1761a9de470cSBruce Richardson priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
1762a9de470cSBruce Richardson char engine[] = "zlib, (directly, no PMD)";
17636bbc5a92SArtur Trybula if (zlib_compress)
1764a9de470cSBruce Richardson strlcpy(engine, "pmd", sizeof(engine));
1765a9de470cSBruce Richardson RTE_LOG(DEBUG, USER1,
1766a9de470cSBruce Richardson "Buffer %u decompressed by %s from %u to %u bytes\n",
176796fe84f4SRebecca Troy i, engine,
1768a9de470cSBruce Richardson ops_processed[i]->consumed, ops_processed[i]->produced);
1769a9de470cSBruce Richardson ops[i] = NULL;
1770a9de470cSBruce Richardson }
1771a9de470cSBruce Richardson
1772a9de470cSBruce Richardson /*
1773a9de470cSBruce Richardson * Check operation status and free source mbuf (destination mbuf and
1774a9de470cSBruce Richardson * compress operation information is still needed)
1775a9de470cSBruce Richardson */
1776a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
17776bbc5a92SArtur Trybula if (out_of_space && !zlib_decompress) {
1778a9de470cSBruce Richardson if (ops_processed[i]->status !=
1779a9de470cSBruce Richardson RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) {
17806bbc5a92SArtur Trybula
1781a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
1782a9de470cSBruce Richardson "Operation without expected out of "
1783a9de470cSBruce Richardson "space status error\n");
17846bbc5a92SArtur Trybula return -1;
1785a9de470cSBruce Richardson } else
1786a9de470cSBruce Richardson continue;
1787a9de470cSBruce Richardson }
1788a9de470cSBruce Richardson
17896bbc5a92SArtur Trybula if (operation_type == RTE_COMP_OP_STATEFUL
179007b810c5SAdam Dybkowski && (ops_processed[i]->status ==
179107b810c5SAdam Dybkowski RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE
179207b810c5SAdam Dybkowski || ops_processed[i]->status ==
179307b810c5SAdam Dybkowski RTE_COMP_OP_STATUS_SUCCESS)) {
1794db06104cSAdam Dybkowski
1795db06104cSAdam Dybkowski RTE_LOG(DEBUG, USER1,
1796db06104cSAdam Dybkowski ".............RECOVERABLE\n");
1797db06104cSAdam Dybkowski
179807b810c5SAdam Dybkowski /* collect the output into all_decomp_data */
179907b810c5SAdam Dybkowski const void *ptr = rte_pktmbuf_read(
180007b810c5SAdam Dybkowski ops_processed[i]->m_dst,
180107b810c5SAdam Dybkowski ops_processed[i]->dst.offset,
180207b810c5SAdam Dybkowski ops_processed[i]->produced,
18036bbc5a92SArtur Trybula *all_decomp_data +
18046bbc5a92SArtur Trybula *decomp_produced_data_size);
18056bbc5a92SArtur Trybula if (ptr != *all_decomp_data +
18066bbc5a92SArtur Trybula *decomp_produced_data_size)
18076bbc5a92SArtur Trybula rte_memcpy(*all_decomp_data +
18086bbc5a92SArtur Trybula *decomp_produced_data_size,
180907b810c5SAdam Dybkowski ptr, ops_processed[i]->produced);
18106bbc5a92SArtur Trybula
18116bbc5a92SArtur Trybula *decomp_produced_data_size +=
18126bbc5a92SArtur Trybula ops_processed[i]->produced;
181307b810c5SAdam Dybkowski if (ops_processed[i]->src.length >
181407b810c5SAdam Dybkowski ops_processed[i]->consumed) {
181507b810c5SAdam Dybkowski if (ops_processed[i]->status ==
181607b810c5SAdam Dybkowski RTE_COMP_OP_STATUS_SUCCESS) {
181707b810c5SAdam Dybkowski RTE_LOG(ERR, USER1,
181807b810c5SAdam Dybkowski "Operation finished too early\n");
18196bbc5a92SArtur Trybula return -1;
182007b810c5SAdam Dybkowski }
182107b810c5SAdam Dybkowski step++;
182207b810c5SAdam Dybkowski if (step >= test_data->decompress_steps_max) {
182307b810c5SAdam Dybkowski RTE_LOG(ERR, USER1,
182407b810c5SAdam Dybkowski "Operation exceeded maximum steps\n");
18256bbc5a92SArtur Trybula return -1;
182607b810c5SAdam Dybkowski }
182707b810c5SAdam Dybkowski ops[i] = ops_processed[i];
182807b810c5SAdam Dybkowski ops[i]->status =
182907b810c5SAdam Dybkowski RTE_COMP_OP_STATUS_NOT_PROCESSED;
183007b810c5SAdam Dybkowski ops[i]->src.offset +=
183107b810c5SAdam Dybkowski ops_processed[i]->consumed;
183207b810c5SAdam Dybkowski ops[i]->src.length -=
183307b810c5SAdam Dybkowski ops_processed[i]->consumed;
18346bbc5a92SArtur Trybula /* repeat the operation */
18356bbc5a92SArtur Trybula return 2;
183607b810c5SAdam Dybkowski } else {
183707b810c5SAdam Dybkowski /* Compare the original stream with the */
183807b810c5SAdam Dybkowski /* decompressed stream (in size and the data) */
183907b810c5SAdam Dybkowski priv_data = (struct priv_op_data *)
184007b810c5SAdam Dybkowski (ops_processed[i] + 1);
184107b810c5SAdam Dybkowski const char *buf1 =
184207b810c5SAdam Dybkowski test_bufs[priv_data->orig_idx];
18436bbc5a92SArtur Trybula const char *buf2 = *all_decomp_data;
184407b810c5SAdam Dybkowski
184507b810c5SAdam Dybkowski if (compare_buffers(buf1, strlen(buf1) + 1,
18466bbc5a92SArtur Trybula buf2, *decomp_produced_data_size) < 0)
18476bbc5a92SArtur Trybula return -1;
184807b810c5SAdam Dybkowski /* Test checksums */
184907b810c5SAdam Dybkowski if (compress_xforms[0]->compress.chksum
185007b810c5SAdam Dybkowski != RTE_COMP_CHECKSUM_NONE) {
185107b810c5SAdam Dybkowski if (ops_processed[i]->output_chksum
185207b810c5SAdam Dybkowski != compress_checksum[i]) {
185307b810c5SAdam Dybkowski RTE_LOG(ERR, USER1,
185407b810c5SAdam Dybkowski "The checksums differ\n"
185507b810c5SAdam Dybkowski "Compression Checksum: %" PRIu64 "\tDecompression "
185607b810c5SAdam Dybkowski "Checksum: %" PRIu64 "\n", compress_checksum[i],
185707b810c5SAdam Dybkowski ops_processed[i]->output_chksum);
18586bbc5a92SArtur Trybula return -1;
185907b810c5SAdam Dybkowski }
186007b810c5SAdam Dybkowski }
186107b810c5SAdam Dybkowski }
186207b810c5SAdam Dybkowski } else if (ops_processed[i]->status !=
186307b810c5SAdam Dybkowski RTE_COMP_OP_STATUS_SUCCESS) {
1864a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
1865db06104cSAdam Dybkowski "Decomp: Some operations were not successful, status = %u\n",
1866db06104cSAdam Dybkowski ops_processed[i]->status);
18676bbc5a92SArtur Trybula return -1;
1868a9de470cSBruce Richardson }
1869a9de470cSBruce Richardson priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
1870a9de470cSBruce Richardson rte_pktmbuf_free(comp_bufs[priv_data->orig_idx]);
1871a9de470cSBruce Richardson comp_bufs[priv_data->orig_idx] = NULL;
1872a9de470cSBruce Richardson }
1873a9de470cSBruce Richardson
18746bbc5a92SArtur Trybula if (out_of_space && !zlib_decompress)
18756bbc5a92SArtur Trybula return 1;
18766bbc5a92SArtur Trybula
18776bbc5a92SArtur Trybula return 0;
1878a9de470cSBruce Richardson }
1879a9de470cSBruce Richardson
18806bbc5a92SArtur Trybula /**
18816bbc5a92SArtur Trybula * Validation of the output (compression/decompression) data.
18826bbc5a92SArtur Trybula *
18836bbc5a92SArtur Trybula * The function compares the source stream with the output stream,
18846bbc5a92SArtur Trybula * after decompression, to check if compression/decompression
18856bbc5a92SArtur Trybula * was correct.
18866bbc5a92SArtur Trybula * -1 returned if function fail.
18876bbc5a92SArtur Trybula *
18886bbc5a92SArtur Trybula * @param int_data
18896bbc5a92SArtur Trybula * Interim data containing session/transformation objects.
18906bbc5a92SArtur Trybula * @param test_data
18916bbc5a92SArtur Trybula * The test parameters set by users (command line parameters).
18926bbc5a92SArtur Trybula * @param test_priv_data
18936bbc5a92SArtur Trybula * A container used for aggregation all the private test arrays.
18946bbc5a92SArtur Trybula * @return
18956bbc5a92SArtur Trybula * - 0: On success.
18966bbc5a92SArtur Trybula * - -1: On error.
18976bbc5a92SArtur Trybula */
18986bbc5a92SArtur Trybula static int
test_results_validation(const struct interim_data_params * int_data,const struct test_data_params * test_data,const struct test_private_arrays * test_priv_data)18996bbc5a92SArtur Trybula test_results_validation(const struct interim_data_params *int_data,
19006bbc5a92SArtur Trybula const struct test_data_params *test_data,
19016bbc5a92SArtur Trybula const struct test_private_arrays *test_priv_data)
19026bbc5a92SArtur Trybula {
19036bbc5a92SArtur Trybula /* local variables: */
19046bbc5a92SArtur Trybula unsigned int i;
19056bbc5a92SArtur Trybula struct priv_op_data *priv_data;
19066bbc5a92SArtur Trybula const char *buf1;
19076bbc5a92SArtur Trybula const char *buf2;
19086bbc5a92SArtur Trybula char *contig_buf = NULL;
19096bbc5a92SArtur Trybula uint32_t data_size;
19106bbc5a92SArtur Trybula
19116bbc5a92SArtur Trybula /* from int_data: */
19126bbc5a92SArtur Trybula struct rte_comp_xform **compress_xforms = int_data->compress_xforms;
19136bbc5a92SArtur Trybula unsigned int num_bufs = int_data->num_bufs;
19146bbc5a92SArtur Trybula const char * const *test_bufs = int_data->test_bufs;
19156bbc5a92SArtur Trybula
19166bbc5a92SArtur Trybula /* from test_priv_data: */
19176bbc5a92SArtur Trybula uint64_t *compress_checksum = test_priv_data->compress_checksum;
19186bbc5a92SArtur Trybula struct rte_comp_op **ops_processed = test_priv_data->ops_processed;
19196bbc5a92SArtur Trybula
1920a9de470cSBruce Richardson /*
1921a9de470cSBruce Richardson * Compare the original stream with the decompressed stream
1922a9de470cSBruce Richardson * (in size and the data)
1923a9de470cSBruce Richardson */
1924a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
1925a9de470cSBruce Richardson priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
19266bbc5a92SArtur Trybula buf1 = test_data->use_external_mbufs ?
19273fc3996fSAdam Dybkowski test_data->inbuf_memzone->addr :
19283fc3996fSAdam Dybkowski test_bufs[priv_data->orig_idx];
19293fc3996fSAdam Dybkowski data_size = test_data->use_external_mbufs ?
19303fc3996fSAdam Dybkowski test_data->inbuf_data_size :
19313fc3996fSAdam Dybkowski strlen(buf1) + 1;
19326bbc5a92SArtur Trybula
1933a9de470cSBruce Richardson contig_buf = rte_malloc(NULL, ops_processed[i]->produced, 0);
1934a9de470cSBruce Richardson if (contig_buf == NULL) {
1935a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Contiguous buffer could not "
1936a9de470cSBruce Richardson "be allocated\n");
1937a9de470cSBruce Richardson goto exit;
1938a9de470cSBruce Richardson }
1939a9de470cSBruce Richardson
1940a9de470cSBruce Richardson buf2 = rte_pktmbuf_read(ops_processed[i]->m_dst, 0,
1941a9de470cSBruce Richardson ops_processed[i]->produced, contig_buf);
19423fc3996fSAdam Dybkowski if (compare_buffers(buf1, data_size,
1943a9de470cSBruce Richardson buf2, ops_processed[i]->produced) < 0)
1944a9de470cSBruce Richardson goto exit;
1945a9de470cSBruce Richardson
1946a9de470cSBruce Richardson /* Test checksums */
1947a9de470cSBruce Richardson if (compress_xforms[0]->compress.chksum !=
1948a9de470cSBruce Richardson RTE_COMP_CHECKSUM_NONE) {
1949a9de470cSBruce Richardson if (ops_processed[i]->output_chksum !=
1950a9de470cSBruce Richardson compress_checksum[i]) {
1951a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "The checksums differ\n"
1952a9de470cSBruce Richardson "Compression Checksum: %" PRIu64 "\tDecompression "
1953a9de470cSBruce Richardson "Checksum: %" PRIu64 "\n", compress_checksum[i],
1954a9de470cSBruce Richardson ops_processed[i]->output_chksum);
1955a9de470cSBruce Richardson goto exit;
1956a9de470cSBruce Richardson }
1957a9de470cSBruce Richardson }
1958a9de470cSBruce Richardson
1959a9de470cSBruce Richardson rte_free(contig_buf);
1960a9de470cSBruce Richardson contig_buf = NULL;
1961a9de470cSBruce Richardson }
19626bbc5a92SArtur Trybula return 0;
1963a9de470cSBruce Richardson
19646bbc5a92SArtur Trybula exit:
19656bbc5a92SArtur Trybula rte_free(contig_buf);
19666bbc5a92SArtur Trybula return -1;
19676bbc5a92SArtur Trybula }
19686bbc5a92SArtur Trybula
19696bbc5a92SArtur Trybula /**
19706bbc5a92SArtur Trybula * Compresses and decompresses input stream with compressdev API and Zlib API
19716bbc5a92SArtur Trybula *
19726bbc5a92SArtur Trybula * Basic test function. Common for all the functional tests.
19736bbc5a92SArtur Trybula * -1 returned if function fail.
19746bbc5a92SArtur Trybula *
19756bbc5a92SArtur Trybula * @param int_data
19766bbc5a92SArtur Trybula * Interim data containing session/transformation objects.
19776bbc5a92SArtur Trybula * @param test_data
19786bbc5a92SArtur Trybula * The test parameters set by users (command line parameters).
19796bbc5a92SArtur Trybula * @return
19806bbc5a92SArtur Trybula * - 1: Some operation not supported
19816bbc5a92SArtur Trybula * - 0: On success.
19826bbc5a92SArtur Trybula * - -1: On error.
19836bbc5a92SArtur Trybula */
19846bbc5a92SArtur Trybula
19856bbc5a92SArtur Trybula static int
test_deflate_comp_decomp(const struct interim_data_params * int_data,const struct test_data_params * test_data)19866bbc5a92SArtur Trybula test_deflate_comp_decomp(const struct interim_data_params *int_data,
19876bbc5a92SArtur Trybula const struct test_data_params *test_data)
19886bbc5a92SArtur Trybula {
19896bbc5a92SArtur Trybula unsigned int num_bufs = int_data->num_bufs;
19906bbc5a92SArtur Trybula unsigned int out_of_space = test_data->out_of_space;
19916bbc5a92SArtur Trybula
19926bbc5a92SArtur Trybula void *stream = NULL;
19936bbc5a92SArtur Trybula char *all_decomp_data = NULL;
19946bbc5a92SArtur Trybula unsigned int decomp_produced_data_size = 0;
19956bbc5a92SArtur Trybula
19966bbc5a92SArtur Trybula int ret_status = -1;
19976bbc5a92SArtur Trybula int ret;
19986bbc5a92SArtur Trybula struct rte_mbuf *uncomp_bufs[num_bufs];
19996bbc5a92SArtur Trybula struct rte_mbuf *comp_bufs[num_bufs];
20006bbc5a92SArtur Trybula struct rte_comp_op *ops[num_bufs];
20016bbc5a92SArtur Trybula struct rte_comp_op *ops_processed[num_bufs];
20026bbc5a92SArtur Trybula void *priv_xforms[num_bufs];
20036bbc5a92SArtur Trybula unsigned int i;
20046bbc5a92SArtur Trybula
20056bbc5a92SArtur Trybula uint64_t compress_checksum[num_bufs];
20066bbc5a92SArtur Trybula uint32_t compressed_data_size[num_bufs];
20076bbc5a92SArtur Trybula char *contig_buf = NULL;
20086bbc5a92SArtur Trybula
20096bbc5a92SArtur Trybula struct rte_mbuf_ext_shared_info compbuf_info;
20106bbc5a92SArtur Trybula struct rte_mbuf_ext_shared_info decompbuf_info;
20116bbc5a92SArtur Trybula
20126bbc5a92SArtur Trybula const struct rte_compressdev_capabilities *capa;
20136bbc5a92SArtur Trybula
20146bbc5a92SArtur Trybula /* Compressing with CompressDev */
20156bbc5a92SArtur Trybula unsigned int zlib_compress =
20166bbc5a92SArtur Trybula (test_data->zlib_dir == ZLIB_ALL ||
20176bbc5a92SArtur Trybula test_data->zlib_dir == ZLIB_COMPRESS);
20186bbc5a92SArtur Trybula unsigned int zlib_decompress =
20196bbc5a92SArtur Trybula (test_data->zlib_dir == ZLIB_ALL ||
20206bbc5a92SArtur Trybula test_data->zlib_dir == ZLIB_DECOMPRESS);
20216bbc5a92SArtur Trybula
20226bbc5a92SArtur Trybula struct test_private_arrays test_priv_data;
20236bbc5a92SArtur Trybula
20246bbc5a92SArtur Trybula test_priv_data.uncomp_bufs = uncomp_bufs;
20256bbc5a92SArtur Trybula test_priv_data.comp_bufs = comp_bufs;
20266bbc5a92SArtur Trybula test_priv_data.ops = ops;
20276bbc5a92SArtur Trybula test_priv_data.ops_processed = ops_processed;
20286bbc5a92SArtur Trybula test_priv_data.priv_xforms = priv_xforms;
20296bbc5a92SArtur Trybula test_priv_data.compress_checksum = compress_checksum;
20306bbc5a92SArtur Trybula test_priv_data.compressed_data_size = compressed_data_size;
20316bbc5a92SArtur Trybula
20326bbc5a92SArtur Trybula test_priv_data.stream = &stream;
20336bbc5a92SArtur Trybula test_priv_data.all_decomp_data = &all_decomp_data;
20346bbc5a92SArtur Trybula test_priv_data.decomp_produced_data_size = &decomp_produced_data_size;
20356bbc5a92SArtur Trybula
20364a6672c2SStephen Hemminger test_priv_data.num_priv_xforms = 0; /* it's used for decompression only */
20376bbc5a92SArtur Trybula
20386bbc5a92SArtur Trybula capa = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
20396bbc5a92SArtur Trybula if (capa == NULL) {
20406bbc5a92SArtur Trybula RTE_LOG(ERR, USER1,
20416bbc5a92SArtur Trybula "Compress device does not support DEFLATE\n");
20426bbc5a92SArtur Trybula return -1;
20436bbc5a92SArtur Trybula }
20446bbc5a92SArtur Trybula
20456bbc5a92SArtur Trybula /* Prepare the source mbufs with the data */
20466bbc5a92SArtur Trybula ret = test_setup_com_bufs(int_data, test_data, &test_priv_data);
20476bbc5a92SArtur Trybula if (ret < 0) {
20486bbc5a92SArtur Trybula ret_status = -1;
20496bbc5a92SArtur Trybula goto exit;
20506bbc5a92SArtur Trybula }
20516bbc5a92SArtur Trybula
2052db06104cSAdam Dybkowski RTE_LOG(DEBUG, USER1, "<<< COMPRESSION >>>\n");
2053db06104cSAdam Dybkowski
20546bbc5a92SArtur Trybula /* COMPRESSION */
20556bbc5a92SArtur Trybula
20566bbc5a92SArtur Trybula /* Prepare output (destination) mbufs for compressed data */
20576bbc5a92SArtur Trybula ret = test_setup_output_bufs(
20586bbc5a92SArtur Trybula OPERATION_COMPRESSION,
20596bbc5a92SArtur Trybula out_of_space == 1 && !zlib_compress,
20606bbc5a92SArtur Trybula &test_priv_data,
20616bbc5a92SArtur Trybula int_data,
20626bbc5a92SArtur Trybula test_data,
20636bbc5a92SArtur Trybula &compbuf_info);
20646bbc5a92SArtur Trybula if (ret < 0) {
20656bbc5a92SArtur Trybula ret_status = -1;
20666bbc5a92SArtur Trybula goto exit;
20676bbc5a92SArtur Trybula }
20686bbc5a92SArtur Trybula
20696bbc5a92SArtur Trybula /* Run compression */
20706bbc5a92SArtur Trybula ret = test_deflate_comp_run(int_data, test_data, &test_priv_data);
20716bbc5a92SArtur Trybula if (ret < 0) {
20726bbc5a92SArtur Trybula ret_status = -1;
20736bbc5a92SArtur Trybula goto exit;
20746bbc5a92SArtur Trybula }
20756bbc5a92SArtur Trybula
20766bbc5a92SArtur Trybula ret = test_deflate_comp_finalize(int_data, test_data, &test_priv_data);
20776bbc5a92SArtur Trybula if (ret < 0) {
20786bbc5a92SArtur Trybula ret_status = -1;
20796bbc5a92SArtur Trybula goto exit;
20806bbc5a92SArtur Trybula } else if (ret == 1) {
20816bbc5a92SArtur Trybula ret_status = 0;
20826bbc5a92SArtur Trybula goto exit;
20836bbc5a92SArtur Trybula } else if (ret == 2) {
20846bbc5a92SArtur Trybula ret_status = 1; /* some operation not supported */
20856bbc5a92SArtur Trybula goto exit;
20866bbc5a92SArtur Trybula }
20876bbc5a92SArtur Trybula
20886bbc5a92SArtur Trybula /* DECOMPRESSION */
20896bbc5a92SArtur Trybula
2090db06104cSAdam Dybkowski RTE_LOG(DEBUG, USER1, "<<< DECOMPRESSION >>>\n");
2091db06104cSAdam Dybkowski
20926bbc5a92SArtur Trybula /* Prepare output (destination) mbufs for decompressed data */
20936bbc5a92SArtur Trybula ret = test_setup_output_bufs(
20946bbc5a92SArtur Trybula OPERATION_DECOMPRESSION,
20956bbc5a92SArtur Trybula out_of_space == 1 && !zlib_decompress,
20966bbc5a92SArtur Trybula &test_priv_data,
20976bbc5a92SArtur Trybula int_data,
20986bbc5a92SArtur Trybula test_data,
20996bbc5a92SArtur Trybula &decompbuf_info);
21006bbc5a92SArtur Trybula if (ret < 0) {
21016bbc5a92SArtur Trybula ret_status = -1;
21026bbc5a92SArtur Trybula goto exit;
21036bbc5a92SArtur Trybula }
21046bbc5a92SArtur Trybula
21056bbc5a92SArtur Trybula /* Run decompression */
21066bbc5a92SArtur Trybula ret = test_deflate_decomp_run(int_data, test_data, &test_priv_data);
21076bbc5a92SArtur Trybula if (ret < 0) {
21086bbc5a92SArtur Trybula ret_status = -1;
21096bbc5a92SArtur Trybula goto exit;
21106bbc5a92SArtur Trybula }
21116bbc5a92SArtur Trybula
21126bbc5a92SArtur Trybula if (!zlib_decompress) {
21136bbc5a92SArtur Trybula next_step: /* next step for stateful decompression only */
21146bbc5a92SArtur Trybula ret = test_run_enqueue_dequeue(ops, ops_processed, num_bufs);
21156bbc5a92SArtur Trybula if (ret < 0) {
21166bbc5a92SArtur Trybula ret_status = -1;
21176bbc5a92SArtur Trybula RTE_LOG(ERR, USER1,
21186bbc5a92SArtur Trybula "Decompression: enqueue/dequeue operation failed\n");
21196bbc5a92SArtur Trybula }
21206bbc5a92SArtur Trybula }
21216bbc5a92SArtur Trybula
21226bbc5a92SArtur Trybula ret = test_deflate_decomp_finalize(int_data, test_data, &test_priv_data);
21236bbc5a92SArtur Trybula if (ret < 0) {
21246bbc5a92SArtur Trybula ret_status = -1;
21256bbc5a92SArtur Trybula goto exit;
21266bbc5a92SArtur Trybula } else if (ret == 1) {
21276bbc5a92SArtur Trybula ret_status = 0;
21286bbc5a92SArtur Trybula goto exit;
21296bbc5a92SArtur Trybula } else if (ret == 2) {
21306bbc5a92SArtur Trybula goto next_step;
21316bbc5a92SArtur Trybula }
21326bbc5a92SArtur Trybula
21336bbc5a92SArtur Trybula /* FINAL PROCESSING */
21346bbc5a92SArtur Trybula
21356bbc5a92SArtur Trybula ret = test_results_validation(int_data, test_data, &test_priv_data);
21366bbc5a92SArtur Trybula if (ret < 0) {
21376bbc5a92SArtur Trybula ret_status = -1;
21386bbc5a92SArtur Trybula goto exit;
21396bbc5a92SArtur Trybula }
21406bbc5a92SArtur Trybula ret_status = 0;
2141a9de470cSBruce Richardson
2142a9de470cSBruce Richardson exit:
2143a9de470cSBruce Richardson /* Free resources */
21446bbc5a92SArtur Trybula
21456bbc5a92SArtur Trybula if (stream != NULL)
21466bbc5a92SArtur Trybula rte_compressdev_stream_free(0, stream);
21476bbc5a92SArtur Trybula rte_free(all_decomp_data);
21486bbc5a92SArtur Trybula
21496bbc5a92SArtur Trybula /* Free compress private xforms */
21506bbc5a92SArtur Trybula for (i = 0; i < test_priv_data.num_priv_xforms; i++) {
21516bbc5a92SArtur Trybula if (priv_xforms[i] != NULL) {
21526bbc5a92SArtur Trybula rte_compressdev_private_xform_free(0, priv_xforms[i]);
21536bbc5a92SArtur Trybula priv_xforms[i] = NULL;
21546bbc5a92SArtur Trybula }
21556bbc5a92SArtur Trybula }
2156a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++) {
2157a9de470cSBruce Richardson rte_pktmbuf_free(uncomp_bufs[i]);
2158a9de470cSBruce Richardson rte_pktmbuf_free(comp_bufs[i]);
2159a9de470cSBruce Richardson rte_comp_op_free(ops[i]);
2160a9de470cSBruce Richardson rte_comp_op_free(ops_processed[i]);
2161a9de470cSBruce Richardson }
2162a9de470cSBruce Richardson rte_free(contig_buf);
2163a9de470cSBruce Richardson
2164a9de470cSBruce Richardson return ret_status;
2165a9de470cSBruce Richardson }
2166a9de470cSBruce Richardson
2167a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_fixed(void)2168a9de470cSBruce Richardson test_compressdev_deflate_stateless_fixed(void)
2169a9de470cSBruce Richardson {
2170a9de470cSBruce Richardson struct comp_testsuite_params *ts_params = &testsuite_params;
2171a9de470cSBruce Richardson uint16_t i;
2172a9de470cSBruce Richardson int ret;
2173a9de470cSBruce Richardson const struct rte_compressdev_capabilities *capab;
2174a9de470cSBruce Richardson
2175a9de470cSBruce Richardson capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
2176a9de470cSBruce Richardson TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
2177a9de470cSBruce Richardson
2178a9de470cSBruce Richardson if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_FIXED) == 0)
2179a9de470cSBruce Richardson return -ENOTSUP;
2180a9de470cSBruce Richardson
2181a9de470cSBruce Richardson struct rte_comp_xform *compress_xform =
2182a9de470cSBruce Richardson rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
2183a9de470cSBruce Richardson
2184a9de470cSBruce Richardson if (compress_xform == NULL) {
2185a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
2186a9de470cSBruce Richardson "Compress xform could not be created\n");
2187a9de470cSBruce Richardson ret = TEST_FAILED;
2188a9de470cSBruce Richardson goto exit;
2189a9de470cSBruce Richardson }
2190a9de470cSBruce Richardson
2191a9de470cSBruce Richardson memcpy(compress_xform, ts_params->def_comp_xform,
2192a9de470cSBruce Richardson sizeof(struct rte_comp_xform));
2193a9de470cSBruce Richardson compress_xform->compress.deflate.huffman = RTE_COMP_HUFFMAN_FIXED;
2194a9de470cSBruce Richardson
2195a9de470cSBruce Richardson struct interim_data_params int_data = {
2196a9de470cSBruce Richardson NULL,
2197a9de470cSBruce Richardson 1,
2198a9de470cSBruce Richardson NULL,
2199a9de470cSBruce Richardson &compress_xform,
2200a9de470cSBruce Richardson &ts_params->def_decomp_xform,
2201a9de470cSBruce Richardson 1
2202a9de470cSBruce Richardson };
2203a9de470cSBruce Richardson
2204a9de470cSBruce Richardson struct test_data_params test_data = {
22053fc3996fSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
22063fc3996fSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
22073fc3996fSAdam Dybkowski .buff_type = LB_BOTH,
22083fc3996fSAdam Dybkowski .zlib_dir = ZLIB_DECOMPRESS,
22093fc3996fSAdam Dybkowski .out_of_space = 0,
22102437fbbcSArtur Trybula .big_data = 0,
2211db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
2212db06104cSAdam Dybkowski .ratio = RATIO_ENABLED
2213a9de470cSBruce Richardson };
2214a9de470cSBruce Richardson
2215a9de470cSBruce Richardson for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2216a9de470cSBruce Richardson int_data.test_bufs = &compress_test_bufs[i];
2217a9de470cSBruce Richardson int_data.buf_idx = &i;
2218a9de470cSBruce Richardson
2219a9de470cSBruce Richardson /* Compress with compressdev, decompress with Zlib */
2220a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_DECOMPRESS;
222152d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
222252d719d8SAdam Dybkowski if (ret < 0)
2223a9de470cSBruce Richardson goto exit;
2224a9de470cSBruce Richardson
2225a9de470cSBruce Richardson /* Compress with Zlib, decompress with compressdev */
2226a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_COMPRESS;
222752d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
222852d719d8SAdam Dybkowski if (ret < 0)
2229a9de470cSBruce Richardson goto exit;
2230a9de470cSBruce Richardson }
2231a9de470cSBruce Richardson
2232a9de470cSBruce Richardson ret = TEST_SUCCESS;
2233a9de470cSBruce Richardson
2234a9de470cSBruce Richardson exit:
2235a9de470cSBruce Richardson rte_free(compress_xform);
2236a9de470cSBruce Richardson return ret;
2237a9de470cSBruce Richardson }
2238a9de470cSBruce Richardson
2239a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_dynamic(void)2240a9de470cSBruce Richardson test_compressdev_deflate_stateless_dynamic(void)
2241a9de470cSBruce Richardson {
2242a9de470cSBruce Richardson struct comp_testsuite_params *ts_params = &testsuite_params;
2243a9de470cSBruce Richardson uint16_t i;
2244a9de470cSBruce Richardson int ret;
2245a9de470cSBruce Richardson struct rte_comp_xform *compress_xform =
2246a9de470cSBruce Richardson rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
2247a9de470cSBruce Richardson
2248a9de470cSBruce Richardson const struct rte_compressdev_capabilities *capab;
2249a9de470cSBruce Richardson
2250a9de470cSBruce Richardson capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
2251a9de470cSBruce Richardson TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
2252a9de470cSBruce Richardson
2253a9de470cSBruce Richardson if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
2254a9de470cSBruce Richardson return -ENOTSUP;
2255a9de470cSBruce Richardson
2256a9de470cSBruce Richardson if (compress_xform == NULL) {
2257a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
2258a9de470cSBruce Richardson "Compress xform could not be created\n");
2259a9de470cSBruce Richardson ret = TEST_FAILED;
2260a9de470cSBruce Richardson goto exit;
2261a9de470cSBruce Richardson }
2262a9de470cSBruce Richardson
2263a9de470cSBruce Richardson memcpy(compress_xform, ts_params->def_comp_xform,
2264a9de470cSBruce Richardson sizeof(struct rte_comp_xform));
2265a9de470cSBruce Richardson compress_xform->compress.deflate.huffman = RTE_COMP_HUFFMAN_DYNAMIC;
2266a9de470cSBruce Richardson
2267a9de470cSBruce Richardson struct interim_data_params int_data = {
2268a9de470cSBruce Richardson NULL,
2269a9de470cSBruce Richardson 1,
2270a9de470cSBruce Richardson NULL,
2271a9de470cSBruce Richardson &compress_xform,
2272a9de470cSBruce Richardson &ts_params->def_decomp_xform,
2273a9de470cSBruce Richardson 1
2274a9de470cSBruce Richardson };
2275a9de470cSBruce Richardson
2276a9de470cSBruce Richardson struct test_data_params test_data = {
22773fc3996fSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
22783fc3996fSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
22793fc3996fSAdam Dybkowski .buff_type = LB_BOTH,
22803fc3996fSAdam Dybkowski .zlib_dir = ZLIB_DECOMPRESS,
22813fc3996fSAdam Dybkowski .out_of_space = 0,
22822437fbbcSArtur Trybula .big_data = 0,
2283db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
2284db06104cSAdam Dybkowski .ratio = RATIO_ENABLED
2285a9de470cSBruce Richardson };
2286a9de470cSBruce Richardson
2287a9de470cSBruce Richardson for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2288a9de470cSBruce Richardson int_data.test_bufs = &compress_test_bufs[i];
2289a9de470cSBruce Richardson int_data.buf_idx = &i;
2290a9de470cSBruce Richardson
2291a9de470cSBruce Richardson /* Compress with compressdev, decompress with Zlib */
2292a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_DECOMPRESS;
229352d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
229452d719d8SAdam Dybkowski if (ret < 0)
2295a9de470cSBruce Richardson goto exit;
2296a9de470cSBruce Richardson
2297a9de470cSBruce Richardson /* Compress with Zlib, decompress with compressdev */
2298a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_COMPRESS;
229952d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
230052d719d8SAdam Dybkowski if (ret < 0)
2301a9de470cSBruce Richardson goto exit;
2302a9de470cSBruce Richardson }
2303a9de470cSBruce Richardson
2304a9de470cSBruce Richardson ret = TEST_SUCCESS;
2305a9de470cSBruce Richardson
2306a9de470cSBruce Richardson exit:
2307a9de470cSBruce Richardson rte_free(compress_xform);
2308a9de470cSBruce Richardson return ret;
2309a9de470cSBruce Richardson }
2310a9de470cSBruce Richardson
2311a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_multi_op(void)2312a9de470cSBruce Richardson test_compressdev_deflate_stateless_multi_op(void)
2313a9de470cSBruce Richardson {
2314a9de470cSBruce Richardson struct comp_testsuite_params *ts_params = &testsuite_params;
2315a9de470cSBruce Richardson uint16_t num_bufs = RTE_DIM(compress_test_bufs);
2316a9de470cSBruce Richardson uint16_t buf_idx[num_bufs];
2317a9de470cSBruce Richardson uint16_t i;
231852d719d8SAdam Dybkowski int ret;
2319a9de470cSBruce Richardson
2320a9de470cSBruce Richardson for (i = 0; i < num_bufs; i++)
2321a9de470cSBruce Richardson buf_idx[i] = i;
2322a9de470cSBruce Richardson
2323a9de470cSBruce Richardson struct interim_data_params int_data = {
2324a9de470cSBruce Richardson compress_test_bufs,
2325a9de470cSBruce Richardson num_bufs,
2326a9de470cSBruce Richardson buf_idx,
2327a9de470cSBruce Richardson &ts_params->def_comp_xform,
2328a9de470cSBruce Richardson &ts_params->def_decomp_xform,
2329a9de470cSBruce Richardson 1
2330a9de470cSBruce Richardson };
2331a9de470cSBruce Richardson
2332a9de470cSBruce Richardson struct test_data_params test_data = {
23333fc3996fSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
23343fc3996fSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
23353fc3996fSAdam Dybkowski .buff_type = LB_BOTH,
23363fc3996fSAdam Dybkowski .zlib_dir = ZLIB_DECOMPRESS,
23373fc3996fSAdam Dybkowski .out_of_space = 0,
23382437fbbcSArtur Trybula .big_data = 0,
2339db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
2340db06104cSAdam Dybkowski .ratio = RATIO_ENABLED
2341a9de470cSBruce Richardson };
2342a9de470cSBruce Richardson
2343a9de470cSBruce Richardson /* Compress with compressdev, decompress with Zlib */
2344a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_DECOMPRESS;
234552d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
234652d719d8SAdam Dybkowski if (ret < 0)
234752d719d8SAdam Dybkowski return ret;
2348a9de470cSBruce Richardson
2349a9de470cSBruce Richardson /* Compress with Zlib, decompress with compressdev */
2350a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_COMPRESS;
235152d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
235252d719d8SAdam Dybkowski if (ret < 0)
235352d719d8SAdam Dybkowski return ret;
2354a9de470cSBruce Richardson
2355a9de470cSBruce Richardson return TEST_SUCCESS;
2356a9de470cSBruce Richardson }
2357a9de470cSBruce Richardson
2358a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_multi_level(void)2359a9de470cSBruce Richardson test_compressdev_deflate_stateless_multi_level(void)
2360a9de470cSBruce Richardson {
2361a9de470cSBruce Richardson struct comp_testsuite_params *ts_params = &testsuite_params;
2362a9de470cSBruce Richardson unsigned int level;
2363a9de470cSBruce Richardson uint16_t i;
2364a9de470cSBruce Richardson int ret;
2365a9de470cSBruce Richardson struct rte_comp_xform *compress_xform =
2366a9de470cSBruce Richardson rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
2367a9de470cSBruce Richardson
2368a9de470cSBruce Richardson if (compress_xform == NULL) {
2369a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
2370a9de470cSBruce Richardson "Compress xform could not be created\n");
2371a9de470cSBruce Richardson ret = TEST_FAILED;
2372a9de470cSBruce Richardson goto exit;
2373a9de470cSBruce Richardson }
2374a9de470cSBruce Richardson
2375a9de470cSBruce Richardson memcpy(compress_xform, ts_params->def_comp_xform,
2376a9de470cSBruce Richardson sizeof(struct rte_comp_xform));
2377a9de470cSBruce Richardson
2378a9de470cSBruce Richardson struct interim_data_params int_data = {
2379a9de470cSBruce Richardson NULL,
2380a9de470cSBruce Richardson 1,
2381a9de470cSBruce Richardson NULL,
2382a9de470cSBruce Richardson &compress_xform,
2383a9de470cSBruce Richardson &ts_params->def_decomp_xform,
2384a9de470cSBruce Richardson 1
2385a9de470cSBruce Richardson };
2386a9de470cSBruce Richardson
2387a9de470cSBruce Richardson struct test_data_params test_data = {
23883fc3996fSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
23893fc3996fSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
23903fc3996fSAdam Dybkowski .buff_type = LB_BOTH,
23913fc3996fSAdam Dybkowski .zlib_dir = ZLIB_DECOMPRESS,
23923fc3996fSAdam Dybkowski .out_of_space = 0,
23932437fbbcSArtur Trybula .big_data = 0,
2394db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
2395db06104cSAdam Dybkowski .ratio = RATIO_ENABLED
2396a9de470cSBruce Richardson };
2397a9de470cSBruce Richardson
2398a9de470cSBruce Richardson for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2399a9de470cSBruce Richardson int_data.test_bufs = &compress_test_bufs[i];
2400a9de470cSBruce Richardson int_data.buf_idx = &i;
2401a9de470cSBruce Richardson
2402a9de470cSBruce Richardson for (level = RTE_COMP_LEVEL_MIN; level <= RTE_COMP_LEVEL_MAX;
2403a9de470cSBruce Richardson level++) {
2404a9de470cSBruce Richardson compress_xform->compress.level = level;
2405a9de470cSBruce Richardson /* Compress with compressdev, decompress with Zlib */
2406a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_DECOMPRESS;
240752d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
240852d719d8SAdam Dybkowski if (ret < 0)
2409a9de470cSBruce Richardson goto exit;
2410a9de470cSBruce Richardson }
2411a9de470cSBruce Richardson }
2412a9de470cSBruce Richardson
2413a9de470cSBruce Richardson ret = TEST_SUCCESS;
2414a9de470cSBruce Richardson
2415a9de470cSBruce Richardson exit:
2416a9de470cSBruce Richardson rte_free(compress_xform);
2417a9de470cSBruce Richardson return ret;
2418a9de470cSBruce Richardson }
2419a9de470cSBruce Richardson
2420a9de470cSBruce Richardson #define NUM_XFORMS 3
2421a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_multi_xform(void)2422a9de470cSBruce Richardson test_compressdev_deflate_stateless_multi_xform(void)
2423a9de470cSBruce Richardson {
2424a9de470cSBruce Richardson struct comp_testsuite_params *ts_params = &testsuite_params;
2425a9de470cSBruce Richardson uint16_t num_bufs = NUM_XFORMS;
2426a9de470cSBruce Richardson struct rte_comp_xform *compress_xforms[NUM_XFORMS] = {NULL};
2427a9de470cSBruce Richardson struct rte_comp_xform *decompress_xforms[NUM_XFORMS] = {NULL};
2428a9de470cSBruce Richardson const char *test_buffers[NUM_XFORMS];
2429a9de470cSBruce Richardson uint16_t i;
2430a9de470cSBruce Richardson unsigned int level = RTE_COMP_LEVEL_MIN;
2431a9de470cSBruce Richardson uint16_t buf_idx[num_bufs];
2432a9de470cSBruce Richardson int ret;
2433a9de470cSBruce Richardson
2434a9de470cSBruce Richardson /* Create multiple xforms with various levels */
2435a9de470cSBruce Richardson for (i = 0; i < NUM_XFORMS; i++) {
2436a9de470cSBruce Richardson compress_xforms[i] = rte_malloc(NULL,
2437a9de470cSBruce Richardson sizeof(struct rte_comp_xform), 0);
2438a9de470cSBruce Richardson if (compress_xforms[i] == NULL) {
2439a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
2440a9de470cSBruce Richardson "Compress xform could not be created\n");
2441a9de470cSBruce Richardson ret = TEST_FAILED;
2442a9de470cSBruce Richardson goto exit;
2443a9de470cSBruce Richardson }
2444a9de470cSBruce Richardson
2445a9de470cSBruce Richardson memcpy(compress_xforms[i], ts_params->def_comp_xform,
2446a9de470cSBruce Richardson sizeof(struct rte_comp_xform));
2447a9de470cSBruce Richardson compress_xforms[i]->compress.level = level;
2448a9de470cSBruce Richardson level++;
2449a9de470cSBruce Richardson
2450a9de470cSBruce Richardson decompress_xforms[i] = rte_malloc(NULL,
2451a9de470cSBruce Richardson sizeof(struct rte_comp_xform), 0);
2452a9de470cSBruce Richardson if (decompress_xforms[i] == NULL) {
2453a9de470cSBruce Richardson RTE_LOG(ERR, USER1,
2454a9de470cSBruce Richardson "Decompress xform could not be created\n");
2455a9de470cSBruce Richardson ret = TEST_FAILED;
2456a9de470cSBruce Richardson goto exit;
2457a9de470cSBruce Richardson }
2458a9de470cSBruce Richardson
2459a9de470cSBruce Richardson memcpy(decompress_xforms[i], ts_params->def_decomp_xform,
2460a9de470cSBruce Richardson sizeof(struct rte_comp_xform));
2461a9de470cSBruce Richardson }
2462a9de470cSBruce Richardson
2463a9de470cSBruce Richardson for (i = 0; i < NUM_XFORMS; i++) {
2464a9de470cSBruce Richardson buf_idx[i] = 0;
2465a9de470cSBruce Richardson /* Use the same buffer in all sessions */
2466a9de470cSBruce Richardson test_buffers[i] = compress_test_bufs[0];
2467a9de470cSBruce Richardson }
2468a9de470cSBruce Richardson
2469a9de470cSBruce Richardson struct interim_data_params int_data = {
2470a9de470cSBruce Richardson test_buffers,
2471a9de470cSBruce Richardson num_bufs,
2472a9de470cSBruce Richardson buf_idx,
2473a9de470cSBruce Richardson compress_xforms,
2474a9de470cSBruce Richardson decompress_xforms,
2475a9de470cSBruce Richardson NUM_XFORMS
2476a9de470cSBruce Richardson };
2477a9de470cSBruce Richardson
2478a9de470cSBruce Richardson struct test_data_params test_data = {
24793fc3996fSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
24803fc3996fSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
24813fc3996fSAdam Dybkowski .buff_type = LB_BOTH,
24823fc3996fSAdam Dybkowski .zlib_dir = ZLIB_DECOMPRESS,
24833fc3996fSAdam Dybkowski .out_of_space = 0,
24842437fbbcSArtur Trybula .big_data = 0,
2485db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
2486db06104cSAdam Dybkowski .ratio = RATIO_ENABLED
2487a9de470cSBruce Richardson };
2488a9de470cSBruce Richardson
2489a9de470cSBruce Richardson /* Compress with compressdev, decompress with Zlib */
249052d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
249152d719d8SAdam Dybkowski if (ret < 0)
2492a9de470cSBruce Richardson goto exit;
2493a9de470cSBruce Richardson
2494a9de470cSBruce Richardson ret = TEST_SUCCESS;
249552d719d8SAdam Dybkowski
2496a9de470cSBruce Richardson exit:
2497a9de470cSBruce Richardson for (i = 0; i < NUM_XFORMS; i++) {
2498a9de470cSBruce Richardson rte_free(compress_xforms[i]);
2499a9de470cSBruce Richardson rte_free(decompress_xforms[i]);
2500a9de470cSBruce Richardson }
2501a9de470cSBruce Richardson
2502a9de470cSBruce Richardson return ret;
2503a9de470cSBruce Richardson }
2504a9de470cSBruce Richardson
2505a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_sgl(void)2506a9de470cSBruce Richardson test_compressdev_deflate_stateless_sgl(void)
2507a9de470cSBruce Richardson {
2508a9de470cSBruce Richardson struct comp_testsuite_params *ts_params = &testsuite_params;
2509a9de470cSBruce Richardson uint16_t i;
251052d719d8SAdam Dybkowski int ret;
2511a9de470cSBruce Richardson const struct rte_compressdev_capabilities *capab;
2512a9de470cSBruce Richardson
2513a9de470cSBruce Richardson capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
2514a9de470cSBruce Richardson TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
2515a9de470cSBruce Richardson
2516a9de470cSBruce Richardson if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
2517a9de470cSBruce Richardson return -ENOTSUP;
2518a9de470cSBruce Richardson
2519a9de470cSBruce Richardson struct interim_data_params int_data = {
2520a9de470cSBruce Richardson NULL,
2521a9de470cSBruce Richardson 1,
2522a9de470cSBruce Richardson NULL,
2523a9de470cSBruce Richardson &ts_params->def_comp_xform,
2524a9de470cSBruce Richardson &ts_params->def_decomp_xform,
2525a9de470cSBruce Richardson 1
2526a9de470cSBruce Richardson };
2527a9de470cSBruce Richardson
2528a9de470cSBruce Richardson struct test_data_params test_data = {
25293fc3996fSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
25303fc3996fSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
25313fc3996fSAdam Dybkowski .buff_type = SGL_BOTH,
25323fc3996fSAdam Dybkowski .zlib_dir = ZLIB_DECOMPRESS,
25333fc3996fSAdam Dybkowski .out_of_space = 0,
25342437fbbcSArtur Trybula .big_data = 0,
2535db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
2536db06104cSAdam Dybkowski .ratio = RATIO_ENABLED
2537a9de470cSBruce Richardson };
2538a9de470cSBruce Richardson
2539a9de470cSBruce Richardson for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2540a9de470cSBruce Richardson int_data.test_bufs = &compress_test_bufs[i];
2541a9de470cSBruce Richardson int_data.buf_idx = &i;
2542a9de470cSBruce Richardson
2543a9de470cSBruce Richardson /* Compress with compressdev, decompress with Zlib */
2544a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_DECOMPRESS;
254552d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
254652d719d8SAdam Dybkowski if (ret < 0)
254752d719d8SAdam Dybkowski return ret;
2548a9de470cSBruce Richardson
2549a9de470cSBruce Richardson /* Compress with Zlib, decompress with compressdev */
2550a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_COMPRESS;
255152d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
255252d719d8SAdam Dybkowski if (ret < 0)
255352d719d8SAdam Dybkowski return ret;
2554a9de470cSBruce Richardson
2555a9de470cSBruce Richardson if (capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_LB_OUT) {
2556a9de470cSBruce Richardson /* Compress with compressdev, decompress with Zlib */
2557a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_DECOMPRESS;
2558a9de470cSBruce Richardson test_data.buff_type = SGL_TO_LB;
255952d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
256052d719d8SAdam Dybkowski if (ret < 0)
256152d719d8SAdam Dybkowski return ret;
2562a9de470cSBruce Richardson
2563a9de470cSBruce Richardson /* Compress with Zlib, decompress with compressdev */
2564a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_COMPRESS;
2565a9de470cSBruce Richardson test_data.buff_type = SGL_TO_LB;
256652d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
256752d719d8SAdam Dybkowski if (ret < 0)
256852d719d8SAdam Dybkowski return ret;
2569a9de470cSBruce Richardson }
2570a9de470cSBruce Richardson
2571a9de470cSBruce Richardson if (capab->comp_feature_flags & RTE_COMP_FF_OOP_LB_IN_SGL_OUT) {
2572a9de470cSBruce Richardson /* Compress with compressdev, decompress with Zlib */
2573a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_DECOMPRESS;
2574a9de470cSBruce Richardson test_data.buff_type = LB_TO_SGL;
257552d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
257652d719d8SAdam Dybkowski if (ret < 0)
257752d719d8SAdam Dybkowski return ret;
2578a9de470cSBruce Richardson
2579a9de470cSBruce Richardson /* Compress with Zlib, decompress with compressdev */
2580a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_COMPRESS;
2581a9de470cSBruce Richardson test_data.buff_type = LB_TO_SGL;
258252d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
258352d719d8SAdam Dybkowski if (ret < 0)
258452d719d8SAdam Dybkowski return ret;
2585a9de470cSBruce Richardson }
2586a9de470cSBruce Richardson }
2587a9de470cSBruce Richardson
2588a9de470cSBruce Richardson return TEST_SUCCESS;
2589a9de470cSBruce Richardson }
2590a9de470cSBruce Richardson
2591a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_checksum(void)2592a9de470cSBruce Richardson test_compressdev_deflate_stateless_checksum(void)
2593a9de470cSBruce Richardson {
2594a9de470cSBruce Richardson struct comp_testsuite_params *ts_params = &testsuite_params;
2595a9de470cSBruce Richardson uint16_t i;
2596a9de470cSBruce Richardson int ret;
2597a9de470cSBruce Richardson const struct rte_compressdev_capabilities *capab;
2598a9de470cSBruce Richardson
2599a9de470cSBruce Richardson capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
2600a9de470cSBruce Richardson TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
2601a9de470cSBruce Richardson
2602a9de470cSBruce Richardson /* Check if driver supports any checksum */
2603a9de470cSBruce Richardson if ((capab->comp_feature_flags & RTE_COMP_FF_CRC32_CHECKSUM) == 0 &&
2604a9de470cSBruce Richardson (capab->comp_feature_flags &
2605a9de470cSBruce Richardson RTE_COMP_FF_ADLER32_CHECKSUM) == 0 &&
2606a9de470cSBruce Richardson (capab->comp_feature_flags &
2607a9de470cSBruce Richardson RTE_COMP_FF_CRC32_ADLER32_CHECKSUM) == 0)
2608a9de470cSBruce Richardson return -ENOTSUP;
2609a9de470cSBruce Richardson
2610a9de470cSBruce Richardson struct rte_comp_xform *compress_xform =
2611a9de470cSBruce Richardson rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
2612a9de470cSBruce Richardson if (compress_xform == NULL) {
2613a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Compress xform could not be created\n");
261452d719d8SAdam Dybkowski return TEST_FAILED;
2615a9de470cSBruce Richardson }
2616a9de470cSBruce Richardson
2617a9de470cSBruce Richardson memcpy(compress_xform, ts_params->def_comp_xform,
2618a9de470cSBruce Richardson sizeof(struct rte_comp_xform));
2619a9de470cSBruce Richardson
2620a9de470cSBruce Richardson struct rte_comp_xform *decompress_xform =
2621a9de470cSBruce Richardson rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
2622a9de470cSBruce Richardson if (decompress_xform == NULL) {
2623a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Decompress xform could not be created\n");
2624a9de470cSBruce Richardson rte_free(compress_xform);
262552d719d8SAdam Dybkowski return TEST_FAILED;
2626a9de470cSBruce Richardson }
2627a9de470cSBruce Richardson
2628a9de470cSBruce Richardson memcpy(decompress_xform, ts_params->def_decomp_xform,
2629a9de470cSBruce Richardson sizeof(struct rte_comp_xform));
2630a9de470cSBruce Richardson
2631a9de470cSBruce Richardson struct interim_data_params int_data = {
2632a9de470cSBruce Richardson NULL,
2633a9de470cSBruce Richardson 1,
2634a9de470cSBruce Richardson NULL,
2635a9de470cSBruce Richardson &compress_xform,
2636a9de470cSBruce Richardson &decompress_xform,
2637a9de470cSBruce Richardson 1
2638a9de470cSBruce Richardson };
2639a9de470cSBruce Richardson
2640a9de470cSBruce Richardson struct test_data_params test_data = {
26413fc3996fSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
26423fc3996fSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
26433fc3996fSAdam Dybkowski .buff_type = LB_BOTH,
26443fc3996fSAdam Dybkowski .zlib_dir = ZLIB_DECOMPRESS,
26453fc3996fSAdam Dybkowski .out_of_space = 0,
26462437fbbcSArtur Trybula .big_data = 0,
2647db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
2648db06104cSAdam Dybkowski .ratio = RATIO_ENABLED
2649a9de470cSBruce Richardson };
2650a9de470cSBruce Richardson
2651a9de470cSBruce Richardson /* Check if driver supports crc32 checksum and test */
2652a9de470cSBruce Richardson if ((capab->comp_feature_flags & RTE_COMP_FF_CRC32_CHECKSUM)) {
2653a9de470cSBruce Richardson compress_xform->compress.chksum = RTE_COMP_CHECKSUM_CRC32;
2654a9de470cSBruce Richardson decompress_xform->decompress.chksum = RTE_COMP_CHECKSUM_CRC32;
2655a9de470cSBruce Richardson
2656a9de470cSBruce Richardson for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2657a9de470cSBruce Richardson /* Compress with compressdev, decompress with Zlib */
2658a9de470cSBruce Richardson int_data.test_bufs = &compress_test_bufs[i];
2659a9de470cSBruce Richardson int_data.buf_idx = &i;
2660a9de470cSBruce Richardson
2661a9de470cSBruce Richardson /* Generate zlib checksum and test against selected
2662a9de470cSBruce Richardson * drivers decompression checksum
2663a9de470cSBruce Richardson */
2664a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_COMPRESS;
266552d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
266652d719d8SAdam Dybkowski if (ret < 0)
2667a9de470cSBruce Richardson goto exit;
2668a9de470cSBruce Richardson
2669a9de470cSBruce Richardson /* Generate compression and decompression
2670a9de470cSBruce Richardson * checksum of selected driver
2671a9de470cSBruce Richardson */
2672a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_NONE;
267352d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
267452d719d8SAdam Dybkowski if (ret < 0)
2675a9de470cSBruce Richardson goto exit;
2676a9de470cSBruce Richardson }
2677a9de470cSBruce Richardson }
2678a9de470cSBruce Richardson
2679a9de470cSBruce Richardson /* Check if driver supports adler32 checksum and test */
2680a9de470cSBruce Richardson if ((capab->comp_feature_flags & RTE_COMP_FF_ADLER32_CHECKSUM)) {
2681a9de470cSBruce Richardson compress_xform->compress.chksum = RTE_COMP_CHECKSUM_ADLER32;
2682a9de470cSBruce Richardson decompress_xform->decompress.chksum = RTE_COMP_CHECKSUM_ADLER32;
2683a9de470cSBruce Richardson
2684a9de470cSBruce Richardson for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2685a9de470cSBruce Richardson int_data.test_bufs = &compress_test_bufs[i];
2686a9de470cSBruce Richardson int_data.buf_idx = &i;
2687a9de470cSBruce Richardson
2688a9de470cSBruce Richardson /* Generate zlib checksum and test against selected
2689a9de470cSBruce Richardson * drivers decompression checksum
2690a9de470cSBruce Richardson */
2691a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_COMPRESS;
269252d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
269352d719d8SAdam Dybkowski if (ret < 0)
2694a9de470cSBruce Richardson goto exit;
2695a9de470cSBruce Richardson /* Generate compression and decompression
2696a9de470cSBruce Richardson * checksum of selected driver
2697a9de470cSBruce Richardson */
2698a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_NONE;
269952d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
270052d719d8SAdam Dybkowski if (ret < 0)
2701a9de470cSBruce Richardson goto exit;
2702a9de470cSBruce Richardson }
2703a9de470cSBruce Richardson }
2704a9de470cSBruce Richardson
2705a9de470cSBruce Richardson /* Check if driver supports combined crc and adler checksum and test */
2706a9de470cSBruce Richardson if ((capab->comp_feature_flags & RTE_COMP_FF_CRC32_ADLER32_CHECKSUM)) {
2707a9de470cSBruce Richardson compress_xform->compress.chksum =
2708a9de470cSBruce Richardson RTE_COMP_CHECKSUM_CRC32_ADLER32;
2709a9de470cSBruce Richardson decompress_xform->decompress.chksum =
2710a9de470cSBruce Richardson RTE_COMP_CHECKSUM_CRC32_ADLER32;
2711a9de470cSBruce Richardson
2712a9de470cSBruce Richardson for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2713a9de470cSBruce Richardson int_data.test_bufs = &compress_test_bufs[i];
2714a9de470cSBruce Richardson int_data.buf_idx = &i;
2715a9de470cSBruce Richardson
2716a9de470cSBruce Richardson /* Generate compression and decompression
2717a9de470cSBruce Richardson * checksum of selected driver
2718a9de470cSBruce Richardson */
2719a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_NONE;
272052d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
272152d719d8SAdam Dybkowski if (ret < 0)
2722a9de470cSBruce Richardson goto exit;
2723a9de470cSBruce Richardson }
2724a9de470cSBruce Richardson }
2725a9de470cSBruce Richardson
2726a9de470cSBruce Richardson ret = TEST_SUCCESS;
2727a9de470cSBruce Richardson
2728a9de470cSBruce Richardson exit:
2729a9de470cSBruce Richardson rte_free(compress_xform);
2730a9de470cSBruce Richardson rte_free(decompress_xform);
2731a9de470cSBruce Richardson return ret;
2732a9de470cSBruce Richardson }
2733a9de470cSBruce Richardson
2734a9de470cSBruce Richardson static int
test_compressdev_out_of_space_buffer(void)2735a9de470cSBruce Richardson test_compressdev_out_of_space_buffer(void)
2736a9de470cSBruce Richardson {
2737a9de470cSBruce Richardson struct comp_testsuite_params *ts_params = &testsuite_params;
2738a9de470cSBruce Richardson int ret;
2739a9de470cSBruce Richardson uint16_t i;
2740a9de470cSBruce Richardson const struct rte_compressdev_capabilities *capab;
2741a9de470cSBruce Richardson
274207b810c5SAdam Dybkowski RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
2743a9de470cSBruce Richardson
2744a9de470cSBruce Richardson capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
2745a9de470cSBruce Richardson TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
2746a9de470cSBruce Richardson
2747a9de470cSBruce Richardson if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_FIXED) == 0)
2748a9de470cSBruce Richardson return -ENOTSUP;
2749a9de470cSBruce Richardson
2750a9de470cSBruce Richardson struct interim_data_params int_data = {
2751a9de470cSBruce Richardson &compress_test_bufs[0],
2752a9de470cSBruce Richardson 1,
2753a9de470cSBruce Richardson &i,
2754a9de470cSBruce Richardson &ts_params->def_comp_xform,
2755a9de470cSBruce Richardson &ts_params->def_decomp_xform,
2756a9de470cSBruce Richardson 1
2757a9de470cSBruce Richardson };
2758a9de470cSBruce Richardson
2759a9de470cSBruce Richardson struct test_data_params test_data = {
27603fc3996fSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
27613fc3996fSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
27623fc3996fSAdam Dybkowski .buff_type = LB_BOTH,
27633fc3996fSAdam Dybkowski .zlib_dir = ZLIB_DECOMPRESS,
27643fc3996fSAdam Dybkowski .out_of_space = 1, /* run out-of-space test */
27652437fbbcSArtur Trybula .big_data = 0,
2766db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
2767db06104cSAdam Dybkowski .ratio = RATIO_ENABLED
2768a9de470cSBruce Richardson };
2769a9de470cSBruce Richardson /* Compress with compressdev, decompress with Zlib */
2770a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_DECOMPRESS;
277152d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
277252d719d8SAdam Dybkowski if (ret < 0)
2773a9de470cSBruce Richardson goto exit;
2774a9de470cSBruce Richardson
2775a9de470cSBruce Richardson /* Compress with Zlib, decompress with compressdev */
2776a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_COMPRESS;
277752d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
277852d719d8SAdam Dybkowski if (ret < 0)
2779a9de470cSBruce Richardson goto exit;
2780a9de470cSBruce Richardson
2781a9de470cSBruce Richardson if (capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) {
2782a9de470cSBruce Richardson /* Compress with compressdev, decompress with Zlib */
2783a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_DECOMPRESS;
2784a9de470cSBruce Richardson test_data.buff_type = SGL_BOTH;
278552d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
278652d719d8SAdam Dybkowski if (ret < 0)
2787a9de470cSBruce Richardson goto exit;
2788a9de470cSBruce Richardson
2789a9de470cSBruce Richardson /* Compress with Zlib, decompress with compressdev */
2790a9de470cSBruce Richardson test_data.zlib_dir = ZLIB_COMPRESS;
2791a9de470cSBruce Richardson test_data.buff_type = SGL_BOTH;
279252d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
279352d719d8SAdam Dybkowski if (ret < 0)
2794a9de470cSBruce Richardson goto exit;
2795a9de470cSBruce Richardson }
2796a9de470cSBruce Richardson
2797a9de470cSBruce Richardson ret = TEST_SUCCESS;
2798a9de470cSBruce Richardson
2799a9de470cSBruce Richardson exit:
2800a9de470cSBruce Richardson return ret;
2801a9de470cSBruce Richardson }
2802a9de470cSBruce Richardson
28039df7ffd1STomasz Jozwiak static int
test_compressdev_deflate_stateless_dynamic_big(void)28049df7ffd1STomasz Jozwiak test_compressdev_deflate_stateless_dynamic_big(void)
28059df7ffd1STomasz Jozwiak {
28069df7ffd1STomasz Jozwiak struct comp_testsuite_params *ts_params = &testsuite_params;
28079df7ffd1STomasz Jozwiak uint16_t i = 0;
280852d719d8SAdam Dybkowski int ret;
2809db06104cSAdam Dybkowski unsigned int j;
28109df7ffd1STomasz Jozwiak const struct rte_compressdev_capabilities *capab;
28119df7ffd1STomasz Jozwiak char *test_buffer = NULL;
28129df7ffd1STomasz Jozwiak
28139df7ffd1STomasz Jozwiak capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
28149df7ffd1STomasz Jozwiak TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
28159df7ffd1STomasz Jozwiak
28169df7ffd1STomasz Jozwiak if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
28179df7ffd1STomasz Jozwiak return -ENOTSUP;
28189df7ffd1STomasz Jozwiak
28199df7ffd1STomasz Jozwiak if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
28209df7ffd1STomasz Jozwiak return -ENOTSUP;
28219df7ffd1STomasz Jozwiak
28229df7ffd1STomasz Jozwiak test_buffer = rte_malloc(NULL, BIG_DATA_TEST_SIZE, 0);
28239df7ffd1STomasz Jozwiak if (test_buffer == NULL) {
28249df7ffd1STomasz Jozwiak RTE_LOG(ERR, USER1,
28259df7ffd1STomasz Jozwiak "Can't allocate buffer for big-data\n");
28269df7ffd1STomasz Jozwiak return TEST_FAILED;
28279df7ffd1STomasz Jozwiak }
28289df7ffd1STomasz Jozwiak
28299df7ffd1STomasz Jozwiak struct interim_data_params int_data = {
28309df7ffd1STomasz Jozwiak (const char * const *)&test_buffer,
28319df7ffd1STomasz Jozwiak 1,
28320e7d6518SFiona Trahe &i,
28339df7ffd1STomasz Jozwiak &ts_params->def_comp_xform,
28349df7ffd1STomasz Jozwiak &ts_params->def_decomp_xform,
28359df7ffd1STomasz Jozwiak 1
28369df7ffd1STomasz Jozwiak };
28379df7ffd1STomasz Jozwiak
28389df7ffd1STomasz Jozwiak struct test_data_params test_data = {
28393fc3996fSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
28403fc3996fSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
28413fc3996fSAdam Dybkowski .buff_type = SGL_BOTH,
28423fc3996fSAdam Dybkowski .zlib_dir = ZLIB_DECOMPRESS,
28433fc3996fSAdam Dybkowski .out_of_space = 0,
28442437fbbcSArtur Trybula .big_data = 1,
2845db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
2846db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
28479df7ffd1STomasz Jozwiak };
28489df7ffd1STomasz Jozwiak
28499df7ffd1STomasz Jozwiak ts_params->def_comp_xform->compress.deflate.huffman =
28509df7ffd1STomasz Jozwiak RTE_COMP_HUFFMAN_DYNAMIC;
28519df7ffd1STomasz Jozwiak
28529df7ffd1STomasz Jozwiak /* fill the buffer with data based on rand. data */
28539df7ffd1STomasz Jozwiak srand(BIG_DATA_TEST_SIZE);
28540e7d6518SFiona Trahe for (j = 0; j < BIG_DATA_TEST_SIZE - 1; ++j)
28550e7d6518SFiona Trahe test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
28569df7ffd1STomasz Jozwiak test_buffer[BIG_DATA_TEST_SIZE - 1] = 0;
28579df7ffd1STomasz Jozwiak
28589df7ffd1STomasz Jozwiak /* Compress with compressdev, decompress with Zlib */
28599df7ffd1STomasz Jozwiak test_data.zlib_dir = ZLIB_DECOMPRESS;
286052d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
286152d719d8SAdam Dybkowski if (ret < 0)
286252d719d8SAdam Dybkowski goto exit;
28639df7ffd1STomasz Jozwiak
28649df7ffd1STomasz Jozwiak /* Compress with Zlib, decompress with compressdev */
28659df7ffd1STomasz Jozwiak test_data.zlib_dir = ZLIB_COMPRESS;
286652d719d8SAdam Dybkowski ret = test_deflate_comp_decomp(&int_data, &test_data);
286752d719d8SAdam Dybkowski if (ret < 0)
286852d719d8SAdam Dybkowski goto exit;
28699df7ffd1STomasz Jozwiak
287052d719d8SAdam Dybkowski ret = TEST_SUCCESS;
287152d719d8SAdam Dybkowski
287252d719d8SAdam Dybkowski exit:
28739df7ffd1STomasz Jozwiak ts_params->def_comp_xform->compress.deflate.huffman =
28749df7ffd1STomasz Jozwiak RTE_COMP_HUFFMAN_DEFAULT;
28759df7ffd1STomasz Jozwiak rte_free(test_buffer);
28769df7ffd1STomasz Jozwiak return ret;
28779df7ffd1STomasz Jozwiak }
28789df7ffd1STomasz Jozwiak
287907b810c5SAdam Dybkowski static int
test_compressdev_deflate_stateful_decomp(void)288007b810c5SAdam Dybkowski test_compressdev_deflate_stateful_decomp(void)
288107b810c5SAdam Dybkowski {
288207b810c5SAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
288307b810c5SAdam Dybkowski int ret;
288407b810c5SAdam Dybkowski uint16_t i;
288507b810c5SAdam Dybkowski const struct rte_compressdev_capabilities *capab;
288607b810c5SAdam Dybkowski
288707b810c5SAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
288807b810c5SAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
288907b810c5SAdam Dybkowski
289007b810c5SAdam Dybkowski if (!(capab->comp_feature_flags & RTE_COMP_FF_STATEFUL_DECOMPRESSION))
289107b810c5SAdam Dybkowski return -ENOTSUP;
289207b810c5SAdam Dybkowski
289307b810c5SAdam Dybkowski struct interim_data_params int_data = {
289407b810c5SAdam Dybkowski &compress_test_bufs[0],
289507b810c5SAdam Dybkowski 1,
289607b810c5SAdam Dybkowski &i,
289707b810c5SAdam Dybkowski &ts_params->def_comp_xform,
289807b810c5SAdam Dybkowski &ts_params->def_decomp_xform,
289907b810c5SAdam Dybkowski 1
290007b810c5SAdam Dybkowski };
290107b810c5SAdam Dybkowski
290207b810c5SAdam Dybkowski struct test_data_params test_data = {
29033fc3996fSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
29043fc3996fSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATEFUL,
29053fc3996fSAdam Dybkowski .buff_type = LB_BOTH,
29063fc3996fSAdam Dybkowski .zlib_dir = ZLIB_COMPRESS,
29073fc3996fSAdam Dybkowski .out_of_space = 0,
29083fc3996fSAdam Dybkowski .big_data = 0,
29093fc3996fSAdam Dybkowski .decompress_output_block_size = 2000,
29102437fbbcSArtur Trybula .decompress_steps_max = 4,
2911db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
2912db06104cSAdam Dybkowski .ratio = RATIO_ENABLED
291307b810c5SAdam Dybkowski };
291407b810c5SAdam Dybkowski
291507b810c5SAdam Dybkowski /* Compress with Zlib, decompress with compressdev */
291607b810c5SAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
291707b810c5SAdam Dybkowski ret = TEST_FAILED;
291807b810c5SAdam Dybkowski goto exit;
291907b810c5SAdam Dybkowski }
292007b810c5SAdam Dybkowski
292107b810c5SAdam Dybkowski if (capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) {
292207b810c5SAdam Dybkowski /* Now test with SGL buffers */
292307b810c5SAdam Dybkowski test_data.buff_type = SGL_BOTH;
292407b810c5SAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
292507b810c5SAdam Dybkowski ret = TEST_FAILED;
292607b810c5SAdam Dybkowski goto exit;
292707b810c5SAdam Dybkowski }
292807b810c5SAdam Dybkowski }
292907b810c5SAdam Dybkowski
293007b810c5SAdam Dybkowski ret = TEST_SUCCESS;
293107b810c5SAdam Dybkowski
293207b810c5SAdam Dybkowski exit:
293307b810c5SAdam Dybkowski return ret;
293407b810c5SAdam Dybkowski }
293507b810c5SAdam Dybkowski
293607b810c5SAdam Dybkowski static int
test_compressdev_deflate_stateful_decomp_checksum(void)293707b810c5SAdam Dybkowski test_compressdev_deflate_stateful_decomp_checksum(void)
293807b810c5SAdam Dybkowski {
293907b810c5SAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
294007b810c5SAdam Dybkowski int ret;
294107b810c5SAdam Dybkowski uint16_t i;
294207b810c5SAdam Dybkowski const struct rte_compressdev_capabilities *capab;
294307b810c5SAdam Dybkowski
294407b810c5SAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
294507b810c5SAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
294607b810c5SAdam Dybkowski
294707b810c5SAdam Dybkowski if (!(capab->comp_feature_flags & RTE_COMP_FF_STATEFUL_DECOMPRESSION))
294807b810c5SAdam Dybkowski return -ENOTSUP;
294907b810c5SAdam Dybkowski
295007b810c5SAdam Dybkowski /* Check if driver supports any checksum */
295107b810c5SAdam Dybkowski if (!(capab->comp_feature_flags &
295207b810c5SAdam Dybkowski (RTE_COMP_FF_CRC32_CHECKSUM | RTE_COMP_FF_ADLER32_CHECKSUM |
295307b810c5SAdam Dybkowski RTE_COMP_FF_CRC32_ADLER32_CHECKSUM)))
295407b810c5SAdam Dybkowski return -ENOTSUP;
295507b810c5SAdam Dybkowski
295607b810c5SAdam Dybkowski struct rte_comp_xform *compress_xform =
295707b810c5SAdam Dybkowski rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
295807b810c5SAdam Dybkowski if (compress_xform == NULL) {
295907b810c5SAdam Dybkowski RTE_LOG(ERR, USER1, "Compress xform could not be created\n");
296007b810c5SAdam Dybkowski return TEST_FAILED;
296107b810c5SAdam Dybkowski }
296207b810c5SAdam Dybkowski
296307b810c5SAdam Dybkowski memcpy(compress_xform, ts_params->def_comp_xform,
296407b810c5SAdam Dybkowski sizeof(struct rte_comp_xform));
296507b810c5SAdam Dybkowski
296607b810c5SAdam Dybkowski struct rte_comp_xform *decompress_xform =
296707b810c5SAdam Dybkowski rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
296807b810c5SAdam Dybkowski if (decompress_xform == NULL) {
296907b810c5SAdam Dybkowski RTE_LOG(ERR, USER1, "Decompress xform could not be created\n");
297007b810c5SAdam Dybkowski rte_free(compress_xform);
297107b810c5SAdam Dybkowski return TEST_FAILED;
297207b810c5SAdam Dybkowski }
297307b810c5SAdam Dybkowski
297407b810c5SAdam Dybkowski memcpy(decompress_xform, ts_params->def_decomp_xform,
297507b810c5SAdam Dybkowski sizeof(struct rte_comp_xform));
297607b810c5SAdam Dybkowski
297707b810c5SAdam Dybkowski struct interim_data_params int_data = {
297807b810c5SAdam Dybkowski &compress_test_bufs[0],
297907b810c5SAdam Dybkowski 1,
298007b810c5SAdam Dybkowski &i,
298107b810c5SAdam Dybkowski &compress_xform,
298207b810c5SAdam Dybkowski &decompress_xform,
298307b810c5SAdam Dybkowski 1
298407b810c5SAdam Dybkowski };
298507b810c5SAdam Dybkowski
298607b810c5SAdam Dybkowski struct test_data_params test_data = {
29873fc3996fSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
29883fc3996fSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATEFUL,
29893fc3996fSAdam Dybkowski .buff_type = LB_BOTH,
29903fc3996fSAdam Dybkowski .zlib_dir = ZLIB_COMPRESS,
29913fc3996fSAdam Dybkowski .out_of_space = 0,
29923fc3996fSAdam Dybkowski .big_data = 0,
29933fc3996fSAdam Dybkowski .decompress_output_block_size = 2000,
29942437fbbcSArtur Trybula .decompress_steps_max = 4,
2995db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
2996db06104cSAdam Dybkowski .ratio = RATIO_ENABLED
299707b810c5SAdam Dybkowski };
299807b810c5SAdam Dybkowski
299907b810c5SAdam Dybkowski /* Check if driver supports crc32 checksum and test */
300007b810c5SAdam Dybkowski if (capab->comp_feature_flags & RTE_COMP_FF_CRC32_CHECKSUM) {
300107b810c5SAdam Dybkowski compress_xform->compress.chksum = RTE_COMP_CHECKSUM_CRC32;
300207b810c5SAdam Dybkowski decompress_xform->decompress.chksum = RTE_COMP_CHECKSUM_CRC32;
300307b810c5SAdam Dybkowski /* Compress with Zlib, decompress with compressdev */
300407b810c5SAdam Dybkowski test_data.buff_type = LB_BOTH;
300507b810c5SAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
300607b810c5SAdam Dybkowski ret = TEST_FAILED;
300707b810c5SAdam Dybkowski goto exit;
300807b810c5SAdam Dybkowski }
300907b810c5SAdam Dybkowski if (capab->comp_feature_flags &
301007b810c5SAdam Dybkowski RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) {
301107b810c5SAdam Dybkowski /* Now test with SGL buffers */
301207b810c5SAdam Dybkowski test_data.buff_type = SGL_BOTH;
301307b810c5SAdam Dybkowski if (test_deflate_comp_decomp(&int_data,
301407b810c5SAdam Dybkowski &test_data) < 0) {
301507b810c5SAdam Dybkowski ret = TEST_FAILED;
301607b810c5SAdam Dybkowski goto exit;
301707b810c5SAdam Dybkowski }
301807b810c5SAdam Dybkowski }
301907b810c5SAdam Dybkowski }
302007b810c5SAdam Dybkowski
302107b810c5SAdam Dybkowski /* Check if driver supports adler32 checksum and test */
302207b810c5SAdam Dybkowski if (capab->comp_feature_flags & RTE_COMP_FF_ADLER32_CHECKSUM) {
302307b810c5SAdam Dybkowski compress_xform->compress.chksum = RTE_COMP_CHECKSUM_ADLER32;
302407b810c5SAdam Dybkowski decompress_xform->decompress.chksum = RTE_COMP_CHECKSUM_ADLER32;
302507b810c5SAdam Dybkowski /* Compress with Zlib, decompress with compressdev */
302607b810c5SAdam Dybkowski test_data.buff_type = LB_BOTH;
302707b810c5SAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
302807b810c5SAdam Dybkowski ret = TEST_FAILED;
302907b810c5SAdam Dybkowski goto exit;
303007b810c5SAdam Dybkowski }
303107b810c5SAdam Dybkowski if (capab->comp_feature_flags &
303207b810c5SAdam Dybkowski RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) {
303307b810c5SAdam Dybkowski /* Now test with SGL buffers */
303407b810c5SAdam Dybkowski test_data.buff_type = SGL_BOTH;
303507b810c5SAdam Dybkowski if (test_deflate_comp_decomp(&int_data,
303607b810c5SAdam Dybkowski &test_data) < 0) {
303707b810c5SAdam Dybkowski ret = TEST_FAILED;
303807b810c5SAdam Dybkowski goto exit;
303907b810c5SAdam Dybkowski }
304007b810c5SAdam Dybkowski }
304107b810c5SAdam Dybkowski }
304207b810c5SAdam Dybkowski
304307b810c5SAdam Dybkowski /* Check if driver supports combined crc and adler checksum and test */
304407b810c5SAdam Dybkowski if (capab->comp_feature_flags & RTE_COMP_FF_CRC32_ADLER32_CHECKSUM) {
304507b810c5SAdam Dybkowski compress_xform->compress.chksum =
304607b810c5SAdam Dybkowski RTE_COMP_CHECKSUM_CRC32_ADLER32;
304707b810c5SAdam Dybkowski decompress_xform->decompress.chksum =
304807b810c5SAdam Dybkowski RTE_COMP_CHECKSUM_CRC32_ADLER32;
304907b810c5SAdam Dybkowski /* Zlib doesn't support combined checksum */
305007b810c5SAdam Dybkowski test_data.zlib_dir = ZLIB_NONE;
305107b810c5SAdam Dybkowski /* Compress stateless, decompress stateful with compressdev */
305207b810c5SAdam Dybkowski test_data.buff_type = LB_BOTH;
305307b810c5SAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
305407b810c5SAdam Dybkowski ret = TEST_FAILED;
305507b810c5SAdam Dybkowski goto exit;
305607b810c5SAdam Dybkowski }
305707b810c5SAdam Dybkowski if (capab->comp_feature_flags &
305807b810c5SAdam Dybkowski RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) {
305907b810c5SAdam Dybkowski /* Now test with SGL buffers */
306007b810c5SAdam Dybkowski test_data.buff_type = SGL_BOTH;
306107b810c5SAdam Dybkowski if (test_deflate_comp_decomp(&int_data,
306207b810c5SAdam Dybkowski &test_data) < 0) {
306307b810c5SAdam Dybkowski ret = TEST_FAILED;
306407b810c5SAdam Dybkowski goto exit;
306507b810c5SAdam Dybkowski }
306607b810c5SAdam Dybkowski }
306707b810c5SAdam Dybkowski }
306807b810c5SAdam Dybkowski
306907b810c5SAdam Dybkowski ret = TEST_SUCCESS;
307007b810c5SAdam Dybkowski
307107b810c5SAdam Dybkowski exit:
307207b810c5SAdam Dybkowski rte_free(compress_xform);
307307b810c5SAdam Dybkowski rte_free(decompress_xform);
307407b810c5SAdam Dybkowski return ret;
307507b810c5SAdam Dybkowski }
3076a9de470cSBruce Richardson
30773fc3996fSAdam Dybkowski static const struct rte_memzone *
make_memzone(const char * name,size_t size)30783fc3996fSAdam Dybkowski make_memzone(const char *name, size_t size)
30793fc3996fSAdam Dybkowski {
30803fc3996fSAdam Dybkowski unsigned int socket_id = rte_socket_id();
30813fc3996fSAdam Dybkowski char mz_name[RTE_MEMZONE_NAMESIZE];
30823fc3996fSAdam Dybkowski const struct rte_memzone *memzone;
30833fc3996fSAdam Dybkowski
30843fc3996fSAdam Dybkowski snprintf(mz_name, RTE_MEMZONE_NAMESIZE, "%s_%u", name, socket_id);
30853fc3996fSAdam Dybkowski memzone = rte_memzone_lookup(mz_name);
30863fc3996fSAdam Dybkowski if (memzone != NULL && memzone->len != size) {
30873fc3996fSAdam Dybkowski rte_memzone_free(memzone);
30883fc3996fSAdam Dybkowski memzone = NULL;
30893fc3996fSAdam Dybkowski }
30903fc3996fSAdam Dybkowski if (memzone == NULL) {
30913fc3996fSAdam Dybkowski memzone = rte_memzone_reserve_aligned(mz_name, size, socket_id,
30923fc3996fSAdam Dybkowski RTE_MEMZONE_IOVA_CONTIG, RTE_CACHE_LINE_SIZE);
30933fc3996fSAdam Dybkowski if (memzone == NULL)
30943fc3996fSAdam Dybkowski RTE_LOG(ERR, USER1, "Can't allocate memory zone %s",
30953fc3996fSAdam Dybkowski mz_name);
30963fc3996fSAdam Dybkowski }
30973fc3996fSAdam Dybkowski return memzone;
30983fc3996fSAdam Dybkowski }
30993fc3996fSAdam Dybkowski
31003fc3996fSAdam Dybkowski static int
test_compressdev_external_mbufs(void)31013fc3996fSAdam Dybkowski test_compressdev_external_mbufs(void)
31023fc3996fSAdam Dybkowski {
31033fc3996fSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
31043fc3996fSAdam Dybkowski size_t data_len = 0;
31053fc3996fSAdam Dybkowski uint16_t i;
31063fc3996fSAdam Dybkowski int ret = TEST_FAILED;
31073fc3996fSAdam Dybkowski
31083fc3996fSAdam Dybkowski for (i = 0; i < RTE_DIM(compress_test_bufs); i++)
31093fc3996fSAdam Dybkowski data_len = RTE_MAX(data_len, strlen(compress_test_bufs[i]) + 1);
31103fc3996fSAdam Dybkowski
31113fc3996fSAdam Dybkowski struct interim_data_params int_data = {
31123fc3996fSAdam Dybkowski NULL,
31133fc3996fSAdam Dybkowski 1,
31143fc3996fSAdam Dybkowski NULL,
31153fc3996fSAdam Dybkowski &ts_params->def_comp_xform,
31163fc3996fSAdam Dybkowski &ts_params->def_decomp_xform,
31173fc3996fSAdam Dybkowski 1
31183fc3996fSAdam Dybkowski };
31193fc3996fSAdam Dybkowski
31203fc3996fSAdam Dybkowski struct test_data_params test_data = {
31213fc3996fSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
31223fc3996fSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
31233fc3996fSAdam Dybkowski .buff_type = LB_BOTH,
31243fc3996fSAdam Dybkowski .zlib_dir = ZLIB_DECOMPRESS,
31253fc3996fSAdam Dybkowski .out_of_space = 0,
31263fc3996fSAdam Dybkowski .big_data = 0,
31273fc3996fSAdam Dybkowski .use_external_mbufs = 1,
31283fc3996fSAdam Dybkowski .inbuf_data_size = data_len,
31293fc3996fSAdam Dybkowski .inbuf_memzone = make_memzone("inbuf", data_len),
31303fc3996fSAdam Dybkowski .compbuf_memzone = make_memzone("compbuf", data_len *
31313fc3996fSAdam Dybkowski COMPRESS_BUF_SIZE_RATIO),
31322437fbbcSArtur Trybula .uncompbuf_memzone = make_memzone("decompbuf", data_len),
31332437fbbcSArtur Trybula .overflow = OVERFLOW_DISABLED
31343fc3996fSAdam Dybkowski };
31353fc3996fSAdam Dybkowski
31363fc3996fSAdam Dybkowski for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
31373fc3996fSAdam Dybkowski /* prepare input data */
31383fc3996fSAdam Dybkowski data_len = strlen(compress_test_bufs[i]) + 1;
31393fc3996fSAdam Dybkowski rte_memcpy(test_data.inbuf_memzone->addr, compress_test_bufs[i],
31403fc3996fSAdam Dybkowski data_len);
31413fc3996fSAdam Dybkowski test_data.inbuf_data_size = data_len;
31423fc3996fSAdam Dybkowski int_data.buf_idx = &i;
31433fc3996fSAdam Dybkowski
31443fc3996fSAdam Dybkowski /* Compress with compressdev, decompress with Zlib */
31453fc3996fSAdam Dybkowski test_data.zlib_dir = ZLIB_DECOMPRESS;
31463fc3996fSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0)
31473fc3996fSAdam Dybkowski goto exit;
31483fc3996fSAdam Dybkowski
31493fc3996fSAdam Dybkowski /* Compress with Zlib, decompress with compressdev */
31503fc3996fSAdam Dybkowski test_data.zlib_dir = ZLIB_COMPRESS;
31513fc3996fSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0)
31523fc3996fSAdam Dybkowski goto exit;
31533fc3996fSAdam Dybkowski }
31543fc3996fSAdam Dybkowski
31553fc3996fSAdam Dybkowski ret = TEST_SUCCESS;
31563fc3996fSAdam Dybkowski
31573fc3996fSAdam Dybkowski exit:
31583fc3996fSAdam Dybkowski rte_memzone_free(test_data.inbuf_memzone);
31593fc3996fSAdam Dybkowski rte_memzone_free(test_data.compbuf_memzone);
31603fc3996fSAdam Dybkowski rte_memzone_free(test_data.uncompbuf_memzone);
31613fc3996fSAdam Dybkowski return ret;
31623fc3996fSAdam Dybkowski }
31633fc3996fSAdam Dybkowski
31642437fbbcSArtur Trybula static int
test_compressdev_deflate_stateless_fixed_oos_recoverable(void)31652437fbbcSArtur Trybula test_compressdev_deflate_stateless_fixed_oos_recoverable(void)
31662437fbbcSArtur Trybula {
31672437fbbcSArtur Trybula struct comp_testsuite_params *ts_params = &testsuite_params;
31682437fbbcSArtur Trybula uint16_t i;
31692437fbbcSArtur Trybula int ret;
31702437fbbcSArtur Trybula int comp_result;
31712437fbbcSArtur Trybula const struct rte_compressdev_capabilities *capab;
31722437fbbcSArtur Trybula
31732437fbbcSArtur Trybula capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
31742437fbbcSArtur Trybula TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
31752437fbbcSArtur Trybula
31762437fbbcSArtur Trybula if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_FIXED) == 0)
31772437fbbcSArtur Trybula return -ENOTSUP;
31782437fbbcSArtur Trybula
31792437fbbcSArtur Trybula struct rte_comp_xform *compress_xform =
31802437fbbcSArtur Trybula rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
31812437fbbcSArtur Trybula
31822437fbbcSArtur Trybula if (compress_xform == NULL) {
31832437fbbcSArtur Trybula RTE_LOG(ERR, USER1,
31842437fbbcSArtur Trybula "Compress xform could not be created\n");
31852437fbbcSArtur Trybula ret = TEST_FAILED;
31862437fbbcSArtur Trybula goto exit;
31872437fbbcSArtur Trybula }
31882437fbbcSArtur Trybula
31892437fbbcSArtur Trybula memcpy(compress_xform, ts_params->def_comp_xform,
31902437fbbcSArtur Trybula sizeof(struct rte_comp_xform));
31912437fbbcSArtur Trybula compress_xform->compress.deflate.huffman = RTE_COMP_HUFFMAN_FIXED;
31922437fbbcSArtur Trybula
31932437fbbcSArtur Trybula struct interim_data_params int_data = {
31942437fbbcSArtur Trybula NULL,
31952437fbbcSArtur Trybula 1,
31962437fbbcSArtur Trybula NULL,
31972437fbbcSArtur Trybula &compress_xform,
31982437fbbcSArtur Trybula &ts_params->def_decomp_xform,
31992437fbbcSArtur Trybula 1
32002437fbbcSArtur Trybula };
32012437fbbcSArtur Trybula
32022437fbbcSArtur Trybula struct test_data_params test_data = {
32032437fbbcSArtur Trybula .compress_state = RTE_COMP_OP_STATELESS,
32042437fbbcSArtur Trybula .decompress_state = RTE_COMP_OP_STATELESS,
32052437fbbcSArtur Trybula .buff_type = LB_BOTH,
32062437fbbcSArtur Trybula .zlib_dir = ZLIB_DECOMPRESS,
32072437fbbcSArtur Trybula .out_of_space = 0,
32082437fbbcSArtur Trybula .big_data = 0,
3209db06104cSAdam Dybkowski .overflow = OVERFLOW_ENABLED,
3210db06104cSAdam Dybkowski .ratio = RATIO_ENABLED
32112437fbbcSArtur Trybula };
32122437fbbcSArtur Trybula
32132437fbbcSArtur Trybula for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
32142437fbbcSArtur Trybula int_data.test_bufs = &compress_test_bufs[i];
32152437fbbcSArtur Trybula int_data.buf_idx = &i;
32162437fbbcSArtur Trybula
32172437fbbcSArtur Trybula /* Compress with compressdev, decompress with Zlib */
32182437fbbcSArtur Trybula test_data.zlib_dir = ZLIB_DECOMPRESS;
32192437fbbcSArtur Trybula comp_result = test_deflate_comp_decomp(&int_data, &test_data);
32202437fbbcSArtur Trybula if (comp_result < 0) {
32212437fbbcSArtur Trybula ret = TEST_FAILED;
32222437fbbcSArtur Trybula goto exit;
32232437fbbcSArtur Trybula } else if (comp_result > 0) {
32242437fbbcSArtur Trybula ret = -ENOTSUP;
32252437fbbcSArtur Trybula goto exit;
32262437fbbcSArtur Trybula }
32272437fbbcSArtur Trybula
32282437fbbcSArtur Trybula /* Compress with Zlib, decompress with compressdev */
32292437fbbcSArtur Trybula test_data.zlib_dir = ZLIB_COMPRESS;
32302437fbbcSArtur Trybula comp_result = test_deflate_comp_decomp(&int_data, &test_data);
32312437fbbcSArtur Trybula if (comp_result < 0) {
32322437fbbcSArtur Trybula ret = TEST_FAILED;
32332437fbbcSArtur Trybula goto exit;
32342437fbbcSArtur Trybula } else if (comp_result > 0) {
32352437fbbcSArtur Trybula ret = -ENOTSUP;
32362437fbbcSArtur Trybula goto exit;
32372437fbbcSArtur Trybula }
32382437fbbcSArtur Trybula }
32392437fbbcSArtur Trybula
32402437fbbcSArtur Trybula ret = TEST_SUCCESS;
32412437fbbcSArtur Trybula
32422437fbbcSArtur Trybula exit:
32432437fbbcSArtur Trybula rte_free(compress_xform);
32442437fbbcSArtur Trybula return ret;
32452437fbbcSArtur Trybula }
32462437fbbcSArtur Trybula
3247db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_LB_1op(void)3248db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_1op(void)
3249db06104cSAdam Dybkowski {
3250db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
3251db06104cSAdam Dybkowski uint16_t i = 0;
3252db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
3253db06104cSAdam Dybkowski int j;
3254db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
3255db06104cSAdam Dybkowski char *test_buffer = NULL;
3256db06104cSAdam Dybkowski
3257db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3258db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3259db06104cSAdam Dybkowski
3260db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3261db06104cSAdam Dybkowski return -ENOTSUP;
3262db06104cSAdam Dybkowski
3263db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3264db06104cSAdam Dybkowski return -ENOTSUP;
3265db06104cSAdam Dybkowski
3266db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_LB, 0);
3267db06104cSAdam Dybkowski if (test_buffer == NULL) {
3268db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
3269db06104cSAdam Dybkowski "Can't allocate buffer for 'im buffer' test\n");
3270db06104cSAdam Dybkowski return TEST_FAILED;
3271db06104cSAdam Dybkowski }
3272db06104cSAdam Dybkowski
3273db06104cSAdam Dybkowski struct interim_data_params int_data = {
3274db06104cSAdam Dybkowski (const char * const *)&test_buffer,
3275db06104cSAdam Dybkowski 1,
3276db06104cSAdam Dybkowski &i,
3277db06104cSAdam Dybkowski &ts_params->def_comp_xform,
3278db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
3279db06104cSAdam Dybkowski 1
3280db06104cSAdam Dybkowski };
3281db06104cSAdam Dybkowski
3282db06104cSAdam Dybkowski struct test_data_params test_data = {
3283db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
3284db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
3285db06104cSAdam Dybkowski /* must be LB to SGL,
3286db06104cSAdam Dybkowski * input LB buffer reaches its maximum,
3287db06104cSAdam Dybkowski * if ratio 1.3 than another mbuf must be
3288db06104cSAdam Dybkowski * created and attached
3289db06104cSAdam Dybkowski */
3290db06104cSAdam Dybkowski .buff_type = LB_BOTH,
3291db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
3292db06104cSAdam Dybkowski .out_of_space = 0,
3293db06104cSAdam Dybkowski .big_data = 1,
3294db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
3295db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
3296db06104cSAdam Dybkowski };
3297db06104cSAdam Dybkowski
3298db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3299db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
3300db06104cSAdam Dybkowski
3301db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
3302db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_LB);
3303db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_LB - 1; ++j)
3304db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3305db06104cSAdam Dybkowski
3306db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
3307db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3308db06104cSAdam Dybkowski ret = TEST_FAILED;
3309db06104cSAdam Dybkowski goto end;
3310db06104cSAdam Dybkowski }
3311db06104cSAdam Dybkowski
3312db06104cSAdam Dybkowski end:
3313db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3314db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
3315db06104cSAdam Dybkowski rte_free(test_buffer);
3316db06104cSAdam Dybkowski return ret;
3317db06104cSAdam Dybkowski }
3318db06104cSAdam Dybkowski
3319db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_LB_2ops_first(void)3320db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_2ops_first(void)
3321db06104cSAdam Dybkowski {
3322db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
3323db06104cSAdam Dybkowski uint16_t i = 0;
3324db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
3325db06104cSAdam Dybkowski int j;
3326db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
3327db06104cSAdam Dybkowski char *test_buffer = NULL;
3328db06104cSAdam Dybkowski const char *test_buffers[2];
3329db06104cSAdam Dybkowski
3330db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3331db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3332db06104cSAdam Dybkowski
3333db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3334db06104cSAdam Dybkowski return -ENOTSUP;
3335db06104cSAdam Dybkowski
3336db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3337db06104cSAdam Dybkowski return -ENOTSUP;
3338db06104cSAdam Dybkowski
3339db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_LB, 0);
3340db06104cSAdam Dybkowski if (test_buffer == NULL) {
3341db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
3342db06104cSAdam Dybkowski "Can't allocate buffer for 'im buffer' test\n");
3343db06104cSAdam Dybkowski return TEST_FAILED;
3344db06104cSAdam Dybkowski }
3345db06104cSAdam Dybkowski
3346db06104cSAdam Dybkowski test_buffers[0] = test_buffer;
3347db06104cSAdam Dybkowski test_buffers[1] = compress_test_bufs[0];
3348db06104cSAdam Dybkowski
3349db06104cSAdam Dybkowski struct interim_data_params int_data = {
3350db06104cSAdam Dybkowski (const char * const *)test_buffers,
3351db06104cSAdam Dybkowski 2,
3352db06104cSAdam Dybkowski &i,
3353db06104cSAdam Dybkowski &ts_params->def_comp_xform,
3354db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
3355db06104cSAdam Dybkowski 1
3356db06104cSAdam Dybkowski };
3357db06104cSAdam Dybkowski
3358db06104cSAdam Dybkowski struct test_data_params test_data = {
3359db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
3360db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
3361db06104cSAdam Dybkowski .buff_type = LB_BOTH,
3362db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
3363db06104cSAdam Dybkowski .out_of_space = 0,
3364db06104cSAdam Dybkowski .big_data = 1,
3365db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
3366db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
3367db06104cSAdam Dybkowski };
3368db06104cSAdam Dybkowski
3369db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3370db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
3371db06104cSAdam Dybkowski
3372db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
3373db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_LB);
3374db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_LB - 1; ++j)
3375db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3376db06104cSAdam Dybkowski
3377db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
3378db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3379db06104cSAdam Dybkowski ret = TEST_FAILED;
3380db06104cSAdam Dybkowski goto end;
3381db06104cSAdam Dybkowski }
3382db06104cSAdam Dybkowski
3383db06104cSAdam Dybkowski end:
3384db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3385db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
3386db06104cSAdam Dybkowski rte_free(test_buffer);
3387db06104cSAdam Dybkowski return ret;
3388db06104cSAdam Dybkowski }
3389db06104cSAdam Dybkowski
3390db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_LB_2ops_second(void)3391db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_2ops_second(void)
3392db06104cSAdam Dybkowski {
3393db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
3394db06104cSAdam Dybkowski uint16_t i = 0;
3395db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
3396db06104cSAdam Dybkowski int j;
3397db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
3398db06104cSAdam Dybkowski char *test_buffer = NULL;
3399db06104cSAdam Dybkowski const char *test_buffers[2];
3400db06104cSAdam Dybkowski
3401db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3402db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3403db06104cSAdam Dybkowski
3404db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3405db06104cSAdam Dybkowski return -ENOTSUP;
3406db06104cSAdam Dybkowski
3407db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3408db06104cSAdam Dybkowski return -ENOTSUP;
3409db06104cSAdam Dybkowski
3410db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_LB, 0);
3411db06104cSAdam Dybkowski if (test_buffer == NULL) {
3412db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
3413db06104cSAdam Dybkowski "Can't allocate buffer for 'im buffer' test\n");
3414db06104cSAdam Dybkowski return TEST_FAILED;
3415db06104cSAdam Dybkowski }
3416db06104cSAdam Dybkowski
3417db06104cSAdam Dybkowski test_buffers[0] = compress_test_bufs[0];
3418db06104cSAdam Dybkowski test_buffers[1] = test_buffer;
3419db06104cSAdam Dybkowski
3420db06104cSAdam Dybkowski struct interim_data_params int_data = {
3421db06104cSAdam Dybkowski (const char * const *)test_buffers,
3422db06104cSAdam Dybkowski 2,
3423db06104cSAdam Dybkowski &i,
3424db06104cSAdam Dybkowski &ts_params->def_comp_xform,
3425db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
3426db06104cSAdam Dybkowski 1
3427db06104cSAdam Dybkowski };
3428db06104cSAdam Dybkowski
3429db06104cSAdam Dybkowski struct test_data_params test_data = {
3430db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
3431db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
3432db06104cSAdam Dybkowski .buff_type = LB_BOTH,
3433db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
3434db06104cSAdam Dybkowski .out_of_space = 0,
3435db06104cSAdam Dybkowski .big_data = 1,
3436db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
3437db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
3438db06104cSAdam Dybkowski };
3439db06104cSAdam Dybkowski
3440db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3441db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
3442db06104cSAdam Dybkowski
3443db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
3444db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_LB);
3445db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_LB - 1; ++j)
3446db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3447db06104cSAdam Dybkowski
3448db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
3449db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3450db06104cSAdam Dybkowski ret = TEST_FAILED;
3451db06104cSAdam Dybkowski goto end;
3452db06104cSAdam Dybkowski }
3453db06104cSAdam Dybkowski
3454db06104cSAdam Dybkowski end:
3455db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3456db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
3457db06104cSAdam Dybkowski rte_free(test_buffer);
3458db06104cSAdam Dybkowski return ret;
3459db06104cSAdam Dybkowski }
3460db06104cSAdam Dybkowski
3461db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_LB_3ops(void)3462db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_3ops(void)
3463db06104cSAdam Dybkowski {
3464db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
3465db06104cSAdam Dybkowski uint16_t i = 0;
3466db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
3467db06104cSAdam Dybkowski int j;
3468db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
3469db06104cSAdam Dybkowski char *test_buffer = NULL;
3470db06104cSAdam Dybkowski const char *test_buffers[3];
3471db06104cSAdam Dybkowski
3472db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3473db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3474db06104cSAdam Dybkowski
3475db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3476db06104cSAdam Dybkowski return -ENOTSUP;
3477db06104cSAdam Dybkowski
3478db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3479db06104cSAdam Dybkowski return -ENOTSUP;
3480db06104cSAdam Dybkowski
3481db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_LB, 0);
3482db06104cSAdam Dybkowski if (test_buffer == NULL) {
3483db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
3484db06104cSAdam Dybkowski "Can't allocate buffer for 'im buffer' test\n");
3485db06104cSAdam Dybkowski return TEST_FAILED;
3486db06104cSAdam Dybkowski }
3487db06104cSAdam Dybkowski
3488db06104cSAdam Dybkowski test_buffers[0] = compress_test_bufs[0];
3489db06104cSAdam Dybkowski test_buffers[1] = test_buffer;
3490db06104cSAdam Dybkowski test_buffers[2] = compress_test_bufs[1];
3491db06104cSAdam Dybkowski
3492db06104cSAdam Dybkowski struct interim_data_params int_data = {
3493db06104cSAdam Dybkowski (const char * const *)test_buffers,
3494db06104cSAdam Dybkowski 3,
3495db06104cSAdam Dybkowski &i,
3496db06104cSAdam Dybkowski &ts_params->def_comp_xform,
3497db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
3498db06104cSAdam Dybkowski 1
3499db06104cSAdam Dybkowski };
3500db06104cSAdam Dybkowski
3501db06104cSAdam Dybkowski struct test_data_params test_data = {
3502db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
3503db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
3504db06104cSAdam Dybkowski .buff_type = LB_BOTH,
3505db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
3506db06104cSAdam Dybkowski .out_of_space = 0,
3507db06104cSAdam Dybkowski .big_data = 1,
3508db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
3509db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
3510db06104cSAdam Dybkowski };
3511db06104cSAdam Dybkowski
3512db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3513db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
3514db06104cSAdam Dybkowski
3515db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
3516db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_LB);
3517db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_LB - 1; ++j)
3518db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3519db06104cSAdam Dybkowski
3520db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
3521db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3522db06104cSAdam Dybkowski ret = TEST_FAILED;
3523db06104cSAdam Dybkowski goto end;
3524db06104cSAdam Dybkowski }
3525db06104cSAdam Dybkowski
3526db06104cSAdam Dybkowski end:
3527db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3528db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
3529db06104cSAdam Dybkowski rte_free(test_buffer);
3530db06104cSAdam Dybkowski return ret;
3531db06104cSAdam Dybkowski }
3532db06104cSAdam Dybkowski
3533db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_LB_4ops(void)3534db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_4ops(void)
3535db06104cSAdam Dybkowski {
3536db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
3537db06104cSAdam Dybkowski uint16_t i = 0;
3538db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
3539db06104cSAdam Dybkowski int j;
3540db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
3541db06104cSAdam Dybkowski char *test_buffer = NULL;
3542db06104cSAdam Dybkowski const char *test_buffers[4];
3543db06104cSAdam Dybkowski
3544db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3545db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3546db06104cSAdam Dybkowski
3547db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3548db06104cSAdam Dybkowski return -ENOTSUP;
3549db06104cSAdam Dybkowski
3550db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3551db06104cSAdam Dybkowski return -ENOTSUP;
3552db06104cSAdam Dybkowski
3553db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_LB, 0);
3554db06104cSAdam Dybkowski if (test_buffer == NULL) {
3555db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
3556db06104cSAdam Dybkowski "Can't allocate buffer for 'im buffer' test\n");
3557db06104cSAdam Dybkowski return TEST_FAILED;
3558db06104cSAdam Dybkowski }
3559db06104cSAdam Dybkowski
3560db06104cSAdam Dybkowski test_buffers[0] = compress_test_bufs[0];
3561db06104cSAdam Dybkowski test_buffers[1] = test_buffer;
3562db06104cSAdam Dybkowski test_buffers[2] = compress_test_bufs[1];
3563db06104cSAdam Dybkowski test_buffers[3] = test_buffer;
3564db06104cSAdam Dybkowski
3565db06104cSAdam Dybkowski struct interim_data_params int_data = {
3566db06104cSAdam Dybkowski (const char * const *)test_buffers,
3567db06104cSAdam Dybkowski 4,
3568db06104cSAdam Dybkowski &i,
3569db06104cSAdam Dybkowski &ts_params->def_comp_xform,
3570db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
3571db06104cSAdam Dybkowski 1
3572db06104cSAdam Dybkowski };
3573db06104cSAdam Dybkowski
3574db06104cSAdam Dybkowski struct test_data_params test_data = {
3575db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
3576db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
3577db06104cSAdam Dybkowski .buff_type = LB_BOTH,
3578db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
3579db06104cSAdam Dybkowski .out_of_space = 0,
3580db06104cSAdam Dybkowski .big_data = 1,
3581db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
3582db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
3583db06104cSAdam Dybkowski };
3584db06104cSAdam Dybkowski
3585db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3586db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
3587db06104cSAdam Dybkowski
3588db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
3589db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_LB);
3590db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_LB - 1; ++j)
3591db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3592db06104cSAdam Dybkowski
3593db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
3594db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3595db06104cSAdam Dybkowski ret = TEST_FAILED;
3596db06104cSAdam Dybkowski goto end;
3597db06104cSAdam Dybkowski }
3598db06104cSAdam Dybkowski
3599db06104cSAdam Dybkowski end:
3600db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3601db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
3602db06104cSAdam Dybkowski rte_free(test_buffer);
3603db06104cSAdam Dybkowski return ret;
3604db06104cSAdam Dybkowski }
3605db06104cSAdam Dybkowski
3606db06104cSAdam Dybkowski
3607db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_1op(void)3608db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_1op(void)
3609db06104cSAdam Dybkowski {
3610db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
3611db06104cSAdam Dybkowski uint16_t i = 0;
3612db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
3613db06104cSAdam Dybkowski int j;
3614db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
3615db06104cSAdam Dybkowski char *test_buffer = NULL;
3616db06104cSAdam Dybkowski
3617db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3618db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3619db06104cSAdam Dybkowski
3620db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3621db06104cSAdam Dybkowski return -ENOTSUP;
3622db06104cSAdam Dybkowski
3623db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3624db06104cSAdam Dybkowski return -ENOTSUP;
3625db06104cSAdam Dybkowski
3626db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_SGL, 0);
3627db06104cSAdam Dybkowski if (test_buffer == NULL) {
3628db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
3629db06104cSAdam Dybkowski "Can't allocate buffer for big-data\n");
3630db06104cSAdam Dybkowski return TEST_FAILED;
3631db06104cSAdam Dybkowski }
3632db06104cSAdam Dybkowski
3633db06104cSAdam Dybkowski struct interim_data_params int_data = {
3634db06104cSAdam Dybkowski (const char * const *)&test_buffer,
3635db06104cSAdam Dybkowski 1,
3636db06104cSAdam Dybkowski &i,
3637db06104cSAdam Dybkowski &ts_params->def_comp_xform,
3638db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
3639db06104cSAdam Dybkowski 1
3640db06104cSAdam Dybkowski };
3641db06104cSAdam Dybkowski
3642db06104cSAdam Dybkowski struct test_data_params test_data = {
3643db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
3644db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
3645db06104cSAdam Dybkowski .buff_type = SGL_BOTH,
3646db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
3647db06104cSAdam Dybkowski .out_of_space = 0,
3648db06104cSAdam Dybkowski .big_data = 1,
3649db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
3650db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
3651db06104cSAdam Dybkowski };
3652db06104cSAdam Dybkowski
3653db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3654db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
3655db06104cSAdam Dybkowski
3656db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
3657db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_SGL);
3658db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_SGL - 1; ++j)
3659db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3660db06104cSAdam Dybkowski
3661db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
3662db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3663db06104cSAdam Dybkowski ret = TEST_FAILED;
3664db06104cSAdam Dybkowski goto end;
3665db06104cSAdam Dybkowski }
3666db06104cSAdam Dybkowski
3667db06104cSAdam Dybkowski end:
3668db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3669db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
3670db06104cSAdam Dybkowski rte_free(test_buffer);
3671db06104cSAdam Dybkowski return ret;
3672db06104cSAdam Dybkowski }
3673db06104cSAdam Dybkowski
3674db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_2ops_first(void)3675db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_2ops_first(void)
3676db06104cSAdam Dybkowski {
3677db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
3678db06104cSAdam Dybkowski uint16_t i = 0;
3679db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
3680db06104cSAdam Dybkowski int j;
3681db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
3682db06104cSAdam Dybkowski char *test_buffer = NULL;
3683db06104cSAdam Dybkowski const char *test_buffers[2];
3684db06104cSAdam Dybkowski
3685db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3686db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3687db06104cSAdam Dybkowski
3688db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3689db06104cSAdam Dybkowski return -ENOTSUP;
3690db06104cSAdam Dybkowski
3691db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3692db06104cSAdam Dybkowski return -ENOTSUP;
3693db06104cSAdam Dybkowski
3694db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_SGL, 0);
3695db06104cSAdam Dybkowski if (test_buffer == NULL) {
3696db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
3697db06104cSAdam Dybkowski "Can't allocate buffer for big-data\n");
3698db06104cSAdam Dybkowski return TEST_FAILED;
3699db06104cSAdam Dybkowski }
3700db06104cSAdam Dybkowski
3701db06104cSAdam Dybkowski test_buffers[0] = test_buffer;
3702db06104cSAdam Dybkowski test_buffers[1] = compress_test_bufs[0];
3703db06104cSAdam Dybkowski
3704db06104cSAdam Dybkowski struct interim_data_params int_data = {
3705db06104cSAdam Dybkowski (const char * const *)test_buffers,
3706db06104cSAdam Dybkowski 2,
3707db06104cSAdam Dybkowski &i,
3708db06104cSAdam Dybkowski &ts_params->def_comp_xform,
3709db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
3710db06104cSAdam Dybkowski 1
3711db06104cSAdam Dybkowski };
3712db06104cSAdam Dybkowski
3713db06104cSAdam Dybkowski struct test_data_params test_data = {
3714db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
3715db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
3716db06104cSAdam Dybkowski .buff_type = SGL_BOTH,
3717db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
3718db06104cSAdam Dybkowski .out_of_space = 0,
3719db06104cSAdam Dybkowski .big_data = 1,
3720db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
3721db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
3722db06104cSAdam Dybkowski };
3723db06104cSAdam Dybkowski
3724db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3725db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
3726db06104cSAdam Dybkowski
3727db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
3728db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_SGL);
3729db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_SGL - 1; ++j)
3730db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3731db06104cSAdam Dybkowski
3732db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
3733db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3734db06104cSAdam Dybkowski ret = TEST_FAILED;
3735db06104cSAdam Dybkowski goto end;
3736db06104cSAdam Dybkowski }
3737db06104cSAdam Dybkowski
3738db06104cSAdam Dybkowski end:
3739db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3740db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
3741db06104cSAdam Dybkowski rte_free(test_buffer);
3742db06104cSAdam Dybkowski return ret;
3743db06104cSAdam Dybkowski }
3744db06104cSAdam Dybkowski
3745db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_2ops_second(void)3746db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_2ops_second(void)
3747db06104cSAdam Dybkowski {
3748db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
3749db06104cSAdam Dybkowski uint16_t i = 0;
3750db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
3751db06104cSAdam Dybkowski int j;
3752db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
3753db06104cSAdam Dybkowski char *test_buffer = NULL;
3754db06104cSAdam Dybkowski const char *test_buffers[2];
3755db06104cSAdam Dybkowski
3756db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3757db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3758db06104cSAdam Dybkowski
3759db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3760db06104cSAdam Dybkowski return -ENOTSUP;
3761db06104cSAdam Dybkowski
3762db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3763db06104cSAdam Dybkowski return -ENOTSUP;
3764db06104cSAdam Dybkowski
3765db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_SGL, 0);
3766db06104cSAdam Dybkowski if (test_buffer == NULL) {
3767db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
3768db06104cSAdam Dybkowski "Can't allocate buffer for big-data\n");
3769db06104cSAdam Dybkowski return TEST_FAILED;
3770db06104cSAdam Dybkowski }
3771db06104cSAdam Dybkowski
3772db06104cSAdam Dybkowski test_buffers[0] = compress_test_bufs[0];
3773db06104cSAdam Dybkowski test_buffers[1] = test_buffer;
3774db06104cSAdam Dybkowski
3775db06104cSAdam Dybkowski struct interim_data_params int_data = {
3776db06104cSAdam Dybkowski (const char * const *)test_buffers,
3777db06104cSAdam Dybkowski 2,
3778db06104cSAdam Dybkowski &i,
3779db06104cSAdam Dybkowski &ts_params->def_comp_xform,
3780db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
3781db06104cSAdam Dybkowski 1
3782db06104cSAdam Dybkowski };
3783db06104cSAdam Dybkowski
3784db06104cSAdam Dybkowski struct test_data_params test_data = {
3785db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
3786db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
3787db06104cSAdam Dybkowski .buff_type = SGL_BOTH,
3788db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
3789db06104cSAdam Dybkowski .out_of_space = 0,
3790db06104cSAdam Dybkowski .big_data = 1,
3791db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
3792db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
3793db06104cSAdam Dybkowski };
3794db06104cSAdam Dybkowski
3795db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3796db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
3797db06104cSAdam Dybkowski
3798db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
3799db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_SGL);
3800db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_SGL - 1; ++j)
3801db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3802db06104cSAdam Dybkowski
3803db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
3804db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3805db06104cSAdam Dybkowski ret = TEST_FAILED;
3806db06104cSAdam Dybkowski goto end;
3807db06104cSAdam Dybkowski }
3808db06104cSAdam Dybkowski
3809db06104cSAdam Dybkowski end:
3810db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3811db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
3812db06104cSAdam Dybkowski rte_free(test_buffer);
3813db06104cSAdam Dybkowski return ret;
3814db06104cSAdam Dybkowski }
3815db06104cSAdam Dybkowski
3816db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_3ops(void)3817db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_3ops(void)
3818db06104cSAdam Dybkowski {
3819db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
3820db06104cSAdam Dybkowski uint16_t i = 0;
3821db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
3822db06104cSAdam Dybkowski int j;
3823db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
3824db06104cSAdam Dybkowski char *test_buffer = NULL;
3825db06104cSAdam Dybkowski const char *test_buffers[3];
3826db06104cSAdam Dybkowski
3827db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3828db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3829db06104cSAdam Dybkowski
3830db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3831db06104cSAdam Dybkowski return -ENOTSUP;
3832db06104cSAdam Dybkowski
3833db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3834db06104cSAdam Dybkowski return -ENOTSUP;
3835db06104cSAdam Dybkowski
3836db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_SGL, 0);
3837db06104cSAdam Dybkowski if (test_buffer == NULL) {
3838db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
3839db06104cSAdam Dybkowski "Can't allocate buffer for big-data\n");
3840db06104cSAdam Dybkowski return TEST_FAILED;
3841db06104cSAdam Dybkowski }
3842db06104cSAdam Dybkowski
3843db06104cSAdam Dybkowski test_buffers[0] = compress_test_bufs[0];
3844db06104cSAdam Dybkowski test_buffers[1] = test_buffer;
3845db06104cSAdam Dybkowski test_buffers[2] = compress_test_bufs[1];
3846db06104cSAdam Dybkowski
3847db06104cSAdam Dybkowski struct interim_data_params int_data = {
3848db06104cSAdam Dybkowski (const char * const *)test_buffers,
3849db06104cSAdam Dybkowski 3,
3850db06104cSAdam Dybkowski &i,
3851db06104cSAdam Dybkowski &ts_params->def_comp_xform,
3852db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
3853db06104cSAdam Dybkowski 1
3854db06104cSAdam Dybkowski };
3855db06104cSAdam Dybkowski
3856db06104cSAdam Dybkowski struct test_data_params test_data = {
3857db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
3858db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
3859db06104cSAdam Dybkowski .buff_type = SGL_BOTH,
3860db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
3861db06104cSAdam Dybkowski .out_of_space = 0,
3862db06104cSAdam Dybkowski .big_data = 1,
3863db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
3864db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
3865db06104cSAdam Dybkowski };
3866db06104cSAdam Dybkowski
3867db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3868db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
3869db06104cSAdam Dybkowski
3870db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
3871db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_SGL);
3872db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_SGL - 1; ++j)
3873db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3874db06104cSAdam Dybkowski
3875db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
3876db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3877db06104cSAdam Dybkowski ret = TEST_FAILED;
3878db06104cSAdam Dybkowski goto end;
3879db06104cSAdam Dybkowski }
3880db06104cSAdam Dybkowski
3881db06104cSAdam Dybkowski end:
3882db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3883db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
3884db06104cSAdam Dybkowski rte_free(test_buffer);
3885db06104cSAdam Dybkowski return ret;
3886db06104cSAdam Dybkowski }
3887db06104cSAdam Dybkowski
3888db06104cSAdam Dybkowski
3889db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_4ops(void)3890db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_4ops(void)
3891db06104cSAdam Dybkowski {
3892db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
3893db06104cSAdam Dybkowski uint16_t i = 0;
3894db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
3895db06104cSAdam Dybkowski int j;
3896db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
3897db06104cSAdam Dybkowski char *test_buffer = NULL;
3898db06104cSAdam Dybkowski const char *test_buffers[4];
3899db06104cSAdam Dybkowski
3900db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3901db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3902db06104cSAdam Dybkowski
3903db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3904db06104cSAdam Dybkowski return -ENOTSUP;
3905db06104cSAdam Dybkowski
3906db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3907db06104cSAdam Dybkowski return -ENOTSUP;
3908db06104cSAdam Dybkowski
3909db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_SGL, 0);
3910db06104cSAdam Dybkowski if (test_buffer == NULL) {
3911db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
3912db06104cSAdam Dybkowski "Can't allocate buffer for big-data\n");
3913db06104cSAdam Dybkowski return TEST_FAILED;
3914db06104cSAdam Dybkowski }
3915db06104cSAdam Dybkowski
3916db06104cSAdam Dybkowski test_buffers[0] = compress_test_bufs[0];
3917db06104cSAdam Dybkowski test_buffers[1] = test_buffer;
3918db06104cSAdam Dybkowski test_buffers[2] = compress_test_bufs[1];
3919db06104cSAdam Dybkowski test_buffers[3] = test_buffer;
3920db06104cSAdam Dybkowski
3921db06104cSAdam Dybkowski struct interim_data_params int_data = {
3922db06104cSAdam Dybkowski (const char * const *)test_buffers,
3923db06104cSAdam Dybkowski 4,
3924db06104cSAdam Dybkowski &i,
3925db06104cSAdam Dybkowski &ts_params->def_comp_xform,
3926db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
3927db06104cSAdam Dybkowski 1
3928db06104cSAdam Dybkowski };
3929db06104cSAdam Dybkowski
3930db06104cSAdam Dybkowski struct test_data_params test_data = {
3931db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
3932db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
3933db06104cSAdam Dybkowski .buff_type = SGL_BOTH,
3934db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
3935db06104cSAdam Dybkowski .out_of_space = 0,
3936db06104cSAdam Dybkowski .big_data = 1,
3937db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
3938db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
3939db06104cSAdam Dybkowski };
3940db06104cSAdam Dybkowski
3941db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3942db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
3943db06104cSAdam Dybkowski
3944db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
3945db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_SGL);
3946db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_SGL - 1; ++j)
3947db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3948db06104cSAdam Dybkowski
3949db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
3950db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3951db06104cSAdam Dybkowski ret = TEST_FAILED;
3952db06104cSAdam Dybkowski goto end;
3953db06104cSAdam Dybkowski }
3954db06104cSAdam Dybkowski
3955db06104cSAdam Dybkowski end:
3956db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
3957db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
3958db06104cSAdam Dybkowski rte_free(test_buffer);
3959db06104cSAdam Dybkowski return ret;
3960db06104cSAdam Dybkowski }
3961db06104cSAdam Dybkowski
3962db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_over_1op(void)3963db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_over_1op(void)
3964db06104cSAdam Dybkowski {
3965db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
3966db06104cSAdam Dybkowski uint16_t i = 0;
3967db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
3968db06104cSAdam Dybkowski int j;
3969db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
3970db06104cSAdam Dybkowski char *test_buffer = NULL;
3971db06104cSAdam Dybkowski
3972db06104cSAdam Dybkowski RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
3973db06104cSAdam Dybkowski
3974db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3975db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3976db06104cSAdam Dybkowski
3977db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3978db06104cSAdam Dybkowski return -ENOTSUP;
3979db06104cSAdam Dybkowski
3980db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3981db06104cSAdam Dybkowski return -ENOTSUP;
3982db06104cSAdam Dybkowski
3983db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_OVER, 0);
3984db06104cSAdam Dybkowski if (test_buffer == NULL) {
3985db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
3986db06104cSAdam Dybkowski "Can't allocate buffer for big-data\n");
3987db06104cSAdam Dybkowski return TEST_FAILED;
3988db06104cSAdam Dybkowski }
3989db06104cSAdam Dybkowski
3990db06104cSAdam Dybkowski struct interim_data_params int_data = {
3991db06104cSAdam Dybkowski (const char * const *)&test_buffer,
3992db06104cSAdam Dybkowski 1,
3993db06104cSAdam Dybkowski &i,
3994db06104cSAdam Dybkowski &ts_params->def_comp_xform,
3995db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
3996db06104cSAdam Dybkowski 1
3997db06104cSAdam Dybkowski };
3998db06104cSAdam Dybkowski
3999db06104cSAdam Dybkowski struct test_data_params test_data = {
4000db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
4001db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
4002db06104cSAdam Dybkowski .buff_type = SGL_BOTH,
4003db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
4004db06104cSAdam Dybkowski .out_of_space = 0,
4005db06104cSAdam Dybkowski .big_data = 1,
4006db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
4007db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
4008db06104cSAdam Dybkowski };
4009db06104cSAdam Dybkowski
4010db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
4011db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
4012db06104cSAdam Dybkowski
4013db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
4014db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_OVER);
4015db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_OVER - 1; ++j)
4016db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
4017db06104cSAdam Dybkowski
4018db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
4019db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
4020db06104cSAdam Dybkowski ret = TEST_SUCCESS;
4021db06104cSAdam Dybkowski goto end;
4022db06104cSAdam Dybkowski }
4023db06104cSAdam Dybkowski
4024db06104cSAdam Dybkowski end:
4025db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
4026db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
4027db06104cSAdam Dybkowski rte_free(test_buffer);
4028db06104cSAdam Dybkowski
4029db06104cSAdam Dybkowski return ret;
4030db06104cSAdam Dybkowski }
4031db06104cSAdam Dybkowski
4032db06104cSAdam Dybkowski
4033db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_over_2ops_first(void)4034db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_over_2ops_first(void)
4035db06104cSAdam Dybkowski {
4036db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
4037db06104cSAdam Dybkowski uint16_t i = 0;
4038db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
4039db06104cSAdam Dybkowski int j;
4040db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
4041db06104cSAdam Dybkowski char *test_buffer = NULL;
4042db06104cSAdam Dybkowski const char *test_buffers[2];
4043db06104cSAdam Dybkowski
4044db06104cSAdam Dybkowski RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
4045db06104cSAdam Dybkowski
4046db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
4047db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
4048db06104cSAdam Dybkowski
4049db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
4050db06104cSAdam Dybkowski return -ENOTSUP;
4051db06104cSAdam Dybkowski
4052db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
4053db06104cSAdam Dybkowski return -ENOTSUP;
4054db06104cSAdam Dybkowski
4055db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_OVER, 0);
4056db06104cSAdam Dybkowski if (test_buffer == NULL) {
4057db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
4058db06104cSAdam Dybkowski "Can't allocate buffer for big-data\n");
4059db06104cSAdam Dybkowski return TEST_FAILED;
4060db06104cSAdam Dybkowski }
4061db06104cSAdam Dybkowski
4062db06104cSAdam Dybkowski test_buffers[0] = test_buffer;
4063db06104cSAdam Dybkowski test_buffers[1] = compress_test_bufs[0];
4064db06104cSAdam Dybkowski
4065db06104cSAdam Dybkowski struct interim_data_params int_data = {
4066db06104cSAdam Dybkowski (const char * const *)test_buffers,
4067db06104cSAdam Dybkowski 2,
4068db06104cSAdam Dybkowski &i,
4069db06104cSAdam Dybkowski &ts_params->def_comp_xform,
4070db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
4071db06104cSAdam Dybkowski 1
4072db06104cSAdam Dybkowski };
4073db06104cSAdam Dybkowski
4074db06104cSAdam Dybkowski struct test_data_params test_data = {
4075db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
4076db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
4077db06104cSAdam Dybkowski .buff_type = SGL_BOTH,
4078db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
4079db06104cSAdam Dybkowski .out_of_space = 0,
4080db06104cSAdam Dybkowski .big_data = 1,
4081db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
4082db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
4083db06104cSAdam Dybkowski };
4084db06104cSAdam Dybkowski
4085db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
4086db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
4087db06104cSAdam Dybkowski
4088db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
4089db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_OVER);
4090db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_OVER - 1; ++j)
4091db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
4092db06104cSAdam Dybkowski
4093db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
4094db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
4095db06104cSAdam Dybkowski ret = TEST_SUCCESS;
4096db06104cSAdam Dybkowski goto end;
4097db06104cSAdam Dybkowski }
4098db06104cSAdam Dybkowski
4099db06104cSAdam Dybkowski end:
4100db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
4101db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
4102db06104cSAdam Dybkowski rte_free(test_buffer);
4103db06104cSAdam Dybkowski return ret;
4104db06104cSAdam Dybkowski }
4105db06104cSAdam Dybkowski
4106db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_over_2ops_second(void)4107db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_over_2ops_second(void)
4108db06104cSAdam Dybkowski {
4109db06104cSAdam Dybkowski struct comp_testsuite_params *ts_params = &testsuite_params;
4110db06104cSAdam Dybkowski uint16_t i = 0;
4111db06104cSAdam Dybkowski int ret = TEST_SUCCESS;
4112db06104cSAdam Dybkowski int j;
4113db06104cSAdam Dybkowski const struct rte_compressdev_capabilities *capab;
4114db06104cSAdam Dybkowski char *test_buffer = NULL;
4115db06104cSAdam Dybkowski const char *test_buffers[2];
4116db06104cSAdam Dybkowski
4117db06104cSAdam Dybkowski RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
4118db06104cSAdam Dybkowski
4119db06104cSAdam Dybkowski capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
4120db06104cSAdam Dybkowski TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
4121db06104cSAdam Dybkowski
4122db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
4123db06104cSAdam Dybkowski return -ENOTSUP;
4124db06104cSAdam Dybkowski
4125db06104cSAdam Dybkowski if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
4126db06104cSAdam Dybkowski return -ENOTSUP;
4127db06104cSAdam Dybkowski
4128db06104cSAdam Dybkowski test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_OVER, 0);
4129db06104cSAdam Dybkowski if (test_buffer == NULL) {
4130db06104cSAdam Dybkowski RTE_LOG(ERR, USER1,
4131db06104cSAdam Dybkowski "Can't allocate buffer for big-data\n");
4132db06104cSAdam Dybkowski return TEST_FAILED;
4133db06104cSAdam Dybkowski }
4134db06104cSAdam Dybkowski
4135db06104cSAdam Dybkowski test_buffers[0] = compress_test_bufs[0];
4136db06104cSAdam Dybkowski test_buffers[1] = test_buffer;
4137db06104cSAdam Dybkowski
4138db06104cSAdam Dybkowski struct interim_data_params int_data = {
4139db06104cSAdam Dybkowski (const char * const *)test_buffers,
4140db06104cSAdam Dybkowski 2,
4141db06104cSAdam Dybkowski &i,
4142db06104cSAdam Dybkowski &ts_params->def_comp_xform,
4143db06104cSAdam Dybkowski &ts_params->def_decomp_xform,
4144db06104cSAdam Dybkowski 1
4145db06104cSAdam Dybkowski };
4146db06104cSAdam Dybkowski
4147db06104cSAdam Dybkowski struct test_data_params test_data = {
4148db06104cSAdam Dybkowski .compress_state = RTE_COMP_OP_STATELESS,
4149db06104cSAdam Dybkowski .decompress_state = RTE_COMP_OP_STATELESS,
4150db06104cSAdam Dybkowski .buff_type = SGL_BOTH,
4151db06104cSAdam Dybkowski .zlib_dir = ZLIB_NONE,
4152db06104cSAdam Dybkowski .out_of_space = 0,
4153db06104cSAdam Dybkowski .big_data = 1,
4154db06104cSAdam Dybkowski .overflow = OVERFLOW_DISABLED,
4155db06104cSAdam Dybkowski .ratio = RATIO_DISABLED
4156db06104cSAdam Dybkowski };
4157db06104cSAdam Dybkowski
4158db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
4159db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DYNAMIC;
4160db06104cSAdam Dybkowski
4161db06104cSAdam Dybkowski /* fill the buffer with data based on rand. data */
4162db06104cSAdam Dybkowski srand(IM_BUF_DATA_TEST_SIZE_OVER);
4163db06104cSAdam Dybkowski for (j = 0; j < IM_BUF_DATA_TEST_SIZE_OVER - 1; ++j)
4164db06104cSAdam Dybkowski test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
4165db06104cSAdam Dybkowski
4166db06104cSAdam Dybkowski /* Compress with compressdev, decompress with compressdev */
4167db06104cSAdam Dybkowski if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
4168db06104cSAdam Dybkowski ret = TEST_SUCCESS;
4169db06104cSAdam Dybkowski goto end;
4170db06104cSAdam Dybkowski }
4171db06104cSAdam Dybkowski
4172db06104cSAdam Dybkowski end:
4173db06104cSAdam Dybkowski ts_params->def_comp_xform->compress.deflate.huffman =
4174db06104cSAdam Dybkowski RTE_COMP_HUFFMAN_DEFAULT;
4175db06104cSAdam Dybkowski rte_free(test_buffer);
4176db06104cSAdam Dybkowski return ret;
4177db06104cSAdam Dybkowski }
4178db06104cSAdam Dybkowski
4179a9de470cSBruce Richardson static struct unit_test_suite compressdev_testsuite = {
4180a9de470cSBruce Richardson .suite_name = "compressdev unit test suite",
4181a9de470cSBruce Richardson .setup = testsuite_setup,
4182a9de470cSBruce Richardson .teardown = testsuite_teardown,
4183a9de470cSBruce Richardson .unit_test_cases = {
4184a9de470cSBruce Richardson TEST_CASE_ST(NULL, NULL,
4185a9de470cSBruce Richardson test_compressdev_invalid_configuration),
4186a9de470cSBruce Richardson TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4187a9de470cSBruce Richardson test_compressdev_deflate_stateless_fixed),
4188a9de470cSBruce Richardson TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4189a9de470cSBruce Richardson test_compressdev_deflate_stateless_dynamic),
4190a9de470cSBruce Richardson TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
41919df7ffd1STomasz Jozwiak test_compressdev_deflate_stateless_dynamic_big),
41929df7ffd1STomasz Jozwiak TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4193a9de470cSBruce Richardson test_compressdev_deflate_stateless_multi_op),
4194a9de470cSBruce Richardson TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4195a9de470cSBruce Richardson test_compressdev_deflate_stateless_multi_level),
4196a9de470cSBruce Richardson TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4197a9de470cSBruce Richardson test_compressdev_deflate_stateless_multi_xform),
4198a9de470cSBruce Richardson TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4199a9de470cSBruce Richardson test_compressdev_deflate_stateless_sgl),
4200a9de470cSBruce Richardson TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4201a9de470cSBruce Richardson test_compressdev_deflate_stateless_checksum),
4202a9de470cSBruce Richardson TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4203a9de470cSBruce Richardson test_compressdev_out_of_space_buffer),
420407b810c5SAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
420507b810c5SAdam Dybkowski test_compressdev_deflate_stateful_decomp),
420607b810c5SAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
420707b810c5SAdam Dybkowski test_compressdev_deflate_stateful_decomp_checksum),
42083fc3996fSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
42093fc3996fSAdam Dybkowski test_compressdev_external_mbufs),
42102437fbbcSArtur Trybula TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
42112437fbbcSArtur Trybula test_compressdev_deflate_stateless_fixed_oos_recoverable),
4212db06104cSAdam Dybkowski
4213db06104cSAdam Dybkowski /* Positive test cases for IM buffer handling verification */
4214db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4215db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_1op),
4216db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4217db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_2ops_first),
4218db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4219db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_2ops_second),
4220db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4221db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_3ops),
4222db06104cSAdam Dybkowski
4223db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4224db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_4ops),
4225db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4226db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_1op),
4227db06104cSAdam Dybkowski
4228db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4229db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_2ops_first),
4230db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4231db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_2ops_second),
4232db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4233db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_3ops),
4234db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4235db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_4ops),
4236db06104cSAdam Dybkowski
4237db06104cSAdam Dybkowski /* Negative test cases for IM buffer handling verification */
4238db06104cSAdam Dybkowski
4239db06104cSAdam Dybkowski /* For this test huge mempool is necessary.
4240db06104cSAdam Dybkowski * It tests one case:
4241db06104cSAdam Dybkowski * only one op containing big amount of data, so that
4242db06104cSAdam Dybkowski * number of requested descriptors higher than number
4243db06104cSAdam Dybkowski * of available descriptors (128)
4244db06104cSAdam Dybkowski */
4245db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4246db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_over_1op),
4247db06104cSAdam Dybkowski
4248db06104cSAdam Dybkowski /* For this test huge mempool is necessary.
4249db06104cSAdam Dybkowski * 2 ops. First op contains big amount of data:
4250db06104cSAdam Dybkowski * number of requested descriptors higher than number
4251db06104cSAdam Dybkowski * of available descriptors (128), the second op is
4252db06104cSAdam Dybkowski * relatively small. In this case both ops are rejected
4253db06104cSAdam Dybkowski */
4254db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4255db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_over_2ops_first),
4256db06104cSAdam Dybkowski
4257db06104cSAdam Dybkowski TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4258db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_over_2ops_second),
4259db06104cSAdam Dybkowski
4260a9de470cSBruce Richardson TEST_CASES_END() /**< NULL terminate unit test array */
4261a9de470cSBruce Richardson }
4262a9de470cSBruce Richardson };
4263a9de470cSBruce Richardson
4264a9de470cSBruce Richardson static int
test_compressdev(void)4265a9de470cSBruce Richardson test_compressdev(void)
4266a9de470cSBruce Richardson {
4267a9de470cSBruce Richardson return unit_test_suite_runner(&compressdev_testsuite);
4268a9de470cSBruce Richardson }
4269a9de470cSBruce Richardson
4270*d83fb967SDavid Marchand REGISTER_FAST_TEST(compressdev_autotest, false, true, test_compressdev);
4271