[v4,1/3] app/testpmd: add ability to set Tx IP and UDP parameters
Checks
Commit Message
Use RFC 2544 standard values for Tx only test as default IP
address and port. But let the user override those values on command line.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
v4 - update documentation to be more precise
support new tx-multi-flow addresses
app/test-pmd/parameters.c | 49 +++++++++++++++++++++++++++
app/test-pmd/testpmd.h | 6 ++++
app/test-pmd/txonly.c | 22 +++++++-----
doc/guides/testpmd_app_ug/run_app.rst | 12 ++++++-
4 files changed, 79 insertions(+), 10 deletions(-)
Comments
Hi Stephen,
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Stephen Hemminger
> Sent: Tuesday, April 2, 2019 9:39 PM
> To: dev@dpdk.org
> Cc: Stephen Hemminger <stephen@networkplumber.org>
> Subject: [dpdk-dev] [PATCH v4 1/3] app/testpmd: add ability to set Tx IP and
> UDP parameters
>
> Use RFC 2544 standard values for Tx only test as default IP address and port.
> But let the user override those values on command line.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> v4 - update documentation to be more precise
> support new tx-multi-flow addresses
>
> app/test-pmd/parameters.c | 49 +++++++++++++++++++++++++++
> app/test-pmd/testpmd.h | 6 ++++
> app/test-pmd/txonly.c | 22 +++++++-----
> doc/guides/testpmd_app_ug/run_app.rst | 12 ++++++-
> 4 files changed, 79 insertions(+), 10 deletions(-)
>
> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index
> 7b6b60905dce..8b523a5c66ed 100644
> --- a/app/test-pmd/parameters.c
> +++ b/app/test-pmd/parameters.c
> @@ -19,6 +19,7 @@
> #include <stdint.h>
> #include <unistd.h>
> #include <inttypes.h>
> +#include <arpa/inet.h>
>
> #include <rte_common.h>
> #include <rte_byteorder.h>
> @@ -65,6 +66,7 @@ usage(char* progname)
> #ifdef RTE_LIBRTE_CMDLINE
> "--eth-peers-configfile= | "
> "--eth-peer=X,M:M:M:M:M:M | "
> + "--tx-ip=SRC,DST | --tx-udp=PORT | "
> #endif
> "--pkt-filter-mode= |"
> "--rss-ip | --rss-udp | "
> @@ -645,6 +647,8 @@ launch_args_parse(int argc, char** argv)
> { "mlockall", 0, 0, 0 },
> { "no-mlockall", 0, 0, 0 },
> { "mp-alloc", 1, 0, 0 },
> + { "tx-ip", 1, 0, 0 },
> + { "tx-udp", 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 },
> @@ -743,6 +747,51 @@ launch_args_parse(int argc, char** argv)
> nb_peer_eth_addrs++;
> }
> #endif
> + 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);
> +
> + *end++ = 0;
> + if (inet_aton(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_aton(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;
> + }
> +
> + }
> if (!strcmp(lgopts[opt_idx].name, "nb-ports")) {
> n = atoi(optarg);
> if (n > 0 && n <= nb_ports)
> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index
> a45988ebc524..18d2c1ef1eaf 100644
> --- a/app/test-pmd/testpmd.h
> +++ b/app/test-pmd/testpmd.h
> @@ -443,6 +443,12 @@ extern int8_t tx_pthresh; extern int8_t tx_hthresh;
> extern int8_t tx_wthresh;
>
> +extern uint16_t tx_udp_src_port;
> +extern uint16_t tx_udp_dst_port;
> +
> +extern uint32_t tx_ip_src_addr;
> +extern uint32_t tx_ip_dst_addr;
> +
> extern struct fwd_config cur_fwd_config; extern struct fwd_engine
> *cur_fwd_eng; extern uint32_t retry_enabled; diff --git a/app/test-
> pmd/txonly.c b/app/test-pmd/txonly.c index def52a0487ea..ed5e715ea648
> 100644
> --- a/app/test-pmd/txonly.c
> +++ b/app/test-pmd/txonly.c
> @@ -40,11 +40,13 @@
>
> #include "testpmd.h"
>
> -#define UDP_SRC_PORT 1024
> -#define UDP_DST_PORT 1024
> +/* use RFC863 Discard Protocol */
> +uint16_t tx_udp_src_port = 9;
> +uint16_t tx_udp_dst_port = 9;
>
> -#define IP_SRC_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 1) -#define
> IP_DST_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 2)
> +/* use RFC5735 / RFC2544 reserved network test addresses */ uint32_t
> +tx_ip_src_addr = (192U << 24) | (18 << 16) | (0 << 8) | 1; uint32_t
> +tx_ip_dst_addr = (192U << 24) | (18 << 16) | (0 << 8) | 2;
>
> #define IP_DEFTTL 64 /* from RFC 1340. */
> #define IP_VERSION 0x40
> @@ -105,8 +107,8 @@ setup_pkt_udp_ip_headers(struct ipv4_hdr *ip_hdr,
> * Initialize UDP header.
> */
> pkt_len = (uint16_t) (pkt_data_len + sizeof(struct udp_hdr));
> - udp_hdr->src_port = rte_cpu_to_be_16(UDP_SRC_PORT);
> - udp_hdr->dst_port = rte_cpu_to_be_16(UDP_DST_PORT);
> + udp_hdr->src_port = rte_cpu_to_be_16(tx_udp_src_port);
> + udp_hdr->dst_port = rte_cpu_to_be_16(tx_udp_dst_port);
> udp_hdr->dgram_len = RTE_CPU_TO_BE_16(pkt_len);
> udp_hdr->dgram_cksum = 0; /* No UDP checksum. */
>
> @@ -121,8 +123,8 @@ setup_pkt_udp_ip_headers(struct ipv4_hdr *ip_hdr,
> ip_hdr->next_proto_id = IPPROTO_UDP;
> ip_hdr->packet_id = 0;
> ip_hdr->total_length = RTE_CPU_TO_BE_16(pkt_len);
> - ip_hdr->src_addr = rte_cpu_to_be_32(IP_SRC_ADDR);
> - ip_hdr->dst_addr = rte_cpu_to_be_32(IP_DST_ADDR);
> + ip_hdr->src_addr = rte_cpu_to_be_32(tx_ip_src_addr);
> + ip_hdr->dst_addr = rte_cpu_to_be_32(tx_ip_dst_addr);
>
> /*
> * Compute IP header checksum.
> @@ -253,7 +255,9 @@ pkt_burst_transmit(struct fwd_stream *fs)
> * packet generator for developer's quick performance
> * regression test.
> */
> - addr = (IP_DST_ADDR | (ip_var++ << 8)) + rte_lcore_id();
> + addr = (tx_ip_dst_addr | (ip_var++ << 8))
> + + rte_lcore_id();
> +
> ip_hdr->src_addr = rte_cpu_to_be_32(addr);
> }
> copy_buf_to_pkt(&pkt_udp_hdr, sizeof(pkt_udp_hdr), pkt, diff -
> -git a/doc/guides/testpmd_app_ug/run_app.rst
> b/doc/guides/testpmd_app_ug/run_app.rst
> index b717b8c7b742..a72f94923210 100644
> --- a/doc/guides/testpmd_app_ug/run_app.rst
> +++ b/doc/guides/testpmd_app_ug/run_app.rst
> @@ -121,12 +121,22 @@ The commandline options are:
> XX:XX:XX:XX:XX:02
> ...
>
> -
> * ``--eth-peer=N,XX:XX:XX:XX:XX:XX``
>
> Set the MAC address ``XX:XX:XX:XX:XX:XX`` of the peer port N,
> where 0 <= N < ``CONFIG_RTE_MAX_ETHPORTS`` from the configuration file.
>
> +* ``--tx-ip=SRC,DST``
> + Set the source and destination IP address used when doing transmit only test.
> + The defaults address values are source 192.18.0.1 and
> + destination 192.18.0.2. These are special purpose addresses
> + reserved for benchmakring (RFC 2544).
> +
> +* ``--tx-udp=SRC[,DST]``
> + Set the source and destination UDP port number for transmit test only test.
> + The default port is the port 9 which is defined for the discard protocol
> + (RFC 863).
> +
> * ``--pkt-filter-mode=mode``
>
> Set Flow Director mode where mode is either ``none`` (the default),
> ``signature`` or ``perfect``.
> --
> 2.17.1
This patch fails to apply to DPDK 19.05.rc1.
It probably needs to be rebased.
Regards,
Bernard.
@@ -19,6 +19,7 @@
#include <stdint.h>
#include <unistd.h>
#include <inttypes.h>
+#include <arpa/inet.h>
#include <rte_common.h>
#include <rte_byteorder.h>
@@ -65,6 +66,7 @@ usage(char* progname)
#ifdef RTE_LIBRTE_CMDLINE
"--eth-peers-configfile= | "
"--eth-peer=X,M:M:M:M:M:M | "
+ "--tx-ip=SRC,DST | --tx-udp=PORT | "
#endif
"--pkt-filter-mode= |"
"--rss-ip | --rss-udp | "
@@ -645,6 +647,8 @@ launch_args_parse(int argc, char** argv)
{ "mlockall", 0, 0, 0 },
{ "no-mlockall", 0, 0, 0 },
{ "mp-alloc", 1, 0, 0 },
+ { "tx-ip", 1, 0, 0 },
+ { "tx-udp", 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 },
@@ -743,6 +747,51 @@ launch_args_parse(int argc, char** argv)
nb_peer_eth_addrs++;
}
#endif
+ 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);
+
+ *end++ = 0;
+ if (inet_aton(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_aton(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;
+ }
+
+ }
if (!strcmp(lgopts[opt_idx].name, "nb-ports")) {
n = atoi(optarg);
if (n > 0 && n <= nb_ports)
@@ -443,6 +443,12 @@ extern int8_t tx_pthresh;
extern int8_t tx_hthresh;
extern int8_t tx_wthresh;
+extern uint16_t tx_udp_src_port;
+extern uint16_t tx_udp_dst_port;
+
+extern uint32_t tx_ip_src_addr;
+extern uint32_t tx_ip_dst_addr;
+
extern struct fwd_config cur_fwd_config;
extern struct fwd_engine *cur_fwd_eng;
extern uint32_t retry_enabled;
@@ -40,11 +40,13 @@
#include "testpmd.h"
-#define UDP_SRC_PORT 1024
-#define UDP_DST_PORT 1024
+/* use RFC863 Discard Protocol */
+uint16_t tx_udp_src_port = 9;
+uint16_t tx_udp_dst_port = 9;
-#define IP_SRC_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 1)
-#define IP_DST_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 2)
+/* use RFC5735 / RFC2544 reserved network test addresses */
+uint32_t tx_ip_src_addr = (192U << 24) | (18 << 16) | (0 << 8) | 1;
+uint32_t tx_ip_dst_addr = (192U << 24) | (18 << 16) | (0 << 8) | 2;
#define IP_DEFTTL 64 /* from RFC 1340. */
#define IP_VERSION 0x40
@@ -105,8 +107,8 @@ setup_pkt_udp_ip_headers(struct ipv4_hdr *ip_hdr,
* Initialize UDP header.
*/
pkt_len = (uint16_t) (pkt_data_len + sizeof(struct udp_hdr));
- udp_hdr->src_port = rte_cpu_to_be_16(UDP_SRC_PORT);
- udp_hdr->dst_port = rte_cpu_to_be_16(UDP_DST_PORT);
+ udp_hdr->src_port = rte_cpu_to_be_16(tx_udp_src_port);
+ udp_hdr->dst_port = rte_cpu_to_be_16(tx_udp_dst_port);
udp_hdr->dgram_len = RTE_CPU_TO_BE_16(pkt_len);
udp_hdr->dgram_cksum = 0; /* No UDP checksum. */
@@ -121,8 +123,8 @@ setup_pkt_udp_ip_headers(struct ipv4_hdr *ip_hdr,
ip_hdr->next_proto_id = IPPROTO_UDP;
ip_hdr->packet_id = 0;
ip_hdr->total_length = RTE_CPU_TO_BE_16(pkt_len);
- ip_hdr->src_addr = rte_cpu_to_be_32(IP_SRC_ADDR);
- ip_hdr->dst_addr = rte_cpu_to_be_32(IP_DST_ADDR);
+ ip_hdr->src_addr = rte_cpu_to_be_32(tx_ip_src_addr);
+ ip_hdr->dst_addr = rte_cpu_to_be_32(tx_ip_dst_addr);
/*
* Compute IP header checksum.
@@ -253,7 +255,9 @@ pkt_burst_transmit(struct fwd_stream *fs)
* packet generator for developer's quick performance
* regression test.
*/
- addr = (IP_DST_ADDR | (ip_var++ << 8)) + rte_lcore_id();
+ addr = (tx_ip_dst_addr | (ip_var++ << 8))
+ + rte_lcore_id();
+
ip_hdr->src_addr = rte_cpu_to_be_32(addr);
}
copy_buf_to_pkt(&pkt_udp_hdr, sizeof(pkt_udp_hdr), pkt,
@@ -121,12 +121,22 @@ The commandline options are:
XX:XX:XX:XX:XX:02
...
-
* ``--eth-peer=N,XX:XX:XX:XX:XX:XX``
Set the MAC address ``XX:XX:XX:XX:XX:XX`` of the peer port N,
where 0 <= N < ``CONFIG_RTE_MAX_ETHPORTS`` from the configuration file.
+* ``--tx-ip=SRC,DST``
+ Set the source and destination IP address used when doing transmit only test.
+ The defaults address values are source 192.18.0.1 and
+ destination 192.18.0.2. These are special purpose addresses
+ reserved for benchmakring (RFC 2544).
+
+* ``--tx-udp=SRC[,DST]``
+ Set the source and destination UDP port number for transmit test only test.
+ The default port is the port 9 which is defined for the discard protocol
+ (RFC 863).
+
* ``--pkt-filter-mode=mode``
Set Flow Director mode where mode is either ``none`` (the default), ``signature`` or ``perfect``.