xref: /dpdk/app/test/test_ipsec.c (revision e0a8442ccd15bafbb7eb150c35331c8e3b828c53)
1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2a9de470cSBruce Richardson  * Copyright(c) 2018 Intel Corporation
3a9de470cSBruce Richardson  */
4a9de470cSBruce Richardson 
53c60274cSJie Zhou #include "test.h"
63c60274cSJie Zhou 
7a9de470cSBruce Richardson #include <time.h>
8a9de470cSBruce Richardson 
9a9de470cSBruce Richardson #include <rte_common.h>
10a9de470cSBruce Richardson #include <rte_hexdump.h>
11a9de470cSBruce Richardson #include <rte_mbuf.h>
12a9de470cSBruce Richardson #include <rte_malloc.h>
13a9de470cSBruce Richardson #include <rte_memcpy.h>
142cb4a0d4SBernard Iremonger #include <rte_cycles.h>
15a9de470cSBruce Richardson #include <rte_bus_vdev.h>
16a9de470cSBruce Richardson #include <rte_ip.h>
17a9de470cSBruce Richardson #include <rte_crypto.h>
18a9de470cSBruce Richardson #include <rte_cryptodev.h>
19a9de470cSBruce Richardson #include <rte_lcore.h>
203c60274cSJie Zhou 
213c60274cSJie Zhou #ifdef RTE_EXEC_ENV_WINDOWS
223c60274cSJie Zhou static int
233c60274cSJie Zhou test_ipsec(void)
243c60274cSJie Zhou {
253c60274cSJie Zhou 	printf("ipsec not supported on Windows, skipping test\n");
263c60274cSJie Zhou 	return TEST_SKIPPED;
273c60274cSJie Zhou }
283c60274cSJie Zhou 
293c60274cSJie Zhou #else
303c60274cSJie Zhou 
31a9de470cSBruce Richardson #include <rte_ipsec.h>
32a9de470cSBruce Richardson #include <rte_random.h>
33a9de470cSBruce Richardson #include <rte_esp.h>
34a9de470cSBruce Richardson #include <rte_security_driver.h>
35a9de470cSBruce Richardson 
36a9de470cSBruce Richardson #include "test_cryptodev.h"
37a9de470cSBruce Richardson 
38a9de470cSBruce Richardson #define VDEV_ARGS_SIZE	100
39fd42108eSBernard Iremonger #define MAX_NB_SESSIONS	200
40a9de470cSBruce Richardson #define MAX_NB_SAS		2
41a9de470cSBruce Richardson #define REPLAY_WIN_0	0
42a9de470cSBruce Richardson #define REPLAY_WIN_32	32
43a9de470cSBruce Richardson #define REPLAY_WIN_64	64
44a9de470cSBruce Richardson #define REPLAY_WIN_128	128
45a9de470cSBruce Richardson #define REPLAY_WIN_256	256
46a9de470cSBruce Richardson #define DATA_64_BYTES	64
47a9de470cSBruce Richardson #define DATA_80_BYTES	80
48a9de470cSBruce Richardson #define DATA_100_BYTES	100
49a9de470cSBruce Richardson #define ESN_ENABLED		1
50a9de470cSBruce Richardson #define ESN_DISABLED	0
51a9de470cSBruce Richardson #define INBOUND_SPI		7
52a9de470cSBruce Richardson #define OUTBOUND_SPI	17
53a9de470cSBruce Richardson #define BURST_SIZE		32
54a9de470cSBruce Richardson #define REORDER_PKTS	1
552cb4a0d4SBernard Iremonger #define DEQUEUE_COUNT	1000
56a9de470cSBruce Richardson 
57a9de470cSBruce Richardson struct user_params {
58a9de470cSBruce Richardson 	enum rte_crypto_sym_xform_type auth;
59a9de470cSBruce Richardson 	enum rte_crypto_sym_xform_type cipher;
60a9de470cSBruce Richardson 	enum rte_crypto_sym_xform_type aead;
61a9de470cSBruce Richardson 
62a9de470cSBruce Richardson 	char auth_algo[128];
63a9de470cSBruce Richardson 	char cipher_algo[128];
64a9de470cSBruce Richardson 	char aead_algo[128];
65a9de470cSBruce Richardson };
66a9de470cSBruce Richardson 
67a9de470cSBruce Richardson struct ipsec_testsuite_params {
68a9de470cSBruce Richardson 	struct rte_mempool *mbuf_pool;
69a9de470cSBruce Richardson 	struct rte_mempool *cop_mpool;
70a9de470cSBruce Richardson 	struct rte_cryptodev_config conf;
71a9de470cSBruce Richardson 	struct rte_cryptodev_qp_conf qp_conf;
72a9de470cSBruce Richardson 
73a9de470cSBruce Richardson 	uint8_t valid_dev;
74a9de470cSBruce Richardson 	uint8_t valid_dev_found;
75a9de470cSBruce Richardson };
76a9de470cSBruce Richardson 
77a9de470cSBruce Richardson struct ipsec_unitest_params {
78a9de470cSBruce Richardson 	struct rte_crypto_sym_xform cipher_xform;
79a9de470cSBruce Richardson 	struct rte_crypto_sym_xform auth_xform;
80a9de470cSBruce Richardson 	struct rte_crypto_sym_xform aead_xform;
81a9de470cSBruce Richardson 	struct rte_crypto_sym_xform *crypto_xforms;
82a9de470cSBruce Richardson 
83a9de470cSBruce Richardson 	struct rte_security_ipsec_xform ipsec_xform;
84a9de470cSBruce Richardson 
85a9de470cSBruce Richardson 	struct rte_ipsec_sa_prm sa_prm;
86a9de470cSBruce Richardson 	struct rte_ipsec_session ss[MAX_NB_SAS];
87a9de470cSBruce Richardson 
88a9de470cSBruce Richardson 	struct rte_crypto_op *cop[BURST_SIZE];
89a9de470cSBruce Richardson 
90a9de470cSBruce Richardson 	struct rte_mbuf *obuf[BURST_SIZE], *ibuf[BURST_SIZE],
91a9de470cSBruce Richardson 		*testbuf[BURST_SIZE];
92a9de470cSBruce Richardson 
93a9de470cSBruce Richardson 	uint16_t pkt_index;
94a9de470cSBruce Richardson };
95a9de470cSBruce Richardson 
96a9de470cSBruce Richardson struct ipsec_test_cfg {
97a9de470cSBruce Richardson 	uint32_t replay_win_sz;
98a9de470cSBruce Richardson 	uint32_t esn;
99a9de470cSBruce Richardson 	uint64_t flags;
100a9de470cSBruce Richardson 	size_t pkt_sz;
101a9de470cSBruce Richardson 	uint16_t num_pkts;
102a9de470cSBruce Richardson 	uint32_t reorder_pkts;
103a9de470cSBruce Richardson };
104a9de470cSBruce Richardson 
105a9de470cSBruce Richardson static const struct ipsec_test_cfg test_cfg[] = {
106a9de470cSBruce Richardson 	{REPLAY_WIN_0, ESN_DISABLED, 0, DATA_64_BYTES, 1, 0},
107fd42108eSBernard Iremonger 	{REPLAY_WIN_0, ESN_DISABLED, 0, DATA_64_BYTES, BURST_SIZE, 0},
108a9de470cSBruce Richardson 	{REPLAY_WIN_0, ESN_DISABLED, 0, DATA_80_BYTES, BURST_SIZE,
109a9de470cSBruce Richardson 		REORDER_PKTS},
110a9de470cSBruce Richardson 	{REPLAY_WIN_32, ESN_ENABLED, 0, DATA_100_BYTES, 1, 0},
111a9de470cSBruce Richardson 	{REPLAY_WIN_32, ESN_ENABLED, 0, DATA_100_BYTES, BURST_SIZE,
112a9de470cSBruce Richardson 		REORDER_PKTS},
113a9de470cSBruce Richardson 	{REPLAY_WIN_64, ESN_ENABLED, 0, DATA_64_BYTES, 1, 0},
114a9de470cSBruce Richardson 	{REPLAY_WIN_128, ESN_ENABLED, RTE_IPSEC_SAFLAG_SQN_ATOM,
115a9de470cSBruce Richardson 		DATA_80_BYTES, 1, 0},
116a9de470cSBruce Richardson 	{REPLAY_WIN_256, ESN_DISABLED, 0, DATA_100_BYTES, 1, 0},
117a9de470cSBruce Richardson };
118a9de470cSBruce Richardson 
119a9de470cSBruce Richardson static const int num_cfg = RTE_DIM(test_cfg);
120a9de470cSBruce Richardson static struct ipsec_testsuite_params testsuite_params = { NULL };
121a9de470cSBruce Richardson static struct ipsec_unitest_params unittest_params;
122a9de470cSBruce Richardson static struct user_params uparams;
123a9de470cSBruce Richardson 
124a9de470cSBruce Richardson struct supported_cipher_algo {
125a9de470cSBruce Richardson 	const char *keyword;
126a9de470cSBruce Richardson 	enum rte_crypto_cipher_algorithm algo;
127a9de470cSBruce Richardson 	uint16_t iv_len;
128a9de470cSBruce Richardson 	uint16_t block_size;
129a9de470cSBruce Richardson 	uint16_t key_len;
130a9de470cSBruce Richardson };
131a9de470cSBruce Richardson 
132a9de470cSBruce Richardson struct supported_auth_algo {
133a9de470cSBruce Richardson 	const char *keyword;
134a9de470cSBruce Richardson 	enum rte_crypto_auth_algorithm algo;
135a9de470cSBruce Richardson 	uint16_t digest_len;
136a9de470cSBruce Richardson 	uint16_t key_len;
137a9de470cSBruce Richardson 	uint8_t key_not_req;
138a9de470cSBruce Richardson };
139a9de470cSBruce Richardson 
140a9de470cSBruce Richardson const struct supported_cipher_algo cipher_algos[] = {
141a9de470cSBruce Richardson 	{
142a9de470cSBruce Richardson 		.keyword = "null",
143a9de470cSBruce Richardson 		.algo = RTE_CRYPTO_CIPHER_NULL,
144a9de470cSBruce Richardson 		.iv_len = 0,
145a9de470cSBruce Richardson 		.block_size = 4,
146a9de470cSBruce Richardson 		.key_len = 0
147a9de470cSBruce Richardson 	},
148a9de470cSBruce Richardson };
149a9de470cSBruce Richardson 
150a9de470cSBruce Richardson const struct supported_auth_algo auth_algos[] = {
151a9de470cSBruce Richardson 	{
152a9de470cSBruce Richardson 		.keyword = "null",
153a9de470cSBruce Richardson 		.algo = RTE_CRYPTO_AUTH_NULL,
154a9de470cSBruce Richardson 		.digest_len = 0,
155a9de470cSBruce Richardson 		.key_len = 0,
156a9de470cSBruce Richardson 		.key_not_req = 1
157a9de470cSBruce Richardson 	},
158a9de470cSBruce Richardson };
159a9de470cSBruce Richardson 
160a9de470cSBruce Richardson static int
161a9de470cSBruce Richardson dummy_sec_create(void *device, struct rte_security_session_conf *conf,
1623f3fc330SAkhil Goyal 	struct rte_security_session *sess)
163a9de470cSBruce Richardson {
164a9de470cSBruce Richardson 	RTE_SET_USED(device);
165a9de470cSBruce Richardson 	RTE_SET_USED(conf);
1663f3fc330SAkhil Goyal 	RTE_SET_USED(sess);
167a9de470cSBruce Richardson 
168a9de470cSBruce Richardson 	return 0;
169a9de470cSBruce Richardson }
170a9de470cSBruce Richardson 
171a9de470cSBruce Richardson static int
172a9de470cSBruce Richardson dummy_sec_destroy(void *device, struct rte_security_session *sess)
173a9de470cSBruce Richardson {
174a9de470cSBruce Richardson 	RTE_SET_USED(device);
175a9de470cSBruce Richardson 	RTE_SET_USED(sess);
176a9de470cSBruce Richardson 	return 0;
177a9de470cSBruce Richardson }
178a9de470cSBruce Richardson 
179a9de470cSBruce Richardson static const struct rte_security_ops dummy_sec_ops = {
180a9de470cSBruce Richardson 	.session_create = dummy_sec_create,
181a9de470cSBruce Richardson 	.session_destroy = dummy_sec_destroy,
182a9de470cSBruce Richardson };
183a9de470cSBruce Richardson 
184a9de470cSBruce Richardson static struct rte_security_ctx dummy_sec_ctx = {
185a9de470cSBruce Richardson 	.ops = &dummy_sec_ops,
186a9de470cSBruce Richardson };
187a9de470cSBruce Richardson 
188a9de470cSBruce Richardson static const struct supported_cipher_algo *
189a9de470cSBruce Richardson find_match_cipher_algo(const char *cipher_keyword)
190a9de470cSBruce Richardson {
191a9de470cSBruce Richardson 	size_t i;
192a9de470cSBruce Richardson 
193a9de470cSBruce Richardson 	for (i = 0; i < RTE_DIM(cipher_algos); i++) {
194a9de470cSBruce Richardson 		const struct supported_cipher_algo *algo =
195a9de470cSBruce Richardson 			&cipher_algos[i];
196a9de470cSBruce Richardson 
197a9de470cSBruce Richardson 		if (strcmp(cipher_keyword, algo->keyword) == 0)
198a9de470cSBruce Richardson 			return algo;
199a9de470cSBruce Richardson 	}
200a9de470cSBruce Richardson 
201a9de470cSBruce Richardson 	return NULL;
202a9de470cSBruce Richardson }
203a9de470cSBruce Richardson 
204a9de470cSBruce Richardson static const struct supported_auth_algo *
205a9de470cSBruce Richardson find_match_auth_algo(const char *auth_keyword)
206a9de470cSBruce Richardson {
207a9de470cSBruce Richardson 	size_t i;
208a9de470cSBruce Richardson 
209a9de470cSBruce Richardson 	for (i = 0; i < RTE_DIM(auth_algos); i++) {
210a9de470cSBruce Richardson 		const struct supported_auth_algo *algo =
211a9de470cSBruce Richardson 			&auth_algos[i];
212a9de470cSBruce Richardson 
213a9de470cSBruce Richardson 		if (strcmp(auth_keyword, algo->keyword) == 0)
214a9de470cSBruce Richardson 			return algo;
215a9de470cSBruce Richardson 	}
216a9de470cSBruce Richardson 
217a9de470cSBruce Richardson 	return NULL;
218a9de470cSBruce Richardson }
219a9de470cSBruce Richardson 
220a9de470cSBruce Richardson static void
221a9de470cSBruce Richardson fill_crypto_xform(struct ipsec_unitest_params *ut_params,
222a9de470cSBruce Richardson 	const struct supported_auth_algo *auth_algo,
223a9de470cSBruce Richardson 	const struct supported_cipher_algo *cipher_algo)
224a9de470cSBruce Richardson {
225a9de470cSBruce Richardson 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
226a9de470cSBruce Richardson 	ut_params->cipher_xform.cipher.algo = cipher_algo->algo;
22763774c02SBernard Iremonger 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
22863774c02SBernard Iremonger 	ut_params->auth_xform.auth.algo = auth_algo->algo;
229a9de470cSBruce Richardson 
230a9de470cSBruce Richardson 	if (ut_params->ipsec_xform.direction ==
231a9de470cSBruce Richardson 			RTE_SECURITY_IPSEC_SA_DIR_INGRESS) {
23263774c02SBernard Iremonger 		ut_params->cipher_xform.cipher.op =
23363774c02SBernard Iremonger 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
23463774c02SBernard Iremonger 		ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
235a9de470cSBruce Richardson 		ut_params->cipher_xform.next = NULL;
23663774c02SBernard Iremonger 		ut_params->auth_xform.next = &ut_params->cipher_xform;
23763774c02SBernard Iremonger 		ut_params->crypto_xforms = &ut_params->auth_xform;
238a9de470cSBruce Richardson 	} else {
23963774c02SBernard Iremonger 		ut_params->cipher_xform.cipher.op =
24063774c02SBernard Iremonger 			RTE_CRYPTO_CIPHER_OP_ENCRYPT;
24163774c02SBernard Iremonger 		ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
242a9de470cSBruce Richardson 		ut_params->auth_xform.next = NULL;
24363774c02SBernard Iremonger 		ut_params->cipher_xform.next = &ut_params->auth_xform;
24463774c02SBernard Iremonger 		ut_params->crypto_xforms = &ut_params->cipher_xform;
245a9de470cSBruce Richardson 	}
246a9de470cSBruce Richardson }
247a9de470cSBruce Richardson 
248a9de470cSBruce Richardson static int
249e162f1a7SThomas Monjalon check_cryptodev_capability(const struct ipsec_unitest_params *ut,
250a9de470cSBruce Richardson 		uint8_t dev_id)
251a9de470cSBruce Richardson {
252a9de470cSBruce Richardson 	struct rte_cryptodev_sym_capability_idx cap_idx;
253a9de470cSBruce Richardson 	const struct rte_cryptodev_symmetric_capability *cap;
254a9de470cSBruce Richardson 	int rc = -1;
255a9de470cSBruce Richardson 
256a9de470cSBruce Richardson 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
257a9de470cSBruce Richardson 	cap_idx.algo.auth = ut->auth_xform.auth.algo;
258a9de470cSBruce Richardson 	cap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);
259a9de470cSBruce Richardson 
260a9de470cSBruce Richardson 	if (cap != NULL) {
261a9de470cSBruce Richardson 		rc = rte_cryptodev_sym_capability_check_auth(cap,
262a9de470cSBruce Richardson 				ut->auth_xform.auth.key.length,
263a9de470cSBruce Richardson 				ut->auth_xform.auth.digest_length, 0);
264a9de470cSBruce Richardson 		if (rc == 0) {
265a9de470cSBruce Richardson 			cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
266a9de470cSBruce Richardson 			cap_idx.algo.cipher = ut->cipher_xform.cipher.algo;
267a9de470cSBruce Richardson 			cap = rte_cryptodev_sym_capability_get(
268a9de470cSBruce Richardson 					dev_id, &cap_idx);
269a9de470cSBruce Richardson 			if (cap != NULL)
270a9de470cSBruce Richardson 				rc = rte_cryptodev_sym_capability_check_cipher(
271a9de470cSBruce Richardson 					cap,
272a9de470cSBruce Richardson 					ut->cipher_xform.cipher.key.length,
273a9de470cSBruce Richardson 					ut->cipher_xform.cipher.iv.length);
274a9de470cSBruce Richardson 		}
275a9de470cSBruce Richardson 	}
276a9de470cSBruce Richardson 
277a9de470cSBruce Richardson 	return rc;
278a9de470cSBruce Richardson }
279a9de470cSBruce Richardson 
280a9de470cSBruce Richardson static int
281a9de470cSBruce Richardson testsuite_setup(void)
282a9de470cSBruce Richardson {
283a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
284a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
285a9de470cSBruce Richardson 	const struct supported_auth_algo *auth_algo;
286a9de470cSBruce Richardson 	const struct supported_cipher_algo *cipher_algo;
287a9de470cSBruce Richardson 	struct rte_cryptodev_info info;
288a9de470cSBruce Richardson 	uint32_t i, nb_devs, dev_id;
289a9de470cSBruce Richardson 	size_t sess_sz;
290a9de470cSBruce Richardson 	int rc;
291a9de470cSBruce Richardson 
292a9de470cSBruce Richardson 	memset(ts_params, 0, sizeof(*ts_params));
29363774c02SBernard Iremonger 	memset(ut_params, 0, sizeof(*ut_params));
29463774c02SBernard Iremonger 	memset(&uparams, 0, sizeof(struct user_params));
295a9de470cSBruce Richardson 
296a9de470cSBruce Richardson 	uparams.auth = RTE_CRYPTO_SYM_XFORM_AUTH;
297a9de470cSBruce Richardson 	uparams.cipher = RTE_CRYPTO_SYM_XFORM_CIPHER;
29863774c02SBernard Iremonger 	uparams.aead = RTE_CRYPTO_SYM_XFORM_NOT_SPECIFIED;
299a9de470cSBruce Richardson 	strcpy(uparams.auth_algo, "null");
300a9de470cSBruce Richardson 	strcpy(uparams.cipher_algo, "null");
301a9de470cSBruce Richardson 
302a9de470cSBruce Richardson 	auth_algo = find_match_auth_algo(uparams.auth_algo);
303a9de470cSBruce Richardson 	cipher_algo = find_match_cipher_algo(uparams.cipher_algo);
304a9de470cSBruce Richardson 	fill_crypto_xform(ut_params, auth_algo, cipher_algo);
305a9de470cSBruce Richardson 
306a9de470cSBruce Richardson 	nb_devs = rte_cryptodev_count();
307a9de470cSBruce Richardson 	if (nb_devs < 1) {
308e0f4a0edSDavid Marchand 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
309e0f4a0edSDavid Marchand 		return TEST_SKIPPED;
310a9de470cSBruce Richardson 	}
311a9de470cSBruce Richardson 
312a9de470cSBruce Richardson 	/* Find first valid crypto device */
313a9de470cSBruce Richardson 	for (i = 0; i < nb_devs; i++) {
314e162f1a7SThomas Monjalon 		rc = check_cryptodev_capability(ut_params, i);
315a9de470cSBruce Richardson 		if (rc == 0) {
316a9de470cSBruce Richardson 			ts_params->valid_dev = i;
317a9de470cSBruce Richardson 			ts_params->valid_dev_found = 1;
318a9de470cSBruce Richardson 			break;
319a9de470cSBruce Richardson 		}
320a9de470cSBruce Richardson 	}
321a9de470cSBruce Richardson 
32237edccf8SJeremy Spewock 	if (ts_params->valid_dev_found == 0) {
32337edccf8SJeremy Spewock 		RTE_LOG(WARNING, USER1, "No compatible crypto device found.\n");
32437edccf8SJeremy Spewock 		return TEST_SKIPPED;
32537edccf8SJeremy Spewock 	}
326a9de470cSBruce Richardson 
327a9de470cSBruce Richardson 	ts_params->mbuf_pool = rte_pktmbuf_pool_create(
328a9de470cSBruce Richardson 			"CRYPTO_MBUFPOOL",
329a9de470cSBruce Richardson 			NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
330a9de470cSBruce Richardson 			rte_socket_id());
331a9de470cSBruce Richardson 	if (ts_params->mbuf_pool == NULL) {
332a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
333a9de470cSBruce Richardson 		return TEST_FAILED;
334a9de470cSBruce Richardson 	}
335a9de470cSBruce Richardson 
336a9de470cSBruce Richardson 	ts_params->cop_mpool = rte_crypto_op_pool_create(
337a9de470cSBruce Richardson 			"MBUF_CRYPTO_SYM_OP_POOL",
338a9de470cSBruce Richardson 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
339a9de470cSBruce Richardson 			NUM_MBUFS, MBUF_CACHE_SIZE,
340a9de470cSBruce Richardson 			DEFAULT_NUM_XFORMS *
341a9de470cSBruce Richardson 			sizeof(struct rte_crypto_sym_xform) +
342a9de470cSBruce Richardson 			MAXIMUM_IV_LENGTH,
343a9de470cSBruce Richardson 			rte_socket_id());
344a9de470cSBruce Richardson 	if (ts_params->cop_mpool == NULL) {
345a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
346a9de470cSBruce Richardson 		return TEST_FAILED;
347a9de470cSBruce Richardson 	}
348a9de470cSBruce Richardson 
349a9de470cSBruce Richardson 	/* Set up all the qps on the first of the valid devices found */
350a9de470cSBruce Richardson 	dev_id = ts_params->valid_dev;
351a9de470cSBruce Richardson 
352a9de470cSBruce Richardson 	rte_cryptodev_info_get(dev_id, &info);
353a9de470cSBruce Richardson 
354a9de470cSBruce Richardson 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
355a9de470cSBruce Richardson 	ts_params->conf.socket_id = SOCKET_ID_ANY;
356c9030ae3SAnoob Joseph 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO;
357a9de470cSBruce Richardson 
358a9de470cSBruce Richardson 	sess_sz = rte_cryptodev_sym_get_private_session_size(dev_id);
359a9de470cSBruce Richardson 	sess_sz = RTE_MAX(sess_sz, sizeof(struct rte_security_session));
360a9de470cSBruce Richardson 
361a9de470cSBruce Richardson 	/*
362a9de470cSBruce Richardson 	 * Create mempools for sessions
363a9de470cSBruce Richardson 	 */
364a9de470cSBruce Richardson 	if (info.sym.max_nb_sessions != 0 &&
365a9de470cSBruce Richardson 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
366a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Device does not support "
367a9de470cSBruce Richardson 				"at least %u sessions\n",
368a9de470cSBruce Richardson 				MAX_NB_SESSIONS);
369a9de470cSBruce Richardson 		return TEST_FAILED;
370a9de470cSBruce Richardson 	}
371a9de470cSBruce Richardson 
372a9de470cSBruce Richardson 	ts_params->qp_conf.mp_session =
373a9de470cSBruce Richardson 		rte_cryptodev_sym_session_pool_create("test_sess_mp",
374bdce2564SAkhil Goyal 			MAX_NB_SESSIONS, sess_sz, 0, 0, SOCKET_ID_ANY);
375a9de470cSBruce Richardson 
376a9de470cSBruce Richardson 	TEST_ASSERT_NOT_NULL(ts_params->qp_conf.mp_session,
377a9de470cSBruce Richardson 			"session mempool allocation failed");
378a9de470cSBruce Richardson 
379a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
380a9de470cSBruce Richardson 			&ts_params->conf),
381a9de470cSBruce Richardson 			"Failed to configure cryptodev %u with %u qps",
382a9de470cSBruce Richardson 			dev_id, ts_params->conf.nb_queue_pairs);
383a9de470cSBruce Richardson 
384a9de470cSBruce Richardson 	ts_params->qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
385a9de470cSBruce Richardson 
386a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
387a9de470cSBruce Richardson 		dev_id, 0, &ts_params->qp_conf,
388a9de470cSBruce Richardson 		rte_cryptodev_socket_id(dev_id)),
389a9de470cSBruce Richardson 		"Failed to setup queue pair %u on cryptodev %u",
390a9de470cSBruce Richardson 		0, dev_id);
391a9de470cSBruce Richardson 
392a9de470cSBruce Richardson 	return TEST_SUCCESS;
393a9de470cSBruce Richardson }
394a9de470cSBruce Richardson 
395a9de470cSBruce Richardson static void
396a9de470cSBruce Richardson testsuite_teardown(void)
397a9de470cSBruce Richardson {
398a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
399a9de470cSBruce Richardson 
400a9de470cSBruce Richardson 	if (ts_params->mbuf_pool != NULL) {
401a9de470cSBruce Richardson 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
402a9de470cSBruce Richardson 		rte_mempool_avail_count(ts_params->mbuf_pool));
403a9de470cSBruce Richardson 		rte_mempool_free(ts_params->mbuf_pool);
404a9de470cSBruce Richardson 		ts_params->mbuf_pool = NULL;
405a9de470cSBruce Richardson 	}
406a9de470cSBruce Richardson 
407a9de470cSBruce Richardson 	if (ts_params->cop_mpool != NULL) {
408a9de470cSBruce Richardson 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
409a9de470cSBruce Richardson 		rte_mempool_avail_count(ts_params->cop_mpool));
410a9de470cSBruce Richardson 		rte_mempool_free(ts_params->cop_mpool);
411a9de470cSBruce Richardson 		ts_params->cop_mpool = NULL;
412a9de470cSBruce Richardson 	}
413a9de470cSBruce Richardson 
414a9de470cSBruce Richardson 	/* Free session mempools */
415a9de470cSBruce Richardson 	if (ts_params->qp_conf.mp_session != NULL) {
416a9de470cSBruce Richardson 		rte_mempool_free(ts_params->qp_conf.mp_session);
417a9de470cSBruce Richardson 		ts_params->qp_conf.mp_session = NULL;
418a9de470cSBruce Richardson 	}
419a9de470cSBruce Richardson }
420a9de470cSBruce Richardson 
421a9de470cSBruce Richardson static int
422da74df7dSCiara Power ut_setup_ipsec(void)
423a9de470cSBruce Richardson {
424a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
425a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
426a9de470cSBruce Richardson 
427a9de470cSBruce Richardson 	/* Clear unit test parameters before running test */
428a9de470cSBruce Richardson 	memset(ut_params, 0, sizeof(*ut_params));
429a9de470cSBruce Richardson 
430a9de470cSBruce Richardson 	/* Reconfigure device to default parameters */
431a9de470cSBruce Richardson 	ts_params->conf.socket_id = SOCKET_ID_ANY;
432a9de470cSBruce Richardson 
433a9de470cSBruce Richardson 	/* Start the device */
434a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_dev),
435a9de470cSBruce Richardson 			"Failed to start cryptodev %u",
436a9de470cSBruce Richardson 			ts_params->valid_dev);
437a9de470cSBruce Richardson 
438a9de470cSBruce Richardson 	return TEST_SUCCESS;
439a9de470cSBruce Richardson }
440a9de470cSBruce Richardson 
441a9de470cSBruce Richardson static void
442da74df7dSCiara Power ut_teardown_ipsec(void)
443a9de470cSBruce Richardson {
444a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
445a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
446a9de470cSBruce Richardson 	int i;
447a9de470cSBruce Richardson 
448a9de470cSBruce Richardson 	for (i = 0; i < BURST_SIZE; i++) {
449a9de470cSBruce Richardson 		/* free crypto operation structure */
45074f44dd8SBernard Iremonger 		if (ut_params->cop[i]) {
451a9de470cSBruce Richardson 			rte_crypto_op_free(ut_params->cop[i]);
45274f44dd8SBernard Iremonger 			ut_params->cop[i] = NULL;
45374f44dd8SBernard Iremonger 		}
454a9de470cSBruce Richardson 
455a9de470cSBruce Richardson 		/*
456a9de470cSBruce Richardson 		 * free mbuf - both obuf and ibuf are usually the same,
457a9de470cSBruce Richardson 		 * so check if they point at the same address is necessary,
458a9de470cSBruce Richardson 		 * to avoid freeing the mbuf twice.
459a9de470cSBruce Richardson 		 */
460a9de470cSBruce Richardson 		if (ut_params->obuf[i]) {
461a9de470cSBruce Richardson 			rte_pktmbuf_free(ut_params->obuf[i]);
462a9de470cSBruce Richardson 			if (ut_params->ibuf[i] == ut_params->obuf[i])
46374f44dd8SBernard Iremonger 				ut_params->ibuf[i] = NULL;
46474f44dd8SBernard Iremonger 			ut_params->obuf[i] = NULL;
465a9de470cSBruce Richardson 		}
466a9de470cSBruce Richardson 		if (ut_params->ibuf[i]) {
467a9de470cSBruce Richardson 			rte_pktmbuf_free(ut_params->ibuf[i]);
46874f44dd8SBernard Iremonger 			ut_params->ibuf[i] = NULL;
469a9de470cSBruce Richardson 		}
470a9de470cSBruce Richardson 
471a9de470cSBruce Richardson 		if (ut_params->testbuf[i]) {
472a9de470cSBruce Richardson 			rte_pktmbuf_free(ut_params->testbuf[i]);
47374f44dd8SBernard Iremonger 			ut_params->testbuf[i] = NULL;
474a9de470cSBruce Richardson 		}
475a9de470cSBruce Richardson 	}
476a9de470cSBruce Richardson 
477a9de470cSBruce Richardson 	if (ts_params->mbuf_pool != NULL)
478a9de470cSBruce Richardson 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
479a9de470cSBruce Richardson 			rte_mempool_avail_count(ts_params->mbuf_pool));
480a9de470cSBruce Richardson 
481a9de470cSBruce Richardson 	/* Stop the device */
482a9de470cSBruce Richardson 	rte_cryptodev_stop(ts_params->valid_dev);
483a9de470cSBruce Richardson }
484a9de470cSBruce Richardson 
485a9de470cSBruce Richardson #define IPSEC_MAX_PAD_SIZE	UINT8_MAX
486a9de470cSBruce Richardson 
487a9de470cSBruce Richardson static const uint8_t esp_pad_bytes[IPSEC_MAX_PAD_SIZE] = {
488a9de470cSBruce Richardson 	1, 2, 3, 4, 5, 6, 7, 8,
489a9de470cSBruce Richardson 	9, 10, 11, 12, 13, 14, 15, 16,
490a9de470cSBruce Richardson 	17, 18, 19, 20, 21, 22, 23, 24,
491a9de470cSBruce Richardson 	25, 26, 27, 28, 29, 30, 31, 32,
492a9de470cSBruce Richardson 	33, 34, 35, 36, 37, 38, 39, 40,
493a9de470cSBruce Richardson 	41, 42, 43, 44, 45, 46, 47, 48,
494a9de470cSBruce Richardson 	49, 50, 51, 52, 53, 54, 55, 56,
495a9de470cSBruce Richardson 	57, 58, 59, 60, 61, 62, 63, 64,
496a9de470cSBruce Richardson 	65, 66, 67, 68, 69, 70, 71, 72,
497a9de470cSBruce Richardson 	73, 74, 75, 76, 77, 78, 79, 80,
498a9de470cSBruce Richardson 	81, 82, 83, 84, 85, 86, 87, 88,
499a9de470cSBruce Richardson 	89, 90, 91, 92, 93, 94, 95, 96,
500a9de470cSBruce Richardson 	97, 98, 99, 100, 101, 102, 103, 104,
501a9de470cSBruce Richardson 	105, 106, 107, 108, 109, 110, 111, 112,
502a9de470cSBruce Richardson 	113, 114, 115, 116, 117, 118, 119, 120,
503a9de470cSBruce Richardson 	121, 122, 123, 124, 125, 126, 127, 128,
504a9de470cSBruce Richardson 	129, 130, 131, 132, 133, 134, 135, 136,
505a9de470cSBruce Richardson 	137, 138, 139, 140, 141, 142, 143, 144,
506a9de470cSBruce Richardson 	145, 146, 147, 148, 149, 150, 151, 152,
507a9de470cSBruce Richardson 	153, 154, 155, 156, 157, 158, 159, 160,
508a9de470cSBruce Richardson 	161, 162, 163, 164, 165, 166, 167, 168,
509a9de470cSBruce Richardson 	169, 170, 171, 172, 173, 174, 175, 176,
510a9de470cSBruce Richardson 	177, 178, 179, 180, 181, 182, 183, 184,
511a9de470cSBruce Richardson 	185, 186, 187, 188, 189, 190, 191, 192,
512a9de470cSBruce Richardson 	193, 194, 195, 196, 197, 198, 199, 200,
513a9de470cSBruce Richardson 	201, 202, 203, 204, 205, 206, 207, 208,
514a9de470cSBruce Richardson 	209, 210, 211, 212, 213, 214, 215, 216,
515a9de470cSBruce Richardson 	217, 218, 219, 220, 221, 222, 223, 224,
516a9de470cSBruce Richardson 	225, 226, 227, 228, 229, 230, 231, 232,
517a9de470cSBruce Richardson 	233, 234, 235, 236, 237, 238, 239, 240,
518a9de470cSBruce Richardson 	241, 242, 243, 244, 245, 246, 247, 248,
519a9de470cSBruce Richardson 	249, 250, 251, 252, 253, 254, 255,
520a9de470cSBruce Richardson };
521a9de470cSBruce Richardson 
522a9de470cSBruce Richardson /* ***** data for tests ***** */
523a9de470cSBruce Richardson 
524a9de470cSBruce Richardson const char null_plain_data[] =
525a9de470cSBruce Richardson 	"Network Security People Have A Strange Sense Of Humor unlike Other "
526a9de470cSBruce Richardson 	"People who have a normal sense of humour";
527a9de470cSBruce Richardson 
528a9de470cSBruce Richardson const char null_encrypted_data[] =
529a9de470cSBruce Richardson 	"Network Security People Have A Strange Sense Of Humor unlike Other "
530a9de470cSBruce Richardson 	"People who have a normal sense of humour";
531a9de470cSBruce Richardson 
532a7c528e5SOlivier Matz struct rte_ipv4_hdr ipv4_outer  = {
533a9de470cSBruce Richardson 	.version_ihl = IPVERSION << 4 |
53424ac604eSOlivier Matz 		sizeof(ipv4_outer) / RTE_IPV4_IHL_MULTIPLIER,
535a9de470cSBruce Richardson 	.time_to_live = IPDEFTTL,
536a9de470cSBruce Richardson 	.next_proto_id = IPPROTO_ESP,
5370c9da755SDavid Marchand 	.src_addr = RTE_IPV4(192, 168, 1, 100),
5380c9da755SDavid Marchand 	.dst_addr = RTE_IPV4(192, 168, 2, 100),
539a9de470cSBruce Richardson };
540a9de470cSBruce Richardson 
541a9de470cSBruce Richardson static struct rte_mbuf *
5426e108b6aSDavid Marchand setup_test_string(struct rte_mempool *mpool, const char *string,
5436e108b6aSDavid Marchand 	size_t string_len, size_t len, uint8_t blocksize)
544a9de470cSBruce Richardson {
545a9de470cSBruce Richardson 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
546a9de470cSBruce Richardson 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
547a9de470cSBruce Richardson 
5486e108b6aSDavid Marchand 	RTE_VERIFY(len <= string_len);
5496e108b6aSDavid Marchand 
550a9de470cSBruce Richardson 	if (m) {
551a9de470cSBruce Richardson 		memset(m->buf_addr, 0, m->buf_len);
552a9de470cSBruce Richardson 		char *dst = rte_pktmbuf_append(m, t_len);
553a9de470cSBruce Richardson 
554a9de470cSBruce Richardson 		if (!dst) {
555a9de470cSBruce Richardson 			rte_pktmbuf_free(m);
556a9de470cSBruce Richardson 			return NULL;
557a9de470cSBruce Richardson 		}
558a9de470cSBruce Richardson 		if (string != NULL)
559a9de470cSBruce Richardson 			rte_memcpy(dst, string, t_len);
560a9de470cSBruce Richardson 		else
561a9de470cSBruce Richardson 			memset(dst, 0, t_len);
562a9de470cSBruce Richardson 	}
563a9de470cSBruce Richardson 
564a9de470cSBruce Richardson 	return m;
565a9de470cSBruce Richardson }
566a9de470cSBruce Richardson 
567a9de470cSBruce Richardson static struct rte_mbuf *
568a9de470cSBruce Richardson setup_test_string_tunneled(struct rte_mempool *mpool, const char *string,
569a9de470cSBruce Richardson 	size_t len, uint32_t spi, uint32_t seq)
570a9de470cSBruce Richardson {
571a9de470cSBruce Richardson 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
572a7c528e5SOlivier Matz 	uint32_t hdrlen = sizeof(struct rte_ipv4_hdr) +
573a7c528e5SOlivier Matz 		sizeof(struct rte_esp_hdr);
5747dde68cfSDavid Marchand 	uint32_t taillen = sizeof(struct rte_esp_tail);
575a9de470cSBruce Richardson 	uint32_t t_len = len + hdrlen + taillen;
576a9de470cSBruce Richardson 	uint32_t padlen;
577a9de470cSBruce Richardson 
5785ef25467SOlivier Matz 	struct rte_esp_hdr esph  = {
579a9de470cSBruce Richardson 		.spi = rte_cpu_to_be_32(spi),
580a9de470cSBruce Richardson 		.seq = rte_cpu_to_be_32(seq)
581a9de470cSBruce Richardson 	};
582a9de470cSBruce Richardson 
583a9de470cSBruce Richardson 	padlen = RTE_ALIGN(t_len, 4) - t_len;
584a9de470cSBruce Richardson 	t_len += padlen;
585a9de470cSBruce Richardson 
5867dde68cfSDavid Marchand 	struct rte_esp_tail espt = {
587a9de470cSBruce Richardson 		.pad_len = padlen,
588a9de470cSBruce Richardson 		.next_proto = IPPROTO_IPIP,
589a9de470cSBruce Richardson 	};
590a9de470cSBruce Richardson 
591a9de470cSBruce Richardson 	if (m == NULL)
592a9de470cSBruce Richardson 		return NULL;
593a9de470cSBruce Richardson 
594a9de470cSBruce Richardson 	memset(m->buf_addr, 0, m->buf_len);
595a9de470cSBruce Richardson 	char *dst = rte_pktmbuf_append(m, t_len);
596a9de470cSBruce Richardson 
597a9de470cSBruce Richardson 	if (!dst) {
598a9de470cSBruce Richardson 		rte_pktmbuf_free(m);
599a9de470cSBruce Richardson 		return NULL;
600a9de470cSBruce Richardson 	}
601a9de470cSBruce Richardson 	/* copy outer IP and ESP header */
602a9de470cSBruce Richardson 	ipv4_outer.total_length = rte_cpu_to_be_16(t_len);
603a9de470cSBruce Richardson 	ipv4_outer.packet_id = rte_cpu_to_be_16(seq);
604a9de470cSBruce Richardson 	rte_memcpy(dst, &ipv4_outer, sizeof(ipv4_outer));
605a9de470cSBruce Richardson 	dst += sizeof(ipv4_outer);
606a9de470cSBruce Richardson 	m->l3_len = sizeof(ipv4_outer);
607a9de470cSBruce Richardson 	rte_memcpy(dst, &esph, sizeof(esph));
608a9de470cSBruce Richardson 	dst += sizeof(esph);
609a9de470cSBruce Richardson 
610a9de470cSBruce Richardson 	if (string != NULL) {
611a9de470cSBruce Richardson 		/* copy payload */
612a9de470cSBruce Richardson 		rte_memcpy(dst, string, len);
613a9de470cSBruce Richardson 		dst += len;
614a9de470cSBruce Richardson 		/* copy pad bytes */
615250cbb8dSAmit Prakash Shukla 		rte_memcpy(dst, esp_pad_bytes, RTE_MIN(padlen,
616250cbb8dSAmit Prakash Shukla 			sizeof(esp_pad_bytes)));
617a9de470cSBruce Richardson 		dst += padlen;
618a9de470cSBruce Richardson 		/* copy ESP tail header */
619a9de470cSBruce Richardson 		rte_memcpy(dst, &espt, sizeof(espt));
620a9de470cSBruce Richardson 	} else
621a9de470cSBruce Richardson 		memset(dst, 0, t_len);
622a9de470cSBruce Richardson 
623a9de470cSBruce Richardson 	return m;
624a9de470cSBruce Richardson }
625a9de470cSBruce Richardson 
626a9de470cSBruce Richardson static int
627a9de470cSBruce Richardson create_dummy_sec_session(struct ipsec_unitest_params *ut,
628a9de470cSBruce Richardson 	struct rte_cryptodev_qp_conf *qp, uint32_t j)
629a9de470cSBruce Richardson {
630a9de470cSBruce Richardson 	static struct rte_security_session_conf conf;
631a9de470cSBruce Richardson 
632a9de470cSBruce Richardson 	ut->ss[j].security.ses = rte_security_session_create(&dummy_sec_ctx,
6333f3fc330SAkhil Goyal 					&conf, qp->mp_session);
634a9de470cSBruce Richardson 
635a9de470cSBruce Richardson 	if (ut->ss[j].security.ses == NULL)
636a9de470cSBruce Richardson 		return -ENOMEM;
637a9de470cSBruce Richardson 
638a9de470cSBruce Richardson 	ut->ss[j].security.ctx = &dummy_sec_ctx;
639a9de470cSBruce Richardson 	ut->ss[j].security.ol_flags = 0;
640a9de470cSBruce Richardson 	return 0;
641a9de470cSBruce Richardson }
642a9de470cSBruce Richardson 
643a9de470cSBruce Richardson static int
644a9de470cSBruce Richardson create_crypto_session(struct ipsec_unitest_params *ut,
645a9de470cSBruce Richardson 	struct rte_cryptodev_qp_conf *qp, uint8_t dev_id, uint32_t j)
646a9de470cSBruce Richardson {
6472a440d6aSAkhil Goyal 	void *s;
648a9de470cSBruce Richardson 
649bdce2564SAkhil Goyal 	s = rte_cryptodev_sym_session_create(dev_id, ut->crypto_xforms,
650bdce2564SAkhil Goyal 			qp->mp_session);
651a9de470cSBruce Richardson 	if (s == NULL)
652a9de470cSBruce Richardson 		return -ENOMEM;
653a9de470cSBruce Richardson 
654a9de470cSBruce Richardson 	ut->ss[j].crypto.ses = s;
655a9de470cSBruce Richardson 	return 0;
656a9de470cSBruce Richardson }
657a9de470cSBruce Richardson 
658a9de470cSBruce Richardson static int
659a9de470cSBruce Richardson create_session(struct ipsec_unitest_params *ut,
660a9de470cSBruce Richardson 	struct rte_cryptodev_qp_conf *qp, uint8_t crypto_dev, uint32_t j)
661a9de470cSBruce Richardson {
662a9de470cSBruce Richardson 	if (ut->ss[j].type == RTE_SECURITY_ACTION_TYPE_NONE)
663a9de470cSBruce Richardson 		return create_crypto_session(ut, qp, crypto_dev, j);
664a9de470cSBruce Richardson 	else
665a9de470cSBruce Richardson 		return create_dummy_sec_session(ut, qp, j);
666a9de470cSBruce Richardson }
667a9de470cSBruce Richardson 
668a9de470cSBruce Richardson static int
669a9de470cSBruce Richardson fill_ipsec_param(uint32_t replay_win_sz, uint64_t flags)
670a9de470cSBruce Richardson {
671a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
672a9de470cSBruce Richardson 	struct rte_ipsec_sa_prm *prm = &ut_params->sa_prm;
673a9de470cSBruce Richardson 	const struct supported_auth_algo *auth_algo;
674a9de470cSBruce Richardson 	const struct supported_cipher_algo *cipher_algo;
675a9de470cSBruce Richardson 
676a9de470cSBruce Richardson 	memset(prm, 0, sizeof(*prm));
677a9de470cSBruce Richardson 
678a9de470cSBruce Richardson 	prm->userdata = 1;
679a9de470cSBruce Richardson 	prm->flags = flags;
680a9de470cSBruce Richardson 
681a9de470cSBruce Richardson 	/* setup ipsec xform */
682a9de470cSBruce Richardson 	prm->ipsec_xform = ut_params->ipsec_xform;
683a9de470cSBruce Richardson 	prm->ipsec_xform.salt = (uint32_t)rte_rand();
6840f56ca1aSHemant Agrawal 	prm->ipsec_xform.replay_win_sz = replay_win_sz;
685a9de470cSBruce Richardson 
686a9de470cSBruce Richardson 	/* setup tunnel related fields */
687a9de470cSBruce Richardson 	prm->tun.hdr_len = sizeof(ipv4_outer);
688a9de470cSBruce Richardson 	prm->tun.next_proto = IPPROTO_IPIP;
689a9de470cSBruce Richardson 	prm->tun.hdr = &ipv4_outer;
690a9de470cSBruce Richardson 
691a9de470cSBruce Richardson 	/* setup crypto section */
692a9de470cSBruce Richardson 	if (uparams.aead != 0) {
693a9de470cSBruce Richardson 		/* TODO: will need to fill out with other test cases */
694a9de470cSBruce Richardson 	} else {
695a9de470cSBruce Richardson 		if (uparams.auth == 0 && uparams.cipher == 0)
696a9de470cSBruce Richardson 			return TEST_FAILED;
697a9de470cSBruce Richardson 
698a9de470cSBruce Richardson 		auth_algo = find_match_auth_algo(uparams.auth_algo);
699a9de470cSBruce Richardson 		cipher_algo = find_match_cipher_algo(uparams.cipher_algo);
700a9de470cSBruce Richardson 
701a9de470cSBruce Richardson 		fill_crypto_xform(ut_params, auth_algo, cipher_algo);
702a9de470cSBruce Richardson 	}
703a9de470cSBruce Richardson 
704a9de470cSBruce Richardson 	prm->crypto_xform = ut_params->crypto_xforms;
705a9de470cSBruce Richardson 	return TEST_SUCCESS;
706a9de470cSBruce Richardson }
707a9de470cSBruce Richardson 
708a9de470cSBruce Richardson static int
709a9de470cSBruce Richardson create_sa(enum rte_security_session_action_type action_type,
710a9de470cSBruce Richardson 		uint32_t replay_win_sz, uint64_t flags, uint32_t j)
711a9de470cSBruce Richardson {
712a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts = &testsuite_params;
713a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut = &unittest_params;
714a9de470cSBruce Richardson 	size_t sz;
715a9de470cSBruce Richardson 	int rc;
716a9de470cSBruce Richardson 
717a9de470cSBruce Richardson 	memset(&ut->ss[j], 0, sizeof(ut->ss[j]));
718a9de470cSBruce Richardson 
719a9de470cSBruce Richardson 	rc = fill_ipsec_param(replay_win_sz, flags);
720a9de470cSBruce Richardson 	if (rc != 0)
721a9de470cSBruce Richardson 		return TEST_FAILED;
722a9de470cSBruce Richardson 
723a9de470cSBruce Richardson 	/* create rte_ipsec_sa*/
724a9de470cSBruce Richardson 	sz = rte_ipsec_sa_size(&ut->sa_prm);
725a9de470cSBruce Richardson 	TEST_ASSERT(sz > 0, "rte_ipsec_sa_size() failed\n");
726a9de470cSBruce Richardson 
727a9de470cSBruce Richardson 	ut->ss[j].sa = rte_zmalloc(NULL, sz, RTE_CACHE_LINE_SIZE);
728a9de470cSBruce Richardson 	TEST_ASSERT_NOT_NULL(ut->ss[j].sa,
729a9de470cSBruce Richardson 		"failed to allocate memory for rte_ipsec_sa\n");
730a9de470cSBruce Richardson 
731a9de470cSBruce Richardson 	ut->ss[j].type = action_type;
732a9de470cSBruce Richardson 	rc = create_session(ut, &ts->qp_conf, ts->valid_dev, j);
733a9de470cSBruce Richardson 	if (rc != 0)
7348dda080aSGagandeep Singh 		return rc;
735a9de470cSBruce Richardson 
736a9de470cSBruce Richardson 	rc = rte_ipsec_sa_init(ut->ss[j].sa, &ut->sa_prm, sz);
737a9de470cSBruce Richardson 	rc = (rc > 0 && (uint32_t)rc <= sz) ? 0 : -EINVAL;
738a9de470cSBruce Richardson 	if (rc == 0)
739a9de470cSBruce Richardson 		rc = rte_ipsec_session_prepare(&ut->ss[j]);
740a9de470cSBruce Richardson 
741a9de470cSBruce Richardson 	return rc;
742a9de470cSBruce Richardson }
743a9de470cSBruce Richardson 
744a9de470cSBruce Richardson static int
7452cb4a0d4SBernard Iremonger crypto_dequeue_burst(uint16_t num_pkts)
7462cb4a0d4SBernard Iremonger {
7472cb4a0d4SBernard Iremonger 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
7482cb4a0d4SBernard Iremonger 	struct ipsec_unitest_params *ut_params = &unittest_params;
7492cb4a0d4SBernard Iremonger 	uint32_t pkt_cnt, k;
7502cb4a0d4SBernard Iremonger 	int i;
7512cb4a0d4SBernard Iremonger 
7522cb4a0d4SBernard Iremonger 	for (i = 0, pkt_cnt = 0;
7532cb4a0d4SBernard Iremonger 		i < DEQUEUE_COUNT && pkt_cnt != num_pkts; i++) {
7542cb4a0d4SBernard Iremonger 		k = rte_cryptodev_dequeue_burst(ts_params->valid_dev, 0,
7552cb4a0d4SBernard Iremonger 			&ut_params->cop[pkt_cnt], num_pkts - pkt_cnt);
7562cb4a0d4SBernard Iremonger 		pkt_cnt += k;
7572cb4a0d4SBernard Iremonger 		rte_delay_us(1);
7582cb4a0d4SBernard Iremonger 	}
7592cb4a0d4SBernard Iremonger 
7602cb4a0d4SBernard Iremonger 	if (pkt_cnt != num_pkts) {
7612cb4a0d4SBernard Iremonger 		RTE_LOG(ERR, USER1, "rte_cryptodev_dequeue_burst fail\n");
7622cb4a0d4SBernard Iremonger 		return TEST_FAILED;
7632cb4a0d4SBernard Iremonger 	}
7642cb4a0d4SBernard Iremonger 	return TEST_SUCCESS;
7652cb4a0d4SBernard Iremonger }
7662cb4a0d4SBernard Iremonger 
7672cb4a0d4SBernard Iremonger static int
768a9de470cSBruce Richardson crypto_ipsec(uint16_t num_pkts)
769a9de470cSBruce Richardson {
770a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
771a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
772a9de470cSBruce Richardson 	uint32_t k, ng;
773a9de470cSBruce Richardson 	struct rte_ipsec_group grp[1];
774a9de470cSBruce Richardson 
775a9de470cSBruce Richardson 	/* call crypto prepare */
776a9de470cSBruce Richardson 	k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[0], ut_params->ibuf,
777a9de470cSBruce Richardson 		ut_params->cop, num_pkts);
778a9de470cSBruce Richardson 	if (k != num_pkts) {
779a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_prepare fail\n");
780a9de470cSBruce Richardson 		return TEST_FAILED;
781a9de470cSBruce Richardson 	}
7822cb4a0d4SBernard Iremonger 
783a9de470cSBruce Richardson 	k = rte_cryptodev_enqueue_burst(ts_params->valid_dev, 0,
784a9de470cSBruce Richardson 		ut_params->cop, num_pkts);
785a9de470cSBruce Richardson 	if (k != num_pkts) {
786a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "rte_cryptodev_enqueue_burst fail\n");
787a9de470cSBruce Richardson 		return TEST_FAILED;
788a9de470cSBruce Richardson 	}
789a9de470cSBruce Richardson 
7902cb4a0d4SBernard Iremonger 	if (crypto_dequeue_burst(num_pkts) == TEST_FAILED)
791a9de470cSBruce Richardson 		return TEST_FAILED;
792a9de470cSBruce Richardson 
793a9de470cSBruce Richardson 	ng = rte_ipsec_pkt_crypto_group(
794a9de470cSBruce Richardson 		(const struct rte_crypto_op **)(uintptr_t)ut_params->cop,
795a9de470cSBruce Richardson 		ut_params->obuf, grp, num_pkts);
796a9de470cSBruce Richardson 	if (ng != 1 ||
797a9de470cSBruce Richardson 		grp[0].m[0] != ut_params->obuf[0] ||
798a9de470cSBruce Richardson 		grp[0].cnt != num_pkts ||
799a9de470cSBruce Richardson 		grp[0].id.ptr != &ut_params->ss[0]) {
800a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail\n");
801a9de470cSBruce Richardson 		return TEST_FAILED;
802a9de470cSBruce Richardson 	}
803a9de470cSBruce Richardson 
804a9de470cSBruce Richardson 	/* call crypto process */
805a9de470cSBruce Richardson 	k = rte_ipsec_pkt_process(grp[0].id.ptr, grp[0].m, grp[0].cnt);
806a9de470cSBruce Richardson 	if (k != num_pkts) {
807a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_process fail\n");
808a9de470cSBruce Richardson 		return TEST_FAILED;
809a9de470cSBruce Richardson 	}
810a9de470cSBruce Richardson 
811a9de470cSBruce Richardson 	return TEST_SUCCESS;
812a9de470cSBruce Richardson }
813a9de470cSBruce Richardson 
814a9de470cSBruce Richardson static int
815a9de470cSBruce Richardson lksd_proto_ipsec(uint16_t num_pkts)
816a9de470cSBruce Richardson {
817a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
818a9de470cSBruce Richardson 	uint32_t i, k, ng;
819a9de470cSBruce Richardson 	struct rte_ipsec_group grp[1];
820a9de470cSBruce Richardson 
821a9de470cSBruce Richardson 	/* call crypto prepare */
822a9de470cSBruce Richardson 	k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[0], ut_params->ibuf,
823a9de470cSBruce Richardson 		ut_params->cop, num_pkts);
824a9de470cSBruce Richardson 	if (k != num_pkts) {
825a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_prepare fail\n");
826a9de470cSBruce Richardson 		return TEST_FAILED;
827a9de470cSBruce Richardson 	}
828a9de470cSBruce Richardson 
829a9de470cSBruce Richardson 	/* check crypto ops */
830a9de470cSBruce Richardson 	for (i = 0; i != num_pkts; i++) {
831a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->cop[i]->type,
832a9de470cSBruce Richardson 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
833a9de470cSBruce Richardson 			"%s: invalid crypto op type for %u-th packet\n",
834a9de470cSBruce Richardson 			__func__, i);
835a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->cop[i]->status,
836a9de470cSBruce Richardson 			RTE_CRYPTO_OP_STATUS_NOT_PROCESSED,
837a9de470cSBruce Richardson 			"%s: invalid crypto op status for %u-th packet\n",
838a9de470cSBruce Richardson 			__func__, i);
839a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->cop[i]->sess_type,
840a9de470cSBruce Richardson 			RTE_CRYPTO_OP_SECURITY_SESSION,
841a9de470cSBruce Richardson 			"%s: invalid crypto op sess_type for %u-th packet\n",
842a9de470cSBruce Richardson 			__func__, i);
843a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->cop[i]->sym->m_src,
844a9de470cSBruce Richardson 			ut_params->ibuf[i],
845a9de470cSBruce Richardson 			"%s: invalid crypto op m_src for %u-th packet\n",
846a9de470cSBruce Richardson 			__func__, i);
847a9de470cSBruce Richardson 	}
848a9de470cSBruce Richardson 
849a9de470cSBruce Richardson 	/* update crypto ops, pretend all finished ok */
850a9de470cSBruce Richardson 	for (i = 0; i != num_pkts; i++)
851a9de470cSBruce Richardson 		ut_params->cop[i]->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
852a9de470cSBruce Richardson 
853a9de470cSBruce Richardson 	ng = rte_ipsec_pkt_crypto_group(
854a9de470cSBruce Richardson 		(const struct rte_crypto_op **)(uintptr_t)ut_params->cop,
855a9de470cSBruce Richardson 		ut_params->obuf, grp, num_pkts);
856a9de470cSBruce Richardson 	if (ng != 1 ||
857a9de470cSBruce Richardson 		grp[0].m[0] != ut_params->obuf[0] ||
858a9de470cSBruce Richardson 		grp[0].cnt != num_pkts ||
859a9de470cSBruce Richardson 		grp[0].id.ptr != &ut_params->ss[0]) {
860a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail\n");
861a9de470cSBruce Richardson 		return TEST_FAILED;
862a9de470cSBruce Richardson 	}
863a9de470cSBruce Richardson 
864a9de470cSBruce Richardson 	/* call crypto process */
865a9de470cSBruce Richardson 	k = rte_ipsec_pkt_process(grp[0].id.ptr, grp[0].m, grp[0].cnt);
866a9de470cSBruce Richardson 	if (k != num_pkts) {
867a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_process fail\n");
868a9de470cSBruce Richardson 		return TEST_FAILED;
869a9de470cSBruce Richardson 	}
870a9de470cSBruce Richardson 
871a9de470cSBruce Richardson 	return TEST_SUCCESS;
872a9de470cSBruce Richardson }
873a9de470cSBruce Richardson 
8743feaf412SBernard Iremonger static void
8753feaf412SBernard Iremonger dump_grp_pkt(uint32_t i, struct rte_ipsec_group *grp, uint32_t k)
8763feaf412SBernard Iremonger {
8773feaf412SBernard Iremonger 	RTE_LOG(ERR, USER1,
8783feaf412SBernard Iremonger 		"After rte_ipsec_pkt_process grp[%d].cnt=%d k=%d fail\n",
8793feaf412SBernard Iremonger 		i, grp[i].cnt, k);
8803feaf412SBernard Iremonger 	RTE_LOG(ERR, USER1,
8813feaf412SBernard Iremonger 		"After rte_ipsec_pkt_process grp[%d].m=%p grp[%d].m[%d]=%p\n",
8823feaf412SBernard Iremonger 		i, grp[i].m, i, k, grp[i].m[k]);
8833feaf412SBernard Iremonger 
8843feaf412SBernard Iremonger 	rte_pktmbuf_dump(stdout, grp[i].m[k], grp[i].m[k]->data_len);
8853feaf412SBernard Iremonger }
8863feaf412SBernard Iremonger 
887a9de470cSBruce Richardson static int
888a9de470cSBruce Richardson crypto_ipsec_2sa(void)
889a9de470cSBruce Richardson {
890a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
891a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
892a9de470cSBruce Richardson 	struct rte_ipsec_group grp[BURST_SIZE];
893a9de470cSBruce Richardson 	uint32_t k, ng, i, r;
894a9de470cSBruce Richardson 
895a9de470cSBruce Richardson 	for (i = 0; i < BURST_SIZE; i++) {
896a9de470cSBruce Richardson 		r = i % 2;
897a9de470cSBruce Richardson 		/* call crypto prepare */
898a9de470cSBruce Richardson 		k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[r],
899a9de470cSBruce Richardson 				ut_params->ibuf + i, ut_params->cop + i, 1);
900a9de470cSBruce Richardson 		if (k != 1) {
901a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
902a9de470cSBruce Richardson 				"rte_ipsec_pkt_crypto_prepare fail\n");
903a9de470cSBruce Richardson 			return TEST_FAILED;
904a9de470cSBruce Richardson 		}
905a9de470cSBruce Richardson 		k = rte_cryptodev_enqueue_burst(ts_params->valid_dev, 0,
906a9de470cSBruce Richardson 				ut_params->cop + i, 1);
907a9de470cSBruce Richardson 		if (k != 1) {
908a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
909a9de470cSBruce Richardson 				"rte_cryptodev_enqueue_burst fail\n");
910a9de470cSBruce Richardson 			return TEST_FAILED;
911a9de470cSBruce Richardson 		}
912a9de470cSBruce Richardson 	}
913a9de470cSBruce Richardson 
9142cb4a0d4SBernard Iremonger 	if (crypto_dequeue_burst(BURST_SIZE) == TEST_FAILED)
915a9de470cSBruce Richardson 		return TEST_FAILED;
916a9de470cSBruce Richardson 
917a9de470cSBruce Richardson 	ng = rte_ipsec_pkt_crypto_group(
918a9de470cSBruce Richardson 		(const struct rte_crypto_op **)(uintptr_t)ut_params->cop,
919a9de470cSBruce Richardson 		ut_params->obuf, grp, BURST_SIZE);
920a9de470cSBruce Richardson 	if (ng != BURST_SIZE) {
921a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail ng=%d\n",
922a9de470cSBruce Richardson 			ng);
923a9de470cSBruce Richardson 		return TEST_FAILED;
924a9de470cSBruce Richardson 	}
925a9de470cSBruce Richardson 
926a9de470cSBruce Richardson 	/* call crypto process */
927a9de470cSBruce Richardson 	for (i = 0; i < ng; i++) {
928a9de470cSBruce Richardson 		k = rte_ipsec_pkt_process(grp[i].id.ptr, grp[i].m, grp[i].cnt);
929a9de470cSBruce Richardson 		if (k != grp[i].cnt) {
9303feaf412SBernard Iremonger 			dump_grp_pkt(i, grp, k);
931a9de470cSBruce Richardson 			return TEST_FAILED;
932a9de470cSBruce Richardson 		}
933a9de470cSBruce Richardson 	}
934a9de470cSBruce Richardson 	return TEST_SUCCESS;
935a9de470cSBruce Richardson }
936a9de470cSBruce Richardson 
937a9de470cSBruce Richardson #define PKT_4	4
938a9de470cSBruce Richardson #define PKT_12	12
939a9de470cSBruce Richardson #define PKT_21	21
940a9de470cSBruce Richardson 
941a9de470cSBruce Richardson static uint32_t
942a9de470cSBruce Richardson crypto_ipsec_4grp(uint32_t pkt_num)
943a9de470cSBruce Richardson {
944a9de470cSBruce Richardson 	uint32_t sa_ind;
945a9de470cSBruce Richardson 
94623f3dac4SStephen Hemminger 	/* group packets in 4 different size groups, 2 per SA */
947a9de470cSBruce Richardson 	if (pkt_num < PKT_4)
948a9de470cSBruce Richardson 		sa_ind = 0;
949a9de470cSBruce Richardson 	else if (pkt_num < PKT_12)
950a9de470cSBruce Richardson 		sa_ind = 1;
951a9de470cSBruce Richardson 	else if (pkt_num < PKT_21)
952a9de470cSBruce Richardson 		sa_ind = 0;
953a9de470cSBruce Richardson 	else
954a9de470cSBruce Richardson 		sa_ind = 1;
955a9de470cSBruce Richardson 
956a9de470cSBruce Richardson 	return sa_ind;
957a9de470cSBruce Richardson }
958a9de470cSBruce Richardson 
959a9de470cSBruce Richardson static uint32_t
960a9de470cSBruce Richardson crypto_ipsec_4grp_check_mbufs(uint32_t grp_ind, struct rte_ipsec_group *grp)
961a9de470cSBruce Richardson {
962a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
963a9de470cSBruce Richardson 	uint32_t i, j;
964a9de470cSBruce Richardson 	uint32_t rc = 0;
965a9de470cSBruce Richardson 
966a9de470cSBruce Richardson 	if (grp_ind == 0) {
967a9de470cSBruce Richardson 		for (i = 0, j = 0; i < PKT_4; i++, j++)
968a9de470cSBruce Richardson 			if (grp[grp_ind].m[i] != ut_params->obuf[j]) {
969a9de470cSBruce Richardson 				rc = TEST_FAILED;
970a9de470cSBruce Richardson 				break;
971a9de470cSBruce Richardson 			}
972a9de470cSBruce Richardson 	} else if (grp_ind == 1) {
973a9de470cSBruce Richardson 		for (i = 0, j = PKT_4; i < (PKT_12 - PKT_4); i++, j++) {
974a9de470cSBruce Richardson 			if (grp[grp_ind].m[i] != ut_params->obuf[j]) {
975a9de470cSBruce Richardson 				rc = TEST_FAILED;
976a9de470cSBruce Richardson 				break;
977a9de470cSBruce Richardson 			}
978a9de470cSBruce Richardson 		}
979a9de470cSBruce Richardson 	} else if (grp_ind == 2) {
980a9de470cSBruce Richardson 		for (i = 0, j =  PKT_12; i < (PKT_21 - PKT_12); i++, j++)
981a9de470cSBruce Richardson 			if (grp[grp_ind].m[i] != ut_params->obuf[j]) {
982a9de470cSBruce Richardson 				rc = TEST_FAILED;
983a9de470cSBruce Richardson 				break;
984a9de470cSBruce Richardson 			}
985a9de470cSBruce Richardson 	} else if (grp_ind == 3) {
986a9de470cSBruce Richardson 		for (i = 0, j = PKT_21; i < (BURST_SIZE - PKT_21); i++, j++)
987a9de470cSBruce Richardson 			if (grp[grp_ind].m[i] != ut_params->obuf[j]) {
988a9de470cSBruce Richardson 				rc = TEST_FAILED;
989a9de470cSBruce Richardson 				break;
990a9de470cSBruce Richardson 			}
991a9de470cSBruce Richardson 	} else
992a9de470cSBruce Richardson 		rc = TEST_FAILED;
993a9de470cSBruce Richardson 
994a9de470cSBruce Richardson 	return rc;
995a9de470cSBruce Richardson }
996a9de470cSBruce Richardson 
997a9de470cSBruce Richardson static uint32_t
998a9de470cSBruce Richardson crypto_ipsec_4grp_check_cnt(uint32_t grp_ind, struct rte_ipsec_group *grp)
999a9de470cSBruce Richardson {
1000a9de470cSBruce Richardson 	uint32_t rc = 0;
1001a9de470cSBruce Richardson 
1002a9de470cSBruce Richardson 	if (grp_ind == 0) {
1003a9de470cSBruce Richardson 		if (grp[grp_ind].cnt != PKT_4)
1004a9de470cSBruce Richardson 			rc = TEST_FAILED;
1005a9de470cSBruce Richardson 	} else if (grp_ind == 1) {
1006a9de470cSBruce Richardson 		if (grp[grp_ind].cnt != PKT_12 - PKT_4)
1007a9de470cSBruce Richardson 			rc = TEST_FAILED;
1008a9de470cSBruce Richardson 	} else if (grp_ind == 2) {
1009a9de470cSBruce Richardson 		if (grp[grp_ind].cnt != PKT_21 - PKT_12)
1010a9de470cSBruce Richardson 			rc = TEST_FAILED;
1011a9de470cSBruce Richardson 	} else if (grp_ind == 3) {
1012a9de470cSBruce Richardson 		if (grp[grp_ind].cnt != BURST_SIZE - PKT_21)
1013a9de470cSBruce Richardson 			rc = TEST_FAILED;
1014a9de470cSBruce Richardson 	} else
1015a9de470cSBruce Richardson 		rc = TEST_FAILED;
1016a9de470cSBruce Richardson 
1017a9de470cSBruce Richardson 	return rc;
1018a9de470cSBruce Richardson }
1019a9de470cSBruce Richardson 
1020a9de470cSBruce Richardson static int
1021a9de470cSBruce Richardson crypto_ipsec_2sa_4grp(void)
1022a9de470cSBruce Richardson {
1023a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
1024a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1025a9de470cSBruce Richardson 	struct rte_ipsec_group grp[BURST_SIZE];
1026a9de470cSBruce Richardson 	uint32_t k, ng, i, j;
1027a9de470cSBruce Richardson 	uint32_t rc = 0;
1028a9de470cSBruce Richardson 
1029a9de470cSBruce Richardson 	for (i = 0; i < BURST_SIZE; i++) {
1030a9de470cSBruce Richardson 		j = crypto_ipsec_4grp(i);
1031a9de470cSBruce Richardson 
1032a9de470cSBruce Richardson 		/* call crypto prepare */
1033a9de470cSBruce Richardson 		k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[j],
1034a9de470cSBruce Richardson 				ut_params->ibuf + i, ut_params->cop + i, 1);
1035a9de470cSBruce Richardson 		if (k != 1) {
1036a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
1037a9de470cSBruce Richardson 				"rte_ipsec_pkt_crypto_prepare fail\n");
1038a9de470cSBruce Richardson 			return TEST_FAILED;
1039a9de470cSBruce Richardson 		}
1040a9de470cSBruce Richardson 		k = rte_cryptodev_enqueue_burst(ts_params->valid_dev, 0,
1041a9de470cSBruce Richardson 				ut_params->cop + i, 1);
1042a9de470cSBruce Richardson 		if (k != 1) {
1043a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
1044a9de470cSBruce Richardson 				"rte_cryptodev_enqueue_burst fail\n");
1045a9de470cSBruce Richardson 			return TEST_FAILED;
1046a9de470cSBruce Richardson 		}
1047a9de470cSBruce Richardson 	}
1048a9de470cSBruce Richardson 
10492cb4a0d4SBernard Iremonger 	if (crypto_dequeue_burst(BURST_SIZE) == TEST_FAILED)
1050a9de470cSBruce Richardson 		return TEST_FAILED;
1051a9de470cSBruce Richardson 
1052a9de470cSBruce Richardson 	ng = rte_ipsec_pkt_crypto_group(
1053a9de470cSBruce Richardson 		(const struct rte_crypto_op **)(uintptr_t)ut_params->cop,
1054a9de470cSBruce Richardson 		ut_params->obuf, grp, BURST_SIZE);
1055a9de470cSBruce Richardson 	if (ng != 4) {
1056a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail ng=%d\n",
1057a9de470cSBruce Richardson 			ng);
1058a9de470cSBruce Richardson 		return TEST_FAILED;
1059a9de470cSBruce Richardson 	}
1060a9de470cSBruce Richardson 
1061a9de470cSBruce Richardson 	/* call crypto process */
1062a9de470cSBruce Richardson 	for (i = 0; i < ng; i++) {
1063a9de470cSBruce Richardson 		k = rte_ipsec_pkt_process(grp[i].id.ptr, grp[i].m, grp[i].cnt);
1064a9de470cSBruce Richardson 		if (k != grp[i].cnt) {
10653feaf412SBernard Iremonger 			dump_grp_pkt(i, grp, k);
1066a9de470cSBruce Richardson 			return TEST_FAILED;
1067a9de470cSBruce Richardson 		}
1068a9de470cSBruce Richardson 		rc = crypto_ipsec_4grp_check_cnt(i, grp);
1069a9de470cSBruce Richardson 		if (rc != 0) {
1070a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
1071a9de470cSBruce Richardson 				"crypto_ipsec_4grp_check_cnt fail\n");
1072a9de470cSBruce Richardson 			return TEST_FAILED;
1073a9de470cSBruce Richardson 		}
1074a9de470cSBruce Richardson 		rc = crypto_ipsec_4grp_check_mbufs(i, grp);
1075a9de470cSBruce Richardson 		if (rc != 0) {
1076a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
1077a9de470cSBruce Richardson 				"crypto_ipsec_4grp_check_mbufs fail\n");
1078a9de470cSBruce Richardson 			return TEST_FAILED;
1079a9de470cSBruce Richardson 		}
1080a9de470cSBruce Richardson 	}
1081a9de470cSBruce Richardson 	return TEST_SUCCESS;
1082a9de470cSBruce Richardson }
1083a9de470cSBruce Richardson 
1084a9de470cSBruce Richardson static void
1085a9de470cSBruce Richardson test_ipsec_reorder_inb_pkt_burst(uint16_t num_pkts)
1086a9de470cSBruce Richardson {
1087a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1088a9de470cSBruce Richardson 	struct rte_mbuf *ibuf_tmp[BURST_SIZE];
1089a9de470cSBruce Richardson 	uint16_t j;
1090a9de470cSBruce Richardson 
1091a9de470cSBruce Richardson 	/* reorder packets and create gaps in sequence numbers */
1092a9de470cSBruce Richardson 	static const uint32_t reorder[BURST_SIZE] = {
1093a9de470cSBruce Richardson 			24, 25, 26, 27, 28, 29, 30, 31,
1094a9de470cSBruce Richardson 			16, 17, 18, 19, 20, 21, 22, 23,
1095a9de470cSBruce Richardson 			8, 9, 10, 11, 12, 13, 14, 15,
1096a9de470cSBruce Richardson 			0, 1, 2, 3, 4, 5, 6, 7,
1097a9de470cSBruce Richardson 	};
1098a9de470cSBruce Richardson 
1099a9de470cSBruce Richardson 	if (num_pkts != BURST_SIZE)
1100a9de470cSBruce Richardson 		return;
1101a9de470cSBruce Richardson 
1102a9de470cSBruce Richardson 	for (j = 0; j != BURST_SIZE; j++)
1103a9de470cSBruce Richardson 		ibuf_tmp[j] = ut_params->ibuf[reorder[j]];
1104a9de470cSBruce Richardson 
1105a9de470cSBruce Richardson 	memcpy(ut_params->ibuf, ibuf_tmp, sizeof(ut_params->ibuf));
1106a9de470cSBruce Richardson }
1107a9de470cSBruce Richardson 
1108a9de470cSBruce Richardson static int
1109a9de470cSBruce Richardson test_ipsec_crypto_op_alloc(uint16_t num_pkts)
1110a9de470cSBruce Richardson {
1111a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
1112a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1113a9de470cSBruce Richardson 	int rc = 0;
1114a9de470cSBruce Richardson 	uint16_t j;
1115a9de470cSBruce Richardson 
1116a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && rc == 0; j++) {
1117a9de470cSBruce Richardson 		ut_params->cop[j] = rte_crypto_op_alloc(ts_params->cop_mpool,
1118a9de470cSBruce Richardson 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1119a9de470cSBruce Richardson 		if (ut_params->cop[j] == NULL) {
1120a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
1121a9de470cSBruce Richardson 				"Failed to allocate symmetric crypto op\n");
1122a9de470cSBruce Richardson 			rc = TEST_FAILED;
1123a9de470cSBruce Richardson 		}
1124a9de470cSBruce Richardson 	}
1125a9de470cSBruce Richardson 
1126a9de470cSBruce Richardson 	return rc;
1127a9de470cSBruce Richardson }
1128a9de470cSBruce Richardson 
1129a9de470cSBruce Richardson static void
1130a9de470cSBruce Richardson test_ipsec_dump_buffers(struct ipsec_unitest_params *ut_params, int i)
1131a9de470cSBruce Richardson {
1132a9de470cSBruce Richardson 	uint16_t j = ut_params->pkt_index;
1133a9de470cSBruce Richardson 
1134a9de470cSBruce Richardson 	printf("\ntest config: num %d\n", i);
1135a9de470cSBruce Richardson 	printf("	replay_win_sz %u\n", test_cfg[i].replay_win_sz);
1136a9de470cSBruce Richardson 	printf("	esn %u\n", test_cfg[i].esn);
1137a9de470cSBruce Richardson 	printf("	flags 0x%" PRIx64 "\n", test_cfg[i].flags);
1138a9de470cSBruce Richardson 	printf("	pkt_sz %zu\n", test_cfg[i].pkt_sz);
1139a9de470cSBruce Richardson 	printf("	num_pkts %u\n\n", test_cfg[i].num_pkts);
1140a9de470cSBruce Richardson 
1141a9de470cSBruce Richardson 	if (ut_params->ibuf[j]) {
1142a9de470cSBruce Richardson 		printf("ibuf[%u] data:\n", j);
1143a9de470cSBruce Richardson 		rte_pktmbuf_dump(stdout, ut_params->ibuf[j],
1144a9de470cSBruce Richardson 			ut_params->ibuf[j]->data_len);
1145a9de470cSBruce Richardson 	}
1146a9de470cSBruce Richardson 	if (ut_params->obuf[j]) {
1147a9de470cSBruce Richardson 		printf("obuf[%u] data:\n", j);
1148a9de470cSBruce Richardson 		rte_pktmbuf_dump(stdout, ut_params->obuf[j],
1149a9de470cSBruce Richardson 			ut_params->obuf[j]->data_len);
1150a9de470cSBruce Richardson 	}
1151a9de470cSBruce Richardson 	if (ut_params->testbuf[j]) {
1152a9de470cSBruce Richardson 		printf("testbuf[%u] data:\n", j);
1153a9de470cSBruce Richardson 		rte_pktmbuf_dump(stdout, ut_params->testbuf[j],
1154a9de470cSBruce Richardson 			ut_params->testbuf[j]->data_len);
1155a9de470cSBruce Richardson 	}
1156a9de470cSBruce Richardson }
1157a9de470cSBruce Richardson 
1158a9de470cSBruce Richardson static void
115940a49a89SRuifeng Wang destroy_dummy_sec_session(struct ipsec_unitest_params *ut,
116040a49a89SRuifeng Wang 	uint32_t j)
116140a49a89SRuifeng Wang {
116240a49a89SRuifeng Wang 	rte_security_session_destroy(&dummy_sec_ctx,
116340a49a89SRuifeng Wang 					ut->ss[j].security.ses);
116440a49a89SRuifeng Wang 	ut->ss[j].security.ctx = NULL;
116540a49a89SRuifeng Wang }
116640a49a89SRuifeng Wang 
116740a49a89SRuifeng Wang static void
116840a49a89SRuifeng Wang destroy_crypto_session(struct ipsec_unitest_params *ut,
116940a49a89SRuifeng Wang 	uint8_t crypto_dev, uint32_t j)
117040a49a89SRuifeng Wang {
1171bdce2564SAkhil Goyal 	rte_cryptodev_sym_session_free(crypto_dev, ut->ss[j].crypto.ses);
117240a49a89SRuifeng Wang 	memset(&ut->ss[j], 0, sizeof(ut->ss[j]));
117340a49a89SRuifeng Wang }
117440a49a89SRuifeng Wang 
117540a49a89SRuifeng Wang static void
117640a49a89SRuifeng Wang destroy_session(struct ipsec_unitest_params *ut,
117740a49a89SRuifeng Wang 	uint8_t crypto_dev, uint32_t j)
117840a49a89SRuifeng Wang {
117940a49a89SRuifeng Wang 	if (ut->ss[j].type == RTE_SECURITY_ACTION_TYPE_NONE)
118040a49a89SRuifeng Wang 		return destroy_crypto_session(ut, crypto_dev, j);
118140a49a89SRuifeng Wang 	else
118240a49a89SRuifeng Wang 		return destroy_dummy_sec_session(ut, j);
118340a49a89SRuifeng Wang }
118440a49a89SRuifeng Wang 
118540a49a89SRuifeng Wang static void
1186a9de470cSBruce Richardson destroy_sa(uint32_t j)
1187a9de470cSBruce Richardson {
1188a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut = &unittest_params;
118900f846caSBernard Iremonger 	struct ipsec_testsuite_params *ts = &testsuite_params;
1190a9de470cSBruce Richardson 
1191a9de470cSBruce Richardson 	rte_ipsec_sa_fini(ut->ss[j].sa);
1192a9de470cSBruce Richardson 	rte_free(ut->ss[j].sa);
119340a49a89SRuifeng Wang 
119440a49a89SRuifeng Wang 	destroy_session(ut, ts->valid_dev, j);
1195a9de470cSBruce Richardson }
1196a9de470cSBruce Richardson 
1197a9de470cSBruce Richardson static int
1198a9de470cSBruce Richardson crypto_inb_burst_null_null_check(struct ipsec_unitest_params *ut_params, int i,
1199a9de470cSBruce Richardson 		uint16_t num_pkts)
1200a9de470cSBruce Richardson {
1201a9de470cSBruce Richardson 	uint16_t j;
1202a9de470cSBruce Richardson 
1203a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) {
1204a9de470cSBruce Richardson 		ut_params->pkt_index = j;
1205a9de470cSBruce Richardson 
1206a9de470cSBruce Richardson 		/* compare the data buffers */
1207a9de470cSBruce Richardson 		TEST_ASSERT_BUFFERS_ARE_EQUAL(null_plain_data,
1208a9de470cSBruce Richardson 			rte_pktmbuf_mtod(ut_params->obuf[j], void *),
1209a9de470cSBruce Richardson 			test_cfg[i].pkt_sz,
1210a9de470cSBruce Richardson 			"input and output data does not match\n");
1211a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
1212a9de470cSBruce Richardson 			ut_params->obuf[j]->pkt_len,
1213a9de470cSBruce Richardson 			"data_len is not equal to pkt_len");
1214a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
1215a9de470cSBruce Richardson 			test_cfg[i].pkt_sz,
1216a9de470cSBruce Richardson 			"data_len is not equal to input data");
1217a9de470cSBruce Richardson 	}
1218a9de470cSBruce Richardson 
1219a9de470cSBruce Richardson 	return 0;
1220a9de470cSBruce Richardson }
1221a9de470cSBruce Richardson 
1222a9de470cSBruce Richardson static int
1223a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_null_null(int i)
1224a9de470cSBruce Richardson {
1225a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
1226a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1227a9de470cSBruce Richardson 	uint16_t num_pkts = test_cfg[i].num_pkts;
1228a9de470cSBruce Richardson 	uint16_t j;
1229a9de470cSBruce Richardson 	int rc;
1230a9de470cSBruce Richardson 
1231a9de470cSBruce Richardson 	/* create rte_ipsec_sa */
1232a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
1233a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
1234a9de470cSBruce Richardson 	if (rc != 0) {
12359ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
12368dda080aSGagandeep Singh 		return rc;
1237a9de470cSBruce Richardson 	}
1238a9de470cSBruce Richardson 
1239a9de470cSBruce Richardson 	/* Generate test mbuf data */
1240a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && rc == 0; j++) {
1241a9de470cSBruce Richardson 		/* packet with sequence number 0 is invalid */
1242a9de470cSBruce Richardson 		ut_params->ibuf[j] = setup_test_string_tunneled(
1243a9de470cSBruce Richardson 			ts_params->mbuf_pool, null_encrypted_data,
1244a9de470cSBruce Richardson 			test_cfg[i].pkt_sz, INBOUND_SPI, j + 1);
1245a9de470cSBruce Richardson 		if (ut_params->ibuf[j] == NULL)
1246a9de470cSBruce Richardson 			rc = TEST_FAILED;
1247a9de470cSBruce Richardson 	}
1248a9de470cSBruce Richardson 
1249a9de470cSBruce Richardson 	if (rc == 0) {
1250a9de470cSBruce Richardson 		if (test_cfg[i].reorder_pkts)
1251a9de470cSBruce Richardson 			test_ipsec_reorder_inb_pkt_burst(num_pkts);
1252a9de470cSBruce Richardson 		rc = test_ipsec_crypto_op_alloc(num_pkts);
1253a9de470cSBruce Richardson 	}
1254a9de470cSBruce Richardson 
1255a9de470cSBruce Richardson 	if (rc == 0) {
1256a9de470cSBruce Richardson 		/* call ipsec library api */
1257a9de470cSBruce Richardson 		rc = crypto_ipsec(num_pkts);
1258a9de470cSBruce Richardson 		if (rc == 0)
1259a9de470cSBruce Richardson 			rc = crypto_inb_burst_null_null_check(
1260a9de470cSBruce Richardson 					ut_params, i, num_pkts);
1261a9de470cSBruce Richardson 		else {
1262a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
1263a9de470cSBruce Richardson 				i);
1264a9de470cSBruce Richardson 			rc = TEST_FAILED;
1265a9de470cSBruce Richardson 		}
1266a9de470cSBruce Richardson 	}
1267a9de470cSBruce Richardson 
1268a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
1269a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
1270a9de470cSBruce Richardson 
1271a9de470cSBruce Richardson 	destroy_sa(0);
1272a9de470cSBruce Richardson 	return rc;
1273a9de470cSBruce Richardson }
1274a9de470cSBruce Richardson 
1275a9de470cSBruce Richardson static int
1276a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_null_null_wrapper(void)
1277a9de470cSBruce Richardson {
1278a9de470cSBruce Richardson 	int i;
1279a9de470cSBruce Richardson 	int rc = 0;
1280a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1281a9de470cSBruce Richardson 
1282a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI;
1283a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
1284a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
1285a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
1286a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
1287a9de470cSBruce Richardson 
1288a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
1289a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
1290a9de470cSBruce Richardson 		rc = test_ipsec_crypto_inb_burst_null_null(i);
1291a9de470cSBruce Richardson 	}
1292a9de470cSBruce Richardson 
1293a9de470cSBruce Richardson 	return rc;
1294a9de470cSBruce Richardson }
1295a9de470cSBruce Richardson 
1296a9de470cSBruce Richardson static int
1297a9de470cSBruce Richardson crypto_outb_burst_null_null_check(struct ipsec_unitest_params *ut_params,
1298a9de470cSBruce Richardson 	uint16_t num_pkts)
1299a9de470cSBruce Richardson {
1300a9de470cSBruce Richardson 	void *obuf_data;
1301a9de470cSBruce Richardson 	void *testbuf_data;
1302a9de470cSBruce Richardson 	uint16_t j;
1303a9de470cSBruce Richardson 
1304a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) {
1305a9de470cSBruce Richardson 		ut_params->pkt_index = j;
1306a9de470cSBruce Richardson 
1307a9de470cSBruce Richardson 		testbuf_data = rte_pktmbuf_mtod(ut_params->testbuf[j], void *);
1308a9de470cSBruce Richardson 		obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *);
1309a9de470cSBruce Richardson 		/* compare the buffer data */
1310a9de470cSBruce Richardson 		TEST_ASSERT_BUFFERS_ARE_EQUAL(testbuf_data, obuf_data,
1311a9de470cSBruce Richardson 			ut_params->obuf[j]->pkt_len,
1312a9de470cSBruce Richardson 			"test and output data does not match\n");
1313a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
1314a9de470cSBruce Richardson 			ut_params->testbuf[j]->data_len,
1315a9de470cSBruce Richardson 			"obuf data_len is not equal to testbuf data_len");
1316a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->pkt_len,
1317a9de470cSBruce Richardson 			ut_params->testbuf[j]->pkt_len,
1318a9de470cSBruce Richardson 			"obuf pkt_len is not equal to testbuf pkt_len");
1319a9de470cSBruce Richardson 	}
1320a9de470cSBruce Richardson 
1321a9de470cSBruce Richardson 	return 0;
1322a9de470cSBruce Richardson }
1323a9de470cSBruce Richardson 
1324a9de470cSBruce Richardson static int
1325a9de470cSBruce Richardson test_ipsec_crypto_outb_burst_null_null(int i)
1326a9de470cSBruce Richardson {
1327a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
1328a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1329a9de470cSBruce Richardson 	uint16_t num_pkts = test_cfg[i].num_pkts;
1330a9de470cSBruce Richardson 	uint16_t j;
1331a9de470cSBruce Richardson 	int32_t rc;
1332a9de470cSBruce Richardson 
1333a9de470cSBruce Richardson 	/* create rte_ipsec_sa*/
1334a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
1335a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
1336a9de470cSBruce Richardson 	if (rc != 0) {
13379ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
13388dda080aSGagandeep Singh 		return rc;
1339a9de470cSBruce Richardson 	}
1340a9de470cSBruce Richardson 
1341a9de470cSBruce Richardson 	/* Generate input mbuf data */
1342a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && rc == 0; j++) {
1343a9de470cSBruce Richardson 		ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
13446e108b6aSDavid Marchand 			null_plain_data, sizeof(null_plain_data),
13456e108b6aSDavid Marchand 			test_cfg[i].pkt_sz, 0);
1346a9de470cSBruce Richardson 		if (ut_params->ibuf[j] == NULL)
1347a9de470cSBruce Richardson 			rc = TEST_FAILED;
1348a9de470cSBruce Richardson 		else {
1349a9de470cSBruce Richardson 			/* Generate test mbuf data */
1350a9de470cSBruce Richardson 			/* packet with sequence number 0 is invalid */
1351a9de470cSBruce Richardson 			ut_params->testbuf[j] = setup_test_string_tunneled(
1352a9de470cSBruce Richardson 					ts_params->mbuf_pool,
1353a9de470cSBruce Richardson 					null_plain_data, test_cfg[i].pkt_sz,
1354a9de470cSBruce Richardson 					OUTBOUND_SPI, j + 1);
1355a9de470cSBruce Richardson 			if (ut_params->testbuf[j] == NULL)
1356a9de470cSBruce Richardson 				rc = TEST_FAILED;
1357a9de470cSBruce Richardson 		}
1358a9de470cSBruce Richardson 	}
1359a9de470cSBruce Richardson 
1360a9de470cSBruce Richardson 	if (rc == 0)
1361a9de470cSBruce Richardson 		rc = test_ipsec_crypto_op_alloc(num_pkts);
1362a9de470cSBruce Richardson 
1363a9de470cSBruce Richardson 	if (rc == 0) {
1364a9de470cSBruce Richardson 		/* call ipsec library api */
1365a9de470cSBruce Richardson 		rc = crypto_ipsec(num_pkts);
1366a9de470cSBruce Richardson 		if (rc == 0)
1367a9de470cSBruce Richardson 			rc = crypto_outb_burst_null_null_check(ut_params,
1368a9de470cSBruce Richardson 					num_pkts);
1369a9de470cSBruce Richardson 		else
1370a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
1371a9de470cSBruce Richardson 				i);
1372a9de470cSBruce Richardson 	}
1373a9de470cSBruce Richardson 
1374a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
1375a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
1376a9de470cSBruce Richardson 
1377a9de470cSBruce Richardson 	destroy_sa(0);
1378a9de470cSBruce Richardson 	return rc;
1379a9de470cSBruce Richardson }
1380a9de470cSBruce Richardson 
1381a9de470cSBruce Richardson static int
1382a9de470cSBruce Richardson test_ipsec_crypto_outb_burst_null_null_wrapper(void)
1383a9de470cSBruce Richardson {
1384a9de470cSBruce Richardson 	int i;
1385a9de470cSBruce Richardson 	int rc = 0;
1386a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1387a9de470cSBruce Richardson 
1388a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = OUTBOUND_SPI;
1389a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
1390a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
1391a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
1392a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
1393a9de470cSBruce Richardson 
1394a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
1395a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
1396a9de470cSBruce Richardson 		rc = test_ipsec_crypto_outb_burst_null_null(i);
1397a9de470cSBruce Richardson 	}
1398a9de470cSBruce Richardson 
1399a9de470cSBruce Richardson 	return rc;
1400a9de470cSBruce Richardson }
1401a9de470cSBruce Richardson 
1402a9de470cSBruce Richardson static int
1403a9de470cSBruce Richardson inline_inb_burst_null_null_check(struct ipsec_unitest_params *ut_params, int i,
1404a9de470cSBruce Richardson 	uint16_t num_pkts)
1405a9de470cSBruce Richardson {
1406a9de470cSBruce Richardson 	void *ibuf_data;
1407a9de470cSBruce Richardson 	void *obuf_data;
1408a9de470cSBruce Richardson 	uint16_t j;
1409a9de470cSBruce Richardson 
1410a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) {
1411a9de470cSBruce Richardson 		ut_params->pkt_index = j;
1412a9de470cSBruce Richardson 
1413a9de470cSBruce Richardson 		/* compare the buffer data */
1414a9de470cSBruce Richardson 		ibuf_data = rte_pktmbuf_mtod(ut_params->ibuf[j], void *);
1415a9de470cSBruce Richardson 		obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *);
1416a9de470cSBruce Richardson 
1417a9de470cSBruce Richardson 		TEST_ASSERT_BUFFERS_ARE_EQUAL(ibuf_data, obuf_data,
1418a9de470cSBruce Richardson 			ut_params->ibuf[j]->data_len,
1419a9de470cSBruce Richardson 			"input and output data does not match\n");
1420a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->ibuf[j]->data_len,
1421a9de470cSBruce Richardson 			ut_params->obuf[j]->data_len,
1422a9de470cSBruce Richardson 			"ibuf data_len is not equal to obuf data_len");
1423a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->ibuf[j]->pkt_len,
1424a9de470cSBruce Richardson 			ut_params->obuf[j]->pkt_len,
1425a9de470cSBruce Richardson 			"ibuf pkt_len is not equal to obuf pkt_len");
1426a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->ibuf[j]->data_len,
1427a9de470cSBruce Richardson 			test_cfg[i].pkt_sz,
1428a9de470cSBruce Richardson 			"data_len is not equal input data");
1429a9de470cSBruce Richardson 	}
1430a9de470cSBruce Richardson 	return 0;
1431a9de470cSBruce Richardson }
1432a9de470cSBruce Richardson 
1433a9de470cSBruce Richardson static int
1434a9de470cSBruce Richardson test_ipsec_inline_crypto_inb_burst_null_null(int i)
1435a9de470cSBruce Richardson {
1436a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
1437a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1438a9de470cSBruce Richardson 	uint16_t num_pkts = test_cfg[i].num_pkts;
1439a9de470cSBruce Richardson 	uint16_t j;
1440a9de470cSBruce Richardson 	int32_t rc;
1441a9de470cSBruce Richardson 	uint32_t n;
1442a9de470cSBruce Richardson 
1443a9de470cSBruce Richardson 	/* create rte_ipsec_sa*/
1444a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO,
1445a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
1446a9de470cSBruce Richardson 	if (rc != 0) {
14479ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
14488dda080aSGagandeep Singh 		return rc;
1449a9de470cSBruce Richardson 	}
1450a9de470cSBruce Richardson 
1451a9de470cSBruce Richardson 	/* Generate inbound mbuf data */
1452a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && rc == 0; j++) {
1453a9de470cSBruce Richardson 		ut_params->ibuf[j] = setup_test_string_tunneled(
1454a9de470cSBruce Richardson 			ts_params->mbuf_pool,
1455a9de470cSBruce Richardson 			null_plain_data, test_cfg[i].pkt_sz,
1456a9de470cSBruce Richardson 			INBOUND_SPI, j + 1);
1457a9de470cSBruce Richardson 		if (ut_params->ibuf[j] == NULL)
1458a9de470cSBruce Richardson 			rc = TEST_FAILED;
1459a9de470cSBruce Richardson 		else {
1460a9de470cSBruce Richardson 			/* Generate test mbuf data */
1461a9de470cSBruce Richardson 			ut_params->obuf[j] = setup_test_string(
1462a9de470cSBruce Richardson 				ts_params->mbuf_pool,
14636e108b6aSDavid Marchand 				null_plain_data, sizeof(null_plain_data),
14646e108b6aSDavid Marchand 				test_cfg[i].pkt_sz, 0);
1465a9de470cSBruce Richardson 			if (ut_params->obuf[j] == NULL)
1466a9de470cSBruce Richardson 				rc = TEST_FAILED;
1467a9de470cSBruce Richardson 		}
1468a9de470cSBruce Richardson 	}
1469a9de470cSBruce Richardson 
1470a9de470cSBruce Richardson 	if (rc == 0) {
1471a9de470cSBruce Richardson 		n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf,
1472a9de470cSBruce Richardson 				num_pkts);
1473a9de470cSBruce Richardson 		if (n == num_pkts)
1474a9de470cSBruce Richardson 			rc = inline_inb_burst_null_null_check(ut_params, i,
1475a9de470cSBruce Richardson 					num_pkts);
1476a9de470cSBruce Richardson 		else {
1477a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
1478a9de470cSBruce Richardson 				"rte_ipsec_pkt_process failed, cfg %d\n",
1479a9de470cSBruce Richardson 				i);
1480a9de470cSBruce Richardson 			rc = TEST_FAILED;
1481a9de470cSBruce Richardson 		}
1482a9de470cSBruce Richardson 	}
1483a9de470cSBruce Richardson 
1484a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
1485a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
1486a9de470cSBruce Richardson 
1487a9de470cSBruce Richardson 	destroy_sa(0);
1488a9de470cSBruce Richardson 	return rc;
1489a9de470cSBruce Richardson }
1490a9de470cSBruce Richardson 
1491a9de470cSBruce Richardson static int
1492a9de470cSBruce Richardson test_ipsec_inline_crypto_inb_burst_null_null_wrapper(void)
1493a9de470cSBruce Richardson {
1494a9de470cSBruce Richardson 	int i;
1495a9de470cSBruce Richardson 	int rc = 0;
1496a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1497a9de470cSBruce Richardson 
1498a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI;
1499a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
1500a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
1501a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
1502a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
1503a9de470cSBruce Richardson 
1504a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
1505a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
1506a9de470cSBruce Richardson 		rc = test_ipsec_inline_crypto_inb_burst_null_null(i);
1507a9de470cSBruce Richardson 	}
1508a9de470cSBruce Richardson 
1509a9de470cSBruce Richardson 	return rc;
1510a9de470cSBruce Richardson }
1511a9de470cSBruce Richardson 
1512a9de470cSBruce Richardson static int
1513a9de470cSBruce Richardson test_ipsec_inline_proto_inb_burst_null_null(int i)
1514a9de470cSBruce Richardson {
1515a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
1516a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1517a9de470cSBruce Richardson 	uint16_t num_pkts = test_cfg[i].num_pkts;
1518a9de470cSBruce Richardson 	uint16_t j;
1519a9de470cSBruce Richardson 	int32_t rc;
1520a9de470cSBruce Richardson 	uint32_t n;
1521a9de470cSBruce Richardson 
1522a9de470cSBruce Richardson 	/* create rte_ipsec_sa*/
1523a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL,
1524a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
1525a9de470cSBruce Richardson 	if (rc != 0) {
15269ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
15278dda080aSGagandeep Singh 		return rc;
1528a9de470cSBruce Richardson 	}
1529a9de470cSBruce Richardson 
1530a9de470cSBruce Richardson 	/* Generate inbound mbuf data */
1531a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && rc == 0; j++) {
15326e108b6aSDavid Marchand 		ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
15336e108b6aSDavid Marchand 			null_plain_data, sizeof(null_plain_data),
15346e108b6aSDavid Marchand 			test_cfg[i].pkt_sz, 0);
1535a9de470cSBruce Richardson 		if (ut_params->ibuf[j] == NULL)
1536a9de470cSBruce Richardson 			rc = TEST_FAILED;
1537a9de470cSBruce Richardson 		else {
1538a9de470cSBruce Richardson 			/* Generate test mbuf data */
1539a9de470cSBruce Richardson 			ut_params->obuf[j] = setup_test_string(
1540a9de470cSBruce Richardson 				ts_params->mbuf_pool,
15416e108b6aSDavid Marchand 				null_plain_data, sizeof(null_plain_data),
15426e108b6aSDavid Marchand 				test_cfg[i].pkt_sz, 0);
1543a9de470cSBruce Richardson 			if (ut_params->obuf[j] == NULL)
1544a9de470cSBruce Richardson 				rc = TEST_FAILED;
1545a9de470cSBruce Richardson 		}
1546a9de470cSBruce Richardson 	}
1547a9de470cSBruce Richardson 
1548a9de470cSBruce Richardson 	if (rc == 0) {
1549a9de470cSBruce Richardson 		n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf,
1550a9de470cSBruce Richardson 				num_pkts);
1551a9de470cSBruce Richardson 		if (n == num_pkts)
1552a9de470cSBruce Richardson 			rc = inline_inb_burst_null_null_check(ut_params, i,
1553a9de470cSBruce Richardson 					num_pkts);
1554a9de470cSBruce Richardson 		else {
1555a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
1556a9de470cSBruce Richardson 				"rte_ipsec_pkt_process failed, cfg %d\n",
1557a9de470cSBruce Richardson 				i);
1558a9de470cSBruce Richardson 			rc = TEST_FAILED;
1559a9de470cSBruce Richardson 		}
1560a9de470cSBruce Richardson 	}
1561a9de470cSBruce Richardson 
1562a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
1563a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
1564a9de470cSBruce Richardson 
1565a9de470cSBruce Richardson 	destroy_sa(0);
1566a9de470cSBruce Richardson 	return rc;
1567a9de470cSBruce Richardson }
1568a9de470cSBruce Richardson 
1569a9de470cSBruce Richardson static int
1570a9de470cSBruce Richardson test_ipsec_inline_proto_inb_burst_null_null_wrapper(void)
1571a9de470cSBruce Richardson {
1572a9de470cSBruce Richardson 	int i;
1573a9de470cSBruce Richardson 	int rc = 0;
1574a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1575a9de470cSBruce Richardson 
1576a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI;
1577a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
1578a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
1579a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
1580a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
1581a9de470cSBruce Richardson 
1582a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
1583a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
1584a9de470cSBruce Richardson 		rc = test_ipsec_inline_proto_inb_burst_null_null(i);
1585a9de470cSBruce Richardson 	}
1586a9de470cSBruce Richardson 
1587a9de470cSBruce Richardson 	return rc;
1588a9de470cSBruce Richardson }
1589a9de470cSBruce Richardson 
1590a9de470cSBruce Richardson static int
1591a9de470cSBruce Richardson inline_outb_burst_null_null_check(struct ipsec_unitest_params *ut_params,
1592a9de470cSBruce Richardson 	uint16_t num_pkts)
1593a9de470cSBruce Richardson {
1594a9de470cSBruce Richardson 	void *obuf_data;
1595a9de470cSBruce Richardson 	void *ibuf_data;
1596a9de470cSBruce Richardson 	uint16_t j;
1597a9de470cSBruce Richardson 
1598a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) {
1599a9de470cSBruce Richardson 		ut_params->pkt_index = j;
1600a9de470cSBruce Richardson 
1601a9de470cSBruce Richardson 		/* compare the buffer data */
1602a9de470cSBruce Richardson 		ibuf_data = rte_pktmbuf_mtod(ut_params->ibuf[j], void *);
1603a9de470cSBruce Richardson 		obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *);
1604a9de470cSBruce Richardson 		TEST_ASSERT_BUFFERS_ARE_EQUAL(ibuf_data, obuf_data,
1605a9de470cSBruce Richardson 			ut_params->ibuf[j]->data_len,
1606a9de470cSBruce Richardson 			"input and output data does not match\n");
1607a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->ibuf[j]->data_len,
1608a9de470cSBruce Richardson 			ut_params->obuf[j]->data_len,
1609a9de470cSBruce Richardson 			"ibuf data_len is not equal to obuf data_len");
1610a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->ibuf[j]->pkt_len,
1611a9de470cSBruce Richardson 			ut_params->obuf[j]->pkt_len,
1612a9de470cSBruce Richardson 			"ibuf pkt_len is not equal to obuf pkt_len");
1613a9de470cSBruce Richardson 
1614a9de470cSBruce Richardson 		/* check mbuf ol_flags */
1615daa02b5cSOlivier Matz 		TEST_ASSERT(ut_params->ibuf[j]->ol_flags & RTE_MBUF_F_TX_SEC_OFFLOAD,
1616daa02b5cSOlivier Matz 			    "ibuf RTE_MBUF_F_TX_SEC_OFFLOAD is not set");
1617a9de470cSBruce Richardson 	}
1618a9de470cSBruce Richardson 	return 0;
1619a9de470cSBruce Richardson }
1620a9de470cSBruce Richardson 
1621a9de470cSBruce Richardson static int
1622a9de470cSBruce Richardson test_ipsec_inline_crypto_outb_burst_null_null(int i)
1623a9de470cSBruce Richardson {
1624a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
1625a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1626a9de470cSBruce Richardson 	uint16_t num_pkts = test_cfg[i].num_pkts;
1627a9de470cSBruce Richardson 	uint16_t j;
1628a9de470cSBruce Richardson 	int32_t rc;
1629a9de470cSBruce Richardson 	uint32_t n;
1630a9de470cSBruce Richardson 
1631a9de470cSBruce Richardson 	/* create rte_ipsec_sa */
1632a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO,
1633a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
1634a9de470cSBruce Richardson 	if (rc != 0) {
16359ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
16368dda080aSGagandeep Singh 		return rc;
1637a9de470cSBruce Richardson 	}
1638a9de470cSBruce Richardson 
1639a9de470cSBruce Richardson 	/* Generate test mbuf data */
1640a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && rc == 0; j++) {
1641a9de470cSBruce Richardson 		ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
16426e108b6aSDavid Marchand 			null_plain_data, sizeof(null_plain_data),
16436e108b6aSDavid Marchand 			test_cfg[i].pkt_sz, 0);
1644a9de470cSBruce Richardson 		if (ut_params->ibuf[0] == NULL)
1645a9de470cSBruce Richardson 			rc = TEST_FAILED;
1646a9de470cSBruce Richardson 
1647a9de470cSBruce Richardson 		if (rc == 0) {
1648a9de470cSBruce Richardson 			/* Generate test tunneled mbuf data for comparison */
1649a9de470cSBruce Richardson 			ut_params->obuf[j] = setup_test_string_tunneled(
1650a9de470cSBruce Richardson 					ts_params->mbuf_pool,
1651a9de470cSBruce Richardson 					null_plain_data, test_cfg[i].pkt_sz,
1652a9de470cSBruce Richardson 					OUTBOUND_SPI, j + 1);
1653a9de470cSBruce Richardson 			if (ut_params->obuf[j] == NULL)
1654a9de470cSBruce Richardson 				rc = TEST_FAILED;
1655a9de470cSBruce Richardson 		}
1656a9de470cSBruce Richardson 	}
1657a9de470cSBruce Richardson 
1658a9de470cSBruce Richardson 	if (rc == 0) {
1659a9de470cSBruce Richardson 		n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf,
1660a9de470cSBruce Richardson 				num_pkts);
1661a9de470cSBruce Richardson 		if (n == num_pkts)
1662a9de470cSBruce Richardson 			rc = inline_outb_burst_null_null_check(ut_params,
1663a9de470cSBruce Richardson 					num_pkts);
1664a9de470cSBruce Richardson 		else {
1665a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
1666a9de470cSBruce Richardson 				"rte_ipsec_pkt_process failed, cfg %d\n",
1667a9de470cSBruce Richardson 				i);
1668a9de470cSBruce Richardson 			rc = TEST_FAILED;
1669a9de470cSBruce Richardson 		}
1670a9de470cSBruce Richardson 	}
1671a9de470cSBruce Richardson 
1672a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
1673a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
1674a9de470cSBruce Richardson 
1675a9de470cSBruce Richardson 	destroy_sa(0);
1676a9de470cSBruce Richardson 	return rc;
1677a9de470cSBruce Richardson }
1678a9de470cSBruce Richardson 
1679a9de470cSBruce Richardson static int
1680a9de470cSBruce Richardson test_ipsec_inline_crypto_outb_burst_null_null_wrapper(void)
1681a9de470cSBruce Richardson {
1682a9de470cSBruce Richardson 	int i;
1683a9de470cSBruce Richardson 	int rc = 0;
1684a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1685a9de470cSBruce Richardson 
1686a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = OUTBOUND_SPI;
1687a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
1688a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
1689a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
1690a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
1691a9de470cSBruce Richardson 
1692a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
1693a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
1694a9de470cSBruce Richardson 		rc = test_ipsec_inline_crypto_outb_burst_null_null(i);
1695a9de470cSBruce Richardson 	}
1696a9de470cSBruce Richardson 
1697a9de470cSBruce Richardson 	return rc;
1698a9de470cSBruce Richardson }
1699a9de470cSBruce Richardson 
1700a9de470cSBruce Richardson static int
1701a9de470cSBruce Richardson test_ipsec_inline_proto_outb_burst_null_null(int i)
1702a9de470cSBruce Richardson {
1703a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
1704a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1705a9de470cSBruce Richardson 	uint16_t num_pkts = test_cfg[i].num_pkts;
1706a9de470cSBruce Richardson 	uint16_t j;
1707a9de470cSBruce Richardson 	int32_t rc;
1708a9de470cSBruce Richardson 	uint32_t n;
1709a9de470cSBruce Richardson 
1710a9de470cSBruce Richardson 	/* create rte_ipsec_sa */
1711a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL,
1712a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
1713a9de470cSBruce Richardson 	if (rc != 0) {
17149ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
17158dda080aSGagandeep Singh 		return rc;
1716a9de470cSBruce Richardson 	}
1717a9de470cSBruce Richardson 
1718a9de470cSBruce Richardson 	/* Generate test mbuf data */
1719a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && rc == 0; j++) {
1720a9de470cSBruce Richardson 		ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
17216e108b6aSDavid Marchand 			null_plain_data, sizeof(null_plain_data),
17226e108b6aSDavid Marchand 			test_cfg[i].pkt_sz, 0);
1723a9de470cSBruce Richardson 		if (ut_params->ibuf[0] == NULL)
1724a9de470cSBruce Richardson 			rc = TEST_FAILED;
1725a9de470cSBruce Richardson 
1726a9de470cSBruce Richardson 		if (rc == 0) {
1727a9de470cSBruce Richardson 			/* Generate test tunneled mbuf data for comparison */
1728a9de470cSBruce Richardson 			ut_params->obuf[j] = setup_test_string(
17296e108b6aSDavid Marchand 				ts_params->mbuf_pool, null_plain_data,
17306e108b6aSDavid Marchand 				sizeof(null_plain_data), test_cfg[i].pkt_sz,
17316e108b6aSDavid Marchand 				0);
1732a9de470cSBruce Richardson 			if (ut_params->obuf[j] == NULL)
1733a9de470cSBruce Richardson 				rc = TEST_FAILED;
1734a9de470cSBruce Richardson 		}
1735a9de470cSBruce Richardson 	}
1736a9de470cSBruce Richardson 
1737a9de470cSBruce Richardson 	if (rc == 0) {
1738a9de470cSBruce Richardson 		n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf,
1739a9de470cSBruce Richardson 				num_pkts);
1740a9de470cSBruce Richardson 		if (n == num_pkts)
1741a9de470cSBruce Richardson 			rc = inline_outb_burst_null_null_check(ut_params,
1742a9de470cSBruce Richardson 					num_pkts);
1743a9de470cSBruce Richardson 		else {
1744a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
1745a9de470cSBruce Richardson 				"rte_ipsec_pkt_process failed, cfg %d\n",
1746a9de470cSBruce Richardson 				i);
1747a9de470cSBruce Richardson 			rc = TEST_FAILED;
1748a9de470cSBruce Richardson 		}
1749a9de470cSBruce Richardson 	}
1750a9de470cSBruce Richardson 
1751a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
1752a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
1753a9de470cSBruce Richardson 
1754a9de470cSBruce Richardson 	destroy_sa(0);
1755a9de470cSBruce Richardson 	return rc;
1756a9de470cSBruce Richardson }
1757a9de470cSBruce Richardson 
1758a9de470cSBruce Richardson static int
1759a9de470cSBruce Richardson test_ipsec_inline_proto_outb_burst_null_null_wrapper(void)
1760a9de470cSBruce Richardson {
1761a9de470cSBruce Richardson 	int i;
1762a9de470cSBruce Richardson 	int rc = 0;
1763a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1764a9de470cSBruce Richardson 
1765a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = OUTBOUND_SPI;
1766a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
1767a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
1768a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
1769a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
1770a9de470cSBruce Richardson 
1771a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
1772a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
1773a9de470cSBruce Richardson 		rc = test_ipsec_inline_proto_outb_burst_null_null(i);
1774a9de470cSBruce Richardson 	}
1775a9de470cSBruce Richardson 
1776a9de470cSBruce Richardson 	return rc;
1777a9de470cSBruce Richardson }
1778a9de470cSBruce Richardson 
1779a9de470cSBruce Richardson static int
1780a9de470cSBruce Richardson test_ipsec_lksd_proto_inb_burst_null_null(int i)
1781a9de470cSBruce Richardson {
1782a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
1783a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1784a9de470cSBruce Richardson 	uint16_t num_pkts = test_cfg[i].num_pkts;
1785a9de470cSBruce Richardson 	uint16_t j;
1786a9de470cSBruce Richardson 	int rc;
1787a9de470cSBruce Richardson 
1788a9de470cSBruce Richardson 	/* create rte_ipsec_sa */
1789a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
1790a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
1791a9de470cSBruce Richardson 	if (rc != 0) {
17929ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
17938dda080aSGagandeep Singh 		return rc;
1794a9de470cSBruce Richardson 	}
1795a9de470cSBruce Richardson 
1796a9de470cSBruce Richardson 	/* Generate test mbuf data */
1797a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && rc == 0; j++) {
1798a9de470cSBruce Richardson 		/* packet with sequence number 0 is invalid */
1799a9de470cSBruce Richardson 		ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
18006e108b6aSDavid Marchand 			null_encrypted_data, sizeof(null_encrypted_data),
18016e108b6aSDavid Marchand 			test_cfg[i].pkt_sz, 0);
1802a9de470cSBruce Richardson 		if (ut_params->ibuf[j] == NULL)
1803a9de470cSBruce Richardson 			rc = TEST_FAILED;
1804a9de470cSBruce Richardson 	}
1805a9de470cSBruce Richardson 
1806a9de470cSBruce Richardson 	if (rc == 0) {
1807a9de470cSBruce Richardson 		if (test_cfg[i].reorder_pkts)
1808a9de470cSBruce Richardson 			test_ipsec_reorder_inb_pkt_burst(num_pkts);
1809a9de470cSBruce Richardson 		rc = test_ipsec_crypto_op_alloc(num_pkts);
1810a9de470cSBruce Richardson 	}
1811a9de470cSBruce Richardson 
1812a9de470cSBruce Richardson 	if (rc == 0) {
1813a9de470cSBruce Richardson 		/* call ipsec library api */
1814a9de470cSBruce Richardson 		rc = lksd_proto_ipsec(num_pkts);
1815a9de470cSBruce Richardson 		if (rc == 0)
1816a9de470cSBruce Richardson 			rc = crypto_inb_burst_null_null_check(ut_params, i,
1817a9de470cSBruce Richardson 					num_pkts);
1818a9de470cSBruce Richardson 		else {
1819a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "%s failed, cfg %d\n",
1820a9de470cSBruce Richardson 				__func__, i);
1821a9de470cSBruce Richardson 			rc = TEST_FAILED;
1822a9de470cSBruce Richardson 		}
1823a9de470cSBruce Richardson 	}
1824a9de470cSBruce Richardson 
1825a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
1826a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
1827a9de470cSBruce Richardson 
1828a9de470cSBruce Richardson 	destroy_sa(0);
1829a9de470cSBruce Richardson 	return rc;
1830a9de470cSBruce Richardson }
1831a9de470cSBruce Richardson 
1832a9de470cSBruce Richardson static int
1833a9de470cSBruce Richardson test_ipsec_lksd_proto_inb_burst_null_null_wrapper(void)
1834a9de470cSBruce Richardson {
1835a9de470cSBruce Richardson 	int i;
1836a9de470cSBruce Richardson 	int rc = 0;
1837a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1838a9de470cSBruce Richardson 
1839a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI;
1840a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
1841a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
1842a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
1843a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
1844a9de470cSBruce Richardson 
1845a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
1846a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
1847a9de470cSBruce Richardson 		rc = test_ipsec_lksd_proto_inb_burst_null_null(i);
1848a9de470cSBruce Richardson 	}
1849a9de470cSBruce Richardson 
1850a9de470cSBruce Richardson 	return rc;
1851a9de470cSBruce Richardson }
1852a9de470cSBruce Richardson 
1853a9de470cSBruce Richardson static int
1854a9de470cSBruce Richardson test_ipsec_lksd_proto_outb_burst_null_null_wrapper(void)
1855a9de470cSBruce Richardson {
1856a9de470cSBruce Richardson 	int i;
1857a9de470cSBruce Richardson 	int rc = 0;
1858a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1859a9de470cSBruce Richardson 
1860a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI;
1861a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
1862a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
1863a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
1864a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
1865a9de470cSBruce Richardson 
1866a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
1867a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
1868a9de470cSBruce Richardson 		rc = test_ipsec_lksd_proto_inb_burst_null_null(i);
1869a9de470cSBruce Richardson 	}
1870a9de470cSBruce Richardson 
1871a9de470cSBruce Richardson 	return rc;
1872a9de470cSBruce Richardson }
1873a9de470cSBruce Richardson 
1874a9de470cSBruce Richardson static int
1875a9de470cSBruce Richardson replay_inb_null_null_check(struct ipsec_unitest_params *ut_params, int i,
1876a9de470cSBruce Richardson 	int num_pkts)
1877a9de470cSBruce Richardson {
1878a9de470cSBruce Richardson 	uint16_t j;
1879a9de470cSBruce Richardson 
1880a9de470cSBruce Richardson 	for (j = 0; j < num_pkts; j++) {
1881a9de470cSBruce Richardson 		/* compare the buffer data */
1882a9de470cSBruce Richardson 		TEST_ASSERT_BUFFERS_ARE_EQUAL(null_plain_data,
1883a9de470cSBruce Richardson 			rte_pktmbuf_mtod(ut_params->obuf[j], void *),
1884a9de470cSBruce Richardson 			test_cfg[i].pkt_sz,
1885a9de470cSBruce Richardson 			"input and output data does not match\n");
1886a9de470cSBruce Richardson 
1887a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
1888a9de470cSBruce Richardson 			ut_params->obuf[j]->pkt_len,
1889a9de470cSBruce Richardson 			"data_len is not equal to pkt_len");
1890a9de470cSBruce Richardson 	}
1891a9de470cSBruce Richardson 
1892a9de470cSBruce Richardson 	return 0;
1893a9de470cSBruce Richardson }
1894a9de470cSBruce Richardson 
1895a9de470cSBruce Richardson static int
1896a9de470cSBruce Richardson test_ipsec_replay_inb_inside_null_null(int i)
1897a9de470cSBruce Richardson {
1898a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
1899a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1900a9de470cSBruce Richardson 	int rc;
1901a9de470cSBruce Richardson 
1902a9de470cSBruce Richardson 	/* create rte_ipsec_sa*/
1903a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
1904a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
1905a9de470cSBruce Richardson 	if (rc != 0) {
19069ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
19078dda080aSGagandeep Singh 		return rc;
1908a9de470cSBruce Richardson 	}
1909a9de470cSBruce Richardson 
1910a9de470cSBruce Richardson 	/* Generate inbound mbuf data */
1911a9de470cSBruce Richardson 	ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool,
1912a9de470cSBruce Richardson 		null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1);
1913a9de470cSBruce Richardson 	if (ut_params->ibuf[0] == NULL)
1914a9de470cSBruce Richardson 		rc = TEST_FAILED;
1915a9de470cSBruce Richardson 	else
1916a9de470cSBruce Richardson 		rc = test_ipsec_crypto_op_alloc(1);
1917a9de470cSBruce Richardson 
1918a9de470cSBruce Richardson 	if (rc == 0) {
1919a9de470cSBruce Richardson 		/* call ipsec library api */
1920a9de470cSBruce Richardson 		rc = crypto_ipsec(1);
1921a9de470cSBruce Richardson 		if (rc == 0)
1922a9de470cSBruce Richardson 			rc = replay_inb_null_null_check(ut_params, i, 1);
1923a9de470cSBruce Richardson 		else {
1924a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
1925a9de470cSBruce Richardson 					i);
1926a9de470cSBruce Richardson 			rc = TEST_FAILED;
1927a9de470cSBruce Richardson 		}
1928a9de470cSBruce Richardson 	}
1929a9de470cSBruce Richardson 
1930a9de470cSBruce Richardson 	if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) {
1931a9de470cSBruce Richardson 		/* generate packet with seq number inside the replay window */
1932a9de470cSBruce Richardson 		if (ut_params->ibuf[0]) {
1933a9de470cSBruce Richardson 			rte_pktmbuf_free(ut_params->ibuf[0]);
1934a9de470cSBruce Richardson 			ut_params->ibuf[0] = 0;
1935a9de470cSBruce Richardson 		}
1936a9de470cSBruce Richardson 
1937a9de470cSBruce Richardson 		ut_params->ibuf[0] = setup_test_string_tunneled(
1938a9de470cSBruce Richardson 			ts_params->mbuf_pool, null_encrypted_data,
1939a9de470cSBruce Richardson 			test_cfg[i].pkt_sz, INBOUND_SPI,
1940a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz);
1941a9de470cSBruce Richardson 		if (ut_params->ibuf[0] == NULL)
1942a9de470cSBruce Richardson 			rc = TEST_FAILED;
1943a9de470cSBruce Richardson 		else
1944a9de470cSBruce Richardson 			rc = test_ipsec_crypto_op_alloc(1);
1945a9de470cSBruce Richardson 
1946a9de470cSBruce Richardson 		if (rc == 0) {
1947a9de470cSBruce Richardson 			/* call ipsec library api */
1948a9de470cSBruce Richardson 			rc = crypto_ipsec(1);
1949a9de470cSBruce Richardson 			if (rc == 0)
1950a9de470cSBruce Richardson 				rc = replay_inb_null_null_check(
1951a9de470cSBruce Richardson 						ut_params, i, 1);
1952a9de470cSBruce Richardson 			else {
1953a9de470cSBruce Richardson 				RTE_LOG(ERR, USER1, "crypto_ipsec failed\n");
1954a9de470cSBruce Richardson 				rc = TEST_FAILED;
1955a9de470cSBruce Richardson 			}
1956a9de470cSBruce Richardson 		}
1957a9de470cSBruce Richardson 	}
1958a9de470cSBruce Richardson 
1959a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
1960a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
1961a9de470cSBruce Richardson 
1962a9de470cSBruce Richardson 	destroy_sa(0);
1963a9de470cSBruce Richardson 
1964a9de470cSBruce Richardson 	return rc;
1965a9de470cSBruce Richardson }
1966a9de470cSBruce Richardson 
1967a9de470cSBruce Richardson static int
1968a9de470cSBruce Richardson test_ipsec_replay_inb_inside_null_null_wrapper(void)
1969a9de470cSBruce Richardson {
1970a9de470cSBruce Richardson 	int i;
1971a9de470cSBruce Richardson 	int rc = 0;
1972a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1973a9de470cSBruce Richardson 
1974a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI;
1975a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
1976a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
1977a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
1978a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
1979a9de470cSBruce Richardson 
1980a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
1981a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
1982a9de470cSBruce Richardson 		rc = test_ipsec_replay_inb_inside_null_null(i);
1983a9de470cSBruce Richardson 	}
1984a9de470cSBruce Richardson 
1985a9de470cSBruce Richardson 	return rc;
1986a9de470cSBruce Richardson }
1987a9de470cSBruce Richardson 
1988a9de470cSBruce Richardson static int
1989a9de470cSBruce Richardson test_ipsec_replay_inb_outside_null_null(int i)
1990a9de470cSBruce Richardson {
1991a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
1992a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
1993a9de470cSBruce Richardson 	int rc;
1994a9de470cSBruce Richardson 
1995a9de470cSBruce Richardson 	/* create rte_ipsec_sa */
1996a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
1997a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
1998a9de470cSBruce Richardson 	if (rc != 0) {
19999ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
20008dda080aSGagandeep Singh 		return rc;
2001a9de470cSBruce Richardson 	}
2002a9de470cSBruce Richardson 
2003a9de470cSBruce Richardson 	/* Generate test mbuf data */
2004a9de470cSBruce Richardson 	ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool,
2005a9de470cSBruce Richardson 		null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI,
2006a9de470cSBruce Richardson 		test_cfg[i].replay_win_sz + 2);
2007a9de470cSBruce Richardson 	if (ut_params->ibuf[0] == NULL)
2008a9de470cSBruce Richardson 		rc = TEST_FAILED;
2009a9de470cSBruce Richardson 	else
2010a9de470cSBruce Richardson 		rc = test_ipsec_crypto_op_alloc(1);
2011a9de470cSBruce Richardson 
2012a9de470cSBruce Richardson 	if (rc == 0) {
2013a9de470cSBruce Richardson 		/* call ipsec library api */
2014a9de470cSBruce Richardson 		rc = crypto_ipsec(1);
2015a9de470cSBruce Richardson 		if (rc == 0)
2016a9de470cSBruce Richardson 			rc = replay_inb_null_null_check(ut_params, i, 1);
2017a9de470cSBruce Richardson 		else {
2018a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
2019a9de470cSBruce Richardson 					i);
2020a9de470cSBruce Richardson 			rc = TEST_FAILED;
2021a9de470cSBruce Richardson 		}
2022a9de470cSBruce Richardson 	}
2023a9de470cSBruce Richardson 
2024a9de470cSBruce Richardson 	if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) {
2025a9de470cSBruce Richardson 		/* generate packet with seq number outside the replay window */
2026a9de470cSBruce Richardson 		if (ut_params->ibuf[0]) {
2027a9de470cSBruce Richardson 			rte_pktmbuf_free(ut_params->ibuf[0]);
2028a9de470cSBruce Richardson 			ut_params->ibuf[0] = 0;
2029a9de470cSBruce Richardson 		}
2030a9de470cSBruce Richardson 		ut_params->ibuf[0] = setup_test_string_tunneled(
2031a9de470cSBruce Richardson 			ts_params->mbuf_pool, null_encrypted_data,
2032a9de470cSBruce Richardson 			test_cfg[i].pkt_sz, INBOUND_SPI, 1);
2033a9de470cSBruce Richardson 		if (ut_params->ibuf[0] == NULL)
2034a9de470cSBruce Richardson 			rc = TEST_FAILED;
2035a9de470cSBruce Richardson 		else
2036a9de470cSBruce Richardson 			rc = test_ipsec_crypto_op_alloc(1);
2037a9de470cSBruce Richardson 
2038a9de470cSBruce Richardson 		if (rc == 0) {
2039a9de470cSBruce Richardson 			/* call ipsec library api */
2040a9de470cSBruce Richardson 			rc = crypto_ipsec(1);
2041a9de470cSBruce Richardson 			if (rc == 0) {
2042a9de470cSBruce Richardson 				if (test_cfg[i].esn == 0) {
2043a9de470cSBruce Richardson 					RTE_LOG(ERR, USER1,
2044a9de470cSBruce Richardson 						"packet is not outside the replay window, cfg %d pkt0_seq %u pkt1_seq %u\n",
2045a9de470cSBruce Richardson 						i,
2046a9de470cSBruce Richardson 						test_cfg[i].replay_win_sz + 2,
2047a9de470cSBruce Richardson 						1);
2048a9de470cSBruce Richardson 					rc = TEST_FAILED;
2049a9de470cSBruce Richardson 				}
2050a9de470cSBruce Richardson 			} else {
2051a9de470cSBruce Richardson 				RTE_LOG(ERR, USER1,
2052a9de470cSBruce Richardson 					"packet is outside the replay window, cfg %d pkt0_seq %u pkt1_seq %u\n",
2053a9de470cSBruce Richardson 					i, test_cfg[i].replay_win_sz + 2, 1);
2054a9de470cSBruce Richardson 				rc = 0;
2055a9de470cSBruce Richardson 			}
2056a9de470cSBruce Richardson 		}
2057a9de470cSBruce Richardson 	}
2058a9de470cSBruce Richardson 
2059a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
2060a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
2061a9de470cSBruce Richardson 
2062a9de470cSBruce Richardson 	destroy_sa(0);
2063a9de470cSBruce Richardson 
2064a9de470cSBruce Richardson 	return rc;
2065a9de470cSBruce Richardson }
2066a9de470cSBruce Richardson 
2067a9de470cSBruce Richardson static int
2068a9de470cSBruce Richardson test_ipsec_replay_inb_outside_null_null_wrapper(void)
2069a9de470cSBruce Richardson {
2070a9de470cSBruce Richardson 	int i;
2071a9de470cSBruce Richardson 	int rc = 0;
2072a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
2073a9de470cSBruce Richardson 
2074a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI;
2075a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
2076a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
2077a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
2078a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
2079a9de470cSBruce Richardson 
2080a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
2081a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
2082a9de470cSBruce Richardson 		rc = test_ipsec_replay_inb_outside_null_null(i);
2083a9de470cSBruce Richardson 	}
2084a9de470cSBruce Richardson 
2085a9de470cSBruce Richardson 	return rc;
2086a9de470cSBruce Richardson }
2087a9de470cSBruce Richardson 
2088a9de470cSBruce Richardson static int
2089a9de470cSBruce Richardson test_ipsec_replay_inb_repeat_null_null(int i)
2090a9de470cSBruce Richardson {
2091a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
2092a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
2093a9de470cSBruce Richardson 	int rc;
2094a9de470cSBruce Richardson 
2095a9de470cSBruce Richardson 	/* create rte_ipsec_sa */
2096a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
2097a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
2098a9de470cSBruce Richardson 	if (rc != 0) {
20999ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
21008dda080aSGagandeep Singh 		return rc;
2101a9de470cSBruce Richardson 	}
2102a9de470cSBruce Richardson 
2103a9de470cSBruce Richardson 	/* Generate test mbuf data */
2104a9de470cSBruce Richardson 	ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool,
2105a9de470cSBruce Richardson 		null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1);
2106a9de470cSBruce Richardson 	if (ut_params->ibuf[0] == NULL)
2107a9de470cSBruce Richardson 		rc = TEST_FAILED;
2108a9de470cSBruce Richardson 	else
2109a9de470cSBruce Richardson 		rc = test_ipsec_crypto_op_alloc(1);
2110a9de470cSBruce Richardson 
2111a9de470cSBruce Richardson 	if (rc == 0) {
2112a9de470cSBruce Richardson 		/* call ipsec library api */
2113a9de470cSBruce Richardson 		rc = crypto_ipsec(1);
2114a9de470cSBruce Richardson 		if (rc == 0)
2115a9de470cSBruce Richardson 			rc = replay_inb_null_null_check(ut_params, i, 1);
2116a9de470cSBruce Richardson 		else {
2117a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
2118a9de470cSBruce Richardson 					i);
2119a9de470cSBruce Richardson 			rc = TEST_FAILED;
2120a9de470cSBruce Richardson 		}
2121a9de470cSBruce Richardson 	}
2122a9de470cSBruce Richardson 
2123a9de470cSBruce Richardson 	if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) {
2124a9de470cSBruce Richardson 		/*
2125a9de470cSBruce Richardson 		 * generate packet with repeat seq number in the replay
2126a9de470cSBruce Richardson 		 * window
2127a9de470cSBruce Richardson 		 */
2128a9de470cSBruce Richardson 		if (ut_params->ibuf[0]) {
2129a9de470cSBruce Richardson 			rte_pktmbuf_free(ut_params->ibuf[0]);
2130a9de470cSBruce Richardson 			ut_params->ibuf[0] = 0;
2131a9de470cSBruce Richardson 		}
2132a9de470cSBruce Richardson 
2133a9de470cSBruce Richardson 		ut_params->ibuf[0] = setup_test_string_tunneled(
2134a9de470cSBruce Richardson 			ts_params->mbuf_pool, null_encrypted_data,
2135a9de470cSBruce Richardson 			test_cfg[i].pkt_sz, INBOUND_SPI, 1);
2136a9de470cSBruce Richardson 		if (ut_params->ibuf[0] == NULL)
2137a9de470cSBruce Richardson 			rc = TEST_FAILED;
2138a9de470cSBruce Richardson 		else
2139a9de470cSBruce Richardson 			rc = test_ipsec_crypto_op_alloc(1);
2140a9de470cSBruce Richardson 
2141a9de470cSBruce Richardson 		if (rc == 0) {
2142a9de470cSBruce Richardson 			/* call ipsec library api */
2143a9de470cSBruce Richardson 			rc = crypto_ipsec(1);
2144a9de470cSBruce Richardson 			if (rc == 0) {
2145a9de470cSBruce Richardson 				RTE_LOG(ERR, USER1,
2146a9de470cSBruce Richardson 					"packet is not repeated in the replay window, cfg %d seq %u\n",
2147a9de470cSBruce Richardson 					i, 1);
2148a9de470cSBruce Richardson 				rc = TEST_FAILED;
2149a9de470cSBruce Richardson 			} else {
2150a9de470cSBruce Richardson 				RTE_LOG(ERR, USER1,
2151a9de470cSBruce Richardson 					"packet is repeated in the replay window, cfg %d seq %u\n",
2152a9de470cSBruce Richardson 					i, 1);
2153a9de470cSBruce Richardson 				rc = 0;
2154a9de470cSBruce Richardson 			}
2155a9de470cSBruce Richardson 		}
2156a9de470cSBruce Richardson 	}
2157a9de470cSBruce Richardson 
2158a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
2159a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
2160a9de470cSBruce Richardson 
2161a9de470cSBruce Richardson 	destroy_sa(0);
2162a9de470cSBruce Richardson 
2163a9de470cSBruce Richardson 	return rc;
2164a9de470cSBruce Richardson }
2165a9de470cSBruce Richardson 
2166a9de470cSBruce Richardson static int
2167a9de470cSBruce Richardson test_ipsec_replay_inb_repeat_null_null_wrapper(void)
2168a9de470cSBruce Richardson {
2169a9de470cSBruce Richardson 	int i;
2170a9de470cSBruce Richardson 	int rc = 0;
2171a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
2172a9de470cSBruce Richardson 
2173a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI;
2174a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
2175a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
2176a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
2177a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
2178a9de470cSBruce Richardson 
2179a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
2180a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
2181a9de470cSBruce Richardson 		rc = test_ipsec_replay_inb_repeat_null_null(i);
2182a9de470cSBruce Richardson 	}
2183a9de470cSBruce Richardson 
2184a9de470cSBruce Richardson 	return rc;
2185a9de470cSBruce Richardson }
2186a9de470cSBruce Richardson 
2187a9de470cSBruce Richardson static int
2188a9de470cSBruce Richardson test_ipsec_replay_inb_inside_burst_null_null(int i)
2189a9de470cSBruce Richardson {
2190a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
2191a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
2192a9de470cSBruce Richardson 	uint16_t num_pkts = test_cfg[i].num_pkts;
2193a9de470cSBruce Richardson 	int rc;
2194a9de470cSBruce Richardson 	int j;
2195a9de470cSBruce Richardson 
2196a9de470cSBruce Richardson 	/* create rte_ipsec_sa*/
2197a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
2198a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
2199a9de470cSBruce Richardson 	if (rc != 0) {
22009ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
22018dda080aSGagandeep Singh 		return rc;
2202a9de470cSBruce Richardson 	}
2203a9de470cSBruce Richardson 
2204a9de470cSBruce Richardson 	/* Generate inbound mbuf data */
2205a9de470cSBruce Richardson 	ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool,
2206a9de470cSBruce Richardson 		null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1);
2207a9de470cSBruce Richardson 	if (ut_params->ibuf[0] == NULL)
2208a9de470cSBruce Richardson 		rc = TEST_FAILED;
2209a9de470cSBruce Richardson 	else
2210a9de470cSBruce Richardson 		rc = test_ipsec_crypto_op_alloc(1);
2211a9de470cSBruce Richardson 
2212a9de470cSBruce Richardson 	if (rc == 0) {
2213a9de470cSBruce Richardson 		/* call ipsec library api */
2214a9de470cSBruce Richardson 		rc = crypto_ipsec(1);
2215a9de470cSBruce Richardson 		if (rc == 0)
2216a9de470cSBruce Richardson 			rc = replay_inb_null_null_check(ut_params, i, 1);
2217a9de470cSBruce Richardson 		else {
2218a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
2219a9de470cSBruce Richardson 					i);
2220a9de470cSBruce Richardson 			rc = TEST_FAILED;
2221a9de470cSBruce Richardson 		}
2222a9de470cSBruce Richardson 	}
2223a9de470cSBruce Richardson 
2224a9de470cSBruce Richardson 	if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) {
2225a9de470cSBruce Richardson 		/*
2226a9de470cSBruce Richardson 		 *  generate packet(s) with seq number(s) inside the
2227a9de470cSBruce Richardson 		 *  replay window
2228a9de470cSBruce Richardson 		 */
2229a9de470cSBruce Richardson 		if (ut_params->ibuf[0]) {
2230a9de470cSBruce Richardson 			rte_pktmbuf_free(ut_params->ibuf[0]);
2231a9de470cSBruce Richardson 			ut_params->ibuf[0] = 0;
2232a9de470cSBruce Richardson 		}
2233a9de470cSBruce Richardson 
2234a9de470cSBruce Richardson 		for (j = 0; j < num_pkts && rc == 0; j++) {
2235a9de470cSBruce Richardson 			/* packet with sequence number 1 already processed */
2236a9de470cSBruce Richardson 			ut_params->ibuf[j] = setup_test_string_tunneled(
2237a9de470cSBruce Richardson 				ts_params->mbuf_pool, null_encrypted_data,
2238a9de470cSBruce Richardson 				test_cfg[i].pkt_sz, INBOUND_SPI, j + 2);
2239a9de470cSBruce Richardson 			if (ut_params->ibuf[j] == NULL)
2240a9de470cSBruce Richardson 				rc = TEST_FAILED;
2241a9de470cSBruce Richardson 		}
2242a9de470cSBruce Richardson 
2243a9de470cSBruce Richardson 		if (rc == 0) {
2244a9de470cSBruce Richardson 			if (test_cfg[i].reorder_pkts)
2245a9de470cSBruce Richardson 				test_ipsec_reorder_inb_pkt_burst(num_pkts);
2246a9de470cSBruce Richardson 			rc = test_ipsec_crypto_op_alloc(num_pkts);
2247a9de470cSBruce Richardson 		}
2248a9de470cSBruce Richardson 
2249a9de470cSBruce Richardson 		if (rc == 0) {
2250a9de470cSBruce Richardson 			/* call ipsec library api */
2251a9de470cSBruce Richardson 			rc = crypto_ipsec(num_pkts);
2252a9de470cSBruce Richardson 			if (rc == 0)
2253a9de470cSBruce Richardson 				rc = replay_inb_null_null_check(
2254a9de470cSBruce Richardson 						ut_params, i, num_pkts);
2255a9de470cSBruce Richardson 			else {
2256a9de470cSBruce Richardson 				RTE_LOG(ERR, USER1, "crypto_ipsec failed\n");
2257a9de470cSBruce Richardson 				rc = TEST_FAILED;
2258a9de470cSBruce Richardson 			}
2259a9de470cSBruce Richardson 		}
2260a9de470cSBruce Richardson 	}
2261a9de470cSBruce Richardson 
2262a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
2263a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
2264a9de470cSBruce Richardson 
2265a9de470cSBruce Richardson 	destroy_sa(0);
2266a9de470cSBruce Richardson 
2267a9de470cSBruce Richardson 	return rc;
2268a9de470cSBruce Richardson }
2269a9de470cSBruce Richardson 
2270a9de470cSBruce Richardson static int
2271a9de470cSBruce Richardson test_ipsec_replay_inb_inside_burst_null_null_wrapper(void)
2272a9de470cSBruce Richardson {
2273a9de470cSBruce Richardson 	int i;
2274a9de470cSBruce Richardson 	int rc = 0;
2275a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
2276a9de470cSBruce Richardson 
2277a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI;
2278a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
2279a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
2280a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
2281a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
2282a9de470cSBruce Richardson 
2283a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
2284a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
2285a9de470cSBruce Richardson 		rc = test_ipsec_replay_inb_inside_burst_null_null(i);
2286a9de470cSBruce Richardson 	}
2287a9de470cSBruce Richardson 
2288a9de470cSBruce Richardson 	return rc;
2289a9de470cSBruce Richardson }
2290a9de470cSBruce Richardson 
2291a9de470cSBruce Richardson 
2292a9de470cSBruce Richardson static int
2293a9de470cSBruce Richardson crypto_inb_burst_2sa_null_null_check(struct ipsec_unitest_params *ut_params,
2294a9de470cSBruce Richardson 		int i)
2295a9de470cSBruce Richardson {
2296a9de470cSBruce Richardson 	uint16_t j;
2297a9de470cSBruce Richardson 
2298a9de470cSBruce Richardson 	for (j = 0; j < BURST_SIZE; j++) {
2299a9de470cSBruce Richardson 		ut_params->pkt_index = j;
2300a9de470cSBruce Richardson 
2301a9de470cSBruce Richardson 		/* compare the data buffers */
2302a9de470cSBruce Richardson 		TEST_ASSERT_BUFFERS_ARE_EQUAL(null_plain_data,
2303a9de470cSBruce Richardson 			rte_pktmbuf_mtod(ut_params->obuf[j], void *),
2304a9de470cSBruce Richardson 			test_cfg[i].pkt_sz,
2305a9de470cSBruce Richardson 			"input and output data does not match\n");
2306a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
2307a9de470cSBruce Richardson 			ut_params->obuf[j]->pkt_len,
2308a9de470cSBruce Richardson 			"data_len is not equal to pkt_len");
2309a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
2310a9de470cSBruce Richardson 			test_cfg[i].pkt_sz,
2311a9de470cSBruce Richardson 			"data_len is not equal to input data");
2312a9de470cSBruce Richardson 	}
2313a9de470cSBruce Richardson 
2314a9de470cSBruce Richardson 	return 0;
2315a9de470cSBruce Richardson }
2316a9de470cSBruce Richardson 
2317a9de470cSBruce Richardson static int
2318a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_2sa_null_null(int i)
2319a9de470cSBruce Richardson {
2320a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
2321a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
2322a9de470cSBruce Richardson 	uint16_t num_pkts = test_cfg[i].num_pkts;
2323a9de470cSBruce Richardson 	uint16_t j, r;
2324a9de470cSBruce Richardson 	int rc = 0;
2325a9de470cSBruce Richardson 
2326a9de470cSBruce Richardson 	if (num_pkts != BURST_SIZE)
2327a9de470cSBruce Richardson 		return rc;
2328a9de470cSBruce Richardson 
2329a9de470cSBruce Richardson 	/* create rte_ipsec_sa */
2330a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
2331a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
2332a9de470cSBruce Richardson 	if (rc != 0) {
23339ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa 0 failed, cfg %d\n", i);
23348dda080aSGagandeep Singh 		return rc;
2335a9de470cSBruce Richardson 	}
2336a9de470cSBruce Richardson 
2337a9de470cSBruce Richardson 	/* create second rte_ipsec_sa */
2338a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI + 1;
2339a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
2340a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 1);
2341a9de470cSBruce Richardson 	if (rc != 0) {
23429ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa 1 failed, cfg %d\n", i);
2343a9de470cSBruce Richardson 		destroy_sa(0);
23448dda080aSGagandeep Singh 		return rc;
2345a9de470cSBruce Richardson 	}
2346a9de470cSBruce Richardson 
2347a9de470cSBruce Richardson 	/* Generate test mbuf data */
2348a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && rc == 0; j++) {
2349a9de470cSBruce Richardson 		r = j % 2;
2350a9de470cSBruce Richardson 		/* packet with sequence number 0 is invalid */
2351a9de470cSBruce Richardson 		ut_params->ibuf[j] = setup_test_string_tunneled(
2352a9de470cSBruce Richardson 			ts_params->mbuf_pool, null_encrypted_data,
2353a9de470cSBruce Richardson 			test_cfg[i].pkt_sz, INBOUND_SPI + r, j + 1);
2354a9de470cSBruce Richardson 		if (ut_params->ibuf[j] == NULL)
2355a9de470cSBruce Richardson 			rc = TEST_FAILED;
2356a9de470cSBruce Richardson 	}
2357a9de470cSBruce Richardson 
2358a9de470cSBruce Richardson 	if (rc == 0)
2359a9de470cSBruce Richardson 		rc = test_ipsec_crypto_op_alloc(num_pkts);
2360a9de470cSBruce Richardson 
2361a9de470cSBruce Richardson 	if (rc == 0) {
2362a9de470cSBruce Richardson 		/* call ipsec library api */
2363a9de470cSBruce Richardson 		rc = crypto_ipsec_2sa();
2364a9de470cSBruce Richardson 		if (rc == 0)
2365a9de470cSBruce Richardson 			rc = crypto_inb_burst_2sa_null_null_check(
2366a9de470cSBruce Richardson 					ut_params, i);
2367a9de470cSBruce Richardson 		else {
2368a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
2369a9de470cSBruce Richardson 				i);
2370a9de470cSBruce Richardson 			rc = TEST_FAILED;
2371a9de470cSBruce Richardson 		}
2372a9de470cSBruce Richardson 	}
2373a9de470cSBruce Richardson 
2374a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
2375a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
2376a9de470cSBruce Richardson 
2377a9de470cSBruce Richardson 	destroy_sa(0);
2378a9de470cSBruce Richardson 	destroy_sa(1);
2379a9de470cSBruce Richardson 	return rc;
2380a9de470cSBruce Richardson }
2381a9de470cSBruce Richardson 
2382a9de470cSBruce Richardson static int
2383a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_2sa_null_null_wrapper(void)
2384a9de470cSBruce Richardson {
2385a9de470cSBruce Richardson 	int i;
2386a9de470cSBruce Richardson 	int rc = 0;
2387a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
2388a9de470cSBruce Richardson 
2389a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI;
2390a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
2391a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
2392a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
2393a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
2394a9de470cSBruce Richardson 
2395a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
2396a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
2397a9de470cSBruce Richardson 		rc = test_ipsec_crypto_inb_burst_2sa_null_null(i);
2398a9de470cSBruce Richardson 	}
2399a9de470cSBruce Richardson 
2400a9de470cSBruce Richardson 	return rc;
2401a9de470cSBruce Richardson }
2402a9de470cSBruce Richardson 
2403a9de470cSBruce Richardson static int
2404a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_2sa_4grp_null_null(int i)
2405a9de470cSBruce Richardson {
2406a9de470cSBruce Richardson 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
2407a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
2408a9de470cSBruce Richardson 	uint16_t num_pkts = test_cfg[i].num_pkts;
2409a9de470cSBruce Richardson 	uint16_t j, k;
2410a9de470cSBruce Richardson 	int rc = 0;
2411a9de470cSBruce Richardson 
2412a9de470cSBruce Richardson 	if (num_pkts != BURST_SIZE)
2413a9de470cSBruce Richardson 		return rc;
2414a9de470cSBruce Richardson 
2415a9de470cSBruce Richardson 	/* create rte_ipsec_sa */
2416a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
2417a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
2418a9de470cSBruce Richardson 	if (rc != 0) {
24199ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa 0 failed, cfg %d\n", i);
24208dda080aSGagandeep Singh 		return rc;
2421a9de470cSBruce Richardson 	}
2422a9de470cSBruce Richardson 
2423a9de470cSBruce Richardson 	/* create second rte_ipsec_sa */
2424a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI + 1;
2425a9de470cSBruce Richardson 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
2426a9de470cSBruce Richardson 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 1);
2427a9de470cSBruce Richardson 	if (rc != 0) {
24289ab6ff97SBernard Iremonger 		RTE_LOG(ERR, USER1, "create_sa 1 failed, cfg %d\n", i);
2429a9de470cSBruce Richardson 		destroy_sa(0);
24308dda080aSGagandeep Singh 		return rc;
2431a9de470cSBruce Richardson 	}
2432a9de470cSBruce Richardson 
2433a9de470cSBruce Richardson 	/* Generate test mbuf data */
2434a9de470cSBruce Richardson 	for (j = 0; j < num_pkts && rc == 0; j++) {
2435a9de470cSBruce Richardson 		k = crypto_ipsec_4grp(j);
2436a9de470cSBruce Richardson 
2437a9de470cSBruce Richardson 		/* packet with sequence number 0 is invalid */
2438a9de470cSBruce Richardson 		ut_params->ibuf[j] = setup_test_string_tunneled(
2439a9de470cSBruce Richardson 			ts_params->mbuf_pool, null_encrypted_data,
2440a9de470cSBruce Richardson 			test_cfg[i].pkt_sz, INBOUND_SPI + k, j + 1);
2441a9de470cSBruce Richardson 		if (ut_params->ibuf[j] == NULL)
2442a9de470cSBruce Richardson 			rc = TEST_FAILED;
2443a9de470cSBruce Richardson 	}
2444a9de470cSBruce Richardson 
2445a9de470cSBruce Richardson 	if (rc == 0)
2446a9de470cSBruce Richardson 		rc = test_ipsec_crypto_op_alloc(num_pkts);
2447a9de470cSBruce Richardson 
2448a9de470cSBruce Richardson 	if (rc == 0) {
2449a9de470cSBruce Richardson 		/* call ipsec library api */
2450a9de470cSBruce Richardson 		rc = crypto_ipsec_2sa_4grp();
2451a9de470cSBruce Richardson 		if (rc == 0)
2452a9de470cSBruce Richardson 			rc = crypto_inb_burst_2sa_null_null_check(
2453a9de470cSBruce Richardson 					ut_params, i);
2454a9de470cSBruce Richardson 		else {
2455a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
2456a9de470cSBruce Richardson 				i);
2457a9de470cSBruce Richardson 			rc = TEST_FAILED;
2458a9de470cSBruce Richardson 		}
2459a9de470cSBruce Richardson 	}
2460a9de470cSBruce Richardson 
2461a9de470cSBruce Richardson 	if (rc == TEST_FAILED)
2462a9de470cSBruce Richardson 		test_ipsec_dump_buffers(ut_params, i);
2463a9de470cSBruce Richardson 
2464a9de470cSBruce Richardson 	destroy_sa(0);
2465a9de470cSBruce Richardson 	destroy_sa(1);
2466a9de470cSBruce Richardson 	return rc;
2467a9de470cSBruce Richardson }
2468a9de470cSBruce Richardson 
2469a9de470cSBruce Richardson static int
2470a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_2sa_4grp_null_null_wrapper(void)
2471a9de470cSBruce Richardson {
2472a9de470cSBruce Richardson 	int i;
2473a9de470cSBruce Richardson 	int rc = 0;
2474a9de470cSBruce Richardson 	struct ipsec_unitest_params *ut_params = &unittest_params;
2475a9de470cSBruce Richardson 
2476a9de470cSBruce Richardson 	ut_params->ipsec_xform.spi = INBOUND_SPI;
2477a9de470cSBruce Richardson 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
2478a9de470cSBruce Richardson 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
2479a9de470cSBruce Richardson 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
2480a9de470cSBruce Richardson 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
2481a9de470cSBruce Richardson 
2482a9de470cSBruce Richardson 	for (i = 0; i < num_cfg && rc == 0; i++) {
2483a9de470cSBruce Richardson 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
2484a9de470cSBruce Richardson 		rc = test_ipsec_crypto_inb_burst_2sa_4grp_null_null(i);
2485a9de470cSBruce Richardson 	}
2486a9de470cSBruce Richardson 
2487a9de470cSBruce Richardson 	return rc;
2488a9de470cSBruce Richardson }
2489a9de470cSBruce Richardson 
2490a9de470cSBruce Richardson static struct unit_test_suite ipsec_testsuite  = {
2491a9de470cSBruce Richardson 	.suite_name = "IPsec NULL Unit Test Suite",
2492a9de470cSBruce Richardson 	.setup = testsuite_setup,
2493a9de470cSBruce Richardson 	.teardown = testsuite_teardown,
2494a9de470cSBruce Richardson 	.unit_test_cases = {
2495da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2496a9de470cSBruce Richardson 			test_ipsec_crypto_inb_burst_null_null_wrapper),
2497da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2498a9de470cSBruce Richardson 			test_ipsec_crypto_outb_burst_null_null_wrapper),
2499da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2500a9de470cSBruce Richardson 			test_ipsec_inline_crypto_inb_burst_null_null_wrapper),
2501da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2502a9de470cSBruce Richardson 			test_ipsec_inline_crypto_outb_burst_null_null_wrapper),
2503da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2504a9de470cSBruce Richardson 			test_ipsec_inline_proto_inb_burst_null_null_wrapper),
2505da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2506a9de470cSBruce Richardson 			test_ipsec_inline_proto_outb_burst_null_null_wrapper),
2507da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2508a9de470cSBruce Richardson 			test_ipsec_lksd_proto_inb_burst_null_null_wrapper),
2509da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2510a9de470cSBruce Richardson 			test_ipsec_lksd_proto_outb_burst_null_null_wrapper),
2511da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2512a9de470cSBruce Richardson 			test_ipsec_replay_inb_inside_null_null_wrapper),
2513da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2514a9de470cSBruce Richardson 			test_ipsec_replay_inb_outside_null_null_wrapper),
2515da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2516a9de470cSBruce Richardson 			test_ipsec_replay_inb_repeat_null_null_wrapper),
2517da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2518a9de470cSBruce Richardson 			test_ipsec_replay_inb_inside_burst_null_null_wrapper),
2519da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2520a9de470cSBruce Richardson 			test_ipsec_crypto_inb_burst_2sa_null_null_wrapper),
2521da74df7dSCiara Power 		TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
2522a9de470cSBruce Richardson 			test_ipsec_crypto_inb_burst_2sa_4grp_null_null_wrapper),
2523a9de470cSBruce Richardson 		TEST_CASES_END() /**< NULL terminate unit test array */
2524a9de470cSBruce Richardson 	}
2525a9de470cSBruce Richardson };
2526a9de470cSBruce Richardson 
2527a9de470cSBruce Richardson static int
2528a9de470cSBruce Richardson test_ipsec(void)
2529a9de470cSBruce Richardson {
2530a9de470cSBruce Richardson 	return unit_test_suite_runner(&ipsec_testsuite);
2531a9de470cSBruce Richardson }
2532a9de470cSBruce Richardson 
25333c60274cSJie Zhou #endif /* !RTE_EXEC_ENV_WINDOWS */
25343c60274cSJie Zhou 
2535*e0a8442cSBruce Richardson REGISTER_FAST_TEST(ipsec_autotest, true, true, test_ipsec);
2536