xref: /dpdk/app/test-security-perf/test_security_perf.c (revision 838e8dec47afb3729014339d75efeb1067a096bb)
11f5cfe96SAnoob Joseph /* SPDX-License-Identifier: BSD-3-Clause
21f5cfe96SAnoob Joseph  * Copyright(c) 2022, Marvell
31f5cfe96SAnoob Joseph  */
41f5cfe96SAnoob Joseph 
51f5cfe96SAnoob Joseph #include <getopt.h>
61f5cfe96SAnoob Joseph #include <stdlib.h>
71f5cfe96SAnoob Joseph #include <unistd.h>
81f5cfe96SAnoob Joseph 
91f5cfe96SAnoob Joseph #include <rte_common.h>
101f5cfe96SAnoob Joseph #include <rte_cryptodev.h>
111f5cfe96SAnoob Joseph #include <rte_eal.h>
121f5cfe96SAnoob Joseph #include <rte_lcore.h>
131f5cfe96SAnoob Joseph #include <rte_malloc.h>
141f5cfe96SAnoob Joseph #include <rte_security.h>
151f5cfe96SAnoob Joseph 
161f5cfe96SAnoob Joseph #include <app/test/test_cryptodev.h>
171f5cfe96SAnoob Joseph #include <app/test/test_cryptodev_security_ipsec.h>
181f5cfe96SAnoob Joseph #include <app/test/test_cryptodev_security_ipsec_test_vectors.h>
191d3a3e18SAnoob Joseph #include <app/test/test_security_proto.h>
201f5cfe96SAnoob Joseph 
211f5cfe96SAnoob Joseph #define NB_DESC 4096
221f5cfe96SAnoob Joseph #define DEF_NB_SESSIONS (16 * 10 * 1024) /* 16 * 10K tunnels */
231f5cfe96SAnoob Joseph 
241f5cfe96SAnoob Joseph struct lcore_conf {
251f5cfe96SAnoob Joseph 	struct rte_crypto_sym_xform cipher_xform;
261f5cfe96SAnoob Joseph 	struct rte_crypto_sym_xform auth_xform;
271f5cfe96SAnoob Joseph 	struct rte_crypto_sym_xform aead_xform;
281f5cfe96SAnoob Joseph 	uint8_t dev_id;
291f5cfe96SAnoob Joseph 	uint8_t qp_id;
301f5cfe96SAnoob Joseph 	struct test_ctx *ctx;
311f5cfe96SAnoob Joseph };
321f5cfe96SAnoob Joseph 
331f5cfe96SAnoob Joseph struct test_ctx {
341f5cfe96SAnoob Joseph 	struct lcore_conf lconf[RTE_MAX_LCORE];
351f5cfe96SAnoob Joseph 	void *sec_ctx;
361f5cfe96SAnoob Joseph 	struct rte_mempool *sess_mp;
371f5cfe96SAnoob Joseph 	struct ipsec_test_data *td;
381f5cfe96SAnoob Joseph 	int nb_sess;
391f5cfe96SAnoob Joseph 	unsigned long td_idx;
401f5cfe96SAnoob Joseph 	uint8_t nb_lcores;
411f5cfe96SAnoob Joseph 	uint8_t nb_cryptodevs;
421f5cfe96SAnoob Joseph 	uint8_t enabled_cdevs[RTE_CRYPTO_MAX_DEVS];
431f5cfe96SAnoob Joseph 	bool is_inbound;
441f5cfe96SAnoob Joseph };
451f5cfe96SAnoob Joseph 
461f5cfe96SAnoob Joseph static struct test_ctx ctx;
471f5cfe96SAnoob Joseph 
481f5cfe96SAnoob Joseph static int
cryptodev_init(struct test_ctx * ctx,uint8_t nb_lcores)491f5cfe96SAnoob Joseph cryptodev_init(struct test_ctx *ctx, uint8_t nb_lcores)
501f5cfe96SAnoob Joseph {
511f5cfe96SAnoob Joseph 	const char dev_names[][RTE_CRYPTODEV_NAME_MAX_LEN] = {
521f5cfe96SAnoob Joseph 		"crypto_cn10k",
531f5cfe96SAnoob Joseph 		"crypto_cn9k",
541f5cfe96SAnoob Joseph 		"crypto_dpaa_sec",
551f5cfe96SAnoob Joseph 		"crypto_dpaa2_sec",
561f5cfe96SAnoob Joseph 	};
571f5cfe96SAnoob Joseph 	struct rte_cryptodev_qp_conf qp_conf;
581f5cfe96SAnoob Joseph 	struct rte_cryptodev_info dev_info;
591f5cfe96SAnoob Joseph 	struct rte_cryptodev_config config;
601f5cfe96SAnoob Joseph 	unsigned int j, nb_qp, qps_reqd;
611f5cfe96SAnoob Joseph 	uint8_t socket_id;
621f5cfe96SAnoob Joseph 	uint32_t dev_cnt;
631f5cfe96SAnoob Joseph 	int ret, core_id;
641f5cfe96SAnoob Joseph 	void *sec_ctx;
651f5cfe96SAnoob Joseph 	uint64_t i;
661f5cfe96SAnoob Joseph 
671f5cfe96SAnoob Joseph 	i = 0;
681f5cfe96SAnoob Joseph 	do {
691f5cfe96SAnoob Joseph 		dev_cnt = rte_cryptodev_devices_get(dev_names[i],
701f5cfe96SAnoob Joseph 						     ctx->enabled_cdevs,
711f5cfe96SAnoob Joseph 						     RTE_CRYPTO_MAX_DEVS);
721f5cfe96SAnoob Joseph 		i++;
731f5cfe96SAnoob Joseph 	} while (dev_cnt == 0 && i < RTE_DIM(dev_names));
741f5cfe96SAnoob Joseph 
751f5cfe96SAnoob Joseph 	if (dev_cnt == 0)
761f5cfe96SAnoob Joseph 		return -1;
771f5cfe96SAnoob Joseph 
781f5cfe96SAnoob Joseph 	/* Check first device for capabilities */
791f5cfe96SAnoob Joseph 	rte_cryptodev_info_get(0, &dev_info);
801f5cfe96SAnoob Joseph 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
811f5cfe96SAnoob Joseph 		RTE_LOG(ERR, USER1,
821f5cfe96SAnoob Joseph 			"Security not supported by the cryptodev\n");
831f5cfe96SAnoob Joseph 		return -1;
841f5cfe96SAnoob Joseph 	}
851f5cfe96SAnoob Joseph 
861f5cfe96SAnoob Joseph 	sec_ctx = rte_cryptodev_get_sec_ctx(0);
871f5cfe96SAnoob Joseph 	ctx->sec_ctx = sec_ctx;
881f5cfe96SAnoob Joseph 
891f5cfe96SAnoob Joseph 	socket_id = rte_socket_id();
901f5cfe96SAnoob Joseph 	qps_reqd = nb_lcores;
911f5cfe96SAnoob Joseph 	core_id = 0;
921f5cfe96SAnoob Joseph 	i = 0;
931f5cfe96SAnoob Joseph 
941f5cfe96SAnoob Joseph 	do {
951f5cfe96SAnoob Joseph 		rte_cryptodev_info_get(i, &dev_info);
961f5cfe96SAnoob Joseph 		qps_reqd = RTE_MIN(dev_info.max_nb_queue_pairs, qps_reqd);
971f5cfe96SAnoob Joseph 
981f5cfe96SAnoob Joseph 		for (j = 0; j < qps_reqd; j++) {
991f5cfe96SAnoob Joseph 			ctx->lconf[core_id].dev_id = i;
1001f5cfe96SAnoob Joseph 			ctx->lconf[core_id].qp_id = j;
1011f5cfe96SAnoob Joseph 			ctx->lconf[core_id].ctx = ctx;
1021f5cfe96SAnoob Joseph 			core_id++;
1031f5cfe96SAnoob Joseph 			if (core_id == RTE_MAX_LCORE)
1041f5cfe96SAnoob Joseph 				break;
1051f5cfe96SAnoob Joseph 		}
1061f5cfe96SAnoob Joseph 
1071f5cfe96SAnoob Joseph 		nb_qp = j;
1081f5cfe96SAnoob Joseph 
1091f5cfe96SAnoob Joseph 		memset(&config, 0, sizeof(config));
1101f5cfe96SAnoob Joseph 		config.nb_queue_pairs = nb_qp;
1111f5cfe96SAnoob Joseph 		config.socket_id = socket_id;
1121f5cfe96SAnoob Joseph 
1131f5cfe96SAnoob Joseph 		ret = rte_cryptodev_configure(i, &config);
1141f5cfe96SAnoob Joseph 		if (ret < 0) {
1151f5cfe96SAnoob Joseph 			RTE_LOG(ERR, USER1,
1161f5cfe96SAnoob Joseph 				"Could not configure cryptodev - %" PRIu64 "\n",
1171f5cfe96SAnoob Joseph 				i);
1181f5cfe96SAnoob Joseph 			return -1;
1191f5cfe96SAnoob Joseph 		}
1201f5cfe96SAnoob Joseph 
1211f5cfe96SAnoob Joseph 		memset(&qp_conf, 0, sizeof(qp_conf));
1221f5cfe96SAnoob Joseph 		qp_conf.nb_descriptors = NB_DESC;
1231f5cfe96SAnoob Joseph 
1241f5cfe96SAnoob Joseph 		for (j = 0; j < nb_qp; j++) {
1251f5cfe96SAnoob Joseph 			ret = rte_cryptodev_queue_pair_setup(i, j, &qp_conf,
1261f5cfe96SAnoob Joseph 							     socket_id);
1271f5cfe96SAnoob Joseph 			if (ret < 0) {
1281f5cfe96SAnoob Joseph 				RTE_LOG(ERR, USER1,
1291f5cfe96SAnoob Joseph 					"Could not configure queue pair:"
1301f5cfe96SAnoob Joseph 					" %" PRIu64 " - %d\n", i, j);
1311f5cfe96SAnoob Joseph 				return -1;
1321f5cfe96SAnoob Joseph 			}
1331f5cfe96SAnoob Joseph 		}
1341f5cfe96SAnoob Joseph 
1351f5cfe96SAnoob Joseph 		ret = rte_cryptodev_start(i);
1361f5cfe96SAnoob Joseph 		if (ret < 0) {
1371f5cfe96SAnoob Joseph 			RTE_LOG(ERR, USER1, "Could not start cryptodev\n");
1381f5cfe96SAnoob Joseph 			return -1;
1391f5cfe96SAnoob Joseph 		}
1401f5cfe96SAnoob Joseph 
1411f5cfe96SAnoob Joseph 		i++;
1421f5cfe96SAnoob Joseph 		qps_reqd -= j;
1431f5cfe96SAnoob Joseph 
1441f5cfe96SAnoob Joseph 	} while (i < dev_cnt && core_id < RTE_MAX_LCORE);
1451f5cfe96SAnoob Joseph 
1461f5cfe96SAnoob Joseph 	ctx->nb_cryptodevs = i;
1471f5cfe96SAnoob Joseph 
1481f5cfe96SAnoob Joseph 	return 0;
1491f5cfe96SAnoob Joseph }
1501f5cfe96SAnoob Joseph 
1511f5cfe96SAnoob Joseph static int
cryptodev_fini(struct test_ctx * ctx)1521f5cfe96SAnoob Joseph cryptodev_fini(struct test_ctx *ctx)
1531f5cfe96SAnoob Joseph {
1541f5cfe96SAnoob Joseph 	int i, ret = 0;
1551f5cfe96SAnoob Joseph 
1561f5cfe96SAnoob Joseph 	for (i = 0; i < ctx->nb_cryptodevs &&
1571f5cfe96SAnoob Joseph 			i < RTE_CRYPTO_MAX_DEVS; i++) {
1581f5cfe96SAnoob Joseph 		rte_cryptodev_stop(ctx->enabled_cdevs[i]);
1591f5cfe96SAnoob Joseph 		ret = rte_cryptodev_close(ctx->enabled_cdevs[i]);
1601f5cfe96SAnoob Joseph 		if (ret)
1611f5cfe96SAnoob Joseph 			RTE_LOG(ERR, USER1,
1621f5cfe96SAnoob Joseph 					"Crypto device close error %d\n", ret);
1631f5cfe96SAnoob Joseph 	}
1641f5cfe96SAnoob Joseph 
1651f5cfe96SAnoob Joseph 	return ret;
1661f5cfe96SAnoob Joseph }
1671f5cfe96SAnoob Joseph 
1681f5cfe96SAnoob Joseph static int
mempool_init(struct test_ctx * ctx,uint8_t nb_lcores)1691f5cfe96SAnoob Joseph mempool_init(struct test_ctx *ctx, uint8_t nb_lcores)
1701f5cfe96SAnoob Joseph {
1711f5cfe96SAnoob Joseph 	struct rte_mempool *sess_mpool;
1721f5cfe96SAnoob Joseph 	unsigned int sec_sess_sz;
1731f5cfe96SAnoob Joseph 	int nb_sess_total;
1741f5cfe96SAnoob Joseph 
1751f5cfe96SAnoob Joseph 	nb_sess_total = ctx->nb_sess + RTE_MEMPOOL_CACHE_MAX_SIZE * nb_lcores;
1761f5cfe96SAnoob Joseph 
1771f5cfe96SAnoob Joseph 	sec_sess_sz = rte_security_session_get_size(ctx->sec_ctx);
1781f5cfe96SAnoob Joseph 
1791f5cfe96SAnoob Joseph 	sess_mpool = rte_cryptodev_sym_session_pool_create("test_sess_mp",
1801f5cfe96SAnoob Joseph 			nb_sess_total, sec_sess_sz, RTE_MEMPOOL_CACHE_MAX_SIZE,
1811f5cfe96SAnoob Joseph 			0, SOCKET_ID_ANY);
1821f5cfe96SAnoob Joseph 	if (sess_mpool == NULL) {
1831f5cfe96SAnoob Joseph 		RTE_LOG(ERR, USER1, "Could not create mempool\n");
1841f5cfe96SAnoob Joseph 		return -1;
1851f5cfe96SAnoob Joseph 	}
1861f5cfe96SAnoob Joseph 
1871f5cfe96SAnoob Joseph 	ctx->sess_mp = sess_mpool;
1881f5cfe96SAnoob Joseph 
1891f5cfe96SAnoob Joseph 	return 0;
1901f5cfe96SAnoob Joseph }
1911f5cfe96SAnoob Joseph 
1921f5cfe96SAnoob Joseph static int
mempool_fini(struct test_ctx * ctx)1931f5cfe96SAnoob Joseph mempool_fini(struct test_ctx *ctx)
1941f5cfe96SAnoob Joseph {
1951f5cfe96SAnoob Joseph 	rte_mempool_free(ctx->sess_mp);
1961f5cfe96SAnoob Joseph 
1971f5cfe96SAnoob Joseph 	return 0;
1981f5cfe96SAnoob Joseph }
1991f5cfe96SAnoob Joseph 
2001f5cfe96SAnoob Joseph static int
sec_conf_init(struct lcore_conf * conf,struct rte_security_session_conf * sess_conf,struct rte_security_ipsec_xform * ipsec_xform,const struct ipsec_test_data * td)2011f5cfe96SAnoob Joseph sec_conf_init(struct lcore_conf *conf,
2021f5cfe96SAnoob Joseph 	      struct rte_security_session_conf *sess_conf,
2031f5cfe96SAnoob Joseph 	      struct rte_security_ipsec_xform *ipsec_xform,
2041f5cfe96SAnoob Joseph 	      const struct ipsec_test_data *td)
2051f5cfe96SAnoob Joseph {
2061f5cfe96SAnoob Joseph 	uint16_t v6_src[8] = {0x2607, 0xf8b0, 0x400c, 0x0c03, 0x0000, 0x0000,
2071f5cfe96SAnoob Joseph 				0x0000, 0x001a};
2081f5cfe96SAnoob Joseph 	uint16_t v6_dst[8] = {0x2001, 0x0470, 0xe5bf, 0xdead, 0x4957, 0x2174,
2091f5cfe96SAnoob Joseph 				0xe82c, 0x4887};
2101f5cfe96SAnoob Joseph 	const struct rte_ipv4_hdr *ipv4 =
2111f5cfe96SAnoob Joseph 			(const struct rte_ipv4_hdr *)td->output_text.data;
2121f5cfe96SAnoob Joseph 	struct rte_security_capability_idx sec_cap_idx;
2131f5cfe96SAnoob Joseph 	const struct rte_security_capability *sec_cap;
2141f5cfe96SAnoob Joseph 	enum rte_security_ipsec_sa_direction dir;
2151f5cfe96SAnoob Joseph 	uint32_t src, dst;
2161f5cfe96SAnoob Joseph 	int salt_len;
2171f5cfe96SAnoob Joseph 
2181f5cfe96SAnoob Joseph 	/* Copy IPsec xform */
2191f5cfe96SAnoob Joseph 	memcpy(ipsec_xform, &td->ipsec_xform, sizeof(*ipsec_xform));
2201f5cfe96SAnoob Joseph 
2211f5cfe96SAnoob Joseph 	dir = ipsec_xform->direction;
2221f5cfe96SAnoob Joseph 
2231f5cfe96SAnoob Joseph 	memcpy(&src, &ipv4->src_addr, sizeof(ipv4->src_addr));
2241f5cfe96SAnoob Joseph 	memcpy(&dst, &ipv4->dst_addr, sizeof(ipv4->dst_addr));
2251f5cfe96SAnoob Joseph 
2261f5cfe96SAnoob Joseph 	if (td->ipsec_xform.mode == RTE_SECURITY_IPSEC_SA_MODE_TUNNEL) {
2271f5cfe96SAnoob Joseph 		if (td->ipsec_xform.tunnel.type ==
2281f5cfe96SAnoob Joseph 				RTE_SECURITY_IPSEC_TUNNEL_IPV4) {
2291f5cfe96SAnoob Joseph 			memcpy(&ipsec_xform->tunnel.ipv4.src_ip, &src,
2301f5cfe96SAnoob Joseph 			       sizeof(src));
2311f5cfe96SAnoob Joseph 			memcpy(&ipsec_xform->tunnel.ipv4.dst_ip, &dst,
2321f5cfe96SAnoob Joseph 			       sizeof(dst));
2331f5cfe96SAnoob Joseph 
2341f5cfe96SAnoob Joseph 		} else {
2351f5cfe96SAnoob Joseph 			memcpy(&ipsec_xform->tunnel.ipv6.src_addr, &v6_src,
2361f5cfe96SAnoob Joseph 			       sizeof(v6_src));
2371f5cfe96SAnoob Joseph 			memcpy(&ipsec_xform->tunnel.ipv6.dst_addr, &v6_dst,
2381f5cfe96SAnoob Joseph 			       sizeof(v6_dst));
2391f5cfe96SAnoob Joseph 		}
2401f5cfe96SAnoob Joseph 	}
2411f5cfe96SAnoob Joseph 
2421f5cfe96SAnoob Joseph 	sec_cap_idx.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
2431f5cfe96SAnoob Joseph 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
2441f5cfe96SAnoob Joseph 	sec_cap_idx.ipsec.proto = ipsec_xform->proto;
2451f5cfe96SAnoob Joseph 	sec_cap_idx.ipsec.mode = ipsec_xform->mode;
2461f5cfe96SAnoob Joseph 	sec_cap_idx.ipsec.direction = ipsec_xform->direction;
2471f5cfe96SAnoob Joseph 
2481f5cfe96SAnoob Joseph 	sec_cap = rte_security_capability_get(conf->ctx->sec_ctx, &sec_cap_idx);
2491f5cfe96SAnoob Joseph 	if (sec_cap == NULL) {
2501f5cfe96SAnoob Joseph 		RTE_LOG(ERR, USER1, "Could not get capabilities\n");
2511f5cfe96SAnoob Joseph 		return -1;
2521f5cfe96SAnoob Joseph 	}
2531f5cfe96SAnoob Joseph 
2541f5cfe96SAnoob Joseph 	/* Copy cipher session parameters */
2551f5cfe96SAnoob Joseph 	if (td[0].aead) {
2561f5cfe96SAnoob Joseph 		memcpy(&conf->aead_xform, &td[0].xform.aead,
2571f5cfe96SAnoob Joseph 		       sizeof(conf->aead_xform));
2581f5cfe96SAnoob Joseph 		conf->aead_xform.aead.key.data = td[0].key.data;
2591f5cfe96SAnoob Joseph 		conf->aead_xform.aead.iv.offset = IV_OFFSET;
2601f5cfe96SAnoob Joseph 
2611f5cfe96SAnoob Joseph 		/* Verify crypto capabilities */
2621d3a3e18SAnoob Joseph 		if (test_sec_crypto_caps_aead_verify(sec_cap, &conf->aead_xform) != 0) {
2631f5cfe96SAnoob Joseph 			RTE_LOG(ERR, USER1,
2641f5cfe96SAnoob Joseph 				"Crypto capabilities not supported\n");
2651f5cfe96SAnoob Joseph 			return -1;
2661f5cfe96SAnoob Joseph 		}
2671f5cfe96SAnoob Joseph 	} else if (td[0].auth_only) {
2681f5cfe96SAnoob Joseph 		memcpy(&conf->auth_xform, &td[0].xform.chain.auth,
2691f5cfe96SAnoob Joseph 		       sizeof(conf->auth_xform));
2701f5cfe96SAnoob Joseph 		conf->auth_xform.auth.key.data = td[0].auth_key.data;
2711f5cfe96SAnoob Joseph 
2721d3a3e18SAnoob Joseph 		if (test_sec_crypto_caps_auth_verify(sec_cap, &conf->auth_xform) != 0) {
2731f5cfe96SAnoob Joseph 			RTE_LOG(INFO, USER1,
2741f5cfe96SAnoob Joseph 				"Auth crypto capabilities not supported\n");
2751f5cfe96SAnoob Joseph 			return -1;
2761f5cfe96SAnoob Joseph 		}
2771f5cfe96SAnoob Joseph 	} else {
2781f5cfe96SAnoob Joseph 		memcpy(&conf->cipher_xform, &td[0].xform.chain.cipher,
2791f5cfe96SAnoob Joseph 		       sizeof(conf->cipher_xform));
2801f5cfe96SAnoob Joseph 		memcpy(&conf->auth_xform, &td[0].xform.chain.auth,
2811f5cfe96SAnoob Joseph 		       sizeof(conf->auth_xform));
2821f5cfe96SAnoob Joseph 		conf->cipher_xform.cipher.key.data = td[0].key.data;
2831f5cfe96SAnoob Joseph 		conf->cipher_xform.cipher.iv.offset = IV_OFFSET;
2841f5cfe96SAnoob Joseph 		conf->auth_xform.auth.key.data = td[0].auth_key.data;
2851f5cfe96SAnoob Joseph 
2861f5cfe96SAnoob Joseph 		/* Verify crypto capabilities */
2871f5cfe96SAnoob Joseph 
2881d3a3e18SAnoob Joseph 		if (test_sec_crypto_caps_cipher_verify(sec_cap, &conf->cipher_xform) != 0) {
2891f5cfe96SAnoob Joseph 			RTE_LOG(ERR, USER1,
2901f5cfe96SAnoob Joseph 				"Cipher crypto capabilities not supported\n");
2911f5cfe96SAnoob Joseph 			return -1;
2921f5cfe96SAnoob Joseph 		}
2931f5cfe96SAnoob Joseph 
2941d3a3e18SAnoob Joseph 		if (test_sec_crypto_caps_auth_verify(sec_cap, &conf->auth_xform) != 0) {
2951f5cfe96SAnoob Joseph 			RTE_LOG(ERR, USER1,
2961f5cfe96SAnoob Joseph 				"Auth crypto capabilities not supported\n");
2971f5cfe96SAnoob Joseph 			return -1;
2981f5cfe96SAnoob Joseph 		}
2991f5cfe96SAnoob Joseph 	}
3001f5cfe96SAnoob Joseph 
3011f5cfe96SAnoob Joseph 	if (test_ipsec_sec_caps_verify(ipsec_xform, sec_cap, 0) != 0)
3021f5cfe96SAnoob Joseph 		return -1;
3031f5cfe96SAnoob Joseph 
3041f5cfe96SAnoob Joseph 	sess_conf->action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
3051f5cfe96SAnoob Joseph 	sess_conf->protocol = RTE_SECURITY_PROTOCOL_IPSEC;
3061f5cfe96SAnoob Joseph 
3071f5cfe96SAnoob Joseph 	if (td[0].aead || td[0].aes_gmac) {
3081f5cfe96SAnoob Joseph 		salt_len = RTE_MIN(sizeof(ipsec_xform->salt), td[0].salt.len);
3091f5cfe96SAnoob Joseph 		memcpy(&ipsec_xform->salt, td[0].salt.data, salt_len);
3101f5cfe96SAnoob Joseph 	}
3111f5cfe96SAnoob Joseph 
3121f5cfe96SAnoob Joseph 	if (td[0].aead) {
3131f5cfe96SAnoob Joseph 		sess_conf->ipsec = *ipsec_xform;
3141f5cfe96SAnoob Joseph 		sess_conf->crypto_xform = &conf->aead_xform;
3151f5cfe96SAnoob Joseph 	} else if (td[0].auth_only) {
3161f5cfe96SAnoob Joseph 		sess_conf->ipsec = *ipsec_xform;
3171f5cfe96SAnoob Joseph 		sess_conf->crypto_xform = &conf->auth_xform;
3181f5cfe96SAnoob Joseph 	} else {
3191f5cfe96SAnoob Joseph 		sess_conf->ipsec = *ipsec_xform;
3201f5cfe96SAnoob Joseph 		if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) {
3211f5cfe96SAnoob Joseph 			sess_conf->crypto_xform = &conf->cipher_xform;
3221f5cfe96SAnoob Joseph 			conf->cipher_xform.next = &conf->auth_xform;
3231f5cfe96SAnoob Joseph 		} else {
3241f5cfe96SAnoob Joseph 			sess_conf->crypto_xform = &conf->auth_xform;
3251f5cfe96SAnoob Joseph 			conf->auth_xform.next = &conf->cipher_xform;
3261f5cfe96SAnoob Joseph 		}
3271f5cfe96SAnoob Joseph 	}
3281f5cfe96SAnoob Joseph 
3291f5cfe96SAnoob Joseph 	return 0;
3301f5cfe96SAnoob Joseph }
3311f5cfe96SAnoob Joseph 
3321f5cfe96SAnoob Joseph static int
test_security_session_perf(void * arg)3331f5cfe96SAnoob Joseph test_security_session_perf(void *arg)
3341f5cfe96SAnoob Joseph {
3351f5cfe96SAnoob Joseph 	uint64_t tsc_start, tsc_mid, tsc_end, tsc_setup_dur, tsc_destroy_dur;
3361f5cfe96SAnoob Joseph 	struct rte_security_ipsec_xform ipsec_xform;
3371f5cfe96SAnoob Joseph 	struct rte_security_session_conf sess_conf;
3381f5cfe96SAnoob Joseph 	int i, ret, nb_sessions, nb_sess_total;
3391f5cfe96SAnoob Joseph 	struct rte_security_session **sess;
34079bdb787SAkhil Goyal 	void *sec_ctx;
3411f5cfe96SAnoob Joseph 	double setup_rate, destroy_rate;
3421f5cfe96SAnoob Joseph 	uint64_t setup_ms, destroy_ms;
3431f5cfe96SAnoob Joseph 	struct lcore_conf *conf = arg;
3441f5cfe96SAnoob Joseph 	struct rte_mempool *sess_mp;
3451f5cfe96SAnoob Joseph 	uint8_t nb_lcores;
3461f5cfe96SAnoob Joseph 
3471f5cfe96SAnoob Joseph 	nb_lcores = conf->ctx->nb_lcores;
3481f5cfe96SAnoob Joseph 	nb_sess_total = conf->ctx->nb_sess;
3491f5cfe96SAnoob Joseph 	sec_ctx = conf->ctx->sec_ctx;
3501f5cfe96SAnoob Joseph 	sess_mp = conf->ctx->sess_mp;
3511f5cfe96SAnoob Joseph 
3521f5cfe96SAnoob Joseph 	nb_sessions = nb_sess_total / nb_lcores;
3531f5cfe96SAnoob Joseph 
3541f5cfe96SAnoob Joseph 	if (conf->qp_id == 0)
3551f5cfe96SAnoob Joseph 		nb_sessions += (nb_sess_total - nb_sessions * nb_lcores);
3561f5cfe96SAnoob Joseph 
3571f5cfe96SAnoob Joseph 	ret = sec_conf_init(conf, &sess_conf, &ipsec_xform,
3581f5cfe96SAnoob Joseph 			    &ctx.td[ctx.td_idx]);
3591f5cfe96SAnoob Joseph 	if (ret) {
3601f5cfe96SAnoob Joseph 		RTE_LOG(ERR, USER1, "Could not initialize session conf\n");
3611f5cfe96SAnoob Joseph 		return EXIT_FAILURE;
3621f5cfe96SAnoob Joseph 	}
3631f5cfe96SAnoob Joseph 
3641f5cfe96SAnoob Joseph 	sess = rte_zmalloc(NULL, sizeof(void *) * nb_sessions, 0);
3651f5cfe96SAnoob Joseph 
3661f5cfe96SAnoob Joseph 	tsc_start = rte_rdtsc_precise();
3671f5cfe96SAnoob Joseph 
3681f5cfe96SAnoob Joseph 	for (i = 0; i < nb_sessions; i++) {
3691f5cfe96SAnoob Joseph 		sess[i] = rte_security_session_create(sec_ctx,
3701f5cfe96SAnoob Joseph 						      &sess_conf,
3711f5cfe96SAnoob Joseph 						      sess_mp);
3721f5cfe96SAnoob Joseph 		if (unlikely(sess[i] == NULL)) {
3731f5cfe96SAnoob Joseph 			RTE_LOG(ERR, USER1, "Could not create session\n");
3741f5cfe96SAnoob Joseph 			return EXIT_FAILURE;
3751f5cfe96SAnoob Joseph 		}
3761f5cfe96SAnoob Joseph 	}
3771f5cfe96SAnoob Joseph 
3781f5cfe96SAnoob Joseph 	tsc_mid = rte_rdtsc_precise();
3791f5cfe96SAnoob Joseph 
3801f5cfe96SAnoob Joseph 	for (i = 0; i < nb_sessions; i++) {
3811f5cfe96SAnoob Joseph 		ret = rte_security_session_destroy(sec_ctx, sess[i]);
3821f5cfe96SAnoob Joseph 		if (unlikely(ret < 0)) {
3831f5cfe96SAnoob Joseph 			RTE_LOG(ERR, USER1, "Could not destroy session\n");
3841f5cfe96SAnoob Joseph 			return EXIT_FAILURE;
3851f5cfe96SAnoob Joseph 		}
3861f5cfe96SAnoob Joseph 	}
3871f5cfe96SAnoob Joseph 
3881f5cfe96SAnoob Joseph 	tsc_end = rte_rdtsc_precise();
3891f5cfe96SAnoob Joseph 
3901f5cfe96SAnoob Joseph 	tsc_setup_dur = tsc_mid - tsc_start;
3911f5cfe96SAnoob Joseph 	tsc_destroy_dur = tsc_end - tsc_mid;
3921f5cfe96SAnoob Joseph 
3931f5cfe96SAnoob Joseph 	setup_ms = tsc_setup_dur * 1000 / rte_get_tsc_hz();
3941f5cfe96SAnoob Joseph 	destroy_ms = tsc_destroy_dur * 1000 / rte_get_tsc_hz();
3951f5cfe96SAnoob Joseph 
3961f5cfe96SAnoob Joseph 	setup_rate = (double)nb_sessions * rte_get_tsc_hz() / tsc_setup_dur;
3971f5cfe96SAnoob Joseph 	destroy_rate = (double)nb_sessions * rte_get_tsc_hz() / tsc_destroy_dur;
3981f5cfe96SAnoob Joseph 
3991f5cfe96SAnoob Joseph 	printf("%20u%20u%20"PRIu64"%20"PRIu64"%20.2f%20.2f\n",
4001f5cfe96SAnoob Joseph 			rte_lcore_id(),
4011f5cfe96SAnoob Joseph 			nb_sessions,
4021f5cfe96SAnoob Joseph 			setup_ms,
4031f5cfe96SAnoob Joseph 			destroy_ms,
4041f5cfe96SAnoob Joseph 			setup_rate,
4051f5cfe96SAnoob Joseph 			destroy_rate);
4061f5cfe96SAnoob Joseph 
4071f5cfe96SAnoob Joseph 	return EXIT_SUCCESS;
4081f5cfe96SAnoob Joseph }
4091f5cfe96SAnoob Joseph 
4101f5cfe96SAnoob Joseph static void
usage(char * progname)4111f5cfe96SAnoob Joseph usage(char *progname)
4121f5cfe96SAnoob Joseph {
4131f5cfe96SAnoob Joseph 	printf("\nusage: %s\n", progname);
4141f5cfe96SAnoob Joseph 	printf("  --help     : display this message and exit\n"
4151f5cfe96SAnoob Joseph 	       "  --inbound  : test for inbound direction\n"
4161f5cfe96SAnoob Joseph 		"           default outbound direction is tested\n"
4171f5cfe96SAnoob Joseph 	       "  --nb-sess=N: to set the number of sessions\n"
4181f5cfe96SAnoob Joseph 		"           to be created, default is %d\n", DEF_NB_SESSIONS);
4191f5cfe96SAnoob Joseph }
4201f5cfe96SAnoob Joseph 
4211f5cfe96SAnoob Joseph static void
args_parse(int argc,char ** argv)4221f5cfe96SAnoob Joseph args_parse(int argc, char **argv)
4231f5cfe96SAnoob Joseph {
4241f5cfe96SAnoob Joseph 	char **argvopt;
4251f5cfe96SAnoob Joseph 	int n, opt;
4261f5cfe96SAnoob Joseph 	int opt_idx;
4271f5cfe96SAnoob Joseph 
4281f5cfe96SAnoob Joseph 	static const struct option lgopts[] = {
4291f5cfe96SAnoob Joseph 		/* Control */
4301f5cfe96SAnoob Joseph 		{ "help",    0, 0, 0 },
4311f5cfe96SAnoob Joseph 		{ "inbound", 0, 0, 0 },
4321f5cfe96SAnoob Joseph 		{ "nb-sess", 1, 0, 0 },
4331f5cfe96SAnoob Joseph 		{ NULL, 0, 0, 0 }
4341f5cfe96SAnoob Joseph 	};
4351f5cfe96SAnoob Joseph 
4361f5cfe96SAnoob Joseph 	argvopt = argv;
4371f5cfe96SAnoob Joseph 
4381f5cfe96SAnoob Joseph 	while ((opt = getopt_long(argc, argvopt, "",
4391f5cfe96SAnoob Joseph 				lgopts, &opt_idx)) != EOF) {
4401f5cfe96SAnoob Joseph 		switch (opt) {
4411f5cfe96SAnoob Joseph 		case 0:
4421f5cfe96SAnoob Joseph 			if (strcmp(lgopts[opt_idx].name, "help") == 0) {
4431f5cfe96SAnoob Joseph 				usage(argv[0]);
4441f5cfe96SAnoob Joseph 				exit(EXIT_SUCCESS);
4451f5cfe96SAnoob Joseph 			}
4461f5cfe96SAnoob Joseph 
4471f5cfe96SAnoob Joseph 			if (strcmp(lgopts[opt_idx].name, "nb-sess") == 0) {
4481f5cfe96SAnoob Joseph 				n = atoi(optarg);
4491f5cfe96SAnoob Joseph 				if (n >= 0)
4501f5cfe96SAnoob Joseph 					ctx.nb_sess = n;
4511f5cfe96SAnoob Joseph 				else
4521f5cfe96SAnoob Joseph 					rte_exit(EXIT_FAILURE,
4531f5cfe96SAnoob Joseph 						"nb-sess should be >= 0\n");
4541f5cfe96SAnoob Joseph 				printf("nb-sess %d / ", ctx.nb_sess);
4551f5cfe96SAnoob Joseph 			} else if (strcmp(lgopts[opt_idx].name, "inbound") ==
4561f5cfe96SAnoob Joseph 				   0) {
4571f5cfe96SAnoob Joseph 				ctx.is_inbound = true;
4581f5cfe96SAnoob Joseph 				printf("inbound / ");
4591f5cfe96SAnoob Joseph 			}
4601f5cfe96SAnoob Joseph 
4611f5cfe96SAnoob Joseph 			break;
4621f5cfe96SAnoob Joseph 
4631f5cfe96SAnoob Joseph 		default:
4641f5cfe96SAnoob Joseph 			usage(argv[0]);
4651f5cfe96SAnoob Joseph 			rte_exit(EXIT_FAILURE, "Invalid option: %s\n",
4661f5cfe96SAnoob Joseph 					argv[opt_idx - 1]);
4671f5cfe96SAnoob Joseph 			break;
4681f5cfe96SAnoob Joseph 		}
4691f5cfe96SAnoob Joseph 	}
4701f5cfe96SAnoob Joseph 
4711f5cfe96SAnoob Joseph 	printf("\n\n");
4721f5cfe96SAnoob Joseph }
4731f5cfe96SAnoob Joseph 
4741f5cfe96SAnoob Joseph int
main(int argc,char ** argv)4751f5cfe96SAnoob Joseph main(int argc, char **argv)
4761f5cfe96SAnoob Joseph {
477*838e8decSVidya Sagar Velumuri 	struct ipsec_test_data td_outb[RTE_DIM(sec_alg_list)];
478*838e8decSVidya Sagar Velumuri 	struct ipsec_test_data td_inb[RTE_DIM(sec_alg_list)];
4791f5cfe96SAnoob Joseph 	struct ipsec_test_flags flags;
4801f5cfe96SAnoob Joseph 	uint32_t lcore_id;
4811f5cfe96SAnoob Joseph 	uint8_t nb_lcores;
4821f5cfe96SAnoob Joseph 	unsigned long i;
4831f5cfe96SAnoob Joseph 	int ret;
4841f5cfe96SAnoob Joseph 
4851f5cfe96SAnoob Joseph 	memset(&ctx, 0, sizeof(struct test_ctx));
4861f5cfe96SAnoob Joseph 	memset(&flags, 0, sizeof(flags));
4871f5cfe96SAnoob Joseph 
4881f5cfe96SAnoob Joseph 	ret = rte_eal_init(argc, argv);
4891f5cfe96SAnoob Joseph 	if (ret < 0)
4901f5cfe96SAnoob Joseph 		rte_exit(EXIT_FAILURE, "Invalid EAL arguments!\n");
4911f5cfe96SAnoob Joseph 	argc -= ret;
4921f5cfe96SAnoob Joseph 	argv += ret;
4931f5cfe96SAnoob Joseph 
4941f5cfe96SAnoob Joseph 	nb_lcores = rte_lcore_count() - 1;
4951f5cfe96SAnoob Joseph 	if (nb_lcores < 1) {
4961f5cfe96SAnoob Joseph 		RTE_LOG(ERR, USER1,
4971f5cfe96SAnoob Joseph 			"Number of worker cores need to be higher than 1\n");
4981f5cfe96SAnoob Joseph 		return -EINVAL;
4991f5cfe96SAnoob Joseph 	}
5001f5cfe96SAnoob Joseph 
5011f5cfe96SAnoob Joseph 	ctx.nb_sess = DEF_NB_SESSIONS + RTE_MEMPOOL_CACHE_MAX_SIZE * nb_lcores;
5021f5cfe96SAnoob Joseph 
5031f5cfe96SAnoob Joseph 	if (argc > 1)
5041f5cfe96SAnoob Joseph 		args_parse(argc, argv);
5051f5cfe96SAnoob Joseph 
5061f5cfe96SAnoob Joseph 	ctx.nb_lcores = nb_lcores;
5071f5cfe96SAnoob Joseph 
5081f5cfe96SAnoob Joseph 	ret = cryptodev_init(&ctx, nb_lcores);
5091f5cfe96SAnoob Joseph 	if (ret)
5101f5cfe96SAnoob Joseph 		goto exit;
5111f5cfe96SAnoob Joseph 
5121f5cfe96SAnoob Joseph 	ret = mempool_init(&ctx, nb_lcores);
5131f5cfe96SAnoob Joseph 	if (ret)
5141f5cfe96SAnoob Joseph 		goto cryptodev_fini;
5151f5cfe96SAnoob Joseph 
516*838e8decSVidya Sagar Velumuri 	test_sec_alg_list_populate();
5171f5cfe96SAnoob Joseph 
518*838e8decSVidya Sagar Velumuri 	for (i = 0; i < RTE_DIM(sec_alg_list); i++) {
519*838e8decSVidya Sagar Velumuri 		test_ipsec_td_prepare(sec_alg_list[i].param1,
520*838e8decSVidya Sagar Velumuri 				      sec_alg_list[i].param2,
5211f5cfe96SAnoob Joseph 				      &flags,
5221f5cfe96SAnoob Joseph 				      &td_outb[i],
5231f5cfe96SAnoob Joseph 				      1);
5241f5cfe96SAnoob Joseph 		if (ctx.is_inbound)
5251f5cfe96SAnoob Joseph 			test_ipsec_td_in_from_out(&td_outb[i], &td_inb[i]);
5261f5cfe96SAnoob Joseph 	}
5271f5cfe96SAnoob Joseph 
5281f5cfe96SAnoob Joseph 	ctx.td = td_outb;
5291f5cfe96SAnoob Joseph 	if (ctx.is_inbound)
5301f5cfe96SAnoob Joseph 		ctx.td = td_inb;
5311f5cfe96SAnoob Joseph 
532*838e8decSVidya Sagar Velumuri 	for (ctx.td_idx = 0; ctx.td_idx < RTE_DIM(sec_alg_list); ctx.td_idx++) {
5331f5cfe96SAnoob Joseph 
5341f5cfe96SAnoob Joseph 		printf("\n\n    Algorithm combination:");
535*838e8decSVidya Sagar Velumuri 		test_sec_alg_display(sec_alg_list[ctx.td_idx].param1,
536*838e8decSVidya Sagar Velumuri 				     sec_alg_list[ctx.td_idx].param2);
5371f5cfe96SAnoob Joseph 		printf("    ----------------------");
5381f5cfe96SAnoob Joseph 
5391f5cfe96SAnoob Joseph 		printf("\n%20s%20s%20s%20s%20s%20s\n\n",
5401f5cfe96SAnoob Joseph 			"lcore id", "nb_sessions",
5411f5cfe96SAnoob Joseph 			"Setup time(ms)", "Destroy time(ms)",
5421f5cfe96SAnoob Joseph 			"Setup rate(sess/s)",
5431f5cfe96SAnoob Joseph 			"Destroy rate(sess/sec)");
5441f5cfe96SAnoob Joseph 
5451f5cfe96SAnoob Joseph 		i = 0;
5461f5cfe96SAnoob Joseph 		RTE_LCORE_FOREACH_WORKER(lcore_id) {
5471f5cfe96SAnoob Joseph 			rte_eal_remote_launch(test_security_session_perf,
5481f5cfe96SAnoob Joseph 					      &ctx.lconf[i],
5491f5cfe96SAnoob Joseph 					      lcore_id);
5501f5cfe96SAnoob Joseph 			i++;
5511f5cfe96SAnoob Joseph 		}
5521f5cfe96SAnoob Joseph 
5531f5cfe96SAnoob Joseph 		RTE_LCORE_FOREACH_WORKER(lcore_id) {
5541f5cfe96SAnoob Joseph 			ret |= rte_eal_wait_lcore(lcore_id);
5551f5cfe96SAnoob Joseph 		}
5561f5cfe96SAnoob Joseph 
5571f5cfe96SAnoob Joseph 	}
5581f5cfe96SAnoob Joseph 
5591f5cfe96SAnoob Joseph 	cryptodev_fini(&ctx);
5601f5cfe96SAnoob Joseph 	mempool_fini(&ctx);
5611f5cfe96SAnoob Joseph 
5621f5cfe96SAnoob Joseph 	return EXIT_SUCCESS;
5631f5cfe96SAnoob Joseph cryptodev_fini:
5641f5cfe96SAnoob Joseph 	cryptodev_fini(&ctx);
5651f5cfe96SAnoob Joseph exit:
5661f5cfe96SAnoob Joseph 	return EXIT_FAILURE;
5671f5cfe96SAnoob Joseph 
5681f5cfe96SAnoob Joseph }
569