xref: /dpdk/app/test/test_ipsec_perf.c (revision f7f3ac6dcbe2a10bfd8ef24d70cb7d19ee99530e)
1*f7f3ac6dSSavinay Dharmappa /* SPDX-License-Identifier: BSD-3-Clause
2*f7f3ac6dSSavinay Dharmappa  * Copyright(c) 2020 Intel Corporation
3*f7f3ac6dSSavinay Dharmappa  */
4*f7f3ac6dSSavinay Dharmappa 
5*f7f3ac6dSSavinay Dharmappa #include <stdio.h>
6*f7f3ac6dSSavinay Dharmappa #include <rte_ip.h>
7*f7f3ac6dSSavinay Dharmappa #include <rte_malloc.h>
8*f7f3ac6dSSavinay Dharmappa #include <rte_ring.h>
9*f7f3ac6dSSavinay Dharmappa #include <rte_mbuf.h>
10*f7f3ac6dSSavinay Dharmappa #include <rte_cycles.h>
11*f7f3ac6dSSavinay Dharmappa #include <rte_ipsec.h>
12*f7f3ac6dSSavinay Dharmappa #include <rte_random.h>
13*f7f3ac6dSSavinay Dharmappa 
14*f7f3ac6dSSavinay Dharmappa #include "test.h"
15*f7f3ac6dSSavinay Dharmappa #include "test_cryptodev.h"
16*f7f3ac6dSSavinay Dharmappa 
17*f7f3ac6dSSavinay Dharmappa #define RING_SIZE	4096
18*f7f3ac6dSSavinay Dharmappa #define BURST_SIZE	64
19*f7f3ac6dSSavinay Dharmappa #define NUM_MBUF	4095
20*f7f3ac6dSSavinay Dharmappa #define DEFAULT_SPI     7
21*f7f3ac6dSSavinay Dharmappa 
22*f7f3ac6dSSavinay Dharmappa struct ipsec_test_cfg {
23*f7f3ac6dSSavinay Dharmappa 	uint32_t replay_win_sz;
24*f7f3ac6dSSavinay Dharmappa 	uint32_t esn;
25*f7f3ac6dSSavinay Dharmappa 	uint64_t flags;
26*f7f3ac6dSSavinay Dharmappa 	enum rte_crypto_sym_xform_type type;
27*f7f3ac6dSSavinay Dharmappa };
28*f7f3ac6dSSavinay Dharmappa 
29*f7f3ac6dSSavinay Dharmappa struct rte_mempool *mbuf_pool, *cop_pool;
30*f7f3ac6dSSavinay Dharmappa 
31*f7f3ac6dSSavinay Dharmappa struct stats_counter {
32*f7f3ac6dSSavinay Dharmappa 	uint64_t nb_prepare_call;
33*f7f3ac6dSSavinay Dharmappa 	uint64_t nb_prepare_pkt;
34*f7f3ac6dSSavinay Dharmappa 	uint64_t nb_process_call;
35*f7f3ac6dSSavinay Dharmappa 	uint64_t nb_process_pkt;
36*f7f3ac6dSSavinay Dharmappa 	uint64_t prepare_ticks_elapsed;
37*f7f3ac6dSSavinay Dharmappa 	uint64_t process_ticks_elapsed;
38*f7f3ac6dSSavinay Dharmappa };
39*f7f3ac6dSSavinay Dharmappa 
40*f7f3ac6dSSavinay Dharmappa struct ipsec_sa {
41*f7f3ac6dSSavinay Dharmappa 	struct rte_ipsec_session ss[2];
42*f7f3ac6dSSavinay Dharmappa 	struct rte_ipsec_sa_prm sa_prm;
43*f7f3ac6dSSavinay Dharmappa 	struct rte_security_ipsec_xform ipsec_xform;
44*f7f3ac6dSSavinay Dharmappa 	struct rte_crypto_sym_xform cipher_xform;
45*f7f3ac6dSSavinay Dharmappa 	struct rte_crypto_sym_xform auth_xform;
46*f7f3ac6dSSavinay Dharmappa 	struct rte_crypto_sym_xform aead_xform;
47*f7f3ac6dSSavinay Dharmappa 	struct rte_crypto_sym_xform *crypto_xforms;
48*f7f3ac6dSSavinay Dharmappa 	struct rte_crypto_op *cop[BURST_SIZE];
49*f7f3ac6dSSavinay Dharmappa 	enum rte_crypto_sym_xform_type type;
50*f7f3ac6dSSavinay Dharmappa 	struct stats_counter cnt;
51*f7f3ac6dSSavinay Dharmappa 	uint32_t replay_win_sz;
52*f7f3ac6dSSavinay Dharmappa 	uint32_t sa_flags;
53*f7f3ac6dSSavinay Dharmappa };
54*f7f3ac6dSSavinay Dharmappa 
55*f7f3ac6dSSavinay Dharmappa static const struct ipsec_test_cfg test_cfg[] = {
56*f7f3ac6dSSavinay Dharmappa 	{0, 0, 0, RTE_CRYPTO_SYM_XFORM_AEAD},
57*f7f3ac6dSSavinay Dharmappa 	{0, 0, 0, RTE_CRYPTO_SYM_XFORM_CIPHER},
58*f7f3ac6dSSavinay Dharmappa 	{128, 1, 0, RTE_CRYPTO_SYM_XFORM_AEAD},
59*f7f3ac6dSSavinay Dharmappa 	{128, 1, 0, RTE_CRYPTO_SYM_XFORM_CIPHER},
60*f7f3ac6dSSavinay Dharmappa 
61*f7f3ac6dSSavinay Dharmappa };
62*f7f3ac6dSSavinay Dharmappa 
63*f7f3ac6dSSavinay Dharmappa static struct rte_ipv4_hdr ipv4_outer  = {
64*f7f3ac6dSSavinay Dharmappa 	.version_ihl = IPVERSION << 4 |
65*f7f3ac6dSSavinay Dharmappa 		sizeof(ipv4_outer) / RTE_IPV4_IHL_MULTIPLIER,
66*f7f3ac6dSSavinay Dharmappa 	.time_to_live = IPDEFTTL,
67*f7f3ac6dSSavinay Dharmappa 	.next_proto_id = IPPROTO_ESP,
68*f7f3ac6dSSavinay Dharmappa 	.src_addr = RTE_IPV4(192, 168, 1, 100),
69*f7f3ac6dSSavinay Dharmappa 	.dst_addr = RTE_IPV4(192, 168, 2, 100),
70*f7f3ac6dSSavinay Dharmappa };
71*f7f3ac6dSSavinay Dharmappa 
72*f7f3ac6dSSavinay Dharmappa static struct rte_ring *ring_inb_prepare;
73*f7f3ac6dSSavinay Dharmappa static struct rte_ring *ring_inb_process;
74*f7f3ac6dSSavinay Dharmappa static struct rte_ring *ring_outb_prepare;
75*f7f3ac6dSSavinay Dharmappa static struct rte_ring *ring_outb_process;
76*f7f3ac6dSSavinay Dharmappa 
77*f7f3ac6dSSavinay Dharmappa struct supported_cipher_algo {
78*f7f3ac6dSSavinay Dharmappa 	const char *keyword;
79*f7f3ac6dSSavinay Dharmappa 	enum rte_crypto_cipher_algorithm algo;
80*f7f3ac6dSSavinay Dharmappa 	uint16_t iv_len;
81*f7f3ac6dSSavinay Dharmappa 	uint16_t block_size;
82*f7f3ac6dSSavinay Dharmappa 	uint16_t key_len;
83*f7f3ac6dSSavinay Dharmappa };
84*f7f3ac6dSSavinay Dharmappa 
85*f7f3ac6dSSavinay Dharmappa struct supported_auth_algo {
86*f7f3ac6dSSavinay Dharmappa 	const char *keyword;
87*f7f3ac6dSSavinay Dharmappa 	enum rte_crypto_auth_algorithm algo;
88*f7f3ac6dSSavinay Dharmappa 	uint16_t digest_len;
89*f7f3ac6dSSavinay Dharmappa 	uint16_t key_len;
90*f7f3ac6dSSavinay Dharmappa 	uint8_t key_not_req;
91*f7f3ac6dSSavinay Dharmappa };
92*f7f3ac6dSSavinay Dharmappa 
93*f7f3ac6dSSavinay Dharmappa struct supported_aead_algo {
94*f7f3ac6dSSavinay Dharmappa 	const char *keyword;
95*f7f3ac6dSSavinay Dharmappa 	enum rte_crypto_aead_algorithm algo;
96*f7f3ac6dSSavinay Dharmappa 	uint16_t iv_len;
97*f7f3ac6dSSavinay Dharmappa 	uint16_t block_size;
98*f7f3ac6dSSavinay Dharmappa 	uint16_t digest_len;
99*f7f3ac6dSSavinay Dharmappa 	uint16_t key_len;
100*f7f3ac6dSSavinay Dharmappa 	uint8_t aad_len;
101*f7f3ac6dSSavinay Dharmappa };
102*f7f3ac6dSSavinay Dharmappa 
103*f7f3ac6dSSavinay Dharmappa const struct supported_cipher_algo cipher_algo[] = {
104*f7f3ac6dSSavinay Dharmappa 	{
105*f7f3ac6dSSavinay Dharmappa 		.keyword = "aes-128-cbc",
106*f7f3ac6dSSavinay Dharmappa 		.algo = RTE_CRYPTO_CIPHER_AES_CBC,
107*f7f3ac6dSSavinay Dharmappa 		.iv_len = 16,
108*f7f3ac6dSSavinay Dharmappa 		.block_size = 16,
109*f7f3ac6dSSavinay Dharmappa 		.key_len = 16
110*f7f3ac6dSSavinay Dharmappa 	}
111*f7f3ac6dSSavinay Dharmappa };
112*f7f3ac6dSSavinay Dharmappa 
113*f7f3ac6dSSavinay Dharmappa const struct supported_auth_algo auth_algo[] = {
114*f7f3ac6dSSavinay Dharmappa 	{
115*f7f3ac6dSSavinay Dharmappa 		.keyword = "sha1-hmac",
116*f7f3ac6dSSavinay Dharmappa 		.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
117*f7f3ac6dSSavinay Dharmappa 		.digest_len = 12,
118*f7f3ac6dSSavinay Dharmappa 		.key_len = 20
119*f7f3ac6dSSavinay Dharmappa 	}
120*f7f3ac6dSSavinay Dharmappa };
121*f7f3ac6dSSavinay Dharmappa 
122*f7f3ac6dSSavinay Dharmappa const struct supported_aead_algo aead_algo[] = {
123*f7f3ac6dSSavinay Dharmappa 	{
124*f7f3ac6dSSavinay Dharmappa 		.keyword = "aes-128-gcm",
125*f7f3ac6dSSavinay Dharmappa 		.algo = RTE_CRYPTO_AEAD_AES_GCM,
126*f7f3ac6dSSavinay Dharmappa 		.iv_len = 8,
127*f7f3ac6dSSavinay Dharmappa 		.block_size = 4,
128*f7f3ac6dSSavinay Dharmappa 		.key_len = 20,
129*f7f3ac6dSSavinay Dharmappa 		.digest_len = 16,
130*f7f3ac6dSSavinay Dharmappa 		.aad_len = 8,
131*f7f3ac6dSSavinay Dharmappa 	}
132*f7f3ac6dSSavinay Dharmappa };
133*f7f3ac6dSSavinay Dharmappa 
134*f7f3ac6dSSavinay Dharmappa static struct rte_mbuf *generate_mbuf_data(struct rte_mempool *mpool)
135*f7f3ac6dSSavinay Dharmappa {
136*f7f3ac6dSSavinay Dharmappa 	struct rte_mbuf *mbuf = rte_pktmbuf_alloc(mpool);
137*f7f3ac6dSSavinay Dharmappa 
138*f7f3ac6dSSavinay Dharmappa 	if (mbuf) {
139*f7f3ac6dSSavinay Dharmappa 		mbuf->data_len = 64;
140*f7f3ac6dSSavinay Dharmappa 		mbuf->pkt_len  = 64;
141*f7f3ac6dSSavinay Dharmappa 	}
142*f7f3ac6dSSavinay Dharmappa 
143*f7f3ac6dSSavinay Dharmappa 	return mbuf;
144*f7f3ac6dSSavinay Dharmappa }
145*f7f3ac6dSSavinay Dharmappa 
146*f7f3ac6dSSavinay Dharmappa static int
147*f7f3ac6dSSavinay Dharmappa fill_ipsec_param(struct ipsec_sa *sa)
148*f7f3ac6dSSavinay Dharmappa {
149*f7f3ac6dSSavinay Dharmappa 	struct rte_ipsec_sa_prm *prm = &sa->sa_prm;
150*f7f3ac6dSSavinay Dharmappa 
151*f7f3ac6dSSavinay Dharmappa 	memset(prm, 0, sizeof(*prm));
152*f7f3ac6dSSavinay Dharmappa 
153*f7f3ac6dSSavinay Dharmappa 	prm->flags = sa->sa_flags;
154*f7f3ac6dSSavinay Dharmappa 
155*f7f3ac6dSSavinay Dharmappa 	/* setup ipsec xform */
156*f7f3ac6dSSavinay Dharmappa 	prm->ipsec_xform = sa->ipsec_xform;
157*f7f3ac6dSSavinay Dharmappa 	prm->ipsec_xform.salt = (uint32_t)rte_rand();
158*f7f3ac6dSSavinay Dharmappa 	prm->ipsec_xform.replay_win_sz = sa->replay_win_sz;
159*f7f3ac6dSSavinay Dharmappa 
160*f7f3ac6dSSavinay Dharmappa 	/* setup tunnel related fields */
161*f7f3ac6dSSavinay Dharmappa 	prm->tun.hdr_len = sizeof(ipv4_outer);
162*f7f3ac6dSSavinay Dharmappa 	prm->tun.next_proto = IPPROTO_IPIP;
163*f7f3ac6dSSavinay Dharmappa 	prm->tun.hdr = &ipv4_outer;
164*f7f3ac6dSSavinay Dharmappa 
165*f7f3ac6dSSavinay Dharmappa 	if (sa->type == RTE_CRYPTO_SYM_XFORM_AEAD) {
166*f7f3ac6dSSavinay Dharmappa 		sa->aead_xform.type = sa->type;
167*f7f3ac6dSSavinay Dharmappa 		sa->aead_xform.aead.algo = aead_algo->algo;
168*f7f3ac6dSSavinay Dharmappa 		sa->aead_xform.next = NULL;
169*f7f3ac6dSSavinay Dharmappa 		sa->aead_xform.aead.digest_length = aead_algo->digest_len;
170*f7f3ac6dSSavinay Dharmappa 		sa->aead_xform.aead.iv.offset = IV_OFFSET;
171*f7f3ac6dSSavinay Dharmappa 		sa->aead_xform.aead.iv.length = 12;
172*f7f3ac6dSSavinay Dharmappa 
173*f7f3ac6dSSavinay Dharmappa 		if (sa->ipsec_xform.direction ==
174*f7f3ac6dSSavinay Dharmappa 				RTE_SECURITY_IPSEC_SA_DIR_INGRESS) {
175*f7f3ac6dSSavinay Dharmappa 			sa->aead_xform.aead.op = RTE_CRYPTO_AEAD_OP_DECRYPT;
176*f7f3ac6dSSavinay Dharmappa 		} else {
177*f7f3ac6dSSavinay Dharmappa 			sa->aead_xform.aead.op = RTE_CRYPTO_AEAD_OP_ENCRYPT;
178*f7f3ac6dSSavinay Dharmappa 		}
179*f7f3ac6dSSavinay Dharmappa 
180*f7f3ac6dSSavinay Dharmappa 		sa->crypto_xforms = &sa->aead_xform;
181*f7f3ac6dSSavinay Dharmappa 	} else {
182*f7f3ac6dSSavinay Dharmappa 		sa->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
183*f7f3ac6dSSavinay Dharmappa 		sa->cipher_xform.cipher.algo = cipher_algo->algo;
184*f7f3ac6dSSavinay Dharmappa 		sa->cipher_xform.cipher.iv.offset = IV_OFFSET;
185*f7f3ac6dSSavinay Dharmappa 		sa->cipher_xform.cipher.iv.length = 12;
186*f7f3ac6dSSavinay Dharmappa 		sa->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
187*f7f3ac6dSSavinay Dharmappa 		sa->auth_xform.auth.algo = auth_algo->algo;
188*f7f3ac6dSSavinay Dharmappa 		sa->auth_xform.auth.digest_length = auth_algo->digest_len;
189*f7f3ac6dSSavinay Dharmappa 
190*f7f3ac6dSSavinay Dharmappa 
191*f7f3ac6dSSavinay Dharmappa 		if (sa->ipsec_xform.direction ==
192*f7f3ac6dSSavinay Dharmappa 				RTE_SECURITY_IPSEC_SA_DIR_INGRESS) {
193*f7f3ac6dSSavinay Dharmappa 			sa->cipher_xform.cipher.op =
194*f7f3ac6dSSavinay Dharmappa 				RTE_CRYPTO_CIPHER_OP_DECRYPT;
195*f7f3ac6dSSavinay Dharmappa 			sa->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
196*f7f3ac6dSSavinay Dharmappa 			sa->cipher_xform.next = NULL;
197*f7f3ac6dSSavinay Dharmappa 			sa->auth_xform.next = &sa->cipher_xform;
198*f7f3ac6dSSavinay Dharmappa 			sa->crypto_xforms = &sa->auth_xform;
199*f7f3ac6dSSavinay Dharmappa 		} else {
200*f7f3ac6dSSavinay Dharmappa 			sa->cipher_xform.cipher.op =
201*f7f3ac6dSSavinay Dharmappa 				RTE_CRYPTO_CIPHER_OP_ENCRYPT;
202*f7f3ac6dSSavinay Dharmappa 			sa->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
203*f7f3ac6dSSavinay Dharmappa 			sa->auth_xform.next = NULL;
204*f7f3ac6dSSavinay Dharmappa 			sa->cipher_xform.next = &sa->auth_xform;
205*f7f3ac6dSSavinay Dharmappa 			sa->crypto_xforms = &sa->cipher_xform;
206*f7f3ac6dSSavinay Dharmappa 		}
207*f7f3ac6dSSavinay Dharmappa 	}
208*f7f3ac6dSSavinay Dharmappa 
209*f7f3ac6dSSavinay Dharmappa 	prm->crypto_xform = sa->crypto_xforms;
210*f7f3ac6dSSavinay Dharmappa 
211*f7f3ac6dSSavinay Dharmappa 	return TEST_SUCCESS;
212*f7f3ac6dSSavinay Dharmappa }
213*f7f3ac6dSSavinay Dharmappa 
214*f7f3ac6dSSavinay Dharmappa static int
215*f7f3ac6dSSavinay Dharmappa create_sa(enum rte_security_session_action_type action_type,
216*f7f3ac6dSSavinay Dharmappa 	  struct ipsec_sa *sa)
217*f7f3ac6dSSavinay Dharmappa {
218*f7f3ac6dSSavinay Dharmappa 	static struct rte_cryptodev_sym_session dummy_ses;
219*f7f3ac6dSSavinay Dharmappa 	size_t sz;
220*f7f3ac6dSSavinay Dharmappa 	int rc;
221*f7f3ac6dSSavinay Dharmappa 
222*f7f3ac6dSSavinay Dharmappa 	memset(&sa->ss[0], 0, sizeof(sa->ss[0]));
223*f7f3ac6dSSavinay Dharmappa 
224*f7f3ac6dSSavinay Dharmappa 	rc = fill_ipsec_param(sa);
225*f7f3ac6dSSavinay Dharmappa 	if (rc != 0) {
226*f7f3ac6dSSavinay Dharmappa 		printf("failed to fill ipsec param\n");
227*f7f3ac6dSSavinay Dharmappa 		return TEST_FAILED;
228*f7f3ac6dSSavinay Dharmappa 	}
229*f7f3ac6dSSavinay Dharmappa 
230*f7f3ac6dSSavinay Dharmappa 	sz = rte_ipsec_sa_size(&sa->sa_prm);
231*f7f3ac6dSSavinay Dharmappa 	TEST_ASSERT(sz > 0, "rte_ipsec_sa_size() failed\n");
232*f7f3ac6dSSavinay Dharmappa 
233*f7f3ac6dSSavinay Dharmappa 	sa->ss[0].sa = rte_zmalloc(NULL, sz, RTE_CACHE_LINE_SIZE);
234*f7f3ac6dSSavinay Dharmappa 	TEST_ASSERT_NOT_NULL(sa->ss[0].sa,
235*f7f3ac6dSSavinay Dharmappa 		"failed to allocate memory for rte_ipsec_sa\n");
236*f7f3ac6dSSavinay Dharmappa 
237*f7f3ac6dSSavinay Dharmappa 	sa->ss[0].type = action_type;
238*f7f3ac6dSSavinay Dharmappa 	sa->ss[0].crypto.ses = &dummy_ses;
239*f7f3ac6dSSavinay Dharmappa 
240*f7f3ac6dSSavinay Dharmappa 	rc = rte_ipsec_sa_init(sa->ss[0].sa, &sa->sa_prm, sz);
241*f7f3ac6dSSavinay Dharmappa 	rc = (rc > 0 && (uint32_t)rc <= sz) ? 0 : -EINVAL;
242*f7f3ac6dSSavinay Dharmappa 
243*f7f3ac6dSSavinay Dharmappa 	if (rc == 0)
244*f7f3ac6dSSavinay Dharmappa 		rc = rte_ipsec_session_prepare(&sa->ss[0]);
245*f7f3ac6dSSavinay Dharmappa 	else
246*f7f3ac6dSSavinay Dharmappa 		return TEST_FAILED;
247*f7f3ac6dSSavinay Dharmappa 
248*f7f3ac6dSSavinay Dharmappa 	return TEST_SUCCESS;
249*f7f3ac6dSSavinay Dharmappa }
250*f7f3ac6dSSavinay Dharmappa 
251*f7f3ac6dSSavinay Dharmappa static int
252*f7f3ac6dSSavinay Dharmappa packet_prepare(struct rte_mbuf **buf, struct ipsec_sa *sa,
253*f7f3ac6dSSavinay Dharmappa 	       uint16_t num_pkts)
254*f7f3ac6dSSavinay Dharmappa {
255*f7f3ac6dSSavinay Dharmappa 	uint64_t time_stamp;
256*f7f3ac6dSSavinay Dharmappa 	uint16_t k = 0, i;
257*f7f3ac6dSSavinay Dharmappa 
258*f7f3ac6dSSavinay Dharmappa 	for (i = 0; i < num_pkts; i++) {
259*f7f3ac6dSSavinay Dharmappa 
260*f7f3ac6dSSavinay Dharmappa 		sa->cop[i] = rte_crypto_op_alloc(cop_pool,
261*f7f3ac6dSSavinay Dharmappa 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
262*f7f3ac6dSSavinay Dharmappa 
263*f7f3ac6dSSavinay Dharmappa 		if (sa->cop[i] == NULL) {
264*f7f3ac6dSSavinay Dharmappa 
265*f7f3ac6dSSavinay Dharmappa 			RTE_LOG(ERR, USER1,
266*f7f3ac6dSSavinay Dharmappa 			"Failed to allocate symmetric crypto op\n");
267*f7f3ac6dSSavinay Dharmappa 
268*f7f3ac6dSSavinay Dharmappa 			return k;
269*f7f3ac6dSSavinay Dharmappa 		}
270*f7f3ac6dSSavinay Dharmappa 	}
271*f7f3ac6dSSavinay Dharmappa 
272*f7f3ac6dSSavinay Dharmappa 	time_stamp = rte_rdtsc_precise();
273*f7f3ac6dSSavinay Dharmappa 
274*f7f3ac6dSSavinay Dharmappa 	k = rte_ipsec_pkt_crypto_prepare(&sa->ss[0], buf,
275*f7f3ac6dSSavinay Dharmappa 		sa->cop, num_pkts);
276*f7f3ac6dSSavinay Dharmappa 
277*f7f3ac6dSSavinay Dharmappa 	time_stamp = rte_rdtsc_precise() - time_stamp;
278*f7f3ac6dSSavinay Dharmappa 
279*f7f3ac6dSSavinay Dharmappa 	if (k != num_pkts) {
280*f7f3ac6dSSavinay Dharmappa 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_prepare fail\n");
281*f7f3ac6dSSavinay Dharmappa 		return k;
282*f7f3ac6dSSavinay Dharmappa 	}
283*f7f3ac6dSSavinay Dharmappa 
284*f7f3ac6dSSavinay Dharmappa 	sa->cnt.prepare_ticks_elapsed += time_stamp;
285*f7f3ac6dSSavinay Dharmappa 	sa->cnt.nb_prepare_call++;
286*f7f3ac6dSSavinay Dharmappa 	sa->cnt.nb_prepare_pkt += k;
287*f7f3ac6dSSavinay Dharmappa 
288*f7f3ac6dSSavinay Dharmappa 	for (i = 0; i < num_pkts; i++)
289*f7f3ac6dSSavinay Dharmappa 		rte_crypto_op_free(sa->cop[i]);
290*f7f3ac6dSSavinay Dharmappa 
291*f7f3ac6dSSavinay Dharmappa 	return k;
292*f7f3ac6dSSavinay Dharmappa }
293*f7f3ac6dSSavinay Dharmappa 
294*f7f3ac6dSSavinay Dharmappa static int
295*f7f3ac6dSSavinay Dharmappa packet_process(struct rte_mbuf **buf, struct ipsec_sa *sa,
296*f7f3ac6dSSavinay Dharmappa 	       uint16_t num_pkts)
297*f7f3ac6dSSavinay Dharmappa {
298*f7f3ac6dSSavinay Dharmappa 	uint64_t time_stamp;
299*f7f3ac6dSSavinay Dharmappa 	uint16_t k = 0;
300*f7f3ac6dSSavinay Dharmappa 
301*f7f3ac6dSSavinay Dharmappa 	time_stamp = rte_rdtsc_precise();
302*f7f3ac6dSSavinay Dharmappa 
303*f7f3ac6dSSavinay Dharmappa 	k = rte_ipsec_pkt_process(&sa->ss[0], buf, num_pkts);
304*f7f3ac6dSSavinay Dharmappa 
305*f7f3ac6dSSavinay Dharmappa 	time_stamp = rte_rdtsc_precise() - time_stamp;
306*f7f3ac6dSSavinay Dharmappa 
307*f7f3ac6dSSavinay Dharmappa 	if (k != num_pkts) {
308*f7f3ac6dSSavinay Dharmappa 		RTE_LOG(ERR, USER1, "rte_ipsec_pkt_process fail\n");
309*f7f3ac6dSSavinay Dharmappa 		return k;
310*f7f3ac6dSSavinay Dharmappa 	}
311*f7f3ac6dSSavinay Dharmappa 
312*f7f3ac6dSSavinay Dharmappa 	sa->cnt.process_ticks_elapsed += time_stamp;
313*f7f3ac6dSSavinay Dharmappa 	sa->cnt.nb_process_call++;
314*f7f3ac6dSSavinay Dharmappa 	sa->cnt.nb_process_pkt += k;
315*f7f3ac6dSSavinay Dharmappa 
316*f7f3ac6dSSavinay Dharmappa 	return k;
317*f7f3ac6dSSavinay Dharmappa }
318*f7f3ac6dSSavinay Dharmappa 
319*f7f3ac6dSSavinay Dharmappa static int
320*f7f3ac6dSSavinay Dharmappa create_traffic(struct ipsec_sa *sa, struct rte_ring *deq_ring,
321*f7f3ac6dSSavinay Dharmappa 	       struct rte_ring *enq_ring, struct rte_ring *ring)
322*f7f3ac6dSSavinay Dharmappa {
323*f7f3ac6dSSavinay Dharmappa 	struct rte_mbuf *mbuf[BURST_SIZE];
324*f7f3ac6dSSavinay Dharmappa 	uint16_t num_pkts, n;
325*f7f3ac6dSSavinay Dharmappa 
326*f7f3ac6dSSavinay Dharmappa 	while (rte_ring_empty(deq_ring) == 0) {
327*f7f3ac6dSSavinay Dharmappa 
328*f7f3ac6dSSavinay Dharmappa 		num_pkts = rte_ring_sc_dequeue_burst(deq_ring, (void **)mbuf,
329*f7f3ac6dSSavinay Dharmappa 						     RTE_DIM(mbuf), NULL);
330*f7f3ac6dSSavinay Dharmappa 
331*f7f3ac6dSSavinay Dharmappa 		if (num_pkts == 0)
332*f7f3ac6dSSavinay Dharmappa 			return TEST_FAILED;
333*f7f3ac6dSSavinay Dharmappa 
334*f7f3ac6dSSavinay Dharmappa 		n = packet_prepare(mbuf, sa, num_pkts);
335*f7f3ac6dSSavinay Dharmappa 		if (n != num_pkts)
336*f7f3ac6dSSavinay Dharmappa 			return TEST_FAILED;
337*f7f3ac6dSSavinay Dharmappa 
338*f7f3ac6dSSavinay Dharmappa 		num_pkts = rte_ring_sp_enqueue_burst(enq_ring, (void **)mbuf,
339*f7f3ac6dSSavinay Dharmappa 						     num_pkts, NULL);
340*f7f3ac6dSSavinay Dharmappa 		if (num_pkts == 0)
341*f7f3ac6dSSavinay Dharmappa 			return TEST_FAILED;
342*f7f3ac6dSSavinay Dharmappa 	}
343*f7f3ac6dSSavinay Dharmappa 
344*f7f3ac6dSSavinay Dharmappa 	deq_ring = enq_ring;
345*f7f3ac6dSSavinay Dharmappa 	enq_ring = ring;
346*f7f3ac6dSSavinay Dharmappa 
347*f7f3ac6dSSavinay Dharmappa 	while (rte_ring_empty(deq_ring) == 0) {
348*f7f3ac6dSSavinay Dharmappa 
349*f7f3ac6dSSavinay Dharmappa 		num_pkts = rte_ring_sc_dequeue_burst(deq_ring, (void **)mbuf,
350*f7f3ac6dSSavinay Dharmappa 					       RTE_DIM(mbuf), NULL);
351*f7f3ac6dSSavinay Dharmappa 		if (num_pkts == 0)
352*f7f3ac6dSSavinay Dharmappa 			return TEST_FAILED;
353*f7f3ac6dSSavinay Dharmappa 
354*f7f3ac6dSSavinay Dharmappa 		n = packet_process(mbuf, sa, num_pkts);
355*f7f3ac6dSSavinay Dharmappa 		if (n != num_pkts)
356*f7f3ac6dSSavinay Dharmappa 			return TEST_FAILED;
357*f7f3ac6dSSavinay Dharmappa 
358*f7f3ac6dSSavinay Dharmappa 		num_pkts = rte_ring_sp_enqueue_burst(enq_ring, (void **)mbuf,
359*f7f3ac6dSSavinay Dharmappa 					       num_pkts, NULL);
360*f7f3ac6dSSavinay Dharmappa 		if (num_pkts == 0)
361*f7f3ac6dSSavinay Dharmappa 			return TEST_FAILED;
362*f7f3ac6dSSavinay Dharmappa 	}
363*f7f3ac6dSSavinay Dharmappa 
364*f7f3ac6dSSavinay Dharmappa 	return TEST_SUCCESS;
365*f7f3ac6dSSavinay Dharmappa }
366*f7f3ac6dSSavinay Dharmappa 
367*f7f3ac6dSSavinay Dharmappa static void
368*f7f3ac6dSSavinay Dharmappa fill_ipsec_sa_out(const struct ipsec_test_cfg *test_cfg,
369*f7f3ac6dSSavinay Dharmappa 		  struct ipsec_sa *sa)
370*f7f3ac6dSSavinay Dharmappa {
371*f7f3ac6dSSavinay Dharmappa 	sa->ipsec_xform.spi = DEFAULT_SPI;
372*f7f3ac6dSSavinay Dharmappa 	sa->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
373*f7f3ac6dSSavinay Dharmappa 	sa->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
374*f7f3ac6dSSavinay Dharmappa 	sa->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
375*f7f3ac6dSSavinay Dharmappa 	sa->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
376*f7f3ac6dSSavinay Dharmappa 	sa->ipsec_xform.options.esn = test_cfg->esn;
377*f7f3ac6dSSavinay Dharmappa 	sa->type = test_cfg->type;
378*f7f3ac6dSSavinay Dharmappa 	sa->replay_win_sz = test_cfg->replay_win_sz;
379*f7f3ac6dSSavinay Dharmappa 	sa->sa_flags = test_cfg->flags;
380*f7f3ac6dSSavinay Dharmappa 	sa->cnt.nb_prepare_call = 0;
381*f7f3ac6dSSavinay Dharmappa 	sa->cnt.nb_prepare_pkt = 0;
382*f7f3ac6dSSavinay Dharmappa 	sa->cnt.nb_process_call = 0;
383*f7f3ac6dSSavinay Dharmappa 	sa->cnt.nb_process_pkt = 0;
384*f7f3ac6dSSavinay Dharmappa 	sa->cnt.process_ticks_elapsed = 0;
385*f7f3ac6dSSavinay Dharmappa 	sa->cnt.prepare_ticks_elapsed = 0;
386*f7f3ac6dSSavinay Dharmappa 
387*f7f3ac6dSSavinay Dharmappa }
388*f7f3ac6dSSavinay Dharmappa 
389*f7f3ac6dSSavinay Dharmappa static void
390*f7f3ac6dSSavinay Dharmappa fill_ipsec_sa_in(const struct ipsec_test_cfg *test_cfg,
391*f7f3ac6dSSavinay Dharmappa 		  struct ipsec_sa *sa)
392*f7f3ac6dSSavinay Dharmappa {
393*f7f3ac6dSSavinay Dharmappa 	sa->ipsec_xform.spi = DEFAULT_SPI;
394*f7f3ac6dSSavinay Dharmappa 	sa->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
395*f7f3ac6dSSavinay Dharmappa 	sa->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
396*f7f3ac6dSSavinay Dharmappa 	sa->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
397*f7f3ac6dSSavinay Dharmappa 	sa->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
398*f7f3ac6dSSavinay Dharmappa 	sa->ipsec_xform.options.esn = test_cfg->esn;
399*f7f3ac6dSSavinay Dharmappa 	sa->type = test_cfg->type;
400*f7f3ac6dSSavinay Dharmappa 	sa->replay_win_sz = test_cfg->replay_win_sz;
401*f7f3ac6dSSavinay Dharmappa 	sa->sa_flags = test_cfg->flags;
402*f7f3ac6dSSavinay Dharmappa 	sa->cnt.nb_prepare_call = 0;
403*f7f3ac6dSSavinay Dharmappa 	sa->cnt.nb_prepare_pkt = 0;
404*f7f3ac6dSSavinay Dharmappa 	sa->cnt.nb_process_call = 0;
405*f7f3ac6dSSavinay Dharmappa 	sa->cnt.nb_process_pkt = 0;
406*f7f3ac6dSSavinay Dharmappa 	sa->cnt.process_ticks_elapsed = 0;
407*f7f3ac6dSSavinay Dharmappa 	sa->cnt.prepare_ticks_elapsed = 0;
408*f7f3ac6dSSavinay Dharmappa }
409*f7f3ac6dSSavinay Dharmappa 
410*f7f3ac6dSSavinay Dharmappa static int
411*f7f3ac6dSSavinay Dharmappa init_sa_session(const struct ipsec_test_cfg *test_cfg,
412*f7f3ac6dSSavinay Dharmappa 		struct ipsec_sa *sa_out, struct ipsec_sa *sa_in)
413*f7f3ac6dSSavinay Dharmappa {
414*f7f3ac6dSSavinay Dharmappa 
415*f7f3ac6dSSavinay Dharmappa 	int rc;
416*f7f3ac6dSSavinay Dharmappa 
417*f7f3ac6dSSavinay Dharmappa 	fill_ipsec_sa_in(test_cfg, sa_in);
418*f7f3ac6dSSavinay Dharmappa 	fill_ipsec_sa_out(test_cfg, sa_out);
419*f7f3ac6dSSavinay Dharmappa 
420*f7f3ac6dSSavinay Dharmappa 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE, sa_out);
421*f7f3ac6dSSavinay Dharmappa 	if (rc != 0) {
422*f7f3ac6dSSavinay Dharmappa 		RTE_LOG(ERR, USER1, "out bound create_sa failed, cfg\n");
423*f7f3ac6dSSavinay Dharmappa 		return TEST_FAILED;
424*f7f3ac6dSSavinay Dharmappa 	}
425*f7f3ac6dSSavinay Dharmappa 
426*f7f3ac6dSSavinay Dharmappa 	rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE, sa_in);
427*f7f3ac6dSSavinay Dharmappa 	if (rc != 0) {
428*f7f3ac6dSSavinay Dharmappa 		RTE_LOG(ERR, USER1, "out bound create_sa failed, cfg\n");
429*f7f3ac6dSSavinay Dharmappa 		return TEST_FAILED;
430*f7f3ac6dSSavinay Dharmappa 	}
431*f7f3ac6dSSavinay Dharmappa 
432*f7f3ac6dSSavinay Dharmappa 	return TEST_SUCCESS;
433*f7f3ac6dSSavinay Dharmappa }
434*f7f3ac6dSSavinay Dharmappa 
435*f7f3ac6dSSavinay Dharmappa static int
436*f7f3ac6dSSavinay Dharmappa testsuite_setup(void)
437*f7f3ac6dSSavinay Dharmappa {
438*f7f3ac6dSSavinay Dharmappa 	struct rte_mbuf *mbuf;
439*f7f3ac6dSSavinay Dharmappa 	int i;
440*f7f3ac6dSSavinay Dharmappa 
441*f7f3ac6dSSavinay Dharmappa 	mbuf_pool = rte_pktmbuf_pool_create("IPSEC_PERF_MBUFPOOL",
442*f7f3ac6dSSavinay Dharmappa 			NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
443*f7f3ac6dSSavinay Dharmappa 			rte_socket_id());
444*f7f3ac6dSSavinay Dharmappa 	if (mbuf_pool == NULL) {
445*f7f3ac6dSSavinay Dharmappa 		RTE_LOG(ERR, USER1, "Can't create MBUFPOOL\n");
446*f7f3ac6dSSavinay Dharmappa 		return TEST_FAILED;
447*f7f3ac6dSSavinay Dharmappa 	}
448*f7f3ac6dSSavinay Dharmappa 
449*f7f3ac6dSSavinay Dharmappa 	cop_pool = rte_crypto_op_pool_create(
450*f7f3ac6dSSavinay Dharmappa 			"MBUF_CRYPTO_SYM_OP_POOL",
451*f7f3ac6dSSavinay Dharmappa 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
452*f7f3ac6dSSavinay Dharmappa 			NUM_MBUFS, MBUF_CACHE_SIZE,
453*f7f3ac6dSSavinay Dharmappa 			DEFAULT_NUM_XFORMS *
454*f7f3ac6dSSavinay Dharmappa 			sizeof(struct rte_crypto_sym_xform) +
455*f7f3ac6dSSavinay Dharmappa 			MAXIMUM_IV_LENGTH,
456*f7f3ac6dSSavinay Dharmappa 			rte_socket_id());
457*f7f3ac6dSSavinay Dharmappa 	if (cop_pool == NULL) {
458*f7f3ac6dSSavinay Dharmappa 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
459*f7f3ac6dSSavinay Dharmappa 		return TEST_FAILED;
460*f7f3ac6dSSavinay Dharmappa 	}
461*f7f3ac6dSSavinay Dharmappa 
462*f7f3ac6dSSavinay Dharmappa 	ring_inb_prepare = rte_ring_create("ipsec_test_ring_inb_prepare",
463*f7f3ac6dSSavinay Dharmappa 					   RING_SIZE, SOCKET_ID_ANY, 0);
464*f7f3ac6dSSavinay Dharmappa 	if (ring_inb_prepare == NULL)
465*f7f3ac6dSSavinay Dharmappa 		return TEST_FAILED;
466*f7f3ac6dSSavinay Dharmappa 
467*f7f3ac6dSSavinay Dharmappa 	ring_inb_process = rte_ring_create("ipsec_test_ring_inb_process",
468*f7f3ac6dSSavinay Dharmappa 					   RING_SIZE, SOCKET_ID_ANY, 0);
469*f7f3ac6dSSavinay Dharmappa 	if (ring_inb_process == NULL)
470*f7f3ac6dSSavinay Dharmappa 		return TEST_FAILED;
471*f7f3ac6dSSavinay Dharmappa 
472*f7f3ac6dSSavinay Dharmappa 	ring_outb_prepare = rte_ring_create("ipsec_test_ring_outb_prepare",
473*f7f3ac6dSSavinay Dharmappa 					    RING_SIZE, SOCKET_ID_ANY, 0);
474*f7f3ac6dSSavinay Dharmappa 	if (ring_outb_prepare == NULL)
475*f7f3ac6dSSavinay Dharmappa 		return TEST_FAILED;
476*f7f3ac6dSSavinay Dharmappa 
477*f7f3ac6dSSavinay Dharmappa 	ring_outb_process = rte_ring_create("ipsec_test_ring_outb_process",
478*f7f3ac6dSSavinay Dharmappa 					    RING_SIZE, SOCKET_ID_ANY, 0);
479*f7f3ac6dSSavinay Dharmappa 	if (ring_outb_process == NULL)
480*f7f3ac6dSSavinay Dharmappa 		return TEST_FAILED;
481*f7f3ac6dSSavinay Dharmappa 
482*f7f3ac6dSSavinay Dharmappa 	for (i = 0; i < NUM_MBUF; i++) {
483*f7f3ac6dSSavinay Dharmappa 		mbuf = generate_mbuf_data(mbuf_pool);
484*f7f3ac6dSSavinay Dharmappa 
485*f7f3ac6dSSavinay Dharmappa 		if (mbuf && rte_ring_sp_enqueue_bulk(ring_inb_prepare,
486*f7f3ac6dSSavinay Dharmappa 			   (void **)&mbuf, 1, NULL))
487*f7f3ac6dSSavinay Dharmappa 			continue;
488*f7f3ac6dSSavinay Dharmappa 		else
489*f7f3ac6dSSavinay Dharmappa 			return TEST_FAILED;
490*f7f3ac6dSSavinay Dharmappa 	}
491*f7f3ac6dSSavinay Dharmappa 
492*f7f3ac6dSSavinay Dharmappa 	return TEST_SUCCESS;
493*f7f3ac6dSSavinay Dharmappa }
494*f7f3ac6dSSavinay Dharmappa 
495*f7f3ac6dSSavinay Dharmappa static int
496*f7f3ac6dSSavinay Dharmappa measure_performance(struct ipsec_sa *sa_out, struct ipsec_sa *sa_in)
497*f7f3ac6dSSavinay Dharmappa {
498*f7f3ac6dSSavinay Dharmappa 	uint64_t time_diff = 0;
499*f7f3ac6dSSavinay Dharmappa 	uint64_t begin = 0;
500*f7f3ac6dSSavinay Dharmappa 	uint64_t hz = rte_get_timer_hz();
501*f7f3ac6dSSavinay Dharmappa 
502*f7f3ac6dSSavinay Dharmappa 	begin = rte_get_timer_cycles();
503*f7f3ac6dSSavinay Dharmappa 
504*f7f3ac6dSSavinay Dharmappa 	do {
505*f7f3ac6dSSavinay Dharmappa 		if (create_traffic(sa_out, ring_inb_prepare, ring_inb_process,
506*f7f3ac6dSSavinay Dharmappa 				   ring_outb_prepare) < 0)
507*f7f3ac6dSSavinay Dharmappa 			return TEST_FAILED;
508*f7f3ac6dSSavinay Dharmappa 
509*f7f3ac6dSSavinay Dharmappa 		if (create_traffic(sa_in, ring_outb_prepare, ring_outb_process,
510*f7f3ac6dSSavinay Dharmappa 				   ring_inb_prepare) < 0)
511*f7f3ac6dSSavinay Dharmappa 			return TEST_FAILED;
512*f7f3ac6dSSavinay Dharmappa 
513*f7f3ac6dSSavinay Dharmappa 		time_diff = rte_get_timer_cycles() - begin;
514*f7f3ac6dSSavinay Dharmappa 
515*f7f3ac6dSSavinay Dharmappa 	} while (time_diff < (hz * 10));
516*f7f3ac6dSSavinay Dharmappa 
517*f7f3ac6dSSavinay Dharmappa 	return TEST_SUCCESS;
518*f7f3ac6dSSavinay Dharmappa }
519*f7f3ac6dSSavinay Dharmappa 
520*f7f3ac6dSSavinay Dharmappa static void
521*f7f3ac6dSSavinay Dharmappa print_metrics(const struct ipsec_test_cfg *test_cfg,
522*f7f3ac6dSSavinay Dharmappa 	      struct ipsec_sa *sa_out, struct ipsec_sa *sa_in)
523*f7f3ac6dSSavinay Dharmappa {
524*f7f3ac6dSSavinay Dharmappa 	printf("\nMetrics of libipsec prepare/process api:\n");
525*f7f3ac6dSSavinay Dharmappa 
526*f7f3ac6dSSavinay Dharmappa 	printf("replay window size = %u\n", test_cfg->replay_win_sz);
527*f7f3ac6dSSavinay Dharmappa 	if (test_cfg->esn)
528*f7f3ac6dSSavinay Dharmappa 		printf("replay esn is enabled\n");
529*f7f3ac6dSSavinay Dharmappa 	else
530*f7f3ac6dSSavinay Dharmappa 		printf("replay esn is disabled\n");
531*f7f3ac6dSSavinay Dharmappa 	if (test_cfg->type == RTE_CRYPTO_SYM_XFORM_AEAD)
532*f7f3ac6dSSavinay Dharmappa 		printf("AEAD algo is AES_GCM\n");
533*f7f3ac6dSSavinay Dharmappa 	else
534*f7f3ac6dSSavinay Dharmappa 		printf("CIPHER/AUTH algo is AES_CBC/SHA1\n");
535*f7f3ac6dSSavinay Dharmappa 
536*f7f3ac6dSSavinay Dharmappa 
537*f7f3ac6dSSavinay Dharmappa 	printf("avg cycles for a pkt prepare in outbound is = %.2Lf\n",
538*f7f3ac6dSSavinay Dharmappa 	(long double)sa_out->cnt.prepare_ticks_elapsed
539*f7f3ac6dSSavinay Dharmappa 		    / sa_out->cnt.nb_prepare_pkt);
540*f7f3ac6dSSavinay Dharmappa 	printf("avg cycles for a pkt process in outbound is = %.2Lf\n",
541*f7f3ac6dSSavinay Dharmappa 	(long double)sa_out->cnt.process_ticks_elapsed
542*f7f3ac6dSSavinay Dharmappa 		     / sa_out->cnt.nb_process_pkt);
543*f7f3ac6dSSavinay Dharmappa 	printf("avg cycles for a pkt prepare in inbound is = %.2Lf\n",
544*f7f3ac6dSSavinay Dharmappa 	(long double)sa_in->cnt.prepare_ticks_elapsed
545*f7f3ac6dSSavinay Dharmappa 		     / sa_in->cnt.nb_prepare_pkt);
546*f7f3ac6dSSavinay Dharmappa 	printf("avg cycles for a pkt process in inbound is = %.2Lf\n",
547*f7f3ac6dSSavinay Dharmappa 	(long double)sa_in->cnt.process_ticks_elapsed
548*f7f3ac6dSSavinay Dharmappa 		     / sa_in->cnt.nb_process_pkt);
549*f7f3ac6dSSavinay Dharmappa 
550*f7f3ac6dSSavinay Dharmappa }
551*f7f3ac6dSSavinay Dharmappa 
552*f7f3ac6dSSavinay Dharmappa static void
553*f7f3ac6dSSavinay Dharmappa testsuite_teardown(void)
554*f7f3ac6dSSavinay Dharmappa {
555*f7f3ac6dSSavinay Dharmappa 	if (mbuf_pool != NULL) {
556*f7f3ac6dSSavinay Dharmappa 		RTE_LOG(DEBUG, USER1, "MBUFPOOL count %u\n",
557*f7f3ac6dSSavinay Dharmappa 		rte_mempool_avail_count(mbuf_pool));
558*f7f3ac6dSSavinay Dharmappa 		rte_mempool_free(mbuf_pool);
559*f7f3ac6dSSavinay Dharmappa 		mbuf_pool = NULL;
560*f7f3ac6dSSavinay Dharmappa 	}
561*f7f3ac6dSSavinay Dharmappa 
562*f7f3ac6dSSavinay Dharmappa 	if (cop_pool != NULL) {
563*f7f3ac6dSSavinay Dharmappa 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
564*f7f3ac6dSSavinay Dharmappa 		rte_mempool_avail_count(cop_pool));
565*f7f3ac6dSSavinay Dharmappa 		rte_mempool_free(cop_pool);
566*f7f3ac6dSSavinay Dharmappa 		cop_pool = NULL;
567*f7f3ac6dSSavinay Dharmappa 	}
568*f7f3ac6dSSavinay Dharmappa 
569*f7f3ac6dSSavinay Dharmappa 	rte_ring_free(ring_inb_prepare);
570*f7f3ac6dSSavinay Dharmappa 	rte_ring_free(ring_inb_process);
571*f7f3ac6dSSavinay Dharmappa 	rte_ring_free(ring_outb_prepare);
572*f7f3ac6dSSavinay Dharmappa 	rte_ring_free(ring_outb_process);
573*f7f3ac6dSSavinay Dharmappa 
574*f7f3ac6dSSavinay Dharmappa 	ring_inb_prepare = NULL;
575*f7f3ac6dSSavinay Dharmappa 	ring_inb_process = NULL;
576*f7f3ac6dSSavinay Dharmappa 	ring_outb_prepare = NULL;
577*f7f3ac6dSSavinay Dharmappa 	ring_outb_process = NULL;
578*f7f3ac6dSSavinay Dharmappa }
579*f7f3ac6dSSavinay Dharmappa 
580*f7f3ac6dSSavinay Dharmappa static int
581*f7f3ac6dSSavinay Dharmappa test_libipsec_perf(void)
582*f7f3ac6dSSavinay Dharmappa {
583*f7f3ac6dSSavinay Dharmappa 	struct ipsec_sa sa_out;
584*f7f3ac6dSSavinay Dharmappa 	struct ipsec_sa sa_in;
585*f7f3ac6dSSavinay Dharmappa 	uint32_t i;
586*f7f3ac6dSSavinay Dharmappa 	int ret;
587*f7f3ac6dSSavinay Dharmappa 
588*f7f3ac6dSSavinay Dharmappa 	if (testsuite_setup() < 0) {
589*f7f3ac6dSSavinay Dharmappa 		testsuite_teardown();
590*f7f3ac6dSSavinay Dharmappa 		return TEST_FAILED;
591*f7f3ac6dSSavinay Dharmappa 	}
592*f7f3ac6dSSavinay Dharmappa 
593*f7f3ac6dSSavinay Dharmappa 	for (i = 0; i < RTE_DIM(test_cfg) ; i++) {
594*f7f3ac6dSSavinay Dharmappa 
595*f7f3ac6dSSavinay Dharmappa 		ret = init_sa_session(&test_cfg[i], &sa_out, &sa_in);
596*f7f3ac6dSSavinay Dharmappa 		if (ret != 0) {
597*f7f3ac6dSSavinay Dharmappa 			testsuite_teardown();
598*f7f3ac6dSSavinay Dharmappa 			return TEST_FAILED;
599*f7f3ac6dSSavinay Dharmappa 		}
600*f7f3ac6dSSavinay Dharmappa 
601*f7f3ac6dSSavinay Dharmappa 		if (measure_performance(&sa_out, &sa_in) < 0) {
602*f7f3ac6dSSavinay Dharmappa 			testsuite_teardown();
603*f7f3ac6dSSavinay Dharmappa 			return TEST_FAILED;
604*f7f3ac6dSSavinay Dharmappa 		}
605*f7f3ac6dSSavinay Dharmappa 
606*f7f3ac6dSSavinay Dharmappa 		print_metrics(&test_cfg[i], &sa_out, &sa_in);
607*f7f3ac6dSSavinay Dharmappa 	}
608*f7f3ac6dSSavinay Dharmappa 
609*f7f3ac6dSSavinay Dharmappa 	testsuite_teardown();
610*f7f3ac6dSSavinay Dharmappa 
611*f7f3ac6dSSavinay Dharmappa 	return TEST_SUCCESS;
612*f7f3ac6dSSavinay Dharmappa }
613*f7f3ac6dSSavinay Dharmappa 
614*f7f3ac6dSSavinay Dharmappa REGISTER_TEST_COMMAND(ipsec_perf_autotest, test_libipsec_perf);
615