X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fl2fwd-crypto%2Fmain.c;h=17673a35218347ab590c4a59f25df767e1ed6d60;hb=455446276493a68117f738b2b778f2791751a2a7;hp=759953e0fb99484dd1ef19a624690a853d496f52;hpb=2661f4fbe93dd44ddb6c4e746402454a03d99b79;p=dpdk.git diff --git a/examples/l2fwd-crypto/main.c b/examples/l2fwd-crypto/main.c index 759953e0fb..17673a3521 100644 --- a/examples/l2fwd-crypto/main.c +++ b/examples/l2fwd-crypto/main.c @@ -1,7 +1,7 @@ /*- * BSD LICENSE * - * Copyright(c) 2015-2017 Intel Corporation. All rights reserved. + * Copyright(c) 2015-2016 Intel Corporation. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -88,6 +88,8 @@ enum cdev_type { #define MAX_KEY_SIZE 128 #define MAX_PKT_BURST 32 #define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */ +#define MAX_SESSIONS 32 +#define SESSION_POOL_CACHE_SIZE 0 #define MAXIMUM_IV_LENGTH 16 #define IV_OFFSET (sizeof(struct rte_crypto_op) + \ @@ -191,6 +193,8 @@ struct l2fwd_crypto_options { char string_type[MAX_STR_LEN]; uint64_t cryptodev_mask; + + unsigned int mac_updating; }; /** l2fwd crypto lcore params */ @@ -249,6 +253,7 @@ static const struct rte_eth_conf port_conf = { struct rte_mempool *l2fwd_pktmbuf_pool; struct rte_mempool *l2fwd_crypto_op_pool; +struct rte_mempool *session_pool_socket[RTE_MAX_NUMA_NODES] = { 0 }; /* Per-port statistics struct */ struct l2fwd_port_statistics { @@ -605,21 +610,31 @@ l2fwd_send_packet(struct rte_mbuf *m, uint8_t port) } static void -l2fwd_simple_forward(struct rte_mbuf *m, unsigned portid) +l2fwd_mac_updating(struct rte_mbuf *m, unsigned int dest_portid) { struct ether_hdr *eth; void *tmp; - unsigned dst_port; - dst_port = l2fwd_dst_ports[portid]; eth = rte_pktmbuf_mtod(m, struct ether_hdr *); /* 02:00:00:00:00:xx */ tmp = ð->d_addr.addr_bytes[0]; - *((uint64_t *)tmp) = 0x000000000002 + ((uint64_t)dst_port << 40); + *((uint64_t *)tmp) = 0x000000000002 + ((uint64_t)dest_portid << 40); /* src addr */ - ether_addr_copy(&l2fwd_ports_eth_addr[dst_port], ð->s_addr); + ether_addr_copy(&l2fwd_ports_eth_addr[dest_portid], ð->s_addr); +} + +static void +l2fwd_simple_forward(struct rte_mbuf *m, unsigned int portid, + struct l2fwd_crypto_options *options) +{ + unsigned int dst_port; + + dst_port = l2fwd_dst_ports[portid]; + + if (options->mac_updating) + l2fwd_mac_updating(m, dst_port); l2fwd_send_packet(m, (uint8_t) dst_port); } @@ -643,10 +658,17 @@ generate_random_key(uint8_t *key, unsigned length) } static struct rte_cryptodev_sym_session * -initialize_crypto_session(struct l2fwd_crypto_options *options, - uint8_t cdev_id) +initialize_crypto_session(struct l2fwd_crypto_options *options, uint8_t cdev_id) { struct rte_crypto_sym_xform *first_xform; + struct rte_cryptodev_sym_session *session; + int retval = rte_cryptodev_socket_id(cdev_id); + + if (retval < 0) + return NULL; + + uint8_t socket_id = (uint8_t) retval; + struct rte_mempool *sess_mp = session_pool_socket[socket_id]; if (options->xform_chain == L2FWD_CRYPTO_AEAD) { first_xform = &options->aead_xform; @@ -662,8 +684,16 @@ initialize_crypto_session(struct l2fwd_crypto_options *options, first_xform = &options->auth_xform; } - /* Setup Cipher Parameters */ - return rte_cryptodev_sym_session_create(cdev_id, first_xform); + session = rte_cryptodev_sym_session_create(sess_mp); + + if (session == NULL) + return NULL; + + if (rte_cryptodev_sym_session_init(cdev_id, session, + first_xform, sess_mp) < 0) + return NULL; + + return session; } static void @@ -684,6 +714,7 @@ l2fwd_main_loop(struct l2fwd_crypto_options *options) US_PER_S * BURST_TX_DRAIN_US; struct l2fwd_crypto_params *cparams; struct l2fwd_crypto_params port_cparams[qconf->nb_crypto_devs]; + struct rte_cryptodev_sym_session *session; if (qconf->nb_rx_ports == 0) { RTE_LOG(INFO, L2FWD, "lcore %u has nothing to do\n", lcore_id); @@ -738,6 +769,8 @@ l2fwd_main_loop(struct l2fwd_crypto_options *options) port_cparams[i].hash_verify = 0; port_cparams[i].auth_algo = options->auth_xform.auth.algo; + port_cparams[i].digest_length = + options->auth_xform.auth.digest_length; /* Set IV parameters */ if (options->auth_iv.length) { options->auth_xform.auth.iv.offset = @@ -748,10 +781,15 @@ l2fwd_main_loop(struct l2fwd_crypto_options *options) } if (port_cparams[i].do_aead) { + port_cparams[i].aead_iv.data = options->aead_iv.data; + port_cparams[i].aead_iv.length = options->aead_iv.length; + if (!options->aead_iv_param) + generate_random_key(port_cparams[i].aead_iv.data, + port_cparams[i].aead_iv.length); port_cparams[i].aead_algo = options->aead_xform.aead.algo; port_cparams[i].digest_length = options->aead_xform.aead.digest_length; - if (options->aead_xform.aead.add_auth_data_length) { + if (options->aead_xform.aead.aad_length) { port_cparams[i].aad.data = options->aad.data; port_cparams[i].aad.phys_addr = options->aad.phys_addr; port_cparams[i].aad.length = options->aad.length; @@ -786,11 +824,13 @@ l2fwd_main_loop(struct l2fwd_crypto_options *options) options->cipher_iv.length; } - port_cparams[i].session = initialize_crypto_session(options, + session = initialize_crypto_session(options, port_cparams[i].dev_id); + if (session == NULL) + rte_exit(EXIT_FAILURE, "Failed to initialize crypto session\n"); + + port_cparams[i].session = session; - if (port_cparams[i].session == NULL) - return; RTE_LOG(INFO, L2FWD, " -- lcoreid=%u cryptoid=%u\n", lcore_id, port_cparams[i].dev_id); } @@ -904,7 +944,8 @@ l2fwd_main_loop(struct l2fwd_crypto_options *options) m = ops_burst[j]->sym->m_src; rte_crypto_op_free(ops_burst[j]); - l2fwd_simple_forward(m, portid); + l2fwd_simple_forward(m, portid, + options); } } while (nb_rx == MAX_PKT_BURST); } @@ -959,7 +1000,12 @@ l2fwd_crypto_usage(const char *prgname) " --digest_size SIZE: size of digest to be generated/verified\n" " --sessionless\n" - " --cryptodev_mask MASK: hexadecimal bitmask of crypto devices to configure\n", + " --cryptodev_mask MASK: hexadecimal bitmask of crypto devices to configure\n" + + " --[no-]mac-updating: Enable or disable MAC addresses updating (enabled by default)\n" + " When enabled:\n" + " - The source MAC address is replaced by the TX port MAC address\n" + " - The destination MAC address is replaced by 02:00:00:00:00:TX_PORT_ID\n", prgname); } @@ -1042,6 +1088,7 @@ parse_key(uint8_t *data, char *input_arg) unsigned byte_count; char *token; + errno = 0; for (byte_count = 0, token = strtok(input_arg, ":"); (byte_count < MAX_KEY_SIZE) && (token != NULL); token = strtok(NULL, ":")) { @@ -1306,6 +1353,16 @@ l2fwd_crypto_parse_args_long_options(struct l2fwd_crypto_options *options, else if (strcmp(lgopts[option_index].name, "cryptodev_mask") == 0) return parse_cryptodev_mask(options, optarg); + else if (strcmp(lgopts[option_index].name, "mac-updating") == 0) { + options->mac_updating = 1; + return 0; + } + + else if (strcmp(lgopts[option_index].name, "no-mac-updating") == 0) { + options->mac_updating = 0; + return 0; + } + return -1; } @@ -1428,6 +1485,9 @@ l2fwd_crypto_default_options(struct l2fwd_crypto_options *options) options->aead_iv_random_size = -1; options->aead_iv.length = 0; + options->auth_xform.aead.algo = RTE_CRYPTO_AEAD_AES_GCM; + options->auth_xform.aead.op = RTE_CRYPTO_AEAD_OP_ENCRYPT; + options->aad_param = 0; options->aad_random_size = -1; options->aad.length = 0; @@ -1436,6 +1496,8 @@ l2fwd_crypto_default_options(struct l2fwd_crypto_options *options) options->type = CDEV_TYPE_ANY; options->cryptodev_mask = UINT64_MAX; + + options->mac_updating = 1; } static void @@ -1597,6 +1659,9 @@ l2fwd_crypto_parse_args(struct l2fwd_crypto_options *options, { "sessionless", no_argument, 0, 0 }, { "cryptodev_mask", required_argument, 0, 0}, + { "mac-updating", no_argument, 0, 0}, + { "no-mac-updating", no_argument, 0, 0}, + { NULL, 0, 0, 0 } }; @@ -1918,6 +1983,7 @@ initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports, { unsigned int cdev_id, cdev_count, enabled_cdev_count = 0; const struct rte_cryptodev_capabilities *cap; + unsigned int sess_sz, max_sess_sz = 0; int retval; cdev_count = rte_cryptodev_count(); @@ -1926,18 +1992,28 @@ initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports, return -1; } + for (cdev_id = 0; cdev_id < cdev_count; cdev_id++) { + sess_sz = rte_cryptodev_get_private_session_size(cdev_id); + if (sess_sz > max_sess_sz) + max_sess_sz = sess_sz; + } + for (cdev_id = 0; cdev_id < cdev_count && enabled_cdev_count < nb_ports; cdev_id++) { struct rte_cryptodev_qp_conf qp_conf; struct rte_cryptodev_info dev_info; + retval = rte_cryptodev_socket_id(cdev_id); + + if (retval < 0) { + printf("Invalid crypto device id used\n"); + return -1; + } + + uint8_t socket_id = (uint8_t) retval; struct rte_cryptodev_config conf = { .nb_queue_pairs = 1, - .socket_id = SOCKET_ID_ANY, - .session_mp = { - .nb_objs = 2048, - .cache_size = 64 - } + .socket_id = socket_id, }; if (check_cryptodev_mask(options, (uint8_t)cdev_id)) @@ -1945,6 +2021,35 @@ initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports, rte_cryptodev_info_get(cdev_id, &dev_info); + if (session_pool_socket[socket_id] == NULL) { + char mp_name[RTE_MEMPOOL_NAMESIZE]; + struct rte_mempool *sess_mp; + + snprintf(mp_name, RTE_MEMPOOL_NAMESIZE, + "sess_mp_%u", socket_id); + + /* + * Create enough objects for session headers and + * device private data + */ + sess_mp = rte_mempool_create(mp_name, + MAX_SESSIONS * 2, + max_sess_sz, + SESSION_POOL_CACHE_SIZE, + 0, NULL, NULL, NULL, + NULL, socket_id, + 0); + + if (sess_mp == NULL) { + printf("Cannot create session pool on socket %d\n", + socket_id); + return -ENOMEM; + } + + printf("Allocated session pool on socket %d\n", socket_id); + session_pool_socket[socket_id] = sess_mp; + } + /* Set AEAD parameters */ if (options->xform_chain == L2FWD_CRYPTO_AEAD) { /* Check if device supports AEAD algo */ @@ -1979,7 +2084,7 @@ initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports, * is supported by the algorithm chosen. */ } else if (options->aead_key_random_size != -1) { - if (check_supported_size(options->ckey_random_size, + if (check_supported_size(options->aead_key_random_size, cap->sym.aead.key_size.min, cap->sym.aead.key_size.max, cap->sym.aead.key_size.increment) @@ -1988,7 +2093,7 @@ initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports, return -1; } options->aead_xform.aead.key.length = - options->ckey_random_size; + options->aead_key_random_size; /* No size provided, use minimum size. */ } else options->aead_xform.aead.key.length = @@ -2030,7 +2135,7 @@ initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports, } else options->aad.length = cap->sym.auth.aad_size.min; - options->aead_xform.aead.add_auth_data_length = + options->aead_xform.aead.aad_length = options->aad.length; /* Check if digest size is supported by the algorithm. */ @@ -2189,7 +2294,7 @@ initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports, qp_conf.nb_descriptors = 2048; retval = rte_cryptodev_queue_pair_setup(cdev_id, 0, &qp_conf, - SOCKET_ID_ANY); + socket_id, session_pool_socket[socket_id]); if (retval < 0) { printf("Failed to setup queue pair %u on cryptodev %u", 0, cdev_id); @@ -2245,6 +2350,14 @@ initialize_ports(struct l2fwd_crypto_options *options) return -1; } + retval = rte_eth_dev_adjust_nb_rx_tx_desc(portid, &nb_rxd, + &nb_txd); + if (retval < 0) { + printf("Cannot adjust number of descriptors: err=%d, port=%u\n", + retval, (unsigned) portid); + return -1; + } + /* init one RX queue */ fflush(stdout); retval = rte_eth_rx_queue_setup(portid, 0, nb_rxd, @@ -2378,6 +2491,9 @@ main(int argc, char **argv) if (ret < 0) rte_exit(EXIT_FAILURE, "Invalid L2FWD-CRYPTO arguments\n"); + printf("MAC updating %s\n", + options.mac_updating ? "enabled" : "disabled"); + /* create the mbuf pool */ l2fwd_pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", NB_MBUF, 512, sizeof(struct rte_crypto_op),