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