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