xref: /f-stack/dpdk/app/test/test_ipsec.c (revision 2d9fd380)
14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang  * Copyright(c) 2018 Intel Corporation
34418919fSjohnjiang  */
44418919fSjohnjiang 
54418919fSjohnjiang #include <time.h>
64418919fSjohnjiang 
74418919fSjohnjiang #include <rte_common.h>
84418919fSjohnjiang #include <rte_hexdump.h>
94418919fSjohnjiang #include <rte_mbuf.h>
104418919fSjohnjiang #include <rte_malloc.h>
114418919fSjohnjiang #include <rte_memcpy.h>
124418919fSjohnjiang #include <rte_cycles.h>
134418919fSjohnjiang #include <rte_bus_vdev.h>
144418919fSjohnjiang #include <rte_ip.h>
154418919fSjohnjiang 
164418919fSjohnjiang #include <rte_crypto.h>
174418919fSjohnjiang #include <rte_cryptodev.h>
184418919fSjohnjiang #include <rte_cryptodev_pmd.h>
194418919fSjohnjiang #include <rte_lcore.h>
204418919fSjohnjiang #include <rte_ipsec.h>
214418919fSjohnjiang #include <rte_random.h>
224418919fSjohnjiang #include <rte_esp.h>
234418919fSjohnjiang #include <rte_security_driver.h>
244418919fSjohnjiang 
254418919fSjohnjiang #include "test.h"
264418919fSjohnjiang #include "test_cryptodev.h"
274418919fSjohnjiang 
284418919fSjohnjiang #define VDEV_ARGS_SIZE	100
294418919fSjohnjiang #define MAX_NB_SESSIONS	200
304418919fSjohnjiang #define MAX_NB_SAS		2
314418919fSjohnjiang #define REPLAY_WIN_0	0
324418919fSjohnjiang #define REPLAY_WIN_32	32
334418919fSjohnjiang #define REPLAY_WIN_64	64
344418919fSjohnjiang #define REPLAY_WIN_128	128
354418919fSjohnjiang #define REPLAY_WIN_256	256
364418919fSjohnjiang #define DATA_64_BYTES	64
374418919fSjohnjiang #define DATA_80_BYTES	80
384418919fSjohnjiang #define DATA_100_BYTES	100
394418919fSjohnjiang #define ESN_ENABLED		1
404418919fSjohnjiang #define ESN_DISABLED	0
414418919fSjohnjiang #define INBOUND_SPI		7
424418919fSjohnjiang #define OUTBOUND_SPI	17
434418919fSjohnjiang #define BURST_SIZE		32
444418919fSjohnjiang #define REORDER_PKTS	1
454418919fSjohnjiang #define DEQUEUE_COUNT	1000
464418919fSjohnjiang 
474418919fSjohnjiang struct user_params {
484418919fSjohnjiang 	enum rte_crypto_sym_xform_type auth;
494418919fSjohnjiang 	enum rte_crypto_sym_xform_type cipher;
504418919fSjohnjiang 	enum rte_crypto_sym_xform_type aead;
514418919fSjohnjiang 
524418919fSjohnjiang 	char auth_algo[128];
534418919fSjohnjiang 	char cipher_algo[128];
544418919fSjohnjiang 	char aead_algo[128];
554418919fSjohnjiang };
564418919fSjohnjiang 
574418919fSjohnjiang struct ipsec_testsuite_params {
584418919fSjohnjiang 	struct rte_mempool *mbuf_pool;
594418919fSjohnjiang 	struct rte_mempool *cop_mpool;
604418919fSjohnjiang 	struct rte_cryptodev_config conf;
614418919fSjohnjiang 	struct rte_cryptodev_qp_conf qp_conf;
624418919fSjohnjiang 
634418919fSjohnjiang 	uint8_t valid_dev;
644418919fSjohnjiang 	uint8_t valid_dev_found;
654418919fSjohnjiang };
664418919fSjohnjiang 
674418919fSjohnjiang struct ipsec_unitest_params {
684418919fSjohnjiang 	struct rte_crypto_sym_xform cipher_xform;
694418919fSjohnjiang 	struct rte_crypto_sym_xform auth_xform;
704418919fSjohnjiang 	struct rte_crypto_sym_xform aead_xform;
714418919fSjohnjiang 	struct rte_crypto_sym_xform *crypto_xforms;
724418919fSjohnjiang 
734418919fSjohnjiang 	struct rte_security_ipsec_xform ipsec_xform;
744418919fSjohnjiang 
754418919fSjohnjiang 	struct rte_ipsec_sa_prm sa_prm;
764418919fSjohnjiang 	struct rte_ipsec_session ss[MAX_NB_SAS];
774418919fSjohnjiang 
784418919fSjohnjiang 	struct rte_crypto_op *cop[BURST_SIZE];
794418919fSjohnjiang 
804418919fSjohnjiang 	struct rte_mbuf *obuf[BURST_SIZE], *ibuf[BURST_SIZE],
814418919fSjohnjiang 		*testbuf[BURST_SIZE];
824418919fSjohnjiang 
834418919fSjohnjiang 	uint16_t pkt_index;
844418919fSjohnjiang };
854418919fSjohnjiang 
864418919fSjohnjiang struct ipsec_test_cfg {
874418919fSjohnjiang 	uint32_t replay_win_sz;
884418919fSjohnjiang 	uint32_t esn;
894418919fSjohnjiang 	uint64_t flags;
904418919fSjohnjiang 	size_t pkt_sz;
914418919fSjohnjiang 	uint16_t num_pkts;
924418919fSjohnjiang 	uint32_t reorder_pkts;
934418919fSjohnjiang };
944418919fSjohnjiang 
954418919fSjohnjiang static const struct ipsec_test_cfg test_cfg[] = {
964418919fSjohnjiang 	{REPLAY_WIN_0, ESN_DISABLED, 0, DATA_64_BYTES, 1, 0},
974418919fSjohnjiang 	{REPLAY_WIN_0, ESN_DISABLED, 0, DATA_64_BYTES, BURST_SIZE, 0},
984418919fSjohnjiang 	{REPLAY_WIN_0, ESN_DISABLED, 0, DATA_80_BYTES, BURST_SIZE,
994418919fSjohnjiang 		REORDER_PKTS},
1004418919fSjohnjiang 	{REPLAY_WIN_32, ESN_ENABLED, 0, DATA_100_BYTES, 1, 0},
1014418919fSjohnjiang 	{REPLAY_WIN_32, ESN_ENABLED, 0, DATA_100_BYTES, BURST_SIZE,
1024418919fSjohnjiang 		REORDER_PKTS},
1034418919fSjohnjiang 	{REPLAY_WIN_64, ESN_ENABLED, 0, DATA_64_BYTES, 1, 0},
1044418919fSjohnjiang 	{REPLAY_WIN_128, ESN_ENABLED, RTE_IPSEC_SAFLAG_SQN_ATOM,
1054418919fSjohnjiang 		DATA_80_BYTES, 1, 0},
1064418919fSjohnjiang 	{REPLAY_WIN_256, ESN_DISABLED, 0, DATA_100_BYTES, 1, 0},
1074418919fSjohnjiang };
1084418919fSjohnjiang 
1094418919fSjohnjiang static const int num_cfg = RTE_DIM(test_cfg);
1104418919fSjohnjiang static struct ipsec_testsuite_params testsuite_params = { NULL };
1114418919fSjohnjiang static struct ipsec_unitest_params unittest_params;
1124418919fSjohnjiang static struct user_params uparams;
1134418919fSjohnjiang 
1144418919fSjohnjiang struct supported_cipher_algo {
1154418919fSjohnjiang 	const char *keyword;
1164418919fSjohnjiang 	enum rte_crypto_cipher_algorithm algo;
1174418919fSjohnjiang 	uint16_t iv_len;
1184418919fSjohnjiang 	uint16_t block_size;
1194418919fSjohnjiang 	uint16_t key_len;
1204418919fSjohnjiang };
1214418919fSjohnjiang 
1224418919fSjohnjiang struct supported_auth_algo {
1234418919fSjohnjiang 	const char *keyword;
1244418919fSjohnjiang 	enum rte_crypto_auth_algorithm algo;
1254418919fSjohnjiang 	uint16_t digest_len;
1264418919fSjohnjiang 	uint16_t key_len;
1274418919fSjohnjiang 	uint8_t key_not_req;
1284418919fSjohnjiang };
1294418919fSjohnjiang 
1304418919fSjohnjiang const struct supported_cipher_algo cipher_algos[] = {
1314418919fSjohnjiang 	{
1324418919fSjohnjiang 		.keyword = "null",
1334418919fSjohnjiang 		.algo = RTE_CRYPTO_CIPHER_NULL,
1344418919fSjohnjiang 		.iv_len = 0,
1354418919fSjohnjiang 		.block_size = 4,
1364418919fSjohnjiang 		.key_len = 0
1374418919fSjohnjiang 	},
1384418919fSjohnjiang };
1394418919fSjohnjiang 
1404418919fSjohnjiang const struct supported_auth_algo auth_algos[] = {
1414418919fSjohnjiang 	{
1424418919fSjohnjiang 		.keyword = "null",
1434418919fSjohnjiang 		.algo = RTE_CRYPTO_AUTH_NULL,
1444418919fSjohnjiang 		.digest_len = 0,
1454418919fSjohnjiang 		.key_len = 0,
1464418919fSjohnjiang 		.key_not_req = 1
1474418919fSjohnjiang 	},
1484418919fSjohnjiang };
1494418919fSjohnjiang 
1504418919fSjohnjiang static int
dummy_sec_create(void * device,struct rte_security_session_conf * conf,struct rte_security_session * sess,struct rte_mempool * mp)1514418919fSjohnjiang dummy_sec_create(void *device, struct rte_security_session_conf *conf,
1524418919fSjohnjiang 	struct rte_security_session *sess, struct rte_mempool *mp)
1534418919fSjohnjiang {
1544418919fSjohnjiang 	RTE_SET_USED(device);
1554418919fSjohnjiang 	RTE_SET_USED(conf);
1564418919fSjohnjiang 	RTE_SET_USED(mp);
1574418919fSjohnjiang 
1584418919fSjohnjiang 	sess->sess_private_data = NULL;
1594418919fSjohnjiang 	return 0;
1604418919fSjohnjiang }
1614418919fSjohnjiang 
1624418919fSjohnjiang static int
dummy_sec_destroy(void * device,struct rte_security_session * sess)1634418919fSjohnjiang dummy_sec_destroy(void *device, struct rte_security_session *sess)
1644418919fSjohnjiang {
1654418919fSjohnjiang 	RTE_SET_USED(device);
1664418919fSjohnjiang 	RTE_SET_USED(sess);
1674418919fSjohnjiang 	return 0;
1684418919fSjohnjiang }
1694418919fSjohnjiang 
1704418919fSjohnjiang static const struct rte_security_ops dummy_sec_ops = {
1714418919fSjohnjiang 	.session_create = dummy_sec_create,
1724418919fSjohnjiang 	.session_destroy = dummy_sec_destroy,
1734418919fSjohnjiang };
1744418919fSjohnjiang 
1754418919fSjohnjiang static struct rte_security_ctx dummy_sec_ctx = {
1764418919fSjohnjiang 	.ops = &dummy_sec_ops,
1774418919fSjohnjiang };
1784418919fSjohnjiang 
1794418919fSjohnjiang static const struct supported_cipher_algo *
find_match_cipher_algo(const char * cipher_keyword)1804418919fSjohnjiang find_match_cipher_algo(const char *cipher_keyword)
1814418919fSjohnjiang {
1824418919fSjohnjiang 	size_t i;
1834418919fSjohnjiang 
1844418919fSjohnjiang 	for (i = 0; i < RTE_DIM(cipher_algos); i++) {
1854418919fSjohnjiang 		const struct supported_cipher_algo *algo =
1864418919fSjohnjiang 			&cipher_algos[i];
1874418919fSjohnjiang 
1884418919fSjohnjiang 		if (strcmp(cipher_keyword, algo->keyword) == 0)
1894418919fSjohnjiang 			return algo;
1904418919fSjohnjiang 	}
1914418919fSjohnjiang 
1924418919fSjohnjiang 	return NULL;
1934418919fSjohnjiang }
1944418919fSjohnjiang 
1954418919fSjohnjiang static const struct supported_auth_algo *
find_match_auth_algo(const char * auth_keyword)1964418919fSjohnjiang find_match_auth_algo(const char *auth_keyword)
1974418919fSjohnjiang {
1984418919fSjohnjiang 	size_t i;
1994418919fSjohnjiang 
2004418919fSjohnjiang 	for (i = 0; i < RTE_DIM(auth_algos); i++) {
2014418919fSjohnjiang 		const struct supported_auth_algo *algo =
2024418919fSjohnjiang 			&auth_algos[i];
2034418919fSjohnjiang 
2044418919fSjohnjiang 		if (strcmp(auth_keyword, algo->keyword) == 0)
2054418919fSjohnjiang 			return algo;
2064418919fSjohnjiang 	}
2074418919fSjohnjiang 
2084418919fSjohnjiang 	return NULL;
2094418919fSjohnjiang }
2104418919fSjohnjiang 
2114418919fSjohnjiang static void
fill_crypto_xform(struct ipsec_unitest_params * ut_params,const struct supported_auth_algo * auth_algo,const struct supported_cipher_algo * cipher_algo)2124418919fSjohnjiang fill_crypto_xform(struct ipsec_unitest_params *ut_params,
2134418919fSjohnjiang 	const struct supported_auth_algo *auth_algo,
2144418919fSjohnjiang 	const struct supported_cipher_algo *cipher_algo)
2154418919fSjohnjiang {
2164418919fSjohnjiang 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2174418919fSjohnjiang 	ut_params->cipher_xform.cipher.algo = cipher_algo->algo;
2184418919fSjohnjiang 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2194418919fSjohnjiang 	ut_params->auth_xform.auth.algo = auth_algo->algo;
2204418919fSjohnjiang 
2214418919fSjohnjiang 	if (ut_params->ipsec_xform.direction ==
2224418919fSjohnjiang 			RTE_SECURITY_IPSEC_SA_DIR_INGRESS) {
2234418919fSjohnjiang 		ut_params->cipher_xform.cipher.op =
2244418919fSjohnjiang 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
2254418919fSjohnjiang 		ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2264418919fSjohnjiang 		ut_params->cipher_xform.next = NULL;
2274418919fSjohnjiang 		ut_params->auth_xform.next = &ut_params->cipher_xform;
2284418919fSjohnjiang 		ut_params->crypto_xforms = &ut_params->auth_xform;
2294418919fSjohnjiang 	} else {
2304418919fSjohnjiang 		ut_params->cipher_xform.cipher.op =
2314418919fSjohnjiang 			RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2324418919fSjohnjiang 		ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2334418919fSjohnjiang 		ut_params->auth_xform.next = NULL;
2344418919fSjohnjiang 		ut_params->cipher_xform.next = &ut_params->auth_xform;
2354418919fSjohnjiang 		ut_params->crypto_xforms = &ut_params->cipher_xform;
2364418919fSjohnjiang 	}
2374418919fSjohnjiang }
2384418919fSjohnjiang 
2394418919fSjohnjiang static int
check_cryptodev_capability(const struct ipsec_unitest_params * ut,uint8_t dev_id)2404418919fSjohnjiang check_cryptodev_capability(const struct ipsec_unitest_params *ut,
2414418919fSjohnjiang 		uint8_t dev_id)
2424418919fSjohnjiang {
2434418919fSjohnjiang 	struct rte_cryptodev_sym_capability_idx cap_idx;
2444418919fSjohnjiang 	const struct rte_cryptodev_symmetric_capability *cap;
2454418919fSjohnjiang 	int rc = -1;
2464418919fSjohnjiang 
2474418919fSjohnjiang 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2484418919fSjohnjiang 	cap_idx.algo.auth = ut->auth_xform.auth.algo;
2494418919fSjohnjiang 	cap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);
2504418919fSjohnjiang 
2514418919fSjohnjiang 	if (cap != NULL) {
2524418919fSjohnjiang 		rc = rte_cryptodev_sym_capability_check_auth(cap,
2534418919fSjohnjiang 				ut->auth_xform.auth.key.length,
2544418919fSjohnjiang 				ut->auth_xform.auth.digest_length, 0);
2554418919fSjohnjiang 		if (rc == 0) {
2564418919fSjohnjiang 			cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2574418919fSjohnjiang 			cap_idx.algo.cipher = ut->cipher_xform.cipher.algo;
2584418919fSjohnjiang 			cap = rte_cryptodev_sym_capability_get(
2594418919fSjohnjiang 					dev_id, &cap_idx);
2604418919fSjohnjiang 			if (cap != NULL)
2614418919fSjohnjiang 				rc = rte_cryptodev_sym_capability_check_cipher(
2624418919fSjohnjiang 					cap,
2634418919fSjohnjiang 					ut->cipher_xform.cipher.key.length,
2644418919fSjohnjiang 					ut->cipher_xform.cipher.iv.length);
2654418919fSjohnjiang 		}
2664418919fSjohnjiang 	}
2674418919fSjohnjiang 
2684418919fSjohnjiang 	return rc;
2694418919fSjohnjiang }
2704418919fSjohnjiang 
2714418919fSjohnjiang static int
testsuite_setup(void)2724418919fSjohnjiang testsuite_setup(void)
2734418919fSjohnjiang {
2744418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
2754418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
2764418919fSjohnjiang 	const struct supported_auth_algo *auth_algo;
2774418919fSjohnjiang 	const struct supported_cipher_algo *cipher_algo;
2784418919fSjohnjiang 	struct rte_cryptodev_info info;
2794418919fSjohnjiang 	uint32_t i, nb_devs, dev_id;
2804418919fSjohnjiang 	size_t sess_sz;
2814418919fSjohnjiang 	int rc;
2824418919fSjohnjiang 
2834418919fSjohnjiang 	memset(ts_params, 0, sizeof(*ts_params));
2844418919fSjohnjiang 	memset(ut_params, 0, sizeof(*ut_params));
2854418919fSjohnjiang 	memset(&uparams, 0, sizeof(struct user_params));
2864418919fSjohnjiang 
2874418919fSjohnjiang 	uparams.auth = RTE_CRYPTO_SYM_XFORM_AUTH;
2884418919fSjohnjiang 	uparams.cipher = RTE_CRYPTO_SYM_XFORM_CIPHER;
2894418919fSjohnjiang 	uparams.aead = RTE_CRYPTO_SYM_XFORM_NOT_SPECIFIED;
2904418919fSjohnjiang 	strcpy(uparams.auth_algo, "null");
2914418919fSjohnjiang 	strcpy(uparams.cipher_algo, "null");
2924418919fSjohnjiang 
2934418919fSjohnjiang 	auth_algo = find_match_auth_algo(uparams.auth_algo);
2944418919fSjohnjiang 	cipher_algo = find_match_cipher_algo(uparams.cipher_algo);
2954418919fSjohnjiang 	fill_crypto_xform(ut_params, auth_algo, cipher_algo);
2964418919fSjohnjiang 
2974418919fSjohnjiang 	nb_devs = rte_cryptodev_count();
2984418919fSjohnjiang 	if (nb_devs < 1) {
2994418919fSjohnjiang 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
3004418919fSjohnjiang 		return TEST_SKIPPED;
3014418919fSjohnjiang 	}
3024418919fSjohnjiang 
3034418919fSjohnjiang 	/* Find first valid crypto device */
3044418919fSjohnjiang 	for (i = 0; i < nb_devs; i++) {
3054418919fSjohnjiang 		rc = check_cryptodev_capability(ut_params, i);
3064418919fSjohnjiang 		if (rc == 0) {
3074418919fSjohnjiang 			ts_params->valid_dev = i;
3084418919fSjohnjiang 			ts_params->valid_dev_found = 1;
3094418919fSjohnjiang 			break;
3104418919fSjohnjiang 		}
3114418919fSjohnjiang 	}
3124418919fSjohnjiang 
3134418919fSjohnjiang 	if (ts_params->valid_dev_found == 0)
3144418919fSjohnjiang 		return TEST_FAILED;
3154418919fSjohnjiang 
3164418919fSjohnjiang 	ts_params->mbuf_pool = rte_pktmbuf_pool_create(
3174418919fSjohnjiang 			"CRYPTO_MBUFPOOL",
3184418919fSjohnjiang 			NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
3194418919fSjohnjiang 			rte_socket_id());
3204418919fSjohnjiang 	if (ts_params->mbuf_pool == NULL) {
3214418919fSjohnjiang 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
3224418919fSjohnjiang 		return TEST_FAILED;
3234418919fSjohnjiang 	}
3244418919fSjohnjiang 
3254418919fSjohnjiang 	ts_params->cop_mpool = rte_crypto_op_pool_create(
3264418919fSjohnjiang 			"MBUF_CRYPTO_SYM_OP_POOL",
3274418919fSjohnjiang 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3284418919fSjohnjiang 			NUM_MBUFS, MBUF_CACHE_SIZE,
3294418919fSjohnjiang 			DEFAULT_NUM_XFORMS *
3304418919fSjohnjiang 			sizeof(struct rte_crypto_sym_xform) +
3314418919fSjohnjiang 			MAXIMUM_IV_LENGTH,
3324418919fSjohnjiang 			rte_socket_id());
3334418919fSjohnjiang 	if (ts_params->cop_mpool == NULL) {
3344418919fSjohnjiang 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
3354418919fSjohnjiang 		return TEST_FAILED;
3364418919fSjohnjiang 	}
3374418919fSjohnjiang 
3384418919fSjohnjiang 	/* Set up all the qps on the first of the valid devices found */
3394418919fSjohnjiang 	dev_id = ts_params->valid_dev;
3404418919fSjohnjiang 
3414418919fSjohnjiang 	rte_cryptodev_info_get(dev_id, &info);
3424418919fSjohnjiang 
3434418919fSjohnjiang 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
3444418919fSjohnjiang 	ts_params->conf.socket_id = SOCKET_ID_ANY;
3454418919fSjohnjiang 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO;
3464418919fSjohnjiang 
3474418919fSjohnjiang 	sess_sz = rte_cryptodev_sym_get_private_session_size(dev_id);
3484418919fSjohnjiang 	sess_sz = RTE_MAX(sess_sz, sizeof(struct rte_security_session));
3494418919fSjohnjiang 
3504418919fSjohnjiang 	/*
3514418919fSjohnjiang 	 * Create mempools for sessions
3524418919fSjohnjiang 	 */
3534418919fSjohnjiang 	if (info.sym.max_nb_sessions != 0 &&
3544418919fSjohnjiang 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
3554418919fSjohnjiang 		RTE_LOG(ERR, USER1, "Device does not support "
3564418919fSjohnjiang 				"at least %u sessions\n",
3574418919fSjohnjiang 				MAX_NB_SESSIONS);
3584418919fSjohnjiang 		return TEST_FAILED;
3594418919fSjohnjiang 	}
3604418919fSjohnjiang 
3614418919fSjohnjiang 	ts_params->qp_conf.mp_session_private = rte_mempool_create(
3624418919fSjohnjiang 				"test_priv_sess_mp",
3634418919fSjohnjiang 				MAX_NB_SESSIONS,
3644418919fSjohnjiang 				sess_sz,
3654418919fSjohnjiang 				0, 0, NULL, NULL, NULL,
3664418919fSjohnjiang 				NULL, SOCKET_ID_ANY,
3674418919fSjohnjiang 				0);
3684418919fSjohnjiang 
3694418919fSjohnjiang 	TEST_ASSERT_NOT_NULL(ts_params->qp_conf.mp_session_private,
3704418919fSjohnjiang 			"private session mempool allocation failed");
3714418919fSjohnjiang 
3724418919fSjohnjiang 	ts_params->qp_conf.mp_session =
3734418919fSjohnjiang 		rte_cryptodev_sym_session_pool_create("test_sess_mp",
3744418919fSjohnjiang 			MAX_NB_SESSIONS, 0, 0, 0, SOCKET_ID_ANY);
3754418919fSjohnjiang 
3764418919fSjohnjiang 	TEST_ASSERT_NOT_NULL(ts_params->qp_conf.mp_session,
3774418919fSjohnjiang 			"session mempool allocation failed");
3784418919fSjohnjiang 
3794418919fSjohnjiang 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
3804418919fSjohnjiang 			&ts_params->conf),
3814418919fSjohnjiang 			"Failed to configure cryptodev %u with %u qps",
3824418919fSjohnjiang 			dev_id, ts_params->conf.nb_queue_pairs);
3834418919fSjohnjiang 
3844418919fSjohnjiang 	ts_params->qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
3854418919fSjohnjiang 
3864418919fSjohnjiang 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
3874418919fSjohnjiang 		dev_id, 0, &ts_params->qp_conf,
3884418919fSjohnjiang 		rte_cryptodev_socket_id(dev_id)),
3894418919fSjohnjiang 		"Failed to setup queue pair %u on cryptodev %u",
3904418919fSjohnjiang 		0, dev_id);
3914418919fSjohnjiang 
3924418919fSjohnjiang 	return TEST_SUCCESS;
3934418919fSjohnjiang }
3944418919fSjohnjiang 
3954418919fSjohnjiang static void
testsuite_teardown(void)3964418919fSjohnjiang testsuite_teardown(void)
3974418919fSjohnjiang {
3984418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
3994418919fSjohnjiang 
4004418919fSjohnjiang 	if (ts_params->mbuf_pool != NULL) {
4014418919fSjohnjiang 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
4024418919fSjohnjiang 		rte_mempool_avail_count(ts_params->mbuf_pool));
4034418919fSjohnjiang 		rte_mempool_free(ts_params->mbuf_pool);
4044418919fSjohnjiang 		ts_params->mbuf_pool = NULL;
4054418919fSjohnjiang 	}
4064418919fSjohnjiang 
4074418919fSjohnjiang 	if (ts_params->cop_mpool != NULL) {
4084418919fSjohnjiang 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
4094418919fSjohnjiang 		rte_mempool_avail_count(ts_params->cop_mpool));
4104418919fSjohnjiang 		rte_mempool_free(ts_params->cop_mpool);
4114418919fSjohnjiang 		ts_params->cop_mpool = NULL;
4124418919fSjohnjiang 	}
4134418919fSjohnjiang 
4144418919fSjohnjiang 	/* Free session mempools */
4154418919fSjohnjiang 	if (ts_params->qp_conf.mp_session != NULL) {
4164418919fSjohnjiang 		rte_mempool_free(ts_params->qp_conf.mp_session);
4174418919fSjohnjiang 		ts_params->qp_conf.mp_session = NULL;
4184418919fSjohnjiang 	}
4194418919fSjohnjiang 
4204418919fSjohnjiang 	if (ts_params->qp_conf.mp_session_private != NULL) {
4214418919fSjohnjiang 		rte_mempool_free(ts_params->qp_conf.mp_session_private);
4224418919fSjohnjiang 		ts_params->qp_conf.mp_session_private = NULL;
4234418919fSjohnjiang 	}
4244418919fSjohnjiang }
4254418919fSjohnjiang 
4264418919fSjohnjiang static int
ut_setup(void)4274418919fSjohnjiang ut_setup(void)
4284418919fSjohnjiang {
4294418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
4304418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
4314418919fSjohnjiang 
4324418919fSjohnjiang 	/* Clear unit test parameters before running test */
4334418919fSjohnjiang 	memset(ut_params, 0, sizeof(*ut_params));
4344418919fSjohnjiang 
4354418919fSjohnjiang 	/* Reconfigure device to default parameters */
4364418919fSjohnjiang 	ts_params->conf.socket_id = SOCKET_ID_ANY;
4374418919fSjohnjiang 
4384418919fSjohnjiang 	/* Start the device */
4394418919fSjohnjiang 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_dev),
4404418919fSjohnjiang 			"Failed to start cryptodev %u",
4414418919fSjohnjiang 			ts_params->valid_dev);
4424418919fSjohnjiang 
4434418919fSjohnjiang 	return TEST_SUCCESS;
4444418919fSjohnjiang }
4454418919fSjohnjiang 
4464418919fSjohnjiang static void
ut_teardown(void)4474418919fSjohnjiang ut_teardown(void)
4484418919fSjohnjiang {
4494418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
4504418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
4514418919fSjohnjiang 	int i;
4524418919fSjohnjiang 
4534418919fSjohnjiang 	for (i = 0; i < BURST_SIZE; i++) {
4544418919fSjohnjiang 		/* free crypto operation structure */
4554418919fSjohnjiang 		if (ut_params->cop[i]) {
4564418919fSjohnjiang 			rte_crypto_op_free(ut_params->cop[i]);
4574418919fSjohnjiang 			ut_params->cop[i] = NULL;
4584418919fSjohnjiang 		}
4594418919fSjohnjiang 
4604418919fSjohnjiang 		/*
4614418919fSjohnjiang 		 * free mbuf - both obuf and ibuf are usually the same,
4624418919fSjohnjiang 		 * so check if they point at the same address is necessary,
4634418919fSjohnjiang 		 * to avoid freeing the mbuf twice.
4644418919fSjohnjiang 		 */
4654418919fSjohnjiang 		if (ut_params->obuf[i]) {
4664418919fSjohnjiang 			rte_pktmbuf_free(ut_params->obuf[i]);
4674418919fSjohnjiang 			if (ut_params->ibuf[i] == ut_params->obuf[i])
4684418919fSjohnjiang 				ut_params->ibuf[i] = NULL;
4694418919fSjohnjiang 			ut_params->obuf[i] = NULL;
4704418919fSjohnjiang 		}
4714418919fSjohnjiang 		if (ut_params->ibuf[i]) {
4724418919fSjohnjiang 			rte_pktmbuf_free(ut_params->ibuf[i]);
4734418919fSjohnjiang 			ut_params->ibuf[i] = NULL;
4744418919fSjohnjiang 		}
4754418919fSjohnjiang 
4764418919fSjohnjiang 		if (ut_params->testbuf[i]) {
4774418919fSjohnjiang 			rte_pktmbuf_free(ut_params->testbuf[i]);
4784418919fSjohnjiang 			ut_params->testbuf[i] = NULL;
4794418919fSjohnjiang 		}
4804418919fSjohnjiang 	}
4814418919fSjohnjiang 
4824418919fSjohnjiang 	if (ts_params->mbuf_pool != NULL)
4834418919fSjohnjiang 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
4844418919fSjohnjiang 			rte_mempool_avail_count(ts_params->mbuf_pool));
4854418919fSjohnjiang 
4864418919fSjohnjiang 	/* Stop the device */
4874418919fSjohnjiang 	rte_cryptodev_stop(ts_params->valid_dev);
4884418919fSjohnjiang }
4894418919fSjohnjiang 
4904418919fSjohnjiang #define IPSEC_MAX_PAD_SIZE	UINT8_MAX
4914418919fSjohnjiang 
4924418919fSjohnjiang static const uint8_t esp_pad_bytes[IPSEC_MAX_PAD_SIZE] = {
4934418919fSjohnjiang 	1, 2, 3, 4, 5, 6, 7, 8,
4944418919fSjohnjiang 	9, 10, 11, 12, 13, 14, 15, 16,
4954418919fSjohnjiang 	17, 18, 19, 20, 21, 22, 23, 24,
4964418919fSjohnjiang 	25, 26, 27, 28, 29, 30, 31, 32,
4974418919fSjohnjiang 	33, 34, 35, 36, 37, 38, 39, 40,
4984418919fSjohnjiang 	41, 42, 43, 44, 45, 46, 47, 48,
4994418919fSjohnjiang 	49, 50, 51, 52, 53, 54, 55, 56,
5004418919fSjohnjiang 	57, 58, 59, 60, 61, 62, 63, 64,
5014418919fSjohnjiang 	65, 66, 67, 68, 69, 70, 71, 72,
5024418919fSjohnjiang 	73, 74, 75, 76, 77, 78, 79, 80,
5034418919fSjohnjiang 	81, 82, 83, 84, 85, 86, 87, 88,
5044418919fSjohnjiang 	89, 90, 91, 92, 93, 94, 95, 96,
5054418919fSjohnjiang 	97, 98, 99, 100, 101, 102, 103, 104,
5064418919fSjohnjiang 	105, 106, 107, 108, 109, 110, 111, 112,
5074418919fSjohnjiang 	113, 114, 115, 116, 117, 118, 119, 120,
5084418919fSjohnjiang 	121, 122, 123, 124, 125, 126, 127, 128,
5094418919fSjohnjiang 	129, 130, 131, 132, 133, 134, 135, 136,
5104418919fSjohnjiang 	137, 138, 139, 140, 141, 142, 143, 144,
5114418919fSjohnjiang 	145, 146, 147, 148, 149, 150, 151, 152,
5124418919fSjohnjiang 	153, 154, 155, 156, 157, 158, 159, 160,
5134418919fSjohnjiang 	161, 162, 163, 164, 165, 166, 167, 168,
5144418919fSjohnjiang 	169, 170, 171, 172, 173, 174, 175, 176,
5154418919fSjohnjiang 	177, 178, 179, 180, 181, 182, 183, 184,
5164418919fSjohnjiang 	185, 186, 187, 188, 189, 190, 191, 192,
5174418919fSjohnjiang 	193, 194, 195, 196, 197, 198, 199, 200,
5184418919fSjohnjiang 	201, 202, 203, 204, 205, 206, 207, 208,
5194418919fSjohnjiang 	209, 210, 211, 212, 213, 214, 215, 216,
5204418919fSjohnjiang 	217, 218, 219, 220, 221, 222, 223, 224,
5214418919fSjohnjiang 	225, 226, 227, 228, 229, 230, 231, 232,
5224418919fSjohnjiang 	233, 234, 235, 236, 237, 238, 239, 240,
5234418919fSjohnjiang 	241, 242, 243, 244, 245, 246, 247, 248,
5244418919fSjohnjiang 	249, 250, 251, 252, 253, 254, 255,
5254418919fSjohnjiang };
5264418919fSjohnjiang 
5274418919fSjohnjiang /* ***** data for tests ***** */
5284418919fSjohnjiang 
5294418919fSjohnjiang const char null_plain_data[] =
5304418919fSjohnjiang 	"Network Security People Have A Strange Sense Of Humor unlike Other "
5314418919fSjohnjiang 	"People who have a normal sense of humour";
5324418919fSjohnjiang 
5334418919fSjohnjiang const char null_encrypted_data[] =
5344418919fSjohnjiang 	"Network Security People Have A Strange Sense Of Humor unlike Other "
5354418919fSjohnjiang 	"People who have a normal sense of humour";
5364418919fSjohnjiang 
5374418919fSjohnjiang struct rte_ipv4_hdr ipv4_outer  = {
5384418919fSjohnjiang 	.version_ihl = IPVERSION << 4 |
5394418919fSjohnjiang 		sizeof(ipv4_outer) / RTE_IPV4_IHL_MULTIPLIER,
5404418919fSjohnjiang 	.time_to_live = IPDEFTTL,
5414418919fSjohnjiang 	.next_proto_id = IPPROTO_ESP,
5424418919fSjohnjiang 	.src_addr = RTE_IPV4(192, 168, 1, 100),
5434418919fSjohnjiang 	.dst_addr = RTE_IPV4(192, 168, 2, 100),
5444418919fSjohnjiang };
5454418919fSjohnjiang 
5464418919fSjohnjiang static struct rte_mbuf *
setup_test_string(struct rte_mempool * mpool,const char * string,size_t len,uint8_t blocksize)5474418919fSjohnjiang setup_test_string(struct rte_mempool *mpool,
5484418919fSjohnjiang 		const char *string, size_t len, uint8_t blocksize)
5494418919fSjohnjiang {
5504418919fSjohnjiang 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
5514418919fSjohnjiang 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
5524418919fSjohnjiang 
5534418919fSjohnjiang 	if (m) {
5544418919fSjohnjiang 		memset(m->buf_addr, 0, m->buf_len);
5554418919fSjohnjiang 		char *dst = rte_pktmbuf_append(m, t_len);
5564418919fSjohnjiang 
5574418919fSjohnjiang 		if (!dst) {
5584418919fSjohnjiang 			rte_pktmbuf_free(m);
5594418919fSjohnjiang 			return NULL;
5604418919fSjohnjiang 		}
5614418919fSjohnjiang 		if (string != NULL)
5624418919fSjohnjiang 			rte_memcpy(dst, string, t_len);
5634418919fSjohnjiang 		else
5644418919fSjohnjiang 			memset(dst, 0, t_len);
5654418919fSjohnjiang 	}
5664418919fSjohnjiang 
5674418919fSjohnjiang 	return m;
5684418919fSjohnjiang }
5694418919fSjohnjiang 
5704418919fSjohnjiang static struct rte_mbuf *
setup_test_string_tunneled(struct rte_mempool * mpool,const char * string,size_t len,uint32_t spi,uint32_t seq)5714418919fSjohnjiang setup_test_string_tunneled(struct rte_mempool *mpool, const char *string,
5724418919fSjohnjiang 	size_t len, uint32_t spi, uint32_t seq)
5734418919fSjohnjiang {
5744418919fSjohnjiang 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
5754418919fSjohnjiang 	uint32_t hdrlen = sizeof(struct rte_ipv4_hdr) +
5764418919fSjohnjiang 		sizeof(struct rte_esp_hdr);
5774418919fSjohnjiang 	uint32_t taillen = sizeof(struct rte_esp_tail);
5784418919fSjohnjiang 	uint32_t t_len = len + hdrlen + taillen;
5794418919fSjohnjiang 	uint32_t padlen;
5804418919fSjohnjiang 
5814418919fSjohnjiang 	struct rte_esp_hdr esph  = {
5824418919fSjohnjiang 		.spi = rte_cpu_to_be_32(spi),
5834418919fSjohnjiang 		.seq = rte_cpu_to_be_32(seq)
5844418919fSjohnjiang 	};
5854418919fSjohnjiang 
5864418919fSjohnjiang 	padlen = RTE_ALIGN(t_len, 4) - t_len;
5874418919fSjohnjiang 	t_len += padlen;
5884418919fSjohnjiang 
5894418919fSjohnjiang 	struct rte_esp_tail espt = {
5904418919fSjohnjiang 		.pad_len = padlen,
5914418919fSjohnjiang 		.next_proto = IPPROTO_IPIP,
5924418919fSjohnjiang 	};
5934418919fSjohnjiang 
5944418919fSjohnjiang 	if (m == NULL)
5954418919fSjohnjiang 		return NULL;
5964418919fSjohnjiang 
5974418919fSjohnjiang 	memset(m->buf_addr, 0, m->buf_len);
5984418919fSjohnjiang 	char *dst = rte_pktmbuf_append(m, t_len);
5994418919fSjohnjiang 
6004418919fSjohnjiang 	if (!dst) {
6014418919fSjohnjiang 		rte_pktmbuf_free(m);
6024418919fSjohnjiang 		return NULL;
6034418919fSjohnjiang 	}
6044418919fSjohnjiang 	/* copy outer IP and ESP header */
6054418919fSjohnjiang 	ipv4_outer.total_length = rte_cpu_to_be_16(t_len);
6064418919fSjohnjiang 	ipv4_outer.packet_id = rte_cpu_to_be_16(seq);
6074418919fSjohnjiang 	rte_memcpy(dst, &ipv4_outer, sizeof(ipv4_outer));
6084418919fSjohnjiang 	dst += sizeof(ipv4_outer);
6094418919fSjohnjiang 	m->l3_len = sizeof(ipv4_outer);
6104418919fSjohnjiang 	rte_memcpy(dst, &esph, sizeof(esph));
6114418919fSjohnjiang 	dst += sizeof(esph);
6124418919fSjohnjiang 
6134418919fSjohnjiang 	if (string != NULL) {
6144418919fSjohnjiang 		/* copy payload */
6154418919fSjohnjiang 		rte_memcpy(dst, string, len);
6164418919fSjohnjiang 		dst += len;
6174418919fSjohnjiang 		/* copy pad bytes */
6184418919fSjohnjiang 		rte_memcpy(dst, esp_pad_bytes, padlen);
6194418919fSjohnjiang 		dst += padlen;
6204418919fSjohnjiang 		/* copy ESP tail header */
6214418919fSjohnjiang 		rte_memcpy(dst, &espt, sizeof(espt));
6224418919fSjohnjiang 	} else
6234418919fSjohnjiang 		memset(dst, 0, t_len);
6244418919fSjohnjiang 
6254418919fSjohnjiang 	return m;
6264418919fSjohnjiang }
6274418919fSjohnjiang 
6284418919fSjohnjiang static int
create_dummy_sec_session(struct ipsec_unitest_params * ut,struct rte_cryptodev_qp_conf * qp,uint32_t j)6294418919fSjohnjiang create_dummy_sec_session(struct ipsec_unitest_params *ut,
6304418919fSjohnjiang 	struct rte_cryptodev_qp_conf *qp, uint32_t j)
6314418919fSjohnjiang {
6324418919fSjohnjiang 	static struct rte_security_session_conf conf;
6334418919fSjohnjiang 
6344418919fSjohnjiang 	ut->ss[j].security.ses = rte_security_session_create(&dummy_sec_ctx,
635*2d9fd380Sjfb8856606 					&conf, qp->mp_session,
636*2d9fd380Sjfb8856606 					qp->mp_session_private);
6374418919fSjohnjiang 
6384418919fSjohnjiang 	if (ut->ss[j].security.ses == NULL)
6394418919fSjohnjiang 		return -ENOMEM;
6404418919fSjohnjiang 
6414418919fSjohnjiang 	ut->ss[j].security.ctx = &dummy_sec_ctx;
6424418919fSjohnjiang 	ut->ss[j].security.ol_flags = 0;
6434418919fSjohnjiang 	return 0;
6444418919fSjohnjiang }
6454418919fSjohnjiang 
6464418919fSjohnjiang static int
create_crypto_session(struct ipsec_unitest_params * ut,struct rte_cryptodev_qp_conf * qp,uint8_t dev_id,uint32_t j)6474418919fSjohnjiang create_crypto_session(struct ipsec_unitest_params *ut,
6484418919fSjohnjiang 	struct rte_cryptodev_qp_conf *qp, uint8_t dev_id, uint32_t j)
6494418919fSjohnjiang {
6504418919fSjohnjiang 	int32_t rc;
6514418919fSjohnjiang 	struct rte_cryptodev_sym_session *s;
6524418919fSjohnjiang 
6534418919fSjohnjiang 	s = rte_cryptodev_sym_session_create(qp->mp_session);
6544418919fSjohnjiang 	if (s == NULL)
6554418919fSjohnjiang 		return -ENOMEM;
6564418919fSjohnjiang 
6574418919fSjohnjiang 	/* initiliaze SA crypto session for device */
6584418919fSjohnjiang 	rc = rte_cryptodev_sym_session_init(dev_id, s,
6594418919fSjohnjiang 			ut->crypto_xforms, qp->mp_session_private);
6604418919fSjohnjiang 	if (rc == 0) {
6614418919fSjohnjiang 		ut->ss[j].crypto.ses = s;
6624418919fSjohnjiang 		return 0;
6634418919fSjohnjiang 	} else {
6644418919fSjohnjiang 		/* failure, do cleanup */
6654418919fSjohnjiang 		rte_cryptodev_sym_session_clear(dev_id, s);
6664418919fSjohnjiang 		rte_cryptodev_sym_session_free(s);
6674418919fSjohnjiang 		return rc;
6684418919fSjohnjiang 	}
6694418919fSjohnjiang }
6704418919fSjohnjiang 
6714418919fSjohnjiang static int
create_session(struct ipsec_unitest_params * ut,struct rte_cryptodev_qp_conf * qp,uint8_t crypto_dev,uint32_t j)6724418919fSjohnjiang create_session(struct ipsec_unitest_params *ut,
6734418919fSjohnjiang 	struct rte_cryptodev_qp_conf *qp, uint8_t crypto_dev, uint32_t j)
6744418919fSjohnjiang {
6754418919fSjohnjiang 	if (ut->ss[j].type == RTE_SECURITY_ACTION_TYPE_NONE)
6764418919fSjohnjiang 		return create_crypto_session(ut, qp, crypto_dev, j);
6774418919fSjohnjiang 	else
6784418919fSjohnjiang 		return create_dummy_sec_session(ut, qp, j);
6794418919fSjohnjiang }
6804418919fSjohnjiang 
6814418919fSjohnjiang static int
fill_ipsec_param(uint32_t replay_win_sz,uint64_t flags)6824418919fSjohnjiang fill_ipsec_param(uint32_t replay_win_sz, uint64_t flags)
6834418919fSjohnjiang {
6844418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
6854418919fSjohnjiang 	struct rte_ipsec_sa_prm *prm = &ut_params->sa_prm;
6864418919fSjohnjiang 	const struct supported_auth_algo *auth_algo;
6874418919fSjohnjiang 	const struct supported_cipher_algo *cipher_algo;
6884418919fSjohnjiang 
6894418919fSjohnjiang 	memset(prm, 0, sizeof(*prm));
6904418919fSjohnjiang 
6914418919fSjohnjiang 	prm->userdata = 1;
6924418919fSjohnjiang 	prm->flags = flags;
6934418919fSjohnjiang 
6944418919fSjohnjiang 	/* setup ipsec xform */
6954418919fSjohnjiang 	prm->ipsec_xform = ut_params->ipsec_xform;
6964418919fSjohnjiang 	prm->ipsec_xform.salt = (uint32_t)rte_rand();
6974418919fSjohnjiang 	prm->ipsec_xform.replay_win_sz = replay_win_sz;
6984418919fSjohnjiang 
6994418919fSjohnjiang 	/* setup tunnel related fields */
7004418919fSjohnjiang 	prm->tun.hdr_len = sizeof(ipv4_outer);
7014418919fSjohnjiang 	prm->tun.next_proto = IPPROTO_IPIP;
7024418919fSjohnjiang 	prm->tun.hdr = &ipv4_outer;
7034418919fSjohnjiang 
7044418919fSjohnjiang 	/* setup crypto section */
7054418919fSjohnjiang 	if (uparams.aead != 0) {
7064418919fSjohnjiang 		/* TODO: will need to fill out with other test cases */
7074418919fSjohnjiang 	} else {
7084418919fSjohnjiang 		if (uparams.auth == 0 && uparams.cipher == 0)
7094418919fSjohnjiang 			return TEST_FAILED;
7104418919fSjohnjiang 
7114418919fSjohnjiang 		auth_algo = find_match_auth_algo(uparams.auth_algo);
7124418919fSjohnjiang 		cipher_algo = find_match_cipher_algo(uparams.cipher_algo);
7134418919fSjohnjiang 
7144418919fSjohnjiang 		fill_crypto_xform(ut_params, auth_algo, cipher_algo);
7154418919fSjohnjiang 	}
7164418919fSjohnjiang 
7174418919fSjohnjiang 	prm->crypto_xform = ut_params->crypto_xforms;
7184418919fSjohnjiang 	return TEST_SUCCESS;
7194418919fSjohnjiang }
7204418919fSjohnjiang 
7214418919fSjohnjiang static int
create_sa(enum rte_security_session_action_type action_type,uint32_t replay_win_sz,uint64_t flags,uint32_t j)7224418919fSjohnjiang create_sa(enum rte_security_session_action_type action_type,
7234418919fSjohnjiang 		uint32_t replay_win_sz, uint64_t flags, uint32_t j)
7244418919fSjohnjiang {
7254418919fSjohnjiang 	struct ipsec_testsuite_params *ts = &testsuite_params;
7264418919fSjohnjiang 	struct ipsec_unitest_params *ut = &unittest_params;
7274418919fSjohnjiang 	size_t sz;
7284418919fSjohnjiang 	int rc;
7294418919fSjohnjiang 
7304418919fSjohnjiang 	memset(&ut->ss[j], 0, sizeof(ut->ss[j]));
7314418919fSjohnjiang 
7324418919fSjohnjiang 	rc = fill_ipsec_param(replay_win_sz, flags);
7334418919fSjohnjiang 	if (rc != 0)
7344418919fSjohnjiang 		return TEST_FAILED;
7354418919fSjohnjiang 
7364418919fSjohnjiang 	/* create rte_ipsec_sa*/
7374418919fSjohnjiang 	sz = rte_ipsec_sa_size(&ut->sa_prm);
7384418919fSjohnjiang 	TEST_ASSERT(sz > 0, "rte_ipsec_sa_size() failed\n");
7394418919fSjohnjiang 
7404418919fSjohnjiang 	ut->ss[j].sa = rte_zmalloc(NULL, sz, RTE_CACHE_LINE_SIZE);
7414418919fSjohnjiang 	TEST_ASSERT_NOT_NULL(ut->ss[j].sa,
7424418919fSjohnjiang 		"failed to allocate memory for rte_ipsec_sa\n");
7434418919fSjohnjiang 
7444418919fSjohnjiang 	ut->ss[j].type = action_type;
7454418919fSjohnjiang 	rc = create_session(ut, &ts->qp_conf, ts->valid_dev, j);
7464418919fSjohnjiang 	if (rc != 0)
7474418919fSjohnjiang 		return TEST_FAILED;
7484418919fSjohnjiang 
7494418919fSjohnjiang 	rc = rte_ipsec_sa_init(ut->ss[j].sa, &ut->sa_prm, sz);
7504418919fSjohnjiang 	rc = (rc > 0 && (uint32_t)rc <= sz) ? 0 : -EINVAL;
7514418919fSjohnjiang 	if (rc == 0)
7524418919fSjohnjiang 		rc = rte_ipsec_session_prepare(&ut->ss[j]);
7534418919fSjohnjiang 
7544418919fSjohnjiang 	return rc;
7554418919fSjohnjiang }
7564418919fSjohnjiang 
7574418919fSjohnjiang static int
crypto_dequeue_burst(uint16_t num_pkts)7584418919fSjohnjiang crypto_dequeue_burst(uint16_t num_pkts)
7594418919fSjohnjiang {
7604418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
7614418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
7624418919fSjohnjiang 	uint32_t pkt_cnt, k;
7634418919fSjohnjiang 	int i;
7644418919fSjohnjiang 
7654418919fSjohnjiang 	for (i = 0, pkt_cnt = 0;
7664418919fSjohnjiang 		i < DEQUEUE_COUNT && pkt_cnt != num_pkts; i++) {
7674418919fSjohnjiang 		k = rte_cryptodev_dequeue_burst(ts_params->valid_dev, 0,
7684418919fSjohnjiang 			&ut_params->cop[pkt_cnt], num_pkts - pkt_cnt);
7694418919fSjohnjiang 		pkt_cnt += k;
7704418919fSjohnjiang 		rte_delay_us(1);
7714418919fSjohnjiang 	}
7724418919fSjohnjiang 
7734418919fSjohnjiang 	if (pkt_cnt != num_pkts) {
7744418919fSjohnjiang 		RTE_LOG(ERR, USER1, "rte_cryptodev_dequeue_burst fail\n");
7754418919fSjohnjiang 		return TEST_FAILED;
7764418919fSjohnjiang 	}
7774418919fSjohnjiang 	return TEST_SUCCESS;
7784418919fSjohnjiang }
7794418919fSjohnjiang 
7804418919fSjohnjiang static int
crypto_ipsec(uint16_t num_pkts)7814418919fSjohnjiang crypto_ipsec(uint16_t num_pkts)
7824418919fSjohnjiang {
7834418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
7844418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
7854418919fSjohnjiang 	uint32_t k, ng;
7864418919fSjohnjiang 	struct rte_ipsec_group grp[1];
7874418919fSjohnjiang 
7884418919fSjohnjiang 	/* call crypto prepare */
7894418919fSjohnjiang 	k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[0], ut_params->ibuf,
7904418919fSjohnjiang 		ut_params->cop, num_pkts);
7914418919fSjohnjiang 	if (k != num_pkts) {
7924418919fSjohnjiang 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_prepare fail\n");
7934418919fSjohnjiang 		return TEST_FAILED;
7944418919fSjohnjiang 	}
7954418919fSjohnjiang 
7964418919fSjohnjiang 	k = rte_cryptodev_enqueue_burst(ts_params->valid_dev, 0,
7974418919fSjohnjiang 		ut_params->cop, num_pkts);
7984418919fSjohnjiang 	if (k != num_pkts) {
7994418919fSjohnjiang 		RTE_LOG(ERR, USER1, "rte_cryptodev_enqueue_burst fail\n");
8004418919fSjohnjiang 		return TEST_FAILED;
8014418919fSjohnjiang 	}
8024418919fSjohnjiang 
8034418919fSjohnjiang 	if (crypto_dequeue_burst(num_pkts) == TEST_FAILED)
8044418919fSjohnjiang 		return TEST_FAILED;
8054418919fSjohnjiang 
8064418919fSjohnjiang 	ng = rte_ipsec_pkt_crypto_group(
8074418919fSjohnjiang 		(const struct rte_crypto_op **)(uintptr_t)ut_params->cop,
8084418919fSjohnjiang 		ut_params->obuf, grp, num_pkts);
8094418919fSjohnjiang 	if (ng != 1 ||
8104418919fSjohnjiang 		grp[0].m[0] != ut_params->obuf[0] ||
8114418919fSjohnjiang 		grp[0].cnt != num_pkts ||
8124418919fSjohnjiang 		grp[0].id.ptr != &ut_params->ss[0]) {
8134418919fSjohnjiang 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail\n");
8144418919fSjohnjiang 		return TEST_FAILED;
8154418919fSjohnjiang 	}
8164418919fSjohnjiang 
8174418919fSjohnjiang 	/* call crypto process */
8184418919fSjohnjiang 	k = rte_ipsec_pkt_process(grp[0].id.ptr, grp[0].m, grp[0].cnt);
8194418919fSjohnjiang 	if (k != num_pkts) {
8204418919fSjohnjiang 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_process fail\n");
8214418919fSjohnjiang 		return TEST_FAILED;
8224418919fSjohnjiang 	}
8234418919fSjohnjiang 
8244418919fSjohnjiang 	return TEST_SUCCESS;
8254418919fSjohnjiang }
8264418919fSjohnjiang 
8274418919fSjohnjiang static int
lksd_proto_ipsec(uint16_t num_pkts)8284418919fSjohnjiang lksd_proto_ipsec(uint16_t num_pkts)
8294418919fSjohnjiang {
8304418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
8314418919fSjohnjiang 	uint32_t i, k, ng;
8324418919fSjohnjiang 	struct rte_ipsec_group grp[1];
8334418919fSjohnjiang 
8344418919fSjohnjiang 	/* call crypto prepare */
8354418919fSjohnjiang 	k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[0], ut_params->ibuf,
8364418919fSjohnjiang 		ut_params->cop, num_pkts);
8374418919fSjohnjiang 	if (k != num_pkts) {
8384418919fSjohnjiang 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_prepare fail\n");
8394418919fSjohnjiang 		return TEST_FAILED;
8404418919fSjohnjiang 	}
8414418919fSjohnjiang 
8424418919fSjohnjiang 	/* check crypto ops */
8434418919fSjohnjiang 	for (i = 0; i != num_pkts; i++) {
8444418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->cop[i]->type,
8454418919fSjohnjiang 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
8464418919fSjohnjiang 			"%s: invalid crypto op type for %u-th packet\n",
8474418919fSjohnjiang 			__func__, i);
8484418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->cop[i]->status,
8494418919fSjohnjiang 			RTE_CRYPTO_OP_STATUS_NOT_PROCESSED,
8504418919fSjohnjiang 			"%s: invalid crypto op status for %u-th packet\n",
8514418919fSjohnjiang 			__func__, i);
8524418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->cop[i]->sess_type,
8534418919fSjohnjiang 			RTE_CRYPTO_OP_SECURITY_SESSION,
8544418919fSjohnjiang 			"%s: invalid crypto op sess_type for %u-th packet\n",
8554418919fSjohnjiang 			__func__, i);
8564418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->cop[i]->sym->m_src,
8574418919fSjohnjiang 			ut_params->ibuf[i],
8584418919fSjohnjiang 			"%s: invalid crypto op m_src for %u-th packet\n",
8594418919fSjohnjiang 			__func__, i);
8604418919fSjohnjiang 	}
8614418919fSjohnjiang 
8624418919fSjohnjiang 	/* update crypto ops, pretend all finished ok */
8634418919fSjohnjiang 	for (i = 0; i != num_pkts; i++)
8644418919fSjohnjiang 		ut_params->cop[i]->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
8654418919fSjohnjiang 
8664418919fSjohnjiang 	ng = rte_ipsec_pkt_crypto_group(
8674418919fSjohnjiang 		(const struct rte_crypto_op **)(uintptr_t)ut_params->cop,
8684418919fSjohnjiang 		ut_params->obuf, grp, num_pkts);
8694418919fSjohnjiang 	if (ng != 1 ||
8704418919fSjohnjiang 		grp[0].m[0] != ut_params->obuf[0] ||
8714418919fSjohnjiang 		grp[0].cnt != num_pkts ||
8724418919fSjohnjiang 		grp[0].id.ptr != &ut_params->ss[0]) {
8734418919fSjohnjiang 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail\n");
8744418919fSjohnjiang 		return TEST_FAILED;
8754418919fSjohnjiang 	}
8764418919fSjohnjiang 
8774418919fSjohnjiang 	/* call crypto process */
8784418919fSjohnjiang 	k = rte_ipsec_pkt_process(grp[0].id.ptr, grp[0].m, grp[0].cnt);
8794418919fSjohnjiang 	if (k != num_pkts) {
8804418919fSjohnjiang 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_process fail\n");
8814418919fSjohnjiang 		return TEST_FAILED;
8824418919fSjohnjiang 	}
8834418919fSjohnjiang 
8844418919fSjohnjiang 	return TEST_SUCCESS;
8854418919fSjohnjiang }
8864418919fSjohnjiang 
8874418919fSjohnjiang static void
dump_grp_pkt(uint32_t i,struct rte_ipsec_group * grp,uint32_t k)8884418919fSjohnjiang dump_grp_pkt(uint32_t i, struct rte_ipsec_group *grp, uint32_t k)
8894418919fSjohnjiang {
8904418919fSjohnjiang 	RTE_LOG(ERR, USER1,
8914418919fSjohnjiang 		"After rte_ipsec_pkt_process grp[%d].cnt=%d k=%d fail\n",
8924418919fSjohnjiang 		i, grp[i].cnt, k);
8934418919fSjohnjiang 	RTE_LOG(ERR, USER1,
8944418919fSjohnjiang 		"After rte_ipsec_pkt_process grp[%d].m=%p grp[%d].m[%d]=%p\n",
8954418919fSjohnjiang 		i, grp[i].m, i, k, grp[i].m[k]);
8964418919fSjohnjiang 
8974418919fSjohnjiang 	rte_pktmbuf_dump(stdout, grp[i].m[k], grp[i].m[k]->data_len);
8984418919fSjohnjiang }
8994418919fSjohnjiang 
9004418919fSjohnjiang static int
crypto_ipsec_2sa(void)9014418919fSjohnjiang crypto_ipsec_2sa(void)
9024418919fSjohnjiang {
9034418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
9044418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
9054418919fSjohnjiang 	struct rte_ipsec_group grp[BURST_SIZE];
9064418919fSjohnjiang 	uint32_t k, ng, i, r;
9074418919fSjohnjiang 
9084418919fSjohnjiang 	for (i = 0; i < BURST_SIZE; i++) {
9094418919fSjohnjiang 		r = i % 2;
9104418919fSjohnjiang 		/* call crypto prepare */
9114418919fSjohnjiang 		k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[r],
9124418919fSjohnjiang 				ut_params->ibuf + i, ut_params->cop + i, 1);
9134418919fSjohnjiang 		if (k != 1) {
9144418919fSjohnjiang 			RTE_LOG(ERR, USER1,
9154418919fSjohnjiang 				"rte_ipsec_pkt_crypto_prepare fail\n");
9164418919fSjohnjiang 			return TEST_FAILED;
9174418919fSjohnjiang 		}
9184418919fSjohnjiang 		k = rte_cryptodev_enqueue_burst(ts_params->valid_dev, 0,
9194418919fSjohnjiang 				ut_params->cop + i, 1);
9204418919fSjohnjiang 		if (k != 1) {
9214418919fSjohnjiang 			RTE_LOG(ERR, USER1,
9224418919fSjohnjiang 				"rte_cryptodev_enqueue_burst fail\n");
9234418919fSjohnjiang 			return TEST_FAILED;
9244418919fSjohnjiang 		}
9254418919fSjohnjiang 	}
9264418919fSjohnjiang 
9274418919fSjohnjiang 	if (crypto_dequeue_burst(BURST_SIZE) == TEST_FAILED)
9284418919fSjohnjiang 		return TEST_FAILED;
9294418919fSjohnjiang 
9304418919fSjohnjiang 	ng = rte_ipsec_pkt_crypto_group(
9314418919fSjohnjiang 		(const struct rte_crypto_op **)(uintptr_t)ut_params->cop,
9324418919fSjohnjiang 		ut_params->obuf, grp, BURST_SIZE);
9334418919fSjohnjiang 	if (ng != BURST_SIZE) {
9344418919fSjohnjiang 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail ng=%d\n",
9354418919fSjohnjiang 			ng);
9364418919fSjohnjiang 		return TEST_FAILED;
9374418919fSjohnjiang 	}
9384418919fSjohnjiang 
9394418919fSjohnjiang 	/* call crypto process */
9404418919fSjohnjiang 	for (i = 0; i < ng; i++) {
9414418919fSjohnjiang 		k = rte_ipsec_pkt_process(grp[i].id.ptr, grp[i].m, grp[i].cnt);
9424418919fSjohnjiang 		if (k != grp[i].cnt) {
9434418919fSjohnjiang 			dump_grp_pkt(i, grp, k);
9444418919fSjohnjiang 			return TEST_FAILED;
9454418919fSjohnjiang 		}
9464418919fSjohnjiang 	}
9474418919fSjohnjiang 	return TEST_SUCCESS;
9484418919fSjohnjiang }
9494418919fSjohnjiang 
9504418919fSjohnjiang #define PKT_4	4
9514418919fSjohnjiang #define PKT_12	12
9524418919fSjohnjiang #define PKT_21	21
9534418919fSjohnjiang 
9544418919fSjohnjiang static uint32_t
crypto_ipsec_4grp(uint32_t pkt_num)9554418919fSjohnjiang crypto_ipsec_4grp(uint32_t pkt_num)
9564418919fSjohnjiang {
9574418919fSjohnjiang 	uint32_t sa_ind;
9584418919fSjohnjiang 
9594418919fSjohnjiang 	/* group packets in 4 different size groups groups, 2 per SA */
9604418919fSjohnjiang 	if (pkt_num < PKT_4)
9614418919fSjohnjiang 		sa_ind = 0;
9624418919fSjohnjiang 	else if (pkt_num < PKT_12)
9634418919fSjohnjiang 		sa_ind = 1;
9644418919fSjohnjiang 	else if (pkt_num < PKT_21)
9654418919fSjohnjiang 		sa_ind = 0;
9664418919fSjohnjiang 	else
9674418919fSjohnjiang 		sa_ind = 1;
9684418919fSjohnjiang 
9694418919fSjohnjiang 	return sa_ind;
9704418919fSjohnjiang }
9714418919fSjohnjiang 
9724418919fSjohnjiang static uint32_t
crypto_ipsec_4grp_check_mbufs(uint32_t grp_ind,struct rte_ipsec_group * grp)9734418919fSjohnjiang crypto_ipsec_4grp_check_mbufs(uint32_t grp_ind, struct rte_ipsec_group *grp)
9744418919fSjohnjiang {
9754418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
9764418919fSjohnjiang 	uint32_t i, j;
9774418919fSjohnjiang 	uint32_t rc = 0;
9784418919fSjohnjiang 
9794418919fSjohnjiang 	if (grp_ind == 0) {
9804418919fSjohnjiang 		for (i = 0, j = 0; i < PKT_4; i++, j++)
9814418919fSjohnjiang 			if (grp[grp_ind].m[i] != ut_params->obuf[j]) {
9824418919fSjohnjiang 				rc = TEST_FAILED;
9834418919fSjohnjiang 				break;
9844418919fSjohnjiang 			}
9854418919fSjohnjiang 	} else if (grp_ind == 1) {
9864418919fSjohnjiang 		for (i = 0, j = PKT_4; i < (PKT_12 - PKT_4); i++, j++) {
9874418919fSjohnjiang 			if (grp[grp_ind].m[i] != ut_params->obuf[j]) {
9884418919fSjohnjiang 				rc = TEST_FAILED;
9894418919fSjohnjiang 				break;
9904418919fSjohnjiang 			}
9914418919fSjohnjiang 		}
9924418919fSjohnjiang 	} else if (grp_ind == 2) {
9934418919fSjohnjiang 		for (i = 0, j =  PKT_12; i < (PKT_21 - PKT_12); i++, j++)
9944418919fSjohnjiang 			if (grp[grp_ind].m[i] != ut_params->obuf[j]) {
9954418919fSjohnjiang 				rc = TEST_FAILED;
9964418919fSjohnjiang 				break;
9974418919fSjohnjiang 			}
9984418919fSjohnjiang 	} else if (grp_ind == 3) {
9994418919fSjohnjiang 		for (i = 0, j = PKT_21; i < (BURST_SIZE - PKT_21); i++, j++)
10004418919fSjohnjiang 			if (grp[grp_ind].m[i] != ut_params->obuf[j]) {
10014418919fSjohnjiang 				rc = TEST_FAILED;
10024418919fSjohnjiang 				break;
10034418919fSjohnjiang 			}
10044418919fSjohnjiang 	} else
10054418919fSjohnjiang 		rc = TEST_FAILED;
10064418919fSjohnjiang 
10074418919fSjohnjiang 	return rc;
10084418919fSjohnjiang }
10094418919fSjohnjiang 
10104418919fSjohnjiang static uint32_t
crypto_ipsec_4grp_check_cnt(uint32_t grp_ind,struct rte_ipsec_group * grp)10114418919fSjohnjiang crypto_ipsec_4grp_check_cnt(uint32_t grp_ind, struct rte_ipsec_group *grp)
10124418919fSjohnjiang {
10134418919fSjohnjiang 	uint32_t rc = 0;
10144418919fSjohnjiang 
10154418919fSjohnjiang 	if (grp_ind == 0) {
10164418919fSjohnjiang 		if (grp[grp_ind].cnt != PKT_4)
10174418919fSjohnjiang 			rc = TEST_FAILED;
10184418919fSjohnjiang 	} else if (grp_ind == 1) {
10194418919fSjohnjiang 		if (grp[grp_ind].cnt != PKT_12 - PKT_4)
10204418919fSjohnjiang 			rc = TEST_FAILED;
10214418919fSjohnjiang 	} else if (grp_ind == 2) {
10224418919fSjohnjiang 		if (grp[grp_ind].cnt != PKT_21 - PKT_12)
10234418919fSjohnjiang 			rc = TEST_FAILED;
10244418919fSjohnjiang 	} else if (grp_ind == 3) {
10254418919fSjohnjiang 		if (grp[grp_ind].cnt != BURST_SIZE - PKT_21)
10264418919fSjohnjiang 			rc = TEST_FAILED;
10274418919fSjohnjiang 	} else
10284418919fSjohnjiang 		rc = TEST_FAILED;
10294418919fSjohnjiang 
10304418919fSjohnjiang 	return rc;
10314418919fSjohnjiang }
10324418919fSjohnjiang 
10334418919fSjohnjiang static int
crypto_ipsec_2sa_4grp(void)10344418919fSjohnjiang crypto_ipsec_2sa_4grp(void)
10354418919fSjohnjiang {
10364418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
10374418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
10384418919fSjohnjiang 	struct rte_ipsec_group grp[BURST_SIZE];
10394418919fSjohnjiang 	uint32_t k, ng, i, j;
10404418919fSjohnjiang 	uint32_t rc = 0;
10414418919fSjohnjiang 
10424418919fSjohnjiang 	for (i = 0; i < BURST_SIZE; i++) {
10434418919fSjohnjiang 		j = crypto_ipsec_4grp(i);
10444418919fSjohnjiang 
10454418919fSjohnjiang 		/* call crypto prepare */
10464418919fSjohnjiang 		k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[j],
10474418919fSjohnjiang 				ut_params->ibuf + i, ut_params->cop + i, 1);
10484418919fSjohnjiang 		if (k != 1) {
10494418919fSjohnjiang 			RTE_LOG(ERR, USER1,
10504418919fSjohnjiang 				"rte_ipsec_pkt_crypto_prepare fail\n");
10514418919fSjohnjiang 			return TEST_FAILED;
10524418919fSjohnjiang 		}
10534418919fSjohnjiang 		k = rte_cryptodev_enqueue_burst(ts_params->valid_dev, 0,
10544418919fSjohnjiang 				ut_params->cop + i, 1);
10554418919fSjohnjiang 		if (k != 1) {
10564418919fSjohnjiang 			RTE_LOG(ERR, USER1,
10574418919fSjohnjiang 				"rte_cryptodev_enqueue_burst fail\n");
10584418919fSjohnjiang 			return TEST_FAILED;
10594418919fSjohnjiang 		}
10604418919fSjohnjiang 	}
10614418919fSjohnjiang 
10624418919fSjohnjiang 	if (crypto_dequeue_burst(BURST_SIZE) == TEST_FAILED)
10634418919fSjohnjiang 		return TEST_FAILED;
10644418919fSjohnjiang 
10654418919fSjohnjiang 	ng = rte_ipsec_pkt_crypto_group(
10664418919fSjohnjiang 		(const struct rte_crypto_op **)(uintptr_t)ut_params->cop,
10674418919fSjohnjiang 		ut_params->obuf, grp, BURST_SIZE);
10684418919fSjohnjiang 	if (ng != 4) {
10694418919fSjohnjiang 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail ng=%d\n",
10704418919fSjohnjiang 			ng);
10714418919fSjohnjiang 		return TEST_FAILED;
10724418919fSjohnjiang 	}
10734418919fSjohnjiang 
10744418919fSjohnjiang 	/* call crypto process */
10754418919fSjohnjiang 	for (i = 0; i < ng; i++) {
10764418919fSjohnjiang 		k = rte_ipsec_pkt_process(grp[i].id.ptr, grp[i].m, grp[i].cnt);
10774418919fSjohnjiang 		if (k != grp[i].cnt) {
10784418919fSjohnjiang 			dump_grp_pkt(i, grp, k);
10794418919fSjohnjiang 			return TEST_FAILED;
10804418919fSjohnjiang 		}
10814418919fSjohnjiang 		rc = crypto_ipsec_4grp_check_cnt(i, grp);
10824418919fSjohnjiang 		if (rc != 0) {
10834418919fSjohnjiang 			RTE_LOG(ERR, USER1,
10844418919fSjohnjiang 				"crypto_ipsec_4grp_check_cnt fail\n");
10854418919fSjohnjiang 			return TEST_FAILED;
10864418919fSjohnjiang 		}
10874418919fSjohnjiang 		rc = crypto_ipsec_4grp_check_mbufs(i, grp);
10884418919fSjohnjiang 		if (rc != 0) {
10894418919fSjohnjiang 			RTE_LOG(ERR, USER1,
10904418919fSjohnjiang 				"crypto_ipsec_4grp_check_mbufs fail\n");
10914418919fSjohnjiang 			return TEST_FAILED;
10924418919fSjohnjiang 		}
10934418919fSjohnjiang 	}
10944418919fSjohnjiang 	return TEST_SUCCESS;
10954418919fSjohnjiang }
10964418919fSjohnjiang 
10974418919fSjohnjiang static void
test_ipsec_reorder_inb_pkt_burst(uint16_t num_pkts)10984418919fSjohnjiang test_ipsec_reorder_inb_pkt_burst(uint16_t num_pkts)
10994418919fSjohnjiang {
11004418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
11014418919fSjohnjiang 	struct rte_mbuf *ibuf_tmp[BURST_SIZE];
11024418919fSjohnjiang 	uint16_t j;
11034418919fSjohnjiang 
11044418919fSjohnjiang 	/* reorder packets and create gaps in sequence numbers */
11054418919fSjohnjiang 	static const uint32_t reorder[BURST_SIZE] = {
11064418919fSjohnjiang 			24, 25, 26, 27, 28, 29, 30, 31,
11074418919fSjohnjiang 			16, 17, 18, 19, 20, 21, 22, 23,
11084418919fSjohnjiang 			8, 9, 10, 11, 12, 13, 14, 15,
11094418919fSjohnjiang 			0, 1, 2, 3, 4, 5, 6, 7,
11104418919fSjohnjiang 	};
11114418919fSjohnjiang 
11124418919fSjohnjiang 	if (num_pkts != BURST_SIZE)
11134418919fSjohnjiang 		return;
11144418919fSjohnjiang 
11154418919fSjohnjiang 	for (j = 0; j != BURST_SIZE; j++)
11164418919fSjohnjiang 		ibuf_tmp[j] = ut_params->ibuf[reorder[j]];
11174418919fSjohnjiang 
11184418919fSjohnjiang 	memcpy(ut_params->ibuf, ibuf_tmp, sizeof(ut_params->ibuf));
11194418919fSjohnjiang }
11204418919fSjohnjiang 
11214418919fSjohnjiang static int
test_ipsec_crypto_op_alloc(uint16_t num_pkts)11224418919fSjohnjiang test_ipsec_crypto_op_alloc(uint16_t num_pkts)
11234418919fSjohnjiang {
11244418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
11254418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
11264418919fSjohnjiang 	int rc = 0;
11274418919fSjohnjiang 	uint16_t j;
11284418919fSjohnjiang 
11294418919fSjohnjiang 	for (j = 0; j < num_pkts && rc == 0; j++) {
11304418919fSjohnjiang 		ut_params->cop[j] = rte_crypto_op_alloc(ts_params->cop_mpool,
11314418919fSjohnjiang 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11324418919fSjohnjiang 		if (ut_params->cop[j] == NULL) {
11334418919fSjohnjiang 			RTE_LOG(ERR, USER1,
11344418919fSjohnjiang 				"Failed to allocate symmetric crypto op\n");
11354418919fSjohnjiang 			rc = TEST_FAILED;
11364418919fSjohnjiang 		}
11374418919fSjohnjiang 	}
11384418919fSjohnjiang 
11394418919fSjohnjiang 	return rc;
11404418919fSjohnjiang }
11414418919fSjohnjiang 
11424418919fSjohnjiang static void
test_ipsec_dump_buffers(struct ipsec_unitest_params * ut_params,int i)11434418919fSjohnjiang test_ipsec_dump_buffers(struct ipsec_unitest_params *ut_params, int i)
11444418919fSjohnjiang {
11454418919fSjohnjiang 	uint16_t j = ut_params->pkt_index;
11464418919fSjohnjiang 
11474418919fSjohnjiang 	printf("\ntest config: num %d\n", i);
11484418919fSjohnjiang 	printf("	replay_win_sz %u\n", test_cfg[i].replay_win_sz);
11494418919fSjohnjiang 	printf("	esn %u\n", test_cfg[i].esn);
11504418919fSjohnjiang 	printf("	flags 0x%" PRIx64 "\n", test_cfg[i].flags);
11514418919fSjohnjiang 	printf("	pkt_sz %zu\n", test_cfg[i].pkt_sz);
11524418919fSjohnjiang 	printf("	num_pkts %u\n\n", test_cfg[i].num_pkts);
11534418919fSjohnjiang 
11544418919fSjohnjiang 	if (ut_params->ibuf[j]) {
11554418919fSjohnjiang 		printf("ibuf[%u] data:\n", j);
11564418919fSjohnjiang 		rte_pktmbuf_dump(stdout, ut_params->ibuf[j],
11574418919fSjohnjiang 			ut_params->ibuf[j]->data_len);
11584418919fSjohnjiang 	}
11594418919fSjohnjiang 	if (ut_params->obuf[j]) {
11604418919fSjohnjiang 		printf("obuf[%u] data:\n", j);
11614418919fSjohnjiang 		rte_pktmbuf_dump(stdout, ut_params->obuf[j],
11624418919fSjohnjiang 			ut_params->obuf[j]->data_len);
11634418919fSjohnjiang 	}
11644418919fSjohnjiang 	if (ut_params->testbuf[j]) {
11654418919fSjohnjiang 		printf("testbuf[%u] data:\n", j);
11664418919fSjohnjiang 		rte_pktmbuf_dump(stdout, ut_params->testbuf[j],
11674418919fSjohnjiang 			ut_params->testbuf[j]->data_len);
11684418919fSjohnjiang 	}
11694418919fSjohnjiang }
11704418919fSjohnjiang 
11714418919fSjohnjiang static void
destroy_dummy_sec_session(struct ipsec_unitest_params * ut,uint32_t j)11720c6bd470Sfengbojiang destroy_dummy_sec_session(struct ipsec_unitest_params *ut,
11730c6bd470Sfengbojiang 	uint32_t j)
11740c6bd470Sfengbojiang {
11750c6bd470Sfengbojiang 	rte_security_session_destroy(&dummy_sec_ctx,
11760c6bd470Sfengbojiang 					ut->ss[j].security.ses);
11770c6bd470Sfengbojiang 	ut->ss[j].security.ctx = NULL;
11780c6bd470Sfengbojiang }
11790c6bd470Sfengbojiang 
11800c6bd470Sfengbojiang static void
destroy_crypto_session(struct ipsec_unitest_params * ut,uint8_t crypto_dev,uint32_t j)11810c6bd470Sfengbojiang destroy_crypto_session(struct ipsec_unitest_params *ut,
11820c6bd470Sfengbojiang 	uint8_t crypto_dev, uint32_t j)
11830c6bd470Sfengbojiang {
11840c6bd470Sfengbojiang 	rte_cryptodev_sym_session_clear(crypto_dev, ut->ss[j].crypto.ses);
11850c6bd470Sfengbojiang 	rte_cryptodev_sym_session_free(ut->ss[j].crypto.ses);
11860c6bd470Sfengbojiang 	memset(&ut->ss[j], 0, sizeof(ut->ss[j]));
11870c6bd470Sfengbojiang }
11880c6bd470Sfengbojiang 
11890c6bd470Sfengbojiang static void
destroy_session(struct ipsec_unitest_params * ut,uint8_t crypto_dev,uint32_t j)11900c6bd470Sfengbojiang destroy_session(struct ipsec_unitest_params *ut,
11910c6bd470Sfengbojiang 	uint8_t crypto_dev, uint32_t j)
11920c6bd470Sfengbojiang {
11930c6bd470Sfengbojiang 	if (ut->ss[j].type == RTE_SECURITY_ACTION_TYPE_NONE)
11940c6bd470Sfengbojiang 		return destroy_crypto_session(ut, crypto_dev, j);
11950c6bd470Sfengbojiang 	else
11960c6bd470Sfengbojiang 		return destroy_dummy_sec_session(ut, j);
11970c6bd470Sfengbojiang }
11980c6bd470Sfengbojiang 
11990c6bd470Sfengbojiang static void
destroy_sa(uint32_t j)12004418919fSjohnjiang destroy_sa(uint32_t j)
12014418919fSjohnjiang {
12024418919fSjohnjiang 	struct ipsec_unitest_params *ut = &unittest_params;
12034418919fSjohnjiang 	struct ipsec_testsuite_params *ts = &testsuite_params;
12044418919fSjohnjiang 
12054418919fSjohnjiang 	rte_ipsec_sa_fini(ut->ss[j].sa);
12064418919fSjohnjiang 	rte_free(ut->ss[j].sa);
12070c6bd470Sfengbojiang 
12080c6bd470Sfengbojiang 	destroy_session(ut, ts->valid_dev, j);
12094418919fSjohnjiang }
12104418919fSjohnjiang 
12114418919fSjohnjiang static int
crypto_inb_burst_null_null_check(struct ipsec_unitest_params * ut_params,int i,uint16_t num_pkts)12124418919fSjohnjiang crypto_inb_burst_null_null_check(struct ipsec_unitest_params *ut_params, int i,
12134418919fSjohnjiang 		uint16_t num_pkts)
12144418919fSjohnjiang {
12154418919fSjohnjiang 	uint16_t j;
12164418919fSjohnjiang 
12174418919fSjohnjiang 	for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) {
12184418919fSjohnjiang 		ut_params->pkt_index = j;
12194418919fSjohnjiang 
12204418919fSjohnjiang 		/* compare the data buffers */
12214418919fSjohnjiang 		TEST_ASSERT_BUFFERS_ARE_EQUAL(null_plain_data,
12224418919fSjohnjiang 			rte_pktmbuf_mtod(ut_params->obuf[j], void *),
12234418919fSjohnjiang 			test_cfg[i].pkt_sz,
12244418919fSjohnjiang 			"input and output data does not match\n");
12254418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
12264418919fSjohnjiang 			ut_params->obuf[j]->pkt_len,
12274418919fSjohnjiang 			"data_len is not equal to pkt_len");
12284418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
12294418919fSjohnjiang 			test_cfg[i].pkt_sz,
12304418919fSjohnjiang 			"data_len is not equal to input data");
12314418919fSjohnjiang 	}
12324418919fSjohnjiang 
12334418919fSjohnjiang 	return 0;
12344418919fSjohnjiang }
12354418919fSjohnjiang 
12364418919fSjohnjiang static int
test_ipsec_crypto_inb_burst_null_null(int i)12374418919fSjohnjiang test_ipsec_crypto_inb_burst_null_null(int i)
12384418919fSjohnjiang {
12394418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
12404418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
12414418919fSjohnjiang 	uint16_t num_pkts = test_cfg[i].num_pkts;
12424418919fSjohnjiang 	uint16_t j;
12434418919fSjohnjiang 	int rc;
12444418919fSjohnjiang 
12454418919fSjohnjiang 	/* create rte_ipsec_sa */
12464418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
12474418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
12484418919fSjohnjiang 	if (rc != 0) {
12494418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
12504418919fSjohnjiang 		return TEST_FAILED;
12514418919fSjohnjiang 	}
12524418919fSjohnjiang 
12534418919fSjohnjiang 	/* Generate test mbuf data */
12544418919fSjohnjiang 	for (j = 0; j < num_pkts && rc == 0; j++) {
12554418919fSjohnjiang 		/* packet with sequence number 0 is invalid */
12564418919fSjohnjiang 		ut_params->ibuf[j] = setup_test_string_tunneled(
12574418919fSjohnjiang 			ts_params->mbuf_pool, null_encrypted_data,
12584418919fSjohnjiang 			test_cfg[i].pkt_sz, INBOUND_SPI, j + 1);
12594418919fSjohnjiang 		if (ut_params->ibuf[j] == NULL)
12604418919fSjohnjiang 			rc = TEST_FAILED;
12614418919fSjohnjiang 	}
12624418919fSjohnjiang 
12634418919fSjohnjiang 	if (rc == 0) {
12644418919fSjohnjiang 		if (test_cfg[i].reorder_pkts)
12654418919fSjohnjiang 			test_ipsec_reorder_inb_pkt_burst(num_pkts);
12664418919fSjohnjiang 		rc = test_ipsec_crypto_op_alloc(num_pkts);
12674418919fSjohnjiang 	}
12684418919fSjohnjiang 
12694418919fSjohnjiang 	if (rc == 0) {
12704418919fSjohnjiang 		/* call ipsec library api */
12714418919fSjohnjiang 		rc = crypto_ipsec(num_pkts);
12724418919fSjohnjiang 		if (rc == 0)
12734418919fSjohnjiang 			rc = crypto_inb_burst_null_null_check(
12744418919fSjohnjiang 					ut_params, i, num_pkts);
12754418919fSjohnjiang 		else {
12764418919fSjohnjiang 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
12774418919fSjohnjiang 				i);
12784418919fSjohnjiang 			rc = TEST_FAILED;
12794418919fSjohnjiang 		}
12804418919fSjohnjiang 	}
12814418919fSjohnjiang 
12824418919fSjohnjiang 	if (rc == TEST_FAILED)
12834418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
12844418919fSjohnjiang 
12854418919fSjohnjiang 	destroy_sa(0);
12864418919fSjohnjiang 	return rc;
12874418919fSjohnjiang }
12884418919fSjohnjiang 
12894418919fSjohnjiang static int
test_ipsec_crypto_inb_burst_null_null_wrapper(void)12904418919fSjohnjiang test_ipsec_crypto_inb_burst_null_null_wrapper(void)
12914418919fSjohnjiang {
12924418919fSjohnjiang 	int i;
12934418919fSjohnjiang 	int rc = 0;
12944418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
12954418919fSjohnjiang 
12964418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI;
12974418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
12984418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
12994418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
13004418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
13014418919fSjohnjiang 
13024418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
13034418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
13044418919fSjohnjiang 		rc = test_ipsec_crypto_inb_burst_null_null(i);
13054418919fSjohnjiang 	}
13064418919fSjohnjiang 
13074418919fSjohnjiang 	return rc;
13084418919fSjohnjiang }
13094418919fSjohnjiang 
13104418919fSjohnjiang static int
crypto_outb_burst_null_null_check(struct ipsec_unitest_params * ut_params,uint16_t num_pkts)13114418919fSjohnjiang crypto_outb_burst_null_null_check(struct ipsec_unitest_params *ut_params,
13124418919fSjohnjiang 	uint16_t num_pkts)
13134418919fSjohnjiang {
13144418919fSjohnjiang 	void *obuf_data;
13154418919fSjohnjiang 	void *testbuf_data;
13164418919fSjohnjiang 	uint16_t j;
13174418919fSjohnjiang 
13184418919fSjohnjiang 	for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) {
13194418919fSjohnjiang 		ut_params->pkt_index = j;
13204418919fSjohnjiang 
13214418919fSjohnjiang 		testbuf_data = rte_pktmbuf_mtod(ut_params->testbuf[j], void *);
13224418919fSjohnjiang 		obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *);
13234418919fSjohnjiang 		/* compare the buffer data */
13244418919fSjohnjiang 		TEST_ASSERT_BUFFERS_ARE_EQUAL(testbuf_data, obuf_data,
13254418919fSjohnjiang 			ut_params->obuf[j]->pkt_len,
13264418919fSjohnjiang 			"test and output data does not match\n");
13274418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
13284418919fSjohnjiang 			ut_params->testbuf[j]->data_len,
13294418919fSjohnjiang 			"obuf data_len is not equal to testbuf data_len");
13304418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->pkt_len,
13314418919fSjohnjiang 			ut_params->testbuf[j]->pkt_len,
13324418919fSjohnjiang 			"obuf pkt_len is not equal to testbuf pkt_len");
13334418919fSjohnjiang 	}
13344418919fSjohnjiang 
13354418919fSjohnjiang 	return 0;
13364418919fSjohnjiang }
13374418919fSjohnjiang 
13384418919fSjohnjiang static int
test_ipsec_crypto_outb_burst_null_null(int i)13394418919fSjohnjiang test_ipsec_crypto_outb_burst_null_null(int i)
13404418919fSjohnjiang {
13414418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
13424418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
13434418919fSjohnjiang 	uint16_t num_pkts = test_cfg[i].num_pkts;
13444418919fSjohnjiang 	uint16_t j;
13454418919fSjohnjiang 	int32_t rc;
13464418919fSjohnjiang 
13474418919fSjohnjiang 	/* create rte_ipsec_sa*/
13484418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
13494418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
13504418919fSjohnjiang 	if (rc != 0) {
13514418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
13524418919fSjohnjiang 		return TEST_FAILED;
13534418919fSjohnjiang 	}
13544418919fSjohnjiang 
13554418919fSjohnjiang 	/* Generate input mbuf data */
13564418919fSjohnjiang 	for (j = 0; j < num_pkts && rc == 0; j++) {
13574418919fSjohnjiang 		ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
13584418919fSjohnjiang 			null_plain_data, test_cfg[i].pkt_sz, 0);
13594418919fSjohnjiang 		if (ut_params->ibuf[j] == NULL)
13604418919fSjohnjiang 			rc = TEST_FAILED;
13614418919fSjohnjiang 		else {
13624418919fSjohnjiang 			/* Generate test mbuf data */
13634418919fSjohnjiang 			/* packet with sequence number 0 is invalid */
13644418919fSjohnjiang 			ut_params->testbuf[j] = setup_test_string_tunneled(
13654418919fSjohnjiang 					ts_params->mbuf_pool,
13664418919fSjohnjiang 					null_plain_data, test_cfg[i].pkt_sz,
13674418919fSjohnjiang 					OUTBOUND_SPI, j + 1);
13684418919fSjohnjiang 			if (ut_params->testbuf[j] == NULL)
13694418919fSjohnjiang 				rc = TEST_FAILED;
13704418919fSjohnjiang 		}
13714418919fSjohnjiang 	}
13724418919fSjohnjiang 
13734418919fSjohnjiang 	if (rc == 0)
13744418919fSjohnjiang 		rc = test_ipsec_crypto_op_alloc(num_pkts);
13754418919fSjohnjiang 
13764418919fSjohnjiang 	if (rc == 0) {
13774418919fSjohnjiang 		/* call ipsec library api */
13784418919fSjohnjiang 		rc = crypto_ipsec(num_pkts);
13794418919fSjohnjiang 		if (rc == 0)
13804418919fSjohnjiang 			rc = crypto_outb_burst_null_null_check(ut_params,
13814418919fSjohnjiang 					num_pkts);
13824418919fSjohnjiang 		else
13834418919fSjohnjiang 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
13844418919fSjohnjiang 				i);
13854418919fSjohnjiang 	}
13864418919fSjohnjiang 
13874418919fSjohnjiang 	if (rc == TEST_FAILED)
13884418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
13894418919fSjohnjiang 
13904418919fSjohnjiang 	destroy_sa(0);
13914418919fSjohnjiang 	return rc;
13924418919fSjohnjiang }
13934418919fSjohnjiang 
13944418919fSjohnjiang static int
test_ipsec_crypto_outb_burst_null_null_wrapper(void)13954418919fSjohnjiang test_ipsec_crypto_outb_burst_null_null_wrapper(void)
13964418919fSjohnjiang {
13974418919fSjohnjiang 	int i;
13984418919fSjohnjiang 	int rc = 0;
13994418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
14004418919fSjohnjiang 
14014418919fSjohnjiang 	ut_params->ipsec_xform.spi = OUTBOUND_SPI;
14024418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
14034418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
14044418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
14054418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
14064418919fSjohnjiang 
14074418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
14084418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
14094418919fSjohnjiang 		rc = test_ipsec_crypto_outb_burst_null_null(i);
14104418919fSjohnjiang 	}
14114418919fSjohnjiang 
14124418919fSjohnjiang 	return rc;
14134418919fSjohnjiang }
14144418919fSjohnjiang 
14154418919fSjohnjiang static int
inline_inb_burst_null_null_check(struct ipsec_unitest_params * ut_params,int i,uint16_t num_pkts)14164418919fSjohnjiang inline_inb_burst_null_null_check(struct ipsec_unitest_params *ut_params, int i,
14174418919fSjohnjiang 	uint16_t num_pkts)
14184418919fSjohnjiang {
14194418919fSjohnjiang 	void *ibuf_data;
14204418919fSjohnjiang 	void *obuf_data;
14214418919fSjohnjiang 	uint16_t j;
14224418919fSjohnjiang 
14234418919fSjohnjiang 	for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) {
14244418919fSjohnjiang 		ut_params->pkt_index = j;
14254418919fSjohnjiang 
14264418919fSjohnjiang 		/* compare the buffer data */
14274418919fSjohnjiang 		ibuf_data = rte_pktmbuf_mtod(ut_params->ibuf[j], void *);
14284418919fSjohnjiang 		obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *);
14294418919fSjohnjiang 
14304418919fSjohnjiang 		TEST_ASSERT_BUFFERS_ARE_EQUAL(ibuf_data, obuf_data,
14314418919fSjohnjiang 			ut_params->ibuf[j]->data_len,
14324418919fSjohnjiang 			"input and output data does not match\n");
14334418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->ibuf[j]->data_len,
14344418919fSjohnjiang 			ut_params->obuf[j]->data_len,
14354418919fSjohnjiang 			"ibuf data_len is not equal to obuf data_len");
14364418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->ibuf[j]->pkt_len,
14374418919fSjohnjiang 			ut_params->obuf[j]->pkt_len,
14384418919fSjohnjiang 			"ibuf pkt_len is not equal to obuf pkt_len");
14394418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->ibuf[j]->data_len,
14404418919fSjohnjiang 			test_cfg[i].pkt_sz,
14414418919fSjohnjiang 			"data_len is not equal input data");
14424418919fSjohnjiang 	}
14434418919fSjohnjiang 	return 0;
14444418919fSjohnjiang }
14454418919fSjohnjiang 
14464418919fSjohnjiang static int
test_ipsec_inline_crypto_inb_burst_null_null(int i)14474418919fSjohnjiang test_ipsec_inline_crypto_inb_burst_null_null(int i)
14484418919fSjohnjiang {
14494418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
14504418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
14514418919fSjohnjiang 	uint16_t num_pkts = test_cfg[i].num_pkts;
14524418919fSjohnjiang 	uint16_t j;
14534418919fSjohnjiang 	int32_t rc;
14544418919fSjohnjiang 	uint32_t n;
14554418919fSjohnjiang 
14564418919fSjohnjiang 	/* create rte_ipsec_sa*/
14574418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO,
14584418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
14594418919fSjohnjiang 	if (rc != 0) {
14604418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
14614418919fSjohnjiang 		return TEST_FAILED;
14624418919fSjohnjiang 	}
14634418919fSjohnjiang 
14644418919fSjohnjiang 	/* Generate inbound mbuf data */
14654418919fSjohnjiang 	for (j = 0; j < num_pkts && rc == 0; j++) {
14664418919fSjohnjiang 		ut_params->ibuf[j] = setup_test_string_tunneled(
14674418919fSjohnjiang 			ts_params->mbuf_pool,
14684418919fSjohnjiang 			null_plain_data, test_cfg[i].pkt_sz,
14694418919fSjohnjiang 			INBOUND_SPI, j + 1);
14704418919fSjohnjiang 		if (ut_params->ibuf[j] == NULL)
14714418919fSjohnjiang 			rc = TEST_FAILED;
14724418919fSjohnjiang 		else {
14734418919fSjohnjiang 			/* Generate test mbuf data */
14744418919fSjohnjiang 			ut_params->obuf[j] = setup_test_string(
14754418919fSjohnjiang 				ts_params->mbuf_pool,
14764418919fSjohnjiang 				null_plain_data, test_cfg[i].pkt_sz, 0);
14774418919fSjohnjiang 			if (ut_params->obuf[j] == NULL)
14784418919fSjohnjiang 				rc = TEST_FAILED;
14794418919fSjohnjiang 		}
14804418919fSjohnjiang 	}
14814418919fSjohnjiang 
14824418919fSjohnjiang 	if (rc == 0) {
14834418919fSjohnjiang 		n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf,
14844418919fSjohnjiang 				num_pkts);
14854418919fSjohnjiang 		if (n == num_pkts)
14864418919fSjohnjiang 			rc = inline_inb_burst_null_null_check(ut_params, i,
14874418919fSjohnjiang 					num_pkts);
14884418919fSjohnjiang 		else {
14894418919fSjohnjiang 			RTE_LOG(ERR, USER1,
14904418919fSjohnjiang 				"rte_ipsec_pkt_process failed, cfg %d\n",
14914418919fSjohnjiang 				i);
14924418919fSjohnjiang 			rc = TEST_FAILED;
14934418919fSjohnjiang 		}
14944418919fSjohnjiang 	}
14954418919fSjohnjiang 
14964418919fSjohnjiang 	if (rc == TEST_FAILED)
14974418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
14984418919fSjohnjiang 
14994418919fSjohnjiang 	destroy_sa(0);
15004418919fSjohnjiang 	return rc;
15014418919fSjohnjiang }
15024418919fSjohnjiang 
15034418919fSjohnjiang static int
test_ipsec_inline_crypto_inb_burst_null_null_wrapper(void)15044418919fSjohnjiang test_ipsec_inline_crypto_inb_burst_null_null_wrapper(void)
15054418919fSjohnjiang {
15064418919fSjohnjiang 	int i;
15074418919fSjohnjiang 	int rc = 0;
15084418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
15094418919fSjohnjiang 
15104418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI;
15114418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
15124418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
15134418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
15144418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
15154418919fSjohnjiang 
15164418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
15174418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
15184418919fSjohnjiang 		rc = test_ipsec_inline_crypto_inb_burst_null_null(i);
15194418919fSjohnjiang 	}
15204418919fSjohnjiang 
15214418919fSjohnjiang 	return rc;
15224418919fSjohnjiang }
15234418919fSjohnjiang 
15244418919fSjohnjiang static int
test_ipsec_inline_proto_inb_burst_null_null(int i)15254418919fSjohnjiang test_ipsec_inline_proto_inb_burst_null_null(int i)
15264418919fSjohnjiang {
15274418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
15284418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
15294418919fSjohnjiang 	uint16_t num_pkts = test_cfg[i].num_pkts;
15304418919fSjohnjiang 	uint16_t j;
15314418919fSjohnjiang 	int32_t rc;
15324418919fSjohnjiang 	uint32_t n;
15334418919fSjohnjiang 
15344418919fSjohnjiang 	/* create rte_ipsec_sa*/
15354418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL,
15364418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
15374418919fSjohnjiang 	if (rc != 0) {
15384418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
15394418919fSjohnjiang 		return TEST_FAILED;
15404418919fSjohnjiang 	}
15414418919fSjohnjiang 
15424418919fSjohnjiang 	/* Generate inbound mbuf data */
15434418919fSjohnjiang 	for (j = 0; j < num_pkts && rc == 0; j++) {
15444418919fSjohnjiang 		ut_params->ibuf[j] = setup_test_string(
15454418919fSjohnjiang 			ts_params->mbuf_pool,
15464418919fSjohnjiang 			null_plain_data, test_cfg[i].pkt_sz, 0);
15474418919fSjohnjiang 		if (ut_params->ibuf[j] == NULL)
15484418919fSjohnjiang 			rc = TEST_FAILED;
15494418919fSjohnjiang 		else {
15504418919fSjohnjiang 			/* Generate test mbuf data */
15514418919fSjohnjiang 			ut_params->obuf[j] = setup_test_string(
15524418919fSjohnjiang 				ts_params->mbuf_pool,
15534418919fSjohnjiang 				null_plain_data, test_cfg[i].pkt_sz, 0);
15544418919fSjohnjiang 			if (ut_params->obuf[j] == NULL)
15554418919fSjohnjiang 				rc = TEST_FAILED;
15564418919fSjohnjiang 		}
15574418919fSjohnjiang 	}
15584418919fSjohnjiang 
15594418919fSjohnjiang 	if (rc == 0) {
15604418919fSjohnjiang 		n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf,
15614418919fSjohnjiang 				num_pkts);
15624418919fSjohnjiang 		if (n == num_pkts)
15634418919fSjohnjiang 			rc = inline_inb_burst_null_null_check(ut_params, i,
15644418919fSjohnjiang 					num_pkts);
15654418919fSjohnjiang 		else {
15664418919fSjohnjiang 			RTE_LOG(ERR, USER1,
15674418919fSjohnjiang 				"rte_ipsec_pkt_process failed, cfg %d\n",
15684418919fSjohnjiang 				i);
15694418919fSjohnjiang 			rc = TEST_FAILED;
15704418919fSjohnjiang 		}
15714418919fSjohnjiang 	}
15724418919fSjohnjiang 
15734418919fSjohnjiang 	if (rc == TEST_FAILED)
15744418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
15754418919fSjohnjiang 
15764418919fSjohnjiang 	destroy_sa(0);
15774418919fSjohnjiang 	return rc;
15784418919fSjohnjiang }
15794418919fSjohnjiang 
15804418919fSjohnjiang static int
test_ipsec_inline_proto_inb_burst_null_null_wrapper(void)15814418919fSjohnjiang test_ipsec_inline_proto_inb_burst_null_null_wrapper(void)
15824418919fSjohnjiang {
15834418919fSjohnjiang 	int i;
15844418919fSjohnjiang 	int rc = 0;
15854418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
15864418919fSjohnjiang 
15874418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI;
15884418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
15894418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
15904418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
15914418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
15924418919fSjohnjiang 
15934418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
15944418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
15954418919fSjohnjiang 		rc = test_ipsec_inline_proto_inb_burst_null_null(i);
15964418919fSjohnjiang 	}
15974418919fSjohnjiang 
15984418919fSjohnjiang 	return rc;
15994418919fSjohnjiang }
16004418919fSjohnjiang 
16014418919fSjohnjiang static int
inline_outb_burst_null_null_check(struct ipsec_unitest_params * ut_params,uint16_t num_pkts)16024418919fSjohnjiang inline_outb_burst_null_null_check(struct ipsec_unitest_params *ut_params,
16034418919fSjohnjiang 	uint16_t num_pkts)
16044418919fSjohnjiang {
16054418919fSjohnjiang 	void *obuf_data;
16064418919fSjohnjiang 	void *ibuf_data;
16074418919fSjohnjiang 	uint16_t j;
16084418919fSjohnjiang 
16094418919fSjohnjiang 	for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) {
16104418919fSjohnjiang 		ut_params->pkt_index = j;
16114418919fSjohnjiang 
16124418919fSjohnjiang 		/* compare the buffer data */
16134418919fSjohnjiang 		ibuf_data = rte_pktmbuf_mtod(ut_params->ibuf[j], void *);
16144418919fSjohnjiang 		obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *);
16154418919fSjohnjiang 		TEST_ASSERT_BUFFERS_ARE_EQUAL(ibuf_data, obuf_data,
16164418919fSjohnjiang 			ut_params->ibuf[j]->data_len,
16174418919fSjohnjiang 			"input and output data does not match\n");
16184418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->ibuf[j]->data_len,
16194418919fSjohnjiang 			ut_params->obuf[j]->data_len,
16204418919fSjohnjiang 			"ibuf data_len is not equal to obuf data_len");
16214418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->ibuf[j]->pkt_len,
16224418919fSjohnjiang 			ut_params->obuf[j]->pkt_len,
16234418919fSjohnjiang 			"ibuf pkt_len is not equal to obuf pkt_len");
16244418919fSjohnjiang 
16254418919fSjohnjiang 		/* check mbuf ol_flags */
16264418919fSjohnjiang 		TEST_ASSERT(ut_params->ibuf[j]->ol_flags & PKT_TX_SEC_OFFLOAD,
16274418919fSjohnjiang 			"ibuf PKT_TX_SEC_OFFLOAD is not set");
16284418919fSjohnjiang 	}
16294418919fSjohnjiang 	return 0;
16304418919fSjohnjiang }
16314418919fSjohnjiang 
16324418919fSjohnjiang static int
test_ipsec_inline_crypto_outb_burst_null_null(int i)16334418919fSjohnjiang test_ipsec_inline_crypto_outb_burst_null_null(int i)
16344418919fSjohnjiang {
16354418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
16364418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
16374418919fSjohnjiang 	uint16_t num_pkts = test_cfg[i].num_pkts;
16384418919fSjohnjiang 	uint16_t j;
16394418919fSjohnjiang 	int32_t rc;
16404418919fSjohnjiang 	uint32_t n;
16414418919fSjohnjiang 
16424418919fSjohnjiang 	/* create rte_ipsec_sa */
16434418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO,
16444418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
16454418919fSjohnjiang 	if (rc != 0) {
16464418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
16474418919fSjohnjiang 		return TEST_FAILED;
16484418919fSjohnjiang 	}
16494418919fSjohnjiang 
16504418919fSjohnjiang 	/* Generate test mbuf data */
16514418919fSjohnjiang 	for (j = 0; j < num_pkts && rc == 0; j++) {
16524418919fSjohnjiang 		ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
16534418919fSjohnjiang 			null_plain_data, test_cfg[i].pkt_sz, 0);
16544418919fSjohnjiang 		if (ut_params->ibuf[0] == NULL)
16554418919fSjohnjiang 			rc = TEST_FAILED;
16564418919fSjohnjiang 
16574418919fSjohnjiang 		if (rc == 0) {
16584418919fSjohnjiang 			/* Generate test tunneled mbuf data for comparison */
16594418919fSjohnjiang 			ut_params->obuf[j] = setup_test_string_tunneled(
16604418919fSjohnjiang 					ts_params->mbuf_pool,
16614418919fSjohnjiang 					null_plain_data, test_cfg[i].pkt_sz,
16624418919fSjohnjiang 					OUTBOUND_SPI, j + 1);
16634418919fSjohnjiang 			if (ut_params->obuf[j] == NULL)
16644418919fSjohnjiang 				rc = TEST_FAILED;
16654418919fSjohnjiang 		}
16664418919fSjohnjiang 	}
16674418919fSjohnjiang 
16684418919fSjohnjiang 	if (rc == 0) {
16694418919fSjohnjiang 		n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf,
16704418919fSjohnjiang 				num_pkts);
16714418919fSjohnjiang 		if (n == num_pkts)
16724418919fSjohnjiang 			rc = inline_outb_burst_null_null_check(ut_params,
16734418919fSjohnjiang 					num_pkts);
16744418919fSjohnjiang 		else {
16754418919fSjohnjiang 			RTE_LOG(ERR, USER1,
16764418919fSjohnjiang 				"rte_ipsec_pkt_process failed, cfg %d\n",
16774418919fSjohnjiang 				i);
16784418919fSjohnjiang 			rc = TEST_FAILED;
16794418919fSjohnjiang 		}
16804418919fSjohnjiang 	}
16814418919fSjohnjiang 
16824418919fSjohnjiang 	if (rc == TEST_FAILED)
16834418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
16844418919fSjohnjiang 
16854418919fSjohnjiang 	destroy_sa(0);
16864418919fSjohnjiang 	return rc;
16874418919fSjohnjiang }
16884418919fSjohnjiang 
16894418919fSjohnjiang static int
test_ipsec_inline_crypto_outb_burst_null_null_wrapper(void)16904418919fSjohnjiang test_ipsec_inline_crypto_outb_burst_null_null_wrapper(void)
16914418919fSjohnjiang {
16924418919fSjohnjiang 	int i;
16934418919fSjohnjiang 	int rc = 0;
16944418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
16954418919fSjohnjiang 
16964418919fSjohnjiang 	ut_params->ipsec_xform.spi = OUTBOUND_SPI;
16974418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
16984418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
16994418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
17004418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
17014418919fSjohnjiang 
17024418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
17034418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
17044418919fSjohnjiang 		rc = test_ipsec_inline_crypto_outb_burst_null_null(i);
17054418919fSjohnjiang 	}
17064418919fSjohnjiang 
17074418919fSjohnjiang 	return rc;
17084418919fSjohnjiang }
17094418919fSjohnjiang 
17104418919fSjohnjiang static int
test_ipsec_inline_proto_outb_burst_null_null(int i)17114418919fSjohnjiang test_ipsec_inline_proto_outb_burst_null_null(int i)
17124418919fSjohnjiang {
17134418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
17144418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
17154418919fSjohnjiang 	uint16_t num_pkts = test_cfg[i].num_pkts;
17164418919fSjohnjiang 	uint16_t j;
17174418919fSjohnjiang 	int32_t rc;
17184418919fSjohnjiang 	uint32_t n;
17194418919fSjohnjiang 
17204418919fSjohnjiang 	/* create rte_ipsec_sa */
17214418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL,
17224418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
17234418919fSjohnjiang 	if (rc != 0) {
17244418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
17254418919fSjohnjiang 		return TEST_FAILED;
17264418919fSjohnjiang 	}
17274418919fSjohnjiang 
17284418919fSjohnjiang 	/* Generate test mbuf data */
17294418919fSjohnjiang 	for (j = 0; j < num_pkts && rc == 0; j++) {
17304418919fSjohnjiang 		ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
17314418919fSjohnjiang 			null_plain_data, test_cfg[i].pkt_sz, 0);
17324418919fSjohnjiang 		if (ut_params->ibuf[0] == NULL)
17334418919fSjohnjiang 			rc = TEST_FAILED;
17344418919fSjohnjiang 
17354418919fSjohnjiang 		if (rc == 0) {
17364418919fSjohnjiang 			/* Generate test tunneled mbuf data for comparison */
17374418919fSjohnjiang 			ut_params->obuf[j] = setup_test_string(
17384418919fSjohnjiang 					ts_params->mbuf_pool,
17394418919fSjohnjiang 					null_plain_data, test_cfg[i].pkt_sz, 0);
17404418919fSjohnjiang 			if (ut_params->obuf[j] == NULL)
17414418919fSjohnjiang 				rc = TEST_FAILED;
17424418919fSjohnjiang 		}
17434418919fSjohnjiang 	}
17444418919fSjohnjiang 
17454418919fSjohnjiang 	if (rc == 0) {
17464418919fSjohnjiang 		n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf,
17474418919fSjohnjiang 				num_pkts);
17484418919fSjohnjiang 		if (n == num_pkts)
17494418919fSjohnjiang 			rc = inline_outb_burst_null_null_check(ut_params,
17504418919fSjohnjiang 					num_pkts);
17514418919fSjohnjiang 		else {
17524418919fSjohnjiang 			RTE_LOG(ERR, USER1,
17534418919fSjohnjiang 				"rte_ipsec_pkt_process failed, cfg %d\n",
17544418919fSjohnjiang 				i);
17554418919fSjohnjiang 			rc = TEST_FAILED;
17564418919fSjohnjiang 		}
17574418919fSjohnjiang 	}
17584418919fSjohnjiang 
17594418919fSjohnjiang 	if (rc == TEST_FAILED)
17604418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
17614418919fSjohnjiang 
17624418919fSjohnjiang 	destroy_sa(0);
17634418919fSjohnjiang 	return rc;
17644418919fSjohnjiang }
17654418919fSjohnjiang 
17664418919fSjohnjiang static int
test_ipsec_inline_proto_outb_burst_null_null_wrapper(void)17674418919fSjohnjiang test_ipsec_inline_proto_outb_burst_null_null_wrapper(void)
17684418919fSjohnjiang {
17694418919fSjohnjiang 	int i;
17704418919fSjohnjiang 	int rc = 0;
17714418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
17724418919fSjohnjiang 
17734418919fSjohnjiang 	ut_params->ipsec_xform.spi = OUTBOUND_SPI;
17744418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
17754418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
17764418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
17774418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
17784418919fSjohnjiang 
17794418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
17804418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
17814418919fSjohnjiang 		rc = test_ipsec_inline_proto_outb_burst_null_null(i);
17824418919fSjohnjiang 	}
17834418919fSjohnjiang 
17844418919fSjohnjiang 	return rc;
17854418919fSjohnjiang }
17864418919fSjohnjiang 
17874418919fSjohnjiang static int
test_ipsec_lksd_proto_inb_burst_null_null(int i)17884418919fSjohnjiang test_ipsec_lksd_proto_inb_burst_null_null(int i)
17894418919fSjohnjiang {
17904418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
17914418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
17924418919fSjohnjiang 	uint16_t num_pkts = test_cfg[i].num_pkts;
17934418919fSjohnjiang 	uint16_t j;
17944418919fSjohnjiang 	int rc;
17954418919fSjohnjiang 
17964418919fSjohnjiang 	/* create rte_ipsec_sa */
17974418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
17984418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
17994418919fSjohnjiang 	if (rc != 0) {
18004418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
18014418919fSjohnjiang 		return TEST_FAILED;
18024418919fSjohnjiang 	}
18034418919fSjohnjiang 
18044418919fSjohnjiang 	/* Generate test mbuf data */
18054418919fSjohnjiang 	for (j = 0; j < num_pkts && rc == 0; j++) {
18064418919fSjohnjiang 		/* packet with sequence number 0 is invalid */
18074418919fSjohnjiang 		ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
18084418919fSjohnjiang 			null_encrypted_data, test_cfg[i].pkt_sz, 0);
18094418919fSjohnjiang 		if (ut_params->ibuf[j] == NULL)
18104418919fSjohnjiang 			rc = TEST_FAILED;
18114418919fSjohnjiang 	}
18124418919fSjohnjiang 
18134418919fSjohnjiang 	if (rc == 0) {
18144418919fSjohnjiang 		if (test_cfg[i].reorder_pkts)
18154418919fSjohnjiang 			test_ipsec_reorder_inb_pkt_burst(num_pkts);
18164418919fSjohnjiang 		rc = test_ipsec_crypto_op_alloc(num_pkts);
18174418919fSjohnjiang 	}
18184418919fSjohnjiang 
18194418919fSjohnjiang 	if (rc == 0) {
18204418919fSjohnjiang 		/* call ipsec library api */
18214418919fSjohnjiang 		rc = lksd_proto_ipsec(num_pkts);
18224418919fSjohnjiang 		if (rc == 0)
18234418919fSjohnjiang 			rc = crypto_inb_burst_null_null_check(ut_params, i,
18244418919fSjohnjiang 					num_pkts);
18254418919fSjohnjiang 		else {
18264418919fSjohnjiang 			RTE_LOG(ERR, USER1, "%s failed, cfg %d\n",
18274418919fSjohnjiang 				__func__, i);
18284418919fSjohnjiang 			rc = TEST_FAILED;
18294418919fSjohnjiang 		}
18304418919fSjohnjiang 	}
18314418919fSjohnjiang 
18324418919fSjohnjiang 	if (rc == TEST_FAILED)
18334418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
18344418919fSjohnjiang 
18354418919fSjohnjiang 	destroy_sa(0);
18364418919fSjohnjiang 	return rc;
18374418919fSjohnjiang }
18384418919fSjohnjiang 
18394418919fSjohnjiang static int
test_ipsec_lksd_proto_inb_burst_null_null_wrapper(void)18404418919fSjohnjiang test_ipsec_lksd_proto_inb_burst_null_null_wrapper(void)
18414418919fSjohnjiang {
18424418919fSjohnjiang 	int i;
18434418919fSjohnjiang 	int rc = 0;
18444418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
18454418919fSjohnjiang 
18464418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI;
18474418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
18484418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
18494418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
18504418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
18514418919fSjohnjiang 
18524418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
18534418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
18544418919fSjohnjiang 		rc = test_ipsec_lksd_proto_inb_burst_null_null(i);
18554418919fSjohnjiang 	}
18564418919fSjohnjiang 
18574418919fSjohnjiang 	return rc;
18584418919fSjohnjiang }
18594418919fSjohnjiang 
18604418919fSjohnjiang static int
test_ipsec_lksd_proto_outb_burst_null_null_wrapper(void)18614418919fSjohnjiang test_ipsec_lksd_proto_outb_burst_null_null_wrapper(void)
18624418919fSjohnjiang {
18634418919fSjohnjiang 	int i;
18644418919fSjohnjiang 	int rc = 0;
18654418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
18664418919fSjohnjiang 
18674418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI;
18684418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
18694418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
18704418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
18714418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
18724418919fSjohnjiang 
18734418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
18744418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
18754418919fSjohnjiang 		rc = test_ipsec_lksd_proto_inb_burst_null_null(i);
18764418919fSjohnjiang 	}
18774418919fSjohnjiang 
18784418919fSjohnjiang 	return rc;
18794418919fSjohnjiang }
18804418919fSjohnjiang 
18814418919fSjohnjiang static int
replay_inb_null_null_check(struct ipsec_unitest_params * ut_params,int i,int num_pkts)18824418919fSjohnjiang replay_inb_null_null_check(struct ipsec_unitest_params *ut_params, int i,
18834418919fSjohnjiang 	int num_pkts)
18844418919fSjohnjiang {
18854418919fSjohnjiang 	uint16_t j;
18864418919fSjohnjiang 
18874418919fSjohnjiang 	for (j = 0; j < num_pkts; j++) {
18884418919fSjohnjiang 		/* compare the buffer data */
18894418919fSjohnjiang 		TEST_ASSERT_BUFFERS_ARE_EQUAL(null_plain_data,
18904418919fSjohnjiang 			rte_pktmbuf_mtod(ut_params->obuf[j], void *),
18914418919fSjohnjiang 			test_cfg[i].pkt_sz,
18924418919fSjohnjiang 			"input and output data does not match\n");
18934418919fSjohnjiang 
18944418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
18954418919fSjohnjiang 			ut_params->obuf[j]->pkt_len,
18964418919fSjohnjiang 			"data_len is not equal to pkt_len");
18974418919fSjohnjiang 	}
18984418919fSjohnjiang 
18994418919fSjohnjiang 	return 0;
19004418919fSjohnjiang }
19014418919fSjohnjiang 
19024418919fSjohnjiang static int
test_ipsec_replay_inb_inside_null_null(int i)19034418919fSjohnjiang test_ipsec_replay_inb_inside_null_null(int i)
19044418919fSjohnjiang {
19054418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
19064418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
19074418919fSjohnjiang 	int rc;
19084418919fSjohnjiang 
19094418919fSjohnjiang 	/* create rte_ipsec_sa*/
19104418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
19114418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
19124418919fSjohnjiang 	if (rc != 0) {
19134418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
19144418919fSjohnjiang 		return TEST_FAILED;
19154418919fSjohnjiang 	}
19164418919fSjohnjiang 
19174418919fSjohnjiang 	/* Generate inbound mbuf data */
19184418919fSjohnjiang 	ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool,
19194418919fSjohnjiang 		null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1);
19204418919fSjohnjiang 	if (ut_params->ibuf[0] == NULL)
19214418919fSjohnjiang 		rc = TEST_FAILED;
19224418919fSjohnjiang 	else
19234418919fSjohnjiang 		rc = test_ipsec_crypto_op_alloc(1);
19244418919fSjohnjiang 
19254418919fSjohnjiang 	if (rc == 0) {
19264418919fSjohnjiang 		/* call ipsec library api */
19274418919fSjohnjiang 		rc = crypto_ipsec(1);
19284418919fSjohnjiang 		if (rc == 0)
19294418919fSjohnjiang 			rc = replay_inb_null_null_check(ut_params, i, 1);
19304418919fSjohnjiang 		else {
19314418919fSjohnjiang 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
19324418919fSjohnjiang 					i);
19334418919fSjohnjiang 			rc = TEST_FAILED;
19344418919fSjohnjiang 		}
19354418919fSjohnjiang 	}
19364418919fSjohnjiang 
19374418919fSjohnjiang 	if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) {
19384418919fSjohnjiang 		/* generate packet with seq number inside the replay window */
19394418919fSjohnjiang 		if (ut_params->ibuf[0]) {
19404418919fSjohnjiang 			rte_pktmbuf_free(ut_params->ibuf[0]);
19414418919fSjohnjiang 			ut_params->ibuf[0] = 0;
19424418919fSjohnjiang 		}
19434418919fSjohnjiang 
19444418919fSjohnjiang 		ut_params->ibuf[0] = setup_test_string_tunneled(
19454418919fSjohnjiang 			ts_params->mbuf_pool, null_encrypted_data,
19464418919fSjohnjiang 			test_cfg[i].pkt_sz, INBOUND_SPI,
19474418919fSjohnjiang 			test_cfg[i].replay_win_sz);
19484418919fSjohnjiang 		if (ut_params->ibuf[0] == NULL)
19494418919fSjohnjiang 			rc = TEST_FAILED;
19504418919fSjohnjiang 		else
19514418919fSjohnjiang 			rc = test_ipsec_crypto_op_alloc(1);
19524418919fSjohnjiang 
19534418919fSjohnjiang 		if (rc == 0) {
19544418919fSjohnjiang 			/* call ipsec library api */
19554418919fSjohnjiang 			rc = crypto_ipsec(1);
19564418919fSjohnjiang 			if (rc == 0)
19574418919fSjohnjiang 				rc = replay_inb_null_null_check(
19584418919fSjohnjiang 						ut_params, i, 1);
19594418919fSjohnjiang 			else {
19604418919fSjohnjiang 				RTE_LOG(ERR, USER1, "crypto_ipsec failed\n");
19614418919fSjohnjiang 				rc = TEST_FAILED;
19624418919fSjohnjiang 			}
19634418919fSjohnjiang 		}
19644418919fSjohnjiang 	}
19654418919fSjohnjiang 
19664418919fSjohnjiang 	if (rc == TEST_FAILED)
19674418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
19684418919fSjohnjiang 
19694418919fSjohnjiang 	destroy_sa(0);
19704418919fSjohnjiang 
19714418919fSjohnjiang 	return rc;
19724418919fSjohnjiang }
19734418919fSjohnjiang 
19744418919fSjohnjiang static int
test_ipsec_replay_inb_inside_null_null_wrapper(void)19754418919fSjohnjiang test_ipsec_replay_inb_inside_null_null_wrapper(void)
19764418919fSjohnjiang {
19774418919fSjohnjiang 	int i;
19784418919fSjohnjiang 	int rc = 0;
19794418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
19804418919fSjohnjiang 
19814418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI;
19824418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
19834418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
19844418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
19854418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
19864418919fSjohnjiang 
19874418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
19884418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
19894418919fSjohnjiang 		rc = test_ipsec_replay_inb_inside_null_null(i);
19904418919fSjohnjiang 	}
19914418919fSjohnjiang 
19924418919fSjohnjiang 	return rc;
19934418919fSjohnjiang }
19944418919fSjohnjiang 
19954418919fSjohnjiang static int
test_ipsec_replay_inb_outside_null_null(int i)19964418919fSjohnjiang test_ipsec_replay_inb_outside_null_null(int i)
19974418919fSjohnjiang {
19984418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
19994418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
20004418919fSjohnjiang 	int rc;
20014418919fSjohnjiang 
20024418919fSjohnjiang 	/* create rte_ipsec_sa */
20034418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
20044418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
20054418919fSjohnjiang 	if (rc != 0) {
20064418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
20074418919fSjohnjiang 		return TEST_FAILED;
20084418919fSjohnjiang 	}
20094418919fSjohnjiang 
20104418919fSjohnjiang 	/* Generate test mbuf data */
20114418919fSjohnjiang 	ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool,
20124418919fSjohnjiang 		null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI,
20134418919fSjohnjiang 		test_cfg[i].replay_win_sz + 2);
20144418919fSjohnjiang 	if (ut_params->ibuf[0] == NULL)
20154418919fSjohnjiang 		rc = TEST_FAILED;
20164418919fSjohnjiang 	else
20174418919fSjohnjiang 		rc = test_ipsec_crypto_op_alloc(1);
20184418919fSjohnjiang 
20194418919fSjohnjiang 	if (rc == 0) {
20204418919fSjohnjiang 		/* call ipsec library api */
20214418919fSjohnjiang 		rc = crypto_ipsec(1);
20224418919fSjohnjiang 		if (rc == 0)
20234418919fSjohnjiang 			rc = replay_inb_null_null_check(ut_params, i, 1);
20244418919fSjohnjiang 		else {
20254418919fSjohnjiang 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
20264418919fSjohnjiang 					i);
20274418919fSjohnjiang 			rc = TEST_FAILED;
20284418919fSjohnjiang 		}
20294418919fSjohnjiang 	}
20304418919fSjohnjiang 
20314418919fSjohnjiang 	if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) {
20324418919fSjohnjiang 		/* generate packet with seq number outside the replay window */
20334418919fSjohnjiang 		if (ut_params->ibuf[0]) {
20344418919fSjohnjiang 			rte_pktmbuf_free(ut_params->ibuf[0]);
20354418919fSjohnjiang 			ut_params->ibuf[0] = 0;
20364418919fSjohnjiang 		}
20374418919fSjohnjiang 		ut_params->ibuf[0] = setup_test_string_tunneled(
20384418919fSjohnjiang 			ts_params->mbuf_pool, null_encrypted_data,
20394418919fSjohnjiang 			test_cfg[i].pkt_sz, INBOUND_SPI, 1);
20404418919fSjohnjiang 		if (ut_params->ibuf[0] == NULL)
20414418919fSjohnjiang 			rc = TEST_FAILED;
20424418919fSjohnjiang 		else
20434418919fSjohnjiang 			rc = test_ipsec_crypto_op_alloc(1);
20444418919fSjohnjiang 
20454418919fSjohnjiang 		if (rc == 0) {
20464418919fSjohnjiang 			/* call ipsec library api */
20474418919fSjohnjiang 			rc = crypto_ipsec(1);
20484418919fSjohnjiang 			if (rc == 0) {
20494418919fSjohnjiang 				if (test_cfg[i].esn == 0) {
20504418919fSjohnjiang 					RTE_LOG(ERR, USER1,
20514418919fSjohnjiang 						"packet is not outside the replay window, cfg %d pkt0_seq %u pkt1_seq %u\n",
20524418919fSjohnjiang 						i,
20534418919fSjohnjiang 						test_cfg[i].replay_win_sz + 2,
20544418919fSjohnjiang 						1);
20554418919fSjohnjiang 					rc = TEST_FAILED;
20564418919fSjohnjiang 				}
20574418919fSjohnjiang 			} else {
20584418919fSjohnjiang 				RTE_LOG(ERR, USER1,
20594418919fSjohnjiang 					"packet is outside the replay window, cfg %d pkt0_seq %u pkt1_seq %u\n",
20604418919fSjohnjiang 					i, test_cfg[i].replay_win_sz + 2, 1);
20614418919fSjohnjiang 				rc = 0;
20624418919fSjohnjiang 			}
20634418919fSjohnjiang 		}
20644418919fSjohnjiang 	}
20654418919fSjohnjiang 
20664418919fSjohnjiang 	if (rc == TEST_FAILED)
20674418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
20684418919fSjohnjiang 
20694418919fSjohnjiang 	destroy_sa(0);
20704418919fSjohnjiang 
20714418919fSjohnjiang 	return rc;
20724418919fSjohnjiang }
20734418919fSjohnjiang 
20744418919fSjohnjiang static int
test_ipsec_replay_inb_outside_null_null_wrapper(void)20754418919fSjohnjiang test_ipsec_replay_inb_outside_null_null_wrapper(void)
20764418919fSjohnjiang {
20774418919fSjohnjiang 	int i;
20784418919fSjohnjiang 	int rc = 0;
20794418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
20804418919fSjohnjiang 
20814418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI;
20824418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
20834418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
20844418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
20854418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
20864418919fSjohnjiang 
20874418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
20884418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
20894418919fSjohnjiang 		rc = test_ipsec_replay_inb_outside_null_null(i);
20904418919fSjohnjiang 	}
20914418919fSjohnjiang 
20924418919fSjohnjiang 	return rc;
20934418919fSjohnjiang }
20944418919fSjohnjiang 
20954418919fSjohnjiang static int
test_ipsec_replay_inb_repeat_null_null(int i)20964418919fSjohnjiang test_ipsec_replay_inb_repeat_null_null(int i)
20974418919fSjohnjiang {
20984418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
20994418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
21004418919fSjohnjiang 	int rc;
21014418919fSjohnjiang 
21024418919fSjohnjiang 	/* create rte_ipsec_sa */
21034418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
21044418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
21054418919fSjohnjiang 	if (rc != 0) {
21064418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
21074418919fSjohnjiang 		return TEST_FAILED;
21084418919fSjohnjiang 	}
21094418919fSjohnjiang 
21104418919fSjohnjiang 	/* Generate test mbuf data */
21114418919fSjohnjiang 	ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool,
21124418919fSjohnjiang 		null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1);
21134418919fSjohnjiang 	if (ut_params->ibuf[0] == NULL)
21144418919fSjohnjiang 		rc = TEST_FAILED;
21154418919fSjohnjiang 	else
21164418919fSjohnjiang 		rc = test_ipsec_crypto_op_alloc(1);
21174418919fSjohnjiang 
21184418919fSjohnjiang 	if (rc == 0) {
21194418919fSjohnjiang 		/* call ipsec library api */
21204418919fSjohnjiang 		rc = crypto_ipsec(1);
21214418919fSjohnjiang 		if (rc == 0)
21224418919fSjohnjiang 			rc = replay_inb_null_null_check(ut_params, i, 1);
21234418919fSjohnjiang 		else {
21244418919fSjohnjiang 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
21254418919fSjohnjiang 					i);
21264418919fSjohnjiang 			rc = TEST_FAILED;
21274418919fSjohnjiang 		}
21284418919fSjohnjiang 	}
21294418919fSjohnjiang 
21304418919fSjohnjiang 	if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) {
21314418919fSjohnjiang 		/*
21324418919fSjohnjiang 		 * generate packet with repeat seq number in the replay
21334418919fSjohnjiang 		 * window
21344418919fSjohnjiang 		 */
21354418919fSjohnjiang 		if (ut_params->ibuf[0]) {
21364418919fSjohnjiang 			rte_pktmbuf_free(ut_params->ibuf[0]);
21374418919fSjohnjiang 			ut_params->ibuf[0] = 0;
21384418919fSjohnjiang 		}
21394418919fSjohnjiang 
21404418919fSjohnjiang 		ut_params->ibuf[0] = setup_test_string_tunneled(
21414418919fSjohnjiang 			ts_params->mbuf_pool, null_encrypted_data,
21424418919fSjohnjiang 			test_cfg[i].pkt_sz, INBOUND_SPI, 1);
21434418919fSjohnjiang 		if (ut_params->ibuf[0] == NULL)
21444418919fSjohnjiang 			rc = TEST_FAILED;
21454418919fSjohnjiang 		else
21464418919fSjohnjiang 			rc = test_ipsec_crypto_op_alloc(1);
21474418919fSjohnjiang 
21484418919fSjohnjiang 		if (rc == 0) {
21494418919fSjohnjiang 			/* call ipsec library api */
21504418919fSjohnjiang 			rc = crypto_ipsec(1);
21514418919fSjohnjiang 			if (rc == 0) {
21524418919fSjohnjiang 				RTE_LOG(ERR, USER1,
21534418919fSjohnjiang 					"packet is not repeated in the replay window, cfg %d seq %u\n",
21544418919fSjohnjiang 					i, 1);
21554418919fSjohnjiang 				rc = TEST_FAILED;
21564418919fSjohnjiang 			} else {
21574418919fSjohnjiang 				RTE_LOG(ERR, USER1,
21584418919fSjohnjiang 					"packet is repeated in the replay window, cfg %d seq %u\n",
21594418919fSjohnjiang 					i, 1);
21604418919fSjohnjiang 				rc = 0;
21614418919fSjohnjiang 			}
21624418919fSjohnjiang 		}
21634418919fSjohnjiang 	}
21644418919fSjohnjiang 
21654418919fSjohnjiang 	if (rc == TEST_FAILED)
21664418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
21674418919fSjohnjiang 
21684418919fSjohnjiang 	destroy_sa(0);
21694418919fSjohnjiang 
21704418919fSjohnjiang 	return rc;
21714418919fSjohnjiang }
21724418919fSjohnjiang 
21734418919fSjohnjiang static int
test_ipsec_replay_inb_repeat_null_null_wrapper(void)21744418919fSjohnjiang test_ipsec_replay_inb_repeat_null_null_wrapper(void)
21754418919fSjohnjiang {
21764418919fSjohnjiang 	int i;
21774418919fSjohnjiang 	int rc = 0;
21784418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
21794418919fSjohnjiang 
21804418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI;
21814418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
21824418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
21834418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
21844418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
21854418919fSjohnjiang 
21864418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
21874418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
21884418919fSjohnjiang 		rc = test_ipsec_replay_inb_repeat_null_null(i);
21894418919fSjohnjiang 	}
21904418919fSjohnjiang 
21914418919fSjohnjiang 	return rc;
21924418919fSjohnjiang }
21934418919fSjohnjiang 
21944418919fSjohnjiang static int
test_ipsec_replay_inb_inside_burst_null_null(int i)21954418919fSjohnjiang test_ipsec_replay_inb_inside_burst_null_null(int i)
21964418919fSjohnjiang {
21974418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
21984418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
21994418919fSjohnjiang 	uint16_t num_pkts = test_cfg[i].num_pkts;
22004418919fSjohnjiang 	int rc;
22014418919fSjohnjiang 	int j;
22024418919fSjohnjiang 
22034418919fSjohnjiang 	/* create rte_ipsec_sa*/
22044418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
22054418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
22064418919fSjohnjiang 	if (rc != 0) {
22074418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
22084418919fSjohnjiang 		return TEST_FAILED;
22094418919fSjohnjiang 	}
22104418919fSjohnjiang 
22114418919fSjohnjiang 	/* Generate inbound mbuf data */
22124418919fSjohnjiang 	ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool,
22134418919fSjohnjiang 		null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1);
22144418919fSjohnjiang 	if (ut_params->ibuf[0] == NULL)
22154418919fSjohnjiang 		rc = TEST_FAILED;
22164418919fSjohnjiang 	else
22174418919fSjohnjiang 		rc = test_ipsec_crypto_op_alloc(1);
22184418919fSjohnjiang 
22194418919fSjohnjiang 	if (rc == 0) {
22204418919fSjohnjiang 		/* call ipsec library api */
22214418919fSjohnjiang 		rc = crypto_ipsec(1);
22224418919fSjohnjiang 		if (rc == 0)
22234418919fSjohnjiang 			rc = replay_inb_null_null_check(ut_params, i, 1);
22244418919fSjohnjiang 		else {
22254418919fSjohnjiang 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
22264418919fSjohnjiang 					i);
22274418919fSjohnjiang 			rc = TEST_FAILED;
22284418919fSjohnjiang 		}
22294418919fSjohnjiang 	}
22304418919fSjohnjiang 
22314418919fSjohnjiang 	if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) {
22324418919fSjohnjiang 		/*
22334418919fSjohnjiang 		 *  generate packet(s) with seq number(s) inside the
22344418919fSjohnjiang 		 *  replay window
22354418919fSjohnjiang 		 */
22364418919fSjohnjiang 		if (ut_params->ibuf[0]) {
22374418919fSjohnjiang 			rte_pktmbuf_free(ut_params->ibuf[0]);
22384418919fSjohnjiang 			ut_params->ibuf[0] = 0;
22394418919fSjohnjiang 		}
22404418919fSjohnjiang 
22414418919fSjohnjiang 		for (j = 0; j < num_pkts && rc == 0; j++) {
22424418919fSjohnjiang 			/* packet with sequence number 1 already processed */
22434418919fSjohnjiang 			ut_params->ibuf[j] = setup_test_string_tunneled(
22444418919fSjohnjiang 				ts_params->mbuf_pool, null_encrypted_data,
22454418919fSjohnjiang 				test_cfg[i].pkt_sz, INBOUND_SPI, j + 2);
22464418919fSjohnjiang 			if (ut_params->ibuf[j] == NULL)
22474418919fSjohnjiang 				rc = TEST_FAILED;
22484418919fSjohnjiang 		}
22494418919fSjohnjiang 
22504418919fSjohnjiang 		if (rc == 0) {
22514418919fSjohnjiang 			if (test_cfg[i].reorder_pkts)
22524418919fSjohnjiang 				test_ipsec_reorder_inb_pkt_burst(num_pkts);
22534418919fSjohnjiang 			rc = test_ipsec_crypto_op_alloc(num_pkts);
22544418919fSjohnjiang 		}
22554418919fSjohnjiang 
22564418919fSjohnjiang 		if (rc == 0) {
22574418919fSjohnjiang 			/* call ipsec library api */
22584418919fSjohnjiang 			rc = crypto_ipsec(num_pkts);
22594418919fSjohnjiang 			if (rc == 0)
22604418919fSjohnjiang 				rc = replay_inb_null_null_check(
22614418919fSjohnjiang 						ut_params, i, num_pkts);
22624418919fSjohnjiang 			else {
22634418919fSjohnjiang 				RTE_LOG(ERR, USER1, "crypto_ipsec failed\n");
22644418919fSjohnjiang 				rc = TEST_FAILED;
22654418919fSjohnjiang 			}
22664418919fSjohnjiang 		}
22674418919fSjohnjiang 	}
22684418919fSjohnjiang 
22694418919fSjohnjiang 	if (rc == TEST_FAILED)
22704418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
22714418919fSjohnjiang 
22724418919fSjohnjiang 	destroy_sa(0);
22734418919fSjohnjiang 
22744418919fSjohnjiang 	return rc;
22754418919fSjohnjiang }
22764418919fSjohnjiang 
22774418919fSjohnjiang static int
test_ipsec_replay_inb_inside_burst_null_null_wrapper(void)22784418919fSjohnjiang test_ipsec_replay_inb_inside_burst_null_null_wrapper(void)
22794418919fSjohnjiang {
22804418919fSjohnjiang 	int i;
22814418919fSjohnjiang 	int rc = 0;
22824418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
22834418919fSjohnjiang 
22844418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI;
22854418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
22864418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
22874418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
22884418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
22894418919fSjohnjiang 
22904418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
22914418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
22924418919fSjohnjiang 		rc = test_ipsec_replay_inb_inside_burst_null_null(i);
22934418919fSjohnjiang 	}
22944418919fSjohnjiang 
22954418919fSjohnjiang 	return rc;
22964418919fSjohnjiang }
22974418919fSjohnjiang 
22984418919fSjohnjiang 
22994418919fSjohnjiang static int
crypto_inb_burst_2sa_null_null_check(struct ipsec_unitest_params * ut_params,int i)23004418919fSjohnjiang crypto_inb_burst_2sa_null_null_check(struct ipsec_unitest_params *ut_params,
23014418919fSjohnjiang 		int i)
23024418919fSjohnjiang {
23034418919fSjohnjiang 	uint16_t j;
23044418919fSjohnjiang 
23054418919fSjohnjiang 	for (j = 0; j < BURST_SIZE; j++) {
23064418919fSjohnjiang 		ut_params->pkt_index = j;
23074418919fSjohnjiang 
23084418919fSjohnjiang 		/* compare the data buffers */
23094418919fSjohnjiang 		TEST_ASSERT_BUFFERS_ARE_EQUAL(null_plain_data,
23104418919fSjohnjiang 			rte_pktmbuf_mtod(ut_params->obuf[j], void *),
23114418919fSjohnjiang 			test_cfg[i].pkt_sz,
23124418919fSjohnjiang 			"input and output data does not match\n");
23134418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
23144418919fSjohnjiang 			ut_params->obuf[j]->pkt_len,
23154418919fSjohnjiang 			"data_len is not equal to pkt_len");
23164418919fSjohnjiang 		TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
23174418919fSjohnjiang 			test_cfg[i].pkt_sz,
23184418919fSjohnjiang 			"data_len is not equal to input data");
23194418919fSjohnjiang 	}
23204418919fSjohnjiang 
23214418919fSjohnjiang 	return 0;
23224418919fSjohnjiang }
23234418919fSjohnjiang 
23244418919fSjohnjiang static int
test_ipsec_crypto_inb_burst_2sa_null_null(int i)23254418919fSjohnjiang test_ipsec_crypto_inb_burst_2sa_null_null(int i)
23264418919fSjohnjiang {
23274418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
23284418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
23294418919fSjohnjiang 	uint16_t num_pkts = test_cfg[i].num_pkts;
23304418919fSjohnjiang 	uint16_t j, r;
23314418919fSjohnjiang 	int rc = 0;
23324418919fSjohnjiang 
23334418919fSjohnjiang 	if (num_pkts != BURST_SIZE)
23344418919fSjohnjiang 		return rc;
23354418919fSjohnjiang 
23364418919fSjohnjiang 	/* create rte_ipsec_sa */
23374418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
23384418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
23394418919fSjohnjiang 	if (rc != 0) {
23404418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa 0 failed, cfg %d\n", i);
23414418919fSjohnjiang 		return TEST_FAILED;
23424418919fSjohnjiang 	}
23434418919fSjohnjiang 
23444418919fSjohnjiang 	/* create second rte_ipsec_sa */
23454418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI + 1;
23464418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
23474418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 1);
23484418919fSjohnjiang 	if (rc != 0) {
23494418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa 1 failed, cfg %d\n", i);
23504418919fSjohnjiang 		destroy_sa(0);
23514418919fSjohnjiang 		return TEST_FAILED;
23524418919fSjohnjiang 	}
23534418919fSjohnjiang 
23544418919fSjohnjiang 	/* Generate test mbuf data */
23554418919fSjohnjiang 	for (j = 0; j < num_pkts && rc == 0; j++) {
23564418919fSjohnjiang 		r = j % 2;
23574418919fSjohnjiang 		/* packet with sequence number 0 is invalid */
23584418919fSjohnjiang 		ut_params->ibuf[j] = setup_test_string_tunneled(
23594418919fSjohnjiang 			ts_params->mbuf_pool, null_encrypted_data,
23604418919fSjohnjiang 			test_cfg[i].pkt_sz, INBOUND_SPI + r, j + 1);
23614418919fSjohnjiang 		if (ut_params->ibuf[j] == NULL)
23624418919fSjohnjiang 			rc = TEST_FAILED;
23634418919fSjohnjiang 	}
23644418919fSjohnjiang 
23654418919fSjohnjiang 	if (rc == 0)
23664418919fSjohnjiang 		rc = test_ipsec_crypto_op_alloc(num_pkts);
23674418919fSjohnjiang 
23684418919fSjohnjiang 	if (rc == 0) {
23694418919fSjohnjiang 		/* call ipsec library api */
23704418919fSjohnjiang 		rc = crypto_ipsec_2sa();
23714418919fSjohnjiang 		if (rc == 0)
23724418919fSjohnjiang 			rc = crypto_inb_burst_2sa_null_null_check(
23734418919fSjohnjiang 					ut_params, i);
23744418919fSjohnjiang 		else {
23754418919fSjohnjiang 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
23764418919fSjohnjiang 				i);
23774418919fSjohnjiang 			rc = TEST_FAILED;
23784418919fSjohnjiang 		}
23794418919fSjohnjiang 	}
23804418919fSjohnjiang 
23814418919fSjohnjiang 	if (rc == TEST_FAILED)
23824418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
23834418919fSjohnjiang 
23844418919fSjohnjiang 	destroy_sa(0);
23854418919fSjohnjiang 	destroy_sa(1);
23864418919fSjohnjiang 	return rc;
23874418919fSjohnjiang }
23884418919fSjohnjiang 
23894418919fSjohnjiang static int
test_ipsec_crypto_inb_burst_2sa_null_null_wrapper(void)23904418919fSjohnjiang test_ipsec_crypto_inb_burst_2sa_null_null_wrapper(void)
23914418919fSjohnjiang {
23924418919fSjohnjiang 	int i;
23934418919fSjohnjiang 	int rc = 0;
23944418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
23954418919fSjohnjiang 
23964418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI;
23974418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
23984418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
23994418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
24004418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
24014418919fSjohnjiang 
24024418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
24034418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
24044418919fSjohnjiang 		rc = test_ipsec_crypto_inb_burst_2sa_null_null(i);
24054418919fSjohnjiang 	}
24064418919fSjohnjiang 
24074418919fSjohnjiang 	return rc;
24084418919fSjohnjiang }
24094418919fSjohnjiang 
24104418919fSjohnjiang static int
test_ipsec_crypto_inb_burst_2sa_4grp_null_null(int i)24114418919fSjohnjiang test_ipsec_crypto_inb_burst_2sa_4grp_null_null(int i)
24124418919fSjohnjiang {
24134418919fSjohnjiang 	struct ipsec_testsuite_params *ts_params = &testsuite_params;
24144418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
24154418919fSjohnjiang 	uint16_t num_pkts = test_cfg[i].num_pkts;
24164418919fSjohnjiang 	uint16_t j, k;
24174418919fSjohnjiang 	int rc = 0;
24184418919fSjohnjiang 
24194418919fSjohnjiang 	if (num_pkts != BURST_SIZE)
24204418919fSjohnjiang 		return rc;
24214418919fSjohnjiang 
24224418919fSjohnjiang 	/* create rte_ipsec_sa */
24234418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
24244418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
24254418919fSjohnjiang 	if (rc != 0) {
24264418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa 0 failed, cfg %d\n", i);
24274418919fSjohnjiang 		return TEST_FAILED;
24284418919fSjohnjiang 	}
24294418919fSjohnjiang 
24304418919fSjohnjiang 	/* create second rte_ipsec_sa */
24314418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI + 1;
24324418919fSjohnjiang 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
24334418919fSjohnjiang 			test_cfg[i].replay_win_sz, test_cfg[i].flags, 1);
24344418919fSjohnjiang 	if (rc != 0) {
24354418919fSjohnjiang 		RTE_LOG(ERR, USER1, "create_sa 1 failed, cfg %d\n", i);
24364418919fSjohnjiang 		destroy_sa(0);
24374418919fSjohnjiang 		return TEST_FAILED;
24384418919fSjohnjiang 	}
24394418919fSjohnjiang 
24404418919fSjohnjiang 	/* Generate test mbuf data */
24414418919fSjohnjiang 	for (j = 0; j < num_pkts && rc == 0; j++) {
24424418919fSjohnjiang 		k = crypto_ipsec_4grp(j);
24434418919fSjohnjiang 
24444418919fSjohnjiang 		/* packet with sequence number 0 is invalid */
24454418919fSjohnjiang 		ut_params->ibuf[j] = setup_test_string_tunneled(
24464418919fSjohnjiang 			ts_params->mbuf_pool, null_encrypted_data,
24474418919fSjohnjiang 			test_cfg[i].pkt_sz, INBOUND_SPI + k, j + 1);
24484418919fSjohnjiang 		if (ut_params->ibuf[j] == NULL)
24494418919fSjohnjiang 			rc = TEST_FAILED;
24504418919fSjohnjiang 	}
24514418919fSjohnjiang 
24524418919fSjohnjiang 	if (rc == 0)
24534418919fSjohnjiang 		rc = test_ipsec_crypto_op_alloc(num_pkts);
24544418919fSjohnjiang 
24554418919fSjohnjiang 	if (rc == 0) {
24564418919fSjohnjiang 		/* call ipsec library api */
24574418919fSjohnjiang 		rc = crypto_ipsec_2sa_4grp();
24584418919fSjohnjiang 		if (rc == 0)
24594418919fSjohnjiang 			rc = crypto_inb_burst_2sa_null_null_check(
24604418919fSjohnjiang 					ut_params, i);
24614418919fSjohnjiang 		else {
24624418919fSjohnjiang 			RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
24634418919fSjohnjiang 				i);
24644418919fSjohnjiang 			rc = TEST_FAILED;
24654418919fSjohnjiang 		}
24664418919fSjohnjiang 	}
24674418919fSjohnjiang 
24684418919fSjohnjiang 	if (rc == TEST_FAILED)
24694418919fSjohnjiang 		test_ipsec_dump_buffers(ut_params, i);
24704418919fSjohnjiang 
24714418919fSjohnjiang 	destroy_sa(0);
24724418919fSjohnjiang 	destroy_sa(1);
24734418919fSjohnjiang 	return rc;
24744418919fSjohnjiang }
24754418919fSjohnjiang 
24764418919fSjohnjiang static int
test_ipsec_crypto_inb_burst_2sa_4grp_null_null_wrapper(void)24774418919fSjohnjiang test_ipsec_crypto_inb_burst_2sa_4grp_null_null_wrapper(void)
24784418919fSjohnjiang {
24794418919fSjohnjiang 	int i;
24804418919fSjohnjiang 	int rc = 0;
24814418919fSjohnjiang 	struct ipsec_unitest_params *ut_params = &unittest_params;
24824418919fSjohnjiang 
24834418919fSjohnjiang 	ut_params->ipsec_xform.spi = INBOUND_SPI;
24844418919fSjohnjiang 	ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
24854418919fSjohnjiang 	ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
24864418919fSjohnjiang 	ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
24874418919fSjohnjiang 	ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
24884418919fSjohnjiang 
24894418919fSjohnjiang 	for (i = 0; i < num_cfg && rc == 0; i++) {
24904418919fSjohnjiang 		ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
24914418919fSjohnjiang 		rc = test_ipsec_crypto_inb_burst_2sa_4grp_null_null(i);
24924418919fSjohnjiang 	}
24934418919fSjohnjiang 
24944418919fSjohnjiang 	return rc;
24954418919fSjohnjiang }
24964418919fSjohnjiang 
24974418919fSjohnjiang static struct unit_test_suite ipsec_testsuite  = {
24984418919fSjohnjiang 	.suite_name = "IPsec NULL Unit Test Suite",
24994418919fSjohnjiang 	.setup = testsuite_setup,
25004418919fSjohnjiang 	.teardown = testsuite_teardown,
25014418919fSjohnjiang 	.unit_test_cases = {
25024418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25034418919fSjohnjiang 			test_ipsec_crypto_inb_burst_null_null_wrapper),
25044418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25054418919fSjohnjiang 			test_ipsec_crypto_outb_burst_null_null_wrapper),
25064418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25074418919fSjohnjiang 			test_ipsec_inline_crypto_inb_burst_null_null_wrapper),
25084418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25094418919fSjohnjiang 			test_ipsec_inline_crypto_outb_burst_null_null_wrapper),
25104418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25114418919fSjohnjiang 			test_ipsec_inline_proto_inb_burst_null_null_wrapper),
25124418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25134418919fSjohnjiang 			test_ipsec_inline_proto_outb_burst_null_null_wrapper),
25144418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25154418919fSjohnjiang 			test_ipsec_lksd_proto_inb_burst_null_null_wrapper),
25164418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25174418919fSjohnjiang 			test_ipsec_lksd_proto_outb_burst_null_null_wrapper),
25184418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25194418919fSjohnjiang 			test_ipsec_replay_inb_inside_null_null_wrapper),
25204418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25214418919fSjohnjiang 			test_ipsec_replay_inb_outside_null_null_wrapper),
25224418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25234418919fSjohnjiang 			test_ipsec_replay_inb_repeat_null_null_wrapper),
25244418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25254418919fSjohnjiang 			test_ipsec_replay_inb_inside_burst_null_null_wrapper),
25264418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25274418919fSjohnjiang 			test_ipsec_crypto_inb_burst_2sa_null_null_wrapper),
25284418919fSjohnjiang 		TEST_CASE_ST(ut_setup, ut_teardown,
25294418919fSjohnjiang 			test_ipsec_crypto_inb_burst_2sa_4grp_null_null_wrapper),
25304418919fSjohnjiang 		TEST_CASES_END() /**< NULL terminate unit test array */
25314418919fSjohnjiang 	}
25324418919fSjohnjiang };
25334418919fSjohnjiang 
25344418919fSjohnjiang static int
test_ipsec(void)25354418919fSjohnjiang test_ipsec(void)
25364418919fSjohnjiang {
25374418919fSjohnjiang 	return unit_test_suite_runner(&ipsec_testsuite);
25384418919fSjohnjiang }
25394418919fSjohnjiang 
25404418919fSjohnjiang REGISTER_TEST_COMMAND(ipsec_autotest, test_ipsec);
2541