From: David Marchand <david.marchand@redhat.com>
To: dev@dpdk.org
Cc: Aman Singh <aman.deep.singh@intel.com>,
Yuying Zhang <yuying.zhang@intel.com>
Subject: [PATCH v2 6/6] app/testpmd: enhance getopt_long usage
Date: Thu, 14 Mar 2024 10:17:07 +0100 [thread overview]
Message-ID: <20240314091708.1542769-7-david.marchand@redhat.com> (raw)
In-Reply-To: <20240314091708.1542769-1-david.marchand@redhat.com>
This is a cleanup similar to previous ones in EAL and examples.
Instead of using strcmp for every long options while getopt_long already
did such parsing, rely on getopt_long return value.
Note for reviewers: this patch is best reviewed once applied locally and
displayed with git show -w.
Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changes since v1:
- removed useless comments in options enum definitions,
- constified long_options,
- added macros to shorten long options array definitions,
- removed unneeded argvopt,
---
app/test-pmd/parameters.c | 1924 +++++++++++++++++++++----------------
1 file changed, 1083 insertions(+), 841 deletions(-)
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index a69639b6fb..c13f7564bf 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -40,6 +40,344 @@
#include "testpmd.h"
+enum {
+#define TESTPMD_OPT_AUTO_START "auto-start"
+ TESTPMD_OPT_AUTO_START_NUM = 'a',
+#define TESTPMD_OPT_HELP "help"
+ TESTPMD_OPT_HELP_NUM = 'h',
+#define TESTPMD_OPT_INTERACTIVE "interactive"
+ TESTPMD_OPT_INTERACTIVE_NUM = 'i',
+
+ TESTPMD_OPT_LONG_MIN_NUM = 256,
+#define TESTPMD_OPT_CMDLINE_FILE "cmdline-file"
+ TESTPMD_OPT_CMDLINE_FILE_NUM,
+#define TESTPMD_OPT_ETH_PEERS_CONFIGFILE "eth-peers-configfile"
+ TESTPMD_OPT_ETH_PEERS_CONFIGFILE_NUM,
+#define TESTPMD_OPT_ETH_PEER "eth-peer"
+ TESTPMD_OPT_ETH_PEER_NUM,
+#define TESTPMD_OPT_TX_FIRST "tx-first"
+ TESTPMD_OPT_TX_FIRST_NUM,
+#define TESTPMD_OPT_STATS_PERIOD "stats-period"
+ TESTPMD_OPT_STATS_PERIOD_NUM,
+#define TESTPMD_OPT_DISPLAY_XSTATS "display-xstats"
+ TESTPMD_OPT_DISPLAY_XSTATS_NUM,
+#define TESTPMD_OPT_NB_CORES "nb-cores"
+ TESTPMD_OPT_NB_CORES_NUM,
+#define TESTPMD_OPT_NB_PORTS "nb-ports"
+ TESTPMD_OPT_NB_PORTS_NUM,
+#define TESTPMD_OPT_COREMASK "coremask"
+ TESTPMD_OPT_COREMASK_NUM,
+#define TESTPMD_OPT_PORTMASK "portmask"
+ TESTPMD_OPT_PORTMASK_NUM,
+#define TESTPMD_OPT_PORTLIST "portlist"
+ TESTPMD_OPT_PORTLIST_NUM,
+#define TESTPMD_OPT_NUMA "numa"
+ TESTPMD_OPT_NUMA_NUM,
+#define TESTPMD_OPT_NO_NUMA "no-numa"
+ TESTPMD_OPT_NO_NUMA_NUM,
+#define TESTPMD_OPT_MP_ANON "mp-anon"
+ TESTPMD_OPT_MP_ANON_NUM,
+#define TESTPMD_OPT_PORT_NUMA_CONFIG "port-numa-config"
+ TESTPMD_OPT_PORT_NUMA_CONFIG_NUM,
+#define TESTPMD_OPT_RING_NUMA_CONFIG "ring-numa-config"
+ TESTPMD_OPT_RING_NUMA_CONFIG_NUM,
+#define TESTPMD_OPT_SOCKET_NUM "socket-num"
+ TESTPMD_OPT_SOCKET_NUM_NUM,
+#define TESTPMD_OPT_MBUF_SIZE "mbuf-size"
+ TESTPMD_OPT_MBUF_SIZE_NUM,
+#define TESTPMD_OPT_TOTAL_NUM_MBUFS "total-num-mbufs"
+ TESTPMD_OPT_TOTAL_NUM_MBUFS_NUM,
+#define TESTPMD_OPT_MAX_PKT_LEN "max-pkt-len"
+ TESTPMD_OPT_MAX_PKT_LEN_NUM,
+#define TESTPMD_OPT_MAX_LRO_PKT_SIZE "max-lro-pkt-size"
+ TESTPMD_OPT_MAX_LRO_PKT_SIZE_NUM,
+#define TESTPMD_OPT_LATENCYSTATS "latencystats"
+ TESTPMD_OPT_LATENCYSTATS_NUM,
+#define TESTPMD_OPT_BITRATE_STATS "bitrate-stats"
+ TESTPMD_OPT_BITRATE_STATS_NUM,
+#define TESTPMD_OPT_DISABLE_CRC_STRIP "disable-crc-strip"
+ TESTPMD_OPT_DISABLE_CRC_STRIP_NUM,
+#define TESTPMD_OPT_ENABLE_LRO "enable-lro"
+ TESTPMD_OPT_ENABLE_LRO_NUM,
+#define TESTPMD_OPT_ENABLE_RX_CKSUM "enable-rx-cksum"
+ TESTPMD_OPT_ENABLE_RX_CKSUM_NUM,
+#define TESTPMD_OPT_ENABLE_RX_TIMESTAMP "enable-rx-timestamp"
+ TESTPMD_OPT_ENABLE_RX_TIMESTAMP_NUM,
+#define TESTPMD_OPT_ENABLE_SCATTER "enable-scatter"
+ TESTPMD_OPT_ENABLE_SCATTER_NUM,
+#define TESTPMD_OPT_ENABLE_HW_VLAN "enable-hw-vlan"
+ TESTPMD_OPT_ENABLE_HW_VLAN_NUM,
+#define TESTPMD_OPT_ENABLE_HW_VLAN_FILTER "enable-hw-vlan-filter"
+ TESTPMD_OPT_ENABLE_HW_VLAN_FILTER_NUM,
+#define TESTPMD_OPT_ENABLE_HW_VLAN_STRIP "enable-hw-vlan-strip"
+ TESTPMD_OPT_ENABLE_HW_VLAN_STRIP_NUM,
+#define TESTPMD_OPT_ENABLE_HW_VLAN_EXTEND "enable-hw-vlan-extend"
+ TESTPMD_OPT_ENABLE_HW_VLAN_EXTEND_NUM,
+#define TESTPMD_OPT_ENABLE_HW_QINQ_STRIP "enable-hw-qinq-strip"
+ TESTPMD_OPT_ENABLE_HW_QINQ_STRIP_NUM,
+#define TESTPMD_OPT_ENABLE_DROP_EN "enable-drop-en"
+ TESTPMD_OPT_ENABLE_DROP_EN_NUM,
+#define TESTPMD_OPT_DISABLE_RSS "disable-rss"
+ TESTPMD_OPT_DISABLE_RSS_NUM,
+#define TESTPMD_OPT_PORT_TOPOLOGY "port-topology"
+ TESTPMD_OPT_PORT_TOPOLOGY_NUM,
+#define TESTPMD_OPT_FORWARD_MODE "forward-mode"
+ TESTPMD_OPT_FORWARD_MODE_NUM,
+#define TESTPMD_OPT_RSS_IP "rss-ip"
+ TESTPMD_OPT_RSS_IP_NUM,
+#define TESTPMD_OPT_RSS_UDP "rss-udp"
+ TESTPMD_OPT_RSS_UDP_NUM,
+#define TESTPMD_OPT_RSS_LEVEL_OUTER "rss-level-outer"
+ TESTPMD_OPT_RSS_LEVEL_OUTER_NUM,
+#define TESTPMD_OPT_RSS_LEVEL_INNER "rss-level-inner"
+ TESTPMD_OPT_RSS_LEVEL_INNER_NUM,
+#define TESTPMD_OPT_RXQ "rxq"
+ TESTPMD_OPT_RXQ_NUM,
+#define TESTPMD_OPT_TXQ "txq"
+ TESTPMD_OPT_TXQ_NUM,
+#define TESTPMD_OPT_RXD "rxd"
+ TESTPMD_OPT_RXD_NUM,
+#define TESTPMD_OPT_TXD "txd"
+ TESTPMD_OPT_TXD_NUM,
+#define TESTPMD_OPT_HAIRPINQ "hairpinq"
+ TESTPMD_OPT_HAIRPINQ_NUM,
+#define TESTPMD_OPT_HAIRPIN_MODE "hairpin-mode"
+ TESTPMD_OPT_HAIRPIN_MODE_NUM,
+#define TESTPMD_OPT_BURST "burst"
+ TESTPMD_OPT_BURST_NUM,
+#define TESTPMD_OPT_FLOWGEN_CLONES "flowgen-clones"
+ TESTPMD_OPT_FLOWGEN_CLONES_NUM,
+#define TESTPMD_OPT_FLOWGEN_FLOWS "flowgen-flows"
+ TESTPMD_OPT_FLOWGEN_FLOWS_NUM,
+#define TESTPMD_OPT_MBCACHE "mbcache"
+ TESTPMD_OPT_MBCACHE_NUM,
+#define TESTPMD_OPT_TXPT "txpt"
+ TESTPMD_OPT_TXPT_NUM,
+#define TESTPMD_OPT_TXHT "txht"
+ TESTPMD_OPT_TXHT_NUM,
+#define TESTPMD_OPT_TXWT "txwt"
+ TESTPMD_OPT_TXWT_NUM,
+#define TESTPMD_OPT_TXFREET "txfreet"
+ TESTPMD_OPT_TXFREET_NUM,
+#define TESTPMD_OPT_TXRST "txrst"
+ TESTPMD_OPT_TXRST_NUM,
+#define TESTPMD_OPT_RXPT "rxpt"
+ TESTPMD_OPT_RXPT_NUM,
+#define TESTPMD_OPT_RXHT "rxht"
+ TESTPMD_OPT_RXHT_NUM,
+#define TESTPMD_OPT_RXWT "rxwt"
+ TESTPMD_OPT_RXWT_NUM,
+#define TESTPMD_OPT_RXFREET "rxfreet"
+ TESTPMD_OPT_RXFREET_NUM,
+#define TESTPMD_OPT_NO_FLUSH_RX "no-flush-rx"
+ TESTPMD_OPT_NO_FLUSH_RX_NUM,
+#define TESTPMD_OPT_FLOW_ISOLATE_ALL "flow-isolate-all"
+ TESTPMD_OPT_FLOW_ISOLATE_ALL_NUM,
+#define TESTPMD_OPT_DISABLE_FLOW_FLUSH "disable-flow-flush"
+ TESTPMD_OPT_DISABLE_FLOW_FLUSH_NUM,
+#define TESTPMD_OPT_RXOFFS "rxoffs"
+ TESTPMD_OPT_RXOFFS_NUM,
+#define TESTPMD_OPT_RXPKTS "rxpkts"
+ TESTPMD_OPT_RXPKTS_NUM,
+#define TESTPMD_OPT_RXHDRS "rxhdrs"
+ TESTPMD_OPT_RXHDRS_NUM,
+#define TESTPMD_OPT_TXPKTS "txpkts"
+ TESTPMD_OPT_TXPKTS_NUM,
+#define TESTPMD_OPT_MULTI_RX_MEMPOOL "multi-rx-mempool"
+ TESTPMD_OPT_MULTI_RX_MEMPOOL_NUM,
+#define TESTPMD_OPT_TXONLY_MULTI_FLOW "txonly-multi-flow"
+ TESTPMD_OPT_TXONLY_MULTI_FLOW_NUM,
+#define TESTPMD_OPT_RXQ_SHARE "rxq-share"
+ TESTPMD_OPT_RXQ_SHARE_NUM,
+#define TESTPMD_OPT_ETH_LINK_SPEED "eth-link-speed"
+ TESTPMD_OPT_ETH_LINK_SPEED_NUM,
+#define TESTPMD_OPT_DISABLE_LINK_CHECK "disable-link-check"
+ TESTPMD_OPT_DISABLE_LINK_CHECK_NUM,
+#define TESTPMD_OPT_DISABLE_DEVICE_START "disable-device-start"
+ TESTPMD_OPT_DISABLE_DEVICE_START_NUM,
+#define TESTPMD_OPT_NO_LSC_INTERRUPT "no-lsc-interrupt"
+ TESTPMD_OPT_NO_LSC_INTERRUPT_NUM,
+#define TESTPMD_OPT_NO_RMV_INTERRUPT "no-rmv-interrupt"
+ TESTPMD_OPT_NO_RMV_INTERRUPT_NUM,
+#define TESTPMD_OPT_PRINT_EVENT "print-event"
+ TESTPMD_OPT_PRINT_EVENT_NUM,
+#define TESTPMD_OPT_MASK_EVENT "mask-event"
+ TESTPMD_OPT_MASK_EVENT_NUM,
+#define TESTPMD_OPT_TX_OFFLOADS "tx-offloads"
+ TESTPMD_OPT_TX_OFFLOADS_NUM,
+#define TESTPMD_OPT_RX_OFFLOADS "rx-offloads"
+ TESTPMD_OPT_RX_OFFLOADS_NUM,
+#define TESTPMD_OPT_HOT_PLUG "hot-plug"
+ TESTPMD_OPT_HOT_PLUG_NUM,
+#define TESTPMD_OPT_VXLAN_GPE_PORT "vxlan-gpe-port"
+ TESTPMD_OPT_VXLAN_GPE_PORT_NUM,
+#define TESTPMD_OPT_GENEVE_PARSED_PORT "geneve-parsed-port"
+ TESTPMD_OPT_GENEVE_PARSED_PORT_NUM,
+#define TESTPMD_OPT_MLOCKALL "mlockall"
+ TESTPMD_OPT_MLOCKALL_NUM,
+#define TESTPMD_OPT_NO_MLOCKALL "no-mlockall"
+ TESTPMD_OPT_NO_MLOCKALL_NUM,
+#define TESTPMD_OPT_MP_ALLOC "mp-alloc"
+ TESTPMD_OPT_MP_ALLOC_NUM,
+#define TESTPMD_OPT_TX_IP "tx-ip"
+ TESTPMD_OPT_TX_IP_NUM,
+#define TESTPMD_OPT_TX_UDP "tx-udp"
+ TESTPMD_OPT_TX_UDP_NUM,
+#define TESTPMD_OPT_NOISY_TX_SW_BUFFER_SIZE "noisy-tx-sw-buffer-size"
+ TESTPMD_OPT_NOISY_TX_SW_BUFFER_SIZE_NUM,
+#define TESTPMD_OPT_NOISY_TX_SW_BUFFER_FLUSHTIME "noisy-tx-sw-buffer-flushtime"
+ TESTPMD_OPT_NOISY_TX_SW_BUFFER_FLUSHTIME_NUM,
+#define TESTPMD_OPT_NOISY_LKUP_MEMORY "noisy-lkup-memory"
+ TESTPMD_OPT_NOISY_LKUP_MEMORY_NUM,
+#define TESTPMD_OPT_NOISY_LKUP_NUM_WRITES "noisy-lkup-num-writes"
+ TESTPMD_OPT_NOISY_LKUP_NUM_WRITES_NUM,
+#define TESTPMD_OPT_NOISY_LKUP_NUM_READS "noisy-lkup-num-reads"
+ TESTPMD_OPT_NOISY_LKUP_NUM_READS_NUM,
+#define TESTPMD_OPT_NOISY_LKUP_NUM_READS_WRITES "noisy-lkup-num-reads-writes"
+ TESTPMD_OPT_NOISY_LKUP_NUM_READS_WRITES_NUM,
+#define TESTPMD_OPT_NOISY_FORWARD_MODE "noisy-forward-mode"
+ TESTPMD_OPT_NOISY_FORWARD_MODE_NUM,
+#define TESTPMD_OPT_NO_IOVA_CONTIG "no-iova-contig"
+ TESTPMD_OPT_NO_IOVA_CONTIG_NUM,
+#define TESTPMD_OPT_RX_MQ_MODE "rx-mq-mode"
+ TESTPMD_OPT_RX_MQ_MODE_NUM,
+#define TESTPMD_OPT_RECORD_CORE_CYCLES "record-core-cycles"
+ TESTPMD_OPT_RECORD_CORE_CYCLES_NUM,
+#define TESTPMD_OPT_RECORD_BURST_STATS "record-burst-stats"
+ TESTPMD_OPT_RECORD_BURST_STATS_NUM,
+#define TESTPMD_OPT_NUM_PROCS "num-procs"
+ TESTPMD_OPT_NUM_PROCS_NUM,
+#define TESTPMD_OPT_PROC_ID "proc-id"
+ TESTPMD_OPT_PROC_ID_NUM,
+
+ TESTPMD_OPT_LONG_MAX_NUM
+};
+
+static const char short_options[] = {
+ "a" /* auto-start */
+ "h" /* help */
+ "i" /* interactive */
+};
+
+#define NO_ARG(opt) { opt, no_argument, NULL, opt ## _NUM }
+#define REQUIRED_ARG(opt) { opt, required_argument, NULL, opt ## _NUM }
+#define OPTIONAL_ARG(opt) { opt, optional_argument, NULL, opt ## _NUM }
+static const struct option long_options[] = {
+ NO_ARG(TESTPMD_OPT_AUTO_START),
+ NO_ARG(TESTPMD_OPT_HELP),
+ NO_ARG(TESTPMD_OPT_INTERACTIVE),
+ REQUIRED_ARG(TESTPMD_OPT_CMDLINE_FILE),
+ REQUIRED_ARG(TESTPMD_OPT_ETH_PEERS_CONFIGFILE),
+ REQUIRED_ARG(TESTPMD_OPT_ETH_PEER),
+ NO_ARG(TESTPMD_OPT_TX_FIRST),
+ REQUIRED_ARG(TESTPMD_OPT_STATS_PERIOD),
+ REQUIRED_ARG(TESTPMD_OPT_DISPLAY_XSTATS),
+ REQUIRED_ARG(TESTPMD_OPT_NB_CORES),
+ REQUIRED_ARG(TESTPMD_OPT_NB_PORTS),
+ REQUIRED_ARG(TESTPMD_OPT_COREMASK),
+ REQUIRED_ARG(TESTPMD_OPT_PORTMASK),
+ REQUIRED_ARG(TESTPMD_OPT_PORTLIST),
+ NO_ARG(TESTPMD_OPT_NUMA),
+ NO_ARG(TESTPMD_OPT_NO_NUMA),
+ NO_ARG(TESTPMD_OPT_MP_ANON), /* deprecated */
+ REQUIRED_ARG(TESTPMD_OPT_PORT_NUMA_CONFIG),
+ REQUIRED_ARG(TESTPMD_OPT_RING_NUMA_CONFIG),
+ REQUIRED_ARG(TESTPMD_OPT_SOCKET_NUM),
+ REQUIRED_ARG(TESTPMD_OPT_MBUF_SIZE),
+ REQUIRED_ARG(TESTPMD_OPT_TOTAL_NUM_MBUFS),
+ REQUIRED_ARG(TESTPMD_OPT_MAX_PKT_LEN),
+ REQUIRED_ARG(TESTPMD_OPT_MAX_LRO_PKT_SIZE),
+#ifdef RTE_LIB_LATENCYSTATS
+ REQUIRED_ARG(TESTPMD_OPT_LATENCYSTATS),
+#endif
+#ifdef RTE_LIB_BITRATESTATS
+ REQUIRED_ARG(TESTPMD_OPT_BITRATE_STATS),
+#endif
+ NO_ARG(TESTPMD_OPT_DISABLE_CRC_STRIP),
+ NO_ARG(TESTPMD_OPT_ENABLE_LRO),
+ NO_ARG(TESTPMD_OPT_ENABLE_RX_CKSUM),
+ NO_ARG(TESTPMD_OPT_ENABLE_RX_TIMESTAMP),
+ NO_ARG(TESTPMD_OPT_ENABLE_SCATTER),
+ NO_ARG(TESTPMD_OPT_ENABLE_HW_VLAN),
+ NO_ARG(TESTPMD_OPT_ENABLE_HW_VLAN_FILTER),
+ NO_ARG(TESTPMD_OPT_ENABLE_HW_VLAN_STRIP),
+ NO_ARG(TESTPMD_OPT_ENABLE_HW_VLAN_EXTEND),
+ NO_ARG(TESTPMD_OPT_ENABLE_HW_QINQ_STRIP),
+ NO_ARG(TESTPMD_OPT_ENABLE_DROP_EN),
+ NO_ARG(TESTPMD_OPT_DISABLE_RSS),
+ REQUIRED_ARG(TESTPMD_OPT_PORT_TOPOLOGY),
+ REQUIRED_ARG(TESTPMD_OPT_FORWARD_MODE),
+ NO_ARG(TESTPMD_OPT_RSS_IP),
+ NO_ARG(TESTPMD_OPT_RSS_UDP),
+ NO_ARG(TESTPMD_OPT_RSS_LEVEL_OUTER),
+ NO_ARG(TESTPMD_OPT_RSS_LEVEL_INNER),
+ REQUIRED_ARG(TESTPMD_OPT_RXQ),
+ REQUIRED_ARG(TESTPMD_OPT_TXQ),
+ REQUIRED_ARG(TESTPMD_OPT_RXD),
+ REQUIRED_ARG(TESTPMD_OPT_TXD),
+ REQUIRED_ARG(TESTPMD_OPT_HAIRPINQ),
+ REQUIRED_ARG(TESTPMD_OPT_HAIRPIN_MODE),
+ REQUIRED_ARG(TESTPMD_OPT_BURST),
+ REQUIRED_ARG(TESTPMD_OPT_FLOWGEN_CLONES),
+ REQUIRED_ARG(TESTPMD_OPT_FLOWGEN_FLOWS),
+ REQUIRED_ARG(TESTPMD_OPT_MBCACHE),
+ REQUIRED_ARG(TESTPMD_OPT_TXPT),
+ REQUIRED_ARG(TESTPMD_OPT_TXHT),
+ REQUIRED_ARG(TESTPMD_OPT_TXWT),
+ REQUIRED_ARG(TESTPMD_OPT_TXFREET),
+ REQUIRED_ARG(TESTPMD_OPT_TXRST),
+ REQUIRED_ARG(TESTPMD_OPT_RXPT),
+ REQUIRED_ARG(TESTPMD_OPT_RXHT),
+ REQUIRED_ARG(TESTPMD_OPT_RXWT),
+ REQUIRED_ARG(TESTPMD_OPT_RXFREET),
+ NO_ARG(TESTPMD_OPT_NO_FLUSH_RX),
+ NO_ARG(TESTPMD_OPT_FLOW_ISOLATE_ALL),
+ NO_ARG(TESTPMD_OPT_DISABLE_FLOW_FLUSH),
+ REQUIRED_ARG(TESTPMD_OPT_RXOFFS),
+ REQUIRED_ARG(TESTPMD_OPT_RXPKTS),
+ REQUIRED_ARG(TESTPMD_OPT_RXHDRS),
+ REQUIRED_ARG(TESTPMD_OPT_TXPKTS),
+ NO_ARG(TESTPMD_OPT_MULTI_RX_MEMPOOL),
+ NO_ARG(TESTPMD_OPT_TXONLY_MULTI_FLOW),
+ OPTIONAL_ARG(TESTPMD_OPT_RXQ_SHARE),
+ REQUIRED_ARG(TESTPMD_OPT_ETH_LINK_SPEED),
+ NO_ARG(TESTPMD_OPT_DISABLE_LINK_CHECK),
+ NO_ARG(TESTPMD_OPT_DISABLE_DEVICE_START),
+ NO_ARG(TESTPMD_OPT_NO_LSC_INTERRUPT),
+ NO_ARG(TESTPMD_OPT_NO_RMV_INTERRUPT),
+ REQUIRED_ARG(TESTPMD_OPT_PRINT_EVENT),
+ REQUIRED_ARG(TESTPMD_OPT_MASK_EVENT),
+ REQUIRED_ARG(TESTPMD_OPT_TX_OFFLOADS),
+ REQUIRED_ARG(TESTPMD_OPT_RX_OFFLOADS),
+ NO_ARG(TESTPMD_OPT_HOT_PLUG),
+ REQUIRED_ARG(TESTPMD_OPT_VXLAN_GPE_PORT),
+ REQUIRED_ARG(TESTPMD_OPT_GENEVE_PARSED_PORT),
+#ifndef RTE_EXEC_ENV_WINDOWS
+ NO_ARG(TESTPMD_OPT_MLOCKALL),
+ NO_ARG(TESTPMD_OPT_NO_MLOCKALL),
+#endif
+ REQUIRED_ARG(TESTPMD_OPT_MP_ALLOC),
+ REQUIRED_ARG(TESTPMD_OPT_TX_IP),
+ REQUIRED_ARG(TESTPMD_OPT_TX_UDP),
+ REQUIRED_ARG(TESTPMD_OPT_NOISY_TX_SW_BUFFER_SIZE),
+ REQUIRED_ARG(TESTPMD_OPT_NOISY_TX_SW_BUFFER_FLUSHTIME),
+ REQUIRED_ARG(TESTPMD_OPT_NOISY_LKUP_MEMORY),
+ REQUIRED_ARG(TESTPMD_OPT_NOISY_LKUP_NUM_WRITES),
+ REQUIRED_ARG(TESTPMD_OPT_NOISY_LKUP_NUM_READS),
+ REQUIRED_ARG(TESTPMD_OPT_NOISY_LKUP_NUM_READS_WRITES),
+ REQUIRED_ARG(TESTPMD_OPT_NOISY_FORWARD_MODE),
+ NO_ARG(TESTPMD_OPT_NO_IOVA_CONTIG),
+ REQUIRED_ARG(TESTPMD_OPT_RX_MQ_MODE),
+ NO_ARG(TESTPMD_OPT_RECORD_CORE_CYCLES),
+ NO_ARG(TESTPMD_OPT_RECORD_BURST_STATS),
+ REQUIRED_ARG(TESTPMD_OPT_NUM_PROCS),
+ REQUIRED_ARG(TESTPMD_OPT_PROC_ID),
+ { 0, 0, NULL, 0 }
+};
+#undef NO_ARG
+#undef REQUIRED_ARG
+#undef OPTIONAL_ARG
+
static void
usage(char* progname)
{
@@ -587,11 +925,7 @@ parse_link_speed(int n)
void
launch_args_parse(int argc, char** argv)
{
-#define PARAM_PROC_ID "proc-id"
-#define PARAM_NUM_PROCS "num-procs"
-
int n, opt;
- char **argvopt;
int opt_idx;
portid_t pid;
enum { TX, RX };
@@ -602,123 +936,8 @@ launch_args_parse(int argc, char** argv)
uint16_t rec_nb_pkts;
int ret;
- static struct option lgopts[] = {
- { "help", 0, 0, 0 },
- { "interactive", 0, 0, 0 },
- { "cmdline-file", 1, 0, 0 },
- { "auto-start", 0, 0, 0 },
- { "eth-peers-configfile", 1, 0, 0 },
- { "eth-peer", 1, 0, 0 },
- { "tx-first", 0, 0, 0 },
- { "stats-period", 1, 0, 0 },
- { "display-xstats", 1, 0, 0 },
- { "nb-cores", 1, 0, 0 },
- { "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 }, /* deprecated */
- { "port-numa-config", 1, 0, 0 },
- { "ring-numa-config", 1, 0, 0 },
- { "socket-num", 1, 0, 0 },
- { "mbuf-size", 1, 0, 0 },
- { "total-num-mbufs", 1, 0, 0 },
- { "max-pkt-len", 1, 0, 0 },
- { "max-lro-pkt-size", 1, 0, 0 },
-#ifdef RTE_LIB_LATENCYSTATS
- { "latencystats", 1, 0, 0 },
-#endif
-#ifdef RTE_LIB_BITRATESTATS
- { "bitrate-stats", 1, 0, 0 },
-#endif
- { "disable-crc-strip", 0, 0, 0 },
- { "enable-lro", 0, 0, 0 },
- { "enable-rx-cksum", 0, 0, 0 },
- { "enable-rx-timestamp", 0, 0, 0 },
- { "enable-scatter", 0, 0, 0 },
- { "enable-hw-vlan", 0, 0, 0 },
- { "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 },
- { "hairpin-mode", 1, 0, 0 },
- { "burst", 1, 0, 0 },
- { "flowgen-clones", 1, 0, 0 },
- { "flowgen-flows", 1, 0, 0 },
- { "mbcache", 1, 0, 0 },
- { "txpt", 1, 0, 0 },
- { "txht", 1, 0, 0 },
- { "txwt", 1, 0, 0 },
- { "txfreet", 1, 0, 0 },
- { "txrst", 1, 0, 0 },
- { "rxpt", 1, 0, 0 },
- { "rxht", 1, 0, 0 },
- { "rxwt", 1, 0, 0 },
- { "rxfreet", 1, 0, 0 },
- { "no-flush-rx", 0, 0, 0 },
- { "flow-isolate-all", 0, 0, 0 },
- { "disable-flow-flush", 0, 0, 0 },
- { "rxoffs", 1, 0, 0 },
- { "rxpkts", 1, 0, 0 },
- { "rxhdrs", 1, 0, 0 },
- { "txpkts", 1, 0, 0 },
- { "multi-rx-mempool", 0, 0, 0 },
- { "txonly-multi-flow", 0, 0, 0 },
- { "rxq-share", 2, 0, 0 },
- { "eth-link-speed", 1, 0, 0 },
- { "disable-link-check", 0, 0, 0 },
- { "disable-device-start", 0, 0, 0 },
- { "no-lsc-interrupt", 0, 0, 0 },
- { "no-rmv-interrupt", 0, 0, 0 },
- { "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 },
- { "geneve-parsed-port", 1, 0, 0 },
-#ifndef RTE_EXEC_ENV_WINDOWS
- { "mlockall", 0, 0, 0 },
- { "no-mlockall", 0, 0, 0 },
-#endif
- { "mp-alloc", 1, 0, 0 },
- { "tx-ip", 1, 0, 0 },
- { "tx-udp", 1, 0, 0 },
- { "noisy-forward-mode", 1, 0, 0 },
- { "noisy-tx-sw-buffer-size", 1, 0, 0 },
- { "noisy-tx-sw-buffer-flushtime", 1, 0, 0 },
- { "noisy-lkup-memory", 1, 0, 0 },
- { "noisy-lkup-num-writes", 1, 0, 0 },
- { "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 },
- { PARAM_NUM_PROCS, 1, 0, 0 },
- { PARAM_PROC_ID, 1, 0, 0 },
- { 0, 0, 0, 0 },
- };
-
- argvopt = argv;
-
- while ((opt = getopt_long(argc, argvopt, "iah",
- lgopts, &opt_idx)) != EOF) {
+ while ((opt = getopt_long(argc, argv, short_options, long_options,
+ &opt_idx)) != EOF) {
switch (opt) {
case 'i':
printf("Interactive-mode selected\n");
@@ -728,751 +947,774 @@ launch_args_parse(int argc, char** argv)
printf("Auto-start selected\n");
auto_start = 1;
break;
+ case 'h':
+ usage(argv[0]);
+ exit(EXIT_SUCCESS);
+ break;
+ case TESTPMD_OPT_CMDLINE_FILE_NUM:
+ printf("CLI commands to be read from %s\n",
+ optarg);
+ strlcpy(cmdline_filename, optarg,
+ sizeof(cmdline_filename));
+ break;
+ case TESTPMD_OPT_TX_FIRST_NUM:
+ printf("Ports to start sending a burst of "
+ "packets first\n");
+ tx_first = 1;
+ break;
+ case TESTPMD_OPT_STATS_PERIOD_NUM: {
+ char *end = NULL;
+ unsigned int n;
- case 0: /*long options */
- if (!strcmp(lgopts[opt_idx].name, "help")) {
- usage(argv[0]);
- exit(EXIT_SUCCESS);
- }
- if (!strcmp(lgopts[opt_idx].name, "interactive")) {
- printf("Interactive-mode selected\n");
- interactive = 1;
- }
- if (!strcmp(lgopts[opt_idx].name, "cmdline-file")) {
- printf("CLI commands to be read from %s\n",
- optarg);
- strlcpy(cmdline_filename, optarg,
- sizeof(cmdline_filename));
- }
- if (!strcmp(lgopts[opt_idx].name, "auto-start")) {
- printf("Auto-start selected\n");
- auto_start = 1;
- }
- if (!strcmp(lgopts[opt_idx].name, "tx-first")) {
- printf("Ports to start sending a burst of "
- "packets first\n");
- tx_first = 1;
- }
- if (!strcmp(lgopts[opt_idx].name, "stats-period")) {
- char *end = NULL;
- unsigned int n;
-
- n = strtoul(optarg, &end, 10);
- if ((optarg[0] == '\0') || (end == NULL) ||
- (*end != '\0'))
- rte_exit(EXIT_FAILURE, "Invalid stats-period value\n");
-
- stats_period = n;
- break;
- }
- if (!strcmp(lgopts[opt_idx].name, "display-xstats")) {
- char rc;
-
- rc = parse_xstats_list(optarg, &xstats_display,
- &xstats_display_num);
- if (rc != 0)
- rte_exit(EXIT_FAILURE,
- "Failed to parse display-xstats argument: %d\n",
- rc);
- }
- if (!strcmp(lgopts[opt_idx].name,
- "eth-peers-configfile")) {
- if (init_peer_eth_addrs(optarg) != 0)
- rte_exit(EXIT_FAILURE,
- "Cannot open logfile\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "eth-peer")) {
- char *port_end;
-
- errno = 0;
- n = strtoul(optarg, &port_end, 10);
- if (errno != 0 || port_end == optarg || *port_end++ != ',')
- rte_exit(EXIT_FAILURE,
- "Invalid eth-peer: %s", optarg);
- if (n >= RTE_MAX_ETHPORTS)
- rte_exit(EXIT_FAILURE,
- "eth-peer: port %d >= RTE_MAX_ETHPORTS(%d)\n",
- n, RTE_MAX_ETHPORTS);
-
- if (rte_ether_unformat_addr(port_end,
- &peer_eth_addrs[n]) < 0)
- rte_exit(EXIT_FAILURE,
- "Invalid ethernet address: %s\n",
- port_end);
- nb_peer_eth_addrs++;
- }
- if (!strcmp(lgopts[opt_idx].name, "tx-ip")) {
- struct in_addr in;
- char *end;
-
- end = strchr(optarg, ',');
- if (end == optarg || !end)
- rte_exit(EXIT_FAILURE,
- "Invalid tx-ip: %s", optarg);
+ n = strtoul(optarg, &end, 10);
+ if ((optarg[0] == '\0') || (end == NULL) ||
+ (*end != '\0'))
+ rte_exit(EXIT_FAILURE, "Invalid stats-period value\n");
- *end++ = 0;
- if (inet_pton(AF_INET, optarg, &in) == 0)
- rte_exit(EXIT_FAILURE,
- "Invalid source IP address: %s\n",
- optarg);
- tx_ip_src_addr = rte_be_to_cpu_32(in.s_addr);
+ stats_period = n;
+ break;
+ }
+ case TESTPMD_OPT_DISPLAY_XSTATS_NUM: {
+ char rc;
+
+ rc = parse_xstats_list(optarg, &xstats_display,
+ &xstats_display_num);
+ if (rc != 0)
+ rte_exit(EXIT_FAILURE,
+ "Failed to parse display-xstats argument: %d\n",
+ rc);
+ break;
+ }
+ case TESTPMD_OPT_ETH_PEERS_CONFIGFILE_NUM:
+ if (init_peer_eth_addrs(optarg) != 0)
+ rte_exit(EXIT_FAILURE,
+ "Cannot open logfile\n");
+ break;
+ case TESTPMD_OPT_ETH_PEER_NUM: {
+ char *port_end;
- if (inet_pton(AF_INET, end, &in) == 0)
- rte_exit(EXIT_FAILURE,
- "Invalid destination IP address: %s\n",
- optarg);
- tx_ip_dst_addr = rte_be_to_cpu_32(in.s_addr);
- }
- if (!strcmp(lgopts[opt_idx].name, "tx-udp")) {
- char *end = NULL;
-
- errno = 0;
- n = strtoul(optarg, &end, 10);
- if (errno != 0 || end == optarg ||
- n > UINT16_MAX ||
- !(*end == '\0' || *end == ','))
- rte_exit(EXIT_FAILURE,
- "Invalid UDP port: %s\n",
- optarg);
- tx_udp_src_port = n;
- if (*end == ',') {
- char *dst = end + 1;
-
- n = strtoul(dst, &end, 10);
- if (errno != 0 || end == dst ||
- n > UINT16_MAX || *end)
- rte_exit(EXIT_FAILURE,
- "Invalid destination UDP port: %s\n",
- dst);
- tx_udp_dst_port = n;
- } else {
- tx_udp_dst_port = n;
- }
+ errno = 0;
+ n = strtoul(optarg, &port_end, 10);
+ if (errno != 0 || port_end == optarg || *port_end++ != ',')
+ rte_exit(EXIT_FAILURE,
+ "Invalid eth-peer: %s", optarg);
+ if (n >= RTE_MAX_ETHPORTS)
+ rte_exit(EXIT_FAILURE,
+ "eth-peer: port %d >= RTE_MAX_ETHPORTS(%d)\n",
+ n, RTE_MAX_ETHPORTS);
+
+ if (rte_ether_unformat_addr(port_end,
+ &peer_eth_addrs[n]) < 0)
+ rte_exit(EXIT_FAILURE,
+ "Invalid ethernet address: %s\n",
+ port_end);
+ nb_peer_eth_addrs++;
+ break;
+ }
+ case TESTPMD_OPT_TX_IP_NUM: {
+ struct in_addr in;
+ char *end;
+
+ end = strchr(optarg, ',');
+ if (end == optarg || !end)
+ rte_exit(EXIT_FAILURE,
+ "Invalid tx-ip: %s", optarg);
+
+ *end++ = 0;
+ if (inet_pton(AF_INET, optarg, &in) == 0)
+ rte_exit(EXIT_FAILURE,
+ "Invalid source IP address: %s\n",
+ optarg);
+ tx_ip_src_addr = rte_be_to_cpu_32(in.s_addr);
+
+ if (inet_pton(AF_INET, end, &in) == 0)
+ rte_exit(EXIT_FAILURE,
+ "Invalid destination IP address: %s\n",
+ optarg);
+ tx_ip_dst_addr = rte_be_to_cpu_32(in.s_addr);
+ break;
+ }
+ case TESTPMD_OPT_TX_UDP_NUM: {
+ char *end = NULL;
- }
- if (!strcmp(lgopts[opt_idx].name, "nb-ports")) {
- n = atoi(optarg);
- if (n > 0 && n <= nb_ports)
- nb_fwd_ports = n;
- else
- rte_exit(EXIT_FAILURE,
- "Invalid port %d\n", n);
- }
- if (!strcmp(lgopts[opt_idx].name, "nb-cores")) {
- n = atoi(optarg);
- if (n > 0 && n <= nb_lcores)
- nb_fwd_lcores = (uint8_t) n;
- else
+ errno = 0;
+ n = strtoul(optarg, &end, 10);
+ if (errno != 0 || end == optarg ||
+ n > UINT16_MAX ||
+ !(*end == '\0' || *end == ','))
+ rte_exit(EXIT_FAILURE,
+ "Invalid UDP port: %s\n",
+ optarg);
+ tx_udp_src_port = n;
+ if (*end == ',') {
+ char *dst = end + 1;
+
+ n = strtoul(dst, &end, 10);
+ if (errno != 0 || end == dst ||
+ n > UINT16_MAX || *end)
rte_exit(EXIT_FAILURE,
- "nb-cores should be > 0 and <= %d\n",
- nb_lcores);
+ "Invalid destination UDP port: %s\n",
+ dst);
+ tx_udp_dst_port = n;
+ } else {
+ tx_udp_dst_port = n;
}
- if (!strcmp(lgopts[opt_idx].name, "coremask"))
- 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"))
- numa_support = 1;
- if (!strcmp(lgopts[opt_idx].name, "mp-anon")) {
+ break;
+ }
+ case TESTPMD_OPT_NB_PORTS_NUM:
+ n = atoi(optarg);
+ if (n > 0 && n <= nb_ports)
+ nb_fwd_ports = n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "Invalid port %d\n", n);
+ break;
+ case TESTPMD_OPT_NB_CORES_NUM:
+ n = atoi(optarg);
+ if (n > 0 && n <= nb_lcores)
+ nb_fwd_lcores = (uint8_t) n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "nb-cores should be > 0 and <= %d\n",
+ nb_lcores);
+ break;
+ case TESTPMD_OPT_COREMASK_NUM:
+ parse_fwd_coremask(optarg);
+ break;
+ case TESTPMD_OPT_PORTMASK_NUM:
+ parse_fwd_portmask(optarg);
+ break;
+ case TESTPMD_OPT_PORTLIST_NUM:
+ parse_fwd_portlist(optarg);
+ break;
+ case TESTPMD_OPT_NO_NUMA_NUM:
+ numa_support = 0;
+ break;
+ case TESTPMD_OPT_NUMA_NUM:
+ numa_support = 1;
+ break;
+ case TESTPMD_OPT_MP_ANON_NUM:
+ mp_alloc_type = MP_ALLOC_ANON;
+ break;
+ case TESTPMD_OPT_MP_ALLOC_NUM:
+ if (!strcmp(optarg, "native"))
+ mp_alloc_type = MP_ALLOC_NATIVE;
+ else if (!strcmp(optarg, "anon"))
mp_alloc_type = MP_ALLOC_ANON;
+ else if (!strcmp(optarg, "xmem"))
+ 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: "
+ "native, anon, xmem or xmemhuge\n",
+ optarg);
+ break;
+ case TESTPMD_OPT_PORT_NUMA_CONFIG_NUM:
+ if (parse_portnuma_config(optarg))
+ rte_exit(EXIT_FAILURE,
+ "invalid port-numa configuration\n");
+ break;
+ case TESTPMD_OPT_RING_NUMA_CONFIG_NUM:
+ if (parse_ringnuma_config(optarg))
+ rte_exit(EXIT_FAILURE,
+ "invalid ring-numa configuration\n");
+ break;
+ case TESTPMD_OPT_SOCKET_NUM_NUM:
+ n = atoi(optarg);
+ if (!new_socket_id((uint8_t)n)) {
+ socket_num = (uint8_t)n;
+ } else {
+ print_invalid_socket_id_error();
+ rte_exit(EXIT_FAILURE,
+ "Invalid socket id");
}
- if (!strcmp(lgopts[opt_idx].name, "mp-alloc")) {
- if (!strcmp(optarg, "native"))
- mp_alloc_type = MP_ALLOC_NATIVE;
- else if (!strcmp(optarg, "anon"))
- mp_alloc_type = MP_ALLOC_ANON;
- else if (!strcmp(optarg, "xmem"))
- 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: "
- "native, anon, xmem or xmemhuge\n",
- optarg);
- }
- if (!strcmp(lgopts[opt_idx].name, "port-numa-config")) {
- if (parse_portnuma_config(optarg))
- rte_exit(EXIT_FAILURE,
- "invalid port-numa configuration\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "ring-numa-config"))
- if (parse_ringnuma_config(optarg))
- rte_exit(EXIT_FAILURE,
- "invalid ring-numa configuration\n");
- if (!strcmp(lgopts[opt_idx].name, "socket-num")) {
- n = atoi(optarg);
- if (!new_socket_id((uint8_t)n)) {
- socket_num = (uint8_t)n;
- } else {
- print_invalid_socket_id_error();
- rte_exit(EXIT_FAILURE,
- "Invalid socket id");
- }
- }
- if (!strcmp(lgopts[opt_idx].name, "mbuf-size")) {
- unsigned int mb_sz[MAX_SEGS_BUFFER_SPLIT];
- unsigned int nb_segs, i;
-
- nb_segs = parse_item_list(optarg, "mbuf-size",
- MAX_SEGS_BUFFER_SPLIT, mb_sz, 0);
- if (nb_segs <= 0)
- rte_exit(EXIT_FAILURE,
- "bad mbuf-size\n");
- for (i = 0; i < nb_segs; i++) {
- if (mb_sz[i] <= 0 || mb_sz[i] > 0xFFFF)
- rte_exit(EXIT_FAILURE,
- "mbuf-size should be "
- "> 0 and < 65536\n");
- mbuf_data_size[i] = (uint16_t) mb_sz[i];
- }
- mbuf_data_size_n = nb_segs;
- }
- if (!strcmp(lgopts[opt_idx].name, "total-num-mbufs")) {
- n = atoi(optarg);
- if (n > MIN_TOTAL_NUM_MBUFS)
- param_total_num_mbufs = (unsigned)n;
- else
- rte_exit(EXIT_FAILURE,
- "total-num-mbufs should be > %d\n",
- MIN_TOTAL_NUM_MBUFS);
- }
- if (!strcmp(lgopts[opt_idx].name, "max-pkt-len")) {
- n = atoi(optarg);
- if (n >= RTE_ETHER_MIN_LEN)
- max_rx_pkt_len = n;
- else
+ break;
+ case TESTPMD_OPT_MBUF_SIZE_NUM: {
+ unsigned int mb_sz[MAX_SEGS_BUFFER_SPLIT];
+ unsigned int nb_segs, i;
+
+ nb_segs = parse_item_list(optarg, "mbuf-size",
+ MAX_SEGS_BUFFER_SPLIT, mb_sz, 0);
+ if (nb_segs <= 0)
+ rte_exit(EXIT_FAILURE,
+ "bad mbuf-size\n");
+ for (i = 0; i < nb_segs; i++) {
+ if (mb_sz[i] <= 0 || mb_sz[i] > 0xFFFF)
rte_exit(EXIT_FAILURE,
- "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;
+ "mbuf-size should be "
+ "> 0 and < 65536\n");
+ mbuf_data_size[i] = (uint16_t) mb_sz[i];
}
+ mbuf_data_size_n = nb_segs;
+ break;
+ }
+ case TESTPMD_OPT_TOTAL_NUM_MBUFS_NUM:
+ n = atoi(optarg);
+ if (n > MIN_TOTAL_NUM_MBUFS)
+ param_total_num_mbufs = (unsigned int)n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "total-num-mbufs should be > %d\n",
+ MIN_TOTAL_NUM_MBUFS);
+ break;
+ case TESTPMD_OPT_MAX_PKT_LEN_NUM:
+ n = atoi(optarg);
+ if (n >= RTE_ETHER_MIN_LEN)
+ max_rx_pkt_len = n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "Invalid max-pkt-len=%d - should be > %d\n",
+ n, RTE_ETHER_MIN_LEN);
+ break;
+ case TESTPMD_OPT_MAX_LRO_PKT_SIZE_NUM:
+ n = atoi(optarg);
+ rx_mode.max_lro_pkt_size = (uint32_t) n;
+ break;
#ifdef RTE_LIB_LATENCYSTATS
- if (!strcmp(lgopts[opt_idx].name,
- "latencystats")) {
- n = atoi(optarg);
- if (n >= 0) {
- latencystats_lcore_id = (lcoreid_t) n;
- latencystats_enabled = 1;
- } else
- rte_exit(EXIT_FAILURE,
- "invalid lcore id %d for latencystats"
- " must be >= 0\n", n);
- }
+ case TESTPMD_OPT_LATENCYSTATS_NUM:
+ n = atoi(optarg);
+ if (n >= 0) {
+ latencystats_lcore_id = (lcoreid_t) n;
+ latencystats_enabled = 1;
+ } else
+ rte_exit(EXIT_FAILURE,
+ "invalid lcore id %d for latencystats"
+ " must be >= 0\n", n);
+
+ break;
#endif
#ifdef RTE_LIB_BITRATESTATS
- if (!strcmp(lgopts[opt_idx].name, "bitrate-stats")) {
- n = atoi(optarg);
- if (n >= 0) {
- bitrate_lcore_id = (lcoreid_t) n;
- bitrate_enabled = 1;
- } else
- rte_exit(EXIT_FAILURE,
- "invalid lcore id %d for bitrate stats"
- " must be >= 0\n", n);
- }
+ case TESTPMD_OPT_BITRATE_STATS_NUM:
+ n = atoi(optarg);
+ if (n >= 0) {
+ bitrate_lcore_id = (lcoreid_t) n;
+ bitrate_enabled = 1;
+ } else
+ rte_exit(EXIT_FAILURE,
+ "invalid lcore id %d for bitrate stats"
+ " must be >= 0\n", n);
+ break;
#endif
- if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip"))
- rx_offloads |= RTE_ETH_RX_OFFLOAD_KEEP_CRC;
- if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
- rx_offloads |= RTE_ETH_RX_OFFLOAD_TCP_LRO;
- if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
- rx_offloads |= RTE_ETH_RX_OFFLOAD_SCATTER;
- if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum"))
- rx_offloads |= RTE_ETH_RX_OFFLOAD_CHECKSUM;
- if (!strcmp(lgopts[opt_idx].name,
- "enable-rx-timestamp"))
- rx_offloads |= RTE_ETH_RX_OFFLOAD_TIMESTAMP;
- if (!strcmp(lgopts[opt_idx].name, "enable-hw-vlan"))
- rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN;
-
- if (!strcmp(lgopts[opt_idx].name,
- "enable-hw-vlan-filter"))
- rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_FILTER;
-
- if (!strcmp(lgopts[opt_idx].name,
- "enable-hw-vlan-strip"))
- rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
-
- if (!strcmp(lgopts[opt_idx].name,
- "enable-hw-vlan-extend"))
- rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_EXTEND;
-
- if (!strcmp(lgopts[opt_idx].name,
- "enable-hw-qinq-strip"))
- rx_offloads |= RTE_ETH_RX_OFFLOAD_QINQ_STRIP;
-
- if (!strcmp(lgopts[opt_idx].name, "enable-drop-en"))
- rx_drop_en = 1;
-
- if (!strcmp(lgopts[opt_idx].name, "disable-rss"))
- rss_hf = 0;
- if (!strcmp(lgopts[opt_idx].name, "port-topology")) {
- if (!strcmp(optarg, "paired"))
- port_topology = PORT_TOPOLOGY_PAIRED;
- else if (!strcmp(optarg, "chained"))
- port_topology = PORT_TOPOLOGY_CHAINED;
- else if (!strcmp(optarg, "loop"))
- port_topology = PORT_TOPOLOGY_LOOP;
- else
- rte_exit(EXIT_FAILURE, "port-topology %s invalid -"
- " must be: paired, chained or loop\n",
- optarg);
- }
- if (!strcmp(lgopts[opt_idx].name, "forward-mode"))
- set_pkt_forwarding_mode(optarg);
- if (!strcmp(lgopts[opt_idx].name, "rss-ip"))
- rss_hf = RTE_ETH_RSS_IP;
- if (!strcmp(lgopts[opt_idx].name, "rss-udp"))
- rss_hf = RTE_ETH_RSS_UDP;
- if (!strcmp(lgopts[opt_idx].name, "rss-level-inner"))
- rss_hf |= RTE_ETH_RSS_LEVEL_INNERMOST;
- if (!strcmp(lgopts[opt_idx].name, "rss-level-outer"))
- rss_hf |= RTE_ETH_RSS_LEVEL_OUTERMOST;
- if (!strcmp(lgopts[opt_idx].name, "rxq")) {
- n = atoi(optarg);
- if (n >= 0 && check_nb_rxq((queueid_t)n) == 0)
- nb_rxq = (queueid_t) n;
- else
- rte_exit(EXIT_FAILURE, "rxq %d invalid - must be"
- " >= 0 && <= %u\n", n,
- get_allowed_max_nb_rxq(&pid));
- }
- if (!strcmp(lgopts[opt_idx].name, "txq")) {
- n = atoi(optarg);
- if (n >= 0 && check_nb_txq((queueid_t)n) == 0)
- nb_txq = (queueid_t) n;
- else
- rte_exit(EXIT_FAILURE, "txq %d invalid - must be"
- " >= 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 (!strcmp(lgopts[opt_idx].name, "hairpin-mode")) {
- char *end = NULL;
- unsigned int n;
-
- errno = 0;
- n = strtoul(optarg, &end, 0);
- if (errno != 0 || end == optarg)
- rte_exit(EXIT_FAILURE, "hairpin mode invalid\n");
- else
- hairpin_mode = (uint32_t)n;
- }
- if (!strcmp(lgopts[opt_idx].name, "burst")) {
- n = atoi(optarg);
- if (n == 0) {
- /* A burst size of zero means that the
- * PMD should be queried for
- * recommended Rx burst size. Since
- * testpmd uses a single size for all
- * ports, port 0 is queried for the
- * value, on the assumption that all
- * ports are of the same NIC model.
- */
- ret = eth_dev_info_get_print_err(
- 0,
- &dev_info);
- if (ret != 0)
- rte_exit(EXIT_FAILURE, "Failed to get driver "
- "recommended burst size, please provide a "
- "value between 1 and %d\n", MAX_PKT_BURST);
-
- rec_nb_pkts = dev_info
- .default_rxportconf.burst_size;
-
- if (rec_nb_pkts == 0)
- rte_exit(EXIT_FAILURE,
- "PMD does not recommend a burst size. "
- "Provided value must be between "
- "1 and %d\n", MAX_PKT_BURST);
- else if (rec_nb_pkts > MAX_PKT_BURST)
- rte_exit(EXIT_FAILURE,
- "PMD recommended burst size of %d"
- " exceeds maximum value of %d\n",
- rec_nb_pkts, MAX_PKT_BURST);
- printf("Using PMD-provided burst value of %d\n",
- rec_nb_pkts);
- nb_pkt_per_burst = rec_nb_pkts;
- } else if (n > MAX_PKT_BURST)
- rte_exit(EXIT_FAILURE,
- "burst must be between1 and %d\n",
- MAX_PKT_BURST);
- else
- nb_pkt_per_burst = (uint16_t) n;
- }
- if (!strcmp(lgopts[opt_idx].name, "flowgen-clones")) {
- n = atoi(optarg);
- if (n >= 0)
- nb_pkt_flowgen_clones = (uint16_t) n;
- else
+ case TESTPMD_OPT_DISABLE_CRC_STRIP_NUM:
+ rx_offloads |= RTE_ETH_RX_OFFLOAD_KEEP_CRC;
+ break;
+ case TESTPMD_OPT_ENABLE_LRO_NUM:
+ rx_offloads |= RTE_ETH_RX_OFFLOAD_TCP_LRO;
+ break;
+ case TESTPMD_OPT_ENABLE_SCATTER_NUM:
+ rx_offloads |= RTE_ETH_RX_OFFLOAD_SCATTER;
+ break;
+ case TESTPMD_OPT_ENABLE_RX_CKSUM_NUM:
+ rx_offloads |= RTE_ETH_RX_OFFLOAD_CHECKSUM;
+ break;
+ case TESTPMD_OPT_ENABLE_RX_TIMESTAMP_NUM:
+ rx_offloads |= RTE_ETH_RX_OFFLOAD_TIMESTAMP;
+ break;
+ case TESTPMD_OPT_ENABLE_HW_VLAN_NUM:
+ rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN;
+ break;
+ case TESTPMD_OPT_ENABLE_HW_VLAN_FILTER_NUM:
+ rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_FILTER;
+ break;
+ case TESTPMD_OPT_ENABLE_HW_VLAN_STRIP_NUM:
+ rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
+ break;
+ case TESTPMD_OPT_ENABLE_HW_VLAN_EXTEND_NUM:
+ rx_offloads |= RTE_ETH_RX_OFFLOAD_VLAN_EXTEND;
+ break;
+ case TESTPMD_OPT_ENABLE_HW_QINQ_STRIP_NUM:
+ rx_offloads |= RTE_ETH_RX_OFFLOAD_QINQ_STRIP;
+ break;
+ case TESTPMD_OPT_ENABLE_DROP_EN_NUM:
+ rx_drop_en = 1;
+ break;
+ case TESTPMD_OPT_DISABLE_RSS_NUM:
+ rss_hf = 0;
+ break;
+ case TESTPMD_OPT_PORT_TOPOLOGY_NUM:
+ if (!strcmp(optarg, "paired"))
+ port_topology = PORT_TOPOLOGY_PAIRED;
+ else if (!strcmp(optarg, "chained"))
+ port_topology = PORT_TOPOLOGY_CHAINED;
+ else if (!strcmp(optarg, "loop"))
+ port_topology = PORT_TOPOLOGY_LOOP;
+ else
+ rte_exit(EXIT_FAILURE, "port-topology %s invalid -"
+ " must be: paired, chained or loop\n",
+ optarg);
+ break;
+ case TESTPMD_OPT_FORWARD_MODE_NUM:
+ set_pkt_forwarding_mode(optarg);
+ break;
+ case TESTPMD_OPT_RSS_IP_NUM:
+ rss_hf = RTE_ETH_RSS_IP;
+ break;
+ case TESTPMD_OPT_RSS_UDP_NUM:
+ rss_hf = RTE_ETH_RSS_UDP;
+ break;
+ case TESTPMD_OPT_RSS_LEVEL_INNER_NUM:
+ rss_hf |= RTE_ETH_RSS_LEVEL_INNERMOST;
+ break;
+ case TESTPMD_OPT_RSS_LEVEL_OUTER_NUM:
+ rss_hf |= RTE_ETH_RSS_LEVEL_OUTERMOST;
+ break;
+ case TESTPMD_OPT_RXQ_NUM:
+ n = atoi(optarg);
+ if (n >= 0 && check_nb_rxq((queueid_t)n) == 0)
+ nb_rxq = (queueid_t) n;
+ else
+ rte_exit(EXIT_FAILURE, "rxq %d invalid - must be"
+ " >= 0 && <= %u\n", n,
+ get_allowed_max_nb_rxq(&pid));
+ break;
+ case TESTPMD_OPT_TXQ_NUM:
+ n = atoi(optarg);
+ if (n >= 0 && check_nb_txq((queueid_t)n) == 0)
+ nb_txq = (queueid_t) n;
+ else
+ rte_exit(EXIT_FAILURE, "txq %d invalid - must be"
+ " >= 0 && <= %u\n", n,
+ get_allowed_max_nb_txq(&pid));
+ break;
+ case TESTPMD_OPT_HAIRPINQ_NUM:
+ 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));
+ break;
+ case TESTPMD_OPT_HAIRPIN_MODE_NUM: {
+ char *end = NULL;
+ unsigned int n;
+
+ errno = 0;
+ n = strtoul(optarg, &end, 0);
+ if (errno != 0 || end == optarg)
+ rte_exit(EXIT_FAILURE, "hairpin mode invalid\n");
+ else
+ hairpin_mode = (uint32_t)n;
+ break;
+ }
+ case TESTPMD_OPT_BURST_NUM:
+ n = atoi(optarg);
+ if (n == 0) {
+ /* A burst size of zero means that the
+ * PMD should be queried for
+ * recommended Rx burst size. Since
+ * testpmd uses a single size for all
+ * ports, port 0 is queried for the
+ * value, on the assumption that all
+ * ports are of the same NIC model.
+ */
+ ret = eth_dev_info_get_print_err(
+ 0,
+ &dev_info);
+ if (ret != 0)
+ rte_exit(EXIT_FAILURE, "Failed to get driver "
+ "recommended burst size, please provide a "
+ "value between 1 and %d\n", MAX_PKT_BURST);
+
+ rec_nb_pkts = dev_info
+ .default_rxportconf.burst_size;
+
+ if (rec_nb_pkts == 0)
rte_exit(EXIT_FAILURE,
- "clones must be >= 0 and <= current burst\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "flowgen-flows")) {
- n = atoi(optarg);
- if (n > 0)
- nb_flows_flowgen = (int) n;
- else
+ "PMD does not recommend a burst size. "
+ "Provided value must be between "
+ "1 and %d\n", MAX_PKT_BURST);
+ else if (rec_nb_pkts > MAX_PKT_BURST)
rte_exit(EXIT_FAILURE,
- "flows must be >= 1\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "mbcache")) {
- n = atoi(optarg);
- if ((n >= 0) &&
- (n <= RTE_MEMPOOL_CACHE_MAX_SIZE))
- mb_mempool_cache = (uint16_t) n;
- else
- rte_exit(EXIT_FAILURE,
- "mbcache must be >= 0 and <= %d\n",
- RTE_MEMPOOL_CACHE_MAX_SIZE);
- }
- if (!strcmp(lgopts[opt_idx].name, "txfreet")) {
- n = atoi(optarg);
- if (n >= 0)
- tx_free_thresh = (int16_t)n;
- else
- rte_exit(EXIT_FAILURE, "txfreet must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "txrst")) {
- n = atoi(optarg);
- if (n >= 0)
- tx_rs_thresh = (int16_t)n;
- else
- rte_exit(EXIT_FAILURE, "txrst must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "rxd")) {
- n = atoi(optarg);
- if (n > 0) {
- if (rx_free_thresh >= n)
- rte_exit(EXIT_FAILURE,
- "rxd must be > "
- "rx_free_thresh(%d)\n",
- (int)rx_free_thresh);
- else
- nb_rxd = (uint16_t) n;
- } else
+ "PMD recommended burst size of %d"
+ " exceeds maximum value of %d\n",
+ rec_nb_pkts, MAX_PKT_BURST);
+ printf("Using PMD-provided burst value of %d\n",
+ rec_nb_pkts);
+ nb_pkt_per_burst = rec_nb_pkts;
+ } else if (n > MAX_PKT_BURST)
+ rte_exit(EXIT_FAILURE,
+ "burst must be between1 and %d\n",
+ MAX_PKT_BURST);
+ else
+ nb_pkt_per_burst = (uint16_t) n;
+ break;
+ case TESTPMD_OPT_FLOWGEN_CLONES_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ nb_pkt_flowgen_clones = (uint16_t) n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "clones must be >= 0 and <= current burst\n");
+ break;
+ case TESTPMD_OPT_FLOWGEN_FLOWS_NUM:
+ n = atoi(optarg);
+ if (n > 0)
+ nb_flows_flowgen = (int) n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "flows must be >= 1\n");
+ break;
+ case TESTPMD_OPT_MBCACHE_NUM:
+ n = atoi(optarg);
+ if ((n >= 0) &&
+ (n <= RTE_MEMPOOL_CACHE_MAX_SIZE))
+ mb_mempool_cache = (uint16_t) n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "mbcache must be >= 0 and <= %d\n",
+ RTE_MEMPOOL_CACHE_MAX_SIZE);
+ break;
+ case TESTPMD_OPT_TXFREET_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ tx_free_thresh = (int16_t)n;
+ else
+ rte_exit(EXIT_FAILURE, "txfreet must be >= 0\n");
+ break;
+ case TESTPMD_OPT_TXRST_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ tx_rs_thresh = (int16_t)n;
+ else
+ rte_exit(EXIT_FAILURE, "txrst must be >= 0\n");
+ break;
+ case TESTPMD_OPT_RXD_NUM:
+ n = atoi(optarg);
+ if (n > 0) {
+ if (rx_free_thresh >= n)
rte_exit(EXIT_FAILURE,
- "rxd(%d) invalid - must be > 0\n",
- n);
- }
- if (!strcmp(lgopts[opt_idx].name, "txd")) {
- n = atoi(optarg);
- if (n > 0)
- nb_txd = (uint16_t) n;
+ "rxd must be > "
+ "rx_free_thresh(%d)\n",
+ (int)rx_free_thresh);
else
- rte_exit(EXIT_FAILURE, "txd must be in > 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "txpt")) {
- n = atoi(optarg);
- if (n >= 0)
- tx_pthresh = (int8_t)n;
- else
- rte_exit(EXIT_FAILURE, "txpt must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "txht")) {
- n = atoi(optarg);
- if (n >= 0)
- tx_hthresh = (int8_t)n;
- else
- rte_exit(EXIT_FAILURE, "txht must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "txwt")) {
- n = atoi(optarg);
- if (n >= 0)
- tx_wthresh = (int8_t)n;
- else
- rte_exit(EXIT_FAILURE, "txwt must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "rxpt")) {
- n = atoi(optarg);
- if (n >= 0)
- rx_pthresh = (int8_t)n;
- else
- rte_exit(EXIT_FAILURE, "rxpt must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "rxht")) {
- n = atoi(optarg);
- if (n >= 0)
- rx_hthresh = (int8_t)n;
- else
- rte_exit(EXIT_FAILURE, "rxht must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "rxwt")) {
- n = atoi(optarg);
- if (n >= 0)
- rx_wthresh = (int8_t)n;
- else
- rte_exit(EXIT_FAILURE, "rxwt must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "rxfreet")) {
+ nb_rxd = (uint16_t) n;
+ } else
+ rte_exit(EXIT_FAILURE,
+ "rxd(%d) invalid - must be > 0\n",
+ n);
+ break;
+ case TESTPMD_OPT_TXD_NUM:
+ n = atoi(optarg);
+ if (n > 0)
+ nb_txd = (uint16_t) n;
+ else
+ rte_exit(EXIT_FAILURE, "txd must be in > 0\n");
+ break;
+ case TESTPMD_OPT_TXPT_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ tx_pthresh = (int8_t)n;
+ else
+ rte_exit(EXIT_FAILURE, "txpt must be >= 0\n");
+ break;
+ case TESTPMD_OPT_TXHT_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ tx_hthresh = (int8_t)n;
+ else
+ rte_exit(EXIT_FAILURE, "txht must be >= 0\n");
+ break;
+ case TESTPMD_OPT_TXWT_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ tx_wthresh = (int8_t)n;
+ else
+ rte_exit(EXIT_FAILURE, "txwt must be >= 0\n");
+ break;
+ case TESTPMD_OPT_RXPT_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ rx_pthresh = (int8_t)n;
+ else
+ rte_exit(EXIT_FAILURE, "rxpt must be >= 0\n");
+ break;
+ case TESTPMD_OPT_RXHT_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ rx_hthresh = (int8_t)n;
+ else
+ rte_exit(EXIT_FAILURE, "rxht must be >= 0\n");
+ break;
+ case TESTPMD_OPT_RXWT_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ rx_wthresh = (int8_t)n;
+ else
+ rte_exit(EXIT_FAILURE, "rxwt must be >= 0\n");
+ break;
+ case TESTPMD_OPT_RXFREET_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ rx_free_thresh = (int16_t)n;
+ else
+ rte_exit(EXIT_FAILURE, "rxfreet must be >= 0\n");
+ break;
+ case TESTPMD_OPT_RXOFFS_NUM: {
+ unsigned int seg_off[MAX_SEGS_BUFFER_SPLIT];
+ unsigned int nb_offs;
+
+ nb_offs = parse_item_list
+ (optarg, "rxpkt offsets",
+ MAX_SEGS_BUFFER_SPLIT,
+ seg_off, 0);
+ if (nb_offs > 0)
+ set_rx_pkt_offsets(seg_off, nb_offs);
+ else
+ rte_exit(EXIT_FAILURE, "bad rxoffs\n");
+ break;
+ }
+ case TESTPMD_OPT_RXPKTS_NUM: {
+ unsigned int seg_len[MAX_SEGS_BUFFER_SPLIT];
+ unsigned int nb_segs;
+
+ nb_segs = parse_item_list
+ (optarg, "rxpkt segments",
+ MAX_SEGS_BUFFER_SPLIT,
+ seg_len, 0);
+ if (nb_segs > 0)
+ set_rx_pkt_segments(seg_len, nb_segs);
+ else
+ rte_exit(EXIT_FAILURE, "bad rxpkts\n");
+ break;
+ }
+ case TESTPMD_OPT_RXHDRS_NUM: {
+ unsigned int seg_hdrs[MAX_SEGS_BUFFER_SPLIT];
+ unsigned int nb_segs;
+
+ nb_segs = parse_hdrs_list
+ (optarg, "rxpkt segments",
+ MAX_SEGS_BUFFER_SPLIT,
+ seg_hdrs);
+ if (nb_segs > 0)
+ set_rx_pkt_hdrs(seg_hdrs, nb_segs);
+ else
+ rte_exit(EXIT_FAILURE, "bad rxpkts\n");
+ break;
+ }
+ case TESTPMD_OPT_TXPKTS_NUM: {
+ unsigned int seg_lengths[RTE_MAX_SEGS_PER_PKT];
+ unsigned int nb_segs;
+
+ nb_segs = parse_item_list(optarg, "txpkt segments",
+ RTE_MAX_SEGS_PER_PKT, seg_lengths, 0);
+ if (nb_segs > 0)
+ set_tx_pkt_segments(seg_lengths, nb_segs);
+ else
+ rte_exit(EXIT_FAILURE, "bad txpkts\n");
+ break;
+ }
+ case TESTPMD_OPT_MULTI_RX_MEMPOOL_NUM:
+ multi_rx_mempool = 1;
+ break;
+ case TESTPMD_OPT_TXONLY_MULTI_FLOW_NUM:
+ txonly_multi_flow = 1;
+ break;
+ case TESTPMD_OPT_RXQ_SHARE_NUM:
+ if (optarg == NULL) {
+ rxq_share = UINT32_MAX;
+ } else {
n = atoi(optarg);
if (n >= 0)
- rx_free_thresh = (int16_t)n;
- else
- rte_exit(EXIT_FAILURE, "rxfreet must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "rxoffs")) {
- unsigned int seg_off[MAX_SEGS_BUFFER_SPLIT];
- unsigned int nb_offs;
-
- nb_offs = parse_item_list
- (optarg, "rxpkt offsets",
- MAX_SEGS_BUFFER_SPLIT,
- seg_off, 0);
- if (nb_offs > 0)
- set_rx_pkt_offsets(seg_off, nb_offs);
- else
- rte_exit(EXIT_FAILURE, "bad rxoffs\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "rxpkts")) {
- unsigned int seg_len[MAX_SEGS_BUFFER_SPLIT];
- unsigned int nb_segs;
- nb_segs = parse_item_list
- (optarg, "rxpkt segments",
- MAX_SEGS_BUFFER_SPLIT,
- seg_len, 0);
- if (nb_segs > 0)
- set_rx_pkt_segments(seg_len, nb_segs);
- else
- rte_exit(EXIT_FAILURE, "bad rxpkts\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "rxhdrs")) {
- unsigned int seg_hdrs[MAX_SEGS_BUFFER_SPLIT];
- unsigned int nb_segs;
-
- nb_segs = parse_hdrs_list
- (optarg, "rxpkt segments",
- MAX_SEGS_BUFFER_SPLIT,
- seg_hdrs);
- if (nb_segs > 0)
- set_rx_pkt_hdrs(seg_hdrs, nb_segs);
- else
- rte_exit(EXIT_FAILURE, "bad rxpkts\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, "txpkt segments",
- RTE_MAX_SEGS_PER_PKT, seg_lengths, 0);
- if (nb_segs > 0)
- set_tx_pkt_segments(seg_lengths, nb_segs);
+ rxq_share = (uint32_t)n;
else
- rte_exit(EXIT_FAILURE, "bad txpkts\n");
+ rte_exit(EXIT_FAILURE, "rxq-share must be >= 0\n");
}
- if (!strcmp(lgopts[opt_idx].name, "multi-rx-mempool"))
- multi_rx_mempool = 1;
- if (!strcmp(lgopts[opt_idx].name, "txonly-multi-flow"))
- txonly_multi_flow = 1;
- if (!strcmp(lgopts[opt_idx].name, "rxq-share")) {
- if (optarg == NULL) {
- rxq_share = UINT32_MAX;
- } else {
- n = atoi(optarg);
- if (n >= 0)
- rxq_share = (uint32_t)n;
- else
- rte_exit(EXIT_FAILURE, "rxq-share must be >= 0\n");
- }
- }
- if (!strcmp(lgopts[opt_idx].name, "no-flush-rx"))
- no_flush_rx = 1;
- if (!strcmp(lgopts[opt_idx].name, "eth-link-speed")) {
- n = atoi(optarg);
- if (n >= 0 && parse_link_speed(n) > 0)
- eth_link_speed = parse_link_speed(n);
- }
- if (!strcmp(lgopts[opt_idx].name, "disable-link-check"))
- no_link_check = 1;
- if (!strcmp(lgopts[opt_idx].name, "disable-device-start"))
- no_device_start = 1;
- if (!strcmp(lgopts[opt_idx].name, "no-lsc-interrupt"))
- lsc_interrupt = 0;
- if (!strcmp(lgopts[opt_idx].name, "no-rmv-interrupt"))
- rmv_interrupt = 0;
- if (!strcmp(lgopts[opt_idx].name, "flow-isolate-all"))
- flow_isolate_all = 1;
- if (!strcmp(lgopts[opt_idx].name, "disable-flow-flush"))
- no_flow_flush = 1;
- if (!strcmp(lgopts[opt_idx].name, "tx-offloads")) {
- char *end = NULL;
- n = strtoull(optarg, &end, 16);
- if (n >= 0)
- tx_offloads = (uint64_t)n;
- else
- rte_exit(EXIT_FAILURE,
- "tx-offloads must be >= 0\n");
+ break;
+ case TESTPMD_OPT_NO_FLUSH_RX_NUM:
+ no_flush_rx = 1;
+ break;
+ case TESTPMD_OPT_ETH_LINK_SPEED_NUM:
+ n = atoi(optarg);
+ if (n >= 0 && parse_link_speed(n) > 0)
+ eth_link_speed = parse_link_speed(n);
+ break;
+ case TESTPMD_OPT_DISABLE_LINK_CHECK_NUM:
+ no_link_check = 1;
+ break;
+ case TESTPMD_OPT_DISABLE_DEVICE_START_NUM:
+ no_device_start = 1;
+ break;
+ case TESTPMD_OPT_NO_LSC_INTERRUPT_NUM:
+ lsc_interrupt = 0;
+ break;
+ case TESTPMD_OPT_NO_RMV_INTERRUPT_NUM:
+ rmv_interrupt = 0;
+ break;
+ case TESTPMD_OPT_FLOW_ISOLATE_ALL_NUM:
+ flow_isolate_all = 1;
+ break;
+ case TESTPMD_OPT_DISABLE_FLOW_FLUSH_NUM:
+ no_flow_flush = 1;
+ break;
+ case TESTPMD_OPT_TX_OFFLOADS_NUM: {
+ char *end = NULL;
+
+ n = strtoull(optarg, &end, 16);
+ if (n >= 0)
+ tx_offloads = (uint64_t)n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "tx-offloads must be >= 0\n");
+ break;
+ }
+ case TESTPMD_OPT_RX_OFFLOADS_NUM: {
+ 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");
+ break;
+ }
+ case TESTPMD_OPT_VXLAN_GPE_PORT_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ vxlan_gpe_udp_port = (uint16_t)n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "vxlan-gpe-port must be >= 0\n");
+ break;
+ case TESTPMD_OPT_GENEVE_PARSED_PORT_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ geneve_udp_port = (uint16_t)n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "geneve-parsed-port must be >= 0\n");
+ break;
+ case TESTPMD_OPT_PRINT_EVENT_NUM:
+ if (parse_event_printing_config(optarg, 1)) {
+ rte_exit(EXIT_FAILURE,
+ "invalid print-event argument\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");
+ break;
+ case TESTPMD_OPT_MASK_EVENT_NUM:
+ if (parse_event_printing_config(optarg, 0)) {
+ rte_exit(EXIT_FAILURE,
+ "invalid mask-event argument\n");
}
+ break;
+ case TESTPMD_OPT_HOT_PLUG_NUM:
+ hot_plug = 1;
+ break;
+ case TESTPMD_OPT_MLOCKALL_NUM:
+ do_mlockall = 1;
+ break;
+ case TESTPMD_OPT_NO_MLOCKALL_NUM:
+ do_mlockall = 0;
+ break;
+ case TESTPMD_OPT_NOISY_TX_SW_BUFFER_SIZE_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ noisy_tx_sw_bufsz = n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "noisy-tx-sw-buffer-size must be >= 0\n");
+ break;
+ case TESTPMD_OPT_NOISY_TX_SW_BUFFER_FLUSHTIME_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ noisy_tx_sw_buf_flush_time = n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "noisy-tx-sw-buffer-flushtime must be >= 0\n");
+ break;
+ case TESTPMD_OPT_NOISY_LKUP_MEMORY_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ noisy_lkup_mem_sz = n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "noisy-lkup-memory must be >= 0\n");
+ break;
+ case TESTPMD_OPT_NOISY_LKUP_NUM_WRITES_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ noisy_lkup_num_writes = n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "noisy-lkup-num-writes must be >= 0\n");
+ break;
+ case TESTPMD_OPT_NOISY_LKUP_NUM_READS_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ noisy_lkup_num_reads = n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "noisy-lkup-num-reads must be >= 0\n");
+ break;
+ case TESTPMD_OPT_NOISY_LKUP_NUM_READS_WRITES_NUM:
+ n = atoi(optarg);
+ if (n >= 0)
+ noisy_lkup_num_reads_writes = n;
+ else
+ rte_exit(EXIT_FAILURE,
+ "noisy-lkup-num-reads-writes must be >= 0\n");
+ break;
+ case TESTPMD_OPT_NOISY_FORWARD_MODE_NUM: {
+ unsigned int i;
- if (!strcmp(lgopts[opt_idx].name, "vxlan-gpe-port")) {
- n = atoi(optarg);
- if (n >= 0)
- vxlan_gpe_udp_port = (uint16_t)n;
- else
- rte_exit(EXIT_FAILURE,
- "vxlan-gpe-port must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name,
- "geneve-parsed-port")) {
- n = atoi(optarg);
- if (n >= 0)
- geneve_udp_port = (uint16_t)n;
- else
- rte_exit(EXIT_FAILURE,
- "geneve-parsed-port must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "print-event"))
- if (parse_event_printing_config(optarg, 1)) {
- rte_exit(EXIT_FAILURE,
- "invalid print-event argument\n");
- }
- if (!strcmp(lgopts[opt_idx].name, "mask-event"))
- if (parse_event_printing_config(optarg, 0)) {
- rte_exit(EXIT_FAILURE,
- "invalid mask-event argument\n");
+ for (i = 0; i < NOISY_FWD_MODE_MAX; i++) {
+ if (!strcmp(optarg, noisy_fwd_mode_desc[i])) {
+ noisy_fwd_mode = i;
+ break;
}
- if (!strcmp(lgopts[opt_idx].name, "hot-plug"))
- hot_plug = 1;
- if (!strcmp(lgopts[opt_idx].name, "mlockall"))
- do_mlockall = 1;
- if (!strcmp(lgopts[opt_idx].name, "no-mlockall"))
- do_mlockall = 0;
- if (!strcmp(lgopts[opt_idx].name,
- "noisy-tx-sw-buffer-size")) {
- n = atoi(optarg);
- if (n >= 0)
- noisy_tx_sw_bufsz = n;
- else
- rte_exit(EXIT_FAILURE,
- "noisy-tx-sw-buffer-size must be >= 0\n");
}
- if (!strcmp(lgopts[opt_idx].name,
- "noisy-tx-sw-buffer-flushtime")) {
- n = atoi(optarg);
- if (n >= 0)
- noisy_tx_sw_buf_flush_time = n;
- else
- rte_exit(EXIT_FAILURE,
- "noisy-tx-sw-buffer-flushtime must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name,
- "noisy-lkup-memory")) {
- n = atoi(optarg);
- if (n >= 0)
- noisy_lkup_mem_sz = n;
- else
- rte_exit(EXIT_FAILURE,
- "noisy-lkup-memory must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name,
- "noisy-lkup-num-writes")) {
- n = atoi(optarg);
- if (n >= 0)
- noisy_lkup_num_writes = n;
- else
- rte_exit(EXIT_FAILURE,
- "noisy-lkup-num-writes must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name,
- "noisy-lkup-num-reads")) {
- n = atoi(optarg);
- if (n >= 0)
- noisy_lkup_num_reads = n;
- else
- rte_exit(EXIT_FAILURE,
- "noisy-lkup-num-reads must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name,
- "noisy-lkup-num-reads-writes")) {
- n = atoi(optarg);
- if (n >= 0)
- noisy_lkup_num_reads_writes = n;
- else
- rte_exit(EXIT_FAILURE,
- "noisy-lkup-num-reads-writes must be >= 0\n");
- }
- if (!strcmp(lgopts[opt_idx].name,
- "noisy-forward-mode")) {
- int i;
- for (i = 0; i < NOISY_FWD_MODE_MAX; i++)
- if (!strcmp(optarg, noisy_fwd_mode_desc[i])) {
- noisy_fwd_mode = i;
- break;
- }
- if (i == NOISY_FWD_MODE_MAX)
- rte_exit(EXIT_FAILURE, "noisy-forward-mode %s invalid,"
- " must be a valid noisy-forward-mode value\n",
- optarg);
- }
- if (!strcmp(lgopts[opt_idx].name, "no-iova-contig"))
- mempool_flags = RTE_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 <= RTE_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",
- RTE_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;
- if (!strcmp(lgopts[opt_idx].name, PARAM_NUM_PROCS))
- num_procs = atoi(optarg);
- if (!strcmp(lgopts[opt_idx].name, PARAM_PROC_ID))
- proc_id = atoi(optarg);
+ if (i == NOISY_FWD_MODE_MAX)
+ rte_exit(EXIT_FAILURE, "noisy-forward-mode %s invalid,"
+ " must be a valid noisy-forward-mode value\n",
+ optarg);
break;
- case 'h':
- usage(argv[0]);
- exit(EXIT_SUCCESS);
+ }
+ case TESTPMD_OPT_NO_IOVA_CONTIG_NUM:
+ mempool_flags = RTE_MEMPOOL_F_NO_IOVA_CONTIG;
+ break;
+ case TESTPMD_OPT_RX_MQ_MODE_NUM: {
+ char *end = NULL;
+
+ n = strtoul(optarg, &end, 16);
+ if (n >= 0 && n <= RTE_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",
+ RTE_ETH_MQ_RX_VMDQ_DCB_RSS);
+ break;
+ }
+ case TESTPMD_OPT_RECORD_CORE_CYCLES_NUM:
+ record_core_cycles = 1;
+ break;
+ case TESTPMD_OPT_RECORD_BURST_STATS_NUM:
+ record_burst_stats = 1;
+ break;
+ case TESTPMD_OPT_NUM_PROCS_NUM:
+ num_procs = atoi(optarg);
+ break;
+ case TESTPMD_OPT_PROC_ID_NUM:
+ proc_id = atoi(optarg);
break;
default:
usage(argv[0]);
@@ -1491,9 +1733,9 @@ launch_args_parse(int argc, char** argv)
if (proc_id >= (int)num_procs)
rte_exit(EXIT_FAILURE,
- "The multi-process option '%s(%d)' should be less than '%s(%u)'\n",
- PARAM_PROC_ID, proc_id,
- PARAM_NUM_PROCS, num_procs);
+ "The multi-process option '%s(%d)' should be less than '%s(%u)'\n",
+ TESTPMD_OPT_PROC_ID, proc_id,
+ TESTPMD_OPT_NUM_PROCS, num_procs);
/* Set offload configuration from command line parameters. */
rx_mode.offloads = rx_offloads;
--
2.44.0
next prev parent reply other threads:[~2024-03-14 9:17 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-08 14:48 [PATCH 0/4] testpmd options parsing cleanup David Marchand
2024-03-08 14:48 ` [PATCH 1/4] app/testpmd: fix stats-period option check David Marchand
2024-03-12 16:43 ` Ferruh Yigit
2024-03-08 14:48 ` [PATCH 2/4] app/testpmd: fix burst option parsing David Marchand
2024-03-12 16:47 ` Ferruh Yigit
2024-03-13 7:24 ` David Marchand
2024-03-13 10:37 ` Ferruh Yigit
2024-03-13 11:13 ` David Marchand
2024-03-13 12:09 ` Ferruh Yigit
2024-03-13 16:32 ` Stephen Hemminger
2024-03-08 14:48 ` [PATCH 3/4] app/testpmd: check queue count for related options David Marchand
2024-03-12 16:59 ` Ferruh Yigit
2024-03-13 7:37 ` David Marchand
2024-03-13 10:42 ` Ferruh Yigit
2024-03-13 11:10 ` David Marchand
2024-03-13 12:18 ` Ferruh Yigit
2024-03-08 14:48 ` [PATCH 4/4] app/testpmd: enhance getopt_long usage David Marchand
2024-03-12 17:03 ` Ferruh Yigit
2024-03-13 16:51 ` David Marchand
2024-03-13 17:20 ` David Marchand
2024-03-13 23:28 ` Ferruh Yigit
2024-03-13 23:28 ` Ferruh Yigit
2024-03-14 9:17 ` [PATCH v2 0/6] testpmd options parsing cleanup David Marchand
2024-03-14 9:17 ` [PATCH v2 1/6] app/testpmd: fix stats-period option check David Marchand
2024-03-14 9:17 ` [PATCH v2 2/6] app/testpmd: fix burst option parsing David Marchand
2024-03-14 9:22 ` Ferruh Yigit
2024-03-14 9:17 ` [PATCH v2 3/6] app/testpmd: fix error message for invalid option David Marchand
2024-03-14 9:23 ` Ferruh Yigit
2024-03-14 9:17 ` [PATCH v2 4/6] app/testpmd: enhance queue count check David Marchand
2024-03-14 9:23 ` Ferruh Yigit
2024-03-14 9:17 ` [PATCH v2 5/6] app/testpmd: remove dead code for disabling cmdline library David Marchand
2024-03-14 11:33 ` Ferruh Yigit
2024-03-14 9:17 ` David Marchand [this message]
2024-03-14 11:43 ` [PATCH v2 6/6] app/testpmd: enhance getopt_long usage Ferruh Yigit
2024-03-14 12:43 ` [PATCH v2 0/6] testpmd options parsing cleanup Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240314091708.1542769-7-david.marchand@redhat.com \
--to=david.marchand@redhat.com \
--cc=aman.deep.singh@intel.com \
--cc=dev@dpdk.org \
--cc=yuying.zhang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).