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