xref: /spdk/test/unit/lib/accel/dpdk_cryptodev.c/accel_dpdk_cryptodev_ut.c (revision 186b109dd3a723612e3df79bb3d97699173d39e3)
1f5d1a924SAlexey Marchuk /*   SPDX-License-Identifier: BSD-3-Clause
2f5d1a924SAlexey Marchuk  *   Copyright (C) 2018 Intel Corporation.
38f4d98bbSAlexey Marchuk  *   Copyright (c) 2022, 2023 NVIDIA CORPORATION & AFFILIATES.
4f5d1a924SAlexey Marchuk  *   All rights reserved.
5f5d1a924SAlexey Marchuk  */
6f5d1a924SAlexey Marchuk 
7ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
8f5d1a924SAlexey Marchuk 
9f5d1a924SAlexey Marchuk #include "spdk_internal/mock.h"
10f5d1a924SAlexey Marchuk #include "thread/thread_internal.h"
11f5d1a924SAlexey Marchuk #include "unit/lib/json_mock.c"
1261fbb000SAlexey Marchuk #include "common/lib/ut_multithread.c"
13f5d1a924SAlexey Marchuk 
14f5d1a924SAlexey Marchuk #include <rte_crypto.h>
15f5d1a924SAlexey Marchuk #include <rte_cryptodev.h>
1610dcf2dbSAlexey Marchuk #include <rte_version.h>
17f5d1a924SAlexey Marchuk 
18f5d1a924SAlexey Marchuk #define MAX_TEST_BLOCKS 8192
19f5d1a924SAlexey Marchuk struct rte_crypto_op *g_test_crypto_ops[MAX_TEST_BLOCKS];
20f5d1a924SAlexey Marchuk struct rte_crypto_op *g_test_dev_full_ops[MAX_TEST_BLOCKS];
21f5d1a924SAlexey Marchuk 
22f5d1a924SAlexey Marchuk uint16_t g_dequeue_mock;
23f5d1a924SAlexey Marchuk uint16_t g_enqueue_mock;
24f5d1a924SAlexey Marchuk unsigned ut_rte_crypto_op_bulk_alloc;
25f5d1a924SAlexey Marchuk int ut_rte_crypto_op_attach_sym_session = 0;
26f5d1a924SAlexey Marchuk #define MOCK_INFO_GET_1QP_AESNI 0
27f5d1a924SAlexey Marchuk #define MOCK_INFO_GET_1QP_QAT 1
28f5d1a924SAlexey Marchuk #define MOCK_INFO_GET_1QP_MLX5 2
29f5d1a924SAlexey Marchuk #define MOCK_INFO_GET_1QP_BOGUS_PMD 3
30f5d1a924SAlexey Marchuk int ut_rte_cryptodev_info_get = 0;
31f5d1a924SAlexey Marchuk bool ut_rte_cryptodev_info_get_mocked = false;
32f5d1a924SAlexey Marchuk 
33f5d1a924SAlexey Marchuk void mock_rte_pktmbuf_free_bulk(struct rte_mbuf **m, unsigned int cnt);
34f5d1a924SAlexey Marchuk #define rte_pktmbuf_free_bulk mock_rte_pktmbuf_free_bulk
35f5d1a924SAlexey Marchuk void
36f5d1a924SAlexey Marchuk mock_rte_pktmbuf_free_bulk(struct rte_mbuf **m, unsigned int cnt)
37f5d1a924SAlexey Marchuk {
38f5d1a924SAlexey Marchuk 	spdk_mempool_put_bulk((struct spdk_mempool *)m[0]->pool, (void **)m, cnt);
39f5d1a924SAlexey Marchuk }
40f5d1a924SAlexey Marchuk 
41f5d1a924SAlexey Marchuk void mock_rte_pktmbuf_free(struct rte_mbuf *m);
42f5d1a924SAlexey Marchuk #define rte_pktmbuf_free mock_rte_pktmbuf_free
43f5d1a924SAlexey Marchuk void
44f5d1a924SAlexey Marchuk mock_rte_pktmbuf_free(struct rte_mbuf *m)
45f5d1a924SAlexey Marchuk {
46f5d1a924SAlexey Marchuk 	spdk_mempool_put((struct spdk_mempool *)m->pool, (void *)m);
47f5d1a924SAlexey Marchuk }
48f5d1a924SAlexey Marchuk 
49f5d1a924SAlexey Marchuk void
50f5d1a924SAlexey Marchuk rte_mempool_free(struct rte_mempool *mp)
51f5d1a924SAlexey Marchuk {
52f5d1a924SAlexey Marchuk 	spdk_mempool_free((struct spdk_mempool *)mp);
53f5d1a924SAlexey Marchuk }
54f5d1a924SAlexey Marchuk 
55f5d1a924SAlexey Marchuk int mock_rte_pktmbuf_alloc_bulk(struct rte_mempool *pool, struct rte_mbuf **mbufs,
56f5d1a924SAlexey Marchuk 				unsigned count);
57f5d1a924SAlexey Marchuk #define rte_pktmbuf_alloc_bulk mock_rte_pktmbuf_alloc_bulk
58f5d1a924SAlexey Marchuk int
59f5d1a924SAlexey Marchuk mock_rte_pktmbuf_alloc_bulk(struct rte_mempool *pool, struct rte_mbuf **mbufs,
60f5d1a924SAlexey Marchuk 			    unsigned count)
61f5d1a924SAlexey Marchuk {
62f5d1a924SAlexey Marchuk 	int rc;
63f5d1a924SAlexey Marchuk 
64f5d1a924SAlexey Marchuk 	rc = spdk_mempool_get_bulk((struct spdk_mempool *)pool, (void **)mbufs, count);
65f5d1a924SAlexey Marchuk 	if (rc) {
66f5d1a924SAlexey Marchuk 		return rc;
67f5d1a924SAlexey Marchuk 	}
68f5d1a924SAlexey Marchuk 	for (unsigned i = 0; i < count; i++) {
69f5d1a924SAlexey Marchuk 		rte_pktmbuf_reset(mbufs[i]);
70f5d1a924SAlexey Marchuk 		mbufs[i]->pool = pool;
71f5d1a924SAlexey Marchuk 	}
72f5d1a924SAlexey Marchuk 	return rc;
73f5d1a924SAlexey Marchuk }
74f5d1a924SAlexey Marchuk 
75f5d1a924SAlexey Marchuk struct rte_mempool *
76f5d1a924SAlexey Marchuk rte_cryptodev_sym_session_pool_create(const char *name, uint32_t nb_elts,
77f5d1a924SAlexey Marchuk 				      uint32_t elt_size, uint32_t cache_size,
78f5d1a924SAlexey Marchuk 				      uint16_t priv_size, int socket_id)
79f5d1a924SAlexey Marchuk {
80f5d1a924SAlexey Marchuk 	struct spdk_mempool *tmp;
81f5d1a924SAlexey Marchuk 
82f5d1a924SAlexey Marchuk 	tmp = spdk_mempool_create(name, nb_elts, elt_size + priv_size,
83f5d1a924SAlexey Marchuk 				  cache_size, socket_id);
84f5d1a924SAlexey Marchuk 
85f5d1a924SAlexey Marchuk 	return (struct rte_mempool *)tmp;
86f5d1a924SAlexey Marchuk 
87f5d1a924SAlexey Marchuk }
88f5d1a924SAlexey Marchuk 
89f5d1a924SAlexey Marchuk struct rte_mempool *
90f5d1a924SAlexey Marchuk rte_pktmbuf_pool_create(const char *name, unsigned n, unsigned cache_size,
91f5d1a924SAlexey Marchuk 			uint16_t priv_size, uint16_t data_room_size, int socket_id)
92f5d1a924SAlexey Marchuk {
93f5d1a924SAlexey Marchuk 	struct spdk_mempool *tmp;
94f5d1a924SAlexey Marchuk 
95f5d1a924SAlexey Marchuk 	tmp = spdk_mempool_create(name, n, sizeof(struct rte_mbuf) + priv_size,
96f5d1a924SAlexey Marchuk 				  cache_size, socket_id);
97f5d1a924SAlexey Marchuk 
98f5d1a924SAlexey Marchuk 	return (struct rte_mempool *)tmp;
99f5d1a924SAlexey Marchuk }
100f5d1a924SAlexey Marchuk 
101f5d1a924SAlexey Marchuk struct rte_mempool *
102f5d1a924SAlexey Marchuk rte_mempool_create(const char *name, unsigned n, unsigned elt_size,
103f5d1a924SAlexey Marchuk 		   unsigned cache_size, unsigned private_data_size,
104f5d1a924SAlexey Marchuk 		   rte_mempool_ctor_t *mp_init, void *mp_init_arg,
105f5d1a924SAlexey Marchuk 		   rte_mempool_obj_cb_t *obj_init, void *obj_init_arg,
106f5d1a924SAlexey Marchuk 		   int socket_id, unsigned flags)
107f5d1a924SAlexey Marchuk {
108f5d1a924SAlexey Marchuk 	struct spdk_mempool *tmp;
109f5d1a924SAlexey Marchuk 
110f5d1a924SAlexey Marchuk 	tmp = spdk_mempool_create(name, n, elt_size + private_data_size,
111f5d1a924SAlexey Marchuk 				  cache_size, socket_id);
112f5d1a924SAlexey Marchuk 
113f5d1a924SAlexey Marchuk 	return (struct rte_mempool *)tmp;
114f5d1a924SAlexey Marchuk }
115f5d1a924SAlexey Marchuk 
116f5d1a924SAlexey Marchuk DEFINE_RETURN_MOCK(rte_crypto_op_pool_create, struct rte_mempool *);
117f5d1a924SAlexey Marchuk struct rte_mempool *
118f5d1a924SAlexey Marchuk rte_crypto_op_pool_create(const char *name, enum rte_crypto_op_type type,
119f5d1a924SAlexey Marchuk 			  unsigned nb_elts, unsigned cache_size,
120f5d1a924SAlexey Marchuk 			  uint16_t priv_size, int socket_id)
121f5d1a924SAlexey Marchuk {
122f5d1a924SAlexey Marchuk 	struct spdk_mempool *tmp;
123f5d1a924SAlexey Marchuk 
124f5d1a924SAlexey Marchuk 	HANDLE_RETURN_MOCK(rte_crypto_op_pool_create);
125f5d1a924SAlexey Marchuk 
126f5d1a924SAlexey Marchuk 	tmp = spdk_mempool_create(name, nb_elts,
127f5d1a924SAlexey Marchuk 				  sizeof(struct rte_crypto_op) + priv_size,
128f5d1a924SAlexey Marchuk 				  cache_size, socket_id);
129f5d1a924SAlexey Marchuk 
130f5d1a924SAlexey Marchuk 	return (struct rte_mempool *)tmp;
131f5d1a924SAlexey Marchuk 
132f5d1a924SAlexey Marchuk }
133f5d1a924SAlexey Marchuk 
134f5d1a924SAlexey Marchuk /* Those functions are defined as static inline in DPDK, so we can't
135f5d1a924SAlexey Marchuk  * mock them straight away. We use defines to redirect them into
136f5d1a924SAlexey Marchuk  * our custom functions.
137f5d1a924SAlexey Marchuk  */
138f5d1a924SAlexey Marchuk static bool g_resubmit_test = false;
139f5d1a924SAlexey Marchuk #define rte_cryptodev_enqueue_burst mock_rte_cryptodev_enqueue_burst
140f5d1a924SAlexey Marchuk static inline uint16_t
141f5d1a924SAlexey Marchuk mock_rte_cryptodev_enqueue_burst(uint8_t dev_id, uint16_t qp_id,
142f5d1a924SAlexey Marchuk 				 struct rte_crypto_op **ops, uint16_t nb_ops)
143f5d1a924SAlexey Marchuk {
144f5d1a924SAlexey Marchuk 	int i;
145f5d1a924SAlexey Marchuk 
146f5d1a924SAlexey Marchuk 	CU_ASSERT(nb_ops > 0);
147f5d1a924SAlexey Marchuk 
148f5d1a924SAlexey Marchuk 	for (i = 0; i < nb_ops; i++) {
149f5d1a924SAlexey Marchuk 		/* Use this empty (til now) array of pointers to store
150f5d1a924SAlexey Marchuk 		 * enqueued operations for assertion in dev_full test.
151f5d1a924SAlexey Marchuk 		 */
152f5d1a924SAlexey Marchuk 		g_test_dev_full_ops[i] = *ops++;
153f5d1a924SAlexey Marchuk 		if (g_resubmit_test == true) {
154f5d1a924SAlexey Marchuk 			CU_ASSERT(g_test_dev_full_ops[i] == (void *)0xDEADBEEF);
155f5d1a924SAlexey Marchuk 		}
156f5d1a924SAlexey Marchuk 	}
157f5d1a924SAlexey Marchuk 
158f5d1a924SAlexey Marchuk 	return g_enqueue_mock;
159f5d1a924SAlexey Marchuk }
160f5d1a924SAlexey Marchuk 
161f5d1a924SAlexey Marchuk #define rte_cryptodev_dequeue_burst mock_rte_cryptodev_dequeue_burst
162f5d1a924SAlexey Marchuk static inline uint16_t
163f5d1a924SAlexey Marchuk mock_rte_cryptodev_dequeue_burst(uint8_t dev_id, uint16_t qp_id,
164f5d1a924SAlexey Marchuk 				 struct rte_crypto_op **ops, uint16_t nb_ops)
165f5d1a924SAlexey Marchuk {
166f5d1a924SAlexey Marchuk 	int i;
167f5d1a924SAlexey Marchuk 
168f5d1a924SAlexey Marchuk 	CU_ASSERT(nb_ops > 0);
169f5d1a924SAlexey Marchuk 
170f5d1a924SAlexey Marchuk 	for (i = 0; i < g_dequeue_mock; i++) {
171f5d1a924SAlexey Marchuk 		*ops++ = g_test_crypto_ops[i];
172f5d1a924SAlexey Marchuk 	}
173f5d1a924SAlexey Marchuk 
174f5d1a924SAlexey Marchuk 	return g_dequeue_mock;
175f5d1a924SAlexey Marchuk }
176f5d1a924SAlexey Marchuk 
177f5d1a924SAlexey Marchuk /* Instead of allocating real memory, assign the allocations to our
178f5d1a924SAlexey Marchuk  * test array for assertion in tests.
179f5d1a924SAlexey Marchuk  */
180f5d1a924SAlexey Marchuk #define rte_crypto_op_bulk_alloc mock_rte_crypto_op_bulk_alloc
181f5d1a924SAlexey Marchuk static inline unsigned
182f5d1a924SAlexey Marchuk mock_rte_crypto_op_bulk_alloc(struct rte_mempool *mempool,
183f5d1a924SAlexey Marchuk 			      enum rte_crypto_op_type type,
184f5d1a924SAlexey Marchuk 			      struct rte_crypto_op **ops, uint16_t nb_ops)
185f5d1a924SAlexey Marchuk {
186f5d1a924SAlexey Marchuk 	int i;
187f5d1a924SAlexey Marchuk 
188f5d1a924SAlexey Marchuk 	for (i = 0; i < nb_ops; i++) {
189f5d1a924SAlexey Marchuk 		*ops++ = g_test_crypto_ops[i];
190f5d1a924SAlexey Marchuk 	}
191f5d1a924SAlexey Marchuk 	return ut_rte_crypto_op_bulk_alloc;
192f5d1a924SAlexey Marchuk }
193f5d1a924SAlexey Marchuk 
194f5d1a924SAlexey Marchuk #define rte_mempool_put_bulk mock_rte_mempool_put_bulk
195f5d1a924SAlexey Marchuk static __rte_always_inline void
196f5d1a924SAlexey Marchuk mock_rte_mempool_put_bulk(struct rte_mempool *mp, void *const *obj_table,
197f5d1a924SAlexey Marchuk 			  unsigned int n)
198f5d1a924SAlexey Marchuk {
199f5d1a924SAlexey Marchuk 	return;
200f5d1a924SAlexey Marchuk }
201f5d1a924SAlexey Marchuk #define rte_crypto_op_attach_sym_session mock_rte_crypto_op_attach_sym_session
20210dcf2dbSAlexey Marchuk #if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
20310dcf2dbSAlexey Marchuk static inline int
20410dcf2dbSAlexey Marchuk mock_rte_crypto_op_attach_sym_session(struct rte_crypto_op *op, void *sess)
20510dcf2dbSAlexey Marchuk #else
206f5d1a924SAlexey Marchuk static inline int
207f5d1a924SAlexey Marchuk mock_rte_crypto_op_attach_sym_session(struct rte_crypto_op *op,
208f5d1a924SAlexey Marchuk 				      struct rte_cryptodev_sym_session *sess)
20910dcf2dbSAlexey Marchuk #endif
210f5d1a924SAlexey Marchuk {
211f5d1a924SAlexey Marchuk 	return ut_rte_crypto_op_attach_sym_session;
212f5d1a924SAlexey Marchuk }
213f5d1a924SAlexey Marchuk 
214f5d1a924SAlexey Marchuk #define rte_lcore_count mock_rte_lcore_count
215f5d1a924SAlexey Marchuk static inline unsigned
216f5d1a924SAlexey Marchuk mock_rte_lcore_count(void)
217f5d1a924SAlexey Marchuk {
218f5d1a924SAlexey Marchuk 	return 1;
219f5d1a924SAlexey Marchuk }
220f5d1a924SAlexey Marchuk 
22161fbb000SAlexey Marchuk #include "accel/dpdk_cryptodev/accel_dpdk_cryptodev.c"
222f5d1a924SAlexey Marchuk 
22361fbb000SAlexey Marchuk /* accel stubs */
22461fbb000SAlexey Marchuk DEFINE_STUB_V(spdk_accel_task_complete, (struct spdk_accel_task *task, int status));
22561fbb000SAlexey Marchuk DEFINE_STUB_V(spdk_accel_module_finish, (void));
22661fbb000SAlexey Marchuk DEFINE_STUB_V(spdk_accel_module_list_add, (struct spdk_accel_module_if *accel_module));
227f5d1a924SAlexey Marchuk 
228f5d1a924SAlexey Marchuk /* DPDK stubs */
229f5d1a924SAlexey Marchuk #define DPDK_DYNFIELD_OFFSET offsetof(struct rte_mbuf, dynfield1[1])
230f5d1a924SAlexey Marchuk DEFINE_STUB(rte_mbuf_dynfield_register, int, (const struct rte_mbuf_dynfield *params),
231f5d1a924SAlexey Marchuk 	    DPDK_DYNFIELD_OFFSET);
232f5d1a924SAlexey Marchuk DEFINE_STUB(rte_cryptodev_count, uint8_t, (void), 0);
233f5d1a924SAlexey Marchuk DEFINE_STUB(rte_socket_id, unsigned, (void), 0);
234f5d1a924SAlexey Marchuk DEFINE_STUB(rte_cryptodev_device_count_by_driver, uint8_t, (uint8_t driver_id), 0);
235f5d1a924SAlexey Marchuk DEFINE_STUB(rte_cryptodev_configure, int, (uint8_t dev_id, struct rte_cryptodev_config *config), 0);
236f5d1a924SAlexey Marchuk DEFINE_STUB(rte_cryptodev_queue_pair_setup, int, (uint8_t dev_id, uint16_t queue_pair_id,
237f5d1a924SAlexey Marchuk 		const struct rte_cryptodev_qp_conf *qp_conf, int socket_id), 0);
238f5d1a924SAlexey Marchuk DEFINE_STUB(rte_cryptodev_start, int, (uint8_t dev_id), 0);
239f5d1a924SAlexey Marchuk DEFINE_STUB_V(rte_cryptodev_stop, (uint8_t dev_id));
240f5d1a924SAlexey Marchuk DEFINE_STUB(rte_cryptodev_close, int, (uint8_t dev_id), 0);
24110dcf2dbSAlexey Marchuk DEFINE_STUB(rte_vdev_init, int, (const char *name, const char *args), 0);
24210dcf2dbSAlexey Marchuk DEFINE_STUB(rte_vdev_uninit, int, (const char *name), 0);
24310dcf2dbSAlexey Marchuk 
24410dcf2dbSAlexey Marchuk #if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0)
24510dcf2dbSAlexey Marchuk DEFINE_STUB(rte_cryptodev_sym_session_create, void *,
24610dcf2dbSAlexey Marchuk 	    (uint8_t dev_id, struct rte_crypto_sym_xform *xforms, struct rte_mempool *mempool), (void *)1);
24710dcf2dbSAlexey Marchuk DEFINE_STUB(rte_cryptodev_sym_session_free, int, (uint8_t dev_id, void *sess), 0);
24810dcf2dbSAlexey Marchuk #else
249f5d1a924SAlexey Marchuk DEFINE_STUB(rte_cryptodev_sym_session_create, struct rte_cryptodev_sym_session *,
25010dcf2dbSAlexey Marchuk 	    (struct rte_mempool *mempool), (void *)1);
251f5d1a924SAlexey Marchuk DEFINE_STUB(rte_cryptodev_sym_session_init, int, (uint8_t dev_id,
252f5d1a924SAlexey Marchuk 		struct rte_cryptodev_sym_session *sess,
253f5d1a924SAlexey Marchuk 		struct rte_crypto_sym_xform *xforms, struct rte_mempool *mempool), 0);
254f5d1a924SAlexey Marchuk DEFINE_STUB(rte_cryptodev_sym_session_free, int, (struct rte_cryptodev_sym_session *sess), 0);
25510dcf2dbSAlexey Marchuk #endif
256f5d1a924SAlexey Marchuk 
257f5d1a924SAlexey Marchuk struct rte_cryptodev *rte_cryptodevs;
258f5d1a924SAlexey Marchuk 
259f5d1a924SAlexey Marchuk /* global vars and setup/cleanup functions used for all test functions */
260f5d1a924SAlexey Marchuk struct spdk_io_channel *g_io_ch;
26161fbb000SAlexey Marchuk struct accel_dpdk_cryptodev_io_channel *g_crypto_ch;
26261fbb000SAlexey Marchuk struct accel_dpdk_cryptodev_device g_aesni_crypto_dev;
26361fbb000SAlexey Marchuk struct accel_dpdk_cryptodev_qp g_aesni_qp;
26461fbb000SAlexey Marchuk struct accel_dpdk_cryptodev_key_handle g_key_handle;
26561fbb000SAlexey Marchuk struct accel_dpdk_cryptodev_key_priv g_key_priv;
26661fbb000SAlexey Marchuk struct spdk_accel_crypto_key g_key;
267f5d1a924SAlexey Marchuk 
268f5d1a924SAlexey Marchuk void
269f5d1a924SAlexey Marchuk rte_cryptodev_info_get(uint8_t dev_id, struct rte_cryptodev_info *dev_info)
270f5d1a924SAlexey Marchuk {
271f5d1a924SAlexey Marchuk 	dev_info->max_nb_queue_pairs = 1;
272f5d1a924SAlexey Marchuk 	if (ut_rte_cryptodev_info_get == MOCK_INFO_GET_1QP_AESNI) {
273f5d1a924SAlexey Marchuk 		dev_info->driver_name = g_driver_names[0];
274f5d1a924SAlexey Marchuk 	} else if (ut_rte_cryptodev_info_get == MOCK_INFO_GET_1QP_QAT) {
275f5d1a924SAlexey Marchuk 		dev_info->driver_name = g_driver_names[1];
276f5d1a924SAlexey Marchuk 	} else if (ut_rte_cryptodev_info_get == MOCK_INFO_GET_1QP_MLX5) {
277f5d1a924SAlexey Marchuk 		dev_info->driver_name = g_driver_names[2];
278f5d1a924SAlexey Marchuk 	} else if (ut_rte_cryptodev_info_get == MOCK_INFO_GET_1QP_BOGUS_PMD) {
279f5d1a924SAlexey Marchuk 		dev_info->driver_name = "junk";
280f5d1a924SAlexey Marchuk 	}
281f5d1a924SAlexey Marchuk }
282f5d1a924SAlexey Marchuk 
283f5d1a924SAlexey Marchuk unsigned int
284f5d1a924SAlexey Marchuk rte_cryptodev_sym_get_private_session_size(uint8_t dev_id)
285f5d1a924SAlexey Marchuk {
286f5d1a924SAlexey Marchuk 	return (unsigned int)dev_id;
287f5d1a924SAlexey Marchuk }
288f5d1a924SAlexey Marchuk 
289f5d1a924SAlexey Marchuk /* Global setup for all tests that share a bunch of preparation... */
290f5d1a924SAlexey Marchuk static int
291f5d1a924SAlexey Marchuk test_setup(void)
292f5d1a924SAlexey Marchuk {
293f5d1a924SAlexey Marchuk 	int i, rc;
294f5d1a924SAlexey Marchuk 
295f5d1a924SAlexey Marchuk 	/* Prepare essential variables for test routines */
29661fbb000SAlexey Marchuk 	g_io_ch = calloc(1, sizeof(*g_io_ch) + sizeof(struct accel_dpdk_cryptodev_io_channel));
29761fbb000SAlexey Marchuk 	g_crypto_ch = (struct accel_dpdk_cryptodev_io_channel *)spdk_io_channel_get_ctx(g_io_ch);
2988f36853aSAlexey Marchuk 	TAILQ_INIT(&g_crypto_ch->queued_tasks);
2996b7cca15SAlexey Marchuk 	TAILQ_INIT(&g_crypto_ch->completed_tasks);
300f5d1a924SAlexey Marchuk 
30161fbb000SAlexey Marchuk 	g_aesni_crypto_dev.type = ACCEL_DPDK_CRYPTODEV_DRIVER_AESNI_MB;
30261fbb000SAlexey Marchuk 	g_aesni_crypto_dev.qp_desc_nr = ACCEL_DPDK_CRYPTODEV_QP_DESCRIPTORS;
30361fbb000SAlexey Marchuk 	TAILQ_INIT(&g_aesni_crypto_dev.qpairs);
30461fbb000SAlexey Marchuk 
30561fbb000SAlexey Marchuk 	g_aesni_qp.device = &g_aesni_crypto_dev;
30661fbb000SAlexey Marchuk 	g_crypto_ch->device_qp[ACCEL_DPDK_CRYPTODEV_DRIVER_AESNI_MB] = &g_aesni_qp;
30761fbb000SAlexey Marchuk 
30861fbb000SAlexey Marchuk 	g_key_handle.device = &g_aesni_crypto_dev;
30961fbb000SAlexey Marchuk 	g_key_priv.driver = ACCEL_DPDK_CRYPTODEV_DRIVER_AESNI_MB;
3109cd94384SJacek Kalwas 	g_key_priv.cipher = SPDK_ACCEL_CIPHER_AES_CBC;
31161fbb000SAlexey Marchuk 	TAILQ_INIT(&g_key_priv.dev_keys);
31261fbb000SAlexey Marchuk 	TAILQ_INSERT_TAIL(&g_key_priv.dev_keys, &g_key_handle, link);
31361fbb000SAlexey Marchuk 	g_key.priv = &g_key_priv;
31461fbb000SAlexey Marchuk 	g_key.module_if = &g_accel_dpdk_cryptodev_module;
31561fbb000SAlexey Marchuk 
31661fbb000SAlexey Marchuk 
317f5d1a924SAlexey Marchuk 	/* Allocate a real mbuf pool so we can test error paths */
31861fbb000SAlexey Marchuk 	g_mbuf_mp = rte_pktmbuf_pool_create("mbuf_mp", ACCEL_DPDK_CRYPTODEV_NUM_MBUFS,
319f5d1a924SAlexey Marchuk 					    (unsigned)SPDK_MEMPOOL_DEFAULT_CACHE_SIZE,
320*186b109dSJim Harris 					    0, 0, SPDK_ENV_NUMA_ID_ANY);
321f5d1a924SAlexey Marchuk 	/* Instead of allocating real rte mempools for these, it's easier and provides the
322f5d1a924SAlexey Marchuk 	 * same coverage just calloc them here.
323f5d1a924SAlexey Marchuk 	 */
324f5d1a924SAlexey Marchuk 	for (i = 0; i < MAX_TEST_BLOCKS; i++) {
3259c636a02SAlexey Marchuk 		size_t size = ACCEL_DPDK_CRYPTODEV_IV_OFFSET + ACCEL_DPDK_CRYPTODEV_IV_LENGTH;
326f5d1a924SAlexey Marchuk 		rc = posix_memalign((void **)&g_test_crypto_ops[i], 64, size);
327f5d1a924SAlexey Marchuk 		if (rc != 0) {
328f5d1a924SAlexey Marchuk 			assert(false);
329f5d1a924SAlexey Marchuk 		}
3309c636a02SAlexey Marchuk 		memset(g_test_crypto_ops[i], 0, ACCEL_DPDK_CRYPTODEV_IV_OFFSET);
331f5d1a924SAlexey Marchuk 	}
332f5d1a924SAlexey Marchuk 	g_mbuf_offset = DPDK_DYNFIELD_OFFSET;
333f5d1a924SAlexey Marchuk 
334f5d1a924SAlexey Marchuk 	return 0;
335f5d1a924SAlexey Marchuk }
336f5d1a924SAlexey Marchuk 
337f5d1a924SAlexey Marchuk /* Global teardown for all tests */
338f5d1a924SAlexey Marchuk static int
339f5d1a924SAlexey Marchuk test_cleanup(void)
340f5d1a924SAlexey Marchuk {
341f5d1a924SAlexey Marchuk 	int i;
342f5d1a924SAlexey Marchuk 
343f5d1a924SAlexey Marchuk 	if (g_crypto_op_mp) {
344f5d1a924SAlexey Marchuk 		rte_mempool_free(g_crypto_op_mp);
345f5d1a924SAlexey Marchuk 		g_crypto_op_mp = NULL;
346f5d1a924SAlexey Marchuk 	}
347f5d1a924SAlexey Marchuk 	if (g_mbuf_mp) {
348f5d1a924SAlexey Marchuk 		rte_mempool_free(g_mbuf_mp);
349f5d1a924SAlexey Marchuk 		g_mbuf_mp = NULL;
350f5d1a924SAlexey Marchuk 	}
351f5d1a924SAlexey Marchuk 	if (g_session_mp) {
352f5d1a924SAlexey Marchuk 		rte_mempool_free(g_session_mp);
353f5d1a924SAlexey Marchuk 		g_session_mp = NULL;
354f5d1a924SAlexey Marchuk 	}
355f5d1a924SAlexey Marchuk 	if (g_session_mp_priv != NULL) {
356f5d1a924SAlexey Marchuk 		/* g_session_mp_priv may or may not be set depending on the DPDK version */
357f5d1a924SAlexey Marchuk 		rte_mempool_free(g_session_mp_priv);
358f5d1a924SAlexey Marchuk 		g_session_mp_priv = NULL;
359f5d1a924SAlexey Marchuk 	}
360f5d1a924SAlexey Marchuk 
361f5d1a924SAlexey Marchuk 	for (i = 0; i < MAX_TEST_BLOCKS; i++) {
362f5d1a924SAlexey Marchuk 		free(g_test_crypto_ops[i]);
363f5d1a924SAlexey Marchuk 	}
364f5d1a924SAlexey Marchuk 	free(g_io_ch);
365f5d1a924SAlexey Marchuk 	return 0;
366f5d1a924SAlexey Marchuk }
367f5d1a924SAlexey Marchuk 
368f5d1a924SAlexey Marchuk static void
369f5d1a924SAlexey Marchuk test_error_paths(void)
370f5d1a924SAlexey Marchuk {
37161fbb000SAlexey Marchuk 	/* Single element block size encrypt, just to test error paths
37261fbb000SAlexey Marchuk 	 * in accel_dpdk_cryptodev_submit_tasks() */
37361fbb000SAlexey Marchuk 	struct iovec src_iov = {.iov_base = (void *)0xDEADBEEF, .iov_len = 512 };
37461fbb000SAlexey Marchuk 	struct iovec dst_iov = src_iov;
37561fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_task task = {};
37661fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_key_priv key_priv = {};
37761fbb000SAlexey Marchuk 	struct spdk_accel_crypto_key key = {};
37861fbb000SAlexey Marchuk 	int rc;
37961fbb000SAlexey Marchuk 
3805105dc5dSKonrad Sztyber 	task.base.op_code = SPDK_ACCEL_OPC_ENCRYPT;
38161fbb000SAlexey Marchuk 	task.base.s.iovcnt = 1;
38261fbb000SAlexey Marchuk 	task.base.s.iovs = &src_iov;
38361fbb000SAlexey Marchuk 	task.base.d.iovcnt = 1;
38461fbb000SAlexey Marchuk 	task.base.d.iovs = &dst_iov;
38561fbb000SAlexey Marchuk 	task.base.block_size = 512;
38661fbb000SAlexey Marchuk 	task.base.crypto_key = &g_key;
38761fbb000SAlexey Marchuk 	task.base.iv = 1;
388f5d1a924SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = 1;
389f5d1a924SAlexey Marchuk 
39061fbb000SAlexey Marchuk 	/* case 1 - no crypto key */
39161fbb000SAlexey Marchuk 	task.base.crypto_key = NULL;
39261fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
39361fbb000SAlexey Marchuk 	CU_ASSERT(rc == -EINVAL);
39461fbb000SAlexey Marchuk 	task.base.crypto_key = &g_key;
395f5d1a924SAlexey Marchuk 
39661fbb000SAlexey Marchuk 	/* case 2 - crypto key with wrong module_if  */
39761fbb000SAlexey Marchuk 	key_priv.driver = ACCEL_DPDK_CRYPTODEV_DRIVER_AESNI_MB;
3989cd94384SJacek Kalwas 	key_priv.cipher = SPDK_ACCEL_CIPHER_AES_CBC;
39961fbb000SAlexey Marchuk 	TAILQ_INIT(&key_priv.dev_keys);
40061fbb000SAlexey Marchuk 	key.priv = &key_priv;
40161fbb000SAlexey Marchuk 	key.module_if = (struct spdk_accel_module_if *) 0x1;
40261fbb000SAlexey Marchuk 	task.base.crypto_key = &key;
40361fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
40461fbb000SAlexey Marchuk 	CU_ASSERT(rc == -EINVAL);
40561fbb000SAlexey Marchuk 	key.module_if = &g_accel_dpdk_cryptodev_module;
40661fbb000SAlexey Marchuk 
407bf8e0656SAlexey Marchuk 	/* case 3 - no key handle in the channel */
40861fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
40961fbb000SAlexey Marchuk 	CU_ASSERT(rc == -EINVAL);
41061fbb000SAlexey Marchuk 	task.base.crypto_key = &g_key;
41161fbb000SAlexey Marchuk 
412bf8e0656SAlexey Marchuk 	/* case 4 - invalid op */
4135105dc5dSKonrad Sztyber 	task.base.op_code = SPDK_ACCEL_OPC_COMPARE;
41461fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
41561fbb000SAlexey Marchuk 	CU_ASSERT(rc == -EINVAL);
4165105dc5dSKonrad Sztyber 	task.base.op_code = SPDK_ACCEL_OPC_ENCRYPT;
41761fbb000SAlexey Marchuk 
418bf8e0656SAlexey Marchuk 	/* case 5 - no entries in g_mbuf_mp */
41961fbb000SAlexey Marchuk 	MOCK_SET(spdk_mempool_get, NULL);
4208f36853aSAlexey Marchuk 	CU_ASSERT(TAILQ_EMPTY(&g_crypto_ch->queued_tasks) == true);
42161fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
4228f36853aSAlexey Marchuk 	CU_ASSERT(rc == 0);
4238f36853aSAlexey Marchuk 	CU_ASSERT(TAILQ_EMPTY(&g_crypto_ch->queued_tasks) == false);
4248f36853aSAlexey Marchuk 	CU_ASSERT(TAILQ_FIRST(&g_crypto_ch->queued_tasks) == &task);
425f5d1a924SAlexey Marchuk 	MOCK_CLEAR(spdk_mempool_get);
4268f36853aSAlexey Marchuk 	TAILQ_INIT(&g_crypto_ch->queued_tasks);
427f5d1a924SAlexey Marchuk 
428bf8e0656SAlexey Marchuk 	/* case 6 - vtophys error in accel_dpdk_cryptodev_mbuf_attach_buf */
42961fbb000SAlexey Marchuk 	MOCK_SET(spdk_vtophys, SPDK_VTOPHYS_ERROR);
43061fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
43161fbb000SAlexey Marchuk 	CU_ASSERT(rc == -EFAULT);
43261fbb000SAlexey Marchuk 	MOCK_CLEAR(spdk_vtophys);
433f5d1a924SAlexey Marchuk }
434f5d1a924SAlexey Marchuk 
435f5d1a924SAlexey Marchuk static void
43661fbb000SAlexey Marchuk test_simple_encrypt(void)
437f5d1a924SAlexey Marchuk {
43861fbb000SAlexey Marchuk 	struct iovec src_iov[4] = {[0] = {.iov_base = (void *)0xDEADBEEF, .iov_len = 512 }};
43961fbb000SAlexey Marchuk 	struct iovec dst_iov = src_iov[0];
44061fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_task task = {};
441bf8e0656SAlexey Marchuk 	struct rte_mbuf *mbuf, *next;
44261fbb000SAlexey Marchuk 	int rc, i;
44361fbb000SAlexey Marchuk 
4445105dc5dSKonrad Sztyber 	task.base.op_code = SPDK_ACCEL_OPC_ENCRYPT;
44561fbb000SAlexey Marchuk 	task.base.s.iovcnt = 1;
44661fbb000SAlexey Marchuk 	task.base.s.iovs = src_iov;
44761fbb000SAlexey Marchuk 	task.base.d.iovcnt = 1;
44861fbb000SAlexey Marchuk 	task.base.d.iovs = &dst_iov;
44961fbb000SAlexey Marchuk 	task.base.block_size = 512;
45061fbb000SAlexey Marchuk 	task.base.crypto_key = &g_key;
45161fbb000SAlexey Marchuk 	task.base.iv = 1;
452f5d1a924SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = 1;
453f5d1a924SAlexey Marchuk 
45461fbb000SAlexey Marchuk 	/* Inplace encryption */
4558f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
45661fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
45761fbb000SAlexey Marchuk 	CU_ASSERT(rc == 0);
458bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 1);
45961fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->buf_addr == src_iov[0].iov_base);
46061fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->data_len == src_iov[0].iov_len);
461f5d1a924SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->next == NULL);
462f5d1a924SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.length == 512);
463f5d1a924SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.offset == 0);
464f5d1a924SAlexey Marchuk 	CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
46561fbb000SAlexey Marchuk 				     uint64_t *) == (uint64_t)&task);
46661fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst == NULL);
46761fbb000SAlexey Marchuk 
46861fbb000SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_src);
46961fbb000SAlexey Marchuk 
47061fbb000SAlexey Marchuk 	/* out-of-place encryption */
4718f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
472bf8e0656SAlexey Marchuk 	task.cryop_submitted = 0;
47361fbb000SAlexey Marchuk 	dst_iov.iov_base = (void *)0xFEEDBEEF;
47461fbb000SAlexey Marchuk 
47561fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
47661fbb000SAlexey Marchuk 	CU_ASSERT(rc == 0);
477bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 1);
47861fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->buf_addr == src_iov[0].iov_base);
47961fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->data_len == src_iov[0].iov_len);
48061fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->next == NULL);
48161fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.length == 512);
48261fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.offset == 0);
48361fbb000SAlexey Marchuk 	CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
48461fbb000SAlexey Marchuk 				     uint64_t *) == (uint64_t)&task);
48561fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst->buf_addr == dst_iov.iov_base);
48661fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst->data_len == dst_iov.iov_len);
48761fbb000SAlexey Marchuk 
48861fbb000SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_src);
48961fbb000SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_dst);
49061fbb000SAlexey Marchuk 
49161fbb000SAlexey Marchuk 	/* out-of-place encryption, fragmented payload */
4928f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
49361fbb000SAlexey Marchuk 	task.base.s.iovcnt = 4;
49461fbb000SAlexey Marchuk 	for (i = 0; i < 4; i++) {
49561fbb000SAlexey Marchuk 		src_iov[i].iov_base = (void *)0xDEADBEEF + i * 128;
49661fbb000SAlexey Marchuk 		src_iov[i].iov_len = 128;
49761fbb000SAlexey Marchuk 	}
49861fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
49961fbb000SAlexey Marchuk 	CU_ASSERT(rc == 0);
500bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 1);
50161fbb000SAlexey Marchuk 	mbuf = g_test_crypto_ops[0]->sym->m_src;
502bf8e0656SAlexey Marchuk 	SPDK_CU_ASSERT_FATAL(mbuf != NULL);
50361fbb000SAlexey Marchuk 	CU_ASSERT(mbuf->buf_addr == src_iov[0].iov_base);
50461fbb000SAlexey Marchuk 	CU_ASSERT(mbuf->data_len == src_iov[0].iov_len);
50561fbb000SAlexey Marchuk 	mbuf = mbuf->next;
506bf8e0656SAlexey Marchuk 	for (i = 1; i < 4; i++) {
50761fbb000SAlexey Marchuk 		SPDK_CU_ASSERT_FATAL(mbuf != NULL);
50861fbb000SAlexey Marchuk 		CU_ASSERT(mbuf->buf_addr == src_iov[i].iov_base);
50961fbb000SAlexey Marchuk 		CU_ASSERT(mbuf->data_len == src_iov[i].iov_len);
510bf8e0656SAlexey Marchuk 		next = mbuf->next;
51161fbb000SAlexey Marchuk 		rte_pktmbuf_free(mbuf);
512bf8e0656SAlexey Marchuk 		mbuf = next;
51361fbb000SAlexey Marchuk 	}
51461fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.length == 512);
51561fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.offset == 0);
51661fbb000SAlexey Marchuk 	CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
51761fbb000SAlexey Marchuk 				     uint64_t *) == (uint64_t)&task);
51861fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst->buf_addr == dst_iov.iov_base);
51961fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst->data_len == dst_iov.iov_len);
520f5d1a924SAlexey Marchuk 
521f5d1a924SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_src);
522f5d1a924SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_dst);
523bf8e0656SAlexey Marchuk 
524bf8e0656SAlexey Marchuk 	/* Big logical block size, inplace encryption */
525bf8e0656SAlexey Marchuk 	src_iov[0].iov_len = ACCEL_DPDK_CRYPTODEV_MAX_MBUF_LEN * 4;
526bf8e0656SAlexey Marchuk 	dst_iov = src_iov[0];
527bf8e0656SAlexey Marchuk 	task.base.block_size = ACCEL_DPDK_CRYPTODEV_MAX_MBUF_LEN * 4;
528bf8e0656SAlexey Marchuk 	task.base.s.iovcnt = 1;
529bf8e0656SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = 1;
530bf8e0656SAlexey Marchuk 
531bf8e0656SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
532bf8e0656SAlexey Marchuk 	CU_ASSERT(rc == 0);
533bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 1);
534bf8e0656SAlexey Marchuk 	mbuf = g_test_crypto_ops[0]->sym->m_src;
535bf8e0656SAlexey Marchuk 	SPDK_CU_ASSERT_FATAL(mbuf != NULL);
536bf8e0656SAlexey Marchuk 	CU_ASSERT(mbuf->buf_addr == src_iov[0].iov_base);
537bf8e0656SAlexey Marchuk 	CU_ASSERT(mbuf->data_len == ACCEL_DPDK_CRYPTODEV_MAX_MBUF_LEN);
538bf8e0656SAlexey Marchuk 	mbuf = mbuf->next;
539bf8e0656SAlexey Marchuk 	for (i = 1; i < 4; i++) {
540bf8e0656SAlexey Marchuk 		SPDK_CU_ASSERT_FATAL(mbuf != NULL);
541bf8e0656SAlexey Marchuk 		CU_ASSERT(mbuf->buf_addr == (char *)src_iov[0].iov_base + i * ACCEL_DPDK_CRYPTODEV_MAX_MBUF_LEN);
542bf8e0656SAlexey Marchuk 		CU_ASSERT(mbuf->data_len == ACCEL_DPDK_CRYPTODEV_MAX_MBUF_LEN);
543bf8e0656SAlexey Marchuk 		next = mbuf->next;
544bf8e0656SAlexey Marchuk 		rte_pktmbuf_free(mbuf);
545bf8e0656SAlexey Marchuk 		mbuf = next;
546bf8e0656SAlexey Marchuk 	}
547bf8e0656SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.length == ACCEL_DPDK_CRYPTODEV_MAX_MBUF_LEN * 4);
548bf8e0656SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.offset == 0);
549bf8e0656SAlexey Marchuk 	CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
550bf8e0656SAlexey Marchuk 				     uint64_t *) == (uint64_t)&task);
551bf8e0656SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst == NULL);
552bf8e0656SAlexey Marchuk 
553bf8e0656SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_src);
554f5d1a924SAlexey Marchuk }
555f5d1a924SAlexey Marchuk 
556f5d1a924SAlexey Marchuk static void
55761fbb000SAlexey Marchuk test_simple_decrypt(void)
558f5d1a924SAlexey Marchuk {
55961fbb000SAlexey Marchuk 	struct iovec src_iov[4] = {[0] = {.iov_base = (void *)0xDEADBEEF, .iov_len = 512 }};
56061fbb000SAlexey Marchuk 	struct iovec dst_iov = src_iov[0];
56161fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_task task = {};
562bf8e0656SAlexey Marchuk 	struct rte_mbuf *mbuf, *next;
56361fbb000SAlexey Marchuk 	int rc, i;
56461fbb000SAlexey Marchuk 
5655105dc5dSKonrad Sztyber 	task.base.op_code = SPDK_ACCEL_OPC_DECRYPT;
56661fbb000SAlexey Marchuk 	task.base.s.iovcnt = 1;
56761fbb000SAlexey Marchuk 	task.base.s.iovs = src_iov;
56861fbb000SAlexey Marchuk 	task.base.d.iovcnt = 1;
56961fbb000SAlexey Marchuk 	task.base.d.iovs = &dst_iov;
57061fbb000SAlexey Marchuk 	task.base.block_size = 512;
57161fbb000SAlexey Marchuk 	task.base.crypto_key = &g_key;
57261fbb000SAlexey Marchuk 	task.base.iv = 1;
573f5d1a924SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = 1;
574f5d1a924SAlexey Marchuk 
57561fbb000SAlexey Marchuk 	/* Inplace decryption */
5768f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
57761fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
57861fbb000SAlexey Marchuk 	CU_ASSERT(rc == 0);
579bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 1);
58061fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->buf_addr == src_iov[0].iov_base);
58161fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->data_len == src_iov[0].iov_len);
582f5d1a924SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->next == NULL);
583f5d1a924SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.length == 512);
584f5d1a924SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.offset == 0);
585f5d1a924SAlexey Marchuk 	CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
58661fbb000SAlexey Marchuk 				     uint64_t *) == (uint64_t)&task);
587f5d1a924SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst == NULL);
588f5d1a924SAlexey Marchuk 
589f5d1a924SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_src);
59061fbb000SAlexey Marchuk 
59161fbb000SAlexey Marchuk 	/* out-of-place decryption */
5928f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
593bf8e0656SAlexey Marchuk 	task.cryop_submitted = 0;
59461fbb000SAlexey Marchuk 	dst_iov.iov_base = (void *)0xFEEDBEEF;
59561fbb000SAlexey Marchuk 
59661fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
59761fbb000SAlexey Marchuk 	CU_ASSERT(rc == 0);
598bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 1);
59961fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->buf_addr == src_iov[0].iov_base);
60061fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->data_len == src_iov[0].iov_len);
60161fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->next == NULL);
60261fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.length == 512);
60361fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.offset == 0);
60461fbb000SAlexey Marchuk 	CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
60561fbb000SAlexey Marchuk 				     uint64_t *) == (uint64_t)&task);
60661fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst->buf_addr == dst_iov.iov_base);
60761fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst->data_len == dst_iov.iov_len);
60861fbb000SAlexey Marchuk 
60961fbb000SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_src);
61061fbb000SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_dst);
61161fbb000SAlexey Marchuk 
61261fbb000SAlexey Marchuk 	/* out-of-place decryption, fragmented payload */
6138f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
61461fbb000SAlexey Marchuk 	task.base.s.iovcnt = 4;
61561fbb000SAlexey Marchuk 	for (i = 0; i < 4; i++) {
61661fbb000SAlexey Marchuk 		src_iov[i].iov_base = (void *)0xDEADBEEF + i * 128;
61761fbb000SAlexey Marchuk 		src_iov[i].iov_len = 128;
61861fbb000SAlexey Marchuk 	}
61961fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
62061fbb000SAlexey Marchuk 	CU_ASSERT(rc == 0);
621bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 1);
62261fbb000SAlexey Marchuk 	mbuf = g_test_crypto_ops[0]->sym->m_src;
623bf8e0656SAlexey Marchuk 	SPDK_CU_ASSERT_FATAL(mbuf != NULL);
62461fbb000SAlexey Marchuk 	CU_ASSERT(mbuf->buf_addr == src_iov[0].iov_base);
62561fbb000SAlexey Marchuk 	CU_ASSERT(mbuf->data_len == src_iov[0].iov_len);
62661fbb000SAlexey Marchuk 	mbuf = mbuf->next;
627bf8e0656SAlexey Marchuk 	for (i = 1; i < 4; i++) {
62861fbb000SAlexey Marchuk 		SPDK_CU_ASSERT_FATAL(mbuf != NULL);
62961fbb000SAlexey Marchuk 		CU_ASSERT(mbuf->buf_addr == src_iov[i].iov_base);
63061fbb000SAlexey Marchuk 		CU_ASSERT(mbuf->data_len == src_iov[i].iov_len);
631bf8e0656SAlexey Marchuk 		next = mbuf->next;
63261fbb000SAlexey Marchuk 		rte_pktmbuf_free(mbuf);
633bf8e0656SAlexey Marchuk 		mbuf = next;
63461fbb000SAlexey Marchuk 	}
63561fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.length == 512);
63661fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.offset == 0);
63761fbb000SAlexey Marchuk 	CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
63861fbb000SAlexey Marchuk 				     uint64_t *) == (uint64_t)&task);
63961fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst->buf_addr == dst_iov.iov_base);
64061fbb000SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst->data_len == dst_iov.iov_len);
64161fbb000SAlexey Marchuk 
64261fbb000SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_src);
64361fbb000SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_dst);
644bf8e0656SAlexey Marchuk 
645bf8e0656SAlexey Marchuk 	/* Big logical block size, inplace encryption */
646bf8e0656SAlexey Marchuk 	src_iov[0].iov_len = ACCEL_DPDK_CRYPTODEV_MAX_MBUF_LEN * 4;
647bf8e0656SAlexey Marchuk 	dst_iov = src_iov[0];
648bf8e0656SAlexey Marchuk 	task.base.block_size = ACCEL_DPDK_CRYPTODEV_MAX_MBUF_LEN * 4;
649bf8e0656SAlexey Marchuk 	task.base.s.iovcnt = 1;
650bf8e0656SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = 1;
651bf8e0656SAlexey Marchuk 
652bf8e0656SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
653bf8e0656SAlexey Marchuk 	CU_ASSERT(rc == 0);
654bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 1);
655bf8e0656SAlexey Marchuk 	mbuf = g_test_crypto_ops[0]->sym->m_src;
656bf8e0656SAlexey Marchuk 	SPDK_CU_ASSERT_FATAL(mbuf != NULL);
657bf8e0656SAlexey Marchuk 	CU_ASSERT(mbuf->buf_addr == src_iov[0].iov_base);
658bf8e0656SAlexey Marchuk 	CU_ASSERT(mbuf->data_len == ACCEL_DPDK_CRYPTODEV_MAX_MBUF_LEN);
659bf8e0656SAlexey Marchuk 	mbuf = mbuf->next;
660bf8e0656SAlexey Marchuk 	for (i = 1; i < 4; i++) {
661bf8e0656SAlexey Marchuk 		SPDK_CU_ASSERT_FATAL(mbuf != NULL);
662bf8e0656SAlexey Marchuk 		CU_ASSERT(mbuf->buf_addr == (char *)src_iov[0].iov_base + i * ACCEL_DPDK_CRYPTODEV_MAX_MBUF_LEN);
663bf8e0656SAlexey Marchuk 		CU_ASSERT(mbuf->data_len == ACCEL_DPDK_CRYPTODEV_MAX_MBUF_LEN);
664bf8e0656SAlexey Marchuk 		next = mbuf->next;
665bf8e0656SAlexey Marchuk 		rte_pktmbuf_free(mbuf);
666bf8e0656SAlexey Marchuk 		mbuf = next;
667bf8e0656SAlexey Marchuk 	}
668bf8e0656SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.length == ACCEL_DPDK_CRYPTODEV_MAX_MBUF_LEN * 4);
669bf8e0656SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.offset == 0);
670bf8e0656SAlexey Marchuk 	CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
671bf8e0656SAlexey Marchuk 				     uint64_t *) == (uint64_t)&task);
672bf8e0656SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst == NULL);
673bf8e0656SAlexey Marchuk 
674bf8e0656SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_src);
675f5d1a924SAlexey Marchuk }
676f5d1a924SAlexey Marchuk 
677f5d1a924SAlexey Marchuk static void
67861fbb000SAlexey Marchuk test_large_enc_dec(void)
679f5d1a924SAlexey Marchuk {
68061fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_task task = {};
68161fbb000SAlexey Marchuk 	uint32_t block_len = 512;
682bf8e0656SAlexey Marchuk 	uint32_t num_blocks = ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE * 2;
6838f4d98bbSAlexey Marchuk 	uint32_t iov_len = num_blocks * block_len / 16;
6848f4d98bbSAlexey Marchuk 	uint32_t blocks_in_iov = num_blocks / 16;
6858f4d98bbSAlexey Marchuk 	uint32_t iov_idx;
6868f4d98bbSAlexey Marchuk 	struct iovec src_iov[16];
6878f4d98bbSAlexey Marchuk 	struct iovec dst_iov[16];
68861fbb000SAlexey Marchuk 	uint32_t i;
68961fbb000SAlexey Marchuk 	int rc;
690f5d1a924SAlexey Marchuk 
6918f4d98bbSAlexey Marchuk 	for (i = 0; i < 16; i++) {
6928f4d98bbSAlexey Marchuk 		src_iov[i].iov_base = (void *)0xDEADBEEF + i * iov_len;
6938f4d98bbSAlexey Marchuk 		src_iov[i].iov_len = iov_len;
6948f4d98bbSAlexey Marchuk 
6958f4d98bbSAlexey Marchuk 		dst_iov[i].iov_base = (void *)0xDEADBEEF + i * iov_len;
6968f4d98bbSAlexey Marchuk 		dst_iov[i].iov_len = iov_len;
6978f4d98bbSAlexey Marchuk 	}
6988f4d98bbSAlexey Marchuk 
6995105dc5dSKonrad Sztyber 	task.base.op_code = SPDK_ACCEL_OPC_DECRYPT;
7008f4d98bbSAlexey Marchuk 	task.base.s.iovcnt = 16;
7018f4d98bbSAlexey Marchuk 	task.base.s.iovs = src_iov;
7028f4d98bbSAlexey Marchuk 	task.base.d.iovcnt = 16;
7038f4d98bbSAlexey Marchuk 	task.base.d.iovs = dst_iov;
70461fbb000SAlexey Marchuk 	task.base.block_size = 512;
70561fbb000SAlexey Marchuk 	task.base.crypto_key = &g_key;
70661fbb000SAlexey Marchuk 	task.base.iv = 1;
70761fbb000SAlexey Marchuk 
708bf8e0656SAlexey Marchuk 	/* Test 1. Multi block size decryption, multi-element, inplace */
7098f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
7109c636a02SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc =
7119c636a02SAlexey Marchuk 			ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE;
712f5d1a924SAlexey Marchuk 
71361fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
71461fbb000SAlexey Marchuk 	CU_ASSERT(rc == 0);
715bf8e0656SAlexey Marchuk 	CU_ASSERT(task.inplace == true);
716bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE);
717bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_total == num_blocks);
718bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_completed == 0);
719f5d1a924SAlexey Marchuk 
720bf8e0656SAlexey Marchuk 	for (i = 0; i < ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE; i++) {
7218f4d98bbSAlexey Marchuk 		iov_idx = i / blocks_in_iov;
7228f4d98bbSAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == src_iov[iov_idx].iov_base + ((
7238f4d98bbSAlexey Marchuk 					i % blocks_in_iov) * block_len));
724f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
725f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
726f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
727f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
728f5d1a924SAlexey Marchuk 		CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[i]->sym->m_src, g_mbuf_offset,
72961fbb000SAlexey Marchuk 					     uint64_t *) == (uint64_t)&task);
730f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst == NULL);
731f5d1a924SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_src);
732f5d1a924SAlexey Marchuk 	}
733f5d1a924SAlexey Marchuk 
734bf8e0656SAlexey Marchuk 	/* Call accel_dpdk_cryptodev_process_task like it was called by completion poller */
7358f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
736bf8e0656SAlexey Marchuk 	task.cryop_completed = task.cryop_submitted;
737bf8e0656SAlexey Marchuk 	rc = accel_dpdk_cryptodev_process_task(g_crypto_ch, &task);
738bf8e0656SAlexey Marchuk 
739bf8e0656SAlexey Marchuk 	CU_ASSERT(rc == 0);
7409c636a02SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE * 2);
741bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_total == task.cryop_submitted);
742bf8e0656SAlexey Marchuk 
743bf8e0656SAlexey Marchuk 	for (i = 0; i < ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE; i++) {
7448f4d98bbSAlexey Marchuk 		iov_idx = i / blocks_in_iov + 8;
7458f4d98bbSAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == src_iov[iov_idx].iov_base + ((
7468f4d98bbSAlexey Marchuk 					i % blocks_in_iov) * block_len));
747bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
748bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
749bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
750bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
751bf8e0656SAlexey Marchuk 		CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[i]->sym->m_src, g_mbuf_offset,
752bf8e0656SAlexey Marchuk 					     uint64_t *) == (uint64_t)&task);
753bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst == NULL);
754bf8e0656SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_src);
755bf8e0656SAlexey Marchuk 	}
756bf8e0656SAlexey Marchuk 
757bf8e0656SAlexey Marchuk 	/* Test 2. Multi block size decryption, multi-element, out-of-place */
7588f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
7598f4d98bbSAlexey Marchuk 	/* Modify dst to make payload out-of-place */
7608f4d98bbSAlexey Marchuk 	dst_iov[0].iov_base -= 1;
7619c636a02SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc =
7629c636a02SAlexey Marchuk 			ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE;
763f5d1a924SAlexey Marchuk 
76461fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
76561fbb000SAlexey Marchuk 	CU_ASSERT(rc == 0);
766bf8e0656SAlexey Marchuk 	CU_ASSERT(task.inplace == false);
767bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE);
768bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_total == num_blocks);
769bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_completed == 0);
770bf8e0656SAlexey Marchuk 
771bf8e0656SAlexey Marchuk 	for (i = 0; i < ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE; i++) {
7728f4d98bbSAlexey Marchuk 		iov_idx = i / blocks_in_iov;
7738f4d98bbSAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == src_iov[iov_idx].iov_base + ((
7748f4d98bbSAlexey Marchuk 					i % blocks_in_iov) * block_len));
775f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
776f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
777f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
778f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
779f5d1a924SAlexey Marchuk 		CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[i]->sym->m_src, g_mbuf_offset,
78061fbb000SAlexey Marchuk 					     uint64_t *) == (uint64_t)&task);
7818f4d98bbSAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->buf_addr == dst_iov[iov_idx].iov_base + ((
7828f4d98bbSAlexey Marchuk 					i % blocks_in_iov) * block_len));
783f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->data_len == block_len);
78461fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->next == NULL);
78561fbb000SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_src);
78661fbb000SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_dst);
78761fbb000SAlexey Marchuk 	}
78861fbb000SAlexey Marchuk 
789bf8e0656SAlexey Marchuk 	/* Call accel_dpdk_cryptodev_process_task like it was called by completion poller */
7908f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
791bf8e0656SAlexey Marchuk 	task.cryop_completed = task.cryop_submitted;
792bf8e0656SAlexey Marchuk 	rc = accel_dpdk_cryptodev_process_task(g_crypto_ch, &task);
793bf8e0656SAlexey Marchuk 
794bf8e0656SAlexey Marchuk 	CU_ASSERT(rc == 0);
7959c636a02SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE * 2);
796bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_total == task.cryop_submitted);
797bf8e0656SAlexey Marchuk 
798bf8e0656SAlexey Marchuk 	for (i = 0; i < ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE; i++) {
7998f4d98bbSAlexey Marchuk 		iov_idx = i / blocks_in_iov + 8;
8008f4d98bbSAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == src_iov[iov_idx].iov_base + ((
8018f4d98bbSAlexey Marchuk 					i % blocks_in_iov) * block_len));
802bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
803bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
804bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
805bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
806bf8e0656SAlexey Marchuk 		CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[i]->sym->m_src, g_mbuf_offset,
807bf8e0656SAlexey Marchuk 					     uint64_t *) == (uint64_t)&task);
8088f4d98bbSAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->buf_addr == dst_iov[iov_idx].iov_base + ((
8098f4d98bbSAlexey Marchuk 					i % blocks_in_iov) * block_len));
810bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->data_len == block_len);
811bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->next == NULL);
812bf8e0656SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_src);
813bf8e0656SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_dst);
814bf8e0656SAlexey Marchuk 	}
815bf8e0656SAlexey Marchuk 
816bf8e0656SAlexey Marchuk 	/* Test 3. Multi block size encryption, multi-element, inplace */
8178f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
8185105dc5dSKonrad Sztyber 	task.base.op_code = SPDK_ACCEL_OPC_ENCRYPT;
819bf8e0656SAlexey Marchuk 	task.cryop_submitted = 0;
8208f4d98bbSAlexey Marchuk 	/* Modify dst to make payload iplace */
8218f4d98bbSAlexey Marchuk 	dst_iov[0].iov_base += 1;
8229c636a02SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc =
8239c636a02SAlexey Marchuk 			ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE;
82461fbb000SAlexey Marchuk 
82561fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
82661fbb000SAlexey Marchuk 	CU_ASSERT(rc == 0);
827bf8e0656SAlexey Marchuk 	CU_ASSERT(task.inplace == true);
828bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE);
829bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_total == num_blocks);
830bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_completed == 0);
83161fbb000SAlexey Marchuk 
832bf8e0656SAlexey Marchuk 	for (i = 0; i < ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE; i++) {
8338f4d98bbSAlexey Marchuk 		iov_idx = i / blocks_in_iov;
8348f4d98bbSAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == src_iov[iov_idx].iov_base + ((
8358f4d98bbSAlexey Marchuk 					i % blocks_in_iov) * block_len));
83661fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
83761fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
83861fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
83961fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
84061fbb000SAlexey Marchuk 		CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[i]->sym->m_src, g_mbuf_offset,
84161fbb000SAlexey Marchuk 					     uint64_t *) == (uint64_t)&task);
84261fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst == NULL);
84361fbb000SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_src);
84461fbb000SAlexey Marchuk 	}
84561fbb000SAlexey Marchuk 
846bf8e0656SAlexey Marchuk 	/* Call accel_dpdk_cryptodev_process_task like it was called by completion poller */
8478f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
848bf8e0656SAlexey Marchuk 	task.cryop_completed = task.cryop_submitted;
849bf8e0656SAlexey Marchuk 	rc = accel_dpdk_cryptodev_process_task(g_crypto_ch, &task);
850bf8e0656SAlexey Marchuk 
851bf8e0656SAlexey Marchuk 	CU_ASSERT(rc == 0);
8529c636a02SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE * 2);
853bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_total == task.cryop_submitted);
854bf8e0656SAlexey Marchuk 
855bf8e0656SAlexey Marchuk 	for (i = 0; i < ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE; i++) {
8568f4d98bbSAlexey Marchuk 		iov_idx = i / blocks_in_iov + 8;
8578f4d98bbSAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == src_iov[iov_idx].iov_base + ((
8588f4d98bbSAlexey Marchuk 					i % blocks_in_iov) * block_len));
859bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
860bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
861bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
862bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
863bf8e0656SAlexey Marchuk 		CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[i]->sym->m_src, g_mbuf_offset,
864bf8e0656SAlexey Marchuk 					     uint64_t *) == (uint64_t)&task);
865bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst == NULL);
866bf8e0656SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_src);
867bf8e0656SAlexey Marchuk 	}
868bf8e0656SAlexey Marchuk 
86961fbb000SAlexey Marchuk 	/* Multi block size encryption, multi-element, out-of-place */
8708f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
871bf8e0656SAlexey Marchuk 	task.cryop_submitted = 0;
8728f4d98bbSAlexey Marchuk 	/* Modify dst to make payload out-of-place */
8738f4d98bbSAlexey Marchuk 	dst_iov[0].iov_base -= 1;
8749c636a02SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc =
8759c636a02SAlexey Marchuk 			ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE;
87661fbb000SAlexey Marchuk 
87761fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
878bf8e0656SAlexey Marchuk 	CU_ASSERT(task.inplace == false);
879bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE);
880bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_total == num_blocks);
881bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_completed == 0);
882bf8e0656SAlexey Marchuk 
883bf8e0656SAlexey Marchuk 	for (i = 0; i < ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE; i++) {
8848f4d98bbSAlexey Marchuk 		iov_idx = i / blocks_in_iov;
8858f4d98bbSAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == src_iov[iov_idx].iov_base + ((
8868f4d98bbSAlexey Marchuk 					i % blocks_in_iov) * block_len));
88761fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
88861fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
88961fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
89061fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
89161fbb000SAlexey Marchuk 		CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[i]->sym->m_src, g_mbuf_offset,
89261fbb000SAlexey Marchuk 					     uint64_t *) == (uint64_t)&task);
8938f4d98bbSAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->buf_addr == dst_iov[iov_idx].iov_base + ((
8948f4d98bbSAlexey Marchuk 					i % blocks_in_iov) * block_len));
89561fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->data_len == block_len);
89661fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->next == NULL);
897f5d1a924SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_src);
898f5d1a924SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_dst);
899f5d1a924SAlexey Marchuk 	}
900bf8e0656SAlexey Marchuk 
901bf8e0656SAlexey Marchuk 	/* Call accel_dpdk_cryptodev_process_task  like it was called by completion poller */
9028f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
903bf8e0656SAlexey Marchuk 	task.cryop_completed = task.cryop_submitted;
904bf8e0656SAlexey Marchuk 	rc = accel_dpdk_cryptodev_process_task(g_crypto_ch, &task);
905bf8e0656SAlexey Marchuk 
906bf8e0656SAlexey Marchuk 	CU_ASSERT(rc == 0);
9079c636a02SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE * 2);
908bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_total == task.cryop_submitted);
909bf8e0656SAlexey Marchuk 
910bf8e0656SAlexey Marchuk 	for (i = 0; i < ACCEL_DPDK_CRYPTODEV_MAX_ENQUEUE_ARRAY_SIZE; i++) {
9118f4d98bbSAlexey Marchuk 		iov_idx = i / blocks_in_iov + 8;
9128f4d98bbSAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == src_iov[iov_idx].iov_base + ((
9138f4d98bbSAlexey Marchuk 					i % blocks_in_iov) * block_len));
914bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
915bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
916bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
917bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
918bf8e0656SAlexey Marchuk 		CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[i]->sym->m_src, g_mbuf_offset,
919bf8e0656SAlexey Marchuk 					     uint64_t *) == (uint64_t)&task);
9208f4d98bbSAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->buf_addr == dst_iov[iov_idx].iov_base + ((
9218f4d98bbSAlexey Marchuk 					i % blocks_in_iov) * block_len));
922bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->data_len == block_len);
923bf8e0656SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->next == NULL);
924bf8e0656SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_src);
925bf8e0656SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_dst);
926bf8e0656SAlexey Marchuk 	}
927f5d1a924SAlexey Marchuk }
928f5d1a924SAlexey Marchuk 
929f5d1a924SAlexey Marchuk static void
930f5d1a924SAlexey Marchuk test_dev_full(void)
931f5d1a924SAlexey Marchuk {
93261fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_task task = {};
933f5d1a924SAlexey Marchuk 	struct rte_crypto_sym_op *sym_op;
93461fbb000SAlexey Marchuk 	struct iovec src_iov = {.iov_base = (void *)0xDEADBEEF, .iov_len = 1024 };
93561fbb000SAlexey Marchuk 	struct iovec dst_iov = src_iov;
93661fbb000SAlexey Marchuk 	int rc;
937f5d1a924SAlexey Marchuk 
9385105dc5dSKonrad Sztyber 	task.base.op_code = SPDK_ACCEL_OPC_DECRYPT;
93961fbb000SAlexey Marchuk 	task.base.s.iovcnt = 1;
94061fbb000SAlexey Marchuk 	task.base.s.iovs = &src_iov;
94161fbb000SAlexey Marchuk 	task.base.d.iovcnt = 1;
94261fbb000SAlexey Marchuk 	task.base.d.iovs = &dst_iov;
94361fbb000SAlexey Marchuk 	task.base.block_size = 512;
94461fbb000SAlexey Marchuk 	task.base.crypto_key = &g_key;
94561fbb000SAlexey Marchuk 	task.base.iv = 1;
94661fbb000SAlexey Marchuk 
9479c636a02SAlexey Marchuk 	/* Two element block size decryption, 2nd op was not submitted */
9488f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
949f5d1a924SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = 1;
950f5d1a924SAlexey Marchuk 	ut_rte_crypto_op_bulk_alloc = 2;
951f5d1a924SAlexey Marchuk 	g_test_crypto_ops[1]->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
952f5d1a924SAlexey Marchuk 
95361fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
95461fbb000SAlexey Marchuk 	CU_ASSERT(rc == 0);
9559c636a02SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 1);
9566b7cca15SAlexey Marchuk 	CU_ASSERT(task.cryop_total == 2);
957f5d1a924SAlexey Marchuk 	sym_op = g_test_crypto_ops[0]->sym;
95861fbb000SAlexey Marchuk 	CU_ASSERT(sym_op->m_src->buf_addr == src_iov.iov_base);
959f5d1a924SAlexey Marchuk 	CU_ASSERT(sym_op->m_src->data_len == 512);
960f5d1a924SAlexey Marchuk 	CU_ASSERT(sym_op->m_src->next == NULL);
961f5d1a924SAlexey Marchuk 	CU_ASSERT(sym_op->cipher.data.length == 512);
962f5d1a924SAlexey Marchuk 	CU_ASSERT(sym_op->cipher.data.offset == 0);
96361fbb000SAlexey Marchuk 	CU_ASSERT(*RTE_MBUF_DYNFIELD(sym_op->m_src, g_mbuf_offset, uint64_t *) == (uint64_t)&task);
964f5d1a924SAlexey Marchuk 	CU_ASSERT(sym_op->m_dst == NULL);
9659c636a02SAlexey Marchuk 	/* op which was not submitted is already released */
966f5d1a924SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_src);
9679c636a02SAlexey Marchuk 	task.cryop_submitted = 0;
9689c636a02SAlexey Marchuk 
9699c636a02SAlexey Marchuk 	/* Two element block size decryption, no ops were submitted, task should be queued */
9709c636a02SAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
9719c636a02SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = 0;
9729c636a02SAlexey Marchuk 	ut_rte_crypto_op_bulk_alloc = 2;
9739c636a02SAlexey Marchuk 	g_test_crypto_ops[0]->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
9749c636a02SAlexey Marchuk 	g_test_crypto_ops[1]->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
9759c636a02SAlexey Marchuk 
9769c636a02SAlexey Marchuk 	CU_ASSERT(TAILQ_EMPTY(&g_crypto_ch->queued_tasks) == true);
9779c636a02SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
9789c636a02SAlexey Marchuk 	CU_ASSERT(rc == 0);
9799c636a02SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 0);
9809c636a02SAlexey Marchuk 	CU_ASSERT(!TAILQ_EMPTY(&g_crypto_ch->queued_tasks));
9819c636a02SAlexey Marchuk 	CU_ASSERT(TAILQ_FIRST(&g_crypto_ch->queued_tasks) == &task);
9829c636a02SAlexey Marchuk 	TAILQ_INIT(&g_crypto_ch->queued_tasks);
983f5d1a924SAlexey Marchuk 
984f5d1a924SAlexey Marchuk 	/* Non-busy reason for enqueue failure, all were rejected. */
985f5d1a924SAlexey Marchuk 	g_enqueue_mock = 0;
9868f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
987f5d1a924SAlexey Marchuk 	g_test_crypto_ops[0]->status = RTE_CRYPTO_OP_STATUS_ERROR;
98861fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
98961fbb000SAlexey Marchuk 	CU_ASSERT(rc == -EINVAL);
9908f36853aSAlexey Marchuk 
9918f36853aSAlexey Marchuk 	/* QP is full, task should be queued */
9928f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = g_aesni_crypto_dev.qp_desc_nr;
9938f36853aSAlexey Marchuk 	CU_ASSERT(TAILQ_EMPTY(&g_crypto_ch->queued_tasks) == true);
9948f36853aSAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
9958f36853aSAlexey Marchuk 	CU_ASSERT(rc == 0);
9968f36853aSAlexey Marchuk 	CU_ASSERT(!TAILQ_EMPTY(&g_crypto_ch->queued_tasks));
9978f36853aSAlexey Marchuk 	CU_ASSERT(TAILQ_FIRST(&g_crypto_ch->queued_tasks) == &task);
9989c636a02SAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
9998f36853aSAlexey Marchuk 
10008f36853aSAlexey Marchuk 	TAILQ_INIT(&g_crypto_ch->queued_tasks);
10016b7cca15SAlexey Marchuk 
10026b7cca15SAlexey Marchuk 	/* Two element block size decryption, 2nd op was not submitted, but has RTE_CRYPTO_OP_STATUS_SUCCESS status */
10036b7cca15SAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
10046b7cca15SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = 1;
10056b7cca15SAlexey Marchuk 	ut_rte_crypto_op_bulk_alloc = 2;
10066b7cca15SAlexey Marchuk 	g_test_crypto_ops[1]->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
10076b7cca15SAlexey Marchuk 
10086b7cca15SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
10096b7cca15SAlexey Marchuk 	CU_ASSERT(rc == 0);
10106b7cca15SAlexey Marchuk 	CU_ASSERT(task.cryop_total == 2);
10116b7cca15SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 2);
10126b7cca15SAlexey Marchuk 	CU_ASSERT(task.cryop_completed == 1);
10136b7cca15SAlexey Marchuk 	sym_op = g_test_crypto_ops[0]->sym;
10146b7cca15SAlexey Marchuk 	CU_ASSERT(sym_op->m_src->buf_addr == src_iov.iov_base);
10156b7cca15SAlexey Marchuk 	CU_ASSERT(sym_op->m_src->data_len == 512);
10166b7cca15SAlexey Marchuk 	CU_ASSERT(sym_op->m_src->next == NULL);
10176b7cca15SAlexey Marchuk 	CU_ASSERT(sym_op->cipher.data.length == 512);
10186b7cca15SAlexey Marchuk 	CU_ASSERT(sym_op->cipher.data.offset == 0);
10196b7cca15SAlexey Marchuk 	CU_ASSERT(*RTE_MBUF_DYNFIELD(sym_op->m_src, g_mbuf_offset, uint64_t *) == (uint64_t)&task);
10206b7cca15SAlexey Marchuk 	CU_ASSERT(sym_op->m_dst == NULL);
10216b7cca15SAlexey Marchuk 	/* op which was not submitted is already released */
10226b7cca15SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_src);
10236b7cca15SAlexey Marchuk 
10246b7cca15SAlexey Marchuk 	/* Two element block size decryption, 1st op was not submitted, but has RTE_CRYPTO_OP_STATUS_SUCCESS status */
10256b7cca15SAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
10266b7cca15SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = 0;
10276b7cca15SAlexey Marchuk 	ut_rte_crypto_op_bulk_alloc = 2;
10286b7cca15SAlexey Marchuk 	g_test_crypto_ops[0]->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
10296b7cca15SAlexey Marchuk 
10306b7cca15SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
10316b7cca15SAlexey Marchuk 	CU_ASSERT(rc == 0);
10326b7cca15SAlexey Marchuk 	CU_ASSERT(task.cryop_total == 2);
10336b7cca15SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 1);
10346b7cca15SAlexey Marchuk 	CU_ASSERT(task.cryop_completed == 1);
10356b7cca15SAlexey Marchuk 	CU_ASSERT(!TAILQ_EMPTY(&g_crypto_ch->queued_tasks));
10366b7cca15SAlexey Marchuk 	CU_ASSERT(TAILQ_FIRST(&g_crypto_ch->queued_tasks) == &task);
10376b7cca15SAlexey Marchuk 	TAILQ_INIT(&g_crypto_ch->queued_tasks);
10386b7cca15SAlexey Marchuk 
10396b7cca15SAlexey Marchuk 	/* Single element block size decryption, 1st op was not submitted, but has RTE_CRYPTO_OP_STATUS_SUCCESS status.
10406b7cca15SAlexey Marchuk 	 * Task should be queued in the completed_tasks list */
10416b7cca15SAlexey Marchuk 	src_iov.iov_len = 512;
10426b7cca15SAlexey Marchuk 	dst_iov.iov_len = 512;
10436b7cca15SAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
10446b7cca15SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = 0;
10456b7cca15SAlexey Marchuk 	ut_rte_crypto_op_bulk_alloc = 1;
10466b7cca15SAlexey Marchuk 	g_test_crypto_ops[0]->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
10476b7cca15SAlexey Marchuk 
10486b7cca15SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
10496b7cca15SAlexey Marchuk 	CU_ASSERT(rc == 0);
10506b7cca15SAlexey Marchuk 	CU_ASSERT(task.cryop_total == 1);
10516b7cca15SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 1);
10526b7cca15SAlexey Marchuk 	CU_ASSERT(task.cryop_completed == 1);
10536b7cca15SAlexey Marchuk 	CU_ASSERT(!TAILQ_EMPTY(&g_crypto_ch->completed_tasks));
10546b7cca15SAlexey Marchuk 	CU_ASSERT(TAILQ_FIRST(&g_crypto_ch->completed_tasks) == &task);
10556b7cca15SAlexey Marchuk 	TAILQ_INIT(&g_crypto_ch->completed_tasks);
1056f5d1a924SAlexey Marchuk }
1057f5d1a924SAlexey Marchuk 
1058f5d1a924SAlexey Marchuk static void
1059f5d1a924SAlexey Marchuk test_crazy_rw(void)
1060f5d1a924SAlexey Marchuk {
106161fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_task task = {};
106261fbb000SAlexey Marchuk 	struct iovec src_iov[4] = {
106361fbb000SAlexey Marchuk 		[0] = {.iov_base = (void *)0xDEADBEEF, .iov_len = 512 },
106461fbb000SAlexey Marchuk 		[1] = {.iov_base = (void *)0xDEADBEEF + 512, .iov_len = 1024 },
106561fbb000SAlexey Marchuk 		[2] = {.iov_base = (void *)0xDEADBEEF + 512 + 1024, .iov_len = 512 }
106661fbb000SAlexey Marchuk 	};
106761fbb000SAlexey Marchuk 	struct iovec *dst_iov = src_iov;
106861fbb000SAlexey Marchuk 	uint32_t block_len = 512, num_blocks = 4, i;
106961fbb000SAlexey Marchuk 	int rc;
107061fbb000SAlexey Marchuk 
10715105dc5dSKonrad Sztyber 	task.base.op_code = SPDK_ACCEL_OPC_DECRYPT;
107261fbb000SAlexey Marchuk 	task.base.s.iovcnt = 3;
107361fbb000SAlexey Marchuk 	task.base.s.iovs = src_iov;
107461fbb000SAlexey Marchuk 	task.base.d.iovcnt = 3;
107561fbb000SAlexey Marchuk 	task.base.d.iovs = dst_iov;
107661fbb000SAlexey Marchuk 	task.base.block_size = 512;
107761fbb000SAlexey Marchuk 	task.base.crypto_key = &g_key;
107861fbb000SAlexey Marchuk 	task.base.iv = 1;
1079f5d1a924SAlexey Marchuk 
1080f5d1a924SAlexey Marchuk 	/* Multi block size read, single element, strange IOV makeup */
1081f5d1a924SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = num_blocks;
10828f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
1083f5d1a924SAlexey Marchuk 
108461fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
108561fbb000SAlexey Marchuk 	CU_ASSERT(rc == 0);
1086bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == num_blocks);
1087f5d1a924SAlexey Marchuk 
1088f5d1a924SAlexey Marchuk 	for (i = 0; i < num_blocks; i++) {
1089f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
1090f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
1091f5d1a924SAlexey Marchuk 		CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[i]->sym->m_src, g_mbuf_offset,
109261fbb000SAlexey Marchuk 					     uint64_t *) == (uint64_t)&task);
109361fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
109461fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == src_iov[0].iov_base + (i * block_len));
109561fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
1096f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst == NULL);
1097f5d1a924SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_src);
1098f5d1a924SAlexey Marchuk 	}
1099f5d1a924SAlexey Marchuk 
1100f5d1a924SAlexey Marchuk 	/* Multi block size write, single element strange IOV makeup */
1101f5d1a924SAlexey Marchuk 	num_blocks = 8;
11025105dc5dSKonrad Sztyber 	task.base.op_code = SPDK_ACCEL_OPC_ENCRYPT;
1103bf8e0656SAlexey Marchuk 	task.cryop_submitted = 0;
110461fbb000SAlexey Marchuk 	task.base.s.iovcnt = 4;
110561fbb000SAlexey Marchuk 	task.base.d.iovcnt = 4;
110661fbb000SAlexey Marchuk 	task.base.s.iovs[0].iov_len = 2048;
110761fbb000SAlexey Marchuk 	task.base.s.iovs[0].iov_base = (void *)0xDEADBEEF;
110861fbb000SAlexey Marchuk 	task.base.s.iovs[1].iov_len = 512;
110961fbb000SAlexey Marchuk 	task.base.s.iovs[1].iov_base = (void *)0xDEADBEEF + 2048;
111061fbb000SAlexey Marchuk 	task.base.s.iovs[2].iov_len = 512;
111161fbb000SAlexey Marchuk 	task.base.s.iovs[2].iov_base = (void *)0xDEADBEEF + 2048 + 512;
111261fbb000SAlexey Marchuk 	task.base.s.iovs[3].iov_len = 1024;
111361fbb000SAlexey Marchuk 	task.base.s.iovs[3].iov_base = (void *)0xDEADBEEF + 2048 + 512 + 512;
1114f5d1a924SAlexey Marchuk 
1115f5d1a924SAlexey Marchuk 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = num_blocks;
11168f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
1117f5d1a924SAlexey Marchuk 
111861fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_submit_tasks(g_io_ch, &task.base);
111961fbb000SAlexey Marchuk 	CU_ASSERT(rc == 0);
1120bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == num_blocks);
1121f5d1a924SAlexey Marchuk 
1122f5d1a924SAlexey Marchuk 	for (i = 0; i < num_blocks; i++) {
1123f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
1124f5d1a924SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
1125f5d1a924SAlexey Marchuk 		CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[i]->sym->m_src, g_mbuf_offset,
112661fbb000SAlexey Marchuk 					     uint64_t *) == (uint64_t)&task);
112761fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
112861fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == src_iov[0].iov_base + (i * block_len));
112961fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
113061fbb000SAlexey Marchuk 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst == NULL);
1131f5d1a924SAlexey Marchuk 		rte_pktmbuf_free(g_test_crypto_ops[i]->sym->m_src);
1132f5d1a924SAlexey Marchuk 	}
1133f5d1a924SAlexey Marchuk }
1134f5d1a924SAlexey Marchuk 
1135f5d1a924SAlexey Marchuk static void
1136f5d1a924SAlexey Marchuk init_cleanup(void)
1137f5d1a924SAlexey Marchuk {
113861fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_device *dev, *tmp;
113961fbb000SAlexey Marchuk 
1140f5d1a924SAlexey Marchuk 	if (g_crypto_op_mp) {
1141f5d1a924SAlexey Marchuk 		rte_mempool_free(g_crypto_op_mp);
1142f5d1a924SAlexey Marchuk 		g_crypto_op_mp = NULL;
1143f5d1a924SAlexey Marchuk 	}
1144f5d1a924SAlexey Marchuk 	if (g_mbuf_mp) {
1145f5d1a924SAlexey Marchuk 		rte_mempool_free(g_mbuf_mp);
1146f5d1a924SAlexey Marchuk 		g_mbuf_mp = NULL;
1147f5d1a924SAlexey Marchuk 	}
1148f5d1a924SAlexey Marchuk 	if (g_session_mp) {
1149f5d1a924SAlexey Marchuk 		rte_mempool_free(g_session_mp);
1150f5d1a924SAlexey Marchuk 		g_session_mp = NULL;
1151f5d1a924SAlexey Marchuk 	}
1152f5d1a924SAlexey Marchuk 	if (g_session_mp_priv != NULL) {
1153f5d1a924SAlexey Marchuk 		/* g_session_mp_priv may or may not be set depending on the DPDK version */
1154f5d1a924SAlexey Marchuk 		rte_mempool_free(g_session_mp_priv);
1155f5d1a924SAlexey Marchuk 		g_session_mp_priv = NULL;
1156f5d1a924SAlexey Marchuk 	}
115761fbb000SAlexey Marchuk 
115861fbb000SAlexey Marchuk 	TAILQ_FOREACH_SAFE(dev, &g_crypto_devices, link, tmp) {
115961fbb000SAlexey Marchuk 		TAILQ_REMOVE(&g_crypto_devices, dev, link);
116061fbb000SAlexey Marchuk 		accel_dpdk_cryptodev_release(dev);
116161fbb000SAlexey Marchuk 	}
116261fbb000SAlexey Marchuk 
116361fbb000SAlexey Marchuk 	spdk_io_device_unregister(&g_accel_dpdk_cryptodev_module, NULL);
1164f5d1a924SAlexey Marchuk }
1165f5d1a924SAlexey Marchuk 
1166f5d1a924SAlexey Marchuk static void
1167f5d1a924SAlexey Marchuk test_initdrivers(void)
1168f5d1a924SAlexey Marchuk {
1169f5d1a924SAlexey Marchuk 	int rc;
1170f5d1a924SAlexey Marchuk 	static struct rte_mempool *orig_mbuf_mp;
1171f5d1a924SAlexey Marchuk 	static struct rte_mempool *orig_session_mp;
1172f5d1a924SAlexey Marchuk 	static struct rte_mempool *orig_session_mp_priv;
1173f5d1a924SAlexey Marchuk 
117461fbb000SAlexey Marchuk 	/* accel_dpdk_cryptodev_init calls spdk_io_device_register, we need to have a thread */
117561fbb000SAlexey Marchuk 	allocate_threads(1);
117661fbb000SAlexey Marchuk 	set_thread(0);
117761fbb000SAlexey Marchuk 
1178f5d1a924SAlexey Marchuk 	/* These tests will alloc and free our g_mbuf_mp
1179f5d1a924SAlexey Marchuk 	 * so save that off here and restore it after each test is over.
1180f5d1a924SAlexey Marchuk 	 */
1181f5d1a924SAlexey Marchuk 	orig_mbuf_mp = g_mbuf_mp;
1182f5d1a924SAlexey Marchuk 	orig_session_mp = g_session_mp;
1183f5d1a924SAlexey Marchuk 	orig_session_mp_priv = g_session_mp_priv;
1184f5d1a924SAlexey Marchuk 
1185f5d1a924SAlexey Marchuk 	g_session_mp_priv = NULL;
1186f5d1a924SAlexey Marchuk 	g_session_mp = NULL;
1187f5d1a924SAlexey Marchuk 	g_mbuf_mp = NULL;
1188f5d1a924SAlexey Marchuk 
1189f5d1a924SAlexey Marchuk 	/* No drivers available, not an error though */
1190f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_count, 0);
119161fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_init();
11921f88c365STomasz Zawadzki 	CU_ASSERT(rc == -ENODEV);
1193f5d1a924SAlexey Marchuk 	CU_ASSERT(g_mbuf_mp == NULL);
1194f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp == NULL);
1195f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp_priv == NULL);
1196f5d1a924SAlexey Marchuk 
1197f5d1a924SAlexey Marchuk 	/* Can't create session pool. */
1198f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_count, 2);
1199f5d1a924SAlexey Marchuk 	MOCK_SET(spdk_mempool_create, NULL);
120061fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_init();
1201f5d1a924SAlexey Marchuk 	CU_ASSERT(rc == -ENOMEM);
1202f5d1a924SAlexey Marchuk 	CU_ASSERT(g_mbuf_mp == NULL);
1203f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp == NULL);
1204f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp_priv == NULL);
1205f5d1a924SAlexey Marchuk 	MOCK_CLEAR(spdk_mempool_create);
1206f5d1a924SAlexey Marchuk 
1207f5d1a924SAlexey Marchuk 	/* Can't create op pool. */
1208f5d1a924SAlexey Marchuk 	MOCK_SET(rte_crypto_op_pool_create, NULL);
120961fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_init();
1210f5d1a924SAlexey Marchuk 	CU_ASSERT(rc == -ENOMEM);
1211f5d1a924SAlexey Marchuk 	CU_ASSERT(g_mbuf_mp == NULL);
1212f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp == NULL);
1213f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp_priv == NULL);
1214f5d1a924SAlexey Marchuk 	MOCK_CLEAR(rte_crypto_op_pool_create);
1215f5d1a924SAlexey Marchuk 
1216f5d1a924SAlexey Marchuk 	/* Check resources are not sufficient */
1217f5d1a924SAlexey Marchuk 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
121861fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_init();
1219f5d1a924SAlexey Marchuk 	CU_ASSERT(rc == -EINVAL);
1220f5d1a924SAlexey Marchuk 
1221f5d1a924SAlexey Marchuk 	/* Test crypto dev configure failure. */
1222f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_device_count_by_driver, 2);
1223f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_info_get, MOCK_INFO_GET_1QP_AESNI);
1224f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_configure, -1);
1225f5d1a924SAlexey Marchuk 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
122661fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_init();
1227f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_configure, 0);
1228f5d1a924SAlexey Marchuk 	CU_ASSERT(g_mbuf_mp == NULL);
1229f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp == NULL);
1230f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp_priv == NULL);
1231f5d1a924SAlexey Marchuk 	CU_ASSERT(rc == -EINVAL);
1232f5d1a924SAlexey Marchuk 
1233f5d1a924SAlexey Marchuk 	/* Test failure of qp setup. */
1234f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_queue_pair_setup, -1);
1235f5d1a924SAlexey Marchuk 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
123661fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_init();
1237f5d1a924SAlexey Marchuk 	CU_ASSERT(rc == -EINVAL);
1238f5d1a924SAlexey Marchuk 	CU_ASSERT(g_mbuf_mp == NULL);
1239f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp == NULL);
1240f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp_priv == NULL);
1241f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_queue_pair_setup, 0);
1242f5d1a924SAlexey Marchuk 
1243f5d1a924SAlexey Marchuk 	/* Test failure of dev start. */
1244f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_start, -1);
1245f5d1a924SAlexey Marchuk 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
124661fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_init();
1247f5d1a924SAlexey Marchuk 	CU_ASSERT(rc == -EINVAL);
1248f5d1a924SAlexey Marchuk 	CU_ASSERT(g_mbuf_mp == NULL);
1249f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp == NULL);
1250f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp_priv == NULL);
1251f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_start, 0);
1252f5d1a924SAlexey Marchuk 
1253f5d1a924SAlexey Marchuk 	/* Test bogus PMD */
1254f5d1a924SAlexey Marchuk 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
1255f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_info_get, MOCK_INFO_GET_1QP_BOGUS_PMD);
125661fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_init();
1257f5d1a924SAlexey Marchuk 	CU_ASSERT(g_mbuf_mp == NULL);
1258f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp == NULL);
1259f5d1a924SAlexey Marchuk 	CU_ASSERT(rc == -EINVAL);
1260f5d1a924SAlexey Marchuk 
1261f5d1a924SAlexey Marchuk 	/* Test happy path QAT. */
1262f5d1a924SAlexey Marchuk 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
1263f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_info_get, MOCK_INFO_GET_1QP_QAT);
126461fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_init();
1265f5d1a924SAlexey Marchuk 	CU_ASSERT(g_mbuf_mp != NULL);
1266f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp != NULL);
1267f5d1a924SAlexey Marchuk 	init_cleanup();
1268f5d1a924SAlexey Marchuk 	CU_ASSERT(rc == 0);
1269f5d1a924SAlexey Marchuk 
1270f5d1a924SAlexey Marchuk 	/* Test happy path AESNI. */
1271f5d1a924SAlexey Marchuk 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
1272f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_info_get, MOCK_INFO_GET_1QP_AESNI);
127361fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_init();
1274f5d1a924SAlexey Marchuk 	CU_ASSERT(g_mbuf_offset == DPDK_DYNFIELD_OFFSET);
1275f5d1a924SAlexey Marchuk 	init_cleanup();
1276f5d1a924SAlexey Marchuk 	CU_ASSERT(rc == 0);
1277f5d1a924SAlexey Marchuk 
1278f5d1a924SAlexey Marchuk 	/* Test happy path MLX5. */
1279f5d1a924SAlexey Marchuk 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
1280f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_info_get, MOCK_INFO_GET_1QP_MLX5);
128161fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_init();
1282f5d1a924SAlexey Marchuk 	CU_ASSERT(g_mbuf_offset == DPDK_DYNFIELD_OFFSET);
1283f5d1a924SAlexey Marchuk 	init_cleanup();
1284f5d1a924SAlexey Marchuk 	CU_ASSERT(rc == 0);
1285f5d1a924SAlexey Marchuk 
1286f5d1a924SAlexey Marchuk 	/* Test failure of DPDK dev init. By now it is not longer an error
1287f5d1a924SAlexey Marchuk 	 * situation for entire crypto framework. */
1288f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_count, 2);
1289f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_device_count_by_driver, 2);
1290f5d1a924SAlexey Marchuk 	MOCK_SET(rte_vdev_init, -1);
1291f5d1a924SAlexey Marchuk 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
1292f5d1a924SAlexey Marchuk 	MOCK_SET(rte_cryptodev_info_get, MOCK_INFO_GET_1QP_QAT);
129361fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_init();
1294f5d1a924SAlexey Marchuk 	CU_ASSERT(rc == 0);
1295f5d1a924SAlexey Marchuk 	CU_ASSERT(g_mbuf_mp != NULL);
1296f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp != NULL);
129710dcf2dbSAlexey Marchuk #if RTE_VERSION < RTE_VERSION_NUM(22, 11, 0, 0)
1298f5d1a924SAlexey Marchuk 	CU_ASSERT(g_session_mp_priv != NULL);
129910dcf2dbSAlexey Marchuk #endif
1300f5d1a924SAlexey Marchuk 	init_cleanup();
1301f5d1a924SAlexey Marchuk 	MOCK_SET(rte_vdev_init, 0);
1302f5d1a924SAlexey Marchuk 	MOCK_CLEAR(rte_cryptodev_device_count_by_driver);
1303f5d1a924SAlexey Marchuk 
1304f5d1a924SAlexey Marchuk 	/* restore our initial values. */
1305f5d1a924SAlexey Marchuk 	g_mbuf_mp = orig_mbuf_mp;
1306f5d1a924SAlexey Marchuk 	g_session_mp = orig_session_mp;
1307f5d1a924SAlexey Marchuk 	g_session_mp_priv = orig_session_mp_priv;
130861fbb000SAlexey Marchuk 	free_threads();
1309f5d1a924SAlexey Marchuk }
1310f5d1a924SAlexey Marchuk 
1311f5d1a924SAlexey Marchuk static void
131261fbb000SAlexey Marchuk test_supported_opcodes(void)
1313f5d1a924SAlexey Marchuk {
1314f5d1a924SAlexey Marchuk 	bool rc = true;
13155105dc5dSKonrad Sztyber 	enum spdk_accel_opcode opc;
1316f5d1a924SAlexey Marchuk 
13175105dc5dSKonrad Sztyber 	for (opc = 0; opc < SPDK_ACCEL_OPC_LAST; opc++) {
131861fbb000SAlexey Marchuk 		rc = accel_dpdk_cryptodev_supports_opcode(opc);
131961fbb000SAlexey Marchuk 		switch (opc) {
13205105dc5dSKonrad Sztyber 		case SPDK_ACCEL_OPC_ENCRYPT:
13215105dc5dSKonrad Sztyber 		case SPDK_ACCEL_OPC_DECRYPT:
132261fbb000SAlexey Marchuk 			CU_ASSERT(rc == true);
132361fbb000SAlexey Marchuk 			break;
132461fbb000SAlexey Marchuk 		default:
1325f5d1a924SAlexey Marchuk 			CU_ASSERT(rc == false);
1326f5d1a924SAlexey Marchuk 		}
132761fbb000SAlexey Marchuk 	}
132861fbb000SAlexey Marchuk }
1329f5d1a924SAlexey Marchuk 
1330f5d1a924SAlexey Marchuk static void
1331f5d1a924SAlexey Marchuk test_poller(void)
1332f5d1a924SAlexey Marchuk {
133361fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_task task = {};
133461fbb000SAlexey Marchuk 	struct iovec src_iov = {.iov_base = (void *)0xDEADBEEF, .iov_len = 1024 };
133561fbb000SAlexey Marchuk 	struct iovec dst_iov = src_iov;
1336bf8e0656SAlexey Marchuk 	struct rte_mbuf *src_mbufs[2];
1337f5d1a924SAlexey Marchuk 	int rc;
133861fbb000SAlexey Marchuk 
13395105dc5dSKonrad Sztyber 	task.base.op_code = SPDK_ACCEL_OPC_DECRYPT;
134061fbb000SAlexey Marchuk 	task.base.s.iovcnt = 1;
134161fbb000SAlexey Marchuk 	task.base.s.iovs = &src_iov;
134261fbb000SAlexey Marchuk 	task.base.d.iovcnt = 1;
134361fbb000SAlexey Marchuk 	task.base.d.iovs = &dst_iov;
134461fbb000SAlexey Marchuk 	task.base.block_size = 512;
134561fbb000SAlexey Marchuk 	task.base.crypto_key = &g_key;
134661fbb000SAlexey Marchuk 	task.base.iv = 1;
1347bf8e0656SAlexey Marchuk 	task.inplace = true;
1348f5d1a924SAlexey Marchuk 
1349f5d1a924SAlexey Marchuk 	/* test regular 1 op to dequeue and complete */
1350f5d1a924SAlexey Marchuk 	g_dequeue_mock = g_enqueue_mock = 1;
13518f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 1;
1352f5d1a924SAlexey Marchuk 	rte_pktmbuf_alloc_bulk(g_mbuf_mp, src_mbufs, 1);
1353f5d1a924SAlexey Marchuk 	g_test_crypto_ops[0]->sym->m_src = src_mbufs[0];
1354f5d1a924SAlexey Marchuk 	*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
135561fbb000SAlexey Marchuk 			   uint64_t *) = (uintptr_t)&task;
1356f5d1a924SAlexey Marchuk 	g_test_crypto_ops[0]->sym->m_dst = NULL;
1357bf8e0656SAlexey Marchuk 	task.cryop_submitted = 1;
1358bf8e0656SAlexey Marchuk 	task.cryop_total = 1;
1359bf8e0656SAlexey Marchuk 	task.cryop_completed = 0;
13605105dc5dSKonrad Sztyber 	task.base.op_code = SPDK_ACCEL_OPC_DECRYPT;
136161fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_poller(g_crypto_ch);
1362f5d1a924SAlexey Marchuk 	CU_ASSERT(rc == 1);
1363bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_completed == task.cryop_submitted);
13648f36853aSAlexey Marchuk 	CU_ASSERT(g_aesni_qp.num_enqueued_ops == 0);
1365f5d1a924SAlexey Marchuk 
1366f5d1a924SAlexey Marchuk 	/* 2 to dequeue but 2nd one failed */
1367f5d1a924SAlexey Marchuk 	g_dequeue_mock = g_enqueue_mock = 2;
13688f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 2;
1369bf8e0656SAlexey Marchuk 	task.cryop_submitted = 2;
1370bf8e0656SAlexey Marchuk 	task.cryop_total = 2;
1371bf8e0656SAlexey Marchuk 	task.cryop_completed = 0;
1372f5d1a924SAlexey Marchuk 	rte_pktmbuf_alloc_bulk(g_mbuf_mp, src_mbufs, 2);
1373f5d1a924SAlexey Marchuk 	g_test_crypto_ops[0]->sym->m_src = src_mbufs[0];
1374f5d1a924SAlexey Marchuk 	*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
137561fbb000SAlexey Marchuk 			   uint64_t *) = (uint64_t)&task;
1376f5d1a924SAlexey Marchuk 	g_test_crypto_ops[0]->sym->m_dst = NULL;
1377f5d1a924SAlexey Marchuk 	g_test_crypto_ops[0]->status =  RTE_CRYPTO_OP_STATUS_SUCCESS;
1378f5d1a924SAlexey Marchuk 	g_test_crypto_ops[1]->sym->m_src = src_mbufs[1];
1379f5d1a924SAlexey Marchuk 	*RTE_MBUF_DYNFIELD(g_test_crypto_ops[1]->sym->m_src, g_mbuf_offset,
138061fbb000SAlexey Marchuk 			   uint64_t *) = (uint64_t)&task;
1381f5d1a924SAlexey Marchuk 	g_test_crypto_ops[1]->sym->m_dst = NULL;
1382f5d1a924SAlexey Marchuk 	g_test_crypto_ops[1]->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
138361fbb000SAlexey Marchuk 	rc = accel_dpdk_cryptodev_poller(g_crypto_ch);
138461fbb000SAlexey Marchuk 	CU_ASSERT(task.is_failed == true);
138561fbb000SAlexey Marchuk 	CU_ASSERT(rc == 1);
13868f36853aSAlexey Marchuk 	CU_ASSERT(g_aesni_qp.num_enqueued_ops == 0);
1387bf8e0656SAlexey Marchuk 
1388bf8e0656SAlexey Marchuk 	/* Dequeue a task which needs to be submitted again */
1389bf8e0656SAlexey Marchuk 	g_dequeue_mock = g_enqueue_mock = ut_rte_crypto_op_bulk_alloc = 1;
1390bf8e0656SAlexey Marchuk 	task.cryop_submitted = 1;
1391bf8e0656SAlexey Marchuk 	task.cryop_total = 2;
1392bf8e0656SAlexey Marchuk 	task.cryop_completed = 0;
13938f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 1;
1394bf8e0656SAlexey Marchuk 	rte_pktmbuf_alloc_bulk(g_mbuf_mp, src_mbufs, 1);
1395bf8e0656SAlexey Marchuk 	SPDK_CU_ASSERT_FATAL(src_mbufs[0] != NULL);
1396bf8e0656SAlexey Marchuk 	g_test_crypto_ops[0]->sym->m_src = src_mbufs[0];
1397bf8e0656SAlexey Marchuk 	*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
1398bf8e0656SAlexey Marchuk 			   uint64_t *) = (uintptr_t)&task;
1399bf8e0656SAlexey Marchuk 	g_test_crypto_ops[0]->sym->m_dst = NULL;
1400bf8e0656SAlexey Marchuk 	rc = accel_dpdk_cryptodev_poller(g_crypto_ch);
1401bf8e0656SAlexey Marchuk 	CU_ASSERT(rc == 1);
1402bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 2);
1403bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_total == 2);
1404bf8e0656SAlexey Marchuk 	CU_ASSERT(task.cryop_completed == 1);
1405bf8e0656SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->buf_addr == src_iov.iov_base + task.base.block_size);
1406bf8e0656SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->data_len == task.base.block_size);
1407bf8e0656SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->next == NULL);
1408bf8e0656SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.length == task.base.block_size);
1409bf8e0656SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.offset == 0);
1410bf8e0656SAlexey Marchuk 	CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
1411bf8e0656SAlexey Marchuk 				     uint64_t *) == (uint64_t)&task);
1412bf8e0656SAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst == NULL);
14138f36853aSAlexey Marchuk 	CU_ASSERT(g_aesni_qp.num_enqueued_ops == 1);
14148f36853aSAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_src);
14158f36853aSAlexey Marchuk 
14168f36853aSAlexey Marchuk 	/* Process queued tasks, qp is full */
14178f36853aSAlexey Marchuk 	g_dequeue_mock = g_enqueue_mock = 0;
14188f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = g_aesni_crypto_dev.qp_desc_nr;
14198f36853aSAlexey Marchuk 	task.cryop_submitted = 1;
14208f36853aSAlexey Marchuk 	task.cryop_total = 2;
14218f36853aSAlexey Marchuk 	task.cryop_completed = 1;
14228f36853aSAlexey Marchuk 	CU_ASSERT(TAILQ_EMPTY(&g_crypto_ch->queued_tasks));
14238f36853aSAlexey Marchuk 	TAILQ_INSERT_TAIL(&g_crypto_ch->queued_tasks, &task, link);
14248f36853aSAlexey Marchuk 
14258f36853aSAlexey Marchuk 	rc = accel_dpdk_cryptodev_poller(g_crypto_ch);
14268f36853aSAlexey Marchuk 	CU_ASSERT(rc == 0);
14278f36853aSAlexey Marchuk 	CU_ASSERT(TAILQ_FIRST(&g_crypto_ch->queued_tasks) == &task);
14288f36853aSAlexey Marchuk 
14298f36853aSAlexey Marchuk 	/* Try again when queue is empty, task should be submitted */
14308f36853aSAlexey Marchuk 	g_enqueue_mock = 1;
14318f36853aSAlexey Marchuk 	g_aesni_qp.num_enqueued_ops = 0;
14328f36853aSAlexey Marchuk 	rc = accel_dpdk_cryptodev_poller(g_crypto_ch);
14338f36853aSAlexey Marchuk 	CU_ASSERT(rc == 1);
14348f36853aSAlexey Marchuk 	CU_ASSERT(task.cryop_submitted == 2);
14358f36853aSAlexey Marchuk 	CU_ASSERT(task.cryop_total == 2);
14368f36853aSAlexey Marchuk 	CU_ASSERT(task.cryop_completed == 1);
14378f36853aSAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->buf_addr == src_iov.iov_base + task.base.block_size);
14388f36853aSAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->data_len == task.base.block_size);
14398f36853aSAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->next == NULL);
14408f36853aSAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.length == task.base.block_size);
14418f36853aSAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.offset == 0);
14428f36853aSAlexey Marchuk 	CU_ASSERT(*RTE_MBUF_DYNFIELD(g_test_crypto_ops[0]->sym->m_src, g_mbuf_offset,
14438f36853aSAlexey Marchuk 				     uint64_t *) == (uint64_t)&task);
14448f36853aSAlexey Marchuk 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst == NULL);
14458f36853aSAlexey Marchuk 	CU_ASSERT(g_aesni_qp.num_enqueued_ops == 1);
14468f36853aSAlexey Marchuk 	CU_ASSERT(TAILQ_EMPTY(&g_crypto_ch->queued_tasks));
1447bf8e0656SAlexey Marchuk 	rte_pktmbuf_free(g_test_crypto_ops[0]->sym->m_src);
14486b7cca15SAlexey Marchuk 
14496b7cca15SAlexey Marchuk 	/* Complete tasks in the dedicated list */
14506b7cca15SAlexey Marchuk 	g_dequeue_mock = g_enqueue_mock = 0;
14516b7cca15SAlexey Marchuk 	CU_ASSERT(TAILQ_EMPTY(&g_crypto_ch->completed_tasks));
14526b7cca15SAlexey Marchuk 	TAILQ_INSERT_TAIL(&g_crypto_ch->completed_tasks, &task, link);
14536b7cca15SAlexey Marchuk 	rc = accel_dpdk_cryptodev_poller(g_crypto_ch);
14546b7cca15SAlexey Marchuk 	CU_ASSERT(rc == 1);
14556b7cca15SAlexey Marchuk 	CU_ASSERT(TAILQ_EMPTY(&g_crypto_ch->completed_tasks));
1456f5d1a924SAlexey Marchuk }
1457f5d1a924SAlexey Marchuk 
145861fbb000SAlexey Marchuk /* Helper function for accel_dpdk_cryptodev_assign_device_qps() */
1459f5d1a924SAlexey Marchuk static void
146061fbb000SAlexey Marchuk _check_expected_values(struct accel_dpdk_cryptodev_io_channel *crypto_ch,
146161fbb000SAlexey Marchuk 		       uint8_t expected_qat_index,
146261fbb000SAlexey Marchuk 		       uint8_t next_qat_index)
1463f5d1a924SAlexey Marchuk {
146461fbb000SAlexey Marchuk 	uint32_t num_qpairs;
1465f5d1a924SAlexey Marchuk 
146661fbb000SAlexey Marchuk 	memset(crypto_ch->device_qp, 0, sizeof(crypto_ch->device_qp));
1467f5d1a924SAlexey Marchuk 
146861fbb000SAlexey Marchuk 	num_qpairs = accel_dpdk_cryptodev_assign_device_qps(crypto_ch);
146961fbb000SAlexey Marchuk 	CU_ASSERT(num_qpairs == 3);
1470f5d1a924SAlexey Marchuk 
147161fbb000SAlexey Marchuk 	SPDK_CU_ASSERT_FATAL(crypto_ch->device_qp[ACCEL_DPDK_CRYPTODEV_DRIVER_QAT] != NULL);
147261fbb000SAlexey Marchuk 	CU_ASSERT(crypto_ch->device_qp[ACCEL_DPDK_CRYPTODEV_DRIVER_QAT]->index == expected_qat_index);
147361fbb000SAlexey Marchuk 	CU_ASSERT(crypto_ch->device_qp[ACCEL_DPDK_CRYPTODEV_DRIVER_QAT]->in_use == true);
147461fbb000SAlexey Marchuk 	CU_ASSERT(g_next_qat_index == next_qat_index);
147561fbb000SAlexey Marchuk 	SPDK_CU_ASSERT_FATAL(crypto_ch->device_qp[ACCEL_DPDK_CRYPTODEV_DRIVER_AESNI_MB] != NULL);
147661fbb000SAlexey Marchuk 	CU_ASSERT(crypto_ch->device_qp[ACCEL_DPDK_CRYPTODEV_DRIVER_AESNI_MB]->in_use == true);
147761fbb000SAlexey Marchuk 	SPDK_CU_ASSERT_FATAL(crypto_ch->device_qp[ACCEL_DPDK_CRYPTODEV_DRIVER_MLX5_PCI] != NULL);
147861fbb000SAlexey Marchuk 	CU_ASSERT(crypto_ch->device_qp[ACCEL_DPDK_CRYPTODEV_DRIVER_MLX5_PCI]->in_use == true);
1479f5d1a924SAlexey Marchuk }
1480f5d1a924SAlexey Marchuk 
1481f5d1a924SAlexey Marchuk static void
1482f5d1a924SAlexey Marchuk test_assign_device_qp(void)
1483f5d1a924SAlexey Marchuk {
148461fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_device qat_dev = {
148561fbb000SAlexey Marchuk 		.type = ACCEL_DPDK_CRYPTODEV_DRIVER_QAT,
148661fbb000SAlexey Marchuk 		.qpairs = TAILQ_HEAD_INITIALIZER(qat_dev.qpairs)
148761fbb000SAlexey Marchuk 	};
148861fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_device aesni_dev = {
148961fbb000SAlexey Marchuk 		.type = ACCEL_DPDK_CRYPTODEV_DRIVER_AESNI_MB,
149061fbb000SAlexey Marchuk 		.qpairs = TAILQ_HEAD_INITIALIZER(aesni_dev.qpairs)
149161fbb000SAlexey Marchuk 	};
149261fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_device mlx5_dev = {
149361fbb000SAlexey Marchuk 		.type = ACCEL_DPDK_CRYPTODEV_DRIVER_MLX5_PCI,
149461fbb000SAlexey Marchuk 		.qpairs = TAILQ_HEAD_INITIALIZER(mlx5_dev.qpairs)
149561fbb000SAlexey Marchuk 	};
149661fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_qp *qat_qps;
149761fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_qp aesni_qps[4] = {};
149861fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_qp mlx5_qps[4] = {};
149961fbb000SAlexey Marchuk 	struct accel_dpdk_cryptodev_io_channel io_ch = {};
150061fbb000SAlexey Marchuk 	TAILQ_HEAD(, accel_dpdk_cryptodev_device) devs_tmp = TAILQ_HEAD_INITIALIZER(devs_tmp);
1501f5d1a924SAlexey Marchuk 	int i;
1502f5d1a924SAlexey Marchuk 
150361fbb000SAlexey Marchuk 	g_qat_total_qp = 96;
150461fbb000SAlexey Marchuk 	qat_qps = calloc(g_qat_total_qp, sizeof(*qat_qps));
150561fbb000SAlexey Marchuk 	SPDK_CU_ASSERT_FATAL(qat_qps != NULL);
1506f5d1a924SAlexey Marchuk 
150761fbb000SAlexey Marchuk 	for (i = 0; i < 4; i++) {
150861fbb000SAlexey Marchuk 		aesni_qps[i].index = i;
150961fbb000SAlexey Marchuk 		aesni_qps[i].device = &aesni_dev;
151061fbb000SAlexey Marchuk 		TAILQ_INSERT_TAIL(&aesni_dev.qpairs, &aesni_qps[i], link);
151161fbb000SAlexey Marchuk 
151261fbb000SAlexey Marchuk 		mlx5_qps[i].index = i;
151361fbb000SAlexey Marchuk 		mlx5_qps[i].device = &mlx5_dev;
151461fbb000SAlexey Marchuk 		TAILQ_INSERT_TAIL(&mlx5_dev.qpairs, &mlx5_qps[i], link);
151561fbb000SAlexey Marchuk 	}
151661fbb000SAlexey Marchuk 	for (i = 0; i < g_qat_total_qp; i++) {
151761fbb000SAlexey Marchuk 		qat_qps[i].index = i;
151861fbb000SAlexey Marchuk 		qat_qps[i].device = &qat_dev;
151961fbb000SAlexey Marchuk 		TAILQ_INSERT_TAIL(&qat_dev.qpairs, &qat_qps[i], link);
152061fbb000SAlexey Marchuk 	}
152161fbb000SAlexey Marchuk 
152261fbb000SAlexey Marchuk 	/* Swap g_crypto_devices so that other tests are not affected */
152361fbb000SAlexey Marchuk 	TAILQ_SWAP(&g_crypto_devices, &devs_tmp, accel_dpdk_cryptodev_device, link);
152461fbb000SAlexey Marchuk 
152561fbb000SAlexey Marchuk 	TAILQ_INSERT_TAIL(&g_crypto_devices, &qat_dev, link);
152661fbb000SAlexey Marchuk 	TAILQ_INSERT_TAIL(&g_crypto_devices, &aesni_dev, link);
152761fbb000SAlexey Marchuk 	TAILQ_INSERT_TAIL(&g_crypto_devices, &mlx5_dev, link);
1528f5d1a924SAlexey Marchuk 
1529f5d1a924SAlexey Marchuk 	/* QAT testing is more complex as the code under test load balances by
1530f5d1a924SAlexey Marchuk 	 * assigning each subsequent device/qp to every QAT_VF_SPREAD modulo
1531f5d1a924SAlexey Marchuk 	 * g_qat_total_qp. For the current latest QAT we'll have 48 virtual functions
153261fbb000SAlexey Marchuk 	 * each with 2 qp so the "spread" between assignments is 32. */
1533f5d1a924SAlexey Marchuk 
1534f5d1a924SAlexey Marchuk 	/* First assignment will assign to 0 and next at 32. */
153561fbb000SAlexey Marchuk 	_check_expected_values(&io_ch, 0, ACCEL_DPDK_CRYPTODEV_QAT_VF_SPREAD);
1536f5d1a924SAlexey Marchuk 
1537f5d1a924SAlexey Marchuk 	/* Second assignment will assign to 32 and next at 64. */
153861fbb000SAlexey Marchuk 	_check_expected_values(&io_ch, ACCEL_DPDK_CRYPTODEV_QAT_VF_SPREAD,
153961fbb000SAlexey Marchuk 			       ACCEL_DPDK_CRYPTODEV_QAT_VF_SPREAD * 2);
1540f5d1a924SAlexey Marchuk 
1541f5d1a924SAlexey Marchuk 	/* Third assignment will assign to 64 and next at 0. */
154261fbb000SAlexey Marchuk 	_check_expected_values(&io_ch, ACCEL_DPDK_CRYPTODEV_QAT_VF_SPREAD * 2, 0);
1543f5d1a924SAlexey Marchuk 
1544f5d1a924SAlexey Marchuk 	/* Fourth assignment will assign to 1 and next at 33. */
154561fbb000SAlexey Marchuk 	_check_expected_values(&io_ch, 1, ACCEL_DPDK_CRYPTODEV_QAT_VF_SPREAD + 1);
1546f5d1a924SAlexey Marchuk 
154761fbb000SAlexey Marchuk 	TAILQ_SWAP(&devs_tmp, &g_crypto_devices, accel_dpdk_cryptodev_device, link);
1548bf8e0656SAlexey Marchuk 
1549bf8e0656SAlexey Marchuk 	free(qat_qps);
1550f5d1a924SAlexey Marchuk }
1551f5d1a924SAlexey Marchuk 
1552f5d1a924SAlexey Marchuk int
1553f5d1a924SAlexey Marchuk main(int argc, char **argv)
1554f5d1a924SAlexey Marchuk {
1555f5d1a924SAlexey Marchuk 	CU_pSuite	suite = NULL;
1556f5d1a924SAlexey Marchuk 	unsigned int	num_failures;
1557f5d1a924SAlexey Marchuk 
1558f5d1a924SAlexey Marchuk 	CU_initialize_registry();
1559f5d1a924SAlexey Marchuk 
156061fbb000SAlexey Marchuk 	suite = CU_add_suite("dpdk_cryptodev", test_setup, test_cleanup);
1561f5d1a924SAlexey Marchuk 	CU_ADD_TEST(suite, test_error_paths);
156261fbb000SAlexey Marchuk 	CU_ADD_TEST(suite, test_simple_encrypt);
156361fbb000SAlexey Marchuk 	CU_ADD_TEST(suite, test_simple_decrypt);
156461fbb000SAlexey Marchuk 	CU_ADD_TEST(suite, test_large_enc_dec);
1565f5d1a924SAlexey Marchuk 	CU_ADD_TEST(suite, test_dev_full);
1566f5d1a924SAlexey Marchuk 	CU_ADD_TEST(suite, test_crazy_rw);
1567f5d1a924SAlexey Marchuk 	CU_ADD_TEST(suite, test_initdrivers);
156861fbb000SAlexey Marchuk 	CU_ADD_TEST(suite, test_supported_opcodes);
1569f5d1a924SAlexey Marchuk 	CU_ADD_TEST(suite, test_poller);
1570f5d1a924SAlexey Marchuk 	CU_ADD_TEST(suite, test_assign_device_qp);
1571f5d1a924SAlexey Marchuk 
1572ea941caeSKonrad Sztyber 	num_failures = spdk_ut_run_tests(argc, argv, NULL);
1573f5d1a924SAlexey Marchuk 	CU_cleanup_registry();
1574f5d1a924SAlexey Marchuk 	return num_failures;
1575f5d1a924SAlexey Marchuk }
1576