X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fl3fwd-graph%2Fmain.c;h=7f00c65609ed52ba1b46353da39fe20aed1c16ae;hb=cdb9a7ae5f8f3b59b6de9dc2b52387636245e3a5;hp=a0de8ca9b42dd5411e94fc052484d229e7f39995;hpb=9a212dc06c7aaf09b146d9c3dcfd584d741634c1;p=dpdk.git diff --git a/examples/l3fwd-graph/main.c b/examples/l3fwd-graph/main.c index a0de8ca9b4..7f00c65609 100644 --- a/examples/l3fwd-graph/main.c +++ b/examples/l3fwd-graph/main.c @@ -111,21 +111,22 @@ static uint16_t nb_lcore_params = RTE_DIM(lcore_params_array_default); static struct rte_eth_conf port_conf = { .rxmode = { - .mq_mode = ETH_MQ_RX_RSS, - .max_rx_pkt_len = RTE_ETHER_MAX_LEN, + .mq_mode = RTE_ETH_MQ_RX_RSS, .split_hdr_size = 0, }, .rx_adv_conf = { .rss_conf = { .rss_key = NULL, - .rss_hf = ETH_RSS_IP, + .rss_hf = RTE_ETH_RSS_IP, }, }, .txmode = { - .mq_mode = ETH_MQ_TX_NONE, + .mq_mode = RTE_ETH_MQ_TX_NONE, }, }; +static uint32_t max_pkt_len; + static struct rte_mempool *pktmbuf_pool[RTE_MAX_ETHPORTS][NB_SOCKETS]; static struct rte_node_ethdev_config ethdev_conf[RTE_MAX_ETHPORTS]; @@ -259,7 +260,7 @@ print_usage(const char *prgname) " [-P]" " --config (port,queue,lcore)[,(port,queue,lcore)]" " [--eth-dest=X,MM:MM:MM:MM:MM:MM]" - " [--enable-jumbo [--max-pkt-len PKTLEN]]" + " [--max-pkt-len PKTLEN]" " [--no-numa]" " [--per-port-pool]\n\n" @@ -268,9 +269,7 @@ print_usage(const char *prgname) " --config (port,queue,lcore): Rx queue configuration\n" " --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for " "port X\n" - " --enable-jumbo: Enable jumbo frames\n" - " --max-pkt-len: Under the premise of enabling jumbo,\n" - " maximum packet length in decimal (64-9600)\n" + " --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n" " --no-numa: Disable numa awareness\n" " --per-port-pool: Use separate buffer pool per port\n\n", prgname); @@ -404,7 +403,7 @@ static const char short_options[] = "p:" /* portmask */ #define CMD_LINE_OPT_CONFIG "config" #define CMD_LINE_OPT_ETH_DEST "eth-dest" #define CMD_LINE_OPT_NO_NUMA "no-numa" -#define CMD_LINE_OPT_ENABLE_JUMBO "enable-jumbo" +#define CMD_LINE_OPT_MAX_PKT_LEN "max-pkt-len" #define CMD_LINE_OPT_PER_PORT_POOL "per-port-pool" enum { /* Long options mapped to a short option */ @@ -416,7 +415,7 @@ enum { CMD_LINE_OPT_CONFIG_NUM, CMD_LINE_OPT_ETH_DEST_NUM, CMD_LINE_OPT_NO_NUMA_NUM, - CMD_LINE_OPT_ENABLE_JUMBO_NUM, + CMD_LINE_OPT_MAX_PKT_LEN_NUM, CMD_LINE_OPT_PARSE_PER_PORT_POOL, }; @@ -424,7 +423,7 @@ static const struct option lgopts[] = { {CMD_LINE_OPT_CONFIG, 1, 0, CMD_LINE_OPT_CONFIG_NUM}, {CMD_LINE_OPT_ETH_DEST, 1, 0, CMD_LINE_OPT_ETH_DEST_NUM}, {CMD_LINE_OPT_NO_NUMA, 0, 0, CMD_LINE_OPT_NO_NUMA_NUM}, - {CMD_LINE_OPT_ENABLE_JUMBO, 0, 0, CMD_LINE_OPT_ENABLE_JUMBO_NUM}, + {CMD_LINE_OPT_MAX_PKT_LEN, 1, 0, CMD_LINE_OPT_MAX_PKT_LEN_NUM}, {CMD_LINE_OPT_PER_PORT_POOL, 0, 0, CMD_LINE_OPT_PARSE_PER_PORT_POOL}, {NULL, 0, 0, 0}, }; @@ -490,28 +489,8 @@ parse_args(int argc, char **argv) numa_on = 0; break; - case CMD_LINE_OPT_ENABLE_JUMBO_NUM: { - const struct option lenopts = {"max-pkt-len", - required_argument, 0, 0}; - - port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME; - port_conf.txmode.offloads |= DEV_TX_OFFLOAD_MULTI_SEGS; - - /* - * if no max-pkt-len set, use the default - * value RTE_ETHER_MAX_LEN. - */ - if (getopt_long(argc, argvopt, "", &lenopts, - &option_index) == 0) { - ret = parse_max_pkt_len(optarg); - if (ret < 64 || ret > MAX_JUMBO_PKT_LEN) { - fprintf(stderr, "Invalid maximum " - "packet length\n"); - print_usage(prgname); - return -1; - } - port_conf.rxmode.max_rx_pkt_len = ret; - } + case CMD_LINE_OPT_MAX_PKT_LEN_NUM: { + max_pkt_len = parse_max_pkt_len(optarg); break; } @@ -628,7 +607,7 @@ check_all_ports_link_status(uint32_t port_mask) continue; } /* Clear all_ports_up flag if any link down */ - if (link.link_status == ETH_LINK_DOWN) { + if (link.link_status == RTE_ETH_LINK_DOWN) { all_ports_up = 0; break; } @@ -722,6 +701,41 @@ graph_main_loop(void *conf) } /* >8 End of main processing loop. */ +static uint32_t +eth_dev_get_overhead_len(uint32_t max_rx_pktlen, uint16_t max_mtu) +{ + uint32_t overhead_len; + + if (max_mtu != UINT16_MAX && max_rx_pktlen > max_mtu) + overhead_len = max_rx_pktlen - max_mtu; + else + overhead_len = RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN; + + return overhead_len; +} + +static int +config_port_max_pkt_len(struct rte_eth_conf *conf, + struct rte_eth_dev_info *dev_info) +{ + uint32_t overhead_len; + + if (max_pkt_len == 0) + return 0; + + if (max_pkt_len < RTE_ETHER_MIN_LEN || max_pkt_len > MAX_JUMBO_PKT_LEN) + return -1; + + overhead_len = eth_dev_get_overhead_len(dev_info->max_rx_pktlen, + dev_info->max_mtu); + conf->rxmode.mtu = max_pkt_len - overhead_len; + + if (conf->rxmode.mtu > RTE_ETHER_MTU) + conf->txmode.offloads |= RTE_ETH_TX_OFFLOAD_MULTI_SEGS; + + return 0; +} + int main(int argc, char **argv) { @@ -807,9 +821,16 @@ main(int argc, char **argv) nb_rx_queue, n_tx_queue); rte_eth_dev_info_get(portid, &dev_info); - if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE) + + ret = config_port_max_pkt_len(&local_port_conf, &dev_info); + if (ret != 0) + rte_exit(EXIT_FAILURE, + "Invalid max packet length: %u (port %u)\n", + max_pkt_len, portid); + + if (dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE) local_port_conf.txmode.offloads |= - DEV_TX_OFFLOAD_MBUF_FAST_FREE; + RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE; local_port_conf.rx_adv_conf.rss_conf.rss_hf &= dev_info.flow_type_rss_offloads;