1174a1631SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 2174a1631SBruce Richardson * Copyright(c) 2016-2017 Intel Corporation 3acf86169SPablo de Lara */ 4acf86169SPablo de Lara 5f8be1786SSlawomir Mrozowicz #include <stdio.h> 672b452c5SDmitry Kozlyuk #include <stdlib.h> 7f8be1786SSlawomir Mrozowicz #include <unistd.h> 8f8be1786SSlawomir Mrozowicz 927c2e747SPablo de Lara #include <rte_malloc.h> 1027c2e747SPablo de Lara #include <rte_random.h> 11f8be1786SSlawomir Mrozowicz #include <rte_eal.h> 123a1fffcfSAkhil Goyal #include <rte_errno.h> 13f8be1786SSlawomir Mrozowicz #include <rte_cryptodev.h> 14a8d0d473SBruce Richardson #ifdef RTE_CRYPTO_SCHEDULER 15c4f916e3SPablo de Lara #include <rte_cryptodev_scheduler.h> 16c4f916e3SPablo de Lara #endif 17f8be1786SSlawomir Mrozowicz 18f8be1786SSlawomir Mrozowicz #include "cperf.h" 19f8be1786SSlawomir Mrozowicz #include "cperf_options.h" 20f8be1786SSlawomir Mrozowicz #include "cperf_test_vector_parsing.h" 2171fa6e3fSGowrishankar Muthukrishnan #include "cperf_test_common.h" 22f8be1786SSlawomir Mrozowicz #include "cperf_test_throughput.h" 23f8be1786SSlawomir Mrozowicz #include "cperf_test_latency.h" 24df52cb3bSSergio Gonzalez Monroy #include "cperf_test_verify.h" 2596dfeb60SAnatoly Burakov #include "cperf_test_pmd_cyclecount.h" 26f8be1786SSlawomir Mrozowicz 27d4ad392cSFan Zhang static struct { 28d4ad392cSFan Zhang struct rte_mempool *sess_mp; 29d4ad392cSFan Zhang } session_pool_socket[RTE_MAX_NUMA_NODES]; 302c59bd32SSlawomir Mrozowicz 31f8be1786SSlawomir Mrozowicz const char *cperf_test_type_strs[] = { 32f8be1786SSlawomir Mrozowicz [CPERF_TEST_TYPE_THROUGHPUT] = "throughput", 33df52cb3bSSergio Gonzalez Monroy [CPERF_TEST_TYPE_LATENCY] = "latency", 3496dfeb60SAnatoly Burakov [CPERF_TEST_TYPE_VERIFY] = "verify", 3596dfeb60SAnatoly Burakov [CPERF_TEST_TYPE_PMDCC] = "pmd-cyclecount" 36f8be1786SSlawomir Mrozowicz }; 37f8be1786SSlawomir Mrozowicz 38f8be1786SSlawomir Mrozowicz const char *cperf_op_type_strs[] = { 39f8be1786SSlawomir Mrozowicz [CPERF_CIPHER_ONLY] = "cipher-only", 40f8be1786SSlawomir Mrozowicz [CPERF_AUTH_ONLY] = "auth-only", 41f8be1786SSlawomir Mrozowicz [CPERF_CIPHER_THEN_AUTH] = "cipher-then-auth", 42f8be1786SSlawomir Mrozowicz [CPERF_AUTH_THEN_CIPHER] = "auth-then-cipher", 438fd2b5a6SAkhil Goyal [CPERF_AEAD] = "aead", 44d4a131a9SDavid Coyle [CPERF_PDCP] = "pdcp", 45ba588ce3SKiran Kumar K [CPERF_DOCSIS] = "docsis", 4628dde5daSAkhil Goyal [CPERF_IPSEC] = "ipsec", 479afa7a46SAkhil Goyal [CPERF_ASYM_MODEX] = "modex", 48195a271eSGowrishankar Muthukrishnan [CPERF_ASYM_SECP256R1] = "ecdsa_p256r1", 49*981a1ed3SGowrishankar Muthukrishnan [CPERF_ASYM_ED25519] = "eddsa_25519", 50b82742f9SAkhil Goyal [CPERF_ASYM_SM2] = "sm2", 519afa7a46SAkhil Goyal [CPERF_TLS] = "tls-record" 52f8be1786SSlawomir Mrozowicz }; 53f8be1786SSlawomir Mrozowicz 54f8be1786SSlawomir Mrozowicz const struct cperf_test cperf_testmap[] = { 55f8be1786SSlawomir Mrozowicz [CPERF_TEST_TYPE_THROUGHPUT] = { 56f8be1786SSlawomir Mrozowicz cperf_throughput_test_constructor, 57f8be1786SSlawomir Mrozowicz cperf_throughput_test_runner, 58f8be1786SSlawomir Mrozowicz cperf_throughput_test_destructor 59f8be1786SSlawomir Mrozowicz }, 60f8be1786SSlawomir Mrozowicz [CPERF_TEST_TYPE_LATENCY] = { 61f8be1786SSlawomir Mrozowicz cperf_latency_test_constructor, 62f8be1786SSlawomir Mrozowicz cperf_latency_test_runner, 63f8be1786SSlawomir Mrozowicz cperf_latency_test_destructor 64df52cb3bSSergio Gonzalez Monroy }, 65df52cb3bSSergio Gonzalez Monroy [CPERF_TEST_TYPE_VERIFY] = { 66df52cb3bSSergio Gonzalez Monroy cperf_verify_test_constructor, 67df52cb3bSSergio Gonzalez Monroy cperf_verify_test_runner, 68df52cb3bSSergio Gonzalez Monroy cperf_verify_test_destructor 6996dfeb60SAnatoly Burakov }, 7096dfeb60SAnatoly Burakov [CPERF_TEST_TYPE_PMDCC] = { 7196dfeb60SAnatoly Burakov cperf_pmd_cyclecount_test_constructor, 7296dfeb60SAnatoly Burakov cperf_pmd_cyclecount_test_runner, 7396dfeb60SAnatoly Burakov cperf_pmd_cyclecount_test_destructor 74f8be1786SSlawomir Mrozowicz } 75f8be1786SSlawomir Mrozowicz }; 76f8be1786SSlawomir Mrozowicz 77f8be1786SSlawomir Mrozowicz static int 781f1e4b7cSCiara Power create_asym_op_pool_socket(int32_t socket_id, uint32_t nb_sessions) 79ba588ce3SKiran Kumar K { 80ba588ce3SKiran Kumar K char mp_name[RTE_MEMPOOL_NAMESIZE]; 81ba588ce3SKiran Kumar K struct rte_mempool *mpool = NULL; 82ba588ce3SKiran Kumar K 83ba588ce3SKiran Kumar K if (session_pool_socket[socket_id].sess_mp == NULL) { 84ba588ce3SKiran Kumar K snprintf(mp_name, RTE_MEMPOOL_NAMESIZE, "perf_asym_sess_pool%u", 85ba588ce3SKiran Kumar K socket_id); 861f1e4b7cSCiara Power mpool = rte_cryptodev_asym_session_pool_create(mp_name, 8792d55afeSCiara Power nb_sessions, 0, 0, socket_id); 88ba588ce3SKiran Kumar K if (mpool == NULL) { 89ba588ce3SKiran Kumar K printf("Cannot create pool \"%s\" on socket %d\n", 90ba588ce3SKiran Kumar K mp_name, socket_id); 91ba588ce3SKiran Kumar K return -ENOMEM; 92ba588ce3SKiran Kumar K } 93ba588ce3SKiran Kumar K session_pool_socket[socket_id].sess_mp = mpool; 94ba588ce3SKiran Kumar K } 95ba588ce3SKiran Kumar K return 0; 96ba588ce3SKiran Kumar K } 97ba588ce3SKiran Kumar K 98ba588ce3SKiran Kumar K static int 99d4ad392cSFan Zhang fill_session_pool_socket(int32_t socket_id, uint32_t session_priv_size, 100d4ad392cSFan Zhang uint32_t nb_sessions) 101d4ad392cSFan Zhang { 102d4ad392cSFan Zhang char mp_name[RTE_MEMPOOL_NAMESIZE]; 103d4ad392cSFan Zhang struct rte_mempool *sess_mp; 104d4ad392cSFan Zhang 105d4ad392cSFan Zhang if (session_pool_socket[socket_id].sess_mp == NULL) { 106d4ad392cSFan Zhang 107d4ad392cSFan Zhang snprintf(mp_name, RTE_MEMPOOL_NAMESIZE, 108d4ad392cSFan Zhang "sess_mp_%u", socket_id); 109d4ad392cSFan Zhang 110d4ad392cSFan Zhang sess_mp = rte_cryptodev_sym_session_pool_create(mp_name, 111bdce2564SAkhil Goyal nb_sessions, session_priv_size, 0, 0, 112bdce2564SAkhil Goyal socket_id); 113d4ad392cSFan Zhang 114d4ad392cSFan Zhang if (sess_mp == NULL) { 115d4ad392cSFan Zhang printf("Cannot create pool \"%s\" on socket %d\n", 116d4ad392cSFan Zhang mp_name, socket_id); 117d4ad392cSFan Zhang return -ENOMEM; 118d4ad392cSFan Zhang } 119d4ad392cSFan Zhang 120d4ad392cSFan Zhang printf("Allocated pool \"%s\" on socket %d\n", 121d4ad392cSFan Zhang mp_name, socket_id); 122d4ad392cSFan Zhang session_pool_socket[socket_id].sess_mp = sess_mp; 123d4ad392cSFan Zhang } 124d4ad392cSFan Zhang 125d4ad392cSFan Zhang return 0; 126d4ad392cSFan Zhang } 127d4ad392cSFan Zhang 128d4ad392cSFan Zhang static int 129d4ad392cSFan Zhang cperf_initialize_cryptodev(struct cperf_options *opts, uint8_t *enabled_cdevs) 130f8be1786SSlawomir Mrozowicz { 1312c59bd32SSlawomir Mrozowicz uint8_t enabled_cdev_count = 0, nb_lcores, cdev_id; 132501c0a3bSPablo de Lara uint32_t sessions_needed = 0; 133c4f916e3SPablo de Lara unsigned int i, j; 134f8be1786SSlawomir Mrozowicz int ret; 135f8be1786SSlawomir Mrozowicz 136f8be1786SSlawomir Mrozowicz enabled_cdev_count = rte_cryptodev_devices_get(opts->device_type, 1377fb95c36SJacek Piasecki enabled_cdevs, RTE_CRYPTO_MAX_DEVS); 138f8be1786SSlawomir Mrozowicz if (enabled_cdev_count == 0) { 139f8be1786SSlawomir Mrozowicz printf("No crypto devices type %s available\n", 140f8be1786SSlawomir Mrozowicz opts->device_type); 141f8be1786SSlawomir Mrozowicz return -EINVAL; 142f8be1786SSlawomir Mrozowicz } 143f8be1786SSlawomir Mrozowicz 144f8be1786SSlawomir Mrozowicz nb_lcores = rte_lcore_count() - 1; 145f8be1786SSlawomir Mrozowicz 1460bb32d94SPablo de Lara if (nb_lcores < 1) { 1470bb32d94SPablo de Lara RTE_LOG(ERR, USER1, 1480bb32d94SPablo de Lara "Number of enabled cores need to be higher than 1\n"); 1490bb32d94SPablo de Lara return -EINVAL; 1500bb32d94SPablo de Lara } 1510bb32d94SPablo de Lara 152dc476f12SHemant Agrawal /* 153dc476f12SHemant Agrawal * Use less number of devices, 154dc476f12SHemant Agrawal * if there are more available than cores. 155dc476f12SHemant Agrawal */ 156dc476f12SHemant Agrawal if (enabled_cdev_count > nb_lcores) 157dc476f12SHemant Agrawal enabled_cdev_count = nb_lcores; 158f8be1786SSlawomir Mrozowicz 1592c59bd32SSlawomir Mrozowicz /* Create a mempool shared by all the devices */ 1602c59bd32SSlawomir Mrozowicz uint32_t max_sess_size = 0, sess_size; 1612c59bd32SSlawomir Mrozowicz 1622c59bd32SSlawomir Mrozowicz for (cdev_id = 0; cdev_id < rte_cryptodev_count(); cdev_id++) { 163a106fcceSPablo de Lara sess_size = rte_cryptodev_sym_get_private_session_size(cdev_id); 1642c59bd32SSlawomir Mrozowicz if (sess_size > max_sess_size) 1652c59bd32SSlawomir Mrozowicz max_sess_size = sess_size; 1662c59bd32SSlawomir Mrozowicz } 167a8d0d473SBruce Richardson #ifdef RTE_LIB_SECURITY 168e30b2833SAkhil Goyal for (cdev_id = 0; cdev_id < rte_cryptodev_count(); cdev_id++) { 169e30b2833SAkhil Goyal sess_size = rte_security_session_get_size( 170e30b2833SAkhil Goyal rte_cryptodev_get_sec_ctx(cdev_id)); 171e30b2833SAkhil Goyal if (sess_size > max_sess_size) 172e30b2833SAkhil Goyal max_sess_size = sess_size; 173e30b2833SAkhil Goyal } 174e30b2833SAkhil Goyal #endif 175c4f916e3SPablo de Lara /* 176c4f916e3SPablo de Lara * Calculate number of needed queue pairs, based on the amount 177c4f916e3SPablo de Lara * of available number of logical cores and crypto devices. 178c4f916e3SPablo de Lara * For instance, if there are 4 cores and 2 crypto devices, 179c4f916e3SPablo de Lara * 2 queue pairs will be set up per device. 180c4f916e3SPablo de Lara */ 181c4f916e3SPablo de Lara opts->nb_qps = (nb_lcores % enabled_cdev_count) ? 182c4f916e3SPablo de Lara (nb_lcores / enabled_cdev_count) + 1 : 183c4f916e3SPablo de Lara nb_lcores / enabled_cdev_count; 184c4f916e3SPablo de Lara 1852c59bd32SSlawomir Mrozowicz for (i = 0; i < enabled_cdev_count && 1862c59bd32SSlawomir Mrozowicz i < RTE_CRYPTO_MAX_DEVS; i++) { 1872c59bd32SSlawomir Mrozowicz cdev_id = enabled_cdevs[i]; 188a8d0d473SBruce Richardson #ifdef RTE_CRYPTO_SCHEDULER 189c4f916e3SPablo de Lara /* 190c4f916e3SPablo de Lara * If multi-core scheduler is used, limit the number 191c4f916e3SPablo de Lara * of queue pairs to 1, as there is no way to know 192c4f916e3SPablo de Lara * how many cores are being used by the PMD, and 193c4f916e3SPablo de Lara * how many will be available for the application. 194c4f916e3SPablo de Lara */ 195c4f916e3SPablo de Lara if (!strcmp((const char *)opts->device_type, "crypto_scheduler") && 196c4f916e3SPablo de Lara rte_cryptodev_scheduler_mode_get(cdev_id) == 197c4f916e3SPablo de Lara CDEV_SCHED_MODE_MULTICORE) 198c4f916e3SPablo de Lara opts->nb_qps = 1; 199c4f916e3SPablo de Lara #endif 200c4f916e3SPablo de Lara 201c4f916e3SPablo de Lara struct rte_cryptodev_info cdev_info; 202a23b5064SCiara Power int socket_id = rte_cryptodev_socket_id(cdev_id); 203a23b5064SCiara Power 204a23b5064SCiara Power /* Use the first socket if SOCKET_ID_ANY is returned. */ 205a23b5064SCiara Power if (socket_id == SOCKET_ID_ANY) 20664c469b9SBruce Richardson socket_id = 0; 207f8be1786SSlawomir Mrozowicz 208c4f916e3SPablo de Lara rte_cryptodev_info_get(cdev_id, &cdev_info); 209ba588ce3SKiran Kumar K 21071fa6e3fSGowrishankar Muthukrishnan if (cperf_is_asym_test(opts)) { 211ba588ce3SKiran Kumar K if ((cdev_info.feature_flags & 212ba588ce3SKiran Kumar K RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO) == 0) 213ba588ce3SKiran Kumar K continue; 214ba588ce3SKiran Kumar K } 215ba588ce3SKiran Kumar K 216c4f916e3SPablo de Lara if (opts->nb_qps > cdev_info.max_nb_queue_pairs) { 217c4f916e3SPablo de Lara printf("Number of needed queue pairs is higher " 218c4f916e3SPablo de Lara "than the maximum number of queue pairs " 219c4f916e3SPablo de Lara "per device.\n"); 220c4f916e3SPablo de Lara printf("Lower the number of cores or increase " 221c4f916e3SPablo de Lara "the number of crypto devices\n"); 222c4f916e3SPablo de Lara return -EINVAL; 223c4f916e3SPablo de Lara } 224f8be1786SSlawomir Mrozowicz struct rte_cryptodev_config conf = { 225c4f916e3SPablo de Lara .nb_queue_pairs = opts->nb_qps, 226c9030ae3SAnoob Joseph .socket_id = socket_id, 227f8be1786SSlawomir Mrozowicz }; 2282c59bd32SSlawomir Mrozowicz 229ba588ce3SKiran Kumar K switch (opts->op_type) { 230195a271eSGowrishankar Muthukrishnan case CPERF_ASYM_SECP256R1: 231*981a1ed3SGowrishankar Muthukrishnan case CPERF_ASYM_ED25519: 232b82742f9SAkhil Goyal case CPERF_ASYM_SM2: 233ba588ce3SKiran Kumar K case CPERF_ASYM_MODEX: 234ba588ce3SKiran Kumar K conf.ff_disable |= (RTE_CRYPTODEV_FF_SECURITY | 235ba588ce3SKiran Kumar K RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO); 236ba588ce3SKiran Kumar K break; 237ba588ce3SKiran Kumar K case CPERF_CIPHER_ONLY: 238ba588ce3SKiran Kumar K case CPERF_AUTH_ONLY: 239ba588ce3SKiran Kumar K case CPERF_CIPHER_THEN_AUTH: 240ba588ce3SKiran Kumar K case CPERF_AUTH_THEN_CIPHER: 241ba588ce3SKiran Kumar K case CPERF_AEAD: 2424ad736ceSDavid Coyle conf.ff_disable |= RTE_CRYPTODEV_FF_SECURITY; 243ba588ce3SKiran Kumar K /* Fall through */ 244ba588ce3SKiran Kumar K case CPERF_PDCP: 245ba588ce3SKiran Kumar K case CPERF_DOCSIS: 24628dde5daSAkhil Goyal case CPERF_IPSEC: 2479afa7a46SAkhil Goyal case CPERF_TLS: 248ba588ce3SKiran Kumar K /* Fall through */ 249ba588ce3SKiran Kumar K default: 250ba588ce3SKiran Kumar K conf.ff_disable |= RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO; 251ba588ce3SKiran Kumar K } 2524ad736ceSDavid Coyle 253f8be1786SSlawomir Mrozowicz struct rte_cryptodev_qp_conf qp_conf = { 254e004aaa8SAkhil Goyal .nb_descriptors = opts->nb_descriptors, 255e004aaa8SAkhil Goyal .priority = RTE_CRYPTODEV_QP_PRIORITY_HIGHEST 256f8be1786SSlawomir Mrozowicz }; 257f8be1786SSlawomir Mrozowicz 258c1670ae0SAnoob Joseph /** 259c1670ae0SAnoob Joseph * Device info specifies the min headroom and tailroom 260c1670ae0SAnoob Joseph * requirement for the crypto PMD. This need to be honoured 261c1670ae0SAnoob Joseph * by the application, while creating mbuf. 262c1670ae0SAnoob Joseph */ 263c1670ae0SAnoob Joseph if (opts->headroom_sz < cdev_info.min_mbuf_headroom_req) { 264c1670ae0SAnoob Joseph /* Update headroom */ 265c1670ae0SAnoob Joseph opts->headroom_sz = cdev_info.min_mbuf_headroom_req; 266c1670ae0SAnoob Joseph } 267c1670ae0SAnoob Joseph if (opts->tailroom_sz < cdev_info.min_mbuf_tailroom_req) { 268c1670ae0SAnoob Joseph /* Update tailroom */ 269c1670ae0SAnoob Joseph opts->tailroom_sz = cdev_info.min_mbuf_tailroom_req; 270c1670ae0SAnoob Joseph } 271c1670ae0SAnoob Joseph 272c1670ae0SAnoob Joseph /* Update segment size to include headroom & tailroom */ 273c1670ae0SAnoob Joseph opts->segment_sz += (opts->headroom_sz + opts->tailroom_sz); 274c1670ae0SAnoob Joseph 275501c0a3bSPablo de Lara uint32_t dev_max_nb_sess = cdev_info.sym.max_nb_sessions; 276501c0a3bSPablo de Lara if (!strcmp((const char *)opts->device_type, 277501c0a3bSPablo de Lara "crypto_scheduler")) { 278a8d0d473SBruce Richardson #ifdef RTE_CRYPTO_SCHEDULER 2798fa8cc77SCiara Power uint32_t nb_workers = 28085b00824SAdam Dybkowski rte_cryptodev_scheduler_workers_get(cdev_id, 281501c0a3bSPablo de Lara NULL); 28212e72248SCiara Power /* scheduler session header per lcore + 1 session per worker qp */ 28312e72248SCiara Power sessions_needed = nb_lcores + enabled_cdev_count * 2848fa8cc77SCiara Power opts->nb_qps * nb_workers; 285501c0a3bSPablo de Lara #endif 286501c0a3bSPablo de Lara } else 287e30b2833SAkhil Goyal sessions_needed = enabled_cdev_count * opts->nb_qps; 288501c0a3bSPablo de Lara 289501c0a3bSPablo de Lara /* 290501c0a3bSPablo de Lara * A single session is required per queue pair 291501c0a3bSPablo de Lara * in each device 292501c0a3bSPablo de Lara */ 2932925e0c1SPablo de Lara if (dev_max_nb_sess != 0 && dev_max_nb_sess < opts->nb_qps) { 294501c0a3bSPablo de Lara RTE_LOG(ERR, USER1, 295501c0a3bSPablo de Lara "Device does not support at least " 296501c0a3bSPablo de Lara "%u sessions\n", opts->nb_qps); 297501c0a3bSPablo de Lara return -ENOTSUP; 298501c0a3bSPablo de Lara } 2992c59bd32SSlawomir Mrozowicz 30071fa6e3fSGowrishankar Muthukrishnan if (cperf_is_asym_test(opts)) 3011f1e4b7cSCiara Power ret = create_asym_op_pool_socket(socket_id, 302ba588ce3SKiran Kumar K sessions_needed); 303ba588ce3SKiran Kumar K else 304d4ad392cSFan Zhang ret = fill_session_pool_socket(socket_id, max_sess_size, 305d4ad392cSFan Zhang sessions_needed); 306d4ad392cSFan Zhang if (ret < 0) 307d4ad392cSFan Zhang return ret; 3082c59bd32SSlawomir Mrozowicz 309d4ad392cSFan Zhang qp_conf.mp_session = session_pool_socket[socket_id].sess_mp; 310725d2a7fSFan Zhang 31171fa6e3fSGowrishankar Muthukrishnan if (cperf_is_asym_test(opts)) 312ba588ce3SKiran Kumar K qp_conf.mp_session = NULL; 313ba588ce3SKiran Kumar K 314f7db6f82SPablo de Lara ret = rte_cryptodev_configure(cdev_id, &conf); 315f8be1786SSlawomir Mrozowicz if (ret < 0) { 3162c59bd32SSlawomir Mrozowicz printf("Failed to configure cryptodev %u", cdev_id); 317f8be1786SSlawomir Mrozowicz return -EINVAL; 318f8be1786SSlawomir Mrozowicz } 319f8be1786SSlawomir Mrozowicz 320c4f916e3SPablo de Lara for (j = 0; j < opts->nb_qps; j++) { 321e004aaa8SAkhil Goyal if ((1 << j) & opts->low_prio_qp_mask) 322e004aaa8SAkhil Goyal qp_conf.priority = RTE_CRYPTODEV_QP_PRIORITY_LOWEST; 323e004aaa8SAkhil Goyal 324c4f916e3SPablo de Lara ret = rte_cryptodev_queue_pair_setup(cdev_id, j, 325725d2a7fSFan Zhang &qp_conf, socket_id); 326f8be1786SSlawomir Mrozowicz if (ret < 0) { 327f8be1786SSlawomir Mrozowicz printf("Failed to setup queue pair %u on " 328c4f916e3SPablo de Lara "cryptodev %u", j, cdev_id); 329f8be1786SSlawomir Mrozowicz return -EINVAL; 330f8be1786SSlawomir Mrozowicz } 331c4f916e3SPablo de Lara } 332f8be1786SSlawomir Mrozowicz 3332c59bd32SSlawomir Mrozowicz ret = rte_cryptodev_start(cdev_id); 334f8be1786SSlawomir Mrozowicz if (ret < 0) { 335f8be1786SSlawomir Mrozowicz printf("Failed to start device %u: error %d\n", 3362c59bd32SSlawomir Mrozowicz cdev_id, ret); 337f8be1786SSlawomir Mrozowicz return -EPERM; 338f8be1786SSlawomir Mrozowicz } 339f8be1786SSlawomir Mrozowicz } 340f8be1786SSlawomir Mrozowicz 341f8be1786SSlawomir Mrozowicz return enabled_cdev_count; 342f8be1786SSlawomir Mrozowicz } 343f8be1786SSlawomir Mrozowicz 344f8be1786SSlawomir Mrozowicz static int 345f8be1786SSlawomir Mrozowicz cperf_verify_devices_capabilities(struct cperf_options *opts, 346f8be1786SSlawomir Mrozowicz uint8_t *enabled_cdevs, uint8_t nb_cryptodevs) 347f8be1786SSlawomir Mrozowicz { 348f8be1786SSlawomir Mrozowicz struct rte_cryptodev_sym_capability_idx cap_idx; 349f8be1786SSlawomir Mrozowicz const struct rte_cryptodev_symmetric_capability *capability; 350ba588ce3SKiran Kumar K struct rte_cryptodev_asym_capability_idx asym_cap_idx; 351ba588ce3SKiran Kumar K const struct rte_cryptodev_asymmetric_xform_capability *asym_capability; 352ba588ce3SKiran Kumar K 353f8be1786SSlawomir Mrozowicz 354f8be1786SSlawomir Mrozowicz uint8_t i, cdev_id; 355f8be1786SSlawomir Mrozowicz int ret; 356f8be1786SSlawomir Mrozowicz 357f8be1786SSlawomir Mrozowicz for (i = 0; i < nb_cryptodevs; i++) { 358f8be1786SSlawomir Mrozowicz 359f8be1786SSlawomir Mrozowicz cdev_id = enabled_cdevs[i]; 360f8be1786SSlawomir Mrozowicz 361ba588ce3SKiran Kumar K if (opts->op_type == CPERF_ASYM_MODEX) { 362ba588ce3SKiran Kumar K asym_cap_idx.type = RTE_CRYPTO_ASYM_XFORM_MODEX; 363ba588ce3SKiran Kumar K asym_capability = rte_cryptodev_asym_capability_get( 364ba588ce3SKiran Kumar K cdev_id, &asym_cap_idx); 365ba588ce3SKiran Kumar K if (asym_capability == NULL) 366ba588ce3SKiran Kumar K return -1; 367ba588ce3SKiran Kumar K 368ba588ce3SKiran Kumar K ret = rte_cryptodev_asym_xform_capability_check_modlen( 369a538d1d2SKiran Kumar K asym_capability, opts->modex_data->modulus.len); 370ba588ce3SKiran Kumar K if (ret != 0) 371ba588ce3SKiran Kumar K return ret; 372ba588ce3SKiran Kumar K 373ba588ce3SKiran Kumar K } 374ba588ce3SKiran Kumar K 375195a271eSGowrishankar Muthukrishnan if (opts->op_type == CPERF_ASYM_SECP256R1) { 376195a271eSGowrishankar Muthukrishnan asym_cap_idx.type = RTE_CRYPTO_ASYM_XFORM_ECDSA; 377195a271eSGowrishankar Muthukrishnan asym_capability = rte_cryptodev_asym_capability_get(cdev_id, &asym_cap_idx); 378195a271eSGowrishankar Muthukrishnan if (asym_capability == NULL) 379195a271eSGowrishankar Muthukrishnan return -1; 380195a271eSGowrishankar Muthukrishnan 381195a271eSGowrishankar Muthukrishnan if (!rte_cryptodev_asym_xform_capability_check_optype(asym_capability, 382195a271eSGowrishankar Muthukrishnan opts->asym_op_type)) 383195a271eSGowrishankar Muthukrishnan return -1; 384195a271eSGowrishankar Muthukrishnan 385195a271eSGowrishankar Muthukrishnan if (asym_capability->internal_rng != 0) { 386195a271eSGowrishankar Muthukrishnan opts->secp256r1_data->k.data = NULL; 387195a271eSGowrishankar Muthukrishnan opts->secp256r1_data->k.length = 0; 388195a271eSGowrishankar Muthukrishnan } 389195a271eSGowrishankar Muthukrishnan } 390195a271eSGowrishankar Muthukrishnan 391*981a1ed3SGowrishankar Muthukrishnan if (opts->op_type == CPERF_ASYM_ED25519) { 392*981a1ed3SGowrishankar Muthukrishnan asym_cap_idx.type = RTE_CRYPTO_ASYM_XFORM_EDDSA; 393*981a1ed3SGowrishankar Muthukrishnan asym_capability = rte_cryptodev_asym_capability_get(cdev_id, &asym_cap_idx); 394*981a1ed3SGowrishankar Muthukrishnan if (asym_capability == NULL) 395*981a1ed3SGowrishankar Muthukrishnan return -1; 396*981a1ed3SGowrishankar Muthukrishnan 397*981a1ed3SGowrishankar Muthukrishnan if (!rte_cryptodev_asym_xform_capability_check_optype(asym_capability, 398*981a1ed3SGowrishankar Muthukrishnan opts->asym_op_type)) 399*981a1ed3SGowrishankar Muthukrishnan return -1; 400*981a1ed3SGowrishankar Muthukrishnan } 401*981a1ed3SGowrishankar Muthukrishnan 402b82742f9SAkhil Goyal if (opts->op_type == CPERF_ASYM_SM2) { 403b82742f9SAkhil Goyal asym_cap_idx.type = RTE_CRYPTO_ASYM_XFORM_SM2; 404b82742f9SAkhil Goyal asym_capability = rte_cryptodev_asym_capability_get(cdev_id, &asym_cap_idx); 405b82742f9SAkhil Goyal if (asym_capability == NULL) 406b82742f9SAkhil Goyal return -1; 407b82742f9SAkhil Goyal 408b82742f9SAkhil Goyal if (!rte_cryptodev_asym_xform_capability_check_optype(asym_capability, 409b82742f9SAkhil Goyal opts->asym_op_type)) 410b82742f9SAkhil Goyal return -1; 411b82742f9SAkhil Goyal 412b82742f9SAkhil Goyal if (rte_cryptodev_asym_xform_capability_check_hash(asym_capability, 413b82742f9SAkhil Goyal RTE_CRYPTO_AUTH_SM3)) { 414b82742f9SAkhil Goyal opts->asym_hash_alg = RTE_CRYPTO_AUTH_SM3; 415b82742f9SAkhil Goyal if (opts->asym_op_type == RTE_CRYPTO_ASYM_OP_SIGN || 416b82742f9SAkhil Goyal opts->asym_op_type == RTE_CRYPTO_ASYM_OP_VERIFY) { 417b82742f9SAkhil Goyal opts->sm2_data->message.data = sm2_perf_data.message.data; 418b82742f9SAkhil Goyal opts->sm2_data->message.length = 419b82742f9SAkhil Goyal sm2_perf_data.message.length; 420b82742f9SAkhil Goyal opts->sm2_data->id.data = sm2_perf_data.id.data; 421b82742f9SAkhil Goyal opts->sm2_data->id.length = sm2_perf_data.id.length; 422b82742f9SAkhil Goyal } 423b82742f9SAkhil Goyal } else { 424b82742f9SAkhil Goyal opts->asym_hash_alg = RTE_CRYPTO_AUTH_NULL; 425b82742f9SAkhil Goyal if (opts->asym_op_type == RTE_CRYPTO_ASYM_OP_SIGN || 426b82742f9SAkhil Goyal opts->asym_op_type == RTE_CRYPTO_ASYM_OP_VERIFY) { 427b82742f9SAkhil Goyal opts->sm2_data->message.data = sm2_perf_data.digest.data; 428b82742f9SAkhil Goyal opts->sm2_data->message.length = 429b82742f9SAkhil Goyal sm2_perf_data.digest.length; 430b82742f9SAkhil Goyal opts->sm2_data->id.data = NULL; 431b82742f9SAkhil Goyal opts->sm2_data->id.length = 0; 432b82742f9SAkhil Goyal } 433b82742f9SAkhil Goyal } 434b82742f9SAkhil Goyal if (asym_capability->internal_rng != 0) { 435b82742f9SAkhil Goyal opts->sm2_data->k.data = NULL; 436b82742f9SAkhil Goyal opts->sm2_data->k.length = 0; 437b82742f9SAkhil Goyal } 438b82742f9SAkhil Goyal if (opts->asym_op_type == RTE_CRYPTO_ASYM_OP_ENCRYPT) { 439b82742f9SAkhil Goyal opts->sm2_data->message.data = sm2_perf_data.message.data; 440b82742f9SAkhil Goyal opts->sm2_data->message.length = sm2_perf_data.message.length; 441b82742f9SAkhil Goyal opts->sm2_data->cipher.data = sm2_perf_data.cipher.data; 442b82742f9SAkhil Goyal opts->sm2_data->cipher.length = sm2_perf_data.cipher.length; 443b82742f9SAkhil Goyal } else if (opts->asym_op_type == RTE_CRYPTO_ASYM_OP_DECRYPT) { 444b82742f9SAkhil Goyal opts->sm2_data->cipher.data = sm2_perf_data.cipher.data; 445b82742f9SAkhil Goyal opts->sm2_data->cipher.length = sm2_perf_data.cipher.length; 446b82742f9SAkhil Goyal opts->sm2_data->message.data = sm2_perf_data.message.data; 447b82742f9SAkhil Goyal opts->sm2_data->message.length = sm2_perf_data.message.length; 448b82742f9SAkhil Goyal } else if (opts->asym_op_type == RTE_CRYPTO_ASYM_OP_SIGN) { 449b82742f9SAkhil Goyal opts->sm2_data->sign_r.data = sm2_perf_data.sign_r.data; 450b82742f9SAkhil Goyal opts->sm2_data->sign_r.length = sm2_perf_data.sign_r.length; 451b82742f9SAkhil Goyal opts->sm2_data->sign_s.data = sm2_perf_data.sign_s.data; 452b82742f9SAkhil Goyal opts->sm2_data->sign_s.length = sm2_perf_data.sign_s.length; 453b82742f9SAkhil Goyal } else if (opts->asym_op_type == RTE_CRYPTO_ASYM_OP_VERIFY) { 454b82742f9SAkhil Goyal opts->sm2_data->sign_r.data = sm2_perf_data.sign_r.data; 455b82742f9SAkhil Goyal opts->sm2_data->sign_r.length = sm2_perf_data.sign_r.length; 456b82742f9SAkhil Goyal opts->sm2_data->sign_s.data = sm2_perf_data.sign_s.data; 457b82742f9SAkhil Goyal opts->sm2_data->sign_s.length = sm2_perf_data.sign_s.length; 458b82742f9SAkhil Goyal } 459b82742f9SAkhil Goyal } 460b82742f9SAkhil Goyal 461f8be1786SSlawomir Mrozowicz if (opts->op_type == CPERF_AUTH_ONLY || 462f8be1786SSlawomir Mrozowicz opts->op_type == CPERF_CIPHER_THEN_AUTH || 4638a5b494aSPablo de Lara opts->op_type == CPERF_AUTH_THEN_CIPHER) { 464f8be1786SSlawomir Mrozowicz 465f8be1786SSlawomir Mrozowicz cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 466f8be1786SSlawomir Mrozowicz cap_idx.algo.auth = opts->auth_algo; 467f8be1786SSlawomir Mrozowicz 468f8be1786SSlawomir Mrozowicz capability = rte_cryptodev_sym_capability_get(cdev_id, 469f8be1786SSlawomir Mrozowicz &cap_idx); 470f8be1786SSlawomir Mrozowicz if (capability == NULL) 471f8be1786SSlawomir Mrozowicz return -1; 472f8be1786SSlawomir Mrozowicz 473f8be1786SSlawomir Mrozowicz ret = rte_cryptodev_sym_capability_check_auth( 474f8be1786SSlawomir Mrozowicz capability, 475f8be1786SSlawomir Mrozowicz opts->auth_key_sz, 4768a5b494aSPablo de Lara opts->digest_sz, 477acf86169SPablo de Lara opts->auth_iv_sz); 478f8be1786SSlawomir Mrozowicz if (ret != 0) 479f8be1786SSlawomir Mrozowicz return ret; 480f8be1786SSlawomir Mrozowicz } 481f8be1786SSlawomir Mrozowicz 482f8be1786SSlawomir Mrozowicz if (opts->op_type == CPERF_CIPHER_ONLY || 483f8be1786SSlawomir Mrozowicz opts->op_type == CPERF_CIPHER_THEN_AUTH || 4848a5b494aSPablo de Lara opts->op_type == CPERF_AUTH_THEN_CIPHER) { 485f8be1786SSlawomir Mrozowicz 486f8be1786SSlawomir Mrozowicz cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 487f8be1786SSlawomir Mrozowicz cap_idx.algo.cipher = opts->cipher_algo; 488f8be1786SSlawomir Mrozowicz 489f8be1786SSlawomir Mrozowicz capability = rte_cryptodev_sym_capability_get(cdev_id, 490f8be1786SSlawomir Mrozowicz &cap_idx); 491f8be1786SSlawomir Mrozowicz if (capability == NULL) 492f8be1786SSlawomir Mrozowicz return -1; 493f8be1786SSlawomir Mrozowicz 494f8be1786SSlawomir Mrozowicz ret = rte_cryptodev_sym_capability_check_cipher( 495f8be1786SSlawomir Mrozowicz capability, 496f8be1786SSlawomir Mrozowicz opts->cipher_key_sz, 497f8be1786SSlawomir Mrozowicz opts->cipher_iv_sz); 498f8be1786SSlawomir Mrozowicz if (ret != 0) 499f8be1786SSlawomir Mrozowicz return ret; 500f8be1786SSlawomir Mrozowicz } 5018a5b494aSPablo de Lara 5028a5b494aSPablo de Lara if (opts->op_type == CPERF_AEAD) { 5038a5b494aSPablo de Lara 5048a5b494aSPablo de Lara cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 5058a5b494aSPablo de Lara cap_idx.algo.aead = opts->aead_algo; 5068a5b494aSPablo de Lara 5078a5b494aSPablo de Lara capability = rte_cryptodev_sym_capability_get(cdev_id, 5088a5b494aSPablo de Lara &cap_idx); 5098a5b494aSPablo de Lara if (capability == NULL) 5108a5b494aSPablo de Lara return -1; 5118a5b494aSPablo de Lara 5128a5b494aSPablo de Lara ret = rte_cryptodev_sym_capability_check_aead( 5138a5b494aSPablo de Lara capability, 5148a5b494aSPablo de Lara opts->aead_key_sz, 5158a5b494aSPablo de Lara opts->digest_sz, 5168a5b494aSPablo de Lara opts->aead_aad_sz, 5178a5b494aSPablo de Lara opts->aead_iv_sz); 5188a5b494aSPablo de Lara if (ret != 0) 5198a5b494aSPablo de Lara return ret; 5208a5b494aSPablo de Lara } 521f8be1786SSlawomir Mrozowicz } 522f8be1786SSlawomir Mrozowicz 523f8be1786SSlawomir Mrozowicz return 0; 524f8be1786SSlawomir Mrozowicz } 525f8be1786SSlawomir Mrozowicz 526f8be1786SSlawomir Mrozowicz static int 5270ef3f0e0SJacek Piasecki cperf_check_test_vector(struct cperf_options *opts, 5280ef3f0e0SJacek Piasecki struct cperf_test_vector *test_vec) 529f8be1786SSlawomir Mrozowicz { 5300ef3f0e0SJacek Piasecki if (opts->op_type == CPERF_CIPHER_ONLY) { 5310ef3f0e0SJacek Piasecki if (opts->cipher_algo == RTE_CRYPTO_CIPHER_NULL) { 5320ef3f0e0SJacek Piasecki if (test_vec->plaintext.data == NULL) 533f8be1786SSlawomir Mrozowicz return -1; 534427ec3b7SFerruh Yigit } else { 5350ef3f0e0SJacek Piasecki if (test_vec->plaintext.data == NULL) 536f8be1786SSlawomir Mrozowicz return -1; 537f6cefe25SPablo de Lara if (test_vec->plaintext.length < opts->max_buffer_size) 538f8be1786SSlawomir Mrozowicz return -1; 5390ef3f0e0SJacek Piasecki if (test_vec->ciphertext.data == NULL) 540f8be1786SSlawomir Mrozowicz return -1; 541f6cefe25SPablo de Lara if (test_vec->ciphertext.length < opts->max_buffer_size) 542f8be1786SSlawomir Mrozowicz return -1; 5433c78812bSAnoob Joseph /* Cipher IV is only required for some algorithms */ 5443c78812bSAnoob Joseph if (opts->cipher_iv_sz && 5453c78812bSAnoob Joseph test_vec->cipher_iv.data == NULL) 546f8be1786SSlawomir Mrozowicz return -1; 547acf86169SPablo de Lara if (test_vec->cipher_iv.length != opts->cipher_iv_sz) 548f8be1786SSlawomir Mrozowicz return -1; 5490ef3f0e0SJacek Piasecki if (test_vec->cipher_key.data == NULL) 550f8be1786SSlawomir Mrozowicz return -1; 5510ef3f0e0SJacek Piasecki if (test_vec->cipher_key.length != opts->cipher_key_sz) 552f8be1786SSlawomir Mrozowicz return -1; 553f8be1786SSlawomir Mrozowicz } 5540ef3f0e0SJacek Piasecki } else if (opts->op_type == CPERF_AUTH_ONLY) { 5550ef3f0e0SJacek Piasecki if (opts->auth_algo != RTE_CRYPTO_AUTH_NULL) { 5560ef3f0e0SJacek Piasecki if (test_vec->plaintext.data == NULL) 557f8be1786SSlawomir Mrozowicz return -1; 558f6cefe25SPablo de Lara if (test_vec->plaintext.length < opts->max_buffer_size) 559f8be1786SSlawomir Mrozowicz return -1; 560c864167cSAnoob Joseph /* Auth key is only required for some algorithms */ 561c864167cSAnoob Joseph if (opts->auth_key_sz && 562c864167cSAnoob Joseph test_vec->auth_key.data == NULL) 563f8be1786SSlawomir Mrozowicz return -1; 5640ef3f0e0SJacek Piasecki if (test_vec->auth_key.length != opts->auth_key_sz) 565f8be1786SSlawomir Mrozowicz return -1; 566acf86169SPablo de Lara if (test_vec->auth_iv.length != opts->auth_iv_sz) 567acf86169SPablo de Lara return -1; 568acf86169SPablo de Lara /* Auth IV is only required for some algorithms */ 569acf86169SPablo de Lara if (opts->auth_iv_sz && test_vec->auth_iv.data == NULL) 570acf86169SPablo de Lara return -1; 5710ef3f0e0SJacek Piasecki if (test_vec->digest.data == NULL) 572f8be1786SSlawomir Mrozowicz return -1; 5738a5b494aSPablo de Lara if (test_vec->digest.length < opts->digest_sz) 574f8be1786SSlawomir Mrozowicz return -1; 575f8be1786SSlawomir Mrozowicz } 576f8be1786SSlawomir Mrozowicz 5770ef3f0e0SJacek Piasecki } else if (opts->op_type == CPERF_CIPHER_THEN_AUTH || 5780ef3f0e0SJacek Piasecki opts->op_type == CPERF_AUTH_THEN_CIPHER) { 5790ef3f0e0SJacek Piasecki if (opts->cipher_algo == RTE_CRYPTO_CIPHER_NULL) { 5800ef3f0e0SJacek Piasecki if (test_vec->plaintext.data == NULL) 581f8be1786SSlawomir Mrozowicz return -1; 582f6cefe25SPablo de Lara if (test_vec->plaintext.length < opts->max_buffer_size) 583f8be1786SSlawomir Mrozowicz return -1; 584427ec3b7SFerruh Yigit } else { 5850ef3f0e0SJacek Piasecki if (test_vec->plaintext.data == NULL) 586f8be1786SSlawomir Mrozowicz return -1; 587f6cefe25SPablo de Lara if (test_vec->plaintext.length < opts->max_buffer_size) 588f8be1786SSlawomir Mrozowicz return -1; 5890ef3f0e0SJacek Piasecki if (test_vec->ciphertext.data == NULL) 590f8be1786SSlawomir Mrozowicz return -1; 591f6cefe25SPablo de Lara if (test_vec->ciphertext.length < opts->max_buffer_size) 592f8be1786SSlawomir Mrozowicz return -1; 593acf86169SPablo de Lara if (test_vec->cipher_iv.data == NULL) 594f8be1786SSlawomir Mrozowicz return -1; 595acf86169SPablo de Lara if (test_vec->cipher_iv.length != opts->cipher_iv_sz) 596f8be1786SSlawomir Mrozowicz return -1; 5970ef3f0e0SJacek Piasecki if (test_vec->cipher_key.data == NULL) 598f8be1786SSlawomir Mrozowicz return -1; 5990ef3f0e0SJacek Piasecki if (test_vec->cipher_key.length != opts->cipher_key_sz) 600f8be1786SSlawomir Mrozowicz return -1; 601f8be1786SSlawomir Mrozowicz } 6020ef3f0e0SJacek Piasecki if (opts->auth_algo != RTE_CRYPTO_AUTH_NULL) { 6030ef3f0e0SJacek Piasecki if (test_vec->auth_key.data == NULL) 604f8be1786SSlawomir Mrozowicz return -1; 6050ef3f0e0SJacek Piasecki if (test_vec->auth_key.length != opts->auth_key_sz) 606f8be1786SSlawomir Mrozowicz return -1; 607acf86169SPablo de Lara if (test_vec->auth_iv.length != opts->auth_iv_sz) 608acf86169SPablo de Lara return -1; 609acf86169SPablo de Lara /* Auth IV is only required for some algorithms */ 610acf86169SPablo de Lara if (opts->auth_iv_sz && test_vec->auth_iv.data == NULL) 611acf86169SPablo de Lara return -1; 6120ef3f0e0SJacek Piasecki if (test_vec->digest.data == NULL) 613f8be1786SSlawomir Mrozowicz return -1; 6148a5b494aSPablo de Lara if (test_vec->digest.length < opts->digest_sz) 615f8be1786SSlawomir Mrozowicz return -1; 616f8be1786SSlawomir Mrozowicz } 6170ef3f0e0SJacek Piasecki } else if (opts->op_type == CPERF_AEAD) { 6180ef3f0e0SJacek Piasecki if (test_vec->plaintext.data == NULL) 619f8be1786SSlawomir Mrozowicz return -1; 620f6cefe25SPablo de Lara if (test_vec->plaintext.length < opts->max_buffer_size) 621f6cefe25SPablo de Lara return -1; 622f6cefe25SPablo de Lara if (test_vec->ciphertext.data == NULL) 623f6cefe25SPablo de Lara return -1; 624f6cefe25SPablo de Lara if (test_vec->ciphertext.length < opts->max_buffer_size) 625f8be1786SSlawomir Mrozowicz return -1; 626109924e9SAnoob Joseph if (test_vec->aead_key.data == NULL) 627109924e9SAnoob Joseph return -1; 628109924e9SAnoob Joseph if (test_vec->aead_key.length != opts->aead_key_sz) 629109924e9SAnoob Joseph return -1; 6308a5b494aSPablo de Lara if (test_vec->aead_iv.data == NULL) 631acf86169SPablo de Lara return -1; 6328a5b494aSPablo de Lara if (test_vec->aead_iv.length != opts->aead_iv_sz) 633acf86169SPablo de Lara return -1; 6340ef3f0e0SJacek Piasecki if (test_vec->aad.data == NULL) 635f8be1786SSlawomir Mrozowicz return -1; 6368a5b494aSPablo de Lara if (test_vec->aad.length != opts->aead_aad_sz) 637f8be1786SSlawomir Mrozowicz return -1; 6380ef3f0e0SJacek Piasecki if (test_vec->digest.data == NULL) 639f8be1786SSlawomir Mrozowicz return -1; 6408a5b494aSPablo de Lara if (test_vec->digest.length < opts->digest_sz) 641f8be1786SSlawomir Mrozowicz return -1; 642f8be1786SSlawomir Mrozowicz } 643f8be1786SSlawomir Mrozowicz return 0; 644f8be1786SSlawomir Mrozowicz } 645f8be1786SSlawomir Mrozowicz 646f8be1786SSlawomir Mrozowicz int 647f8be1786SSlawomir Mrozowicz main(int argc, char **argv) 648f8be1786SSlawomir Mrozowicz { 649f8be1786SSlawomir Mrozowicz struct cperf_options opts = {0}; 650f8be1786SSlawomir Mrozowicz struct cperf_test_vector *t_vec = NULL; 651f8be1786SSlawomir Mrozowicz struct cperf_op_fns op_fns; 652f8be1786SSlawomir Mrozowicz void *ctx[RTE_MAX_LCORE] = { }; 65348ae8114SAleksander Gajewski int nb_cryptodevs = 0; 65434865346SPablo de Lara uint16_t total_nb_qps = 0; 655f8be1786SSlawomir Mrozowicz uint8_t cdev_id, i; 656f8be1786SSlawomir Mrozowicz uint8_t enabled_cdevs[RTE_CRYPTO_MAX_DEVS] = { 0 }; 657f8be1786SSlawomir Mrozowicz 658f6cefe25SPablo de Lara uint8_t buffer_size_idx = 0; 659f6cefe25SPablo de Lara 660f8be1786SSlawomir Mrozowicz int ret; 661f8be1786SSlawomir Mrozowicz uint32_t lcore_id; 6623a1fffcfSAkhil Goyal bool cap_unsupported = false; 663f8be1786SSlawomir Mrozowicz 664f8be1786SSlawomir Mrozowicz /* Initialise DPDK EAL */ 665f8be1786SSlawomir Mrozowicz ret = rte_eal_init(argc, argv); 666f8be1786SSlawomir Mrozowicz if (ret < 0) 667f8be1786SSlawomir Mrozowicz rte_exit(EXIT_FAILURE, "Invalid EAL arguments!\n"); 668f8be1786SSlawomir Mrozowicz argc -= ret; 669f8be1786SSlawomir Mrozowicz argv += ret; 670f8be1786SSlawomir Mrozowicz 671f8be1786SSlawomir Mrozowicz cperf_options_default(&opts); 672f8be1786SSlawomir Mrozowicz 673f8be1786SSlawomir Mrozowicz ret = cperf_options_parse(&opts, argc, argv); 674f8be1786SSlawomir Mrozowicz if (ret) { 6757d3046edSCiara Power RTE_LOG(ERR, USER1, "Parsing one or more user options failed\n"); 676f8be1786SSlawomir Mrozowicz goto err; 677f8be1786SSlawomir Mrozowicz } 678f8be1786SSlawomir Mrozowicz 679f8be1786SSlawomir Mrozowicz ret = cperf_options_check(&opts); 680f8be1786SSlawomir Mrozowicz if (ret) { 681f8be1786SSlawomir Mrozowicz RTE_LOG(ERR, USER1, 6827d3046edSCiara Power "Checking one or more user options failed\n"); 683f8be1786SSlawomir Mrozowicz goto err; 684f8be1786SSlawomir Mrozowicz } 685f8be1786SSlawomir Mrozowicz 686d4ad392cSFan Zhang nb_cryptodevs = cperf_initialize_cryptodev(&opts, enabled_cdevs); 687c4f916e3SPablo de Lara 688f8be1786SSlawomir Mrozowicz if (!opts.silent) 689f8be1786SSlawomir Mrozowicz cperf_options_dump(&opts); 690f8be1786SSlawomir Mrozowicz 691f8be1786SSlawomir Mrozowicz if (nb_cryptodevs < 1) { 692f8be1786SSlawomir Mrozowicz RTE_LOG(ERR, USER1, "Failed to initialise requested crypto " 693f8be1786SSlawomir Mrozowicz "device type\n"); 69448ae8114SAleksander Gajewski nb_cryptodevs = 0; 695f8be1786SSlawomir Mrozowicz goto err; 696f8be1786SSlawomir Mrozowicz } 697f8be1786SSlawomir Mrozowicz 698f8be1786SSlawomir Mrozowicz ret = cperf_verify_devices_capabilities(&opts, enabled_cdevs, 699f8be1786SSlawomir Mrozowicz nb_cryptodevs); 700f8be1786SSlawomir Mrozowicz if (ret) { 701f8be1786SSlawomir Mrozowicz RTE_LOG(ERR, USER1, "Crypto device type does not support " 702f8be1786SSlawomir Mrozowicz "capabilities requested\n"); 7033a1fffcfSAkhil Goyal cap_unsupported = true; 704f8be1786SSlawomir Mrozowicz goto err; 705f8be1786SSlawomir Mrozowicz } 706f8be1786SSlawomir Mrozowicz 707f8be1786SSlawomir Mrozowicz if (opts.test_file != NULL) { 708f8be1786SSlawomir Mrozowicz t_vec = cperf_test_vector_get_from_file(&opts); 709f8be1786SSlawomir Mrozowicz if (t_vec == NULL) { 710f8be1786SSlawomir Mrozowicz RTE_LOG(ERR, USER1, 711f8be1786SSlawomir Mrozowicz "Failed to create test vector for" 712f8be1786SSlawomir Mrozowicz " specified file\n"); 713f8be1786SSlawomir Mrozowicz goto err; 714f8be1786SSlawomir Mrozowicz } 715f8be1786SSlawomir Mrozowicz 7160ef3f0e0SJacek Piasecki if (cperf_check_test_vector(&opts, t_vec)) { 717f8be1786SSlawomir Mrozowicz RTE_LOG(ERR, USER1, "Incomplete necessary test vectors" 718f8be1786SSlawomir Mrozowicz "\n"); 719f8be1786SSlawomir Mrozowicz goto err; 720f8be1786SSlawomir Mrozowicz } 721f8be1786SSlawomir Mrozowicz } else { 722f8be1786SSlawomir Mrozowicz t_vec = cperf_test_vector_get_dummy(&opts); 723f8be1786SSlawomir Mrozowicz if (t_vec == NULL) { 724f8be1786SSlawomir Mrozowicz RTE_LOG(ERR, USER1, 725f8be1786SSlawomir Mrozowicz "Failed to create test vector for" 726f8be1786SSlawomir Mrozowicz " specified algorithms\n"); 727f8be1786SSlawomir Mrozowicz goto err; 728f8be1786SSlawomir Mrozowicz } 729f8be1786SSlawomir Mrozowicz } 730f8be1786SSlawomir Mrozowicz 731f8be1786SSlawomir Mrozowicz ret = cperf_get_op_functions(&opts, &op_fns); 732f8be1786SSlawomir Mrozowicz if (ret) { 733f8be1786SSlawomir Mrozowicz RTE_LOG(ERR, USER1, "Failed to find function ops set for " 734f8be1786SSlawomir Mrozowicz "specified algorithms combination\n"); 735f8be1786SSlawomir Mrozowicz goto err; 736f8be1786SSlawomir Mrozowicz } 737f8be1786SSlawomir Mrozowicz 73816f25ee0SAdam Dybkowski if (!opts.silent && opts.test != CPERF_TEST_TYPE_THROUGHPUT && 73916f25ee0SAdam Dybkowski opts.test != CPERF_TEST_TYPE_LATENCY) 740f8be1786SSlawomir Mrozowicz show_test_vector(t_vec); 741f8be1786SSlawomir Mrozowicz 74234865346SPablo de Lara total_nb_qps = nb_cryptodevs * opts.nb_qps; 743c4f916e3SPablo de Lara 744f8be1786SSlawomir Mrozowicz i = 0; 745c4f916e3SPablo de Lara uint8_t qp_id = 0, cdev_index = 0; 74676a48d8aSJack Bond-Preston 74776a48d8aSJack Bond-Preston void *sess = NULL; 74876a48d8aSJack Bond-Preston 749cb056611SStephen Hemminger RTE_LCORE_FOREACH_WORKER(lcore_id) { 750f8be1786SSlawomir Mrozowicz 751c4f916e3SPablo de Lara if (i == total_nb_qps) 752f8be1786SSlawomir Mrozowicz break; 753f8be1786SSlawomir Mrozowicz 754c4f916e3SPablo de Lara cdev_id = enabled_cdevs[cdev_index]; 755f8be1786SSlawomir Mrozowicz 756a23b5064SCiara Power int socket_id = rte_cryptodev_socket_id(cdev_id); 757a23b5064SCiara Power 758a23b5064SCiara Power /* Use the first socket if SOCKET_ID_ANY is returned. */ 759a23b5064SCiara Power if (socket_id == SOCKET_ID_ANY) 760a23b5064SCiara Power socket_id = 0; 761b3bbd9e5SSlawomir Mrozowicz 762c4f916e3SPablo de Lara ctx[i] = cperf_testmap[opts.test].constructor( 763d4ad392cSFan Zhang session_pool_socket[socket_id].sess_mp, 764d4ad392cSFan Zhang cdev_id, qp_id, 76576a48d8aSJack Bond-Preston &opts, t_vec, &op_fns, &sess); 76676a48d8aSJack Bond-Preston 76776a48d8aSJack Bond-Preston /* 76876a48d8aSJack Bond-Preston * If sess was NULL, the constructor will have set it to a newly 76976a48d8aSJack Bond-Preston * created session. This means future calls to constructors will 77076a48d8aSJack Bond-Preston * provide this session, sharing it across all qps. If session 77176a48d8aSJack Bond-Preston * sharing is not enabled, re-set sess to NULL, to prevent this. 77276a48d8aSJack Bond-Preston */ 77376a48d8aSJack Bond-Preston if (!opts.shared_session) 77476a48d8aSJack Bond-Preston sess = NULL; 77576a48d8aSJack Bond-Preston 776c4f916e3SPablo de Lara if (ctx[i] == NULL) { 777f8be1786SSlawomir Mrozowicz RTE_LOG(ERR, USER1, "Test run constructor failed\n"); 778f8be1786SSlawomir Mrozowicz goto err; 779f8be1786SSlawomir Mrozowicz } 78076a48d8aSJack Bond-Preston 781c4f916e3SPablo de Lara qp_id = (qp_id + 1) % opts.nb_qps; 78276a48d8aSJack Bond-Preston if (qp_id == 0) { 783c4f916e3SPablo de Lara cdev_index++; 78476a48d8aSJack Bond-Preston /* If next qp is on a new cdev, don't share the session 78576a48d8aSJack Bond-Preston * - it shouldn't be shared across different cdevs. 78676a48d8aSJack Bond-Preston */ 78776a48d8aSJack Bond-Preston sess = NULL; 78876a48d8aSJack Bond-Preston } 789f8be1786SSlawomir Mrozowicz i++; 790f8be1786SSlawomir Mrozowicz } 791f8be1786SSlawomir Mrozowicz 79227c2e747SPablo de Lara if (opts.imix_distribution_count != 0) { 79327c2e747SPablo de Lara uint8_t buffer_size_count = opts.buffer_size_count; 79427c2e747SPablo de Lara uint16_t distribution_total[buffer_size_count]; 79527c2e747SPablo de Lara uint32_t op_idx; 79627c2e747SPablo de Lara uint32_t test_average_size = 0; 79727c2e747SPablo de Lara const uint32_t *buffer_size_list = opts.buffer_size_list; 79827c2e747SPablo de Lara const uint32_t *imix_distribution_list = opts.imix_distribution_list; 799f6cefe25SPablo de Lara 80027c2e747SPablo de Lara opts.imix_buffer_sizes = rte_malloc(NULL, 80127c2e747SPablo de Lara sizeof(uint32_t) * opts.pool_sz, 80227c2e747SPablo de Lara 0); 80327c2e747SPablo de Lara /* 80427c2e747SPablo de Lara * Calculate accumulated distribution of 80527c2e747SPablo de Lara * probabilities per packet size 80627c2e747SPablo de Lara */ 80727c2e747SPablo de Lara distribution_total[0] = imix_distribution_list[0]; 80827c2e747SPablo de Lara for (i = 1; i < buffer_size_count; i++) 80927c2e747SPablo de Lara distribution_total[i] = imix_distribution_list[i] + 81027c2e747SPablo de Lara distribution_total[i-1]; 81127c2e747SPablo de Lara 81227c2e747SPablo de Lara /* Calculate a random sequence of packet sizes, based on distribution */ 81327c2e747SPablo de Lara for (op_idx = 0; op_idx < opts.pool_sz; op_idx++) { 81427c2e747SPablo de Lara uint16_t random_number = rte_rand() % 81527c2e747SPablo de Lara distribution_total[buffer_size_count - 1]; 81627c2e747SPablo de Lara for (i = 0; i < buffer_size_count; i++) 81727c2e747SPablo de Lara if (random_number < distribution_total[i]) 81827c2e747SPablo de Lara break; 81927c2e747SPablo de Lara 82027c2e747SPablo de Lara opts.imix_buffer_sizes[op_idx] = buffer_size_list[i]; 82127c2e747SPablo de Lara } 82227c2e747SPablo de Lara 82327c2e747SPablo de Lara /* Calculate average buffer size for the IMIX distribution */ 82427c2e747SPablo de Lara for (i = 0; i < buffer_size_count; i++) 82527c2e747SPablo de Lara test_average_size += buffer_size_list[i] * 82627c2e747SPablo de Lara imix_distribution_list[i]; 82727c2e747SPablo de Lara 82827c2e747SPablo de Lara opts.test_buffer_size = test_average_size / 82927c2e747SPablo de Lara distribution_total[buffer_size_count - 1]; 83027c2e747SPablo de Lara 831f8be1786SSlawomir Mrozowicz i = 0; 832cb056611SStephen Hemminger RTE_LCORE_FOREACH_WORKER(lcore_id) { 833f8be1786SSlawomir Mrozowicz 834c4f916e3SPablo de Lara if (i == total_nb_qps) 835f8be1786SSlawomir Mrozowicz break; 836f8be1786SSlawomir Mrozowicz 837f8be1786SSlawomir Mrozowicz rte_eal_remote_launch(cperf_testmap[opts.test].runner, 838c4f916e3SPablo de Lara ctx[i], lcore_id); 839f8be1786SSlawomir Mrozowicz i++; 840f8be1786SSlawomir Mrozowicz } 841ce8af1a4SKirill Rybalchenko i = 0; 842cb056611SStephen Hemminger RTE_LCORE_FOREACH_WORKER(lcore_id) { 843ce8af1a4SKirill Rybalchenko 844c4f916e3SPablo de Lara if (i == total_nb_qps) 845ce8af1a4SKirill Rybalchenko break; 8465908e7e8STomasz Jozwiak ret |= rte_eal_wait_lcore(lcore_id); 847ce8af1a4SKirill Rybalchenko i++; 848ce8af1a4SKirill Rybalchenko } 8495908e7e8STomasz Jozwiak 8505908e7e8STomasz Jozwiak if (ret != EXIT_SUCCESS) 8515908e7e8STomasz Jozwiak goto err; 85227c2e747SPablo de Lara } else { 85327c2e747SPablo de Lara 85427c2e747SPablo de Lara /* Get next size from range or list */ 85527c2e747SPablo de Lara if (opts.inc_buffer_size != 0) 85627c2e747SPablo de Lara opts.test_buffer_size = opts.min_buffer_size; 85727c2e747SPablo de Lara else 85827c2e747SPablo de Lara opts.test_buffer_size = opts.buffer_size_list[0]; 85927c2e747SPablo de Lara 86027c2e747SPablo de Lara while (opts.test_buffer_size <= opts.max_buffer_size) { 86127c2e747SPablo de Lara i = 0; 862cb056611SStephen Hemminger RTE_LCORE_FOREACH_WORKER(lcore_id) { 86327c2e747SPablo de Lara 8647629b31fSFan Zhang if (i == total_nb_qps) 86527c2e747SPablo de Lara break; 86627c2e747SPablo de Lara 86727c2e747SPablo de Lara rte_eal_remote_launch(cperf_testmap[opts.test].runner, 8687629b31fSFan Zhang ctx[i], lcore_id); 86927c2e747SPablo de Lara i++; 87027c2e747SPablo de Lara } 87127c2e747SPablo de Lara i = 0; 872cb056611SStephen Hemminger RTE_LCORE_FOREACH_WORKER(lcore_id) { 87327c2e747SPablo de Lara 8747629b31fSFan Zhang if (i == total_nb_qps) 87527c2e747SPablo de Lara break; 8765908e7e8STomasz Jozwiak ret |= rte_eal_wait_lcore(lcore_id); 87727c2e747SPablo de Lara i++; 87827c2e747SPablo de Lara } 879f8be1786SSlawomir Mrozowicz 8805908e7e8STomasz Jozwiak if (ret != EXIT_SUCCESS) 8815908e7e8STomasz Jozwiak goto err; 8825908e7e8STomasz Jozwiak 883f6cefe25SPablo de Lara /* Get next size from range or list */ 884f6cefe25SPablo de Lara if (opts.inc_buffer_size != 0) 885f6cefe25SPablo de Lara opts.test_buffer_size += opts.inc_buffer_size; 886f6cefe25SPablo de Lara else { 887f6cefe25SPablo de Lara if (++buffer_size_idx == opts.buffer_size_count) 888f6cefe25SPablo de Lara break; 88927c2e747SPablo de Lara opts.test_buffer_size = 89027c2e747SPablo de Lara opts.buffer_size_list[buffer_size_idx]; 89127c2e747SPablo de Lara } 892f6cefe25SPablo de Lara } 893f6cefe25SPablo de Lara } 894f6cefe25SPablo de Lara 895f8be1786SSlawomir Mrozowicz i = 0; 896cb056611SStephen Hemminger RTE_LCORE_FOREACH_WORKER(lcore_id) { 897f8be1786SSlawomir Mrozowicz 898c4f916e3SPablo de Lara if (i == total_nb_qps) 899f8be1786SSlawomir Mrozowicz break; 900f8be1786SSlawomir Mrozowicz 901c4f916e3SPablo de Lara cperf_testmap[opts.test].destructor(ctx[i]); 902f8be1786SSlawomir Mrozowicz i++; 903f8be1786SSlawomir Mrozowicz } 904f8be1786SSlawomir Mrozowicz 905c4f916e3SPablo de Lara for (i = 0; i < nb_cryptodevs && 906abc64f10SAdam Dybkowski i < RTE_CRYPTO_MAX_DEVS; i++) { 907c4f916e3SPablo de Lara rte_cryptodev_stop(enabled_cdevs[i]); 908abc64f10SAdam Dybkowski ret = rte_cryptodev_close(enabled_cdevs[i]); 909abc64f10SAdam Dybkowski if (ret) 910abc64f10SAdam Dybkowski RTE_LOG(ERR, USER1, 911abc64f10SAdam Dybkowski "Crypto device close error %d\n", ret); 912abc64f10SAdam Dybkowski } 913c4f916e3SPablo de Lara 914f8be1786SSlawomir Mrozowicz free_test_vector(t_vec, &opts); 915f8be1786SSlawomir Mrozowicz 916f8be1786SSlawomir Mrozowicz printf("\n"); 917f8be1786SSlawomir Mrozowicz return EXIT_SUCCESS; 918f8be1786SSlawomir Mrozowicz 919f8be1786SSlawomir Mrozowicz err: 920f8be1786SSlawomir Mrozowicz i = 0; 921cb056611SStephen Hemminger RTE_LCORE_FOREACH_WORKER(lcore_id) { 922c4f916e3SPablo de Lara if (i == total_nb_qps) 923f8be1786SSlawomir Mrozowicz break; 924f8be1786SSlawomir Mrozowicz 925c4f916e3SPablo de Lara if (ctx[i] && cperf_testmap[opts.test].destructor) 926c4f916e3SPablo de Lara cperf_testmap[opts.test].destructor(ctx[i]); 927f8be1786SSlawomir Mrozowicz i++; 928f8be1786SSlawomir Mrozowicz } 929f8be1786SSlawomir Mrozowicz 930c4f916e3SPablo de Lara for (i = 0; i < nb_cryptodevs && 931abc64f10SAdam Dybkowski i < RTE_CRYPTO_MAX_DEVS; i++) { 932c4f916e3SPablo de Lara rte_cryptodev_stop(enabled_cdevs[i]); 933abc64f10SAdam Dybkowski ret = rte_cryptodev_close(enabled_cdevs[i]); 934abc64f10SAdam Dybkowski if (ret) 935abc64f10SAdam Dybkowski RTE_LOG(ERR, USER1, 936abc64f10SAdam Dybkowski "Crypto device close error %d\n", ret); 937abc64f10SAdam Dybkowski 938abc64f10SAdam Dybkowski } 93927c2e747SPablo de Lara rte_free(opts.imix_buffer_sizes); 940f8be1786SSlawomir Mrozowicz free_test_vector(t_vec, &opts); 941f8be1786SSlawomir Mrozowicz 9423a1fffcfSAkhil Goyal if (rte_errno == ENOTSUP || cap_unsupported) { 9433a1fffcfSAkhil Goyal RTE_LOG(ERR, USER1, "Unsupported case: errno: %u\n", rte_errno); 9443a1fffcfSAkhil Goyal return -ENOTSUP; 9453a1fffcfSAkhil Goyal } 946f8be1786SSlawomir Mrozowicz printf("\n"); 947f8be1786SSlawomir Mrozowicz return EXIT_FAILURE; 948f8be1786SSlawomir Mrozowicz } 949