13998e2a0SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 23998e2a0SBruce Richardson * Copyright(c) 2015-2016 Intel Corporation 3387259bdSDeclan Doherty */ 4387259bdSDeclan Doherty 5387259bdSDeclan Doherty #include <time.h> 6387259bdSDeclan Doherty #include <stdio.h> 7387259bdSDeclan Doherty #include <stdlib.h> 8387259bdSDeclan Doherty #include <string.h> 9387259bdSDeclan Doherty #include <stdint.h> 10387259bdSDeclan Doherty #include <inttypes.h> 11387259bdSDeclan Doherty #include <sys/types.h> 12387259bdSDeclan Doherty #include <sys/queue.h> 13387259bdSDeclan Doherty #include <netinet/in.h> 14387259bdSDeclan Doherty #include <setjmp.h> 15387259bdSDeclan Doherty #include <stdarg.h> 16387259bdSDeclan Doherty #include <ctype.h> 17387259bdSDeclan Doherty #include <errno.h> 18387259bdSDeclan Doherty #include <getopt.h> 196dad6e69SPiotr Azarewicz #include <fcntl.h> 206dad6e69SPiotr Azarewicz #include <unistd.h> 21387259bdSDeclan Doherty 22387259bdSDeclan Doherty #include <rte_atomic.h> 23387259bdSDeclan Doherty #include <rte_branch_prediction.h> 24387259bdSDeclan Doherty #include <rte_common.h> 25387259bdSDeclan Doherty #include <rte_cryptodev.h> 26387259bdSDeclan Doherty #include <rte_cycles.h> 27387259bdSDeclan Doherty #include <rte_debug.h> 28387259bdSDeclan Doherty #include <rte_eal.h> 29387259bdSDeclan Doherty #include <rte_ether.h> 30387259bdSDeclan Doherty #include <rte_ethdev.h> 31387259bdSDeclan Doherty #include <rte_interrupts.h> 32387259bdSDeclan Doherty #include <rte_ip.h> 33387259bdSDeclan Doherty #include <rte_launch.h> 34387259bdSDeclan Doherty #include <rte_lcore.h> 35387259bdSDeclan Doherty #include <rte_log.h> 36387259bdSDeclan Doherty #include <rte_malloc.h> 37387259bdSDeclan Doherty #include <rte_mbuf.h> 38387259bdSDeclan Doherty #include <rte_memcpy.h> 39387259bdSDeclan Doherty #include <rte_memory.h> 40387259bdSDeclan Doherty #include <rte_mempool.h> 41387259bdSDeclan Doherty #include <rte_per_lcore.h> 42387259bdSDeclan Doherty #include <rte_prefetch.h> 43387259bdSDeclan Doherty #include <rte_random.h> 4441e97c2eSPablo de Lara #include <rte_hexdump.h> 45387259bdSDeclan Doherty 4627cf2d1bSPablo de Lara enum cdev_type { 4727cf2d1bSPablo de Lara CDEV_TYPE_ANY, 4827cf2d1bSPablo de Lara CDEV_TYPE_HW, 4927cf2d1bSPablo de Lara CDEV_TYPE_SW 5027cf2d1bSPablo de Lara }; 5127cf2d1bSPablo de Lara 52387259bdSDeclan Doherty #define RTE_LOGTYPE_L2FWD RTE_LOGTYPE_USER1 53387259bdSDeclan Doherty 54387259bdSDeclan Doherty #define NB_MBUF 8192 55387259bdSDeclan Doherty 5627cf2d1bSPablo de Lara #define MAX_STR_LEN 32 571df9c010SPablo de Lara #define MAX_KEY_SIZE 128 58ff5d5b01SPablo de Lara #define MAX_IV_SIZE 16 59ff5d5b01SPablo de Lara #define MAX_AAD_SIZE 65535 60387259bdSDeclan Doherty #define MAX_PKT_BURST 32 61387259bdSDeclan Doherty #define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */ 622c59bd32SSlawomir Mrozowicz #define MAX_SESSIONS 32 632c59bd32SSlawomir Mrozowicz #define SESSION_POOL_CACHE_SIZE 0 64387259bdSDeclan Doherty 65e636243eSPablo de Lara #define MAXIMUM_IV_LENGTH 16 66e636243eSPablo de Lara #define IV_OFFSET (sizeof(struct rte_crypto_op) + \ 67e636243eSPablo de Lara sizeof(struct rte_crypto_sym_op)) 68e636243eSPablo de Lara 69387259bdSDeclan Doherty /* 70387259bdSDeclan Doherty * Configurable number of RX/TX ring descriptors 71387259bdSDeclan Doherty */ 72867a6c66SKevin Laatz #define RTE_TEST_RX_DESC_DEFAULT 1024 73867a6c66SKevin Laatz #define RTE_TEST_TX_DESC_DEFAULT 1024 743c96262cSPablo de Lara 75387259bdSDeclan Doherty static uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT; 76387259bdSDeclan Doherty static uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT; 77387259bdSDeclan Doherty 78387259bdSDeclan Doherty /* ethernet addresses of ports */ 79387259bdSDeclan Doherty static struct ether_addr l2fwd_ports_eth_addr[RTE_MAX_ETHPORTS]; 80387259bdSDeclan Doherty 81387259bdSDeclan Doherty /* mask of enabled ports */ 82387259bdSDeclan Doherty static uint64_t l2fwd_enabled_port_mask; 83387259bdSDeclan Doherty static uint64_t l2fwd_enabled_crypto_mask; 84387259bdSDeclan Doherty 85387259bdSDeclan Doherty /* list of enabled ports */ 86e2cdfbd0SZhiyong Yang static uint16_t l2fwd_dst_ports[RTE_MAX_ETHPORTS]; 87387259bdSDeclan Doherty 88387259bdSDeclan Doherty 89387259bdSDeclan Doherty struct pkt_buffer { 90387259bdSDeclan Doherty unsigned len; 91387259bdSDeclan Doherty struct rte_mbuf *buffer[MAX_PKT_BURST]; 92387259bdSDeclan Doherty }; 93387259bdSDeclan Doherty 94c0f87eb5SDeclan Doherty struct op_buffer { 95c0f87eb5SDeclan Doherty unsigned len; 96c0f87eb5SDeclan Doherty struct rte_crypto_op *buffer[MAX_PKT_BURST]; 97c0f87eb5SDeclan Doherty }; 98c0f87eb5SDeclan Doherty 99387259bdSDeclan Doherty #define MAX_RX_QUEUE_PER_LCORE 16 100387259bdSDeclan Doherty #define MAX_TX_QUEUE_PER_PORT 16 101387259bdSDeclan Doherty 102387259bdSDeclan Doherty enum l2fwd_crypto_xform_chain { 103387259bdSDeclan Doherty L2FWD_CRYPTO_CIPHER_HASH, 1041a75e9f3SPablo de Lara L2FWD_CRYPTO_HASH_CIPHER, 1051a75e9f3SPablo de Lara L2FWD_CRYPTO_CIPHER_ONLY, 1062661f4fbSPablo de Lara L2FWD_CRYPTO_HASH_ONLY, 1072661f4fbSPablo de Lara L2FWD_CRYPTO_AEAD 108387259bdSDeclan Doherty }; 109387259bdSDeclan Doherty 110a7f4562bSFiona Trahe struct l2fwd_key { 111a7f4562bSFiona Trahe uint8_t *data; 112a7f4562bSFiona Trahe uint32_t length; 113c4509373SSantosh Shukla rte_iova_t phys_addr; 114a7f4562bSFiona Trahe }; 115a7f4562bSFiona Trahe 1160fbd75a9SPablo de Lara struct l2fwd_iv { 1170fbd75a9SPablo de Lara uint8_t *data; 1180fbd75a9SPablo de Lara uint16_t length; 1190fbd75a9SPablo de Lara }; 1200fbd75a9SPablo de Lara 121387259bdSDeclan Doherty /** l2fwd crypto application command line options */ 122387259bdSDeclan Doherty struct l2fwd_crypto_options { 123387259bdSDeclan Doherty unsigned portmask; 124387259bdSDeclan Doherty unsigned nb_ports_per_lcore; 125387259bdSDeclan Doherty unsigned refresh_period; 126387259bdSDeclan Doherty unsigned single_lcore:1; 127387259bdSDeclan Doherty 12827cf2d1bSPablo de Lara enum cdev_type type; 129387259bdSDeclan Doherty unsigned sessionless:1; 130387259bdSDeclan Doherty 131387259bdSDeclan Doherty enum l2fwd_crypto_xform_chain xform_chain; 132387259bdSDeclan Doherty 1331bd407faSFiona Trahe struct rte_crypto_sym_xform cipher_xform; 1341df9c010SPablo de Lara unsigned ckey_param; 135a061e50aSPablo de Lara int ckey_random_size; 136387259bdSDeclan Doherty 137acf86169SPablo de Lara struct l2fwd_iv cipher_iv; 138acf86169SPablo de Lara unsigned int cipher_iv_param; 139acf86169SPablo de Lara int cipher_iv_random_size; 140387259bdSDeclan Doherty 1411bd407faSFiona Trahe struct rte_crypto_sym_xform auth_xform; 1421df9c010SPablo de Lara uint8_t akey_param; 143a061e50aSPablo de Lara int akey_random_size; 144617a7949SPablo de Lara 145acf86169SPablo de Lara struct l2fwd_iv auth_iv; 146acf86169SPablo de Lara unsigned int auth_iv_param; 147acf86169SPablo de Lara int auth_iv_random_size; 148acf86169SPablo de Lara 1492661f4fbSPablo de Lara struct rte_crypto_sym_xform aead_xform; 1502661f4fbSPablo de Lara unsigned int aead_key_param; 1512661f4fbSPablo de Lara int aead_key_random_size; 1522661f4fbSPablo de Lara 1532661f4fbSPablo de Lara struct l2fwd_iv aead_iv; 1542661f4fbSPablo de Lara unsigned int aead_iv_param; 1552661f4fbSPablo de Lara int aead_iv_random_size; 1562661f4fbSPablo de Lara 157617a7949SPablo de Lara struct l2fwd_key aad; 158617a7949SPablo de Lara unsigned aad_param; 159a061e50aSPablo de Lara int aad_random_size; 160a061e50aSPablo de Lara 161a061e50aSPablo de Lara int digest_size; 16227cf2d1bSPablo de Lara 16327cf2d1bSPablo de Lara uint16_t block_size; 16427cf2d1bSPablo de Lara char string_type[MAX_STR_LEN]; 165d2797f51SFan Zhang 166d2797f51SFan Zhang uint64_t cryptodev_mask; 167acdfecbaSKuba Kozak 168acdfecbaSKuba Kozak unsigned int mac_updating; 169387259bdSDeclan Doherty }; 170387259bdSDeclan Doherty 171387259bdSDeclan Doherty /** l2fwd crypto lcore params */ 172387259bdSDeclan Doherty struct l2fwd_crypto_params { 173387259bdSDeclan Doherty uint8_t dev_id; 174387259bdSDeclan Doherty uint8_t qp_id; 175387259bdSDeclan Doherty 176387259bdSDeclan Doherty unsigned digest_length; 177387259bdSDeclan Doherty unsigned block_size; 17827cf2d1bSPablo de Lara 179acf86169SPablo de Lara struct l2fwd_iv cipher_iv; 180acf86169SPablo de Lara struct l2fwd_iv auth_iv; 1812661f4fbSPablo de Lara struct l2fwd_iv aead_iv; 182617a7949SPablo de Lara struct l2fwd_key aad; 1831bd407faSFiona Trahe struct rte_cryptodev_sym_session *session; 1841a75e9f3SPablo de Lara 1851a75e9f3SPablo de Lara uint8_t do_cipher; 1861a75e9f3SPablo de Lara uint8_t do_hash; 1872661f4fbSPablo de Lara uint8_t do_aead; 18827cf2d1bSPablo de Lara uint8_t hash_verify; 189d29ea843SPablo de Lara 190d29ea843SPablo de Lara enum rte_crypto_cipher_algorithm cipher_algo; 191d29ea843SPablo de Lara enum rte_crypto_auth_algorithm auth_algo; 1922661f4fbSPablo de Lara enum rte_crypto_aead_algorithm aead_algo; 193387259bdSDeclan Doherty }; 194387259bdSDeclan Doherty 195387259bdSDeclan Doherty /** lcore configuration */ 196387259bdSDeclan Doherty struct lcore_queue_conf { 197387259bdSDeclan Doherty unsigned nb_rx_ports; 198e2cdfbd0SZhiyong Yang uint16_t rx_port_list[MAX_RX_QUEUE_PER_LCORE]; 199387259bdSDeclan Doherty 200387259bdSDeclan Doherty unsigned nb_crypto_devs; 201387259bdSDeclan Doherty unsigned cryptodev_list[MAX_RX_QUEUE_PER_LCORE]; 202387259bdSDeclan Doherty 203ad476dd3SPablo de Lara struct op_buffer op_buf[RTE_CRYPTO_MAX_DEVS]; 204c0f87eb5SDeclan Doherty struct pkt_buffer pkt_buf[RTE_MAX_ETHPORTS]; 205387259bdSDeclan Doherty } __rte_cache_aligned; 206387259bdSDeclan Doherty 207387259bdSDeclan Doherty struct lcore_queue_conf lcore_queue_conf[RTE_MAX_LCORE]; 208387259bdSDeclan Doherty 209f2b713e3SShahaf Shuler static struct rte_eth_conf port_conf = { 210387259bdSDeclan Doherty .rxmode = { 2111df9c010SPablo de Lara .mq_mode = ETH_MQ_RX_NONE, 2121df9c010SPablo de Lara .max_rx_pkt_len = ETHER_MAX_LEN, 213387259bdSDeclan Doherty .split_hdr_size = 0, 214f2b713e3SShahaf Shuler .ignore_offload_bitfield = 1, 215f2b713e3SShahaf Shuler .offloads = DEV_RX_OFFLOAD_CRC_STRIP, 216387259bdSDeclan Doherty }, 217387259bdSDeclan Doherty .txmode = { 218387259bdSDeclan Doherty .mq_mode = ETH_MQ_TX_NONE, 219387259bdSDeclan Doherty }, 220387259bdSDeclan Doherty }; 221387259bdSDeclan Doherty 222387259bdSDeclan Doherty struct rte_mempool *l2fwd_pktmbuf_pool; 223c0f87eb5SDeclan Doherty struct rte_mempool *l2fwd_crypto_op_pool; 2242c59bd32SSlawomir Mrozowicz struct rte_mempool *session_pool_socket[RTE_MAX_NUMA_NODES] = { 0 }; 225387259bdSDeclan Doherty 226387259bdSDeclan Doherty /* Per-port statistics struct */ 227387259bdSDeclan Doherty struct l2fwd_port_statistics { 228387259bdSDeclan Doherty uint64_t tx; 229387259bdSDeclan Doherty uint64_t rx; 230387259bdSDeclan Doherty 231387259bdSDeclan Doherty uint64_t crypto_enqueued; 232387259bdSDeclan Doherty uint64_t crypto_dequeued; 233387259bdSDeclan Doherty 234387259bdSDeclan Doherty uint64_t dropped; 235387259bdSDeclan Doherty } __rte_cache_aligned; 236387259bdSDeclan Doherty 237387259bdSDeclan Doherty struct l2fwd_crypto_statistics { 238387259bdSDeclan Doherty uint64_t enqueued; 239387259bdSDeclan Doherty uint64_t dequeued; 240387259bdSDeclan Doherty 241387259bdSDeclan Doherty uint64_t errors; 242387259bdSDeclan Doherty } __rte_cache_aligned; 243387259bdSDeclan Doherty 244387259bdSDeclan Doherty struct l2fwd_port_statistics port_statistics[RTE_MAX_ETHPORTS]; 245572f0779SSlawomir Mrozowicz struct l2fwd_crypto_statistics crypto_statistics[RTE_CRYPTO_MAX_DEVS]; 246387259bdSDeclan Doherty 247387259bdSDeclan Doherty /* A tsc-based timer responsible for triggering statistics printout */ 248387259bdSDeclan Doherty #define TIMER_MILLISECOND 2000000ULL /* around 1ms at 2 Ghz */ 2493c96262cSPablo de Lara #define MAX_TIMER_PERIOD 86400UL /* 1 day max */ 250387259bdSDeclan Doherty 251387259bdSDeclan Doherty /* default period is 10 seconds */ 252387259bdSDeclan Doherty static int64_t timer_period = 10 * TIMER_MILLISECOND * 1000; 253387259bdSDeclan Doherty 254387259bdSDeclan Doherty /* Print out statistics on packets dropped */ 255387259bdSDeclan Doherty static void 256387259bdSDeclan Doherty print_stats(void) 257387259bdSDeclan Doherty { 25828523d9aSPablo de Lara uint64_t total_packets_dropped, total_packets_tx, total_packets_rx; 25928523d9aSPablo de Lara uint64_t total_packets_enqueued, total_packets_dequeued, 26028523d9aSPablo de Lara total_packets_errors; 261e2cdfbd0SZhiyong Yang uint16_t portid; 262387259bdSDeclan Doherty uint64_t cdevid; 263387259bdSDeclan Doherty 26428523d9aSPablo de Lara total_packets_dropped = 0; 26528523d9aSPablo de Lara total_packets_tx = 0; 26628523d9aSPablo de Lara total_packets_rx = 0; 26728523d9aSPablo de Lara total_packets_enqueued = 0; 26828523d9aSPablo de Lara total_packets_dequeued = 0; 26928523d9aSPablo de Lara total_packets_errors = 0; 270387259bdSDeclan Doherty 271387259bdSDeclan Doherty const char clr[] = { 27, '[', '2', 'J', '\0' }; 272387259bdSDeclan Doherty const char topLeft[] = { 27, '[', '1', ';', '1', 'H', '\0' }; 273387259bdSDeclan Doherty 274387259bdSDeclan Doherty /* Clear screen and move to top left */ 275387259bdSDeclan Doherty printf("%s%s", clr, topLeft); 276387259bdSDeclan Doherty 277387259bdSDeclan Doherty printf("\nPort statistics ===================================="); 278387259bdSDeclan Doherty 279387259bdSDeclan Doherty for (portid = 0; portid < RTE_MAX_ETHPORTS; portid++) { 280387259bdSDeclan Doherty /* skip disabled ports */ 281387259bdSDeclan Doherty if ((l2fwd_enabled_port_mask & (1 << portid)) == 0) 282387259bdSDeclan Doherty continue; 283387259bdSDeclan Doherty printf("\nStatistics for port %u ------------------------------" 284387259bdSDeclan Doherty "\nPackets sent: %32"PRIu64 285387259bdSDeclan Doherty "\nPackets received: %28"PRIu64 286387259bdSDeclan Doherty "\nPackets dropped: %29"PRIu64, 287387259bdSDeclan Doherty portid, 288387259bdSDeclan Doherty port_statistics[portid].tx, 289387259bdSDeclan Doherty port_statistics[portid].rx, 290387259bdSDeclan Doherty port_statistics[portid].dropped); 291387259bdSDeclan Doherty 292387259bdSDeclan Doherty total_packets_dropped += port_statistics[portid].dropped; 293387259bdSDeclan Doherty total_packets_tx += port_statistics[portid].tx; 294387259bdSDeclan Doherty total_packets_rx += port_statistics[portid].rx; 295387259bdSDeclan Doherty } 296387259bdSDeclan Doherty printf("\nCrypto statistics =================================="); 297387259bdSDeclan Doherty 298387259bdSDeclan Doherty for (cdevid = 0; cdevid < RTE_CRYPTO_MAX_DEVS; cdevid++) { 299387259bdSDeclan Doherty /* skip disabled ports */ 300ad476dd3SPablo de Lara if ((l2fwd_enabled_crypto_mask & (((uint64_t)1) << cdevid)) == 0) 301387259bdSDeclan Doherty continue; 302387259bdSDeclan Doherty printf("\nStatistics for cryptodev %"PRIu64 303387259bdSDeclan Doherty " -------------------------" 304387259bdSDeclan Doherty "\nPackets enqueued: %28"PRIu64 305387259bdSDeclan Doherty "\nPackets dequeued: %28"PRIu64 306387259bdSDeclan Doherty "\nPackets errors: %30"PRIu64, 307387259bdSDeclan Doherty cdevid, 308387259bdSDeclan Doherty crypto_statistics[cdevid].enqueued, 309387259bdSDeclan Doherty crypto_statistics[cdevid].dequeued, 310387259bdSDeclan Doherty crypto_statistics[cdevid].errors); 311387259bdSDeclan Doherty 312387259bdSDeclan Doherty total_packets_enqueued += crypto_statistics[cdevid].enqueued; 313387259bdSDeclan Doherty total_packets_dequeued += crypto_statistics[cdevid].dequeued; 314387259bdSDeclan Doherty total_packets_errors += crypto_statistics[cdevid].errors; 315387259bdSDeclan Doherty } 316387259bdSDeclan Doherty printf("\nAggregate statistics ===============================" 317387259bdSDeclan Doherty "\nTotal packets received: %22"PRIu64 318387259bdSDeclan Doherty "\nTotal packets enqueued: %22"PRIu64 319387259bdSDeclan Doherty "\nTotal packets dequeued: %22"PRIu64 320387259bdSDeclan Doherty "\nTotal packets sent: %26"PRIu64 321387259bdSDeclan Doherty "\nTotal packets dropped: %23"PRIu64 322387259bdSDeclan Doherty "\nTotal packets crypto errors: %17"PRIu64, 323387259bdSDeclan Doherty total_packets_rx, 324387259bdSDeclan Doherty total_packets_enqueued, 325387259bdSDeclan Doherty total_packets_dequeued, 326387259bdSDeclan Doherty total_packets_tx, 327387259bdSDeclan Doherty total_packets_dropped, 328387259bdSDeclan Doherty total_packets_errors); 329387259bdSDeclan Doherty printf("\n====================================================\n"); 330387259bdSDeclan Doherty } 331387259bdSDeclan Doherty 332387259bdSDeclan Doherty static int 333387259bdSDeclan Doherty l2fwd_crypto_send_burst(struct lcore_queue_conf *qconf, unsigned n, 334387259bdSDeclan Doherty struct l2fwd_crypto_params *cparams) 335387259bdSDeclan Doherty { 336c0f87eb5SDeclan Doherty struct rte_crypto_op **op_buffer; 337387259bdSDeclan Doherty unsigned ret; 338387259bdSDeclan Doherty 339c0f87eb5SDeclan Doherty op_buffer = (struct rte_crypto_op **) 340c0f87eb5SDeclan Doherty qconf->op_buf[cparams->dev_id].buffer; 341387259bdSDeclan Doherty 342c0f87eb5SDeclan Doherty ret = rte_cryptodev_enqueue_burst(cparams->dev_id, 343c0f87eb5SDeclan Doherty cparams->qp_id, op_buffer, (uint16_t) n); 344c0f87eb5SDeclan Doherty 345387259bdSDeclan Doherty crypto_statistics[cparams->dev_id].enqueued += ret; 346387259bdSDeclan Doherty if (unlikely(ret < n)) { 347387259bdSDeclan Doherty crypto_statistics[cparams->dev_id].errors += (n - ret); 348387259bdSDeclan Doherty do { 349c0f87eb5SDeclan Doherty rte_pktmbuf_free(op_buffer[ret]->sym->m_src); 350c0f87eb5SDeclan Doherty rte_crypto_op_free(op_buffer[ret]); 351387259bdSDeclan Doherty } while (++ret < n); 352387259bdSDeclan Doherty } 353387259bdSDeclan Doherty 354387259bdSDeclan Doherty return 0; 355387259bdSDeclan Doherty } 356387259bdSDeclan Doherty 357387259bdSDeclan Doherty static int 358c0f87eb5SDeclan Doherty l2fwd_crypto_enqueue(struct rte_crypto_op *op, 359c0f87eb5SDeclan Doherty struct l2fwd_crypto_params *cparams) 360387259bdSDeclan Doherty { 361387259bdSDeclan Doherty unsigned lcore_id, len; 362387259bdSDeclan Doherty struct lcore_queue_conf *qconf; 363387259bdSDeclan Doherty 364387259bdSDeclan Doherty lcore_id = rte_lcore_id(); 365387259bdSDeclan Doherty 366387259bdSDeclan Doherty qconf = &lcore_queue_conf[lcore_id]; 367c0f87eb5SDeclan Doherty len = qconf->op_buf[cparams->dev_id].len; 368c0f87eb5SDeclan Doherty qconf->op_buf[cparams->dev_id].buffer[len] = op; 369387259bdSDeclan Doherty len++; 370387259bdSDeclan Doherty 371c0f87eb5SDeclan Doherty /* enough ops to be sent */ 372387259bdSDeclan Doherty if (len == MAX_PKT_BURST) { 373387259bdSDeclan Doherty l2fwd_crypto_send_burst(qconf, MAX_PKT_BURST, cparams); 374387259bdSDeclan Doherty len = 0; 375387259bdSDeclan Doherty } 376387259bdSDeclan Doherty 377c0f87eb5SDeclan Doherty qconf->op_buf[cparams->dev_id].len = len; 378387259bdSDeclan Doherty return 0; 379387259bdSDeclan Doherty } 380387259bdSDeclan Doherty 381387259bdSDeclan Doherty static int 382387259bdSDeclan Doherty l2fwd_simple_crypto_enqueue(struct rte_mbuf *m, 383c0f87eb5SDeclan Doherty struct rte_crypto_op *op, 384387259bdSDeclan Doherty struct l2fwd_crypto_params *cparams) 385387259bdSDeclan Doherty { 386387259bdSDeclan Doherty struct ether_hdr *eth_hdr; 387387259bdSDeclan Doherty struct ipv4_hdr *ip_hdr; 388387259bdSDeclan Doherty 3895839fd20SPablo de Lara uint32_t ipdata_offset, data_len; 3905839fd20SPablo de Lara uint32_t pad_len = 0; 391387259bdSDeclan Doherty char *padding; 392387259bdSDeclan Doherty 393387259bdSDeclan Doherty eth_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *); 394387259bdSDeclan Doherty 395387259bdSDeclan Doherty if (eth_hdr->ether_type != rte_cpu_to_be_16(ETHER_TYPE_IPv4)) 396387259bdSDeclan Doherty return -1; 397387259bdSDeclan Doherty 398387259bdSDeclan Doherty ipdata_offset = sizeof(struct ether_hdr); 399387259bdSDeclan Doherty 400387259bdSDeclan Doherty ip_hdr = (struct ipv4_hdr *)(rte_pktmbuf_mtod(m, char *) + 401387259bdSDeclan Doherty ipdata_offset); 402387259bdSDeclan Doherty 403387259bdSDeclan Doherty ipdata_offset += (ip_hdr->version_ihl & IPV4_HDR_IHL_MASK) 404387259bdSDeclan Doherty * IPV4_IHL_MULTIPLIER; 405387259bdSDeclan Doherty 406387259bdSDeclan Doherty 407387259bdSDeclan Doherty /* Zero pad data to be crypto'd so it is block aligned */ 408387259bdSDeclan Doherty data_len = rte_pktmbuf_data_len(m) - ipdata_offset; 409893fbab0SPiotr Azarewicz 410893fbab0SPiotr Azarewicz if (cparams->do_hash && cparams->hash_verify) 411893fbab0SPiotr Azarewicz data_len -= cparams->digest_length; 412893fbab0SPiotr Azarewicz 4135839fd20SPablo de Lara if (cparams->do_cipher) { 4145839fd20SPablo de Lara /* 4155839fd20SPablo de Lara * Following algorithms are block cipher algorithms, 4165839fd20SPablo de Lara * and might need padding 4175839fd20SPablo de Lara */ 4185839fd20SPablo de Lara switch (cparams->cipher_algo) { 4195839fd20SPablo de Lara case RTE_CRYPTO_CIPHER_AES_CBC: 4205839fd20SPablo de Lara case RTE_CRYPTO_CIPHER_AES_ECB: 4215839fd20SPablo de Lara case RTE_CRYPTO_CIPHER_DES_CBC: 4225839fd20SPablo de Lara case RTE_CRYPTO_CIPHER_3DES_CBC: 4235839fd20SPablo de Lara case RTE_CRYPTO_CIPHER_3DES_ECB: 4245839fd20SPablo de Lara if (data_len % cparams->block_size) 4255839fd20SPablo de Lara pad_len = cparams->block_size - 4265839fd20SPablo de Lara (data_len % cparams->block_size); 4275839fd20SPablo de Lara break; 4285839fd20SPablo de Lara default: 4295839fd20SPablo de Lara pad_len = 0; 4305839fd20SPablo de Lara } 431387259bdSDeclan Doherty 432387259bdSDeclan Doherty if (pad_len) { 433387259bdSDeclan Doherty padding = rte_pktmbuf_append(m, pad_len); 434387259bdSDeclan Doherty if (unlikely(!padding)) 435387259bdSDeclan Doherty return -1; 436387259bdSDeclan Doherty 437387259bdSDeclan Doherty data_len += pad_len; 438387259bdSDeclan Doherty memset(padding, 0, pad_len); 439387259bdSDeclan Doherty } 4405839fd20SPablo de Lara } 441387259bdSDeclan Doherty 442387259bdSDeclan Doherty /* Set crypto operation data parameters */ 443c0f87eb5SDeclan Doherty rte_crypto_op_attach_sym_session(op, cparams->session); 444387259bdSDeclan Doherty 4451a75e9f3SPablo de Lara if (cparams->do_hash) { 446acf86169SPablo de Lara if (cparams->auth_iv.length) { 447acf86169SPablo de Lara uint8_t *iv_ptr = rte_crypto_op_ctod_offset(op, 448acf86169SPablo de Lara uint8_t *, 449acf86169SPablo de Lara IV_OFFSET + 450acf86169SPablo de Lara cparams->cipher_iv.length); 451acf86169SPablo de Lara /* 452acf86169SPablo de Lara * Copy IV at the end of the crypto operation, 453acf86169SPablo de Lara * after the cipher IV, if added 454acf86169SPablo de Lara */ 455acf86169SPablo de Lara rte_memcpy(iv_ptr, cparams->auth_iv.data, 456acf86169SPablo de Lara cparams->auth_iv.length); 457acf86169SPablo de Lara } 45827cf2d1bSPablo de Lara if (!cparams->hash_verify) { 459387259bdSDeclan Doherty /* Append space for digest to end of packet */ 460c0f87eb5SDeclan Doherty op->sym->auth.digest.data = (uint8_t *)rte_pktmbuf_append(m, 461387259bdSDeclan Doherty cparams->digest_length); 46227cf2d1bSPablo de Lara } else { 463893fbab0SPiotr Azarewicz op->sym->auth.digest.data = rte_pktmbuf_mtod(m, 464893fbab0SPiotr Azarewicz uint8_t *) + ipdata_offset + data_len; 46527cf2d1bSPablo de Lara } 46627cf2d1bSPablo de Lara 467bfa9a8a4SThomas Monjalon op->sym->auth.digest.phys_addr = rte_pktmbuf_iova_offset(m, 468387259bdSDeclan Doherty rte_pktmbuf_pkt_len(m) - cparams->digest_length); 469387259bdSDeclan Doherty 4701f393d82SPablo de Lara /* For wireless algorithms, offset/length must be in bits */ 4712773c86dSPablo de Lara if (cparams->auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 4721f393d82SPablo de Lara cparams->auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 4731f393d82SPablo de Lara cparams->auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 474d29ea843SPablo de Lara op->sym->auth.data.offset = ipdata_offset << 3; 475d29ea843SPablo de Lara op->sym->auth.data.length = data_len << 3; 476d29ea843SPablo de Lara } else { 477c0f87eb5SDeclan Doherty op->sym->auth.data.offset = ipdata_offset; 478c0f87eb5SDeclan Doherty op->sym->auth.data.length = data_len; 479d29ea843SPablo de Lara } 4801a75e9f3SPablo de Lara } 4811a75e9f3SPablo de Lara 4821a75e9f3SPablo de Lara if (cparams->do_cipher) { 483e636243eSPablo de Lara uint8_t *iv_ptr = rte_crypto_op_ctod_offset(op, uint8_t *, 484e636243eSPablo de Lara IV_OFFSET); 485e636243eSPablo de Lara /* Copy IV at the end of the crypto operation */ 486acf86169SPablo de Lara rte_memcpy(iv_ptr, cparams->cipher_iv.data, 487acf86169SPablo de Lara cparams->cipher_iv.length); 488e636243eSPablo de Lara 4891f393d82SPablo de Lara /* For wireless algorithms, offset/length must be in bits */ 4902773c86dSPablo de Lara if (cparams->cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 4911f393d82SPablo de Lara cparams->cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 4921f393d82SPablo de Lara cparams->cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 493d29ea843SPablo de Lara op->sym->cipher.data.offset = ipdata_offset << 3; 494d29ea843SPablo de Lara op->sym->cipher.data.length = data_len << 3; 495d29ea843SPablo de Lara } else { 496c0f87eb5SDeclan Doherty op->sym->cipher.data.offset = ipdata_offset; 497c0f87eb5SDeclan Doherty op->sym->cipher.data.length = data_len; 4981a75e9f3SPablo de Lara } 499d29ea843SPablo de Lara } 500387259bdSDeclan Doherty 5012661f4fbSPablo de Lara if (cparams->do_aead) { 5022661f4fbSPablo de Lara uint8_t *iv_ptr = rte_crypto_op_ctod_offset(op, uint8_t *, 5032661f4fbSPablo de Lara IV_OFFSET); 5042661f4fbSPablo de Lara /* Copy IV at the end of the crypto operation */ 505ff5d5b01SPablo de Lara /* 506ff5d5b01SPablo de Lara * If doing AES-CCM, nonce is copied one byte 507ff5d5b01SPablo de Lara * after the start of IV field 508ff5d5b01SPablo de Lara */ 509ff5d5b01SPablo de Lara if (cparams->aead_algo == RTE_CRYPTO_AEAD_AES_CCM) 510ff5d5b01SPablo de Lara rte_memcpy(iv_ptr + 1, cparams->aead_iv.data, 511ff5d5b01SPablo de Lara cparams->aead_iv.length); 512ff5d5b01SPablo de Lara else 513ff5d5b01SPablo de Lara rte_memcpy(iv_ptr, cparams->aead_iv.data, 514ff5d5b01SPablo de Lara cparams->aead_iv.length); 5152661f4fbSPablo de Lara 5162661f4fbSPablo de Lara op->sym->aead.data.offset = ipdata_offset; 5172661f4fbSPablo de Lara op->sym->aead.data.length = data_len; 5182661f4fbSPablo de Lara 5192661f4fbSPablo de Lara if (!cparams->hash_verify) { 5202661f4fbSPablo de Lara /* Append space for digest to end of packet */ 5212661f4fbSPablo de Lara op->sym->aead.digest.data = (uint8_t *)rte_pktmbuf_append(m, 5222661f4fbSPablo de Lara cparams->digest_length); 5232661f4fbSPablo de Lara } else { 5242661f4fbSPablo de Lara op->sym->aead.digest.data = rte_pktmbuf_mtod(m, 5252661f4fbSPablo de Lara uint8_t *) + ipdata_offset + data_len; 5262661f4fbSPablo de Lara } 5272661f4fbSPablo de Lara 528bfa9a8a4SThomas Monjalon op->sym->aead.digest.phys_addr = rte_pktmbuf_iova_offset(m, 5292661f4fbSPablo de Lara rte_pktmbuf_pkt_len(m) - cparams->digest_length); 5302661f4fbSPablo de Lara 5312661f4fbSPablo de Lara if (cparams->aad.length) { 5322661f4fbSPablo de Lara op->sym->aead.aad.data = cparams->aad.data; 5332661f4fbSPablo de Lara op->sym->aead.aad.phys_addr = cparams->aad.phys_addr; 5342661f4fbSPablo de Lara } 5352661f4fbSPablo de Lara } 5362661f4fbSPablo de Lara 537c0f87eb5SDeclan Doherty op->sym->m_src = m; 538c0f87eb5SDeclan Doherty 539c0f87eb5SDeclan Doherty return l2fwd_crypto_enqueue(op, cparams); 540387259bdSDeclan Doherty } 541387259bdSDeclan Doherty 542387259bdSDeclan Doherty 543387259bdSDeclan Doherty /* Send the burst of packets on an output interface */ 544387259bdSDeclan Doherty static int 545c0f87eb5SDeclan Doherty l2fwd_send_burst(struct lcore_queue_conf *qconf, unsigned n, 54647523597SZhiyong Yang uint16_t port) 547387259bdSDeclan Doherty { 548387259bdSDeclan Doherty struct rte_mbuf **pkt_buffer; 549387259bdSDeclan Doherty unsigned ret; 550387259bdSDeclan Doherty 551c0f87eb5SDeclan Doherty pkt_buffer = (struct rte_mbuf **)qconf->pkt_buf[port].buffer; 552387259bdSDeclan Doherty 553c0f87eb5SDeclan Doherty ret = rte_eth_tx_burst(port, 0, pkt_buffer, (uint16_t)n); 554387259bdSDeclan Doherty port_statistics[port].tx += ret; 555387259bdSDeclan Doherty if (unlikely(ret < n)) { 556387259bdSDeclan Doherty port_statistics[port].dropped += (n - ret); 557387259bdSDeclan Doherty do { 558387259bdSDeclan Doherty rte_pktmbuf_free(pkt_buffer[ret]); 559387259bdSDeclan Doherty } while (++ret < n); 560387259bdSDeclan Doherty } 561387259bdSDeclan Doherty 562387259bdSDeclan Doherty return 0; 563387259bdSDeclan Doherty } 564387259bdSDeclan Doherty 565387259bdSDeclan Doherty /* Enqueue packets for TX and prepare them to be sent */ 566387259bdSDeclan Doherty static int 56747523597SZhiyong Yang l2fwd_send_packet(struct rte_mbuf *m, uint16_t port) 568387259bdSDeclan Doherty { 569387259bdSDeclan Doherty unsigned lcore_id, len; 570387259bdSDeclan Doherty struct lcore_queue_conf *qconf; 571387259bdSDeclan Doherty 572387259bdSDeclan Doherty lcore_id = rte_lcore_id(); 573387259bdSDeclan Doherty 574387259bdSDeclan Doherty qconf = &lcore_queue_conf[lcore_id]; 575c0f87eb5SDeclan Doherty len = qconf->pkt_buf[port].len; 576c0f87eb5SDeclan Doherty qconf->pkt_buf[port].buffer[len] = m; 577387259bdSDeclan Doherty len++; 578387259bdSDeclan Doherty 579387259bdSDeclan Doherty /* enough pkts to be sent */ 580387259bdSDeclan Doherty if (unlikely(len == MAX_PKT_BURST)) { 581387259bdSDeclan Doherty l2fwd_send_burst(qconf, MAX_PKT_BURST, port); 582387259bdSDeclan Doherty len = 0; 583387259bdSDeclan Doherty } 584387259bdSDeclan Doherty 585c0f87eb5SDeclan Doherty qconf->pkt_buf[port].len = len; 586387259bdSDeclan Doherty return 0; 587387259bdSDeclan Doherty } 588387259bdSDeclan Doherty 589387259bdSDeclan Doherty static void 590e2cdfbd0SZhiyong Yang l2fwd_mac_updating(struct rte_mbuf *m, uint16_t dest_portid) 591387259bdSDeclan Doherty { 592387259bdSDeclan Doherty struct ether_hdr *eth; 593387259bdSDeclan Doherty void *tmp; 594387259bdSDeclan Doherty 595387259bdSDeclan Doherty eth = rte_pktmbuf_mtod(m, struct ether_hdr *); 596387259bdSDeclan Doherty 597387259bdSDeclan Doherty /* 02:00:00:00:00:xx */ 598387259bdSDeclan Doherty tmp = ð->d_addr.addr_bytes[0]; 599acdfecbaSKuba Kozak *((uint64_t *)tmp) = 0x000000000002 + ((uint64_t)dest_portid << 40); 600387259bdSDeclan Doherty 601387259bdSDeclan Doherty /* src addr */ 602acdfecbaSKuba Kozak ether_addr_copy(&l2fwd_ports_eth_addr[dest_portid], ð->s_addr); 603acdfecbaSKuba Kozak } 604acdfecbaSKuba Kozak 605acdfecbaSKuba Kozak static void 606e2cdfbd0SZhiyong Yang l2fwd_simple_forward(struct rte_mbuf *m, uint16_t portid, 607acdfecbaSKuba Kozak struct l2fwd_crypto_options *options) 608acdfecbaSKuba Kozak { 609e2cdfbd0SZhiyong Yang uint16_t dst_port; 610acdfecbaSKuba Kozak 611acdfecbaSKuba Kozak dst_port = l2fwd_dst_ports[portid]; 612acdfecbaSKuba Kozak 613acdfecbaSKuba Kozak if (options->mac_updating) 614acdfecbaSKuba Kozak l2fwd_mac_updating(m, dst_port); 615387259bdSDeclan Doherty 616e2cdfbd0SZhiyong Yang l2fwd_send_packet(m, dst_port); 617387259bdSDeclan Doherty } 618387259bdSDeclan Doherty 619387259bdSDeclan Doherty /** Generate random key */ 620387259bdSDeclan Doherty static void 621387259bdSDeclan Doherty generate_random_key(uint8_t *key, unsigned length) 622387259bdSDeclan Doherty { 6236dad6e69SPiotr Azarewicz int fd; 6246dad6e69SPiotr Azarewicz int ret; 625387259bdSDeclan Doherty 6266dad6e69SPiotr Azarewicz fd = open("/dev/urandom", O_RDONLY); 6276dad6e69SPiotr Azarewicz if (fd < 0) 6286dad6e69SPiotr Azarewicz rte_exit(EXIT_FAILURE, "Failed to generate random key\n"); 6296dad6e69SPiotr Azarewicz 6306dad6e69SPiotr Azarewicz ret = read(fd, key, length); 6316dad6e69SPiotr Azarewicz close(fd); 6326dad6e69SPiotr Azarewicz 6336dad6e69SPiotr Azarewicz if (ret != (signed)length) 6346dad6e69SPiotr Azarewicz rte_exit(EXIT_FAILURE, "Failed to generate random key\n"); 635387259bdSDeclan Doherty } 636387259bdSDeclan Doherty 6371bd407faSFiona Trahe static struct rte_cryptodev_sym_session * 6382c59bd32SSlawomir Mrozowicz initialize_crypto_session(struct l2fwd_crypto_options *options, uint8_t cdev_id) 639387259bdSDeclan Doherty { 6401bd407faSFiona Trahe struct rte_crypto_sym_xform *first_xform; 641b3bbd9e5SSlawomir Mrozowicz struct rte_cryptodev_sym_session *session; 6428dbc9bbfSPablo de Lara int retval = rte_cryptodev_socket_id(cdev_id); 6438dbc9bbfSPablo de Lara 6448dbc9bbfSPablo de Lara if (retval < 0) 6458dbc9bbfSPablo de Lara return NULL; 6468dbc9bbfSPablo de Lara 6478dbc9bbfSPablo de Lara uint8_t socket_id = (uint8_t) retval; 648b3bbd9e5SSlawomir Mrozowicz struct rte_mempool *sess_mp = session_pool_socket[socket_id]; 649387259bdSDeclan Doherty 6502661f4fbSPablo de Lara if (options->xform_chain == L2FWD_CRYPTO_AEAD) { 6512661f4fbSPablo de Lara first_xform = &options->aead_xform; 6522661f4fbSPablo de Lara } else if (options->xform_chain == L2FWD_CRYPTO_CIPHER_HASH) { 653387259bdSDeclan Doherty first_xform = &options->cipher_xform; 654387259bdSDeclan Doherty first_xform->next = &options->auth_xform; 6551a75e9f3SPablo de Lara } else if (options->xform_chain == L2FWD_CRYPTO_HASH_CIPHER) { 656387259bdSDeclan Doherty first_xform = &options->auth_xform; 657387259bdSDeclan Doherty first_xform->next = &options->cipher_xform; 6581a75e9f3SPablo de Lara } else if (options->xform_chain == L2FWD_CRYPTO_CIPHER_ONLY) { 6591a75e9f3SPablo de Lara first_xform = &options->cipher_xform; 6601a75e9f3SPablo de Lara } else { 6611a75e9f3SPablo de Lara first_xform = &options->auth_xform; 662387259bdSDeclan Doherty } 663387259bdSDeclan Doherty 664b3bbd9e5SSlawomir Mrozowicz session = rte_cryptodev_sym_session_create(sess_mp); 665b3bbd9e5SSlawomir Mrozowicz 666b3bbd9e5SSlawomir Mrozowicz if (session == NULL) 667b3bbd9e5SSlawomir Mrozowicz return NULL; 668b3bbd9e5SSlawomir Mrozowicz 669b3bbd9e5SSlawomir Mrozowicz if (rte_cryptodev_sym_session_init(cdev_id, session, 670b3bbd9e5SSlawomir Mrozowicz first_xform, sess_mp) < 0) 671b3bbd9e5SSlawomir Mrozowicz return NULL; 672b3bbd9e5SSlawomir Mrozowicz 673b3bbd9e5SSlawomir Mrozowicz return session; 674387259bdSDeclan Doherty } 675387259bdSDeclan Doherty 676387259bdSDeclan Doherty static void 677387259bdSDeclan Doherty l2fwd_crypto_options_print(struct l2fwd_crypto_options *options); 678387259bdSDeclan Doherty 679387259bdSDeclan Doherty /* main processing loop */ 680387259bdSDeclan Doherty static void 681387259bdSDeclan Doherty l2fwd_main_loop(struct l2fwd_crypto_options *options) 682387259bdSDeclan Doherty { 683387259bdSDeclan Doherty struct rte_mbuf *m, *pkts_burst[MAX_PKT_BURST]; 684c0f87eb5SDeclan Doherty struct rte_crypto_op *ops_burst[MAX_PKT_BURST]; 685c0f87eb5SDeclan Doherty 686387259bdSDeclan Doherty unsigned lcore_id = rte_lcore_id(); 687387259bdSDeclan Doherty uint64_t prev_tsc = 0, diff_tsc, cur_tsc, timer_tsc = 0; 688e2cdfbd0SZhiyong Yang unsigned int i, j, nb_rx, len; 689e2cdfbd0SZhiyong Yang uint16_t portid; 690387259bdSDeclan Doherty struct lcore_queue_conf *qconf = &lcore_queue_conf[lcore_id]; 691387259bdSDeclan Doherty const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / 692387259bdSDeclan Doherty US_PER_S * BURST_TX_DRAIN_US; 693387259bdSDeclan Doherty struct l2fwd_crypto_params *cparams; 694387259bdSDeclan Doherty struct l2fwd_crypto_params port_cparams[qconf->nb_crypto_devs]; 6952c59bd32SSlawomir Mrozowicz struct rte_cryptodev_sym_session *session; 696387259bdSDeclan Doherty 697387259bdSDeclan Doherty if (qconf->nb_rx_ports == 0) { 698387259bdSDeclan Doherty RTE_LOG(INFO, L2FWD, "lcore %u has nothing to do\n", lcore_id); 699387259bdSDeclan Doherty return; 700387259bdSDeclan Doherty } 701387259bdSDeclan Doherty 702387259bdSDeclan Doherty RTE_LOG(INFO, L2FWD, "entering main loop on lcore %u\n", lcore_id); 703387259bdSDeclan Doherty 704387259bdSDeclan Doherty for (i = 0; i < qconf->nb_rx_ports; i++) { 705387259bdSDeclan Doherty 706387259bdSDeclan Doherty portid = qconf->rx_port_list[i]; 707387259bdSDeclan Doherty RTE_LOG(INFO, L2FWD, " -- lcoreid=%u portid=%u\n", lcore_id, 708387259bdSDeclan Doherty portid); 709387259bdSDeclan Doherty } 710387259bdSDeclan Doherty 711387259bdSDeclan Doherty for (i = 0; i < qconf->nb_crypto_devs; i++) { 7121a75e9f3SPablo de Lara port_cparams[i].do_cipher = 0; 7131a75e9f3SPablo de Lara port_cparams[i].do_hash = 0; 7142661f4fbSPablo de Lara port_cparams[i].do_aead = 0; 7151a75e9f3SPablo de Lara 7161a75e9f3SPablo de Lara switch (options->xform_chain) { 7172661f4fbSPablo de Lara case L2FWD_CRYPTO_AEAD: 7182661f4fbSPablo de Lara port_cparams[i].do_aead = 1; 7192661f4fbSPablo de Lara break; 7201a75e9f3SPablo de Lara case L2FWD_CRYPTO_CIPHER_HASH: 7211a75e9f3SPablo de Lara case L2FWD_CRYPTO_HASH_CIPHER: 7221a75e9f3SPablo de Lara port_cparams[i].do_cipher = 1; 7231a75e9f3SPablo de Lara port_cparams[i].do_hash = 1; 7241a75e9f3SPablo de Lara break; 7251a75e9f3SPablo de Lara case L2FWD_CRYPTO_HASH_ONLY: 7261a75e9f3SPablo de Lara port_cparams[i].do_hash = 1; 7271a75e9f3SPablo de Lara break; 7281a75e9f3SPablo de Lara case L2FWD_CRYPTO_CIPHER_ONLY: 7291a75e9f3SPablo de Lara port_cparams[i].do_cipher = 1; 7301a75e9f3SPablo de Lara break; 7311a75e9f3SPablo de Lara } 7321a75e9f3SPablo de Lara 733387259bdSDeclan Doherty port_cparams[i].dev_id = qconf->cryptodev_list[i]; 734387259bdSDeclan Doherty port_cparams[i].qp_id = 0; 735387259bdSDeclan Doherty 73627cf2d1bSPablo de Lara port_cparams[i].block_size = options->block_size; 737387259bdSDeclan Doherty 7381a75e9f3SPablo de Lara if (port_cparams[i].do_hash) { 739acf86169SPablo de Lara port_cparams[i].auth_iv.data = options->auth_iv.data; 740acf86169SPablo de Lara port_cparams[i].auth_iv.length = options->auth_iv.length; 741acf86169SPablo de Lara if (!options->auth_iv_param) 742acf86169SPablo de Lara generate_random_key(port_cparams[i].auth_iv.data, 743acf86169SPablo de Lara port_cparams[i].auth_iv.length); 7442661f4fbSPablo de Lara if (options->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) 7452661f4fbSPablo de Lara port_cparams[i].hash_verify = 1; 7462661f4fbSPablo de Lara else 7472661f4fbSPablo de Lara port_cparams[i].hash_verify = 0; 7482661f4fbSPablo de Lara 7492661f4fbSPablo de Lara port_cparams[i].auth_algo = options->auth_xform.auth.algo; 7502c023071SPablo de Lara port_cparams[i].digest_length = 7512c023071SPablo de Lara options->auth_xform.auth.digest_length; 752acf86169SPablo de Lara /* Set IV parameters */ 753acf86169SPablo de Lara if (options->auth_iv.length) { 754acf86169SPablo de Lara options->auth_xform.auth.iv.offset = 755acf86169SPablo de Lara IV_OFFSET + options->cipher_iv.length; 756acf86169SPablo de Lara options->auth_xform.auth.iv.length = 757acf86169SPablo de Lara options->auth_iv.length; 758acf86169SPablo de Lara } 7592661f4fbSPablo de Lara } 7602661f4fbSPablo de Lara 7612661f4fbSPablo de Lara if (port_cparams[i].do_aead) { 762ef896e92SPablo de Lara port_cparams[i].aead_iv.data = options->aead_iv.data; 763ef896e92SPablo de Lara port_cparams[i].aead_iv.length = options->aead_iv.length; 764ef896e92SPablo de Lara if (!options->aead_iv_param) 765ef896e92SPablo de Lara generate_random_key(port_cparams[i].aead_iv.data, 766ef896e92SPablo de Lara port_cparams[i].aead_iv.length); 7672661f4fbSPablo de Lara port_cparams[i].aead_algo = options->aead_xform.aead.algo; 76827cf2d1bSPablo de Lara port_cparams[i].digest_length = 7692661f4fbSPablo de Lara options->aead_xform.aead.digest_length; 77046a0547fSPablo de Lara if (options->aead_xform.aead.aad_length) { 77127cf2d1bSPablo de Lara port_cparams[i].aad.data = options->aad.data; 772617a7949SPablo de Lara port_cparams[i].aad.phys_addr = options->aad.phys_addr; 7732661f4fbSPablo de Lara port_cparams[i].aad.length = options->aad.length; 774617a7949SPablo de Lara if (!options->aad_param) 77527cf2d1bSPablo de Lara generate_random_key(port_cparams[i].aad.data, 776a158899aSPablo de Lara port_cparams[i].aad.length); 777ff5d5b01SPablo de Lara /* 778ff5d5b01SPablo de Lara * If doing AES-CCM, first 18 bytes has to be reserved, 779ff5d5b01SPablo de Lara * and actual AAD should start from byte 18 780ff5d5b01SPablo de Lara */ 781ff5d5b01SPablo de Lara if (port_cparams[i].aead_algo == RTE_CRYPTO_AEAD_AES_CCM) 782ff5d5b01SPablo de Lara memmove(port_cparams[i].aad.data + 18, 783ff5d5b01SPablo de Lara port_cparams[i].aad.data, 784ff5d5b01SPablo de Lara port_cparams[i].aad.length); 78527cf2d1bSPablo de Lara 78618f421f6SPablo de Lara } else 78718f421f6SPablo de Lara port_cparams[i].aad.length = 0; 78827cf2d1bSPablo de Lara 7892661f4fbSPablo de Lara if (options->aead_xform.aead.op == RTE_CRYPTO_AEAD_OP_DECRYPT) 79027cf2d1bSPablo de Lara port_cparams[i].hash_verify = 1; 79127cf2d1bSPablo de Lara else 79227cf2d1bSPablo de Lara port_cparams[i].hash_verify = 0; 793d29ea843SPablo de Lara 7942661f4fbSPablo de Lara /* Set IV parameters */ 7952661f4fbSPablo de Lara options->aead_xform.aead.iv.offset = IV_OFFSET; 7962661f4fbSPablo de Lara options->aead_xform.aead.iv.length = options->aead_iv.length; 7971a75e9f3SPablo de Lara } 7981a75e9f3SPablo de Lara 7991a75e9f3SPablo de Lara if (port_cparams[i].do_cipher) { 800acf86169SPablo de Lara port_cparams[i].cipher_iv.data = options->cipher_iv.data; 801acf86169SPablo de Lara port_cparams[i].cipher_iv.length = options->cipher_iv.length; 802acf86169SPablo de Lara if (!options->cipher_iv_param) 803acf86169SPablo de Lara generate_random_key(port_cparams[i].cipher_iv.data, 804acf86169SPablo de Lara port_cparams[i].cipher_iv.length); 805617a7949SPablo de Lara 806d29ea843SPablo de Lara port_cparams[i].cipher_algo = options->cipher_xform.cipher.algo; 8070fbd75a9SPablo de Lara /* Set IV parameters */ 8080fbd75a9SPablo de Lara options->cipher_xform.cipher.iv.offset = IV_OFFSET; 809acf86169SPablo de Lara options->cipher_xform.cipher.iv.length = 810acf86169SPablo de Lara options->cipher_iv.length; 81127cf2d1bSPablo de Lara } 812617a7949SPablo de Lara 8132c59bd32SSlawomir Mrozowicz session = initialize_crypto_session(options, 814387259bdSDeclan Doherty port_cparams[i].dev_id); 8152c59bd32SSlawomir Mrozowicz if (session == NULL) 8162c59bd32SSlawomir Mrozowicz rte_exit(EXIT_FAILURE, "Failed to initialize crypto session\n"); 817387259bdSDeclan Doherty 8182c59bd32SSlawomir Mrozowicz port_cparams[i].session = session; 8192c59bd32SSlawomir Mrozowicz 820387259bdSDeclan Doherty RTE_LOG(INFO, L2FWD, " -- lcoreid=%u cryptoid=%u\n", lcore_id, 821387259bdSDeclan Doherty port_cparams[i].dev_id); 822387259bdSDeclan Doherty } 823387259bdSDeclan Doherty 82441e97c2eSPablo de Lara l2fwd_crypto_options_print(options); 82541e97c2eSPablo de Lara 82641e97c2eSPablo de Lara /* 82741e97c2eSPablo de Lara * Initialize previous tsc timestamp before the loop, 82841e97c2eSPablo de Lara * to avoid showing the port statistics immediately, 82941e97c2eSPablo de Lara * so user can see the crypto information. 83041e97c2eSPablo de Lara */ 83141e97c2eSPablo de Lara prev_tsc = rte_rdtsc(); 832387259bdSDeclan Doherty while (1) { 833387259bdSDeclan Doherty 834387259bdSDeclan Doherty cur_tsc = rte_rdtsc(); 835387259bdSDeclan Doherty 836387259bdSDeclan Doherty /* 837268ca735SPablo de Lara * Crypto device/TX burst queue drain 838387259bdSDeclan Doherty */ 839387259bdSDeclan Doherty diff_tsc = cur_tsc - prev_tsc; 840387259bdSDeclan Doherty if (unlikely(diff_tsc > drain_tsc)) { 841268ca735SPablo de Lara /* Enqueue all crypto ops remaining in buffers */ 842268ca735SPablo de Lara for (i = 0; i < qconf->nb_crypto_devs; i++) { 843268ca735SPablo de Lara cparams = &port_cparams[i]; 844268ca735SPablo de Lara len = qconf->op_buf[cparams->dev_id].len; 845268ca735SPablo de Lara l2fwd_crypto_send_burst(qconf, len, cparams); 846268ca735SPablo de Lara qconf->op_buf[cparams->dev_id].len = 0; 847268ca735SPablo de Lara } 848268ca735SPablo de Lara /* Transmit all packets remaining in buffers */ 849387259bdSDeclan Doherty for (portid = 0; portid < RTE_MAX_ETHPORTS; portid++) { 850c0f87eb5SDeclan Doherty if (qconf->pkt_buf[portid].len == 0) 851387259bdSDeclan Doherty continue; 852387259bdSDeclan Doherty l2fwd_send_burst(&lcore_queue_conf[lcore_id], 853c0f87eb5SDeclan Doherty qconf->pkt_buf[portid].len, 854e2cdfbd0SZhiyong Yang portid); 855c0f87eb5SDeclan Doherty qconf->pkt_buf[portid].len = 0; 856387259bdSDeclan Doherty } 857387259bdSDeclan Doherty 858387259bdSDeclan Doherty /* if timer is enabled */ 859387259bdSDeclan Doherty if (timer_period > 0) { 860387259bdSDeclan Doherty 861387259bdSDeclan Doherty /* advance the timer */ 862387259bdSDeclan Doherty timer_tsc += diff_tsc; 863387259bdSDeclan Doherty 864387259bdSDeclan Doherty /* if timer has reached its timeout */ 865387259bdSDeclan Doherty if (unlikely(timer_tsc >= 866387259bdSDeclan Doherty (uint64_t)timer_period)) { 867387259bdSDeclan Doherty 868387259bdSDeclan Doherty /* do this only on master core */ 869ad509b4aSDeclan Doherty if (lcore_id == rte_get_master_lcore() 870ad509b4aSDeclan Doherty && options->refresh_period) { 871387259bdSDeclan Doherty print_stats(); 872387259bdSDeclan Doherty timer_tsc = 0; 873387259bdSDeclan Doherty } 874387259bdSDeclan Doherty } 875387259bdSDeclan Doherty } 876387259bdSDeclan Doherty 877387259bdSDeclan Doherty prev_tsc = cur_tsc; 878387259bdSDeclan Doherty } 879387259bdSDeclan Doherty 880387259bdSDeclan Doherty /* 881387259bdSDeclan Doherty * Read packet from RX queues 882387259bdSDeclan Doherty */ 883387259bdSDeclan Doherty for (i = 0; i < qconf->nb_rx_ports; i++) { 884387259bdSDeclan Doherty portid = qconf->rx_port_list[i]; 885387259bdSDeclan Doherty 886387259bdSDeclan Doherty cparams = &port_cparams[i]; 887387259bdSDeclan Doherty 888e2cdfbd0SZhiyong Yang nb_rx = rte_eth_rx_burst(portid, 0, 889387259bdSDeclan Doherty pkts_burst, MAX_PKT_BURST); 890387259bdSDeclan Doherty 891387259bdSDeclan Doherty port_statistics[portid].rx += nb_rx; 892387259bdSDeclan Doherty 893c0f87eb5SDeclan Doherty if (nb_rx) { 894387259bdSDeclan Doherty /* 895c0f87eb5SDeclan Doherty * If we can't allocate a crypto_ops, then drop 896387259bdSDeclan Doherty * the rest of the burst and dequeue and 897387259bdSDeclan Doherty * process the packets to free offload structs 898387259bdSDeclan Doherty */ 899c0f87eb5SDeclan Doherty if (rte_crypto_op_bulk_alloc( 900c0f87eb5SDeclan Doherty l2fwd_crypto_op_pool, 901c0f87eb5SDeclan Doherty RTE_CRYPTO_OP_TYPE_SYMMETRIC, 902c0f87eb5SDeclan Doherty ops_burst, nb_rx) != 903c0f87eb5SDeclan Doherty nb_rx) { 904c0f87eb5SDeclan Doherty for (j = 0; j < nb_rx; j++) 905d7acf6baSPablo de Lara rte_pktmbuf_free(pkts_burst[j]); 906c0f87eb5SDeclan Doherty 907c0f87eb5SDeclan Doherty nb_rx = 0; 908387259bdSDeclan Doherty } 909387259bdSDeclan Doherty 910c0f87eb5SDeclan Doherty /* Enqueue packets from Crypto device*/ 911c0f87eb5SDeclan Doherty for (j = 0; j < nb_rx; j++) { 912c0f87eb5SDeclan Doherty m = pkts_burst[j]; 913387259bdSDeclan Doherty 914c0f87eb5SDeclan Doherty l2fwd_simple_crypto_enqueue(m, 915c0f87eb5SDeclan Doherty ops_burst[j], cparams); 916c0f87eb5SDeclan Doherty } 917387259bdSDeclan Doherty } 918387259bdSDeclan Doherty 919387259bdSDeclan Doherty /* Dequeue packets from Crypto device */ 920c0f87eb5SDeclan Doherty do { 921387259bdSDeclan Doherty nb_rx = rte_cryptodev_dequeue_burst( 922387259bdSDeclan Doherty cparams->dev_id, cparams->qp_id, 923c0f87eb5SDeclan Doherty ops_burst, MAX_PKT_BURST); 924c0f87eb5SDeclan Doherty 925c0f87eb5SDeclan Doherty crypto_statistics[cparams->dev_id].dequeued += 926c0f87eb5SDeclan Doherty nb_rx; 927387259bdSDeclan Doherty 928387259bdSDeclan Doherty /* Forward crypto'd packets */ 929387259bdSDeclan Doherty for (j = 0; j < nb_rx; j++) { 930c0f87eb5SDeclan Doherty m = ops_burst[j]->sym->m_src; 931c0f87eb5SDeclan Doherty 932c0f87eb5SDeclan Doherty rte_crypto_op_free(ops_burst[j]); 933acdfecbaSKuba Kozak l2fwd_simple_forward(m, portid, 934acdfecbaSKuba Kozak options); 935387259bdSDeclan Doherty } 936c0f87eb5SDeclan Doherty } while (nb_rx == MAX_PKT_BURST); 937387259bdSDeclan Doherty } 938387259bdSDeclan Doherty } 939387259bdSDeclan Doherty } 940387259bdSDeclan Doherty 941387259bdSDeclan Doherty static int 942387259bdSDeclan Doherty l2fwd_launch_one_lcore(void *arg) 943387259bdSDeclan Doherty { 944387259bdSDeclan Doherty l2fwd_main_loop((struct l2fwd_crypto_options *)arg); 945387259bdSDeclan Doherty return 0; 946387259bdSDeclan Doherty } 947387259bdSDeclan Doherty 948387259bdSDeclan Doherty /* Display command line arguments usage */ 949387259bdSDeclan Doherty static void 950387259bdSDeclan Doherty l2fwd_crypto_usage(const char *prgname) 951387259bdSDeclan Doherty { 952912b3a0aSPablo de Lara printf("%s [EAL options] --\n" 953387259bdSDeclan Doherty " -p PORTMASK: hexadecimal bitmask of ports to configure\n" 954387259bdSDeclan Doherty " -q NQ: number of queue (=ports) per lcore (default is 1)\n" 95569a558e3SPablo de Lara " -s manage all ports from single lcore\n" 956a3380989SPablo de Lara " -T PERIOD: statistics will be refreshed each PERIOD seconds" 957387259bdSDeclan Doherty " (0 to disable, 10 default, 86400 maximum)\n" 958387259bdSDeclan Doherty 959912b3a0aSPablo de Lara " --cdev_type HW / SW / ANY\n" 960a3c2e34bSPablo de Lara " --chain HASH_CIPHER / CIPHER_HASH / CIPHER_ONLY /" 9612661f4fbSPablo de Lara " HASH_ONLY / AEAD\n" 962387259bdSDeclan Doherty 963387259bdSDeclan Doherty " --cipher_algo ALGO\n" 964387259bdSDeclan Doherty " --cipher_op ENCRYPT / DECRYPT\n" 965fcdbb3d5SPablo de Lara " --cipher_key KEY (bytes separated with \":\")\n" 966a061e50aSPablo de Lara " --cipher_key_random_size SIZE: size of cipher key when generated randomly\n" 967acf86169SPablo de Lara " --cipher_iv IV (bytes separated with \":\")\n" 968acf86169SPablo de Lara " --cipher_iv_random_size SIZE: size of cipher IV when generated randomly\n" 969387259bdSDeclan Doherty 9703b98cbaaSPablo de Lara " --auth_algo ALGO\n" 971387259bdSDeclan Doherty " --auth_op GENERATE / VERIFY\n" 972fcdbb3d5SPablo de Lara " --auth_key KEY (bytes separated with \":\")\n" 973a061e50aSPablo de Lara " --auth_key_random_size SIZE: size of auth key when generated randomly\n" 974acf86169SPablo de Lara " --auth_iv IV (bytes separated with \":\")\n" 975acf86169SPablo de Lara " --auth_iv_random_size SIZE: size of auth IV when generated randomly\n" 9762661f4fbSPablo de Lara 9772661f4fbSPablo de Lara " --aead_algo ALGO\n" 9782661f4fbSPablo de Lara " --aead_op ENCRYPT / DECRYPT\n" 9792661f4fbSPablo de Lara " --aead_key KEY (bytes separated with \":\")\n" 9802661f4fbSPablo de Lara " --aead_key_random_size SIZE: size of AEAD key when generated randomly\n" 9812661f4fbSPablo de Lara " --aead_iv IV (bytes separated with \":\")\n" 9822661f4fbSPablo de Lara " --aead_iv_random_size SIZE: size of AEAD IV when generated randomly\n" 983fcdbb3d5SPablo de Lara " --aad AAD (bytes separated with \":\")\n" 984a061e50aSPablo de Lara " --aad_random_size SIZE: size of AAD when generated randomly\n" 9852661f4fbSPablo de Lara 986a061e50aSPablo de Lara " --digest_size SIZE: size of digest to be generated/verified\n" 987387259bdSDeclan Doherty 988d2797f51SFan Zhang " --sessionless\n" 989acdfecbaSKuba Kozak " --cryptodev_mask MASK: hexadecimal bitmask of crypto devices to configure\n" 990acdfecbaSKuba Kozak 991acdfecbaSKuba Kozak " --[no-]mac-updating: Enable or disable MAC addresses updating (enabled by default)\n" 992acdfecbaSKuba Kozak " When enabled:\n" 993acdfecbaSKuba Kozak " - The source MAC address is replaced by the TX port MAC address\n" 994acdfecbaSKuba Kozak " - The destination MAC address is replaced by 02:00:00:00:00:TX_PORT_ID\n", 995387259bdSDeclan Doherty prgname); 996387259bdSDeclan Doherty } 997387259bdSDeclan Doherty 998387259bdSDeclan Doherty /** Parse crypto device type command line argument */ 999387259bdSDeclan Doherty static int 100027cf2d1bSPablo de Lara parse_cryptodev_type(enum cdev_type *type, char *optarg) 1001387259bdSDeclan Doherty { 100227cf2d1bSPablo de Lara if (strcmp("HW", optarg) == 0) { 100327cf2d1bSPablo de Lara *type = CDEV_TYPE_HW; 1004387259bdSDeclan Doherty return 0; 100527cf2d1bSPablo de Lara } else if (strcmp("SW", optarg) == 0) { 100627cf2d1bSPablo de Lara *type = CDEV_TYPE_SW; 100727cf2d1bSPablo de Lara return 0; 100827cf2d1bSPablo de Lara } else if (strcmp("ANY", optarg) == 0) { 100927cf2d1bSPablo de Lara *type = CDEV_TYPE_ANY; 1010387259bdSDeclan Doherty return 0; 1011387259bdSDeclan Doherty } 1012387259bdSDeclan Doherty 1013387259bdSDeclan Doherty return -1; 1014387259bdSDeclan Doherty } 1015387259bdSDeclan Doherty 1016387259bdSDeclan Doherty /** Parse crypto chain xform command line argument */ 1017387259bdSDeclan Doherty static int 1018387259bdSDeclan Doherty parse_crypto_opt_chain(struct l2fwd_crypto_options *options, char *optarg) 1019387259bdSDeclan Doherty { 1020387259bdSDeclan Doherty if (strcmp("CIPHER_HASH", optarg) == 0) { 1021387259bdSDeclan Doherty options->xform_chain = L2FWD_CRYPTO_CIPHER_HASH; 1022387259bdSDeclan Doherty return 0; 1023387259bdSDeclan Doherty } else if (strcmp("HASH_CIPHER", optarg) == 0) { 1024387259bdSDeclan Doherty options->xform_chain = L2FWD_CRYPTO_HASH_CIPHER; 1025387259bdSDeclan Doherty return 0; 10261a75e9f3SPablo de Lara } else if (strcmp("CIPHER_ONLY", optarg) == 0) { 10271a75e9f3SPablo de Lara options->xform_chain = L2FWD_CRYPTO_CIPHER_ONLY; 10281a75e9f3SPablo de Lara return 0; 10291a75e9f3SPablo de Lara } else if (strcmp("HASH_ONLY", optarg) == 0) { 10301a75e9f3SPablo de Lara options->xform_chain = L2FWD_CRYPTO_HASH_ONLY; 10311a75e9f3SPablo de Lara return 0; 10322661f4fbSPablo de Lara } else if (strcmp("AEAD", optarg) == 0) { 10332661f4fbSPablo de Lara options->xform_chain = L2FWD_CRYPTO_AEAD; 10342661f4fbSPablo de Lara return 0; 1035387259bdSDeclan Doherty } 1036387259bdSDeclan Doherty 1037387259bdSDeclan Doherty return -1; 1038387259bdSDeclan Doherty } 1039387259bdSDeclan Doherty 1040387259bdSDeclan Doherty /** Parse crypto cipher algo option command line argument */ 1041387259bdSDeclan Doherty static int 1042387259bdSDeclan Doherty parse_cipher_algo(enum rte_crypto_cipher_algorithm *algo, char *optarg) 1043387259bdSDeclan Doherty { 104400c58901SPablo de Lara 10454790f99dSPablo de Lara if (rte_cryptodev_get_cipher_algo_enum(algo, optarg) < 0) { 10464790f99dSPablo de Lara RTE_LOG(ERR, USER1, "Cipher algorithm specified " 10474790f99dSPablo de Lara "not supported!\n"); 1048387259bdSDeclan Doherty return -1; 1049387259bdSDeclan Doherty } 1050387259bdSDeclan Doherty 10514790f99dSPablo de Lara return 0; 10524790f99dSPablo de Lara } 10534790f99dSPablo de Lara 1054387259bdSDeclan Doherty /** Parse crypto cipher operation command line argument */ 1055387259bdSDeclan Doherty static int 1056387259bdSDeclan Doherty parse_cipher_op(enum rte_crypto_cipher_operation *op, char *optarg) 1057387259bdSDeclan Doherty { 1058387259bdSDeclan Doherty if (strcmp("ENCRYPT", optarg) == 0) { 1059387259bdSDeclan Doherty *op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 1060387259bdSDeclan Doherty return 0; 1061387259bdSDeclan Doherty } else if (strcmp("DECRYPT", optarg) == 0) { 1062387259bdSDeclan Doherty *op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 1063387259bdSDeclan Doherty return 0; 1064387259bdSDeclan Doherty } 1065387259bdSDeclan Doherty 1066387259bdSDeclan Doherty printf("Cipher operation not supported!\n"); 1067387259bdSDeclan Doherty return -1; 1068387259bdSDeclan Doherty } 1069387259bdSDeclan Doherty 1070ff5d5b01SPablo de Lara /** Parse bytes from command line argument */ 1071387259bdSDeclan Doherty static int 1072ff5d5b01SPablo de Lara parse_bytes(uint8_t *data, char *input_arg, uint16_t max_size) 1073387259bdSDeclan Doherty { 10741df9c010SPablo de Lara unsigned byte_count; 10751df9c010SPablo de Lara char *token; 10761df9c010SPablo de Lara 107745544627SHemant Agrawal errno = 0; 10781df9c010SPablo de Lara for (byte_count = 0, token = strtok(input_arg, ":"); 1079ff5d5b01SPablo de Lara (byte_count < max_size) && (token != NULL); 10801df9c010SPablo de Lara token = strtok(NULL, ":")) { 10811df9c010SPablo de Lara 10821df9c010SPablo de Lara int number = (int)strtol(token, NULL, 16); 10831df9c010SPablo de Lara 10841df9c010SPablo de Lara if (errno == EINVAL || errno == ERANGE || number > 0xFF) 1085387259bdSDeclan Doherty return -1; 10861df9c010SPablo de Lara 10871df9c010SPablo de Lara data[byte_count++] = (uint8_t)number; 10881df9c010SPablo de Lara } 10891df9c010SPablo de Lara 1090a061e50aSPablo de Lara return byte_count; 1091a061e50aSPablo de Lara } 1092a061e50aSPablo de Lara 1093a061e50aSPablo de Lara /** Parse size param*/ 1094a061e50aSPablo de Lara static int 1095a061e50aSPablo de Lara parse_size(int *size, const char *q_arg) 1096a061e50aSPablo de Lara { 1097a061e50aSPablo de Lara char *end = NULL; 1098a061e50aSPablo de Lara unsigned long n; 1099a061e50aSPablo de Lara 1100a061e50aSPablo de Lara /* parse hexadecimal string */ 1101a061e50aSPablo de Lara n = strtoul(q_arg, &end, 10); 1102a061e50aSPablo de Lara if ((q_arg[0] == '\0') || (end == NULL) || (*end != '\0')) 1103a061e50aSPablo de Lara n = 0; 1104a061e50aSPablo de Lara 1105a061e50aSPablo de Lara if (n == 0) { 1106a061e50aSPablo de Lara printf("invalid size\n"); 1107a061e50aSPablo de Lara return -1; 1108a061e50aSPablo de Lara } 1109a061e50aSPablo de Lara 1110a061e50aSPablo de Lara *size = n; 11111df9c010SPablo de Lara return 0; 1112387259bdSDeclan Doherty } 1113387259bdSDeclan Doherty 1114387259bdSDeclan Doherty /** Parse crypto cipher operation command line argument */ 1115387259bdSDeclan Doherty static int 1116387259bdSDeclan Doherty parse_auth_algo(enum rte_crypto_auth_algorithm *algo, char *optarg) 1117387259bdSDeclan Doherty { 11184790f99dSPablo de Lara if (rte_cryptodev_get_auth_algo_enum(algo, optarg) < 0) { 11194790f99dSPablo de Lara RTE_LOG(ERR, USER1, "Authentication algorithm specified " 11204790f99dSPablo de Lara "not supported!\n"); 1121387259bdSDeclan Doherty return -1; 1122387259bdSDeclan Doherty } 1123387259bdSDeclan Doherty 11244790f99dSPablo de Lara return 0; 11254790f99dSPablo de Lara } 11264790f99dSPablo de Lara 1127387259bdSDeclan Doherty static int 1128387259bdSDeclan Doherty parse_auth_op(enum rte_crypto_auth_operation *op, char *optarg) 1129387259bdSDeclan Doherty { 1130387259bdSDeclan Doherty if (strcmp("VERIFY", optarg) == 0) { 1131387259bdSDeclan Doherty *op = RTE_CRYPTO_AUTH_OP_VERIFY; 1132387259bdSDeclan Doherty return 0; 1133387259bdSDeclan Doherty } else if (strcmp("GENERATE", optarg) == 0) { 113472169087SPablo de Lara *op = RTE_CRYPTO_AUTH_OP_GENERATE; 1135387259bdSDeclan Doherty return 0; 1136387259bdSDeclan Doherty } 1137387259bdSDeclan Doherty 1138387259bdSDeclan Doherty printf("Authentication operation specified not supported!\n"); 1139387259bdSDeclan Doherty return -1; 1140387259bdSDeclan Doherty } 1141387259bdSDeclan Doherty 1142d2797f51SFan Zhang static int 11432661f4fbSPablo de Lara parse_aead_algo(enum rte_crypto_aead_algorithm *algo, char *optarg) 11442661f4fbSPablo de Lara { 11452661f4fbSPablo de Lara if (rte_cryptodev_get_aead_algo_enum(algo, optarg) < 0) { 11462661f4fbSPablo de Lara RTE_LOG(ERR, USER1, "AEAD algorithm specified " 11472661f4fbSPablo de Lara "not supported!\n"); 11482661f4fbSPablo de Lara return -1; 11492661f4fbSPablo de Lara } 11502661f4fbSPablo de Lara 11512661f4fbSPablo de Lara return 0; 11522661f4fbSPablo de Lara } 11532661f4fbSPablo de Lara 11542661f4fbSPablo de Lara static int 11552661f4fbSPablo de Lara parse_aead_op(enum rte_crypto_aead_operation *op, char *optarg) 11562661f4fbSPablo de Lara { 11572661f4fbSPablo de Lara if (strcmp("ENCRYPT", optarg) == 0) { 11582661f4fbSPablo de Lara *op = RTE_CRYPTO_AEAD_OP_ENCRYPT; 11592661f4fbSPablo de Lara return 0; 11602661f4fbSPablo de Lara } else if (strcmp("DECRYPT", optarg) == 0) { 11612661f4fbSPablo de Lara *op = RTE_CRYPTO_AEAD_OP_DECRYPT; 11622661f4fbSPablo de Lara return 0; 11632661f4fbSPablo de Lara } 11642661f4fbSPablo de Lara 11652661f4fbSPablo de Lara printf("AEAD operation specified not supported!\n"); 11662661f4fbSPablo de Lara return -1; 11672661f4fbSPablo de Lara } 11682661f4fbSPablo de Lara static int 1169d2797f51SFan Zhang parse_cryptodev_mask(struct l2fwd_crypto_options *options, 1170d2797f51SFan Zhang const char *q_arg) 1171d2797f51SFan Zhang { 1172d2797f51SFan Zhang char *end = NULL; 1173d2797f51SFan Zhang uint64_t pm; 1174d2797f51SFan Zhang 1175d2797f51SFan Zhang /* parse hexadecimal string */ 1176d2797f51SFan Zhang pm = strtoul(q_arg, &end, 16); 1177d2797f51SFan Zhang if ((pm == '\0') || (end == NULL) || (*end != '\0')) 1178d2797f51SFan Zhang pm = 0; 1179d2797f51SFan Zhang 1180d2797f51SFan Zhang options->cryptodev_mask = pm; 1181d2797f51SFan Zhang if (options->cryptodev_mask == 0) { 1182d2797f51SFan Zhang printf("invalid cryptodev_mask specified\n"); 1183d2797f51SFan Zhang return -1; 1184d2797f51SFan Zhang } 1185d2797f51SFan Zhang 1186d2797f51SFan Zhang return 0; 1187d2797f51SFan Zhang } 1188d2797f51SFan Zhang 1189387259bdSDeclan Doherty /** Parse long options */ 1190387259bdSDeclan Doherty static int 1191387259bdSDeclan Doherty l2fwd_crypto_parse_args_long_options(struct l2fwd_crypto_options *options, 1192387259bdSDeclan Doherty struct option *lgopts, int option_index) 1193387259bdSDeclan Doherty { 119427cf2d1bSPablo de Lara int retval; 119527cf2d1bSPablo de Lara 119649f79e86SPablo de Lara if (strcmp(lgopts[option_index].name, "cdev_type") == 0) { 119749f79e86SPablo de Lara retval = parse_cryptodev_type(&options->type, optarg); 119849f79e86SPablo de Lara if (retval == 0) 119999218e76SPablo de Lara snprintf(options->string_type, MAX_STR_LEN, 120099218e76SPablo de Lara "%s", optarg); 120149f79e86SPablo de Lara return retval; 120249f79e86SPablo de Lara } 1203387259bdSDeclan Doherty 1204387259bdSDeclan Doherty else if (strcmp(lgopts[option_index].name, "chain") == 0) 1205387259bdSDeclan Doherty return parse_crypto_opt_chain(options, optarg); 1206387259bdSDeclan Doherty 1207387259bdSDeclan Doherty /* Cipher options */ 120800c58901SPablo de Lara else if (strcmp(lgopts[option_index].name, "cipher_algo") == 0) 120900c58901SPablo de Lara return parse_cipher_algo(&options->cipher_xform.cipher.algo, 1210387259bdSDeclan Doherty optarg); 1211387259bdSDeclan Doherty 1212387259bdSDeclan Doherty else if (strcmp(lgopts[option_index].name, "cipher_op") == 0) 1213387259bdSDeclan Doherty return parse_cipher_op(&options->cipher_xform.cipher.op, 1214387259bdSDeclan Doherty optarg); 1215387259bdSDeclan Doherty 1216a7f4562bSFiona Trahe else if (strcmp(lgopts[option_index].name, "cipher_key") == 0) { 12171df9c010SPablo de Lara options->ckey_param = 1; 1218a061e50aSPablo de Lara options->cipher_xform.cipher.key.length = 1219ff5d5b01SPablo de Lara parse_bytes(options->cipher_xform.cipher.key.data, optarg, 1220ff5d5b01SPablo de Lara MAX_KEY_SIZE); 1221a061e50aSPablo de Lara if (options->cipher_xform.cipher.key.length > 0) 1222a061e50aSPablo de Lara return 0; 1223a061e50aSPablo de Lara else 1224a061e50aSPablo de Lara return -1; 12251df9c010SPablo de Lara } 1226387259bdSDeclan Doherty 1227a061e50aSPablo de Lara else if (strcmp(lgopts[option_index].name, "cipher_key_random_size") == 0) 1228a061e50aSPablo de Lara return parse_size(&options->ckey_random_size, optarg); 1229a061e50aSPablo de Lara 1230acf86169SPablo de Lara else if (strcmp(lgopts[option_index].name, "cipher_iv") == 0) { 1231acf86169SPablo de Lara options->cipher_iv_param = 1; 1232acf86169SPablo de Lara options->cipher_iv.length = 1233ff5d5b01SPablo de Lara parse_bytes(options->cipher_iv.data, optarg, MAX_IV_SIZE); 1234acf86169SPablo de Lara if (options->cipher_iv.length > 0) 1235a061e50aSPablo de Lara return 0; 1236a061e50aSPablo de Lara else 1237a061e50aSPablo de Lara return -1; 12381df9c010SPablo de Lara } 1239387259bdSDeclan Doherty 1240acf86169SPablo de Lara else if (strcmp(lgopts[option_index].name, "cipher_iv_random_size") == 0) 1241acf86169SPablo de Lara return parse_size(&options->cipher_iv_random_size, optarg); 1242a061e50aSPablo de Lara 1243387259bdSDeclan Doherty /* Authentication options */ 124427cf2d1bSPablo de Lara else if (strcmp(lgopts[option_index].name, "auth_algo") == 0) { 124500c58901SPablo de Lara return parse_auth_algo(&options->auth_xform.auth.algo, 1246387259bdSDeclan Doherty optarg); 124727cf2d1bSPablo de Lara } 1248387259bdSDeclan Doherty 1249387259bdSDeclan Doherty else if (strcmp(lgopts[option_index].name, "auth_op") == 0) 125072169087SPablo de Lara return parse_auth_op(&options->auth_xform.auth.op, 1251387259bdSDeclan Doherty optarg); 1252387259bdSDeclan Doherty 1253a7f4562bSFiona Trahe else if (strcmp(lgopts[option_index].name, "auth_key") == 0) { 12541df9c010SPablo de Lara options->akey_param = 1; 1255a061e50aSPablo de Lara options->auth_xform.auth.key.length = 1256ff5d5b01SPablo de Lara parse_bytes(options->auth_xform.auth.key.data, optarg, 1257ff5d5b01SPablo de Lara MAX_KEY_SIZE); 1258a061e50aSPablo de Lara if (options->auth_xform.auth.key.length > 0) 1259a061e50aSPablo de Lara return 0; 1260a061e50aSPablo de Lara else 1261a061e50aSPablo de Lara return -1; 1262a061e50aSPablo de Lara } 1263a061e50aSPablo de Lara 1264a061e50aSPablo de Lara else if (strcmp(lgopts[option_index].name, "auth_key_random_size") == 0) { 1265a061e50aSPablo de Lara return parse_size(&options->akey_random_size, optarg); 12661df9c010SPablo de Lara } 1267387259bdSDeclan Doherty 1268acf86169SPablo de Lara else if (strcmp(lgopts[option_index].name, "auth_iv") == 0) { 1269acf86169SPablo de Lara options->auth_iv_param = 1; 1270acf86169SPablo de Lara options->auth_iv.length = 1271ff5d5b01SPablo de Lara parse_bytes(options->auth_iv.data, optarg, MAX_IV_SIZE); 1272acf86169SPablo de Lara if (options->auth_iv.length > 0) 1273acf86169SPablo de Lara return 0; 1274acf86169SPablo de Lara else 1275acf86169SPablo de Lara return -1; 1276acf86169SPablo de Lara } 1277acf86169SPablo de Lara 1278acf86169SPablo de Lara else if (strcmp(lgopts[option_index].name, "auth_iv_random_size") == 0) 1279acf86169SPablo de Lara return parse_size(&options->auth_iv_random_size, optarg); 1280acf86169SPablo de Lara 12812661f4fbSPablo de Lara /* AEAD options */ 12822661f4fbSPablo de Lara else if (strcmp(lgopts[option_index].name, "aead_algo") == 0) { 12832661f4fbSPablo de Lara return parse_aead_algo(&options->aead_xform.aead.algo, 12842661f4fbSPablo de Lara optarg); 12852661f4fbSPablo de Lara } 12862661f4fbSPablo de Lara 12872661f4fbSPablo de Lara else if (strcmp(lgopts[option_index].name, "aead_op") == 0) 12882661f4fbSPablo de Lara return parse_aead_op(&options->aead_xform.aead.op, 12892661f4fbSPablo de Lara optarg); 12902661f4fbSPablo de Lara 12912661f4fbSPablo de Lara else if (strcmp(lgopts[option_index].name, "aead_key") == 0) { 12922661f4fbSPablo de Lara options->aead_key_param = 1; 12932661f4fbSPablo de Lara options->aead_xform.aead.key.length = 1294ff5d5b01SPablo de Lara parse_bytes(options->aead_xform.aead.key.data, optarg, 1295ff5d5b01SPablo de Lara MAX_KEY_SIZE); 12962661f4fbSPablo de Lara if (options->aead_xform.aead.key.length > 0) 12972661f4fbSPablo de Lara return 0; 12982661f4fbSPablo de Lara else 12992661f4fbSPablo de Lara return -1; 13002661f4fbSPablo de Lara } 13012661f4fbSPablo de Lara 13022661f4fbSPablo de Lara else if (strcmp(lgopts[option_index].name, "aead_key_random_size") == 0) 13032661f4fbSPablo de Lara return parse_size(&options->aead_key_random_size, optarg); 13042661f4fbSPablo de Lara 13052661f4fbSPablo de Lara 13062661f4fbSPablo de Lara else if (strcmp(lgopts[option_index].name, "aead_iv") == 0) { 13072661f4fbSPablo de Lara options->aead_iv_param = 1; 13082661f4fbSPablo de Lara options->aead_iv.length = 1309ff5d5b01SPablo de Lara parse_bytes(options->aead_iv.data, optarg, MAX_IV_SIZE); 13102661f4fbSPablo de Lara if (options->aead_iv.length > 0) 13112661f4fbSPablo de Lara return 0; 13122661f4fbSPablo de Lara else 13132661f4fbSPablo de Lara return -1; 13142661f4fbSPablo de Lara } 13152661f4fbSPablo de Lara 13162661f4fbSPablo de Lara else if (strcmp(lgopts[option_index].name, "aead_iv_random_size") == 0) 13172661f4fbSPablo de Lara return parse_size(&options->aead_iv_random_size, optarg); 13182661f4fbSPablo de Lara 1319617a7949SPablo de Lara else if (strcmp(lgopts[option_index].name, "aad") == 0) { 1320617a7949SPablo de Lara options->aad_param = 1; 1321a061e50aSPablo de Lara options->aad.length = 1322ff5d5b01SPablo de Lara parse_bytes(options->aad.data, optarg, MAX_AAD_SIZE); 1323a061e50aSPablo de Lara if (options->aad.length > 0) 1324a061e50aSPablo de Lara return 0; 1325a061e50aSPablo de Lara else 1326a061e50aSPablo de Lara return -1; 1327a061e50aSPablo de Lara } 1328a061e50aSPablo de Lara 1329a061e50aSPablo de Lara else if (strcmp(lgopts[option_index].name, "aad_random_size") == 0) { 1330a061e50aSPablo de Lara return parse_size(&options->aad_random_size, optarg); 1331a061e50aSPablo de Lara } 1332a061e50aSPablo de Lara 1333a061e50aSPablo de Lara else if (strcmp(lgopts[option_index].name, "digest_size") == 0) { 1334a061e50aSPablo de Lara return parse_size(&options->digest_size, optarg); 1335617a7949SPablo de Lara } 1336617a7949SPablo de Lara 13371df9c010SPablo de Lara else if (strcmp(lgopts[option_index].name, "sessionless") == 0) { 1338387259bdSDeclan Doherty options->sessionless = 1; 1339387259bdSDeclan Doherty return 0; 1340387259bdSDeclan Doherty } 1341387259bdSDeclan Doherty 1342d2797f51SFan Zhang else if (strcmp(lgopts[option_index].name, "cryptodev_mask") == 0) 1343d2797f51SFan Zhang return parse_cryptodev_mask(options, optarg); 1344d2797f51SFan Zhang 1345acdfecbaSKuba Kozak else if (strcmp(lgopts[option_index].name, "mac-updating") == 0) { 1346acdfecbaSKuba Kozak options->mac_updating = 1; 1347acdfecbaSKuba Kozak return 0; 1348acdfecbaSKuba Kozak } 1349acdfecbaSKuba Kozak 1350acdfecbaSKuba Kozak else if (strcmp(lgopts[option_index].name, "no-mac-updating") == 0) { 1351acdfecbaSKuba Kozak options->mac_updating = 0; 1352acdfecbaSKuba Kozak return 0; 1353acdfecbaSKuba Kozak } 1354acdfecbaSKuba Kozak 1355387259bdSDeclan Doherty return -1; 1356387259bdSDeclan Doherty } 1357387259bdSDeclan Doherty 1358387259bdSDeclan Doherty /** Parse port mask */ 1359387259bdSDeclan Doherty static int 1360387259bdSDeclan Doherty l2fwd_crypto_parse_portmask(struct l2fwd_crypto_options *options, 1361387259bdSDeclan Doherty const char *q_arg) 1362387259bdSDeclan Doherty { 1363387259bdSDeclan Doherty char *end = NULL; 1364387259bdSDeclan Doherty unsigned long pm; 1365387259bdSDeclan Doherty 1366387259bdSDeclan Doherty /* parse hexadecimal string */ 1367387259bdSDeclan Doherty pm = strtoul(q_arg, &end, 16); 1368387259bdSDeclan Doherty if ((pm == '\0') || (end == NULL) || (*end != '\0')) 1369387259bdSDeclan Doherty pm = 0; 1370387259bdSDeclan Doherty 1371387259bdSDeclan Doherty options->portmask = pm; 1372387259bdSDeclan Doherty if (options->portmask == 0) { 1373387259bdSDeclan Doherty printf("invalid portmask specified\n"); 1374387259bdSDeclan Doherty return -1; 1375387259bdSDeclan Doherty } 1376387259bdSDeclan Doherty 1377387259bdSDeclan Doherty return pm; 1378387259bdSDeclan Doherty } 1379387259bdSDeclan Doherty 1380387259bdSDeclan Doherty /** Parse number of queues */ 1381387259bdSDeclan Doherty static int 1382387259bdSDeclan Doherty l2fwd_crypto_parse_nqueue(struct l2fwd_crypto_options *options, 1383387259bdSDeclan Doherty const char *q_arg) 1384387259bdSDeclan Doherty { 1385387259bdSDeclan Doherty char *end = NULL; 1386387259bdSDeclan Doherty unsigned long n; 1387387259bdSDeclan Doherty 1388387259bdSDeclan Doherty /* parse hexadecimal string */ 1389387259bdSDeclan Doherty n = strtoul(q_arg, &end, 10); 1390387259bdSDeclan Doherty if ((q_arg[0] == '\0') || (end == NULL) || (*end != '\0')) 1391387259bdSDeclan Doherty n = 0; 1392387259bdSDeclan Doherty else if (n >= MAX_RX_QUEUE_PER_LCORE) 1393387259bdSDeclan Doherty n = 0; 1394387259bdSDeclan Doherty 1395387259bdSDeclan Doherty options->nb_ports_per_lcore = n; 1396387259bdSDeclan Doherty if (options->nb_ports_per_lcore == 0) { 1397387259bdSDeclan Doherty printf("invalid number of ports selected\n"); 1398387259bdSDeclan Doherty return -1; 1399387259bdSDeclan Doherty } 1400387259bdSDeclan Doherty 1401387259bdSDeclan Doherty return 0; 1402387259bdSDeclan Doherty } 1403387259bdSDeclan Doherty 1404387259bdSDeclan Doherty /** Parse timer period */ 1405387259bdSDeclan Doherty static int 1406387259bdSDeclan Doherty l2fwd_crypto_parse_timer_period(struct l2fwd_crypto_options *options, 1407387259bdSDeclan Doherty const char *q_arg) 1408387259bdSDeclan Doherty { 1409387259bdSDeclan Doherty char *end = NULL; 14103c96262cSPablo de Lara unsigned long n; 1411387259bdSDeclan Doherty 1412387259bdSDeclan Doherty /* parse number string */ 14133c96262cSPablo de Lara n = (unsigned)strtol(q_arg, &end, 10); 1414387259bdSDeclan Doherty if ((q_arg[0] == '\0') || (end == NULL) || (*end != '\0')) 1415387259bdSDeclan Doherty n = 0; 1416387259bdSDeclan Doherty 1417ad509b4aSDeclan Doherty if (n >= MAX_TIMER_PERIOD) { 14183c96262cSPablo de Lara printf("Warning refresh period specified %lu is greater than " 14193c96262cSPablo de Lara "max value %lu! using max value", 1420ad509b4aSDeclan Doherty n, MAX_TIMER_PERIOD); 1421ad509b4aSDeclan Doherty n = MAX_TIMER_PERIOD; 1422ad509b4aSDeclan Doherty } 1423387259bdSDeclan Doherty 1424387259bdSDeclan Doherty options->refresh_period = n * 1000 * TIMER_MILLISECOND; 1425387259bdSDeclan Doherty 1426387259bdSDeclan Doherty return 0; 1427387259bdSDeclan Doherty } 1428387259bdSDeclan Doherty 1429387259bdSDeclan Doherty /** Generate default options for application */ 1430387259bdSDeclan Doherty static void 1431387259bdSDeclan Doherty l2fwd_crypto_default_options(struct l2fwd_crypto_options *options) 1432387259bdSDeclan Doherty { 1433387259bdSDeclan Doherty options->portmask = 0xffffffff; 1434387259bdSDeclan Doherty options->nb_ports_per_lcore = 1; 1435387259bdSDeclan Doherty options->refresh_period = 10000; 1436387259bdSDeclan Doherty options->single_lcore = 0; 14373c96262cSPablo de Lara options->sessionless = 0; 1438387259bdSDeclan Doherty 1439387259bdSDeclan Doherty options->xform_chain = L2FWD_CRYPTO_CIPHER_HASH; 1440387259bdSDeclan Doherty 1441387259bdSDeclan Doherty /* Cipher Data */ 14421bd407faSFiona Trahe options->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1443387259bdSDeclan Doherty options->cipher_xform.next = NULL; 14441df9c010SPablo de Lara options->ckey_param = 0; 1445a061e50aSPablo de Lara options->ckey_random_size = -1; 1446a061e50aSPablo de Lara options->cipher_xform.cipher.key.length = 0; 1447acf86169SPablo de Lara options->cipher_iv_param = 0; 1448acf86169SPablo de Lara options->cipher_iv_random_size = -1; 1449acf86169SPablo de Lara options->cipher_iv.length = 0; 1450387259bdSDeclan Doherty 1451387259bdSDeclan Doherty options->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 1452387259bdSDeclan Doherty options->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 1453387259bdSDeclan Doherty 1454387259bdSDeclan Doherty /* Authentication Data */ 14551bd407faSFiona Trahe options->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1456387259bdSDeclan Doherty options->auth_xform.next = NULL; 14571df9c010SPablo de Lara options->akey_param = 0; 1458a061e50aSPablo de Lara options->akey_random_size = -1; 1459a061e50aSPablo de Lara options->auth_xform.auth.key.length = 0; 1460acf86169SPablo de Lara options->auth_iv_param = 0; 1461acf86169SPablo de Lara options->auth_iv_random_size = -1; 1462acf86169SPablo de Lara options->auth_iv.length = 0; 1463387259bdSDeclan Doherty 1464387259bdSDeclan Doherty options->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 146527cf2d1bSPablo de Lara options->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 1466387259bdSDeclan Doherty 14672661f4fbSPablo de Lara /* AEAD Data */ 14682661f4fbSPablo de Lara options->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD; 14692661f4fbSPablo de Lara options->aead_xform.next = NULL; 14702661f4fbSPablo de Lara options->aead_key_param = 0; 14712661f4fbSPablo de Lara options->aead_key_random_size = -1; 14722661f4fbSPablo de Lara options->aead_xform.aead.key.length = 0; 14732661f4fbSPablo de Lara options->aead_iv_param = 0; 14742661f4fbSPablo de Lara options->aead_iv_random_size = -1; 14752661f4fbSPablo de Lara options->aead_iv.length = 0; 14762661f4fbSPablo de Lara 1477d2c4b7d3SHemant Agrawal options->aead_xform.aead.algo = RTE_CRYPTO_AEAD_AES_GCM; 1478d2c4b7d3SHemant Agrawal options->aead_xform.aead.op = RTE_CRYPTO_AEAD_OP_ENCRYPT; 1479b79e4c00SPablo de Lara 14802661f4fbSPablo de Lara options->aad_param = 0; 14812661f4fbSPablo de Lara options->aad_random_size = -1; 14822661f4fbSPablo de Lara options->aad.length = 0; 14832661f4fbSPablo de Lara 14842661f4fbSPablo de Lara options->digest_size = -1; 14852661f4fbSPablo de Lara 148627cf2d1bSPablo de Lara options->type = CDEV_TYPE_ANY; 1487d2797f51SFan Zhang options->cryptodev_mask = UINT64_MAX; 1488acdfecbaSKuba Kozak 1489acdfecbaSKuba Kozak options->mac_updating = 1; 1490387259bdSDeclan Doherty } 1491387259bdSDeclan Doherty 1492387259bdSDeclan Doherty static void 149341e97c2eSPablo de Lara display_cipher_info(struct l2fwd_crypto_options *options) 149441e97c2eSPablo de Lara { 149541e97c2eSPablo de Lara printf("\n---- Cipher information ---\n"); 149641e97c2eSPablo de Lara printf("Algorithm: %s\n", 14974790f99dSPablo de Lara rte_crypto_cipher_algorithm_strings[options->cipher_xform.cipher.algo]); 149841e97c2eSPablo de Lara rte_hexdump(stdout, "Cipher key:", 149941e97c2eSPablo de Lara options->cipher_xform.cipher.key.data, 150041e97c2eSPablo de Lara options->cipher_xform.cipher.key.length); 1501acf86169SPablo de Lara rte_hexdump(stdout, "IV:", options->cipher_iv.data, options->cipher_iv.length); 150241e97c2eSPablo de Lara } 150341e97c2eSPablo de Lara 150441e97c2eSPablo de Lara static void 150541e97c2eSPablo de Lara display_auth_info(struct l2fwd_crypto_options *options) 150641e97c2eSPablo de Lara { 150741e97c2eSPablo de Lara printf("\n---- Authentication information ---\n"); 150841e97c2eSPablo de Lara printf("Algorithm: %s\n", 15094eb45d2dSPablo de Lara rte_crypto_auth_algorithm_strings[options->auth_xform.auth.algo]); 151041e97c2eSPablo de Lara rte_hexdump(stdout, "Auth key:", 151141e97c2eSPablo de Lara options->auth_xform.auth.key.data, 151241e97c2eSPablo de Lara options->auth_xform.auth.key.length); 1513acf86169SPablo de Lara rte_hexdump(stdout, "IV:", options->auth_iv.data, options->auth_iv.length); 15142661f4fbSPablo de Lara } 15152661f4fbSPablo de Lara 15162661f4fbSPablo de Lara static void 15172661f4fbSPablo de Lara display_aead_info(struct l2fwd_crypto_options *options) 15182661f4fbSPablo de Lara { 15192661f4fbSPablo de Lara printf("\n---- AEAD information ---\n"); 15202661f4fbSPablo de Lara printf("Algorithm: %s\n", 15212661f4fbSPablo de Lara rte_crypto_aead_algorithm_strings[options->aead_xform.aead.algo]); 15222661f4fbSPablo de Lara rte_hexdump(stdout, "AEAD key:", 15232661f4fbSPablo de Lara options->aead_xform.aead.key.data, 15242661f4fbSPablo de Lara options->aead_xform.aead.key.length); 15252661f4fbSPablo de Lara rte_hexdump(stdout, "IV:", options->aead_iv.data, options->aead_iv.length); 152641e97c2eSPablo de Lara rte_hexdump(stdout, "AAD:", options->aad.data, options->aad.length); 152741e97c2eSPablo de Lara } 152841e97c2eSPablo de Lara 152941e97c2eSPablo de Lara static void 1530387259bdSDeclan Doherty l2fwd_crypto_options_print(struct l2fwd_crypto_options *options) 1531387259bdSDeclan Doherty { 153241e97c2eSPablo de Lara char string_cipher_op[MAX_STR_LEN]; 153341e97c2eSPablo de Lara char string_auth_op[MAX_STR_LEN]; 15342661f4fbSPablo de Lara char string_aead_op[MAX_STR_LEN]; 153541e97c2eSPablo de Lara 153641e97c2eSPablo de Lara if (options->cipher_xform.cipher.op == RTE_CRYPTO_CIPHER_OP_ENCRYPT) 153741e97c2eSPablo de Lara strcpy(string_cipher_op, "Encrypt"); 153841e97c2eSPablo de Lara else 153941e97c2eSPablo de Lara strcpy(string_cipher_op, "Decrypt"); 154041e97c2eSPablo de Lara 154141e97c2eSPablo de Lara if (options->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_GENERATE) 154241e97c2eSPablo de Lara strcpy(string_auth_op, "Auth generate"); 154341e97c2eSPablo de Lara else 154441e97c2eSPablo de Lara strcpy(string_auth_op, "Auth verify"); 154541e97c2eSPablo de Lara 15462661f4fbSPablo de Lara if (options->aead_xform.aead.op == RTE_CRYPTO_AEAD_OP_ENCRYPT) 15472661f4fbSPablo de Lara strcpy(string_aead_op, "Authenticated encryption"); 15482661f4fbSPablo de Lara else 15492661f4fbSPablo de Lara strcpy(string_aead_op, "Authenticated decryption"); 15502661f4fbSPablo de Lara 15512661f4fbSPablo de Lara 1552387259bdSDeclan Doherty printf("Options:-\nn"); 1553387259bdSDeclan Doherty printf("portmask: %x\n", options->portmask); 1554387259bdSDeclan Doherty printf("ports per lcore: %u\n", options->nb_ports_per_lcore); 1555387259bdSDeclan Doherty printf("refresh period : %u\n", options->refresh_period); 1556387259bdSDeclan Doherty printf("single lcore mode: %s\n", 1557387259bdSDeclan Doherty options->single_lcore ? "enabled" : "disabled"); 1558387259bdSDeclan Doherty printf("stats_printing: %s\n", 1559ad509b4aSDeclan Doherty options->refresh_period == 0 ? "disabled" : "enabled"); 1560387259bdSDeclan Doherty 1561387259bdSDeclan Doherty printf("sessionless crypto: %s\n", 1562387259bdSDeclan Doherty options->sessionless ? "enabled" : "disabled"); 156341e97c2eSPablo de Lara 156441e97c2eSPablo de Lara if (options->ckey_param && (options->ckey_random_size != -1)) 156541e97c2eSPablo de Lara printf("Cipher key already parsed, ignoring size of random key\n"); 156641e97c2eSPablo de Lara 156741e97c2eSPablo de Lara if (options->akey_param && (options->akey_random_size != -1)) 156841e97c2eSPablo de Lara printf("Auth key already parsed, ignoring size of random key\n"); 156941e97c2eSPablo de Lara 1570acf86169SPablo de Lara if (options->cipher_iv_param && (options->cipher_iv_random_size != -1)) 1571acf86169SPablo de Lara printf("Cipher IV already parsed, ignoring size of random IV\n"); 1572acf86169SPablo de Lara 1573acf86169SPablo de Lara if (options->auth_iv_param && (options->auth_iv_random_size != -1)) 1574acf86169SPablo de Lara printf("Auth IV already parsed, ignoring size of random IV\n"); 157541e97c2eSPablo de Lara 157641e97c2eSPablo de Lara if (options->aad_param && (options->aad_random_size != -1)) 157741e97c2eSPablo de Lara printf("AAD already parsed, ignoring size of random AAD\n"); 157841e97c2eSPablo de Lara 157941e97c2eSPablo de Lara printf("\nCrypto chain: "); 158041e97c2eSPablo de Lara switch (options->xform_chain) { 15812661f4fbSPablo de Lara case L2FWD_CRYPTO_AEAD: 15822661f4fbSPablo de Lara printf("Input --> %s --> Output\n", string_aead_op); 15832661f4fbSPablo de Lara display_aead_info(options); 15842661f4fbSPablo de Lara break; 158541e97c2eSPablo de Lara case L2FWD_CRYPTO_CIPHER_HASH: 158641e97c2eSPablo de Lara printf("Input --> %s --> %s --> Output\n", 158741e97c2eSPablo de Lara string_cipher_op, string_auth_op); 158841e97c2eSPablo de Lara display_cipher_info(options); 158941e97c2eSPablo de Lara display_auth_info(options); 159041e97c2eSPablo de Lara break; 159141e97c2eSPablo de Lara case L2FWD_CRYPTO_HASH_CIPHER: 159241e97c2eSPablo de Lara printf("Input --> %s --> %s --> Output\n", 159341e97c2eSPablo de Lara string_auth_op, string_cipher_op); 159441e97c2eSPablo de Lara display_cipher_info(options); 159541e97c2eSPablo de Lara display_auth_info(options); 159641e97c2eSPablo de Lara break; 159741e97c2eSPablo de Lara case L2FWD_CRYPTO_HASH_ONLY: 159841e97c2eSPablo de Lara printf("Input --> %s --> Output\n", string_auth_op); 159941e97c2eSPablo de Lara display_auth_info(options); 160041e97c2eSPablo de Lara break; 160141e97c2eSPablo de Lara case L2FWD_CRYPTO_CIPHER_ONLY: 160241e97c2eSPablo de Lara printf("Input --> %s --> Output\n", string_cipher_op); 160341e97c2eSPablo de Lara display_cipher_info(options); 160441e97c2eSPablo de Lara break; 160541e97c2eSPablo de Lara } 1606387259bdSDeclan Doherty } 1607387259bdSDeclan Doherty 1608387259bdSDeclan Doherty /* Parse the argument given in the command line of the application */ 1609387259bdSDeclan Doherty static int 1610387259bdSDeclan Doherty l2fwd_crypto_parse_args(struct l2fwd_crypto_options *options, 1611387259bdSDeclan Doherty int argc, char **argv) 1612387259bdSDeclan Doherty { 1613387259bdSDeclan Doherty int opt, retval, option_index; 1614387259bdSDeclan Doherty char **argvopt = argv, *prgname = argv[0]; 1615387259bdSDeclan Doherty 1616387259bdSDeclan Doherty static struct option lgopts[] = { 1617387259bdSDeclan Doherty { "sessionless", no_argument, 0, 0 }, 1618387259bdSDeclan Doherty 1619387259bdSDeclan Doherty { "cdev_type", required_argument, 0, 0 }, 1620387259bdSDeclan Doherty { "chain", required_argument, 0, 0 }, 1621387259bdSDeclan Doherty 1622387259bdSDeclan Doherty { "cipher_algo", required_argument, 0, 0 }, 1623387259bdSDeclan Doherty { "cipher_op", required_argument, 0, 0 }, 1624387259bdSDeclan Doherty { "cipher_key", required_argument, 0, 0 }, 1625a061e50aSPablo de Lara { "cipher_key_random_size", required_argument, 0, 0 }, 1626acf86169SPablo de Lara { "cipher_iv", required_argument, 0, 0 }, 1627acf86169SPablo de Lara { "cipher_iv_random_size", required_argument, 0, 0 }, 1628387259bdSDeclan Doherty 1629387259bdSDeclan Doherty { "auth_algo", required_argument, 0, 0 }, 1630387259bdSDeclan Doherty { "auth_op", required_argument, 0, 0 }, 1631387259bdSDeclan Doherty { "auth_key", required_argument, 0, 0 }, 1632a061e50aSPablo de Lara { "auth_key_random_size", required_argument, 0, 0 }, 1633acf86169SPablo de Lara { "auth_iv", required_argument, 0, 0 }, 1634acf86169SPablo de Lara { "auth_iv_random_size", required_argument, 0, 0 }, 1635387259bdSDeclan Doherty 16362661f4fbSPablo de Lara { "aead_algo", required_argument, 0, 0 }, 16372661f4fbSPablo de Lara { "aead_op", required_argument, 0, 0 }, 16382661f4fbSPablo de Lara { "aead_key", required_argument, 0, 0 }, 16392661f4fbSPablo de Lara { "aead_key_random_size", required_argument, 0, 0 }, 16402661f4fbSPablo de Lara { "aead_iv", required_argument, 0, 0 }, 16412661f4fbSPablo de Lara { "aead_iv_random_size", required_argument, 0, 0 }, 16422661f4fbSPablo de Lara 1643617a7949SPablo de Lara { "aad", required_argument, 0, 0 }, 1644a061e50aSPablo de Lara { "aad_random_size", required_argument, 0, 0 }, 16452661f4fbSPablo de Lara 1646a061e50aSPablo de Lara { "digest_size", required_argument, 0, 0 }, 1647387259bdSDeclan Doherty 1648387259bdSDeclan Doherty { "sessionless", no_argument, 0, 0 }, 1649d2797f51SFan Zhang { "cryptodev_mask", required_argument, 0, 0}, 16503c96262cSPablo de Lara 1651acdfecbaSKuba Kozak { "mac-updating", no_argument, 0, 0}, 1652acdfecbaSKuba Kozak { "no-mac-updating", no_argument, 0, 0}, 1653acdfecbaSKuba Kozak 1654387259bdSDeclan Doherty { NULL, 0, 0, 0 } 1655387259bdSDeclan Doherty }; 1656387259bdSDeclan Doherty 1657387259bdSDeclan Doherty l2fwd_crypto_default_options(options); 1658387259bdSDeclan Doherty 1659f1ae15baSPablo de Lara while ((opt = getopt_long(argc, argvopt, "p:q:sT:", lgopts, 1660387259bdSDeclan Doherty &option_index)) != EOF) { 1661387259bdSDeclan Doherty switch (opt) { 1662387259bdSDeclan Doherty /* long options */ 1663387259bdSDeclan Doherty case 0: 1664387259bdSDeclan Doherty retval = l2fwd_crypto_parse_args_long_options(options, 1665387259bdSDeclan Doherty lgopts, option_index); 1666387259bdSDeclan Doherty if (retval < 0) { 1667387259bdSDeclan Doherty l2fwd_crypto_usage(prgname); 1668387259bdSDeclan Doherty return -1; 1669387259bdSDeclan Doherty } 1670387259bdSDeclan Doherty break; 1671387259bdSDeclan Doherty 1672387259bdSDeclan Doherty /* portmask */ 1673387259bdSDeclan Doherty case 'p': 1674387259bdSDeclan Doherty retval = l2fwd_crypto_parse_portmask(options, optarg); 1675387259bdSDeclan Doherty if (retval < 0) { 1676387259bdSDeclan Doherty l2fwd_crypto_usage(prgname); 1677387259bdSDeclan Doherty return -1; 1678387259bdSDeclan Doherty } 1679387259bdSDeclan Doherty break; 1680387259bdSDeclan Doherty 1681387259bdSDeclan Doherty /* nqueue */ 1682387259bdSDeclan Doherty case 'q': 1683387259bdSDeclan Doherty retval = l2fwd_crypto_parse_nqueue(options, optarg); 1684387259bdSDeclan Doherty if (retval < 0) { 1685387259bdSDeclan Doherty l2fwd_crypto_usage(prgname); 1686387259bdSDeclan Doherty return -1; 1687387259bdSDeclan Doherty } 1688387259bdSDeclan Doherty break; 1689387259bdSDeclan Doherty 1690387259bdSDeclan Doherty /* single */ 1691387259bdSDeclan Doherty case 's': 1692387259bdSDeclan Doherty options->single_lcore = 1; 1693387259bdSDeclan Doherty 1694387259bdSDeclan Doherty break; 1695387259bdSDeclan Doherty 1696387259bdSDeclan Doherty /* timer period */ 1697a3380989SPablo de Lara case 'T': 1698387259bdSDeclan Doherty retval = l2fwd_crypto_parse_timer_period(options, 1699387259bdSDeclan Doherty optarg); 1700387259bdSDeclan Doherty if (retval < 0) { 1701387259bdSDeclan Doherty l2fwd_crypto_usage(prgname); 1702387259bdSDeclan Doherty return -1; 1703387259bdSDeclan Doherty } 1704387259bdSDeclan Doherty break; 1705387259bdSDeclan Doherty 1706387259bdSDeclan Doherty default: 1707387259bdSDeclan Doherty l2fwd_crypto_usage(prgname); 1708387259bdSDeclan Doherty return -1; 1709387259bdSDeclan Doherty } 1710387259bdSDeclan Doherty } 1711387259bdSDeclan Doherty 1712387259bdSDeclan Doherty 1713387259bdSDeclan Doherty if (optind >= 0) 1714387259bdSDeclan Doherty argv[optind-1] = prgname; 1715387259bdSDeclan Doherty 1716387259bdSDeclan Doherty retval = optind-1; 17179d5ca532SKeith Wiles optind = 1; /* reset getopt lib */ 1718387259bdSDeclan Doherty 1719387259bdSDeclan Doherty return retval; 1720387259bdSDeclan Doherty } 1721387259bdSDeclan Doherty 1722387259bdSDeclan Doherty /* Check the link status of all ports in up to 9s, and print them finally */ 1723387259bdSDeclan Doherty static void 17248728ccf3SThomas Monjalon check_all_ports_link_status(uint32_t port_mask) 1725387259bdSDeclan Doherty { 1726387259bdSDeclan Doherty #define CHECK_INTERVAL 100 /* 100ms */ 1727387259bdSDeclan Doherty #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */ 172847523597SZhiyong Yang uint16_t portid; 172947523597SZhiyong Yang uint8_t count, all_ports_up, print_flag = 0; 1730387259bdSDeclan Doherty struct rte_eth_link link; 1731387259bdSDeclan Doherty 1732387259bdSDeclan Doherty printf("\nChecking link status"); 1733387259bdSDeclan Doherty fflush(stdout); 1734387259bdSDeclan Doherty for (count = 0; count <= MAX_CHECK_TIME; count++) { 1735387259bdSDeclan Doherty all_ports_up = 1; 17368728ccf3SThomas Monjalon RTE_ETH_FOREACH_DEV(portid) { 1737387259bdSDeclan Doherty if ((port_mask & (1 << portid)) == 0) 1738387259bdSDeclan Doherty continue; 1739387259bdSDeclan Doherty memset(&link, 0, sizeof(link)); 1740387259bdSDeclan Doherty rte_eth_link_get_nowait(portid, &link); 1741387259bdSDeclan Doherty /* print link status if flag set */ 1742387259bdSDeclan Doherty if (print_flag == 1) { 1743387259bdSDeclan Doherty if (link.link_status) 174447523597SZhiyong Yang printf( 174547523597SZhiyong Yang "Port%d Link Up. Speed %u Mbps - %s\n", 174647523597SZhiyong Yang portid, link.link_speed, 1747387259bdSDeclan Doherty (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? 1748387259bdSDeclan Doherty ("full-duplex") : ("half-duplex\n")); 1749387259bdSDeclan Doherty else 175047523597SZhiyong Yang printf("Port %d Link Down\n", portid); 1751387259bdSDeclan Doherty continue; 1752387259bdSDeclan Doherty } 1753387259bdSDeclan Doherty /* clear all_ports_up flag if any link down */ 175409419f23SThomas Monjalon if (link.link_status == ETH_LINK_DOWN) { 1755387259bdSDeclan Doherty all_ports_up = 0; 1756387259bdSDeclan Doherty break; 1757387259bdSDeclan Doherty } 1758387259bdSDeclan Doherty } 1759387259bdSDeclan Doherty /* after finally printing all link status, get out */ 1760387259bdSDeclan Doherty if (print_flag == 1) 1761387259bdSDeclan Doherty break; 1762387259bdSDeclan Doherty 1763387259bdSDeclan Doherty if (all_ports_up == 0) { 1764387259bdSDeclan Doherty printf("."); 1765387259bdSDeclan Doherty fflush(stdout); 1766387259bdSDeclan Doherty rte_delay_ms(CHECK_INTERVAL); 1767387259bdSDeclan Doherty } 1768387259bdSDeclan Doherty 1769387259bdSDeclan Doherty /* set the print_flag if all ports up or timeout */ 1770387259bdSDeclan Doherty if (all_ports_up == 1 || count == (MAX_CHECK_TIME - 1)) { 1771387259bdSDeclan Doherty print_flag = 1; 1772387259bdSDeclan Doherty printf("done\n"); 1773387259bdSDeclan Doherty } 1774387259bdSDeclan Doherty } 1775387259bdSDeclan Doherty } 1776387259bdSDeclan Doherty 177727cf2d1bSPablo de Lara /* Check if device has to be HW/SW or any */ 1778387259bdSDeclan Doherty static int 17794baea68dSPablo de Lara check_type(const struct l2fwd_crypto_options *options, 17804baea68dSPablo de Lara const struct rte_cryptodev_info *dev_info) 178127cf2d1bSPablo de Lara { 178227cf2d1bSPablo de Lara if (options->type == CDEV_TYPE_HW && 178327cf2d1bSPablo de Lara (dev_info->feature_flags & RTE_CRYPTODEV_FF_HW_ACCELERATED)) 178427cf2d1bSPablo de Lara return 0; 178527cf2d1bSPablo de Lara if (options->type == CDEV_TYPE_SW && 178627cf2d1bSPablo de Lara !(dev_info->feature_flags & RTE_CRYPTODEV_FF_HW_ACCELERATED)) 178727cf2d1bSPablo de Lara return 0; 178827cf2d1bSPablo de Lara if (options->type == CDEV_TYPE_ANY) 178927cf2d1bSPablo de Lara return 0; 179027cf2d1bSPablo de Lara 179127cf2d1bSPablo de Lara return -1; 179227cf2d1bSPablo de Lara } 179327cf2d1bSPablo de Lara 17944baea68dSPablo de Lara static const struct rte_cryptodev_capabilities * 17954baea68dSPablo de Lara check_device_support_cipher_algo(const struct l2fwd_crypto_options *options, 17964baea68dSPablo de Lara const struct rte_cryptodev_info *dev_info, 17974baea68dSPablo de Lara uint8_t cdev_id) 17984baea68dSPablo de Lara { 17994baea68dSPablo de Lara unsigned int i = 0; 18004baea68dSPablo de Lara const struct rte_cryptodev_capabilities *cap = &dev_info->capabilities[0]; 18014baea68dSPablo de Lara enum rte_crypto_cipher_algorithm cap_cipher_algo; 18024baea68dSPablo de Lara enum rte_crypto_cipher_algorithm opt_cipher_algo = 18034baea68dSPablo de Lara options->cipher_xform.cipher.algo; 18044baea68dSPablo de Lara 18054baea68dSPablo de Lara while (cap->op != RTE_CRYPTO_OP_TYPE_UNDEFINED) { 18064baea68dSPablo de Lara cap_cipher_algo = cap->sym.cipher.algo; 18074baea68dSPablo de Lara if (cap->sym.xform_type == RTE_CRYPTO_SYM_XFORM_CIPHER) { 18084baea68dSPablo de Lara if (cap_cipher_algo == opt_cipher_algo) { 18094baea68dSPablo de Lara if (check_type(options, dev_info) == 0) 18104baea68dSPablo de Lara break; 18114baea68dSPablo de Lara } 18124baea68dSPablo de Lara } 18134baea68dSPablo de Lara cap = &dev_info->capabilities[++i]; 18144baea68dSPablo de Lara } 18154baea68dSPablo de Lara 18164baea68dSPablo de Lara if (cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) { 18174baea68dSPablo de Lara printf("Algorithm %s not supported by cryptodev %u" 18184baea68dSPablo de Lara " or device not of preferred type (%s)\n", 18194baea68dSPablo de Lara rte_crypto_cipher_algorithm_strings[opt_cipher_algo], 18204baea68dSPablo de Lara cdev_id, 18214baea68dSPablo de Lara options->string_type); 18224baea68dSPablo de Lara return NULL; 18234baea68dSPablo de Lara } 18244baea68dSPablo de Lara 18254baea68dSPablo de Lara return cap; 18264baea68dSPablo de Lara } 18274baea68dSPablo de Lara 18284baea68dSPablo de Lara static const struct rte_cryptodev_capabilities * 18294baea68dSPablo de Lara check_device_support_auth_algo(const struct l2fwd_crypto_options *options, 18304baea68dSPablo de Lara const struct rte_cryptodev_info *dev_info, 18314baea68dSPablo de Lara uint8_t cdev_id) 18324baea68dSPablo de Lara { 18334baea68dSPablo de Lara unsigned int i = 0; 18344baea68dSPablo de Lara const struct rte_cryptodev_capabilities *cap = &dev_info->capabilities[0]; 18354baea68dSPablo de Lara enum rte_crypto_auth_algorithm cap_auth_algo; 18364baea68dSPablo de Lara enum rte_crypto_auth_algorithm opt_auth_algo = 18374baea68dSPablo de Lara options->auth_xform.auth.algo; 18384baea68dSPablo de Lara 18394baea68dSPablo de Lara while (cap->op != RTE_CRYPTO_OP_TYPE_UNDEFINED) { 18404baea68dSPablo de Lara cap_auth_algo = cap->sym.auth.algo; 18414baea68dSPablo de Lara if (cap->sym.xform_type == RTE_CRYPTO_SYM_XFORM_AUTH) { 18424baea68dSPablo de Lara if (cap_auth_algo == opt_auth_algo) { 18434baea68dSPablo de Lara if (check_type(options, dev_info) == 0) 18444baea68dSPablo de Lara break; 18454baea68dSPablo de Lara } 18464baea68dSPablo de Lara } 18474baea68dSPablo de Lara cap = &dev_info->capabilities[++i]; 18484baea68dSPablo de Lara } 18494baea68dSPablo de Lara 18504baea68dSPablo de Lara if (cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) { 18514baea68dSPablo de Lara printf("Algorithm %s not supported by cryptodev %u" 18524baea68dSPablo de Lara " or device not of preferred type (%s)\n", 18534baea68dSPablo de Lara rte_crypto_auth_algorithm_strings[opt_auth_algo], 18544baea68dSPablo de Lara cdev_id, 18554baea68dSPablo de Lara options->string_type); 18564baea68dSPablo de Lara return NULL; 18574baea68dSPablo de Lara } 18584baea68dSPablo de Lara 18594baea68dSPablo de Lara return cap; 18604baea68dSPablo de Lara } 18614baea68dSPablo de Lara 18622661f4fbSPablo de Lara static const struct rte_cryptodev_capabilities * 18632661f4fbSPablo de Lara check_device_support_aead_algo(const struct l2fwd_crypto_options *options, 18642661f4fbSPablo de Lara const struct rte_cryptodev_info *dev_info, 18652661f4fbSPablo de Lara uint8_t cdev_id) 18662661f4fbSPablo de Lara { 18672661f4fbSPablo de Lara unsigned int i = 0; 18682661f4fbSPablo de Lara const struct rte_cryptodev_capabilities *cap = &dev_info->capabilities[0]; 18692661f4fbSPablo de Lara enum rte_crypto_aead_algorithm cap_aead_algo; 18702661f4fbSPablo de Lara enum rte_crypto_aead_algorithm opt_aead_algo = 18712661f4fbSPablo de Lara options->aead_xform.aead.algo; 18722661f4fbSPablo de Lara 18732661f4fbSPablo de Lara while (cap->op != RTE_CRYPTO_OP_TYPE_UNDEFINED) { 18742661f4fbSPablo de Lara cap_aead_algo = cap->sym.aead.algo; 18752661f4fbSPablo de Lara if (cap->sym.xform_type == RTE_CRYPTO_SYM_XFORM_AEAD) { 18762661f4fbSPablo de Lara if (cap_aead_algo == opt_aead_algo) { 18772661f4fbSPablo de Lara if (check_type(options, dev_info) == 0) 18782661f4fbSPablo de Lara break; 18792661f4fbSPablo de Lara } 18802661f4fbSPablo de Lara } 18812661f4fbSPablo de Lara cap = &dev_info->capabilities[++i]; 18822661f4fbSPablo de Lara } 18832661f4fbSPablo de Lara 18842661f4fbSPablo de Lara if (cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) { 18852661f4fbSPablo de Lara printf("Algorithm %s not supported by cryptodev %u" 18862661f4fbSPablo de Lara " or device not of preferred type (%s)\n", 18872661f4fbSPablo de Lara rte_crypto_aead_algorithm_strings[opt_aead_algo], 18882661f4fbSPablo de Lara cdev_id, 18892661f4fbSPablo de Lara options->string_type); 18902661f4fbSPablo de Lara return NULL; 18912661f4fbSPablo de Lara } 18922661f4fbSPablo de Lara 18932661f4fbSPablo de Lara return cap; 18942661f4fbSPablo de Lara } 18952661f4fbSPablo de Lara 1896d2797f51SFan Zhang /* Check if the device is enabled by cryptodev_mask */ 1897d2797f51SFan Zhang static int 1898d2797f51SFan Zhang check_cryptodev_mask(struct l2fwd_crypto_options *options, 1899d2797f51SFan Zhang uint8_t cdev_id) 1900d2797f51SFan Zhang { 1901d2797f51SFan Zhang if (options->cryptodev_mask & (1 << cdev_id)) 1902d2797f51SFan Zhang return 0; 1903d2797f51SFan Zhang 1904d2797f51SFan Zhang return -1; 1905d2797f51SFan Zhang } 1906d2797f51SFan Zhang 1907a061e50aSPablo de Lara static inline int 1908a061e50aSPablo de Lara check_supported_size(uint16_t length, uint16_t min, uint16_t max, 1909a061e50aSPablo de Lara uint16_t increment) 1910a061e50aSPablo de Lara { 1911a061e50aSPablo de Lara uint16_t supp_size; 1912a061e50aSPablo de Lara 191337ebd9e1SPablo de Lara /* Single value */ 191437ebd9e1SPablo de Lara if (increment == 0) { 191537ebd9e1SPablo de Lara if (length == min) 191637ebd9e1SPablo de Lara return 0; 191737ebd9e1SPablo de Lara else 191837ebd9e1SPablo de Lara return -1; 191937ebd9e1SPablo de Lara } 192037ebd9e1SPablo de Lara 192137ebd9e1SPablo de Lara /* Range of values */ 1922a061e50aSPablo de Lara for (supp_size = min; supp_size <= max; supp_size += increment) { 1923a061e50aSPablo de Lara if (length == supp_size) 1924a061e50aSPablo de Lara return 0; 1925a061e50aSPablo de Lara } 1926a061e50aSPablo de Lara 1927a061e50aSPablo de Lara return -1; 1928a061e50aSPablo de Lara } 19290fbd75a9SPablo de Lara 19300fbd75a9SPablo de Lara static int 19310fbd75a9SPablo de Lara check_iv_param(const struct rte_crypto_param_range *iv_range_size, 19320fbd75a9SPablo de Lara unsigned int iv_param, int iv_random_size, 19330fbd75a9SPablo de Lara uint16_t *iv_length) 19340fbd75a9SPablo de Lara { 19350fbd75a9SPablo de Lara /* 19360fbd75a9SPablo de Lara * Check if length of provided IV is supported 19370fbd75a9SPablo de Lara * by the algorithm chosen. 19380fbd75a9SPablo de Lara */ 19390fbd75a9SPablo de Lara if (iv_param) { 19400fbd75a9SPablo de Lara if (check_supported_size(*iv_length, 19410fbd75a9SPablo de Lara iv_range_size->min, 19420fbd75a9SPablo de Lara iv_range_size->max, 19430fbd75a9SPablo de Lara iv_range_size->increment) 19440fbd75a9SPablo de Lara != 0) { 19450fbd75a9SPablo de Lara printf("Unsupported IV length\n"); 19460fbd75a9SPablo de Lara return -1; 19470fbd75a9SPablo de Lara } 19480fbd75a9SPablo de Lara /* 19490fbd75a9SPablo de Lara * Check if length of IV to be randomly generated 19500fbd75a9SPablo de Lara * is supported by the algorithm chosen. 19510fbd75a9SPablo de Lara */ 19520fbd75a9SPablo de Lara } else if (iv_random_size != -1) { 19530fbd75a9SPablo de Lara if (check_supported_size(iv_random_size, 19540fbd75a9SPablo de Lara iv_range_size->min, 19550fbd75a9SPablo de Lara iv_range_size->max, 19560fbd75a9SPablo de Lara iv_range_size->increment) 19570fbd75a9SPablo de Lara != 0) { 19580fbd75a9SPablo de Lara printf("Unsupported IV length\n"); 19590fbd75a9SPablo de Lara return -1; 19600fbd75a9SPablo de Lara } 19610fbd75a9SPablo de Lara *iv_length = iv_random_size; 19620fbd75a9SPablo de Lara /* No size provided, use minimum size. */ 19630fbd75a9SPablo de Lara } else 19640fbd75a9SPablo de Lara *iv_length = iv_range_size->min; 19650fbd75a9SPablo de Lara 19660fbd75a9SPablo de Lara return 0; 19670fbd75a9SPablo de Lara } 19680fbd75a9SPablo de Lara 196927cf2d1bSPablo de Lara static int 197027cf2d1bSPablo de Lara initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports, 197127cf2d1bSPablo de Lara uint8_t *enabled_cdevs) 1972387259bdSDeclan Doherty { 19734baea68dSPablo de Lara unsigned int cdev_id, cdev_count, enabled_cdev_count = 0; 197427cf2d1bSPablo de Lara const struct rte_cryptodev_capabilities *cap; 19752c59bd32SSlawomir Mrozowicz unsigned int sess_sz, max_sess_sz = 0; 1976387259bdSDeclan Doherty int retval; 1977387259bdSDeclan Doherty 197827cf2d1bSPablo de Lara cdev_count = rte_cryptodev_count(); 197927cf2d1bSPablo de Lara if (cdev_count == 0) { 198027cf2d1bSPablo de Lara printf("No crypto devices available\n"); 1981387259bdSDeclan Doherty return -1; 1982387259bdSDeclan Doherty } 1983387259bdSDeclan Doherty 19842c59bd32SSlawomir Mrozowicz for (cdev_id = 0; cdev_id < cdev_count; cdev_id++) { 1985*a106fcceSPablo de Lara sess_sz = rte_cryptodev_sym_get_private_session_size(cdev_id); 19862c59bd32SSlawomir Mrozowicz if (sess_sz > max_sess_sz) 19872c59bd32SSlawomir Mrozowicz max_sess_sz = sess_sz; 19882c59bd32SSlawomir Mrozowicz } 19892c59bd32SSlawomir Mrozowicz 199027cf2d1bSPablo de Lara for (cdev_id = 0; cdev_id < cdev_count && enabled_cdev_count < nb_ports; 1991387259bdSDeclan Doherty cdev_id++) { 1992387259bdSDeclan Doherty struct rte_cryptodev_qp_conf qp_conf; 1993387259bdSDeclan Doherty struct rte_cryptodev_info dev_info; 19948dbc9bbfSPablo de Lara retval = rte_cryptodev_socket_id(cdev_id); 19958dbc9bbfSPablo de Lara 19968dbc9bbfSPablo de Lara if (retval < 0) { 19978dbc9bbfSPablo de Lara printf("Invalid crypto device id used\n"); 19988dbc9bbfSPablo de Lara return -1; 19998dbc9bbfSPablo de Lara } 20008dbc9bbfSPablo de Lara 20018dbc9bbfSPablo de Lara uint8_t socket_id = (uint8_t) retval; 2002387259bdSDeclan Doherty 2003387259bdSDeclan Doherty struct rte_cryptodev_config conf = { 2004387259bdSDeclan Doherty .nb_queue_pairs = 1, 20052c59bd32SSlawomir Mrozowicz .socket_id = socket_id, 2006387259bdSDeclan Doherty }; 2007387259bdSDeclan Doherty 2008d2797f51SFan Zhang if (check_cryptodev_mask(options, (uint8_t)cdev_id)) 2009d2797f51SFan Zhang continue; 2010d2797f51SFan Zhang 2011387259bdSDeclan Doherty rte_cryptodev_info_get(cdev_id, &dev_info); 2012387259bdSDeclan Doherty 20132c59bd32SSlawomir Mrozowicz if (session_pool_socket[socket_id] == NULL) { 20142c59bd32SSlawomir Mrozowicz char mp_name[RTE_MEMPOOL_NAMESIZE]; 20152c59bd32SSlawomir Mrozowicz struct rte_mempool *sess_mp; 20162c59bd32SSlawomir Mrozowicz 20172c59bd32SSlawomir Mrozowicz snprintf(mp_name, RTE_MEMPOOL_NAMESIZE, 20182c59bd32SSlawomir Mrozowicz "sess_mp_%u", socket_id); 20192c59bd32SSlawomir Mrozowicz 20202c59bd32SSlawomir Mrozowicz /* 20212c59bd32SSlawomir Mrozowicz * Create enough objects for session headers and 20222c59bd32SSlawomir Mrozowicz * device private data 20232c59bd32SSlawomir Mrozowicz */ 20242c59bd32SSlawomir Mrozowicz sess_mp = rte_mempool_create(mp_name, 20252c59bd32SSlawomir Mrozowicz MAX_SESSIONS * 2, 20262c59bd32SSlawomir Mrozowicz max_sess_sz, 20272c59bd32SSlawomir Mrozowicz SESSION_POOL_CACHE_SIZE, 20282c59bd32SSlawomir Mrozowicz 0, NULL, NULL, NULL, 20292c59bd32SSlawomir Mrozowicz NULL, socket_id, 20302c59bd32SSlawomir Mrozowicz 0); 20312c59bd32SSlawomir Mrozowicz 20322c59bd32SSlawomir Mrozowicz if (sess_mp == NULL) { 20332c59bd32SSlawomir Mrozowicz printf("Cannot create session pool on socket %d\n", 20342c59bd32SSlawomir Mrozowicz socket_id); 20352c59bd32SSlawomir Mrozowicz return -ENOMEM; 20362c59bd32SSlawomir Mrozowicz } 20372c59bd32SSlawomir Mrozowicz 20382c59bd32SSlawomir Mrozowicz printf("Allocated session pool on socket %d\n", socket_id); 20392c59bd32SSlawomir Mrozowicz session_pool_socket[socket_id] = sess_mp; 20402c59bd32SSlawomir Mrozowicz } 20412c59bd32SSlawomir Mrozowicz 20422661f4fbSPablo de Lara /* Set AEAD parameters */ 20432661f4fbSPablo de Lara if (options->xform_chain == L2FWD_CRYPTO_AEAD) { 20442661f4fbSPablo de Lara /* Check if device supports AEAD algo */ 20452661f4fbSPablo de Lara cap = check_device_support_aead_algo(options, &dev_info, 20462661f4fbSPablo de Lara cdev_id); 20472661f4fbSPablo de Lara if (cap == NULL) 20482661f4fbSPablo de Lara continue; 20492661f4fbSPablo de Lara 20502661f4fbSPablo de Lara options->block_size = cap->sym.aead.block_size; 20512661f4fbSPablo de Lara 20522661f4fbSPablo de Lara check_iv_param(&cap->sym.aead.iv_size, 20532661f4fbSPablo de Lara options->aead_iv_param, 20542661f4fbSPablo de Lara options->aead_iv_random_size, 20552661f4fbSPablo de Lara &options->aead_iv.length); 20562661f4fbSPablo de Lara 20572661f4fbSPablo de Lara /* 20582661f4fbSPablo de Lara * Check if length of provided AEAD key is supported 20592661f4fbSPablo de Lara * by the algorithm chosen. 20602661f4fbSPablo de Lara */ 20612661f4fbSPablo de Lara if (options->aead_key_param) { 20622661f4fbSPablo de Lara if (check_supported_size( 20632661f4fbSPablo de Lara options->aead_xform.aead.key.length, 20642661f4fbSPablo de Lara cap->sym.aead.key_size.min, 20652661f4fbSPablo de Lara cap->sym.aead.key_size.max, 20662661f4fbSPablo de Lara cap->sym.aead.key_size.increment) 20672661f4fbSPablo de Lara != 0) { 20682661f4fbSPablo de Lara printf("Unsupported aead key length\n"); 20692661f4fbSPablo de Lara return -1; 20702661f4fbSPablo de Lara } 20712661f4fbSPablo de Lara /* 20722661f4fbSPablo de Lara * Check if length of the aead key to be randomly generated 20732661f4fbSPablo de Lara * is supported by the algorithm chosen. 20742661f4fbSPablo de Lara */ 20752661f4fbSPablo de Lara } else if (options->aead_key_random_size != -1) { 2076459369fcSPablo de Lara if (check_supported_size(options->aead_key_random_size, 20772661f4fbSPablo de Lara cap->sym.aead.key_size.min, 20782661f4fbSPablo de Lara cap->sym.aead.key_size.max, 20792661f4fbSPablo de Lara cap->sym.aead.key_size.increment) 20802661f4fbSPablo de Lara != 0) { 20812661f4fbSPablo de Lara printf("Unsupported aead key length\n"); 20822661f4fbSPablo de Lara return -1; 20832661f4fbSPablo de Lara } 20842661f4fbSPablo de Lara options->aead_xform.aead.key.length = 2085459369fcSPablo de Lara options->aead_key_random_size; 20862661f4fbSPablo de Lara /* No size provided, use minimum size. */ 20872661f4fbSPablo de Lara } else 20882661f4fbSPablo de Lara options->aead_xform.aead.key.length = 20892661f4fbSPablo de Lara cap->sym.aead.key_size.min; 20902661f4fbSPablo de Lara 20912661f4fbSPablo de Lara if (!options->aead_key_param) 20922661f4fbSPablo de Lara generate_random_key( 20932661f4fbSPablo de Lara options->aead_xform.aead.key.data, 20942661f4fbSPablo de Lara options->aead_xform.aead.key.length); 20952661f4fbSPablo de Lara 20962661f4fbSPablo de Lara /* 20972661f4fbSPablo de Lara * Check if length of provided AAD is supported 20982661f4fbSPablo de Lara * by the algorithm chosen. 20992661f4fbSPablo de Lara */ 21002661f4fbSPablo de Lara if (options->aad_param) { 21012661f4fbSPablo de Lara if (check_supported_size(options->aad.length, 21022661f4fbSPablo de Lara cap->sym.aead.aad_size.min, 21032661f4fbSPablo de Lara cap->sym.aead.aad_size.max, 21042661f4fbSPablo de Lara cap->sym.aead.aad_size.increment) 21052661f4fbSPablo de Lara != 0) { 21062661f4fbSPablo de Lara printf("Unsupported AAD length\n"); 21072661f4fbSPablo de Lara return -1; 21082661f4fbSPablo de Lara } 21092661f4fbSPablo de Lara /* 21102661f4fbSPablo de Lara * Check if length of AAD to be randomly generated 21112661f4fbSPablo de Lara * is supported by the algorithm chosen. 21122661f4fbSPablo de Lara */ 21132661f4fbSPablo de Lara } else if (options->aad_random_size != -1) { 21142661f4fbSPablo de Lara if (check_supported_size(options->aad_random_size, 21152661f4fbSPablo de Lara cap->sym.aead.aad_size.min, 21162661f4fbSPablo de Lara cap->sym.aead.aad_size.max, 21172661f4fbSPablo de Lara cap->sym.aead.aad_size.increment) 21182661f4fbSPablo de Lara != 0) { 21192661f4fbSPablo de Lara printf("Unsupported AAD length\n"); 21202661f4fbSPablo de Lara return -1; 21212661f4fbSPablo de Lara } 21222661f4fbSPablo de Lara options->aad.length = options->aad_random_size; 21232661f4fbSPablo de Lara /* No size provided, use minimum size. */ 21242661f4fbSPablo de Lara } else 21252661f4fbSPablo de Lara options->aad.length = cap->sym.auth.aad_size.min; 21262661f4fbSPablo de Lara 212746a0547fSPablo de Lara options->aead_xform.aead.aad_length = 21282661f4fbSPablo de Lara options->aad.length; 21292661f4fbSPablo de Lara 21302661f4fbSPablo de Lara /* Check if digest size is supported by the algorithm. */ 21312661f4fbSPablo de Lara if (options->digest_size != -1) { 21322661f4fbSPablo de Lara if (check_supported_size(options->digest_size, 21332661f4fbSPablo de Lara cap->sym.aead.digest_size.min, 21342661f4fbSPablo de Lara cap->sym.aead.digest_size.max, 21352661f4fbSPablo de Lara cap->sym.aead.digest_size.increment) 21362661f4fbSPablo de Lara != 0) { 21372661f4fbSPablo de Lara printf("Unsupported digest length\n"); 21382661f4fbSPablo de Lara return -1; 21392661f4fbSPablo de Lara } 21402661f4fbSPablo de Lara options->aead_xform.aead.digest_length = 21412661f4fbSPablo de Lara options->digest_size; 21422661f4fbSPablo de Lara /* No size provided, use minimum size. */ 21432661f4fbSPablo de Lara } else 21442661f4fbSPablo de Lara options->aead_xform.aead.digest_length = 21452661f4fbSPablo de Lara cap->sym.aead.digest_size.min; 21462661f4fbSPablo de Lara } 21472661f4fbSPablo de Lara 214827cf2d1bSPablo de Lara /* Set cipher parameters */ 214927cf2d1bSPablo de Lara if (options->xform_chain == L2FWD_CRYPTO_CIPHER_HASH || 215027cf2d1bSPablo de Lara options->xform_chain == L2FWD_CRYPTO_HASH_CIPHER || 215127cf2d1bSPablo de Lara options->xform_chain == L2FWD_CRYPTO_CIPHER_ONLY) { 215227cf2d1bSPablo de Lara /* Check if device supports cipher algo */ 21534baea68dSPablo de Lara cap = check_device_support_cipher_algo(options, &dev_info, 21544baea68dSPablo de Lara cdev_id); 21554baea68dSPablo de Lara if (cap == NULL) 215627cf2d1bSPablo de Lara continue; 215727cf2d1bSPablo de Lara 215827cf2d1bSPablo de Lara options->block_size = cap->sym.cipher.block_size; 21590fbd75a9SPablo de Lara 2160acf86169SPablo de Lara check_iv_param(&cap->sym.cipher.iv_size, 2161acf86169SPablo de Lara options->cipher_iv_param, 2162acf86169SPablo de Lara options->cipher_iv_random_size, 2163acf86169SPablo de Lara &options->cipher_iv.length); 2164a061e50aSPablo de Lara 2165a061e50aSPablo de Lara /* 2166a061e50aSPablo de Lara * Check if length of provided cipher key is supported 2167a061e50aSPablo de Lara * by the algorithm chosen. 2168a061e50aSPablo de Lara */ 2169a061e50aSPablo de Lara if (options->ckey_param) { 2170a061e50aSPablo de Lara if (check_supported_size( 2171a061e50aSPablo de Lara options->cipher_xform.cipher.key.length, 2172a061e50aSPablo de Lara cap->sym.cipher.key_size.min, 2173a061e50aSPablo de Lara cap->sym.cipher.key_size.max, 2174a061e50aSPablo de Lara cap->sym.cipher.key_size.increment) 2175a061e50aSPablo de Lara != 0) { 2176a061e50aSPablo de Lara printf("Unsupported cipher key length\n"); 2177a061e50aSPablo de Lara return -1; 2178a061e50aSPablo de Lara } 2179a061e50aSPablo de Lara /* 2180a061e50aSPablo de Lara * Check if length of the cipher key to be randomly generated 2181a061e50aSPablo de Lara * is supported by the algorithm chosen. 2182a061e50aSPablo de Lara */ 2183a061e50aSPablo de Lara } else if (options->ckey_random_size != -1) { 2184a061e50aSPablo de Lara if (check_supported_size(options->ckey_random_size, 2185a061e50aSPablo de Lara cap->sym.cipher.key_size.min, 2186a061e50aSPablo de Lara cap->sym.cipher.key_size.max, 2187a061e50aSPablo de Lara cap->sym.cipher.key_size.increment) 2188a061e50aSPablo de Lara != 0) { 2189a061e50aSPablo de Lara printf("Unsupported cipher key length\n"); 2190a061e50aSPablo de Lara return -1; 2191a061e50aSPablo de Lara } 2192a061e50aSPablo de Lara options->cipher_xform.cipher.key.length = 2193a061e50aSPablo de Lara options->ckey_random_size; 2194a061e50aSPablo de Lara /* No size provided, use minimum size. */ 2195a061e50aSPablo de Lara } else 219627cf2d1bSPablo de Lara options->cipher_xform.cipher.key.length = 219727cf2d1bSPablo de Lara cap->sym.cipher.key_size.min; 2198a061e50aSPablo de Lara 219927cf2d1bSPablo de Lara if (!options->ckey_param) 220027cf2d1bSPablo de Lara generate_random_key( 220127cf2d1bSPablo de Lara options->cipher_xform.cipher.key.data, 220227cf2d1bSPablo de Lara options->cipher_xform.cipher.key.length); 220327cf2d1bSPablo de Lara 220427cf2d1bSPablo de Lara } 220527cf2d1bSPablo de Lara 220627cf2d1bSPablo de Lara /* Set auth parameters */ 220727cf2d1bSPablo de Lara if (options->xform_chain == L2FWD_CRYPTO_CIPHER_HASH || 220827cf2d1bSPablo de Lara options->xform_chain == L2FWD_CRYPTO_HASH_CIPHER || 220927cf2d1bSPablo de Lara options->xform_chain == L2FWD_CRYPTO_HASH_ONLY) { 221027cf2d1bSPablo de Lara /* Check if device supports auth algo */ 22114baea68dSPablo de Lara cap = check_device_support_auth_algo(options, &dev_info, 22124baea68dSPablo de Lara cdev_id); 22134baea68dSPablo de Lara if (cap == NULL) 221427cf2d1bSPablo de Lara continue; 221527cf2d1bSPablo de Lara 2216acf86169SPablo de Lara check_iv_param(&cap->sym.auth.iv_size, 2217acf86169SPablo de Lara options->auth_iv_param, 2218acf86169SPablo de Lara options->auth_iv_random_size, 2219acf86169SPablo de Lara &options->auth_iv.length); 2220a061e50aSPablo de Lara /* 2221a061e50aSPablo de Lara * Check if length of provided auth key is supported 2222a061e50aSPablo de Lara * by the algorithm chosen. 2223a061e50aSPablo de Lara */ 2224a061e50aSPablo de Lara if (options->akey_param) { 2225a061e50aSPablo de Lara if (check_supported_size( 2226a061e50aSPablo de Lara options->auth_xform.auth.key.length, 2227a061e50aSPablo de Lara cap->sym.auth.key_size.min, 2228a061e50aSPablo de Lara cap->sym.auth.key_size.max, 2229a061e50aSPablo de Lara cap->sym.auth.key_size.increment) 2230a061e50aSPablo de Lara != 0) { 2231a061e50aSPablo de Lara printf("Unsupported auth key length\n"); 2232a061e50aSPablo de Lara return -1; 2233a061e50aSPablo de Lara } 2234a061e50aSPablo de Lara /* 2235a061e50aSPablo de Lara * Check if length of the auth key to be randomly generated 2236a061e50aSPablo de Lara * is supported by the algorithm chosen. 2237a061e50aSPablo de Lara */ 2238a061e50aSPablo de Lara } else if (options->akey_random_size != -1) { 2239a061e50aSPablo de Lara if (check_supported_size(options->akey_random_size, 2240a061e50aSPablo de Lara cap->sym.auth.key_size.min, 2241a061e50aSPablo de Lara cap->sym.auth.key_size.max, 2242a061e50aSPablo de Lara cap->sym.auth.key_size.increment) 2243a061e50aSPablo de Lara != 0) { 2244a061e50aSPablo de Lara printf("Unsupported auth key length\n"); 2245a061e50aSPablo de Lara return -1; 2246a061e50aSPablo de Lara } 2247a061e50aSPablo de Lara options->auth_xform.auth.key.length = 2248a061e50aSPablo de Lara options->akey_random_size; 2249a061e50aSPablo de Lara /* No size provided, use minimum size. */ 2250a061e50aSPablo de Lara } else 225127cf2d1bSPablo de Lara options->auth_xform.auth.key.length = 225227cf2d1bSPablo de Lara cap->sym.auth.key_size.min; 225327cf2d1bSPablo de Lara 225427cf2d1bSPablo de Lara if (!options->akey_param) 225527cf2d1bSPablo de Lara generate_random_key( 225627cf2d1bSPablo de Lara options->auth_xform.auth.key.data, 225727cf2d1bSPablo de Lara options->auth_xform.auth.key.length); 2258a061e50aSPablo de Lara 2259a061e50aSPablo de Lara /* Check if digest size is supported by the algorithm. */ 2260a061e50aSPablo de Lara if (options->digest_size != -1) { 2261a061e50aSPablo de Lara if (check_supported_size(options->digest_size, 2262a061e50aSPablo de Lara cap->sym.auth.digest_size.min, 2263a061e50aSPablo de Lara cap->sym.auth.digest_size.max, 2264a061e50aSPablo de Lara cap->sym.auth.digest_size.increment) 2265a061e50aSPablo de Lara != 0) { 2266a061e50aSPablo de Lara printf("Unsupported digest length\n"); 2267a061e50aSPablo de Lara return -1; 2268a061e50aSPablo de Lara } 2269a061e50aSPablo de Lara options->auth_xform.auth.digest_length = 2270a061e50aSPablo de Lara options->digest_size; 2271a061e50aSPablo de Lara /* No size provided, use minimum size. */ 2272a061e50aSPablo de Lara } else 2273a061e50aSPablo de Lara options->auth_xform.auth.digest_length = 2274a061e50aSPablo de Lara cap->sym.auth.digest_size.min; 227527cf2d1bSPablo de Lara } 2276387259bdSDeclan Doherty 2277f7db6f82SPablo de Lara retval = rte_cryptodev_configure(cdev_id, &conf); 2278387259bdSDeclan Doherty if (retval < 0) { 2279387259bdSDeclan Doherty printf("Failed to configure cryptodev %u", cdev_id); 2280387259bdSDeclan Doherty return -1; 2281387259bdSDeclan Doherty } 2282387259bdSDeclan Doherty 2283387259bdSDeclan Doherty qp_conf.nb_descriptors = 2048; 2284387259bdSDeclan Doherty 2285387259bdSDeclan Doherty retval = rte_cryptodev_queue_pair_setup(cdev_id, 0, &qp_conf, 2286f7db6f82SPablo de Lara socket_id, session_pool_socket[socket_id]); 2287387259bdSDeclan Doherty if (retval < 0) { 2288387259bdSDeclan Doherty printf("Failed to setup queue pair %u on cryptodev %u", 2289387259bdSDeclan Doherty 0, cdev_id); 2290387259bdSDeclan Doherty return -1; 2291387259bdSDeclan Doherty } 2292387259bdSDeclan Doherty 2293800386e6SHemant Agrawal retval = rte_cryptodev_start(cdev_id); 2294800386e6SHemant Agrawal if (retval < 0) { 2295800386e6SHemant Agrawal printf("Failed to start device %u: error %d\n", 2296800386e6SHemant Agrawal cdev_id, retval); 2297800386e6SHemant Agrawal return -1; 2298800386e6SHemant Agrawal } 2299800386e6SHemant Agrawal 2300ad476dd3SPablo de Lara l2fwd_enabled_crypto_mask |= (((uint64_t)1) << cdev_id); 2301387259bdSDeclan Doherty 230227cf2d1bSPablo de Lara enabled_cdevs[cdev_id] = 1; 2303387259bdSDeclan Doherty enabled_cdev_count++; 2304387259bdSDeclan Doherty } 2305387259bdSDeclan Doherty 2306387259bdSDeclan Doherty return enabled_cdev_count; 2307387259bdSDeclan Doherty } 2308387259bdSDeclan Doherty 2309387259bdSDeclan Doherty static int 2310387259bdSDeclan Doherty initialize_ports(struct l2fwd_crypto_options *options) 2311387259bdSDeclan Doherty { 23128728ccf3SThomas Monjalon uint16_t last_portid = 0, portid; 2313387259bdSDeclan Doherty unsigned enabled_portcount = 0; 2314d9a42a69SThomas Monjalon unsigned nb_ports = rte_eth_dev_count_avail(); 2315387259bdSDeclan Doherty 2316387259bdSDeclan Doherty if (nb_ports == 0) { 2317387259bdSDeclan Doherty printf("No Ethernet ports - bye\n"); 2318387259bdSDeclan Doherty return -1; 2319387259bdSDeclan Doherty } 2320387259bdSDeclan Doherty 2321387259bdSDeclan Doherty /* Reset l2fwd_dst_ports */ 2322387259bdSDeclan Doherty for (portid = 0; portid < RTE_MAX_ETHPORTS; portid++) 2323387259bdSDeclan Doherty l2fwd_dst_ports[portid] = 0; 2324387259bdSDeclan Doherty 23258728ccf3SThomas Monjalon RTE_ETH_FOREACH_DEV(portid) { 2326387259bdSDeclan Doherty int retval; 2327f2b713e3SShahaf Shuler struct rte_eth_dev_info dev_info; 2328f2b713e3SShahaf Shuler struct rte_eth_rxconf rxq_conf; 2329f2b713e3SShahaf Shuler struct rte_eth_txconf txq_conf; 2330f2b713e3SShahaf Shuler struct rte_eth_conf local_port_conf = port_conf; 2331387259bdSDeclan Doherty 2332387259bdSDeclan Doherty /* Skip ports that are not enabled */ 2333387259bdSDeclan Doherty if ((options->portmask & (1 << portid)) == 0) 2334387259bdSDeclan Doherty continue; 2335387259bdSDeclan Doherty 2336387259bdSDeclan Doherty /* init port */ 2337e2cdfbd0SZhiyong Yang printf("Initializing port %u... ", portid); 2338387259bdSDeclan Doherty fflush(stdout); 2339f2b713e3SShahaf Shuler rte_eth_dev_info_get(portid, &dev_info); 2340f2b713e3SShahaf Shuler if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE) 2341f2b713e3SShahaf Shuler local_port_conf.txmode.offloads |= 2342f2b713e3SShahaf Shuler DEV_TX_OFFLOAD_MBUF_FAST_FREE; 2343f2b713e3SShahaf Shuler retval = rte_eth_dev_configure(portid, 1, 1, &local_port_conf); 2344387259bdSDeclan Doherty if (retval < 0) { 2345387259bdSDeclan Doherty printf("Cannot configure device: err=%d, port=%u\n", 2346e2cdfbd0SZhiyong Yang retval, portid); 2347387259bdSDeclan Doherty return -1; 2348387259bdSDeclan Doherty } 2349387259bdSDeclan Doherty 235060efb44fSRoman Zhukov retval = rte_eth_dev_adjust_nb_rx_tx_desc(portid, &nb_rxd, 235160efb44fSRoman Zhukov &nb_txd); 235260efb44fSRoman Zhukov if (retval < 0) { 235360efb44fSRoman Zhukov printf("Cannot adjust number of descriptors: err=%d, port=%u\n", 2354e2cdfbd0SZhiyong Yang retval, portid); 235560efb44fSRoman Zhukov return -1; 235660efb44fSRoman Zhukov } 235760efb44fSRoman Zhukov 2358387259bdSDeclan Doherty /* init one RX queue */ 2359387259bdSDeclan Doherty fflush(stdout); 2360f2b713e3SShahaf Shuler rxq_conf = dev_info.default_rxconf; 2361f2b713e3SShahaf Shuler rxq_conf.offloads = local_port_conf.rxmode.offloads; 2362387259bdSDeclan Doherty retval = rte_eth_rx_queue_setup(portid, 0, nb_rxd, 2363387259bdSDeclan Doherty rte_eth_dev_socket_id(portid), 2364f2b713e3SShahaf Shuler &rxq_conf, l2fwd_pktmbuf_pool); 2365387259bdSDeclan Doherty if (retval < 0) { 2366387259bdSDeclan Doherty printf("rte_eth_rx_queue_setup:err=%d, port=%u\n", 2367e2cdfbd0SZhiyong Yang retval, portid); 2368387259bdSDeclan Doherty return -1; 2369387259bdSDeclan Doherty } 2370387259bdSDeclan Doherty 2371387259bdSDeclan Doherty /* init one TX queue on each port */ 2372387259bdSDeclan Doherty fflush(stdout); 2373f2b713e3SShahaf Shuler txq_conf = dev_info.default_txconf; 2374f2b713e3SShahaf Shuler txq_conf.txq_flags = ETH_TXQ_FLAGS_IGNORE; 2375f2b713e3SShahaf Shuler txq_conf.offloads = local_port_conf.txmode.offloads; 2376387259bdSDeclan Doherty retval = rte_eth_tx_queue_setup(portid, 0, nb_txd, 2377387259bdSDeclan Doherty rte_eth_dev_socket_id(portid), 2378f2b713e3SShahaf Shuler &txq_conf); 2379387259bdSDeclan Doherty if (retval < 0) { 2380387259bdSDeclan Doherty printf("rte_eth_tx_queue_setup:err=%d, port=%u\n", 2381e2cdfbd0SZhiyong Yang retval, portid); 2382387259bdSDeclan Doherty 2383387259bdSDeclan Doherty return -1; 2384387259bdSDeclan Doherty } 2385387259bdSDeclan Doherty 2386387259bdSDeclan Doherty /* Start device */ 2387387259bdSDeclan Doherty retval = rte_eth_dev_start(portid); 2388387259bdSDeclan Doherty if (retval < 0) { 2389387259bdSDeclan Doherty printf("rte_eth_dev_start:err=%d, port=%u\n", 2390e2cdfbd0SZhiyong Yang retval, portid); 2391387259bdSDeclan Doherty return -1; 2392387259bdSDeclan Doherty } 2393387259bdSDeclan Doherty 2394387259bdSDeclan Doherty rte_eth_promiscuous_enable(portid); 2395387259bdSDeclan Doherty 2396387259bdSDeclan Doherty rte_eth_macaddr_get(portid, &l2fwd_ports_eth_addr[portid]); 2397387259bdSDeclan Doherty 2398387259bdSDeclan Doherty printf("Port %u, MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n\n", 2399e2cdfbd0SZhiyong Yang portid, 2400387259bdSDeclan Doherty l2fwd_ports_eth_addr[portid].addr_bytes[0], 2401387259bdSDeclan Doherty l2fwd_ports_eth_addr[portid].addr_bytes[1], 2402387259bdSDeclan Doherty l2fwd_ports_eth_addr[portid].addr_bytes[2], 2403387259bdSDeclan Doherty l2fwd_ports_eth_addr[portid].addr_bytes[3], 2404387259bdSDeclan Doherty l2fwd_ports_eth_addr[portid].addr_bytes[4], 2405387259bdSDeclan Doherty l2fwd_ports_eth_addr[portid].addr_bytes[5]); 2406387259bdSDeclan Doherty 2407387259bdSDeclan Doherty /* initialize port stats */ 2408387259bdSDeclan Doherty memset(&port_statistics, 0, sizeof(port_statistics)); 2409387259bdSDeclan Doherty 2410387259bdSDeclan Doherty /* Setup port forwarding table */ 2411387259bdSDeclan Doherty if (enabled_portcount % 2) { 2412387259bdSDeclan Doherty l2fwd_dst_ports[portid] = last_portid; 2413387259bdSDeclan Doherty l2fwd_dst_ports[last_portid] = portid; 2414387259bdSDeclan Doherty } else { 2415387259bdSDeclan Doherty last_portid = portid; 2416387259bdSDeclan Doherty } 2417387259bdSDeclan Doherty 2418387259bdSDeclan Doherty l2fwd_enabled_port_mask |= (1 << portid); 2419387259bdSDeclan Doherty enabled_portcount++; 2420387259bdSDeclan Doherty } 2421387259bdSDeclan Doherty 2422387259bdSDeclan Doherty if (enabled_portcount == 1) { 2423387259bdSDeclan Doherty l2fwd_dst_ports[last_portid] = last_portid; 2424387259bdSDeclan Doherty } else if (enabled_portcount % 2) { 2425387259bdSDeclan Doherty printf("odd number of ports in portmask- bye\n"); 2426387259bdSDeclan Doherty return -1; 2427387259bdSDeclan Doherty } 2428387259bdSDeclan Doherty 24298728ccf3SThomas Monjalon check_all_ports_link_status(l2fwd_enabled_port_mask); 2430387259bdSDeclan Doherty 2431387259bdSDeclan Doherty return enabled_portcount; 2432387259bdSDeclan Doherty } 2433387259bdSDeclan Doherty 24341df9c010SPablo de Lara static void 24351df9c010SPablo de Lara reserve_key_memory(struct l2fwd_crypto_options *options) 24361df9c010SPablo de Lara { 24371df9c010SPablo de Lara options->cipher_xform.cipher.key.data = rte_malloc("crypto key", 24381df9c010SPablo de Lara MAX_KEY_SIZE, 0); 24391df9c010SPablo de Lara if (options->cipher_xform.cipher.key.data == NULL) 24401df9c010SPablo de Lara rte_exit(EXIT_FAILURE, "Failed to allocate memory for cipher key"); 24411df9c010SPablo de Lara 24421df9c010SPablo de Lara options->auth_xform.auth.key.data = rte_malloc("auth key", 24431df9c010SPablo de Lara MAX_KEY_SIZE, 0); 24441df9c010SPablo de Lara if (options->auth_xform.auth.key.data == NULL) 24451df9c010SPablo de Lara rte_exit(EXIT_FAILURE, "Failed to allocate memory for auth key"); 24461df9c010SPablo de Lara 24472661f4fbSPablo de Lara options->aead_xform.aead.key.data = rte_malloc("aead key", 24482661f4fbSPablo de Lara MAX_KEY_SIZE, 0); 24492661f4fbSPablo de Lara if (options->aead_xform.aead.key.data == NULL) 24502661f4fbSPablo de Lara rte_exit(EXIT_FAILURE, "Failed to allocate memory for AEAD key"); 24512661f4fbSPablo de Lara 2452acf86169SPablo de Lara options->cipher_iv.data = rte_malloc("cipher iv", MAX_KEY_SIZE, 0); 2453acf86169SPablo de Lara if (options->cipher_iv.data == NULL) 2454acf86169SPablo de Lara rte_exit(EXIT_FAILURE, "Failed to allocate memory for cipher IV"); 2455acf86169SPablo de Lara 2456acf86169SPablo de Lara options->auth_iv.data = rte_malloc("auth iv", MAX_KEY_SIZE, 0); 2457acf86169SPablo de Lara if (options->auth_iv.data == NULL) 2458acf86169SPablo de Lara rte_exit(EXIT_FAILURE, "Failed to allocate memory for auth IV"); 2459617a7949SPablo de Lara 24602661f4fbSPablo de Lara options->aead_iv.data = rte_malloc("aead_iv", MAX_KEY_SIZE, 0); 24612661f4fbSPablo de Lara if (options->aead_iv.data == NULL) 24622661f4fbSPablo de Lara rte_exit(EXIT_FAILURE, "Failed to allocate memory for AEAD iv"); 24632661f4fbSPablo de Lara 2464617a7949SPablo de Lara options->aad.data = rte_malloc("aad", MAX_KEY_SIZE, 0); 2465617a7949SPablo de Lara if (options->aad.data == NULL) 2466617a7949SPablo de Lara rte_exit(EXIT_FAILURE, "Failed to allocate memory for AAD"); 246787cf4c6cSThomas Monjalon options->aad.phys_addr = rte_malloc_virt2iova(options->aad.data); 24681df9c010SPablo de Lara } 24691df9c010SPablo de Lara 2470387259bdSDeclan Doherty int 2471387259bdSDeclan Doherty main(int argc, char **argv) 2472387259bdSDeclan Doherty { 24738728ccf3SThomas Monjalon struct lcore_queue_conf *qconf = NULL; 2474387259bdSDeclan Doherty struct l2fwd_crypto_options options; 2475387259bdSDeclan Doherty 2476e2cdfbd0SZhiyong Yang uint8_t nb_cryptodevs, cdev_id; 24778728ccf3SThomas Monjalon uint16_t portid; 24788728ccf3SThomas Monjalon unsigned lcore_id, rx_lcore_id = 0; 2479387259bdSDeclan Doherty int ret, enabled_cdevcount, enabled_portcount; 248027cf2d1bSPablo de Lara uint8_t enabled_cdevs[RTE_CRYPTO_MAX_DEVS] = {0}; 2481387259bdSDeclan Doherty 2482387259bdSDeclan Doherty /* init EAL */ 2483387259bdSDeclan Doherty ret = rte_eal_init(argc, argv); 2484387259bdSDeclan Doherty if (ret < 0) 2485387259bdSDeclan Doherty rte_exit(EXIT_FAILURE, "Invalid EAL arguments\n"); 2486387259bdSDeclan Doherty argc -= ret; 2487387259bdSDeclan Doherty argv += ret; 2488387259bdSDeclan Doherty 24891df9c010SPablo de Lara /* reserve memory for Cipher/Auth key and IV */ 24901df9c010SPablo de Lara reserve_key_memory(&options); 24911df9c010SPablo de Lara 2492387259bdSDeclan Doherty /* parse application arguments (after the EAL ones) */ 2493387259bdSDeclan Doherty ret = l2fwd_crypto_parse_args(&options, argc, argv); 2494387259bdSDeclan Doherty if (ret < 0) 2495387259bdSDeclan Doherty rte_exit(EXIT_FAILURE, "Invalid L2FWD-CRYPTO arguments\n"); 2496387259bdSDeclan Doherty 2497acdfecbaSKuba Kozak printf("MAC updating %s\n", 2498acdfecbaSKuba Kozak options.mac_updating ? "enabled" : "disabled"); 2499acdfecbaSKuba Kozak 2500387259bdSDeclan Doherty /* create the mbuf pool */ 2501c0f87eb5SDeclan Doherty l2fwd_pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", NB_MBUF, 512, 2502c0f87eb5SDeclan Doherty sizeof(struct rte_crypto_op), 2503c0f87eb5SDeclan Doherty RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id()); 2504387259bdSDeclan Doherty if (l2fwd_pktmbuf_pool == NULL) 2505387259bdSDeclan Doherty rte_exit(EXIT_FAILURE, "Cannot create mbuf pool\n"); 2506387259bdSDeclan Doherty 2507387259bdSDeclan Doherty /* create crypto op pool */ 2508c0f87eb5SDeclan Doherty l2fwd_crypto_op_pool = rte_crypto_op_pool_create("crypto_op_pool", 2509e636243eSPablo de Lara RTE_CRYPTO_OP_TYPE_SYMMETRIC, NB_MBUF, 128, MAXIMUM_IV_LENGTH, 2510c0f87eb5SDeclan Doherty rte_socket_id()); 2511c0f87eb5SDeclan Doherty if (l2fwd_crypto_op_pool == NULL) 2512387259bdSDeclan Doherty rte_exit(EXIT_FAILURE, "Cannot create crypto op pool\n"); 2513387259bdSDeclan Doherty 2514387259bdSDeclan Doherty /* Enable Ethernet ports */ 2515387259bdSDeclan Doherty enabled_portcount = initialize_ports(&options); 2516387259bdSDeclan Doherty if (enabled_portcount < 1) 2517387259bdSDeclan Doherty rte_exit(EXIT_FAILURE, "Failed to initial Ethernet ports\n"); 2518387259bdSDeclan Doherty 2519387259bdSDeclan Doherty /* Initialize the port/queue configuration of each logical core */ 25208728ccf3SThomas Monjalon RTE_ETH_FOREACH_DEV(portid) { 2521387259bdSDeclan Doherty 2522387259bdSDeclan Doherty /* skip ports that are not enabled */ 2523387259bdSDeclan Doherty if ((options.portmask & (1 << portid)) == 0) 2524387259bdSDeclan Doherty continue; 2525387259bdSDeclan Doherty 2526387259bdSDeclan Doherty if (options.single_lcore && qconf == NULL) { 2527387259bdSDeclan Doherty while (rte_lcore_is_enabled(rx_lcore_id) == 0) { 2528387259bdSDeclan Doherty rx_lcore_id++; 2529387259bdSDeclan Doherty if (rx_lcore_id >= RTE_MAX_LCORE) 2530387259bdSDeclan Doherty rte_exit(EXIT_FAILURE, 2531387259bdSDeclan Doherty "Not enough cores\n"); 2532387259bdSDeclan Doherty } 2533387259bdSDeclan Doherty } else if (!options.single_lcore) { 2534387259bdSDeclan Doherty /* get the lcore_id for this port */ 2535387259bdSDeclan Doherty while (rte_lcore_is_enabled(rx_lcore_id) == 0 || 2536387259bdSDeclan Doherty lcore_queue_conf[rx_lcore_id].nb_rx_ports == 2537387259bdSDeclan Doherty options.nb_ports_per_lcore) { 2538387259bdSDeclan Doherty rx_lcore_id++; 2539387259bdSDeclan Doherty if (rx_lcore_id >= RTE_MAX_LCORE) 2540387259bdSDeclan Doherty rte_exit(EXIT_FAILURE, 2541387259bdSDeclan Doherty "Not enough cores\n"); 2542387259bdSDeclan Doherty } 2543387259bdSDeclan Doherty } 2544387259bdSDeclan Doherty 2545387259bdSDeclan Doherty /* Assigned a new logical core in the loop above. */ 2546387259bdSDeclan Doherty if (qconf != &lcore_queue_conf[rx_lcore_id]) 2547387259bdSDeclan Doherty qconf = &lcore_queue_conf[rx_lcore_id]; 2548387259bdSDeclan Doherty 2549387259bdSDeclan Doherty qconf->rx_port_list[qconf->nb_rx_ports] = portid; 2550387259bdSDeclan Doherty qconf->nb_rx_ports++; 2551387259bdSDeclan Doherty 2552e2cdfbd0SZhiyong Yang printf("Lcore %u: RX port %u\n", rx_lcore_id, portid); 2553387259bdSDeclan Doherty } 2554387259bdSDeclan Doherty 2555387259bdSDeclan Doherty /* Enable Crypto devices */ 255627cf2d1bSPablo de Lara enabled_cdevcount = initialize_cryptodevs(&options, enabled_portcount, 255727cf2d1bSPablo de Lara enabled_cdevs); 255827cf2d1bSPablo de Lara if (enabled_cdevcount < 0) 255927cf2d1bSPablo de Lara rte_exit(EXIT_FAILURE, "Failed to initialize crypto devices\n"); 256027cf2d1bSPablo de Lara 256127cf2d1bSPablo de Lara if (enabled_cdevcount < enabled_portcount) 256227cf2d1bSPablo de Lara rte_exit(EXIT_FAILURE, "Number of capable crypto devices (%d) " 256327cf2d1bSPablo de Lara "has to be more or equal to number of ports (%d)\n", 256427cf2d1bSPablo de Lara enabled_cdevcount, enabled_portcount); 2565387259bdSDeclan Doherty 2566387259bdSDeclan Doherty nb_cryptodevs = rte_cryptodev_count(); 256727cf2d1bSPablo de Lara 256827cf2d1bSPablo de Lara /* Initialize the port/cryptodev configuration of each logical core */ 2569387259bdSDeclan Doherty for (rx_lcore_id = 0, qconf = NULL, cdev_id = 0; 2570387259bdSDeclan Doherty cdev_id < nb_cryptodevs && enabled_cdevcount; 2571387259bdSDeclan Doherty cdev_id++) { 257227cf2d1bSPablo de Lara /* Crypto op not supported by crypto device */ 257327cf2d1bSPablo de Lara if (!enabled_cdevs[cdev_id]) 2574387259bdSDeclan Doherty continue; 2575387259bdSDeclan Doherty 2576387259bdSDeclan Doherty if (options.single_lcore && qconf == NULL) { 2577387259bdSDeclan Doherty while (rte_lcore_is_enabled(rx_lcore_id) == 0) { 2578387259bdSDeclan Doherty rx_lcore_id++; 2579387259bdSDeclan Doherty if (rx_lcore_id >= RTE_MAX_LCORE) 2580387259bdSDeclan Doherty rte_exit(EXIT_FAILURE, 2581387259bdSDeclan Doherty "Not enough cores\n"); 2582387259bdSDeclan Doherty } 2583387259bdSDeclan Doherty } else if (!options.single_lcore) { 2584387259bdSDeclan Doherty /* get the lcore_id for this port */ 2585387259bdSDeclan Doherty while (rte_lcore_is_enabled(rx_lcore_id) == 0 || 2586387259bdSDeclan Doherty lcore_queue_conf[rx_lcore_id].nb_crypto_devs == 2587387259bdSDeclan Doherty options.nb_ports_per_lcore) { 2588387259bdSDeclan Doherty rx_lcore_id++; 2589387259bdSDeclan Doherty if (rx_lcore_id >= RTE_MAX_LCORE) 2590387259bdSDeclan Doherty rte_exit(EXIT_FAILURE, 2591387259bdSDeclan Doherty "Not enough cores\n"); 2592387259bdSDeclan Doherty } 2593387259bdSDeclan Doherty } 2594387259bdSDeclan Doherty 2595387259bdSDeclan Doherty /* Assigned a new logical core in the loop above. */ 2596387259bdSDeclan Doherty if (qconf != &lcore_queue_conf[rx_lcore_id]) 2597387259bdSDeclan Doherty qconf = &lcore_queue_conf[rx_lcore_id]; 2598387259bdSDeclan Doherty 2599387259bdSDeclan Doherty qconf->cryptodev_list[qconf->nb_crypto_devs] = cdev_id; 2600387259bdSDeclan Doherty qconf->nb_crypto_devs++; 2601387259bdSDeclan Doherty 2602387259bdSDeclan Doherty enabled_cdevcount--; 2603387259bdSDeclan Doherty 2604387259bdSDeclan Doherty printf("Lcore %u: cryptodev %u\n", rx_lcore_id, 2605387259bdSDeclan Doherty (unsigned)cdev_id); 2606387259bdSDeclan Doherty } 2607387259bdSDeclan Doherty 2608387259bdSDeclan Doherty /* launch per-lcore init on every lcore */ 2609387259bdSDeclan Doherty rte_eal_mp_remote_launch(l2fwd_launch_one_lcore, (void *)&options, 2610387259bdSDeclan Doherty CALL_MASTER); 2611387259bdSDeclan Doherty RTE_LCORE_FOREACH_SLAVE(lcore_id) { 2612387259bdSDeclan Doherty if (rte_eal_wait_lcore(lcore_id) < 0) 2613387259bdSDeclan Doherty return -1; 2614387259bdSDeclan Doherty } 2615387259bdSDeclan Doherty 2616387259bdSDeclan Doherty return 0; 2617387259bdSDeclan Doherty } 2618