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