X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-pmd%2Fparameters.c;h=1ead59579bfc05fc16e6d14b09be8351fc368f4a;hb=b253a6bbf144c8e6505dd76fe0051967eddc6903;hp=5244872c4aa8cd202b0aea66342b24747ad1761d;hpb=6937d2103e22778c4181a10092663f7ed61d17dc;p=dpdk.git diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index 5244872c4a..1ead59579b 100644 --- a/app/test-pmd/parameters.c +++ b/app/test-pmd/parameters.c @@ -49,7 +49,7 @@ static void usage(char* progname) { - printf("usage: %s " + printf("usage: %s [EAL options] -- " #ifdef RTE_LIBRTE_CMDLINE "[--interactive|-i] " "[--cmdline-file=FILENAME] " @@ -57,6 +57,7 @@ usage(char* progname) "[--help|-h] | [--auto-start|-a] | [" "--tx-first | --stats-period=PERIOD | " "--coremask=COREMASK --portmask=PORTMASK --numa " + "--portlist=PORTLIST " "--mbuf-size= | --total-num-mbufs= | " "--nb-cores= | --nb-ports= | " #ifdef RTE_LIBRTE_CMDLINE @@ -65,10 +66,12 @@ usage(char* progname) "--tx-ip=SRC,DST | --tx-udp=PORT | " #endif "--pkt-filter-mode= |" - "--rss-ip | --rss-udp | " - "--rxpt= | --rxht= | --rxwt= | --rxfreet= | " - "--txpt= | --txht= | --txwt= | --txfreet= | " - "--txrst= | --tx-offloads= | --vxlan-gpe-port= ]\n", + "--rss-ip | --rss-udp | --rss-level-inner | --rss-level-outer |" + "--rxpt= | --rxht= | --rxwt= |" + " --rxfreet= | --txpt= | --txht= | --txwt= | --txfreet= | " + "--txrst= | --tx-offloads= | | --rx-offloads= | " + "--vxlan-gpe-port= | --record-core-cycles | " + "--record-burst-stats]\n", progname); #ifdef RTE_LIBRTE_CMDLINE printf(" --interactive: run in interactive mode.\n"); @@ -91,6 +94,7 @@ usage(char* progname) "packet forwarding.\n"); printf(" --portmask=PORTMASK: hexadecimal bitmask of ports used " "by the packet forwarding test.\n"); + printf(" --portlist=PORTLIST: list of forwarding ports\n"); printf(" --numa: enable NUMA-aware allocation of RX/TX rings and of " "RX memory buffers (mbufs).\n"); printf(" --port-numa-config=(port,socket)[,(port,socket)]: " @@ -106,6 +110,8 @@ usage(char* progname) printf(" --total-num-mbufs=N: set the number of mbufs to be allocated " "in mbuf pools.\n"); printf(" --max-pkt-len=N: set the maximum size of packet to N bytes.\n"); + printf(" --max-lro-pkt-size=N: set the maximum LRO aggregated packet " + "size to N bytes.\n"); #ifdef RTE_LIBRTE_CMDLINE printf(" --eth-peers-configfile=name: config file with ethernet addresses " "of peer ports.\n"); @@ -135,18 +141,25 @@ usage(char* progname) printf(" --enable-hw-vlan-filter: enable hardware vlan filter.\n"); printf(" --enable-hw-vlan-strip: enable hardware vlan strip.\n"); printf(" --enable-hw-vlan-extend: enable hardware vlan extend.\n"); + printf(" --enable-hw-qinq-strip: enable hardware qinq strip.\n"); printf(" --enable-drop-en: enable per queue packet drop.\n"); printf(" --disable-rss: disable rss.\n"); - printf(" --port-topology=N: set port topology (N: paired (default) or " - "chained).\n"); + printf(" --port-topology=: set port topology (paired " + "is default).\n"); printf(" --forward-mode=N: set forwarding mode (N: %s).\n", list_pkt_forwarding_modes()); + printf(" --forward-mode=5tswap: set forwarding mode to " + "swap L2,L3,L4 for MAC, IPv4/IPv6 and TCP/UDP only.\n"); printf(" --rss-ip: set RSS functions to IPv4/IPv6 only .\n"); printf(" --rss-udp: set RSS functions to IPv4/IPv6 + UDP.\n"); + printf(" --rss-level-inner: set RSS hash level to innermost\n"); + printf(" --rss-level-outer: set RSS hash level to outermost\n"); printf(" --rxq=N: set the number of RX queues per port to N.\n"); printf(" --rxd=N: set the number of descriptors in RX rings to N.\n"); printf(" --txq=N: set the number of TX queues per port to N.\n"); printf(" --txd=N: set the number of descriptors in TX rings to N.\n"); + printf(" --hairpinq=N: set the number of hairpin queues per port to " + "N.\n"); printf(" --burst=N: set the number of packets per burst to N.\n"); printf(" --mbcache=N: set the cache of mbuf memory pool to N.\n"); printf(" --rxpt=N: set prefetch threshold register of RX rings to N.\n"); @@ -179,13 +192,14 @@ usage(char* progname) printf(" --no-rmv-interrupt: disable device removal interrupt.\n"); printf(" --bitrate-stats=N: set the logical core N to perform " "bit-rate calculation.\n"); - printf(" --print-event : " + printf(" --print-event : " "enable print of designated event or all of them.\n"); - printf(" --mask-event : " + printf(" --mask-event : " "disable print of designated event or all of them.\n"); printf(" --flow-isolate-all: " "requests flow API isolated mode on all ports at initialization time.\n"); printf(" --tx-offloads=0xXXXXXXXX: hexadecimal bitmask of TX queue offloads\n"); + printf(" --rx-offloads=0xXXXXXXXX: hexadecimal bitmask of RX queue offloads\n"); printf(" --hot-plug: enable hot plug for device.\n"); printf(" --vxlan-gpe-port=N: UPD port of tunnel VXLAN-GPE\n"); printf(" --mlockall: lock all memory\n"); @@ -203,6 +217,10 @@ usage(char* progname) printf(" --noisy-lkup-num-writes=N: do N random reads and writes per packet\n"); printf(" --no-iova-contig: mempool memory can be IOVA non contiguous. " "valid only with --mp-alloc=anon\n"); + printf(" --rx-mq-mode=0xX: hexadecimal bitmask of RX mq mode can be " + "enabled\n"); + printf(" --record-core-cycles: enable measurement of CPU cycles.\n"); + printf(" --record-burst-stats: enable display of RX and TX bursts.\n"); } #ifdef RTE_LIBRTE_CMDLINE @@ -536,6 +554,8 @@ parse_event_printing_config(const char *optarg, int enable) mask = UINT32_C(1) << RTE_ETH_EVENT_NEW; else if (!strcmp(optarg, "dev_released")) mask = UINT32_C(1) << RTE_ETH_EVENT_DESTROY; + else if (!strcmp(optarg, "flow_aged")) + mask = UINT32_C(1) << RTE_ETH_EVENT_FLOW_AGED; else if (!strcmp(optarg, "all")) mask = ~UINT32_C(0); else { @@ -562,6 +582,7 @@ launch_args_parse(int argc, char** argv) uint64_t tx_offloads = tx_mode.offloads; struct rte_eth_dev_info dev_info; uint16_t rec_nb_pkts; + int ret; static struct option lgopts[] = { { "help", 0, 0, 0 }, @@ -579,6 +600,7 @@ launch_args_parse(int argc, char** argv) { "nb-ports", 1, 0, 0 }, { "coremask", 1, 0, 0 }, { "portmask", 1, 0, 0 }, + { "portlist", 1, 0, 0 }, { "numa", 0, 0, 0 }, { "no-numa", 0, 0, 0 }, { "mp-anon", 0, 0, 0 }, @@ -588,6 +610,7 @@ launch_args_parse(int argc, char** argv) { "mbuf-size", 1, 0, 0 }, { "total-num-mbufs", 1, 0, 0 }, { "max-pkt-len", 1, 0, 0 }, + { "max-lro-pkt-size", 1, 0, 0 }, { "pkt-filter-mode", 1, 0, 0 }, { "pkt-filter-report-hash", 1, 0, 0 }, { "pkt-filter-size", 1, 0, 0 }, @@ -595,7 +618,7 @@ launch_args_parse(int argc, char** argv) #ifdef RTE_LIBRTE_LATENCY_STATS { "latencystats", 1, 0, 0 }, #endif -#ifdef RTE_LIBRTE_BITRATE +#ifdef RTE_LIBRTE_BITRATESTATS { "bitrate-stats", 1, 0, 0 }, #endif { "disable-crc-strip", 0, 0, 0 }, @@ -607,16 +630,20 @@ launch_args_parse(int argc, char** argv) { "enable-hw-vlan-filter", 0, 0, 0 }, { "enable-hw-vlan-strip", 0, 0, 0 }, { "enable-hw-vlan-extend", 0, 0, 0 }, + { "enable-hw-qinq-strip", 0, 0, 0 }, { "enable-drop-en", 0, 0, 0 }, { "disable-rss", 0, 0, 0 }, { "port-topology", 1, 0, 0 }, { "forward-mode", 1, 0, 0 }, { "rss-ip", 0, 0, 0 }, { "rss-udp", 0, 0, 0 }, + { "rss-level-outer", 0, 0, 0 }, + { "rss-level-inner", 0, 0, 0 }, { "rxq", 1, 0, 0 }, { "txq", 1, 0, 0 }, { "rxd", 1, 0, 0 }, { "txd", 1, 0, 0 }, + { "hairpinq", 1, 0, 0 }, { "burst", 1, 0, 0 }, { "mbcache", 1, 0, 0 }, { "txpt", 1, 0, 0 }, @@ -641,6 +668,7 @@ launch_args_parse(int argc, char** argv) { "print-event", 1, 0, 0 }, { "mask-event", 1, 0, 0 }, { "tx-offloads", 1, 0, 0 }, + { "rx-offloads", 1, 0, 0 }, { "hot-plug", 0, 0, 0 }, { "vxlan-gpe-port", 1, 0, 0 }, { "mlockall", 0, 0, 0 }, @@ -655,6 +683,9 @@ launch_args_parse(int argc, char** argv) { "noisy-lkup-num-reads", 1, 0, 0 }, { "noisy-lkup-num-reads-writes", 1, 0, 0 }, { "no-iova-contig", 0, 0, 0 }, + { "rx-mq-mode", 1, 0, 0 }, + { "record-core-cycles", 0, 0, 0 }, + { "record-burst-stats", 0, 0, 0 }, { 0, 0, 0, 0 }, }; @@ -813,6 +844,8 @@ launch_args_parse(int argc, char** argv) parse_fwd_coremask(optarg); if (!strcmp(lgopts[opt_idx].name, "portmask")) parse_fwd_portmask(optarg); + if (!strcmp(lgopts[opt_idx].name, "portlist")) + parse_fwd_portlist(optarg); if (!strcmp(lgopts[opt_idx].name, "no-numa")) numa_support = 0; if (!strcmp(lgopts[opt_idx].name, "numa")) @@ -829,6 +862,8 @@ launch_args_parse(int argc, char** argv) mp_alloc_type = MP_ALLOC_XMEM; else if (!strcmp(optarg, "xmemhuge")) mp_alloc_type = MP_ALLOC_XMEM_HUGE; + else if (!strcmp(optarg, "xbuf")) + mp_alloc_type = MP_ALLOC_XBUF; else rte_exit(EXIT_FAILURE, "mp-alloc %s invalid - must be: " @@ -882,6 +917,10 @@ launch_args_parse(int argc, char** argv) "Invalid max-pkt-len=%d - should be > %d\n", n, RTE_ETHER_MIN_LEN); } + if (!strcmp(lgopts[opt_idx].name, "max-lro-pkt-size")) { + n = atoi(optarg); + rx_mode.max_lro_pkt_size = (uint32_t) n; + } if (!strcmp(lgopts[opt_idx].name, "pkt-filter-mode")) { if (!strcmp(optarg, "signature")) fdir_conf.mode = @@ -956,7 +995,7 @@ launch_args_parse(int argc, char** argv) " must be >= 0\n", n); } #endif -#ifdef RTE_LIBRTE_BITRATE +#ifdef RTE_LIBRTE_BITRATESTATS if (!strcmp(lgopts[opt_idx].name, "bitrate-stats")) { n = atoi(optarg); if (n >= 0) { @@ -994,6 +1033,10 @@ launch_args_parse(int argc, char** argv) "enable-hw-vlan-extend")) rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND; + if (!strcmp(lgopts[opt_idx].name, + "enable-hw-qinq-strip")) + rx_offloads |= DEV_RX_OFFLOAD_QINQ_STRIP; + if (!strcmp(lgopts[opt_idx].name, "enable-drop-en")) rx_drop_en = 1; @@ -1017,6 +1060,10 @@ launch_args_parse(int argc, char** argv) rss_hf = ETH_RSS_IP; if (!strcmp(lgopts[opt_idx].name, "rss-udp")) rss_hf = ETH_RSS_UDP; + if (!strcmp(lgopts[opt_idx].name, "rss-level-inner")) + rss_hf |= ETH_RSS_LEVEL_INNERMOST; + if (!strcmp(lgopts[opt_idx].name, "rss-level-outer")) + rss_hf |= ETH_RSS_LEVEL_OUTERMOST; if (!strcmp(lgopts[opt_idx].name, "rxq")) { n = atoi(optarg); if (n >= 0 && check_nb_rxq((queueid_t)n) == 0) @@ -1035,6 +1082,31 @@ launch_args_parse(int argc, char** argv) " >= 0 && <= %u\n", n, get_allowed_max_nb_txq(&pid)); } + if (!strcmp(lgopts[opt_idx].name, "hairpinq")) { + n = atoi(optarg); + if (n >= 0 && + check_nb_hairpinq((queueid_t)n) == 0) + nb_hairpinq = (queueid_t) n; + else + rte_exit(EXIT_FAILURE, "txq %d invalid - must be" + " >= 0 && <= %u\n", n, + get_allowed_max_nb_hairpinq + (&pid)); + if ((n + nb_txq) < 0 || + check_nb_txq((queueid_t)(n + nb_txq)) != 0) + rte_exit(EXIT_FAILURE, "txq + hairpinq " + "%d invalid - must be" + " >= 0 && <= %u\n", + n + nb_txq, + get_allowed_max_nb_txq(&pid)); + if ((n + nb_rxq) < 0 || + check_nb_rxq((queueid_t)(n + nb_rxq)) != 0) + rte_exit(EXIT_FAILURE, "rxq + hairpinq " + "%d invalid - must be" + " >= 0 && <= %u\n", + n + nb_rxq, + get_allowed_max_nb_rxq(&pid)); + } if (!nb_rxq && !nb_txq) { rte_exit(EXIT_FAILURE, "Either rx or tx queues should " "be non-zero\n"); @@ -1050,7 +1122,12 @@ launch_args_parse(int argc, char** argv) * value, on the assumption that all * ports are of the same NIC model. */ - rte_eth_dev_info_get(0, &dev_info); + ret = eth_dev_info_get_print_err( + 0, + &dev_info); + if (ret != 0) + return; + rec_nb_pkts = dev_info .default_rxportconf.burst_size; @@ -1215,6 +1292,17 @@ launch_args_parse(int argc, char** argv) rte_exit(EXIT_FAILURE, "tx-offloads must be >= 0\n"); } + + if (!strcmp(lgopts[opt_idx].name, "rx-offloads")) { + char *end = NULL; + n = strtoull(optarg, &end, 16); + if (n >= 0) + rx_offloads = (uint64_t)n; + else + rte_exit(EXIT_FAILURE, + "rx-offloads must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "vxlan-gpe-port")) { n = atoi(optarg); if (n >= 0) @@ -1295,6 +1383,21 @@ launch_args_parse(int argc, char** argv) } if (!strcmp(lgopts[opt_idx].name, "no-iova-contig")) mempool_flags = MEMPOOL_F_NO_IOVA_CONTIG; + + if (!strcmp(lgopts[opt_idx].name, "rx-mq-mode")) { + char *end = NULL; + n = strtoul(optarg, &end, 16); + if (n >= 0 && n <= ETH_MQ_RX_VMDQ_DCB_RSS) + rx_mq_mode = (enum rte_eth_rx_mq_mode)n; + else + rte_exit(EXIT_FAILURE, + "rx-mq-mode must be >= 0 and <= %d\n", + ETH_MQ_RX_VMDQ_DCB_RSS); + } + if (!strcmp(lgopts[opt_idx].name, "record-core-cycles")) + record_core_cycles = 1; + if (!strcmp(lgopts[opt_idx].name, "record-burst-stats")) + record_burst_stats = 1; break; case 'h': usage(argv[0]); @@ -1302,12 +1405,19 @@ launch_args_parse(int argc, char** argv) break; default: usage(argv[0]); + printf("Invalid option: %s\n", argv[optind]); rte_exit(EXIT_FAILURE, "Command line is incomplete or incorrect\n"); break; } } + if (optind != argc) { + usage(argv[0]); + printf("Invalid parameter: %s\n", argv[optind]); + rte_exit(EXIT_FAILURE, "Command line is incorrect\n"); + } + /* Set offload configuration from command line parameters. */ rx_mode.offloads = rx_offloads; tx_mode.offloads = tx_offloads;