DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] app/testpmd: make txonly mode generate multiple flows
@ 2017-12-15 21:11 Yongseok Koh
  2018-01-12 18:08 ` Thomas Monjalon
                   ` (4 more replies)
  0 siblings, 5 replies; 24+ messages in thread
From: Yongseok Koh @ 2017-12-15 21:11 UTC (permalink / raw)
  To: jingjing.wu; +Cc: dev, Yongseok Koh

Testpmd can generate multiple flows without taking much cost and this could
be a simple traffic generator for developer's quick tests. IP destination
address is varied.

Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
---
 app/test-pmd/txonly.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 309c73893..aa4c379c4 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -73,7 +73,7 @@
 #define UDP_DST_PORT 1024
 
 #define IP_SRC_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 1)
-#define IP_DST_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 2)
+#define IP_DST_ADDR ((192U << 24) | (168 << 16))
 
 #define IP_DEFTTL  64   /* from RFC 1340. */
 #define IP_VERSION 0x40
@@ -81,6 +81,7 @@
 #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
 
 static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
+static __thread uint8_t ip_var; /**< IP address variation */
 static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted packets. */
 
 static void
@@ -187,6 +188,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
 	struct rte_mbuf *pkt_seg;
 	struct rte_mempool *mbp;
 	struct ether_hdr eth_hdr;
+	struct ipv4_hdr *ip_hdr;
 	uint16_t nb_tx;
 	uint16_t nb_pkt;
 	uint16_t vlan_tci, vlan_tci_outer;
@@ -263,6 +265,14 @@ pkt_burst_transmit(struct fwd_stream *fs)
 		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
 		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
 				sizeof(struct ether_hdr));
+		ip_hdr = rte_pktmbuf_mtod_offset(pkt, struct ipv4_hdr *,
+						 sizeof(struct ether_hdr));
+		/*
+		 * Generate multiple flows by varying IP dest addr.
+		 */
+		ip_hdr->dst_addr =
+			rte_cpu_to_be_32(IP_DST_ADDR | (ip_var++ << 8) |
+					 (rte_lcore_id() + 1));
 		copy_buf_to_pkt(&pkt_udp_hdr, sizeof(pkt_udp_hdr), pkt,
 				sizeof(struct ether_hdr) +
 				sizeof(struct ipv4_hdr));
-- 
2.11.0

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH] app/testpmd: make txonly mode generate multiple flows
  2017-12-15 21:11 [dpdk-dev] [PATCH] app/testpmd: make txonly mode generate multiple flows Yongseok Koh
@ 2018-01-12 18:08 ` Thomas Monjalon
  2018-01-16  2:40 ` Lu, Wenzhuo
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 24+ messages in thread
From: Thomas Monjalon @ 2018-01-12 18:08 UTC (permalink / raw)
  To: wenzhuo.lu; +Cc: dev, Yongseok Koh, jingjing.wu

+Cc Wenzhuo

Wenzhuo, please could you check this list?
	https://dpdk.org/dev/patchwork/project/dpdk/list/?q=testpmd
Thanks a lot

15/12/2017 22:11, Yongseok Koh:
> Testpmd can generate multiple flows without taking much cost and this could
> be a simple traffic generator for developer's quick tests. IP destination
> address is varied.
> 
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH] app/testpmd: make txonly mode generate multiple flows
  2017-12-15 21:11 [dpdk-dev] [PATCH] app/testpmd: make txonly mode generate multiple flows Yongseok Koh
  2018-01-12 18:08 ` Thomas Monjalon
@ 2018-01-16  2:40 ` Lu, Wenzhuo
  2018-01-17 18:04   ` Yongseok Koh
  2018-01-17 18:18 ` [dpdk-dev] [PATCH v2] " Yongseok Koh
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 24+ messages in thread
From: Lu, Wenzhuo @ 2018-01-16  2:40 UTC (permalink / raw)
  To: Yongseok Koh, Wu, Jingjing; +Cc: dev

Hi Yongseok,

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Yongseok Koh
> Sent: Saturday, December 16, 2017 5:11 AM
> To: Wu, Jingjing <jingjing.wu@intel.com>
> Cc: dev@dpdk.org; Yongseok Koh <yskoh@mellanox.com>
> Subject: [dpdk-dev] [PATCH] app/testpmd: make txonly mode generate
> multiple flows
> 
> Testpmd can generate multiple flows without taking much cost and this
> could be a simple traffic generator for developer's quick tests. IP destination
> address is varied.
> 
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> ---
>  app/test-pmd/txonly.c | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c index
> 309c73893..aa4c379c4 100644
> --- a/app/test-pmd/txonly.c
> +++ b/app/test-pmd/txonly.c
> @@ -73,7 +73,7 @@
>  #define UDP_DST_PORT 1024
> 
>  #define IP_SRC_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 1) -#define
> IP_DST_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 2)
> +#define IP_DST_ADDR ((192U << 24) | (168 << 16))
> 
>  #define IP_DEFTTL  64   /* from RFC 1340. */
>  #define IP_VERSION 0x40
> @@ -81,6 +81,7 @@
>  #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
> 
>  static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
> +static __thread uint8_t ip_var; /**< IP address variation */
>  static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted packets.
> */
> 
>  static void
> @@ -187,6 +188,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
>  	struct rte_mbuf *pkt_seg;
>  	struct rte_mempool *mbp;
>  	struct ether_hdr eth_hdr;
> +	struct ipv4_hdr *ip_hdr;
>  	uint16_t nb_tx;
>  	uint16_t nb_pkt;
>  	uint16_t vlan_tci, vlan_tci_outer;
> @@ -263,6 +265,14 @@ pkt_burst_transmit(struct fwd_stream *fs)
>  		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
>  		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
>  				sizeof(struct ether_hdr));
> +		ip_hdr = rte_pktmbuf_mtod_offset(pkt, struct ipv4_hdr *,
> +						 sizeof(struct ether_hdr));
> +		/*
> +		 * Generate multiple flows by varying IP dest addr.
> +		 */
> +		ip_hdr->dst_addr =
> +			rte_cpu_to_be_32(IP_DST_ADDR | (ip_var++ << 8) |
> +					 (rte_lcore_id() + 1));
Just curious if we can avoid call rte_lcore_id for every packet?

And suggest to add more explanation here, like purpose, scenario. So when we want to change the behavior, for example, like adding a parameter to make IP addresses configurable, we know what we will break.

>  		copy_buf_to_pkt(&pkt_udp_hdr, sizeof(pkt_udp_hdr), pkt,
>  				sizeof(struct ether_hdr) +
>  				sizeof(struct ipv4_hdr));
> --
> 2.11.0

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH] app/testpmd: make txonly mode generate multiple flows
  2018-01-16  2:40 ` Lu, Wenzhuo
@ 2018-01-17 18:04   ` Yongseok Koh
  0 siblings, 0 replies; 24+ messages in thread
From: Yongseok Koh @ 2018-01-17 18:04 UTC (permalink / raw)
  To: Lu, Wenzhuo; +Cc: Wu, Jingjing, dev


> On Jan 15, 2018, at 6:40 PM, Lu, Wenzhuo <wenzhuo.lu@intel.com> wrote:
> 
> Hi Yongseok,
> 
>> -----Original Message-----
>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Yongseok Koh
>> Sent: Saturday, December 16, 2017 5:11 AM
>> To: Wu, Jingjing <jingjing.wu@intel.com>
>> Cc: dev@dpdk.org; Yongseok Koh <yskoh@mellanox.com>
>> Subject: [dpdk-dev] [PATCH] app/testpmd: make txonly mode generate
>> multiple flows
>> 
>> Testpmd can generate multiple flows without taking much cost and this
>> could be a simple traffic generator for developer's quick tests. IP destination
>> address is varied.
>> 
>> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
>> ---
>> app/test-pmd/txonly.c | 12 +++++++++++-
>> 1 file changed, 11 insertions(+), 1 deletion(-)
>> 
>> diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c index
>> 309c73893..aa4c379c4 100644
>> --- a/app/test-pmd/txonly.c
>> +++ b/app/test-pmd/txonly.c
>> @@ -73,7 +73,7 @@
>> #define UDP_DST_PORT 1024
>> 
>> #define IP_SRC_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 1) -#define
>> IP_DST_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 2)
>> +#define IP_DST_ADDR ((192U << 24) | (168 << 16))
>> 
>> #define IP_DEFTTL  64   /* from RFC 1340. */
>> #define IP_VERSION 0x40
>> @@ -81,6 +81,7 @@
>> #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
>> 
>> static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
>> +static __thread uint8_t ip_var; /**< IP address variation */
>> static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted packets.
>> */
>> 
>> static void
>> @@ -187,6 +188,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
>> 	struct rte_mbuf *pkt_seg;
>> 	struct rte_mempool *mbp;
>> 	struct ether_hdr eth_hdr;
>> +	struct ipv4_hdr *ip_hdr;
>> 	uint16_t nb_tx;
>> 	uint16_t nb_pkt;
>> 	uint16_t vlan_tci, vlan_tci_outer;
>> @@ -263,6 +265,14 @@ pkt_burst_transmit(struct fwd_stream *fs)
>> 		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
>> 		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
>> 				sizeof(struct ether_hdr));
>> +		ip_hdr = rte_pktmbuf_mtod_offset(pkt, struct ipv4_hdr *,
>> +						 sizeof(struct ether_hdr));
>> +		/*
>> +		 * Generate multiple flows by varying IP dest addr.
>> +		 */
>> +		ip_hdr->dst_addr =
>> +			rte_cpu_to_be_32(IP_DST_ADDR | (ip_var++ << 8) |
>> +					 (rte_lcore_id() + 1));
> Just curious if we can avoid call rte_lcore_id for every packet?

rte_lcore_id() is just to read a per-lcore variable and it is an inline
function, not a real branch. I don't think it has any performance hit.
Actually, I'm using txonly with this patch as a good packet generator to
test development tasks. Mellanox ConnectX-5 can generate 100Gbps @ 64B
(149Mpps) with multiple IP flows.


> And suggest to add more explanation here, like purpose, scenario. So when we want to change the behavior, for example, like adding a parameter to make IP addresses configurable, we know what we will break.

Okay, will add more comment here.

Thanks,
Yongseok

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [dpdk-dev] [PATCH v2] app/testpmd: make txonly mode generate multiple flows
  2017-12-15 21:11 [dpdk-dev] [PATCH] app/testpmd: make txonly mode generate multiple flows Yongseok Koh
  2018-01-12 18:08 ` Thomas Monjalon
  2018-01-16  2:40 ` Lu, Wenzhuo
@ 2018-01-17 18:18 ` Yongseok Koh
  2018-01-18  1:22   ` Lu, Wenzhuo
                     ` (2 more replies)
  2019-03-28  1:51 ` [dpdk-dev] [PATCH v3] " Yongseok Koh
  2019-03-28 18:46 ` [dpdk-dev] [PATCH v4] " Yongseok Koh
  4 siblings, 3 replies; 24+ messages in thread
From: Yongseok Koh @ 2018-01-17 18:18 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu; +Cc: dev, Yongseok Koh

Testpmd can generate multiple flows without taking much cost and this could
be a simple traffic generator for developer's quick tests. IP destination
address is varied.

Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
---

v2:
* Add detailed explanation in a comment.

 app/test-pmd/txonly.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 1f08b6ed3..253cf2385 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -44,7 +44,7 @@
 #define UDP_DST_PORT 1024
 
 #define IP_SRC_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 1)
-#define IP_DST_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 2)
+#define IP_DST_ADDR ((192U << 24) | (168 << 16))
 
 #define IP_DEFTTL  64   /* from RFC 1340. */
 #define IP_VERSION 0x40
@@ -52,6 +52,7 @@
 #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
 
 static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
+static __thread uint8_t ip_var; /**< IP address variation */
 static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted packets. */
 
 static void
@@ -159,6 +160,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
 	struct rte_mbuf *pkt_seg;
 	struct rte_mempool *mbp;
 	struct ether_hdr eth_hdr;
+	struct ipv4_hdr *ip_hdr;
 	uint16_t nb_tx;
 	uint16_t nb_pkt;
 	uint16_t vlan_tci, vlan_tci_outer;
@@ -237,6 +239,17 @@ pkt_burst_transmit(struct fwd_stream *fs)
 		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
 		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
 				sizeof(struct ether_hdr));
+		ip_hdr = rte_pktmbuf_mtod_offset(pkt, struct ipv4_hdr *,
+						 sizeof(struct ether_hdr));
+		/*
+		 * Generate multiple flows by varying IP dest addr. This enables
+		 * packets are well distributed by RSS in receiver side if any
+		 * and txonly mode can be a decent packet generator for
+		 * developer's quick performance regression test.
+		 */
+		ip_hdr->dst_addr =
+			rte_cpu_to_be_32(IP_DST_ADDR | (ip_var++ << 8) |
+					 (rte_lcore_id() + 1));
 		copy_buf_to_pkt(&pkt_udp_hdr, sizeof(pkt_udp_hdr), pkt,
 				sizeof(struct ether_hdr) +
 				sizeof(struct ipv4_hdr));
-- 
2.11.0

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v2] app/testpmd: make txonly mode generate multiple flows
  2018-01-17 18:18 ` [dpdk-dev] [PATCH v2] " Yongseok Koh
@ 2018-01-18  1:22   ` Lu, Wenzhuo
  2018-01-18 12:21   ` Ananyev, Konstantin
  2018-01-18 13:55   ` Jerin Jacob
  2 siblings, 0 replies; 24+ messages in thread
From: Lu, Wenzhuo @ 2018-01-18  1:22 UTC (permalink / raw)
  To: Yongseok Koh, Wu, Jingjing; +Cc: dev

Hi,

> -----Original Message-----
> From: Yongseok Koh [mailto:yskoh@mellanox.com]
> Sent: Thursday, January 18, 2018 2:19 AM
> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>
> Cc: dev@dpdk.org; Yongseok Koh <yskoh@mellanox.com>
> Subject: [PATCH v2] app/testpmd: make txonly mode generate multiple flows
> 
> Testpmd can generate multiple flows without taking much cost and this
> could be a simple traffic generator for developer's quick tests. IP destination
> address is varied.
> 
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
Acked-by: Wenzhuo Lu <wenzhuo.lu@intel.com>

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v2] app/testpmd: make txonly mode generate multiple flows
  2018-01-17 18:18 ` [dpdk-dev] [PATCH v2] " Yongseok Koh
  2018-01-18  1:22   ` Lu, Wenzhuo
@ 2018-01-18 12:21   ` Ananyev, Konstantin
  2018-01-19  7:09     ` Yongseok Koh
  2018-01-18 13:55   ` Jerin Jacob
  2 siblings, 1 reply; 24+ messages in thread
From: Ananyev, Konstantin @ 2018-01-18 12:21 UTC (permalink / raw)
  To: Yongseok Koh, Lu, Wenzhuo, Wu, Jingjing; +Cc: dev

Hi,

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Yongseok Koh
> Sent: Wednesday, January 17, 2018 6:19 PM
> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>
> Cc: dev@dpdk.org; Yongseok Koh <yskoh@mellanox.com>
> Subject: [dpdk-dev] [PATCH v2] app/testpmd: make txonly mode generate multiple flows
> 
> Testpmd can generate multiple flows without taking much cost and this could
> be a simple traffic generator for developer's quick tests. IP destination
> address is varied.

Correct me if I am wrong - but that the change of existing behavior.
Without any announcement and without ability to the user to keep
current one (command-line option, new CLI command, etc.).
What if there are people who rely on existing behavior
(some test scripts or so)?
Konstantin

> 
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> ---
> 
> v2:
> * Add detailed explanation in a comment.
> 
>  app/test-pmd/txonly.c | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
> index 1f08b6ed3..253cf2385 100644
> --- a/app/test-pmd/txonly.c
> +++ b/app/test-pmd/txonly.c
> @@ -44,7 +44,7 @@
>  #define UDP_DST_PORT 1024
> 
>  #define IP_SRC_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 1)
> -#define IP_DST_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 2)
> +#define IP_DST_ADDR ((192U << 24) | (168 << 16))
> 
>  #define IP_DEFTTL  64   /* from RFC 1340. */
>  #define IP_VERSION 0x40
> @@ -52,6 +52,7 @@
>  #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
> 
>  static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
> +static __thread uint8_t ip_var; /**< IP address variation */
>  static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted packets. */
> 
>  static void
> @@ -159,6 +160,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
>  	struct rte_mbuf *pkt_seg;
>  	struct rte_mempool *mbp;
>  	struct ether_hdr eth_hdr;
> +	struct ipv4_hdr *ip_hdr;
>  	uint16_t nb_tx;
>  	uint16_t nb_pkt;
>  	uint16_t vlan_tci, vlan_tci_outer;
> @@ -237,6 +239,17 @@ pkt_burst_transmit(struct fwd_stream *fs)
>  		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
>  		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
>  				sizeof(struct ether_hdr));
> +		ip_hdr = rte_pktmbuf_mtod_offset(pkt, struct ipv4_hdr *,
> +						 sizeof(struct ether_hdr));
> +		/*
> +		 * Generate multiple flows by varying IP dest addr. This enables
> +		 * packets are well distributed by RSS in receiver side if any
> +		 * and txonly mode can be a decent packet generator for
> +		 * developer's quick performance regression test.
> +		 */
> +		ip_hdr->dst_addr =
> +			rte_cpu_to_be_32(IP_DST_ADDR | (ip_var++ << 8) |
> +					 (rte_lcore_id() + 1));
>  		copy_buf_to_pkt(&pkt_udp_hdr, sizeof(pkt_udp_hdr), pkt,
>  				sizeof(struct ether_hdr) +
>  				sizeof(struct ipv4_hdr));
> --
> 2.11.0

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v2] app/testpmd: make txonly mode generate multiple flows
  2018-01-17 18:18 ` [dpdk-dev] [PATCH v2] " Yongseok Koh
  2018-01-18  1:22   ` Lu, Wenzhuo
  2018-01-18 12:21   ` Ananyev, Konstantin
@ 2018-01-18 13:55   ` Jerin Jacob
  2 siblings, 0 replies; 24+ messages in thread
From: Jerin Jacob @ 2018-01-18 13:55 UTC (permalink / raw)
  To: Yongseok Koh; +Cc: wenzhuo.lu, jingjing.wu, dev

-----Original Message-----
> Date: Wed, 17 Jan 2018 10:18:46 -0800
> From: Yongseok Koh <yskoh@mellanox.com>
> To: wenzhuo.lu@intel.com, jingjing.wu@intel.com
> CC: dev@dpdk.org, Yongseok Koh <yskoh@mellanox.com>
> Subject: [dpdk-dev] [PATCH v2] app/testpmd: make txonly mode generate
>  multiple flows
> X-Mailer: git-send-email 2.11.0
> 
> Testpmd can generate multiple flows without taking much cost and this could
> be a simple traffic generator for developer's quick tests. IP destination
> address is varied.

Useful feature.

> 
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> ---
> 
> v2:
> * Add detailed explanation in a comment.
> 
>  app/test-pmd/txonly.c | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
> index 1f08b6ed3..253cf2385 100644
> --- a/app/test-pmd/txonly.c
> +++ b/app/test-pmd/txonly.c
> @@ -44,7 +44,7 @@
>  #define UDP_DST_PORT 1024
>  
>  #define IP_SRC_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 1)
> -#define IP_DST_ADDR ((192U << 24) | (168 << 16) | (0 << 8) | 2)
> +#define IP_DST_ADDR ((192U << 24) | (168 << 16))
>  
>  #define IP_DEFTTL  64   /* from RFC 1340. */
>  #define IP_VERSION 0x40
> @@ -52,6 +52,7 @@
>  #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
>  
>  static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
> +static __thread uint8_t ip_var; /**< IP address variation */

Use RTE_DECLARE_PER_LCORE instead of __thread

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v2] app/testpmd: make txonly mode generate multiple flows
  2018-01-18 12:21   ` Ananyev, Konstantin
@ 2018-01-19  7:09     ` Yongseok Koh
  2018-01-19 11:02       ` Ananyev, Konstantin
  0 siblings, 1 reply; 24+ messages in thread
From: Yongseok Koh @ 2018-01-19  7:09 UTC (permalink / raw)
  To: Ananyev, Konstantin; +Cc: Lu, Wenzhuo, Wu, Jingjing, dev, Jerin Jacob


> On Jan 18, 2018, at 4:21 AM, Ananyev, Konstantin <konstantin.ananyev@intel.com> wrote:
> 
> Hi,
> 
>> -----Original Message-----
>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Yongseok Koh
>> Sent: Wednesday, January 17, 2018 6:19 PM
>> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>
>> Cc: dev@dpdk.org; Yongseok Koh <yskoh@mellanox.com>
>> Subject: [dpdk-dev] [PATCH v2] app/testpmd: make txonly mode generate multiple flows
>> 
>> Testpmd can generate multiple flows without taking much cost and this could
>> be a simple traffic generator for developer's quick tests. IP destination
>> address is varied.
> 
> Correct me if I am wrong - but that the change of existing behavior.
> Without any announcement and without ability to the user to keep
> current one (command-line option, new CLI command, etc.).
> What if there are people who rely on existing behavior
> (some test scripts or so)?
> Konstantin

Good point. But I think it is unlikely. Currently, it generates single fat flow
and if someone uses it for testing, then Rx side likely uses single core. Even
if it gets to generate multiple flows, it would be same to such a case.

However, it is my speculation. If you disagree anyway, I'll stash it for 18.05
and add a new knob to enable it. I'm okay with that because it is just for
convenience, not an urgent issue.

Thanks,
Yongseok

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v2] app/testpmd: make txonly mode generate multiple flows
  2018-01-19  7:09     ` Yongseok Koh
@ 2018-01-19 11:02       ` Ananyev, Konstantin
  0 siblings, 0 replies; 24+ messages in thread
From: Ananyev, Konstantin @ 2018-01-19 11:02 UTC (permalink / raw)
  To: Yongseok Koh; +Cc: Lu, Wenzhuo, Wu, Jingjing, dev, Jerin Jacob



> -----Original Message-----
> From: Yongseok Koh [mailto:yskoh@mellanox.com]
> Sent: Friday, January 19, 2018 7:10 AM
> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>
> Cc: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>; dev@dpdk.org; Jerin Jacob
> <jerin.jacob@caviumnetworks.com>
> Subject: Re: [dpdk-dev] [PATCH v2] app/testpmd: make txonly mode generate multiple flows
> 
> 
> > On Jan 18, 2018, at 4:21 AM, Ananyev, Konstantin <konstantin.ananyev@intel.com> wrote:
> >
> > Hi,
> >
> >> -----Original Message-----
> >> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Yongseok Koh
> >> Sent: Wednesday, January 17, 2018 6:19 PM
> >> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>
> >> Cc: dev@dpdk.org; Yongseok Koh <yskoh@mellanox.com>
> >> Subject: [dpdk-dev] [PATCH v2] app/testpmd: make txonly mode generate multiple flows
> >>
> >> Testpmd can generate multiple flows without taking much cost and this could
> >> be a simple traffic generator for developer's quick tests. IP destination
> >> address is varied.
> >
> > Correct me if I am wrong - but that the change of existing behavior.
> > Without any announcement and without ability to the user to keep
> > current one (command-line option, new CLI command, etc.).
> > What if there are people who rely on existing behavior
> > (some test scripts or so)?
> > Konstantin
> 
> Good point. But I think it is unlikely. Currently, it generates single fat flow
> and if someone uses it for testing, then Rx side likely uses single core. Even
> if it gets to generate multiple flows, it would be same to such a case.
> 
> However, it is my speculation. If you disagree anyway, I'll stash it for 18.05
> and add a new knob to enable it. I'm okay with that because it is just for
> convenience, not an urgent issue.
> 

Yes, I think  some sort of announcement would be good.
Another alternative - add for user an ability to choose - new CLI command or so.
Konstantin

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate multiple flows
  2017-12-15 21:11 [dpdk-dev] [PATCH] app/testpmd: make txonly mode generate multiple flows Yongseok Koh
                   ` (2 preceding siblings ...)
  2018-01-17 18:18 ` [dpdk-dev] [PATCH v2] " Yongseok Koh
@ 2019-03-28  1:51 ` Yongseok Koh
  2019-03-28  1:51   ` Yongseok Koh
  2019-03-28 10:24   ` Iremonger, Bernard
  2019-03-28 18:46 ` [dpdk-dev] [PATCH v4] " Yongseok Koh
  4 siblings, 2 replies; 24+ messages in thread
From: Yongseok Koh @ 2019-03-28  1:51 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu; +Cc: dev, jerinj, konstantin.ananyev

Testpmd can generate multiple flows without taking much cost and this could
be a simple traffic generator for developer's quick tests. If
"--txonly-multi-flow" is specified in the command line, IP source address
is varied to gnerate multiple flows.

Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
---

v3:
* Add "--txonly-multi-flow" param to enable the feature.
* Replace __thread with RTE_PER_LCORE.

v2:
* Add detailed explanation in a comment.

 app/test-pmd/parameters.c             |  4 ++++
 app/test-pmd/testpmd.c                |  3 +++
 app/test-pmd/testpmd.h                |  2 ++
 app/test-pmd/txonly.c                 | 22 ++++++++++++++++++++++
 doc/guides/testpmd_app_ug/run_app.rst |  4 ++++
 5 files changed, 35 insertions(+)

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 38b419767b..7b6b60905d 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -173,6 +173,7 @@ usage(char* progname)
 	       " Used mainly with PCAP drivers.\n");
 	printf("  --txpkts=X[,Y]*: set TX segment sizes"
 		" or total packet length.\n");
+	printf("  --txonly-multi-flow: generate multiple flows in txonly mode\n");
 	printf("  --disable-link-check: disable check on link status when "
 	       "starting/stopping ports.\n");
 	printf("  --no-lsc-interrupt: disable link status change interrupt.\n");
@@ -632,6 +633,7 @@ launch_args_parse(int argc, char** argv)
 		{ "no-flush-rx",	0, 0, 0 },
 		{ "flow-isolate-all",	        0, 0, 0 },
 		{ "txpkts",			1, 0, 0 },
+		{ "txonly-multi-flow",		0, 0, 0 },
 		{ "disable-link-check",		0, 0, 0 },
 		{ "no-lsc-interrupt",		0, 0, 0 },
 		{ "no-rmv-interrupt",		0, 0, 0 },
@@ -1141,6 +1143,8 @@ launch_args_parse(int argc, char** argv)
 				else
 					rte_exit(EXIT_FAILURE, "bad txpkts\n");
 			}
+			if (!strcmp(lgopts[opt_idx].name, "txonly-multi-flow"))
+				txonly_multi_flow = 1;
 			if (!strcmp(lgopts[opt_idx].name, "no-flush-rx"))
 				no_flush_rx = 1;
 			if (!strcmp(lgopts[opt_idx].name, "disable-link-check"))
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 216be47f92..b950e8cc55 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -217,6 +217,9 @@ uint8_t  tx_pkt_nb_segs = 1; /**< Number of segments in TXONLY packets */
 enum tx_pkt_split tx_pkt_split = TX_PKT_SPLIT_OFF;
 /**< Split policy for packets to TX. */
 
+int txonly_multi_flow;
+/**< Whether multiple flows are generated in TXONLY mode. */
+
 uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per burst. */
 uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of mbuf mempool cache. */
 
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 85b791b6bb..668227bc55 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -439,6 +439,8 @@ enum tx_pkt_split {
 
 extern enum tx_pkt_split tx_pkt_split;
 
+extern int txonly_multi_flow;
+
 extern uint16_t nb_pkt_per_burst;
 extern uint16_t mb_mempool_cache;
 extern int8_t rx_pthresh;
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 1f08b6ed37..def52a0487 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -52,6 +52,7 @@
 #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
 
 static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
+RTE_DEFINE_PER_LCORE(uint8_t, _ip_var); /**< IP address variation */
 static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted packets. */
 
 static void
@@ -164,6 +165,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
 	uint16_t vlan_tci, vlan_tci_outer;
 	uint32_t retry;
 	uint64_t ol_flags = 0;
+	uint8_t  ip_var = RTE_PER_LCORE(_ip_var);
 	uint8_t  i;
 	uint64_t tx_offloads;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
@@ -237,6 +239,23 @@ pkt_burst_transmit(struct fwd_stream *fs)
 		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
 		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
 				sizeof(struct ether_hdr));
+		if (txonly_multi_flow) {
+			struct ipv4_hdr *ip_hdr;
+			uint32_t addr;
+
+			ip_hdr = rte_pktmbuf_mtod_offset(pkt,
+					struct ipv4_hdr *,
+					sizeof(struct ether_hdr));
+			/*
+			 * Generate multiple flows by varying IP src addr. This
+			 * enables packets are well distributed by RSS in
+			 * receiver side if any and txonly mode can be a decent
+			 * packet generator for developer's quick performance
+			 * regression test.
+			 */
+			addr = (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,
 				sizeof(struct ether_hdr) +
 				sizeof(struct ipv4_hdr));
@@ -268,6 +287,9 @@ pkt_burst_transmit(struct fwd_stream *fs)
 	}
 	fs->tx_packets += nb_tx;
 
+	if (txonly_multi_flow)
+		RTE_PER_LCORE(_ip_var) += nb_tx;
+
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
 	fs->tx_burst_stats.pkt_burst_spread[nb_tx]++;
 #endif
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index 4495ed0382..b717b8c7b7 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -324,6 +324,10 @@ The commandline options are:
     Set TX segment sizes or total packet length. Valid for ``tx-only``
     and ``flowgen`` forwarding modes.
 
+*   ``--txonly-multi-flow``
+
+    Generate multiple flows in txonly mode.
+
 *   ``--disable-link-check``
 
     Disable check on link status when starting/stopping ports.
-- 
2.11.0

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate multiple flows
  2019-03-28  1:51 ` [dpdk-dev] [PATCH v3] " Yongseok Koh
@ 2019-03-28  1:51   ` Yongseok Koh
  2019-03-28 10:24   ` Iremonger, Bernard
  1 sibling, 0 replies; 24+ messages in thread
From: Yongseok Koh @ 2019-03-28  1:51 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu; +Cc: dev, jerinj, konstantin.ananyev

Testpmd can generate multiple flows without taking much cost and this could
be a simple traffic generator for developer's quick tests. If
"--txonly-multi-flow" is specified in the command line, IP source address
is varied to gnerate multiple flows.

Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
---

v3:
* Add "--txonly-multi-flow" param to enable the feature.
* Replace __thread with RTE_PER_LCORE.

v2:
* Add detailed explanation in a comment.

 app/test-pmd/parameters.c             |  4 ++++
 app/test-pmd/testpmd.c                |  3 +++
 app/test-pmd/testpmd.h                |  2 ++
 app/test-pmd/txonly.c                 | 22 ++++++++++++++++++++++
 doc/guides/testpmd_app_ug/run_app.rst |  4 ++++
 5 files changed, 35 insertions(+)

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 38b419767b..7b6b60905d 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -173,6 +173,7 @@ usage(char* progname)
 	       " Used mainly with PCAP drivers.\n");
 	printf("  --txpkts=X[,Y]*: set TX segment sizes"
 		" or total packet length.\n");
+	printf("  --txonly-multi-flow: generate multiple flows in txonly mode\n");
 	printf("  --disable-link-check: disable check on link status when "
 	       "starting/stopping ports.\n");
 	printf("  --no-lsc-interrupt: disable link status change interrupt.\n");
@@ -632,6 +633,7 @@ launch_args_parse(int argc, char** argv)
 		{ "no-flush-rx",	0, 0, 0 },
 		{ "flow-isolate-all",	        0, 0, 0 },
 		{ "txpkts",			1, 0, 0 },
+		{ "txonly-multi-flow",		0, 0, 0 },
 		{ "disable-link-check",		0, 0, 0 },
 		{ "no-lsc-interrupt",		0, 0, 0 },
 		{ "no-rmv-interrupt",		0, 0, 0 },
@@ -1141,6 +1143,8 @@ launch_args_parse(int argc, char** argv)
 				else
 					rte_exit(EXIT_FAILURE, "bad txpkts\n");
 			}
+			if (!strcmp(lgopts[opt_idx].name, "txonly-multi-flow"))
+				txonly_multi_flow = 1;
 			if (!strcmp(lgopts[opt_idx].name, "no-flush-rx"))
 				no_flush_rx = 1;
 			if (!strcmp(lgopts[opt_idx].name, "disable-link-check"))
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 216be47f92..b950e8cc55 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -217,6 +217,9 @@ uint8_t  tx_pkt_nb_segs = 1; /**< Number of segments in TXONLY packets */
 enum tx_pkt_split tx_pkt_split = TX_PKT_SPLIT_OFF;
 /**< Split policy for packets to TX. */
 
+int txonly_multi_flow;
+/**< Whether multiple flows are generated in TXONLY mode. */
+
 uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per burst. */
 uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of mbuf mempool cache. */
 
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 85b791b6bb..668227bc55 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -439,6 +439,8 @@ enum tx_pkt_split {
 
 extern enum tx_pkt_split tx_pkt_split;
 
+extern int txonly_multi_flow;
+
 extern uint16_t nb_pkt_per_burst;
 extern uint16_t mb_mempool_cache;
 extern int8_t rx_pthresh;
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 1f08b6ed37..def52a0487 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -52,6 +52,7 @@
 #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
 
 static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
+RTE_DEFINE_PER_LCORE(uint8_t, _ip_var); /**< IP address variation */
 static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted packets. */
 
 static void
@@ -164,6 +165,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
 	uint16_t vlan_tci, vlan_tci_outer;
 	uint32_t retry;
 	uint64_t ol_flags = 0;
+	uint8_t  ip_var = RTE_PER_LCORE(_ip_var);
 	uint8_t  i;
 	uint64_t tx_offloads;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
@@ -237,6 +239,23 @@ pkt_burst_transmit(struct fwd_stream *fs)
 		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
 		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
 				sizeof(struct ether_hdr));
+		if (txonly_multi_flow) {
+			struct ipv4_hdr *ip_hdr;
+			uint32_t addr;
+
+			ip_hdr = rte_pktmbuf_mtod_offset(pkt,
+					struct ipv4_hdr *,
+					sizeof(struct ether_hdr));
+			/*
+			 * Generate multiple flows by varying IP src addr. This
+			 * enables packets are well distributed by RSS in
+			 * receiver side if any and txonly mode can be a decent
+			 * packet generator for developer's quick performance
+			 * regression test.
+			 */
+			addr = (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,
 				sizeof(struct ether_hdr) +
 				sizeof(struct ipv4_hdr));
@@ -268,6 +287,9 @@ pkt_burst_transmit(struct fwd_stream *fs)
 	}
 	fs->tx_packets += nb_tx;
 
+	if (txonly_multi_flow)
+		RTE_PER_LCORE(_ip_var) += nb_tx;
+
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
 	fs->tx_burst_stats.pkt_burst_spread[nb_tx]++;
 #endif
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index 4495ed0382..b717b8c7b7 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -324,6 +324,10 @@ The commandline options are:
     Set TX segment sizes or total packet length. Valid for ``tx-only``
     and ``flowgen`` forwarding modes.
 
+*   ``--txonly-multi-flow``
+
+    Generate multiple flows in txonly mode.
+
 *   ``--disable-link-check``
 
     Disable check on link status when starting/stopping ports.
-- 
2.11.0


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate multiple flows
  2019-03-28  1:51 ` [dpdk-dev] [PATCH v3] " Yongseok Koh
  2019-03-28  1:51   ` Yongseok Koh
@ 2019-03-28 10:24   ` Iremonger, Bernard
  2019-03-28 10:24     ` Iremonger, Bernard
  2019-03-28 17:33     ` Yongseok Koh
  1 sibling, 2 replies; 24+ messages in thread
From: Iremonger, Bernard @ 2019-03-28 10:24 UTC (permalink / raw)
  To: Yongseok Koh, Lu, Wenzhuo, Wu, Jingjing; +Cc: dev, jerinj, Ananyev, Konstantin

Hi Yongseok,

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Yongseok Koh
> Sent: Thursday, March 28, 2019 1:51 AM
> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>
> Cc: dev@dpdk.org; jerinj@marvell.com; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>
> Subject: [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate
> multiple flows
> 
> Testpmd can generate multiple flows without taking much cost and this could
> be a simple traffic generator for developer's quick tests. If "--txonly-multi-
> flow" is specified in the command line, IP source address is varied to gnerate
> multiple flows.
> 
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> ---
> 
> v3:
> * Add "--txonly-multi-flow" param to enable the feature.
> * Replace __thread with RTE_PER_LCORE.
> 
> v2:
> * Add detailed explanation in a comment.
> 
>  app/test-pmd/parameters.c             |  4 ++++
>  app/test-pmd/testpmd.c                |  3 +++
>  app/test-pmd/testpmd.h                |  2 ++
>  app/test-pmd/txonly.c                 | 22 ++++++++++++++++++++++
>  doc/guides/testpmd_app_ug/run_app.rst |  4 ++++
>  5 files changed, 35 insertions(+)
> 
> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index
> 38b419767b..7b6b60905d 100644
> --- a/app/test-pmd/parameters.c
> +++ b/app/test-pmd/parameters.c
> @@ -173,6 +173,7 @@ usage(char* progname)
>  	       " Used mainly with PCAP drivers.\n");
>  	printf("  --txpkts=X[,Y]*: set TX segment sizes"
>  		" or total packet length.\n");
> +	printf("  --txonly-multi-flow: generate multiple flows in txonly
> +mode\n");
>  	printf("  --disable-link-check: disable check on link status when "
>  	       "starting/stopping ports.\n");
>  	printf("  --no-lsc-interrupt: disable link status change interrupt.\n");
> @@ -632,6 +633,7 @@ launch_args_parse(int argc, char** argv)
>  		{ "no-flush-rx",	0, 0, 0 },
>  		{ "flow-isolate-all",	        0, 0, 0 },
>  		{ "txpkts",			1, 0, 0 },
> +		{ "txonly-multi-flow",		0, 0, 0 },
>  		{ "disable-link-check",		0, 0, 0 },
>  		{ "no-lsc-interrupt",		0, 0, 0 },
>  		{ "no-rmv-interrupt",		0, 0, 0 },
> @@ -1141,6 +1143,8 @@ launch_args_parse(int argc, char** argv)
>  				else
>  					rte_exit(EXIT_FAILURE, "bad
> txpkts\n");
>  			}
> +			if (!strcmp(lgopts[opt_idx].name, "txonly-multi-
> flow"))
> +				txonly_multi_flow = 1;
>  			if (!strcmp(lgopts[opt_idx].name, "no-flush-rx"))
>  				no_flush_rx = 1;
>  			if (!strcmp(lgopts[opt_idx].name, "disable-link-
> check")) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 216be47f92..b950e8cc55 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -217,6 +217,9 @@ uint8_t  tx_pkt_nb_segs = 1; /**< Number of
> segments in TXONLY packets */  enum tx_pkt_split tx_pkt_split =
> TX_PKT_SPLIT_OFF;  /**< Split policy for packets to TX. */
> 
> +int txonly_multi_flow;

This should be "uint8_t  txonly_multi_flow;" similar to other variables in use,
 for example "uint8_t no_flush_rx = 0;"

> +/**< Whether multiple flows are generated in TXONLY mode. */
> +
>  uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per
> burst. */  uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of
> mbuf mempool cache. */
> 
> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index
> 85b791b6bb..668227bc55 100644
> --- a/app/test-pmd/testpmd.h
> +++ b/app/test-pmd/testpmd.h
> @@ -439,6 +439,8 @@ enum tx_pkt_split {
> 
>  extern enum tx_pkt_split tx_pkt_split;
> 
> +extern int txonly_multi_flow;

This should be "extern uint8_t txonly_multi_flow;" in line with the similar variables in use,
For example  "extern uint8_t no_flush_rx;"
 
> +
>  extern uint16_t nb_pkt_per_burst;
>  extern uint16_t mb_mempool_cache;
>  extern int8_t rx_pthresh;
> diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c index
> 1f08b6ed37..def52a0487 100644
> --- a/app/test-pmd/txonly.c
> +++ b/app/test-pmd/txonly.c
> @@ -52,6 +52,7 @@
>  #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
> 
>  static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
> +RTE_DEFINE_PER_LCORE(uint8_t, _ip_var); /**< IP address variation */
>  static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted
> packets. */
> 
>  static void
> @@ -164,6 +165,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
>  	uint16_t vlan_tci, vlan_tci_outer;
>  	uint32_t retry;
>  	uint64_t ol_flags = 0;
> +	uint8_t  ip_var = RTE_PER_LCORE(_ip_var);
>  	uint8_t  i;
>  	uint64_t tx_offloads;
>  #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
> @@ -237,6 +239,23 @@ pkt_burst_transmit(struct fwd_stream *fs)
>  		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
>  		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
>  				sizeof(struct ether_hdr));
> +		if (txonly_multi_flow) {
> +			struct ipv4_hdr *ip_hdr;
> +			uint32_t addr;
> +
> +			ip_hdr = rte_pktmbuf_mtod_offset(pkt,
> +					struct ipv4_hdr *,
> +					sizeof(struct ether_hdr));
> +			/*
> +			 * Generate multiple flows by varying IP src addr. This
> +			 * enables packets are well distributed by RSS in
> +			 * receiver side if any and txonly mode can be a
> decent
> +			 * packet generator for developer's quick
> performance
> +			 * regression test.
> +			 */
> +			addr = (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,
>  				sizeof(struct ether_hdr) +
>  				sizeof(struct ipv4_hdr));
> @@ -268,6 +287,9 @@ pkt_burst_transmit(struct fwd_stream *fs)
>  	}
>  	fs->tx_packets += nb_tx;
> 
> +	if (txonly_multi_flow)
> +		RTE_PER_LCORE(_ip_var) += nb_tx;
> +
>  #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
>  	fs->tx_burst_stats.pkt_burst_spread[nb_tx]++;
>  #endif
> diff --git a/doc/guides/testpmd_app_ug/run_app.rst
> b/doc/guides/testpmd_app_ug/run_app.rst
> index 4495ed0382..b717b8c7b7 100644
> --- a/doc/guides/testpmd_app_ug/run_app.rst
> +++ b/doc/guides/testpmd_app_ug/run_app.rst
> @@ -324,6 +324,10 @@ The commandline options are:
>      Set TX segment sizes or total packet length. Valid for ``tx-only``
>      and ``flowgen`` forwarding modes.
> 
> +*   ``--txonly-multi-flow``
> +
> +    Generate multiple flows in txonly mode.
> +
>  *   ``--disable-link-check``
> 
>      Disable check on link status when starting/stopping ports.
> --
> 2.11.0

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate multiple flows
  2019-03-28 10:24   ` Iremonger, Bernard
@ 2019-03-28 10:24     ` Iremonger, Bernard
  2019-03-28 17:33     ` Yongseok Koh
  1 sibling, 0 replies; 24+ messages in thread
From: Iremonger, Bernard @ 2019-03-28 10:24 UTC (permalink / raw)
  To: Yongseok Koh, Lu, Wenzhuo, Wu, Jingjing; +Cc: dev, jerinj, Ananyev, Konstantin

Hi Yongseok,

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Yongseok Koh
> Sent: Thursday, March 28, 2019 1:51 AM
> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>
> Cc: dev@dpdk.org; jerinj@marvell.com; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>
> Subject: [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate
> multiple flows
> 
> Testpmd can generate multiple flows without taking much cost and this could
> be a simple traffic generator for developer's quick tests. If "--txonly-multi-
> flow" is specified in the command line, IP source address is varied to gnerate
> multiple flows.
> 
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> ---
> 
> v3:
> * Add "--txonly-multi-flow" param to enable the feature.
> * Replace __thread with RTE_PER_LCORE.
> 
> v2:
> * Add detailed explanation in a comment.
> 
>  app/test-pmd/parameters.c             |  4 ++++
>  app/test-pmd/testpmd.c                |  3 +++
>  app/test-pmd/testpmd.h                |  2 ++
>  app/test-pmd/txonly.c                 | 22 ++++++++++++++++++++++
>  doc/guides/testpmd_app_ug/run_app.rst |  4 ++++
>  5 files changed, 35 insertions(+)
> 
> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index
> 38b419767b..7b6b60905d 100644
> --- a/app/test-pmd/parameters.c
> +++ b/app/test-pmd/parameters.c
> @@ -173,6 +173,7 @@ usage(char* progname)
>  	       " Used mainly with PCAP drivers.\n");
>  	printf("  --txpkts=X[,Y]*: set TX segment sizes"
>  		" or total packet length.\n");
> +	printf("  --txonly-multi-flow: generate multiple flows in txonly
> +mode\n");
>  	printf("  --disable-link-check: disable check on link status when "
>  	       "starting/stopping ports.\n");
>  	printf("  --no-lsc-interrupt: disable link status change interrupt.\n");
> @@ -632,6 +633,7 @@ launch_args_parse(int argc, char** argv)
>  		{ "no-flush-rx",	0, 0, 0 },
>  		{ "flow-isolate-all",	        0, 0, 0 },
>  		{ "txpkts",			1, 0, 0 },
> +		{ "txonly-multi-flow",		0, 0, 0 },
>  		{ "disable-link-check",		0, 0, 0 },
>  		{ "no-lsc-interrupt",		0, 0, 0 },
>  		{ "no-rmv-interrupt",		0, 0, 0 },
> @@ -1141,6 +1143,8 @@ launch_args_parse(int argc, char** argv)
>  				else
>  					rte_exit(EXIT_FAILURE, "bad
> txpkts\n");
>  			}
> +			if (!strcmp(lgopts[opt_idx].name, "txonly-multi-
> flow"))
> +				txonly_multi_flow = 1;
>  			if (!strcmp(lgopts[opt_idx].name, "no-flush-rx"))
>  				no_flush_rx = 1;
>  			if (!strcmp(lgopts[opt_idx].name, "disable-link-
> check")) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 216be47f92..b950e8cc55 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -217,6 +217,9 @@ uint8_t  tx_pkt_nb_segs = 1; /**< Number of
> segments in TXONLY packets */  enum tx_pkt_split tx_pkt_split =
> TX_PKT_SPLIT_OFF;  /**< Split policy for packets to TX. */
> 
> +int txonly_multi_flow;

This should be "uint8_t  txonly_multi_flow;" similar to other variables in use,
 for example "uint8_t no_flush_rx = 0;"

> +/**< Whether multiple flows are generated in TXONLY mode. */
> +
>  uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per
> burst. */  uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of
> mbuf mempool cache. */
> 
> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index
> 85b791b6bb..668227bc55 100644
> --- a/app/test-pmd/testpmd.h
> +++ b/app/test-pmd/testpmd.h
> @@ -439,6 +439,8 @@ enum tx_pkt_split {
> 
>  extern enum tx_pkt_split tx_pkt_split;
> 
> +extern int txonly_multi_flow;

This should be "extern uint8_t txonly_multi_flow;" in line with the similar variables in use,
For example  "extern uint8_t no_flush_rx;"
 
> +
>  extern uint16_t nb_pkt_per_burst;
>  extern uint16_t mb_mempool_cache;
>  extern int8_t rx_pthresh;
> diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c index
> 1f08b6ed37..def52a0487 100644
> --- a/app/test-pmd/txonly.c
> +++ b/app/test-pmd/txonly.c
> @@ -52,6 +52,7 @@
>  #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
> 
>  static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
> +RTE_DEFINE_PER_LCORE(uint8_t, _ip_var); /**< IP address variation */
>  static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted
> packets. */
> 
>  static void
> @@ -164,6 +165,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
>  	uint16_t vlan_tci, vlan_tci_outer;
>  	uint32_t retry;
>  	uint64_t ol_flags = 0;
> +	uint8_t  ip_var = RTE_PER_LCORE(_ip_var);
>  	uint8_t  i;
>  	uint64_t tx_offloads;
>  #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
> @@ -237,6 +239,23 @@ pkt_burst_transmit(struct fwd_stream *fs)
>  		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
>  		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
>  				sizeof(struct ether_hdr));
> +		if (txonly_multi_flow) {
> +			struct ipv4_hdr *ip_hdr;
> +			uint32_t addr;
> +
> +			ip_hdr = rte_pktmbuf_mtod_offset(pkt,
> +					struct ipv4_hdr *,
> +					sizeof(struct ether_hdr));
> +			/*
> +			 * Generate multiple flows by varying IP src addr. This
> +			 * enables packets are well distributed by RSS in
> +			 * receiver side if any and txonly mode can be a
> decent
> +			 * packet generator for developer's quick
> performance
> +			 * regression test.
> +			 */
> +			addr = (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,
>  				sizeof(struct ether_hdr) +
>  				sizeof(struct ipv4_hdr));
> @@ -268,6 +287,9 @@ pkt_burst_transmit(struct fwd_stream *fs)
>  	}
>  	fs->tx_packets += nb_tx;
> 
> +	if (txonly_multi_flow)
> +		RTE_PER_LCORE(_ip_var) += nb_tx;
> +
>  #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
>  	fs->tx_burst_stats.pkt_burst_spread[nb_tx]++;
>  #endif
> diff --git a/doc/guides/testpmd_app_ug/run_app.rst
> b/doc/guides/testpmd_app_ug/run_app.rst
> index 4495ed0382..b717b8c7b7 100644
> --- a/doc/guides/testpmd_app_ug/run_app.rst
> +++ b/doc/guides/testpmd_app_ug/run_app.rst
> @@ -324,6 +324,10 @@ The commandline options are:
>      Set TX segment sizes or total packet length. Valid for ``tx-only``
>      and ``flowgen`` forwarding modes.
> 
> +*   ``--txonly-multi-flow``
> +
> +    Generate multiple flows in txonly mode.
> +
>  *   ``--disable-link-check``
> 
>      Disable check on link status when starting/stopping ports.
> --
> 2.11.0


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate multiple flows
  2019-03-28 10:24   ` Iremonger, Bernard
  2019-03-28 10:24     ` Iremonger, Bernard
@ 2019-03-28 17:33     ` Yongseok Koh
  2019-03-28 17:33       ` Yongseok Koh
  2019-03-28 17:42       ` Iremonger, Bernard
  1 sibling, 2 replies; 24+ messages in thread
From: Yongseok Koh @ 2019-03-28 17:33 UTC (permalink / raw)
  To: Iremonger, Bernard
  Cc: Lu, Wenzhuo, Wu, Jingjing, dev, jerinj, Ananyev, Konstantin


> On Mar 28, 2019, at 3:24 AM, Iremonger, Bernard <bernard.iremonger@intel.com> wrote:
> 
> Hi Yongseok,
> 
>> -----Original Message-----
>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Yongseok Koh
>> Sent: Thursday, March 28, 2019 1:51 AM
>> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
>> <jingjing.wu@intel.com>
>> Cc: dev@dpdk.org; jerinj@marvell.com; Ananyev, Konstantin
>> <konstantin.ananyev@intel.com>
>> Subject: [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate
>> multiple flows
>> 
>> Testpmd can generate multiple flows without taking much cost and this could
>> be a simple traffic generator for developer's quick tests. If "--txonly-multi-
>> flow" is specified in the command line, IP source address is varied to gnerate
>> multiple flows.
>> 
>> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
>> ---
>> 
>> v3:
>> * Add "--txonly-multi-flow" param to enable the feature.
>> * Replace __thread with RTE_PER_LCORE.
>> 
>> v2:
>> * Add detailed explanation in a comment.
>> 
>> app/test-pmd/parameters.c             |  4 ++++
>> app/test-pmd/testpmd.c                |  3 +++
>> app/test-pmd/testpmd.h                |  2 ++
>> app/test-pmd/txonly.c                 | 22 ++++++++++++++++++++++
>> doc/guides/testpmd_app_ug/run_app.rst |  4 ++++
>> 5 files changed, 35 insertions(+)
>> 
>> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index
>> 38b419767b..7b6b60905d 100644
>> --- a/app/test-pmd/parameters.c
>> +++ b/app/test-pmd/parameters.c
>> @@ -173,6 +173,7 @@ usage(char* progname)
>> 	       " Used mainly with PCAP drivers.\n");
>> 	printf("  --txpkts=X[,Y]*: set TX segment sizes"
>> 		" or total packet length.\n");
>> +	printf("  --txonly-multi-flow: generate multiple flows in txonly
>> +mode\n");
>> 	printf("  --disable-link-check: disable check on link status when "
>> 	       "starting/stopping ports.\n");
>> 	printf("  --no-lsc-interrupt: disable link status change interrupt.\n");
>> @@ -632,6 +633,7 @@ launch_args_parse(int argc, char** argv)
>> 		{ "no-flush-rx",	0, 0, 0 },
>> 		{ "flow-isolate-all",	        0, 0, 0 },
>> 		{ "txpkts",			1, 0, 0 },
>> +		{ "txonly-multi-flow",		0, 0, 0 },
>> 		{ "disable-link-check",		0, 0, 0 },
>> 		{ "no-lsc-interrupt",		0, 0, 0 },
>> 		{ "no-rmv-interrupt",		0, 0, 0 },
>> @@ -1141,6 +1143,8 @@ launch_args_parse(int argc, char** argv)
>> 				else
>> 					rte_exit(EXIT_FAILURE, "bad
>> txpkts\n");
>> 			}
>> +			if (!strcmp(lgopts[opt_idx].name, "txonly-multi-
>> flow"))
>> +				txonly_multi_flow = 1;
>> 			if (!strcmp(lgopts[opt_idx].name, "no-flush-rx"))
>> 				no_flush_rx = 1;
>> 			if (!strcmp(lgopts[opt_idx].name, "disable-link-
>> check")) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
>> index 216be47f92..b950e8cc55 100644
>> --- a/app/test-pmd/testpmd.c
>> +++ b/app/test-pmd/testpmd.c
>> @@ -217,6 +217,9 @@ uint8_t  tx_pkt_nb_segs = 1; /**< Number of
>> segments in TXONLY packets */  enum tx_pkt_split tx_pkt_split =
>> TX_PKT_SPLIT_OFF;  /**< Split policy for packets to TX. */
>> 
>> +int txonly_multi_flow;
> 
> This should be "uint8_t  txonly_multi_flow;" similar to other variables in use,
> for example "uint8_t no_flush_rx = 0;"
> 
>> +/**< Whether multiple flows are generated in TXONLY mode. */
>> +
>> uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per
>> burst. */  uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of
>> mbuf mempool cache. */
>> 
>> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index
>> 85b791b6bb..668227bc55 100644
>> --- a/app/test-pmd/testpmd.h
>> +++ b/app/test-pmd/testpmd.h
>> @@ -439,6 +439,8 @@ enum tx_pkt_split {
>> 
>> extern enum tx_pkt_split tx_pkt_split;
>> 
>> +extern int txonly_multi_flow;
> 
> This should be "extern uint8_t txonly_multi_flow;" in line with the similar variables in use,
> For example  "extern uint8_t no_flush_rx;"

Okay, will change it to uint8_t but what about the error by checkpatches.sh?

	+ ./devtools/checkpatches.sh -n1

	### app/testpmd: make txonly mode generate multiple flows

	ERROR:GLOBAL_INITIALISERS: do not initialise globals to 0
	#50: FILE: app/test-pmd/testpmd.c:220:
	+uint8_t txonly_multi_flow = 0;

	total: 1 errors, 0 warnings, 95 lines checked

	0/1 valid patch

I'll submit without the init but if you still insist that way for consistency,
let me know then I'll submit another version.

Thanks,
Yongseok

> 
>> +
>> extern uint16_t nb_pkt_per_burst;
>> extern uint16_t mb_mempool_cache;
>> extern int8_t rx_pthresh;
>> diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c index
>> 1f08b6ed37..def52a0487 100644
>> --- a/app/test-pmd/txonly.c
>> +++ b/app/test-pmd/txonly.c
>> @@ -52,6 +52,7 @@
>> #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
>> 
>> static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
>> +RTE_DEFINE_PER_LCORE(uint8_t, _ip_var); /**< IP address variation */
>> static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted
>> packets. */
>> 
>> static void
>> @@ -164,6 +165,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
>> 	uint16_t vlan_tci, vlan_tci_outer;
>> 	uint32_t retry;
>> 	uint64_t ol_flags = 0;
>> +	uint8_t  ip_var = RTE_PER_LCORE(_ip_var);
>> 	uint8_t  i;
>> 	uint64_t tx_offloads;
>> #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
>> @@ -237,6 +239,23 @@ pkt_burst_transmit(struct fwd_stream *fs)
>> 		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
>> 		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
>> 				sizeof(struct ether_hdr));
>> +		if (txonly_multi_flow) {
>> +			struct ipv4_hdr *ip_hdr;
>> +			uint32_t addr;
>> +
>> +			ip_hdr = rte_pktmbuf_mtod_offset(pkt,
>> +					struct ipv4_hdr *,
>> +					sizeof(struct ether_hdr));
>> +			/*
>> +			 * Generate multiple flows by varying IP src addr. This
>> +			 * enables packets are well distributed by RSS in
>> +			 * receiver side if any and txonly mode can be a
>> decent
>> +			 * packet generator for developer's quick
>> performance
>> +			 * regression test.
>> +			 */
>> +			addr = (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,
>> 				sizeof(struct ether_hdr) +
>> 				sizeof(struct ipv4_hdr));
>> @@ -268,6 +287,9 @@ pkt_burst_transmit(struct fwd_stream *fs)
>> 	}
>> 	fs->tx_packets += nb_tx;
>> 
>> +	if (txonly_multi_flow)
>> +		RTE_PER_LCORE(_ip_var) += nb_tx;
>> +
>> #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
>> 	fs->tx_burst_stats.pkt_burst_spread[nb_tx]++;
>> #endif
>> diff --git a/doc/guides/testpmd_app_ug/run_app.rst
>> b/doc/guides/testpmd_app_ug/run_app.rst
>> index 4495ed0382..b717b8c7b7 100644
>> --- a/doc/guides/testpmd_app_ug/run_app.rst
>> +++ b/doc/guides/testpmd_app_ug/run_app.rst
>> @@ -324,6 +324,10 @@ The commandline options are:
>>     Set TX segment sizes or total packet length. Valid for ``tx-only``
>>     and ``flowgen`` forwarding modes.
>> 
>> +*   ``--txonly-multi-flow``
>> +
>> +    Generate multiple flows in txonly mode.
>> +
>> *   ``--disable-link-check``
>> 
>>     Disable check on link status when starting/stopping ports.
>> --
>> 2.11.0

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate multiple flows
  2019-03-28 17:33     ` Yongseok Koh
@ 2019-03-28 17:33       ` Yongseok Koh
  2019-03-28 17:42       ` Iremonger, Bernard
  1 sibling, 0 replies; 24+ messages in thread
From: Yongseok Koh @ 2019-03-28 17:33 UTC (permalink / raw)
  To: Iremonger, Bernard
  Cc: Lu, Wenzhuo, Wu, Jingjing, dev, jerinj, Ananyev, Konstantin


> On Mar 28, 2019, at 3:24 AM, Iremonger, Bernard <bernard.iremonger@intel.com> wrote:
> 
> Hi Yongseok,
> 
>> -----Original Message-----
>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Yongseok Koh
>> Sent: Thursday, March 28, 2019 1:51 AM
>> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
>> <jingjing.wu@intel.com>
>> Cc: dev@dpdk.org; jerinj@marvell.com; Ananyev, Konstantin
>> <konstantin.ananyev@intel.com>
>> Subject: [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate
>> multiple flows
>> 
>> Testpmd can generate multiple flows without taking much cost and this could
>> be a simple traffic generator for developer's quick tests. If "--txonly-multi-
>> flow" is specified in the command line, IP source address is varied to gnerate
>> multiple flows.
>> 
>> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
>> ---
>> 
>> v3:
>> * Add "--txonly-multi-flow" param to enable the feature.
>> * Replace __thread with RTE_PER_LCORE.
>> 
>> v2:
>> * Add detailed explanation in a comment.
>> 
>> app/test-pmd/parameters.c             |  4 ++++
>> app/test-pmd/testpmd.c                |  3 +++
>> app/test-pmd/testpmd.h                |  2 ++
>> app/test-pmd/txonly.c                 | 22 ++++++++++++++++++++++
>> doc/guides/testpmd_app_ug/run_app.rst |  4 ++++
>> 5 files changed, 35 insertions(+)
>> 
>> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index
>> 38b419767b..7b6b60905d 100644
>> --- a/app/test-pmd/parameters.c
>> +++ b/app/test-pmd/parameters.c
>> @@ -173,6 +173,7 @@ usage(char* progname)
>> 	       " Used mainly with PCAP drivers.\n");
>> 	printf("  --txpkts=X[,Y]*: set TX segment sizes"
>> 		" or total packet length.\n");
>> +	printf("  --txonly-multi-flow: generate multiple flows in txonly
>> +mode\n");
>> 	printf("  --disable-link-check: disable check on link status when "
>> 	       "starting/stopping ports.\n");
>> 	printf("  --no-lsc-interrupt: disable link status change interrupt.\n");
>> @@ -632,6 +633,7 @@ launch_args_parse(int argc, char** argv)
>> 		{ "no-flush-rx",	0, 0, 0 },
>> 		{ "flow-isolate-all",	        0, 0, 0 },
>> 		{ "txpkts",			1, 0, 0 },
>> +		{ "txonly-multi-flow",		0, 0, 0 },
>> 		{ "disable-link-check",		0, 0, 0 },
>> 		{ "no-lsc-interrupt",		0, 0, 0 },
>> 		{ "no-rmv-interrupt",		0, 0, 0 },
>> @@ -1141,6 +1143,8 @@ launch_args_parse(int argc, char** argv)
>> 				else
>> 					rte_exit(EXIT_FAILURE, "bad
>> txpkts\n");
>> 			}
>> +			if (!strcmp(lgopts[opt_idx].name, "txonly-multi-
>> flow"))
>> +				txonly_multi_flow = 1;
>> 			if (!strcmp(lgopts[opt_idx].name, "no-flush-rx"))
>> 				no_flush_rx = 1;
>> 			if (!strcmp(lgopts[opt_idx].name, "disable-link-
>> check")) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
>> index 216be47f92..b950e8cc55 100644
>> --- a/app/test-pmd/testpmd.c
>> +++ b/app/test-pmd/testpmd.c
>> @@ -217,6 +217,9 @@ uint8_t  tx_pkt_nb_segs = 1; /**< Number of
>> segments in TXONLY packets */  enum tx_pkt_split tx_pkt_split =
>> TX_PKT_SPLIT_OFF;  /**< Split policy for packets to TX. */
>> 
>> +int txonly_multi_flow;
> 
> This should be "uint8_t  txonly_multi_flow;" similar to other variables in use,
> for example "uint8_t no_flush_rx = 0;"
> 
>> +/**< Whether multiple flows are generated in TXONLY mode. */
>> +
>> uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per
>> burst. */  uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of
>> mbuf mempool cache. */
>> 
>> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index
>> 85b791b6bb..668227bc55 100644
>> --- a/app/test-pmd/testpmd.h
>> +++ b/app/test-pmd/testpmd.h
>> @@ -439,6 +439,8 @@ enum tx_pkt_split {
>> 
>> extern enum tx_pkt_split tx_pkt_split;
>> 
>> +extern int txonly_multi_flow;
> 
> This should be "extern uint8_t txonly_multi_flow;" in line with the similar variables in use,
> For example  "extern uint8_t no_flush_rx;"

Okay, will change it to uint8_t but what about the error by checkpatches.sh?

	+ ./devtools/checkpatches.sh -n1

	### app/testpmd: make txonly mode generate multiple flows

	ERROR:GLOBAL_INITIALISERS: do not initialise globals to 0
	#50: FILE: app/test-pmd/testpmd.c:220:
	+uint8_t txonly_multi_flow = 0;

	total: 1 errors, 0 warnings, 95 lines checked

	0/1 valid patch

I'll submit without the init but if you still insist that way for consistency,
let me know then I'll submit another version.

Thanks,
Yongseok

> 
>> +
>> extern uint16_t nb_pkt_per_burst;
>> extern uint16_t mb_mempool_cache;
>> extern int8_t rx_pthresh;
>> diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c index
>> 1f08b6ed37..def52a0487 100644
>> --- a/app/test-pmd/txonly.c
>> +++ b/app/test-pmd/txonly.c
>> @@ -52,6 +52,7 @@
>> #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
>> 
>> static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
>> +RTE_DEFINE_PER_LCORE(uint8_t, _ip_var); /**< IP address variation */
>> static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted
>> packets. */
>> 
>> static void
>> @@ -164,6 +165,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
>> 	uint16_t vlan_tci, vlan_tci_outer;
>> 	uint32_t retry;
>> 	uint64_t ol_flags = 0;
>> +	uint8_t  ip_var = RTE_PER_LCORE(_ip_var);
>> 	uint8_t  i;
>> 	uint64_t tx_offloads;
>> #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
>> @@ -237,6 +239,23 @@ pkt_burst_transmit(struct fwd_stream *fs)
>> 		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
>> 		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
>> 				sizeof(struct ether_hdr));
>> +		if (txonly_multi_flow) {
>> +			struct ipv4_hdr *ip_hdr;
>> +			uint32_t addr;
>> +
>> +			ip_hdr = rte_pktmbuf_mtod_offset(pkt,
>> +					struct ipv4_hdr *,
>> +					sizeof(struct ether_hdr));
>> +			/*
>> +			 * Generate multiple flows by varying IP src addr. This
>> +			 * enables packets are well distributed by RSS in
>> +			 * receiver side if any and txonly mode can be a
>> decent
>> +			 * packet generator for developer's quick
>> performance
>> +			 * regression test.
>> +			 */
>> +			addr = (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,
>> 				sizeof(struct ether_hdr) +
>> 				sizeof(struct ipv4_hdr));
>> @@ -268,6 +287,9 @@ pkt_burst_transmit(struct fwd_stream *fs)
>> 	}
>> 	fs->tx_packets += nb_tx;
>> 
>> +	if (txonly_multi_flow)
>> +		RTE_PER_LCORE(_ip_var) += nb_tx;
>> +
>> #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
>> 	fs->tx_burst_stats.pkt_burst_spread[nb_tx]++;
>> #endif
>> diff --git a/doc/guides/testpmd_app_ug/run_app.rst
>> b/doc/guides/testpmd_app_ug/run_app.rst
>> index 4495ed0382..b717b8c7b7 100644
>> --- a/doc/guides/testpmd_app_ug/run_app.rst
>> +++ b/doc/guides/testpmd_app_ug/run_app.rst
>> @@ -324,6 +324,10 @@ The commandline options are:
>>     Set TX segment sizes or total packet length. Valid for ``tx-only``
>>     and ``flowgen`` forwarding modes.
>> 
>> +*   ``--txonly-multi-flow``
>> +
>> +    Generate multiple flows in txonly mode.
>> +
>> *   ``--disable-link-check``
>> 
>>     Disable check on link status when starting/stopping ports.
>> --
>> 2.11.0


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate multiple flows
  2019-03-28 17:33     ` Yongseok Koh
  2019-03-28 17:33       ` Yongseok Koh
@ 2019-03-28 17:42       ` Iremonger, Bernard
  2019-03-28 17:42         ` Iremonger, Bernard
  1 sibling, 1 reply; 24+ messages in thread
From: Iremonger, Bernard @ 2019-03-28 17:42 UTC (permalink / raw)
  To: Yongseok Koh; +Cc: Lu, Wenzhuo, Wu, Jingjing, dev, jerinj, Ananyev, Konstantin

Hi Yongseok,

<snip>

> >> Subject: [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate
> >> multiple flows
> >>
> >> Testpmd can generate multiple flows without taking much cost and this
> >> could be a simple traffic generator for developer's quick tests. If
> >> "--txonly-multi- flow" is specified in the command line, IP source
> >> address is varied to gnerate multiple flows.
> >>
> >> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> >> ---
> >>
> >> v3:
> >> * Add "--txonly-multi-flow" param to enable the feature.
> >> * Replace __thread with RTE_PER_LCORE.
> >>
> >> v2:
> >> * Add detailed explanation in a comment.
> >>
> >> app/test-pmd/parameters.c             |  4 ++++
> >> app/test-pmd/testpmd.c                |  3 +++
> >> app/test-pmd/testpmd.h                |  2 ++
> >> app/test-pmd/txonly.c                 | 22 ++++++++++++++++++++++
> >> doc/guides/testpmd_app_ug/run_app.rst |  4 ++++
> >> 5 files changed, 35 insertions(+)
> >>
> >> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> >> index 38b419767b..7b6b60905d 100644
> >> --- a/app/test-pmd/parameters.c
> >> +++ b/app/test-pmd/parameters.c
> >> @@ -173,6 +173,7 @@ usage(char* progname)
> >> 	       " Used mainly with PCAP drivers.\n");
> >> 	printf("  --txpkts=X[,Y]*: set TX segment sizes"
> >> 		" or total packet length.\n");
> >> +	printf("  --txonly-multi-flow: generate multiple flows in txonly
> >> +mode\n");
> >> 	printf("  --disable-link-check: disable check on link status when "
> >> 	       "starting/stopping ports.\n");
> >> 	printf("  --no-lsc-interrupt: disable link status change
> >> interrupt.\n"); @@ -632,6 +633,7 @@ launch_args_parse(int argc, char**
> argv)
> >> 		{ "no-flush-rx",	0, 0, 0 },
> >> 		{ "flow-isolate-all",	        0, 0, 0 },
> >> 		{ "txpkts",			1, 0, 0 },
> >> +		{ "txonly-multi-flow",		0, 0, 0 },
> >> 		{ "disable-link-check",		0, 0, 0 },
> >> 		{ "no-lsc-interrupt",		0, 0, 0 },
> >> 		{ "no-rmv-interrupt",		0, 0, 0 },
> >> @@ -1141,6 +1143,8 @@ launch_args_parse(int argc, char** argv)
> >> 				else
> >> 					rte_exit(EXIT_FAILURE, "bad
> >> txpkts\n");
> >> 			}
> >> +			if (!strcmp(lgopts[opt_idx].name, "txonly-multi-
> >> flow"))
> >> +				txonly_multi_flow = 1;
> >> 			if (!strcmp(lgopts[opt_idx].name, "no-flush-rx"))
> >> 				no_flush_rx = 1;
> >> 			if (!strcmp(lgopts[opt_idx].name, "disable-link-
> >> check")) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> >> index 216be47f92..b950e8cc55 100644
> >> --- a/app/test-pmd/testpmd.c
> >> +++ b/app/test-pmd/testpmd.c
> >> @@ -217,6 +217,9 @@ uint8_t  tx_pkt_nb_segs = 1; /**< Number of
> >> segments in TXONLY packets */  enum tx_pkt_split tx_pkt_split =
> >> TX_PKT_SPLIT_OFF;  /**< Split policy for packets to TX. */
> >>
> >> +int txonly_multi_flow;
> >
> > This should be "uint8_t  txonly_multi_flow;" similar to other
> > variables in use, for example "uint8_t no_flush_rx = 0;"
> >
> >> +/**< Whether multiple flows are generated in TXONLY mode. */
> >> +
> >> uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per
> >> burst. */  uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of
> >> mbuf mempool cache. */
> >>
> >> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index
> >> 85b791b6bb..668227bc55 100644
> >> --- a/app/test-pmd/testpmd.h
> >> +++ b/app/test-pmd/testpmd.h
> >> @@ -439,6 +439,8 @@ enum tx_pkt_split {
> >>
> >> extern enum tx_pkt_split tx_pkt_split;
> >>
> >> +extern int txonly_multi_flow;
> >
> > This should be "extern uint8_t txonly_multi_flow;" in line with the
> > similar variables in use, For example  "extern uint8_t no_flush_rx;"
> 
> Okay, will change it to uint8_t but what about the error by checkpatches.sh?
> 
> 	+ ./devtools/checkpatches.sh -n1
> 
> 	### app/testpmd: make txonly mode generate multiple flows
> 
> 	ERROR:GLOBAL_INITIALISERS: do not initialise globals to 0
> 	#50: FILE: app/test-pmd/testpmd.c:220:
> 	+uint8_t txonly_multi_flow = 0;
> 
> 	total: 1 errors, 0 warnings, 95 lines checked
> 
> 	0/1 valid patch
> 
> I'll submit without the init but if you still insist that way for consistency, let me
> know then I'll submit another version.
> 
> Thanks,
> Yongseok

Please submit without the init to avoid checkpatch error (example probably predates checkpatch checks).

Regards,

Bernard.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate multiple flows
  2019-03-28 17:42       ` Iremonger, Bernard
@ 2019-03-28 17:42         ` Iremonger, Bernard
  0 siblings, 0 replies; 24+ messages in thread
From: Iremonger, Bernard @ 2019-03-28 17:42 UTC (permalink / raw)
  To: Yongseok Koh; +Cc: Lu, Wenzhuo, Wu, Jingjing, dev, jerinj, Ananyev, Konstantin

Hi Yongseok,

<snip>

> >> Subject: [dpdk-dev] [PATCH v3] app/testpmd: make txonly mode generate
> >> multiple flows
> >>
> >> Testpmd can generate multiple flows without taking much cost and this
> >> could be a simple traffic generator for developer's quick tests. If
> >> "--txonly-multi- flow" is specified in the command line, IP source
> >> address is varied to gnerate multiple flows.
> >>
> >> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> >> ---
> >>
> >> v3:
> >> * Add "--txonly-multi-flow" param to enable the feature.
> >> * Replace __thread with RTE_PER_LCORE.
> >>
> >> v2:
> >> * Add detailed explanation in a comment.
> >>
> >> app/test-pmd/parameters.c             |  4 ++++
> >> app/test-pmd/testpmd.c                |  3 +++
> >> app/test-pmd/testpmd.h                |  2 ++
> >> app/test-pmd/txonly.c                 | 22 ++++++++++++++++++++++
> >> doc/guides/testpmd_app_ug/run_app.rst |  4 ++++
> >> 5 files changed, 35 insertions(+)
> >>
> >> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> >> index 38b419767b..7b6b60905d 100644
> >> --- a/app/test-pmd/parameters.c
> >> +++ b/app/test-pmd/parameters.c
> >> @@ -173,6 +173,7 @@ usage(char* progname)
> >> 	       " Used mainly with PCAP drivers.\n");
> >> 	printf("  --txpkts=X[,Y]*: set TX segment sizes"
> >> 		" or total packet length.\n");
> >> +	printf("  --txonly-multi-flow: generate multiple flows in txonly
> >> +mode\n");
> >> 	printf("  --disable-link-check: disable check on link status when "
> >> 	       "starting/stopping ports.\n");
> >> 	printf("  --no-lsc-interrupt: disable link status change
> >> interrupt.\n"); @@ -632,6 +633,7 @@ launch_args_parse(int argc, char**
> argv)
> >> 		{ "no-flush-rx",	0, 0, 0 },
> >> 		{ "flow-isolate-all",	        0, 0, 0 },
> >> 		{ "txpkts",			1, 0, 0 },
> >> +		{ "txonly-multi-flow",		0, 0, 0 },
> >> 		{ "disable-link-check",		0, 0, 0 },
> >> 		{ "no-lsc-interrupt",		0, 0, 0 },
> >> 		{ "no-rmv-interrupt",		0, 0, 0 },
> >> @@ -1141,6 +1143,8 @@ launch_args_parse(int argc, char** argv)
> >> 				else
> >> 					rte_exit(EXIT_FAILURE, "bad
> >> txpkts\n");
> >> 			}
> >> +			if (!strcmp(lgopts[opt_idx].name, "txonly-multi-
> >> flow"))
> >> +				txonly_multi_flow = 1;
> >> 			if (!strcmp(lgopts[opt_idx].name, "no-flush-rx"))
> >> 				no_flush_rx = 1;
> >> 			if (!strcmp(lgopts[opt_idx].name, "disable-link-
> >> check")) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> >> index 216be47f92..b950e8cc55 100644
> >> --- a/app/test-pmd/testpmd.c
> >> +++ b/app/test-pmd/testpmd.c
> >> @@ -217,6 +217,9 @@ uint8_t  tx_pkt_nb_segs = 1; /**< Number of
> >> segments in TXONLY packets */  enum tx_pkt_split tx_pkt_split =
> >> TX_PKT_SPLIT_OFF;  /**< Split policy for packets to TX. */
> >>
> >> +int txonly_multi_flow;
> >
> > This should be "uint8_t  txonly_multi_flow;" similar to other
> > variables in use, for example "uint8_t no_flush_rx = 0;"
> >
> >> +/**< Whether multiple flows are generated in TXONLY mode. */
> >> +
> >> uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per
> >> burst. */  uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of
> >> mbuf mempool cache. */
> >>
> >> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index
> >> 85b791b6bb..668227bc55 100644
> >> --- a/app/test-pmd/testpmd.h
> >> +++ b/app/test-pmd/testpmd.h
> >> @@ -439,6 +439,8 @@ enum tx_pkt_split {
> >>
> >> extern enum tx_pkt_split tx_pkt_split;
> >>
> >> +extern int txonly_multi_flow;
> >
> > This should be "extern uint8_t txonly_multi_flow;" in line with the
> > similar variables in use, For example  "extern uint8_t no_flush_rx;"
> 
> Okay, will change it to uint8_t but what about the error by checkpatches.sh?
> 
> 	+ ./devtools/checkpatches.sh -n1
> 
> 	### app/testpmd: make txonly mode generate multiple flows
> 
> 	ERROR:GLOBAL_INITIALISERS: do not initialise globals to 0
> 	#50: FILE: app/test-pmd/testpmd.c:220:
> 	+uint8_t txonly_multi_flow = 0;
> 
> 	total: 1 errors, 0 warnings, 95 lines checked
> 
> 	0/1 valid patch
> 
> I'll submit without the init but if you still insist that way for consistency, let me
> know then I'll submit another version.
> 
> Thanks,
> Yongseok

Please submit without the init to avoid checkpatch error (example probably predates checkpatch checks).

Regards,

Bernard.


^ permalink raw reply	[flat|nested] 24+ messages in thread

* [dpdk-dev] [PATCH v4] app/testpmd: make txonly mode generate multiple flows
  2017-12-15 21:11 [dpdk-dev] [PATCH] app/testpmd: make txonly mode generate multiple flows Yongseok Koh
                   ` (3 preceding siblings ...)
  2019-03-28  1:51 ` [dpdk-dev] [PATCH v3] " Yongseok Koh
@ 2019-03-28 18:46 ` Yongseok Koh
  2019-03-28 18:46   ` Yongseok Koh
  2019-03-29  9:55   ` Iremonger, Bernard
  4 siblings, 2 replies; 24+ messages in thread
From: Yongseok Koh @ 2019-03-28 18:46 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu
  Cc: dev, bernard.iremonger, jerinj, konstantin.ananyev

Testpmd can generate multiple flows without taking much cost and this could
be a simple traffic generator for developer's quick tests. If
"--txonly-multi-flow" is specified in the command line, IP source address
is varied to gnerate multiple flows.

Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
---

v4:
* use uint8_t for txonly_multi_flow variable.

v3:
* Add "--txonly-multi-flow" param to enable the feature.
* Replace __thread with RTE_PER_LCORE.

v2:
* Add detailed explanation in a comment.

 app/test-pmd/parameters.c             |  4 ++++
 app/test-pmd/testpmd.c                |  3 +++
 app/test-pmd/testpmd.h                |  2 ++
 app/test-pmd/txonly.c                 | 22 ++++++++++++++++++++++
 doc/guides/testpmd_app_ug/run_app.rst |  4 ++++
 5 files changed, 35 insertions(+)

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 38b419767b..7b6b60905d 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -173,6 +173,7 @@ usage(char* progname)
 	       " Used mainly with PCAP drivers.\n");
 	printf("  --txpkts=X[,Y]*: set TX segment sizes"
 		" or total packet length.\n");
+	printf("  --txonly-multi-flow: generate multiple flows in txonly mode\n");
 	printf("  --disable-link-check: disable check on link status when "
 	       "starting/stopping ports.\n");
 	printf("  --no-lsc-interrupt: disable link status change interrupt.\n");
@@ -632,6 +633,7 @@ launch_args_parse(int argc, char** argv)
 		{ "no-flush-rx",	0, 0, 0 },
 		{ "flow-isolate-all",	        0, 0, 0 },
 		{ "txpkts",			1, 0, 0 },
+		{ "txonly-multi-flow",		0, 0, 0 },
 		{ "disable-link-check",		0, 0, 0 },
 		{ "no-lsc-interrupt",		0, 0, 0 },
 		{ "no-rmv-interrupt",		0, 0, 0 },
@@ -1141,6 +1143,8 @@ launch_args_parse(int argc, char** argv)
 				else
 					rte_exit(EXIT_FAILURE, "bad txpkts\n");
 			}
+			if (!strcmp(lgopts[opt_idx].name, "txonly-multi-flow"))
+				txonly_multi_flow = 1;
 			if (!strcmp(lgopts[opt_idx].name, "no-flush-rx"))
 				no_flush_rx = 1;
 			if (!strcmp(lgopts[opt_idx].name, "disable-link-check"))
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 216be47f92..237b6b0b39 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -217,6 +217,9 @@ uint8_t  tx_pkt_nb_segs = 1; /**< Number of segments in TXONLY packets */
 enum tx_pkt_split tx_pkt_split = TX_PKT_SPLIT_OFF;
 /**< Split policy for packets to TX. */
 
+uint8_t txonly_multi_flow;
+/**< Whether multiple flows are generated in TXONLY mode. */
+
 uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per burst. */
 uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of mbuf mempool cache. */
 
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 85b791b6bb..29a5520126 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -439,6 +439,8 @@ enum tx_pkt_split {
 
 extern enum tx_pkt_split tx_pkt_split;
 
+extern uint8_t txonly_multi_flow;
+
 extern uint16_t nb_pkt_per_burst;
 extern uint16_t mb_mempool_cache;
 extern int8_t rx_pthresh;
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 1f08b6ed37..def52a0487 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -52,6 +52,7 @@
 #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
 
 static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
+RTE_DEFINE_PER_LCORE(uint8_t, _ip_var); /**< IP address variation */
 static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted packets. */
 
 static void
@@ -164,6 +165,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
 	uint16_t vlan_tci, vlan_tci_outer;
 	uint32_t retry;
 	uint64_t ol_flags = 0;
+	uint8_t  ip_var = RTE_PER_LCORE(_ip_var);
 	uint8_t  i;
 	uint64_t tx_offloads;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
@@ -237,6 +239,23 @@ pkt_burst_transmit(struct fwd_stream *fs)
 		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
 		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
 				sizeof(struct ether_hdr));
+		if (txonly_multi_flow) {
+			struct ipv4_hdr *ip_hdr;
+			uint32_t addr;
+
+			ip_hdr = rte_pktmbuf_mtod_offset(pkt,
+					struct ipv4_hdr *,
+					sizeof(struct ether_hdr));
+			/*
+			 * Generate multiple flows by varying IP src addr. This
+			 * enables packets are well distributed by RSS in
+			 * receiver side if any and txonly mode can be a decent
+			 * packet generator for developer's quick performance
+			 * regression test.
+			 */
+			addr = (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,
 				sizeof(struct ether_hdr) +
 				sizeof(struct ipv4_hdr));
@@ -268,6 +287,9 @@ pkt_burst_transmit(struct fwd_stream *fs)
 	}
 	fs->tx_packets += nb_tx;
 
+	if (txonly_multi_flow)
+		RTE_PER_LCORE(_ip_var) += nb_tx;
+
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
 	fs->tx_burst_stats.pkt_burst_spread[nb_tx]++;
 #endif
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index 4495ed0382..b717b8c7b7 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -324,6 +324,10 @@ The commandline options are:
     Set TX segment sizes or total packet length. Valid for ``tx-only``
     and ``flowgen`` forwarding modes.
 
+*   ``--txonly-multi-flow``
+
+    Generate multiple flows in txonly mode.
+
 *   ``--disable-link-check``
 
     Disable check on link status when starting/stopping ports.
-- 
2.11.0

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [dpdk-dev] [PATCH v4] app/testpmd: make txonly mode generate multiple flows
  2019-03-28 18:46 ` [dpdk-dev] [PATCH v4] " Yongseok Koh
@ 2019-03-28 18:46   ` Yongseok Koh
  2019-03-29  9:55   ` Iremonger, Bernard
  1 sibling, 0 replies; 24+ messages in thread
From: Yongseok Koh @ 2019-03-28 18:46 UTC (permalink / raw)
  To: wenzhuo.lu, jingjing.wu
  Cc: dev, bernard.iremonger, jerinj, konstantin.ananyev

Testpmd can generate multiple flows without taking much cost and this could
be a simple traffic generator for developer's quick tests. If
"--txonly-multi-flow" is specified in the command line, IP source address
is varied to gnerate multiple flows.

Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
---

v4:
* use uint8_t for txonly_multi_flow variable.

v3:
* Add "--txonly-multi-flow" param to enable the feature.
* Replace __thread with RTE_PER_LCORE.

v2:
* Add detailed explanation in a comment.

 app/test-pmd/parameters.c             |  4 ++++
 app/test-pmd/testpmd.c                |  3 +++
 app/test-pmd/testpmd.h                |  2 ++
 app/test-pmd/txonly.c                 | 22 ++++++++++++++++++++++
 doc/guides/testpmd_app_ug/run_app.rst |  4 ++++
 5 files changed, 35 insertions(+)

diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 38b419767b..7b6b60905d 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -173,6 +173,7 @@ usage(char* progname)
 	       " Used mainly with PCAP drivers.\n");
 	printf("  --txpkts=X[,Y]*: set TX segment sizes"
 		" or total packet length.\n");
+	printf("  --txonly-multi-flow: generate multiple flows in txonly mode\n");
 	printf("  --disable-link-check: disable check on link status when "
 	       "starting/stopping ports.\n");
 	printf("  --no-lsc-interrupt: disable link status change interrupt.\n");
@@ -632,6 +633,7 @@ launch_args_parse(int argc, char** argv)
 		{ "no-flush-rx",	0, 0, 0 },
 		{ "flow-isolate-all",	        0, 0, 0 },
 		{ "txpkts",			1, 0, 0 },
+		{ "txonly-multi-flow",		0, 0, 0 },
 		{ "disable-link-check",		0, 0, 0 },
 		{ "no-lsc-interrupt",		0, 0, 0 },
 		{ "no-rmv-interrupt",		0, 0, 0 },
@@ -1141,6 +1143,8 @@ launch_args_parse(int argc, char** argv)
 				else
 					rte_exit(EXIT_FAILURE, "bad txpkts\n");
 			}
+			if (!strcmp(lgopts[opt_idx].name, "txonly-multi-flow"))
+				txonly_multi_flow = 1;
 			if (!strcmp(lgopts[opt_idx].name, "no-flush-rx"))
 				no_flush_rx = 1;
 			if (!strcmp(lgopts[opt_idx].name, "disable-link-check"))
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 216be47f92..237b6b0b39 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -217,6 +217,9 @@ uint8_t  tx_pkt_nb_segs = 1; /**< Number of segments in TXONLY packets */
 enum tx_pkt_split tx_pkt_split = TX_PKT_SPLIT_OFF;
 /**< Split policy for packets to TX. */
 
+uint8_t txonly_multi_flow;
+/**< Whether multiple flows are generated in TXONLY mode. */
+
 uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per burst. */
 uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of mbuf mempool cache. */
 
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 85b791b6bb..29a5520126 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -439,6 +439,8 @@ enum tx_pkt_split {
 
 extern enum tx_pkt_split tx_pkt_split;
 
+extern uint8_t txonly_multi_flow;
+
 extern uint16_t nb_pkt_per_burst;
 extern uint16_t mb_mempool_cache;
 extern int8_t rx_pthresh;
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c
index 1f08b6ed37..def52a0487 100644
--- a/app/test-pmd/txonly.c
+++ b/app/test-pmd/txonly.c
@@ -52,6 +52,7 @@
 #define IP_VHL_DEF (IP_VERSION | IP_HDRLEN)
 
 static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */
+RTE_DEFINE_PER_LCORE(uint8_t, _ip_var); /**< IP address variation */
 static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted packets. */
 
 static void
@@ -164,6 +165,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
 	uint16_t vlan_tci, vlan_tci_outer;
 	uint32_t retry;
 	uint64_t ol_flags = 0;
+	uint8_t  ip_var = RTE_PER_LCORE(_ip_var);
 	uint8_t  i;
 	uint64_t tx_offloads;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
@@ -237,6 +239,23 @@ pkt_burst_transmit(struct fwd_stream *fs)
 		copy_buf_to_pkt(&eth_hdr, sizeof(eth_hdr), pkt, 0);
 		copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt,
 				sizeof(struct ether_hdr));
+		if (txonly_multi_flow) {
+			struct ipv4_hdr *ip_hdr;
+			uint32_t addr;
+
+			ip_hdr = rte_pktmbuf_mtod_offset(pkt,
+					struct ipv4_hdr *,
+					sizeof(struct ether_hdr));
+			/*
+			 * Generate multiple flows by varying IP src addr. This
+			 * enables packets are well distributed by RSS in
+			 * receiver side if any and txonly mode can be a decent
+			 * packet generator for developer's quick performance
+			 * regression test.
+			 */
+			addr = (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,
 				sizeof(struct ether_hdr) +
 				sizeof(struct ipv4_hdr));
@@ -268,6 +287,9 @@ pkt_burst_transmit(struct fwd_stream *fs)
 	}
 	fs->tx_packets += nb_tx;
 
+	if (txonly_multi_flow)
+		RTE_PER_LCORE(_ip_var) += nb_tx;
+
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
 	fs->tx_burst_stats.pkt_burst_spread[nb_tx]++;
 #endif
diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
index 4495ed0382..b717b8c7b7 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -324,6 +324,10 @@ The commandline options are:
     Set TX segment sizes or total packet length. Valid for ``tx-only``
     and ``flowgen`` forwarding modes.
 
+*   ``--txonly-multi-flow``
+
+    Generate multiple flows in txonly mode.
+
 *   ``--disable-link-check``
 
     Disable check on link status when starting/stopping ports.
-- 
2.11.0


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v4] app/testpmd: make txonly mode generate multiple flows
  2019-03-28 18:46 ` [dpdk-dev] [PATCH v4] " Yongseok Koh
  2019-03-28 18:46   ` Yongseok Koh
@ 2019-03-29  9:55   ` Iremonger, Bernard
  2019-03-29  9:55     ` Iremonger, Bernard
  2019-03-29 18:44     ` Ferruh Yigit
  1 sibling, 2 replies; 24+ messages in thread
From: Iremonger, Bernard @ 2019-03-29  9:55 UTC (permalink / raw)
  To: Yongseok Koh, Lu, Wenzhuo, Wu, Jingjing; +Cc: dev, jerinj, Ananyev, Konstantin

> -----Original Message-----
> From: Yongseok Koh [mailto:yskoh@mellanox.com]
> Sent: Thursday, March 28, 2019 6:46 PM
> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>
> Cc: dev@dpdk.org; Iremonger, Bernard <bernard.iremonger@intel.com>;
> jerinj@marvell.com; Ananyev, Konstantin <konstantin.ananyev@intel.com>
> Subject: [PATCH v4] app/testpmd: make txonly mode generate multiple flows
> 
> Testpmd can generate multiple flows without taking much cost and this could be
> a simple traffic generator for developer's quick tests. If "--txonly-multi-flow" is
> specified in the command line, IP source address is varied to gnerate multiple
> flows.
> 
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>

Acked-by:  Bernard Iremonger <bernard.iremonger@intel.com>

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v4] app/testpmd: make txonly mode generate multiple flows
  2019-03-29  9:55   ` Iremonger, Bernard
@ 2019-03-29  9:55     ` Iremonger, Bernard
  2019-03-29 18:44     ` Ferruh Yigit
  1 sibling, 0 replies; 24+ messages in thread
From: Iremonger, Bernard @ 2019-03-29  9:55 UTC (permalink / raw)
  To: Yongseok Koh, Lu, Wenzhuo, Wu, Jingjing; +Cc: dev, jerinj, Ananyev, Konstantin

> -----Original Message-----
> From: Yongseok Koh [mailto:yskoh@mellanox.com]
> Sent: Thursday, March 28, 2019 6:46 PM
> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>
> Cc: dev@dpdk.org; Iremonger, Bernard <bernard.iremonger@intel.com>;
> jerinj@marvell.com; Ananyev, Konstantin <konstantin.ananyev@intel.com>
> Subject: [PATCH v4] app/testpmd: make txonly mode generate multiple flows
> 
> Testpmd can generate multiple flows without taking much cost and this could be
> a simple traffic generator for developer's quick tests. If "--txonly-multi-flow" is
> specified in the command line, IP source address is varied to gnerate multiple
> flows.
> 
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>

Acked-by:  Bernard Iremonger <bernard.iremonger@intel.com>



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v4] app/testpmd: make txonly mode generate multiple flows
  2019-03-29  9:55   ` Iremonger, Bernard
  2019-03-29  9:55     ` Iremonger, Bernard
@ 2019-03-29 18:44     ` Ferruh Yigit
  2019-03-29 18:44       ` Ferruh Yigit
  1 sibling, 1 reply; 24+ messages in thread
From: Ferruh Yigit @ 2019-03-29 18:44 UTC (permalink / raw)
  To: Iremonger, Bernard, Yongseok Koh, Lu, Wenzhuo, Wu, Jingjing
  Cc: dev, jerinj, Ananyev, Konstantin

On 3/29/2019 9:55 AM, Iremonger, Bernard wrote:
>> -----Original Message-----
>> From: Yongseok Koh [mailto:yskoh@mellanox.com]
>> Sent: Thursday, March 28, 2019 6:46 PM
>> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
>> <jingjing.wu@intel.com>
>> Cc: dev@dpdk.org; Iremonger, Bernard <bernard.iremonger@intel.com>;
>> jerinj@marvell.com; Ananyev, Konstantin <konstantin.ananyev@intel.com>
>> Subject: [PATCH v4] app/testpmd: make txonly mode generate multiple flows
>>
>> Testpmd can generate multiple flows without taking much cost and this could be
>> a simple traffic generator for developer's quick tests. If "--txonly-multi-flow" is
>> specified in the command line, IP source address is varied to gnerate multiple
>> flows.
>>
>> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> 
> Acked-by:  Bernard Iremonger <bernard.iremonger@intel.com>
> 

Applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [dpdk-dev] [PATCH v4] app/testpmd: make txonly mode generate multiple flows
  2019-03-29 18:44     ` Ferruh Yigit
@ 2019-03-29 18:44       ` Ferruh Yigit
  0 siblings, 0 replies; 24+ messages in thread
From: Ferruh Yigit @ 2019-03-29 18:44 UTC (permalink / raw)
  To: Iremonger, Bernard, Yongseok Koh, Lu, Wenzhuo, Wu, Jingjing
  Cc: dev, jerinj, Ananyev, Konstantin

On 3/29/2019 9:55 AM, Iremonger, Bernard wrote:
>> -----Original Message-----
>> From: Yongseok Koh [mailto:yskoh@mellanox.com]
>> Sent: Thursday, March 28, 2019 6:46 PM
>> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
>> <jingjing.wu@intel.com>
>> Cc: dev@dpdk.org; Iremonger, Bernard <bernard.iremonger@intel.com>;
>> jerinj@marvell.com; Ananyev, Konstantin <konstantin.ananyev@intel.com>
>> Subject: [PATCH v4] app/testpmd: make txonly mode generate multiple flows
>>
>> Testpmd can generate multiple flows without taking much cost and this could be
>> a simple traffic generator for developer's quick tests. If "--txonly-multi-flow" is
>> specified in the command line, IP source address is varied to gnerate multiple
>> flows.
>>
>> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> 
> Acked-by:  Bernard Iremonger <bernard.iremonger@intel.com>
> 

Applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2019-03-29 18:44 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-12-15 21:11 [dpdk-dev] [PATCH] app/testpmd: make txonly mode generate multiple flows Yongseok Koh
2018-01-12 18:08 ` Thomas Monjalon
2018-01-16  2:40 ` Lu, Wenzhuo
2018-01-17 18:04   ` Yongseok Koh
2018-01-17 18:18 ` [dpdk-dev] [PATCH v2] " Yongseok Koh
2018-01-18  1:22   ` Lu, Wenzhuo
2018-01-18 12:21   ` Ananyev, Konstantin
2018-01-19  7:09     ` Yongseok Koh
2018-01-19 11:02       ` Ananyev, Konstantin
2018-01-18 13:55   ` Jerin Jacob
2019-03-28  1:51 ` [dpdk-dev] [PATCH v3] " Yongseok Koh
2019-03-28  1:51   ` Yongseok Koh
2019-03-28 10:24   ` Iremonger, Bernard
2019-03-28 10:24     ` Iremonger, Bernard
2019-03-28 17:33     ` Yongseok Koh
2019-03-28 17:33       ` Yongseok Koh
2019-03-28 17:42       ` Iremonger, Bernard
2019-03-28 17:42         ` Iremonger, Bernard
2019-03-28 18:46 ` [dpdk-dev] [PATCH v4] " Yongseok Koh
2019-03-28 18:46   ` Yongseok Koh
2019-03-29  9:55   ` Iremonger, Bernard
2019-03-29  9:55     ` Iremonger, Bernard
2019-03-29 18:44     ` Ferruh Yigit
2019-03-29 18:44       ` Ferruh Yigit

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).