From a7e7bb4e44010f69a73400302a8b1cb77549f0e1 Mon Sep 17 00:00:00 2001 From: Cyril Chemparathy Date: Thu, 3 Apr 2014 10:30:14 -0700 Subject: [PATCH] app/testpmd: allow txpkts to be setup via command line We allow a new --txpkts command-line parameter to configure segment sizes when in txonly or flowgen forwarding modes. Signed-off-by: Cyril Chemparathy [Thomas: add usage help] Acked-by: Thomas Monjalon --- app/test-pmd/parameters.c | 58 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index 8a3ce2c566..d37e1b035f 100644 --- a/app/test-pmd/parameters.c +++ b/app/test-pmd/parameters.c @@ -196,6 +196,7 @@ usage(char* progname) "(0 <= mapping <= %d).\n", RTE_ETHDEV_QUEUE_STAT_CNTRS - 1); printf(" --no-flush-rx: Don't flush RX streams before forwarding." " Used mainly with PCAP drivers.\n"); + printf(" --txpkts=X[,Y]*: set TX segment sizes.\n"); } #ifdef RTE_LIBRTE_CMDLINE @@ -477,6 +478,52 @@ parse_ringnuma_config(const char *q_arg) return 0; } +static unsigned int +parse_item_list(char* str, unsigned int max_items, unsigned int *parsed_items) +{ + unsigned int nb_item; + unsigned int value; + unsigned int i; + int value_ok; + char c; + + /* + * First parse all items in the list and store their value. + */ + value = 0; + nb_item = 0; + value_ok = 0; + for (i = 0; i < strlen(str); i++) { + c = str[i]; + if ((c >= '0') && (c <= '9')) { + value = (unsigned int) (value * 10 + (c - '0')); + value_ok = 1; + continue; + } + if (c != ',') { + printf("character %c is not a decimal digit\n", c); + return (0); + } + if (! value_ok) { + printf("No valid value before comma\n"); + return (0); + } + if (nb_item < max_items) { + parsed_items[nb_item] = value; + value_ok = 0; + value = 0; + } + nb_item++; + } + + if (nb_item >= max_items) + rte_exit(EXIT_FAILURE, "too many txpkt segments!\n"); + + parsed_items[nb_item++] = value; + + return (nb_item); +} + void launch_args_parse(int argc, char** argv) { @@ -539,6 +586,7 @@ launch_args_parse(int argc, char** argv) { "tx-queue-stats-mapping", 1, 0, 0 }, { "rx-queue-stats-mapping", 1, 0, 0 }, { "no-flush-rx", 0, 0, 0 }, + { "txpkts", 1, 0, 0 }, { 0, 0, 0, 0 }, }; @@ -984,6 +1032,16 @@ launch_args_parse(int argc, char** argv) "invalid RX queue statistics mapping config entered\n"); } } + if (!strcmp(lgopts[opt_idx].name, "txpkts")) { + unsigned seg_lengths[RTE_MAX_SEGS_PER_PKT]; + unsigned int nb_segs; + + nb_segs = parse_item_list(optarg, RTE_MAX_SEGS_PER_PKT, seg_lengths); + if (nb_segs > 0) + set_tx_pkt_segments(seg_lengths, nb_segs); + else + rte_exit(EXIT_FAILURE, "bad txpkts\n"); + } if (!strcmp(lgopts[opt_idx].name, "no-flush-rx")) no_flush_rx = 1; -- 2.20.1