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