X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=examples%2Fl2fwd-crypto%2Fmain.c;h=49183bc3993aafc216865e33ac40cd9660ac02b4;hb=f12a5b5b27bc1dfb7e1296c92b13e58f68b26aaf;hp=2a71feba643f0a8fdd4a1550b4f871d99208598a;hpb=f7db6f821e96eaa2edb5d9035cc8e87489353daa;p=dpdk.git diff --git a/examples/l2fwd-crypto/main.c b/examples/l2fwd-crypto/main.c index 2a71feba64..49183bc399 100644 --- a/examples/l2fwd-crypto/main.c +++ b/examples/l2fwd-crypto/main.c @@ -86,6 +86,8 @@ enum cdev_type { #define MAX_STR_LEN 32 #define MAX_KEY_SIZE 128 +#define MAX_IV_SIZE 16 +#define MAX_AAD_SIZE 65535 #define MAX_PKT_BURST 32 #define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */ #define MAX_SESSIONS 32 @@ -112,7 +114,7 @@ static uint64_t l2fwd_enabled_port_mask; static uint64_t l2fwd_enabled_crypto_mask; /* list of enabled ports */ -static uint32_t l2fwd_dst_ports[RTE_MAX_ETHPORTS]; +static uint16_t l2fwd_dst_ports[RTE_MAX_ETHPORTS]; struct pkt_buffer { @@ -193,6 +195,8 @@ struct l2fwd_crypto_options { char string_type[MAX_STR_LEN]; uint64_t cryptodev_mask; + + unsigned int mac_updating; }; /** l2fwd crypto lcore params */ @@ -222,7 +226,7 @@ struct l2fwd_crypto_params { /** lcore configuration */ struct lcore_queue_conf { unsigned nb_rx_ports; - unsigned rx_port_list[MAX_RX_QUEUE_PER_LCORE]; + uint16_t rx_port_list[MAX_RX_QUEUE_PER_LCORE]; unsigned nb_crypto_devs; unsigned cryptodev_list[MAX_RX_QUEUE_PER_LCORE]; @@ -288,7 +292,7 @@ print_stats(void) uint64_t total_packets_dropped, total_packets_tx, total_packets_rx; uint64_t total_packets_enqueued, total_packets_dequeued, total_packets_errors; - unsigned portid; + uint16_t portid; uint64_t cdevid; total_packets_dropped = 0; @@ -532,7 +536,16 @@ l2fwd_simple_crypto_enqueue(struct rte_mbuf *m, uint8_t *iv_ptr = rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFFSET); /* Copy IV at the end of the crypto operation */ - rte_memcpy(iv_ptr, cparams->aead_iv.data, cparams->aead_iv.length); + /* + * If doing AES-CCM, nonce is copied one byte + * after the start of IV field + */ + if (cparams->aead_algo == RTE_CRYPTO_AEAD_AES_CCM) + rte_memcpy(iv_ptr + 1, cparams->aead_iv.data, + cparams->aead_iv.length); + else + rte_memcpy(iv_ptr, cparams->aead_iv.data, + cparams->aead_iv.length); op->sym->aead.data.offset = ipdata_offset; op->sym->aead.data.length = data_len; @@ -546,7 +559,7 @@ l2fwd_simple_crypto_enqueue(struct rte_mbuf *m, uint8_t *) + ipdata_offset + data_len; } - op->sym->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(m, + op->sym->aead.digest.phys_addr = rte_pktmbuf_mtophys_offset(m, rte_pktmbuf_pkt_len(m) - cparams->digest_length); if (cparams->aad.length) { @@ -564,7 +577,7 @@ l2fwd_simple_crypto_enqueue(struct rte_mbuf *m, /* Send the burst of packets on an output interface */ static int l2fwd_send_burst(struct lcore_queue_conf *qconf, unsigned n, - uint8_t port) + uint16_t port) { struct rte_mbuf **pkt_buffer; unsigned ret; @@ -585,7 +598,7 @@ l2fwd_send_burst(struct lcore_queue_conf *qconf, unsigned n, /* Enqueue packets for TX and prepare them to be sent */ static int -l2fwd_send_packet(struct rte_mbuf *m, uint8_t port) +l2fwd_send_packet(struct rte_mbuf *m, uint16_t port) { unsigned lcore_id, len; struct lcore_queue_conf *qconf; @@ -608,23 +621,33 @@ 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, uint16_t 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, uint16_t portid, + struct l2fwd_crypto_options *options) +{ + uint16_t dst_port; - l2fwd_send_packet(m, (uint8_t) dst_port); + dst_port = l2fwd_dst_ports[portid]; + + if (options->mac_updating) + l2fwd_mac_updating(m, dst_port); + + l2fwd_send_packet(m, dst_port); } /** Generate random key */ @@ -650,7 +673,12 @@ 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; - uint8_t socket_id = rte_cryptodev_socket_id(cdev_id); + 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) { @@ -691,7 +719,8 @@ l2fwd_main_loop(struct l2fwd_crypto_options *options) unsigned lcore_id = rte_lcore_id(); uint64_t prev_tsc = 0, diff_tsc, cur_tsc, timer_tsc = 0; - unsigned i, j, portid, nb_rx, len; + unsigned int i, j, nb_rx, len; + uint16_t portid; struct lcore_queue_conf *qconf = &lcore_queue_conf[lcore_id]; const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / US_PER_S * BURST_TX_DRAIN_US; @@ -752,6 +781,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 = @@ -762,16 +793,29 @@ 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; if (!options->aad_param) generate_random_key(port_cparams[i].aad.data, port_cparams[i].aad.length); + /* + * If doing AES-CCM, first 18 bytes has to be reserved, + * and actual AAD should start from byte 18 + */ + if (port_cparams[i].aead_algo == RTE_CRYPTO_AEAD_AES_CCM) + memmove(port_cparams[i].aad.data + 18, + port_cparams[i].aad.data, + port_cparams[i].aad.length); } else port_cparams[i].aad.length = 0; @@ -841,7 +885,7 @@ l2fwd_main_loop(struct l2fwd_crypto_options *options) continue; l2fwd_send_burst(&lcore_queue_conf[lcore_id], qconf->pkt_buf[portid].len, - (uint8_t) portid); + portid); qconf->pkt_buf[portid].len = 0; } @@ -875,7 +919,7 @@ l2fwd_main_loop(struct l2fwd_crypto_options *options) cparams = &port_cparams[i]; - nb_rx = rte_eth_rx_burst((uint8_t) portid, 0, + nb_rx = rte_eth_rx_burst(portid, 0, pkts_burst, MAX_PKT_BURST); port_statistics[portid].rx += nb_rx; @@ -920,7 +964,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); } @@ -975,7 +1020,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); } @@ -1051,15 +1101,16 @@ parse_cipher_op(enum rte_crypto_cipher_operation *op, char *optarg) return -1; } -/** Parse crypto key command line argument */ +/** Parse bytes from command line argument */ static int -parse_key(uint8_t *data, char *input_arg) +parse_bytes(uint8_t *data, char *input_arg, uint16_t max_size) { unsigned byte_count; char *token; + errno = 0; for (byte_count = 0, token = strtok(input_arg, ":"); - (byte_count < MAX_KEY_SIZE) && (token != NULL); + (byte_count < max_size) && (token != NULL); token = strtok(NULL, ":")) { int number = (int)strtol(token, NULL, 16); @@ -1199,7 +1250,8 @@ l2fwd_crypto_parse_args_long_options(struct l2fwd_crypto_options *options, else if (strcmp(lgopts[option_index].name, "cipher_key") == 0) { options->ckey_param = 1; options->cipher_xform.cipher.key.length = - parse_key(options->cipher_xform.cipher.key.data, optarg); + parse_bytes(options->cipher_xform.cipher.key.data, optarg, + MAX_KEY_SIZE); if (options->cipher_xform.cipher.key.length > 0) return 0; else @@ -1212,7 +1264,7 @@ l2fwd_crypto_parse_args_long_options(struct l2fwd_crypto_options *options, else if (strcmp(lgopts[option_index].name, "cipher_iv") == 0) { options->cipher_iv_param = 1; options->cipher_iv.length = - parse_key(options->cipher_iv.data, optarg); + parse_bytes(options->cipher_iv.data, optarg, MAX_IV_SIZE); if (options->cipher_iv.length > 0) return 0; else @@ -1235,7 +1287,8 @@ l2fwd_crypto_parse_args_long_options(struct l2fwd_crypto_options *options, else if (strcmp(lgopts[option_index].name, "auth_key") == 0) { options->akey_param = 1; options->auth_xform.auth.key.length = - parse_key(options->auth_xform.auth.key.data, optarg); + parse_bytes(options->auth_xform.auth.key.data, optarg, + MAX_KEY_SIZE); if (options->auth_xform.auth.key.length > 0) return 0; else @@ -1249,7 +1302,7 @@ l2fwd_crypto_parse_args_long_options(struct l2fwd_crypto_options *options, else if (strcmp(lgopts[option_index].name, "auth_iv") == 0) { options->auth_iv_param = 1; options->auth_iv.length = - parse_key(options->auth_iv.data, optarg); + parse_bytes(options->auth_iv.data, optarg, MAX_IV_SIZE); if (options->auth_iv.length > 0) return 0; else @@ -1272,7 +1325,8 @@ l2fwd_crypto_parse_args_long_options(struct l2fwd_crypto_options *options, else if (strcmp(lgopts[option_index].name, "aead_key") == 0) { options->aead_key_param = 1; options->aead_xform.aead.key.length = - parse_key(options->aead_xform.aead.key.data, optarg); + parse_bytes(options->aead_xform.aead.key.data, optarg, + MAX_KEY_SIZE); if (options->aead_xform.aead.key.length > 0) return 0; else @@ -1286,7 +1340,7 @@ l2fwd_crypto_parse_args_long_options(struct l2fwd_crypto_options *options, else if (strcmp(lgopts[option_index].name, "aead_iv") == 0) { options->aead_iv_param = 1; options->aead_iv.length = - parse_key(options->aead_iv.data, optarg); + parse_bytes(options->aead_iv.data, optarg, MAX_IV_SIZE); if (options->aead_iv.length > 0) return 0; else @@ -1299,7 +1353,7 @@ l2fwd_crypto_parse_args_long_options(struct l2fwd_crypto_options *options, else if (strcmp(lgopts[option_index].name, "aad") == 0) { options->aad_param = 1; options->aad.length = - parse_key(options->aad.data, optarg); + parse_bytes(options->aad.data, optarg, MAX_AAD_SIZE); if (options->aad.length > 0) return 0; else @@ -1322,6 +1376,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; } @@ -1455,6 +1519,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 @@ -1616,6 +1682,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 } }; @@ -1686,11 +1755,12 @@ l2fwd_crypto_parse_args(struct l2fwd_crypto_options *options, /* Check the link status of all ports in up to 9s, and print them finally */ static void -check_all_ports_link_status(uint8_t port_num, uint32_t port_mask) +check_all_ports_link_status(uint16_t port_num, uint32_t port_mask) { #define CHECK_INTERVAL 100 /* 100ms */ #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */ - uint8_t portid, count, all_ports_up, print_flag = 0; + uint16_t portid; + uint8_t count, all_ports_up, print_flag = 0; struct rte_eth_link link; printf("\nChecking link status"); @@ -1705,14 +1775,13 @@ check_all_ports_link_status(uint8_t port_num, uint32_t port_mask) /* print link status if flag set */ if (print_flag == 1) { if (link.link_status) - printf("Port %d Link Up - speed %u " - "Mbps - %s\n", (uint8_t)portid, - (unsigned)link.link_speed, + printf( + "Port%d Link Up. Speed %u Mbps - %s\n", + portid, link.link_speed, (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? ("full-duplex") : ("half-duplex\n")); else - printf("Port %d Link Down\n", - (uint8_t)portid); + printf("Port %d Link Down\n", portid); continue; } /* clear all_ports_up flag if any link down */ @@ -1956,7 +2025,14 @@ initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports, cdev_id++) { struct rte_cryptodev_qp_conf qp_conf; struct rte_cryptodev_info dev_info; - uint8_t socket_id = rte_cryptodev_socket_id(cdev_id); + 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, @@ -2031,7 +2107,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) @@ -2040,7 +2116,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 = @@ -2082,7 +2158,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. */ @@ -2267,7 +2343,7 @@ initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports, static int initialize_ports(struct l2fwd_crypto_options *options) { - uint8_t last_portid, portid; + uint16_t last_portid, portid; unsigned enabled_portcount = 0; unsigned nb_ports = rte_eth_dev_count(); @@ -2288,12 +2364,20 @@ initialize_ports(struct l2fwd_crypto_options *options) continue; /* init port */ - printf("Initializing port %u... ", (unsigned) portid); + printf("Initializing port %u... ", portid); fflush(stdout); retval = rte_eth_dev_configure(portid, 1, 1, &port_conf); if (retval < 0) { printf("Cannot configure device: err=%d, port=%u\n", - retval, (unsigned) portid); + retval, portid); + 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, portid); return -1; } @@ -2304,7 +2388,7 @@ initialize_ports(struct l2fwd_crypto_options *options) NULL, l2fwd_pktmbuf_pool); if (retval < 0) { printf("rte_eth_rx_queue_setup:err=%d, port=%u\n", - retval, (unsigned) portid); + retval, portid); return -1; } @@ -2315,7 +2399,7 @@ initialize_ports(struct l2fwd_crypto_options *options) NULL); if (retval < 0) { printf("rte_eth_tx_queue_setup:err=%d, port=%u\n", - retval, (unsigned) portid); + retval, portid); return -1; } @@ -2324,7 +2408,7 @@ initialize_ports(struct l2fwd_crypto_options *options) retval = rte_eth_dev_start(portid); if (retval < 0) { printf("rte_eth_dev_start:err=%d, port=%u\n", - retval, (unsigned) portid); + retval, portid); return -1; } @@ -2333,7 +2417,7 @@ initialize_ports(struct l2fwd_crypto_options *options) rte_eth_macaddr_get(portid, &l2fwd_ports_eth_addr[portid]); printf("Port %u, MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n\n", - (unsigned) portid, + portid, l2fwd_ports_eth_addr[portid].addr_bytes[0], l2fwd_ports_eth_addr[portid].addr_bytes[1], l2fwd_ports_eth_addr[portid].addr_bytes[2], @@ -2410,7 +2494,8 @@ main(int argc, char **argv) struct lcore_queue_conf *qconf; struct l2fwd_crypto_options options; - uint8_t nb_ports, nb_cryptodevs, portid, cdev_id; + uint8_t nb_cryptodevs, cdev_id; + uint16_t nb_ports, portid; unsigned lcore_id, rx_lcore_id; int ret, enabled_cdevcount, enabled_portcount; uint8_t enabled_cdevs[RTE_CRYPTO_MAX_DEVS] = {0}; @@ -2430,6 +2515,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), @@ -2484,7 +2572,7 @@ main(int argc, char **argv) qconf->rx_port_list[qconf->nb_rx_ports] = portid; qconf->nb_rx_ports++; - printf("Lcore %u: RX port %u\n", rx_lcore_id, (unsigned)portid); + printf("Lcore %u: RX port %u\n", rx_lcore_id, portid); } /* Enable Crypto devices */