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 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 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 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 227f7f3ac6dSSavinay Dharmappa create_sa(enum rte_security_session_action_type action_type, 228f7f3ac6dSSavinay Dharmappa struct ipsec_sa *sa) 229f7f3ac6dSSavinay Dharmappa { 230f7f3ac6dSSavinay Dharmappa static struct rte_cryptodev_sym_session dummy_ses; 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; 250f7f3ac6dSSavinay Dharmappa 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 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 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 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 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 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 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 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 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 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 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 593f7f3ac6dSSavinay Dharmappa test_libipsec_perf(void) 594f7f3ac6dSSavinay Dharmappa { 595f7f3ac6dSSavinay Dharmappa struct ipsec_sa sa_out; 596f7f3ac6dSSavinay Dharmappa struct ipsec_sa sa_in; 597f7f3ac6dSSavinay Dharmappa uint32_t i; 598f7f3ac6dSSavinay Dharmappa int ret; 599f7f3ac6dSSavinay Dharmappa 600*ce7323f6SStanislaw Kardach ret = rte_cryptodev_count(); 601*ce7323f6SStanislaw Kardach if (ret < 1) { 602*ce7323f6SStanislaw Kardach RTE_LOG(WARNING, USER1, "No crypto devices found?\n"); 603*ce7323f6SStanislaw Kardach return TEST_SKIPPED; 604*ce7323f6SStanislaw Kardach } 605*ce7323f6SStanislaw 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 634f7f3ac6dSSavinay Dharmappa REGISTER_TEST_COMMAND(ipsec_perf_autotest, test_libipsec_perf); 635