DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH v1 0/4] Enable Checksum Offloading for NEON vector
@ 2020-11-18  7:35 Feifei Wang
  2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm Feifei Wang
                   ` (4 more replies)
  0 siblings, 5 replies; 18+ messages in thread
From: Feifei Wang @ 2020-11-18  7:35 UTC (permalink / raw)
  Cc: dev, nd, Feifei Wang

This patch series are mainly to enable checksum offloading for IXGBE NEON
vector PMD, including good and bad checksum flags. In the meanwhile, the
first patch enable VLAN stripping flag for Arm.

Feifei Wang (4):
  net/ixgbe: add VLAN stripping support for Arm
  net/ixgbe: support checksum flags for NEON vector
  net/ixgbe: implement good checksum flag for NEON vector
  net/ixgbe: enable IXGBE NEON vector PMD when CHECKSUM is set

 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 94 ++++++++++++++++++-------
 1 file changed, 68 insertions(+), 26 deletions(-)

-- 
2.17.1


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

* [dpdk-dev] [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm
  2020-11-18  7:35 [dpdk-dev] [PATCH v1 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
@ 2020-11-18  7:35 ` Feifei Wang
  2020-11-18  8:34   ` Wang, Haiyue
  2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 2/4] net/ixgbe: support checksum flags for NEON vector Feifei Wang
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 18+ messages in thread
From: Feifei Wang @ 2020-11-18  7:35 UTC (permalink / raw)
  To: Jerin Jacob, Ruifeng Wang, Jeff Guo, Haiyue Wang; +Cc: dev, nd, Feifei Wang

Implemented PKT_RX_VLAN_STRIPPED for vector PMD on Arm platform.

Test Results:
NICs: 82599(igb)
Driver: ixgbe(vector)
Packet: vlan-id=1

$:./app/dpdk-testpmd -c 0x3 -w 0002:f9:00.0 -- -i --port-topology=chained \
to enable vlan stripping: --enable-hw-vlan-strip
test-pmd> set fwd rxonly
test-pmd> set verbose 1
test-pmd> start

With this patch:
%enable vlan stripping:
testpmd> port 0/queue 0: received 1 packets
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1 - VLAN tci=0x1
ol_flags: PKT_RX_VLAN PKT_RX_VLAN_STRIPPED

%disable vlan stripping:
testpmd> port 0/queue 0: received 1 packets
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x8100 - length=74 - nb_segs=1 - VLAN tci=0x0
ol_flags: PKT_RX_VLAN

Without this patch:
%enable vlan stripping:
testpmd> port 0/queue 0: received 1 packets
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1 - VLAN tci=0x1
ol_flags: PKT_RX_VLAN

%disable vlan stripping:
testpmd> port 0/queue 0: received 1 packets
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x8100 - length=74 - nb_segs=1 - VLAN tci=0x0
ol_flags: PKT_RX_VLAN

Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 36 ++++++++++++++++---------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index 4c81ae9dc..e6d877af9 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -81,11 +81,9 @@ ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
 	IXGBE_PCI_REG_WRITE(rxq->rdt_reg_addr, rx_id);
 }
 
-#define VTAG_SHIFT     (3)
-
 static inline void
 desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
-		  uint8x16_t staterr, struct rte_mbuf **rx_pkts)
+		  uint8x16_t staterr, uint8_t vlan_flags, struct rte_mbuf **rx_pkts)
 {
 	uint8x16_t ptype;
 	uint8x16_t vtag;
@@ -95,13 +93,6 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 		uint32_t word;
 	} vol;
 
-	const uint8x16_t pkttype_msk = {
-			PKT_RX_VLAN, PKT_RX_VLAN,
-			PKT_RX_VLAN, PKT_RX_VLAN,
-			0x00, 0x00, 0x00, 0x00,
-			0x00, 0x00, 0x00, 0x00,
-			0x00, 0x00, 0x00, 0x00};
-
 	const uint8x16_t rsstype_msk = {
 			0x0F, 0x0F, 0x0F, 0x0F,
 			0x00, 0x00, 0x00, 0x00,
@@ -114,12 +105,26 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 			PKT_RX_RSS_HASH, 0, 0, 0,
 			0, 0, 0, PKT_RX_FDIR};
 
+	const uint8x16_t vlan_msk = {
+			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
+			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
+			0, 0, 0, 0,
+			0, 0, 0, 0,
+			0, 0, 0, 0};
+
+	const uint8x16_t vlan_map = {
+			0, 0, 0, 0,
+			0, 0, 0, 0,
+			vlan_flags, 0, 0, 0,
+			0, 0, 0, 0};
+
 	ptype = vzipq_u8(sterr_tmp1.val[0], sterr_tmp2.val[0]).val[0];
 	ptype = vandq_u8(ptype, rsstype_msk);
 	ptype = vqtbl1q_u8(rss_flags, ptype);
 
-	vtag = vshrq_n_u8(staterr, VTAG_SHIFT);
-	vtag = vandq_u8(vtag, pkttype_msk);
+	/* extract vlan_flags from IXGBE_RXD_STAT_VP bits of staterr */
+	vtag = vandq_u8(staterr, vlan_msk);
+	vtag = vqtbl1q_u8(vlan_map, vtag);
 	vtag = vorrq_u8(ptype, vtag);
 
 	vol.word = vgetq_lane_u32(vreinterpretq_u32_u8(vtag), 0);
@@ -221,6 +226,7 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		};
 	uint16x8_t crc_adjust = {0, 0, rxq->crc_len, 0,
 				 rxq->crc_len, 0, 0, 0};
+	uint8_t vlan_flags;
 
 	/* nb_pkts has to be floor-aligned to RTE_IXGBE_DESCS_PER_LOOP */
 	nb_pkts = RTE_ALIGN_FLOOR(nb_pkts, RTE_IXGBE_DESCS_PER_LOOP);
@@ -250,6 +256,10 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	 */
 	sw_ring = &rxq->sw_ring[rxq->rx_tail];
 
+	/* ensure these 2 flags are in the lower 8 bits */
+	RTE_BUILD_BUG_ON((PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED) > UINT8_MAX);
+	vlan_flags = rxq->vlan_flags & UINT8_MAX;
+
 	/* A. load 4 packet in one loop
 	 * B. copy 4 mbuf point from swring to rx_pkts
 	 * C. calc the number of DD bits among the 4 packets
@@ -311,7 +321,7 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		staterr = vzipq_u8(sterr_tmp1.val[1], sterr_tmp2.val[1]).val[0];
 
 		/* set ol_flags with vlan packet type */
-		desc_to_olflags_v(sterr_tmp1, sterr_tmp2, staterr,
+		desc_to_olflags_v(sterr_tmp1, sterr_tmp2, staterr, vlan_flags,
 				  &rx_pkts[pos]);
 
 		/* D.2 pkt 3,4 set in_port/nb_seg and remove crc */
-- 
2.17.1


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

* [dpdk-dev] [PATCH v1 2/4] net/ixgbe: support checksum flags for NEON vector
  2020-11-18  7:35 [dpdk-dev] [PATCH v1 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
  2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm Feifei Wang
@ 2020-11-18  7:35 ` Feifei Wang
  2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 3/4] net/ixgbe: implement good checksum flag " Feifei Wang
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 18+ messages in thread
From: Feifei Wang @ 2020-11-18  7:35 UTC (permalink / raw)
  To: Jerin Jacob, Ruifeng Wang, Jeff Guo, Haiyue Wang; +Cc: dev, nd, Feifei Wang

Updated desc_to_olflags_v() to support PKT_RX_IP_CKSUM_BAD and
PKT_RX_L4_CKSUM_BAD in the ol_flags of the mbuf for Arm neon vector
Rx function.

Test Results:
NICs: 82599(igb)
Driver: ixgbe(vector)
Packet: IPv4_checksum = 0xee && UDP_checksum = 0xee

$:./app/dpdk-testpmd -c 0x3 -w 0002:f9:00.0 -- -i --port-topology=chained
test-pmd> set fwd rxonly
test-pmd> set verbose 1
test-pmd> start

With this patch:
testpmd> port 0/queue 0: received 1 packets
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1
ol_flags: PKT_RX_L4_CKSUM_BAD PKT_RX_IP_CKSUM_BAD

Without this patch:
testpmd> port 0/queue 0: received 1 packets
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1
ol_flags: PKT_RX_L4_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN

Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 47 +++++++++++++++++++------
 1 file changed, 36 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index e6d877af9..4d6f057e7 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -87,6 +87,8 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 {
 	uint8x16_t ptype;
 	uint8x16_t vtag;
+	uint8x16_t temp_csum;
+	uint32x4_t csum = {0, 0, 0, 0};
 
 	union {
 		uint8_t e[4];
@@ -105,26 +107,51 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 			PKT_RX_RSS_HASH, 0, 0, 0,
 			0, 0, 0, PKT_RX_FDIR};
 
-	const uint8x16_t vlan_msk = {
+	/* mask everything except vlan present and l4/ip csum error */
+	const uint8x16_t vlan_csum_msk = {
 			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
 			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
 			0, 0, 0, 0,
 			0, 0, 0, 0,
-			0, 0, 0, 0};
-
-	const uint8x16_t vlan_map = {
+			(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 24,
+			(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 24,
+			(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 24,
+			(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 24};
+
+	/* map vlan present (0x8), IPE (0x2), L4E (0x1) to ol_flags */
+	const uint8x16_t vlan_csum_map = {
+			0,
+			PKT_RX_L4_CKSUM_BAD,
+			PKT_RX_IP_CKSUM_BAD,
+			PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
 			0, 0, 0, 0,
-			0, 0, 0, 0,
-			vlan_flags, 0, 0, 0,
+			vlan_flags,
+			vlan_flags | PKT_RX_L4_CKSUM_BAD,
+			vlan_flags | PKT_RX_IP_CKSUM_BAD,
+			vlan_flags | PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
 			0, 0, 0, 0};
 
 	ptype = vzipq_u8(sterr_tmp1.val[0], sterr_tmp2.val[0]).val[0];
 	ptype = vandq_u8(ptype, rsstype_msk);
 	ptype = vqtbl1q_u8(rss_flags, ptype);
 
-	/* extract vlan_flags from IXGBE_RXD_STAT_VP bits of staterr */
-	vtag = vandq_u8(staterr, vlan_msk);
-	vtag = vqtbl1q_u8(vlan_map, vtag);
+	/* extract vlan_flags and csum_error from staterr */
+	vtag = vandq_u8(staterr, vlan_csum_msk);
+
+	/* csum bits are in the most significant, to use shuffle we need to
+	 * shift them. Change mask from 0xc0 to 0x03.
+	 */
+	temp_csum = vshrq_n_u8(vtag, 6);
+
+	/* 'OR' the most significant 32 bits containing the checksum
+	 * flags with the vlan present flags
+	 * Then bits layout of each lane(8bits) will be 'xxxx,VP,x,IPE,L4E'
+	 */
+	csum = vsetq_lane_u32(vgetq_lane_u32(vreinterpretq_u32_u8(temp_csum), 3), csum, 0);
+	vtag = vorrq_u8(vreinterpretq_u8_u32(csum), vtag);
+
+	/* convert VP, IPE, L4E to ol_flags */
+	vtag = vqtbl1q_u8(vlan_csum_map, vtag);
 	vtag = vorrq_u8(ptype, vtag);
 
 	vol.word = vgetq_lane_u32(vreinterpretq_u32_u8(vtag), 0);
@@ -391,7 +418,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
  * Notice:
  * - nb_pkts < RTE_IXGBE_DESCS_PER_LOOP, just return no packet
  * - floor align nb_pkts to a RTE_IXGBE_DESC_PER_LOOP power-of-two
- * - don't support ol_flags for rss and csum err
  */
 uint16_t
 ixgbe_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
@@ -404,7 +430,6 @@ ixgbe_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
  * vPMD receive routine that reassembles scattered packets
  *
  * Notice:
- * - don't support ol_flags for rss and csum err
  * - nb_pkts < RTE_IXGBE_DESCS_PER_LOOP, just return no packet
  * - floor align nb_pkts to a RTE_IXGBE_DESC_PER_LOOP power-of-two
  */
-- 
2.17.1


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

* [dpdk-dev] [PATCH v1 3/4] net/ixgbe: implement good checksum flag for NEON vector
  2020-11-18  7:35 [dpdk-dev] [PATCH v1 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
  2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm Feifei Wang
  2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 2/4] net/ixgbe: support checksum flags for NEON vector Feifei Wang
@ 2020-11-18  7:35 ` Feifei Wang
  2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 4/4] net/ixgbe: enable IXGBE NEON vector PMD when CHECKSUM is set Feifei Wang
  2020-11-18 10:48 ` [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
  4 siblings, 0 replies; 18+ messages in thread
From: Feifei Wang @ 2020-11-18  7:35 UTC (permalink / raw)
  To: Jerin Jacob, Ruifeng Wang, Jeff Guo, Haiyue Wang; +Cc: dev, nd, Feifei Wang

Add CKSUM_GOOD flag to distinguish a good checksum from an unknown one
in neon vertor RX function.

Test Results:
NICs: 82599(igb)
Driver: ixgbe(vector)
Packet: IPv4_checksum = correct value && UDP_checksum = correct value

$:./app/dpdk-testpmd -c 0x3 -w 0002:f9:00.0 -- -i --port-topology=chained
test-pmd> set fwd rxonly
test-pmd> set verbose 1
test-pmd> start

With this patch:
testpmd> port 0/queue 0: received 1 packets
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1
ol_flags: PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD

Without this patch:
testpmd> port 0/queue 0: received 1 packets
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1
ol_flags: PKT_RX_L4_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN

Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 37 +++++++++++++++++--------
 1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index 4d6f057e7..b2bee2228 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -86,13 +86,13 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 		  uint8x16_t staterr, uint8_t vlan_flags, struct rte_mbuf **rx_pkts)
 {
 	uint8x16_t ptype;
-	uint8x16_t vtag;
+	uint8x16_t vtag_lo, vtag_hi, vtag;
 	uint8x16_t temp_csum;
 	uint32x4_t csum = {0, 0, 0, 0};
 
 	union {
-		uint8_t e[4];
-		uint32_t word;
+		uint16_t e[4];
+		uint64_t word;
 	} vol;
 
 	const uint8x16_t rsstype_msk = {
@@ -119,18 +119,26 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 			(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 24};
 
 	/* map vlan present (0x8), IPE (0x2), L4E (0x1) to ol_flags */
-	const uint8x16_t vlan_csum_map = {
-			0,
-			PKT_RX_L4_CKSUM_BAD,
+	const uint8x16_t vlan_csum_map_lo = {
+			PKT_RX_IP_CKSUM_GOOD,
+			PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_BAD,
 			PKT_RX_IP_CKSUM_BAD,
 			PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
 			0, 0, 0, 0,
-			vlan_flags,
-			vlan_flags | PKT_RX_L4_CKSUM_BAD,
+			vlan_flags | PKT_RX_IP_CKSUM_GOOD,
+			vlan_flags | PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_BAD,
 			vlan_flags | PKT_RX_IP_CKSUM_BAD,
 			vlan_flags | PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
 			0, 0, 0, 0};
 
+	const uint8x16_t vlan_csum_map_hi = {
+			PKT_RX_L4_CKSUM_GOOD >> sizeof(uint8_t), 0,
+			PKT_RX_L4_CKSUM_GOOD >> sizeof(uint8_t), 0,
+			0, 0, 0, 0,
+			PKT_RX_L4_CKSUM_GOOD >> sizeof(uint8_t), 0,
+			PKT_RX_L4_CKSUM_GOOD >> sizeof(uint8_t), 0,
+			0, 0, 0, 0};
+
 	ptype = vzipq_u8(sterr_tmp1.val[0], sterr_tmp2.val[0]).val[0];
 	ptype = vandq_u8(ptype, rsstype_msk);
 	ptype = vqtbl1q_u8(rss_flags, ptype);
@@ -150,11 +158,16 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 	csum = vsetq_lane_u32(vgetq_lane_u32(vreinterpretq_u32_u8(temp_csum), 3), csum, 0);
 	vtag = vorrq_u8(vreinterpretq_u8_u32(csum), vtag);
 
-	/* convert VP, IPE, L4E to ol_flags */
-	vtag = vqtbl1q_u8(vlan_csum_map, vtag);
-	vtag = vorrq_u8(ptype, vtag);
+	/* convert L4 checksum correct type to vtag_hi */
+	vtag_hi = vqtbl1q_u8(vlan_csum_map_hi, vtag);
+	vtag_hi = vshrq_n_u8(vtag_hi, 7);
+
+	/* convert VP, IPE, L4E to vtag_lo */
+	vtag_lo = vqtbl1q_u8(vlan_csum_map_lo, vtag);
+	vtag_lo = vorrq_u8(ptype, vtag_lo);
 
-	vol.word = vgetq_lane_u32(vreinterpretq_u32_u8(vtag), 0);
+	vtag = vzipq_u8(vtag_lo, vtag_hi).val[0];
+	vol.word = vgetq_lane_u64(vreinterpretq_u64_u8(vtag), 0);
 
 	rx_pkts[0]->ol_flags = vol.e[0];
 	rx_pkts[1]->ol_flags = vol.e[1];
-- 
2.17.1


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

* [dpdk-dev] [PATCH v1 4/4] net/ixgbe: enable IXGBE NEON vector PMD when CHECKSUM is set
  2020-11-18  7:35 [dpdk-dev] [PATCH v1 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
                   ` (2 preceding siblings ...)
  2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 3/4] net/ixgbe: implement good checksum flag " Feifei Wang
@ 2020-11-18  7:35 ` Feifei Wang
  2020-11-18 10:48 ` [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
  4 siblings, 0 replies; 18+ messages in thread
From: Feifei Wang @ 2020-11-18  7:35 UTC (permalink / raw)
  To: Jerin Jacob, Ruifeng Wang, Jeff Guo, Haiyue Wang; +Cc: dev, nd, Feifei Wang

IXGBE NEON vector PMD now supports checksum offloading, hence can be used
when DEV_RX_OFFLOAD_CHECKSUM is set.

Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index b2bee2228..a5a5b2167 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -638,11 +638,5 @@ ixgbe_txq_vec_setup(struct ixgbe_tx_queue *txq)
 int __rte_cold
 ixgbe_rx_vec_dev_conf_condition_check(struct rte_eth_dev *dev)
 {
-	struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
-
-	/* no csum error report support */
-	if (rxmode->offloads & DEV_RX_OFFLOAD_CHECKSUM)
-		return -1;
-
 	return ixgbe_rx_vec_dev_conf_condition_check_default(dev);
 }
-- 
2.17.1


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

* Re: [dpdk-dev] [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm
  2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm Feifei Wang
@ 2020-11-18  8:34   ` Wang, Haiyue
  2020-11-18 10:51     ` [dpdk-dev] 回复: " Feifei Wang
  0 siblings, 1 reply; 18+ messages in thread
From: Wang, Haiyue @ 2020-11-18  8:34 UTC (permalink / raw)
  To: Feifei Wang, Jerin Jacob, Ruifeng Wang, Guo, Jia; +Cc: dev, nd

Hi Feifei,

> -----Original Message-----
> From: Feifei Wang <feifei.wang2@arm.com>
> Sent: Wednesday, November 18, 2020 15:35
> To: Jerin Jacob <jerinj@marvell.com>; Ruifeng Wang <ruifeng.wang@arm.com>; Guo, Jia
> <jia.guo@intel.com>; Wang, Haiyue <haiyue.wang@intel.com>
> Cc: dev@dpdk.org; nd@arm.com; Feifei Wang <feifei.wang2@arm.com>
> Subject: [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm
> 

And the commit message can be more descriptive like:
http://git.dpdk.org/dpdk/commit/?id=6d28c53bf7a9063caa3197c6cc481e2a69e3be96

No need to add the test result, you can put the result into cover letter.

BR,
Haiyue

> Implemented PKT_RX_VLAN_STRIPPED for vector PMD on Arm platform.
> 
> Test Results:
> NICs: 82599(igb)
> Driver: ixgbe(vector)
> Packet: vlan-id=1
> 
> $:./app/dpdk-testpmd -c 0x3 -w 0002:f9:00.0 -- -i --port-topology=chained \
> to enable vlan stripping: --enable-hw-vlan-strip
> test-pmd> set fwd rxonly
> test-pmd> set verbose 1
> test-pmd> start
> 
> With this patch:
> %enable vlan stripping:
> testpmd> port 0/queue 0: received 1 packets
> src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1 - VLAN tci=0x1
> ol_flags: PKT_RX_VLAN PKT_RX_VLAN_STRIPPED
> 
> %disable vlan stripping:
> testpmd> port 0/queue 0: received 1 packets
> src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x8100 - length=74 - nb_segs=1 - VLAN tci=0x0
> ol_flags: PKT_RX_VLAN
> 
> Without this patch:
> %enable vlan stripping:
> testpmd> port 0/queue 0: received 1 packets
> src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1 - VLAN tci=0x1
> ol_flags: PKT_RX_VLAN
> 
> %disable vlan stripping:
> testpmd> port 0/queue 0: received 1 packets
> src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x8100 - length=74 - nb_segs=1 - VLAN tci=0x0
> ol_flags: PKT_RX_VLAN
> 


> Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> ---
>  drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 36 ++++++++++++++++---------
>  1 file changed, 23 insertions(+), 13 deletions(-)
> 


> 2.17.1


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

* [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector
  2020-11-18  7:35 [dpdk-dev] [PATCH v1 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
                   ` (3 preceding siblings ...)
  2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 4/4] net/ixgbe: enable IXGBE NEON vector PMD when CHECKSUM is set Feifei Wang
@ 2020-11-18 10:48 ` Feifei Wang
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 1/4] net/ixgbe: add new flag of stripped VLAN " Feifei Wang
                     ` (4 more replies)
  4 siblings, 5 replies; 18+ messages in thread
From: Feifei Wang @ 2020-11-18 10:48 UTC (permalink / raw)
  Cc: dev, nd, Feifei Wang

This patch series are mainly to enable checksum offloading for IXGBE NEON
vector PMD, including good and bad checksum flags. In the meanwhile, the
first patch enable VLAN stripping flag for Arm.
Following are the test results for the patches:

NICs: 82599(igb)
Driver: ixgbe(vector)
$:./app/dpdk-testpmd -c 0x3 -w 0002:f9:00.0 -- -i --port-topology=chained
test-pmd> set fwd rxonly
test-pmd> set verbose 1
test-pmd> start

With Patch a:
enable vlan stripping:
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1 - VLAN tci=0x1
ol_flags: PKT_RX_VLAN PKT_RX_VLAN_STRIPPED

With Patch b:
Packet: IPv4_checksum = 0xee && UDP_checksum = 0xee
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1
ol_flags: PKT_RX_L4_CKSUM_BAD PKT_RX_IP_CKSUM_BAD

With Patch c:
Packet: IPv4_checksum = correct value && UDP_checksum = correct value
ol_flags: PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD

v2:
1. update the commit message title to align the design (Wang, Haiyue)
2. make the commit message more descriptive and move the test results
   to the cover letter (Wang, Haiyue)

Feifei Wang (4):
 a). net/ixgbe: add new flag of stripped VLAN for NEON vector
 b). net/ixgbe: support bad checksum flag for NEON vector
 c). net/ixgbe: support good checksum flag for NEON vector
 d). net/ixgbe: enable IXGBE NEON vector when need to checksum

 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 94 ++++++++++++++++++-------
 1 file changed, 68 insertions(+), 26 deletions(-)

-- 
2.17.1


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

* [dpdk-dev] [PATCH v2 1/4] net/ixgbe: add new flag of stripped VLAN for NEON vector
  2020-11-18 10:48 ` [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
@ 2020-11-18 10:48   ` Feifei Wang
  2020-11-18 11:51     ` Wang, Haiyue
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 2/4] net/ixgbe: support bad checksum flag " Feifei Wang
                     ` (3 subsequent siblings)
  4 siblings, 1 reply; 18+ messages in thread
From: Feifei Wang @ 2020-11-18 10:48 UTC (permalink / raw)
  To: Jerin Jacob, Ruifeng Wang, Jeff Guo, Haiyue Wang; +Cc: dev, nd, Feifei Wang

For NEON vector of IXGBE PMD, introduce new flag PKT_RX_VLAN_STRIPPED to
show the case that the VLAN is stripped from the VLAN tagged packet.

This is because that the old flag PKT_RX_VLAN_PKT only indicates that the
packet is VLAN tagged, but cannot show whether VLAN is in m->vlan_tci or
in the packet at present. So add new flag to show the vlan has been
stripped by the hardware and its tci is saved in m->vlan_tci when vlan
stripping is enabled in the RX configuration of the IXGBE PMD.

Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 36 ++++++++++++++++---------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index 4c81ae9dc..e6d877af9 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -81,11 +81,9 @@ ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
 	IXGBE_PCI_REG_WRITE(rxq->rdt_reg_addr, rx_id);
 }
 
-#define VTAG_SHIFT     (3)
-
 static inline void
 desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
-		  uint8x16_t staterr, struct rte_mbuf **rx_pkts)
+		  uint8x16_t staterr, uint8_t vlan_flags, struct rte_mbuf **rx_pkts)
 {
 	uint8x16_t ptype;
 	uint8x16_t vtag;
@@ -95,13 +93,6 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 		uint32_t word;
 	} vol;
 
-	const uint8x16_t pkttype_msk = {
-			PKT_RX_VLAN, PKT_RX_VLAN,
-			PKT_RX_VLAN, PKT_RX_VLAN,
-			0x00, 0x00, 0x00, 0x00,
-			0x00, 0x00, 0x00, 0x00,
-			0x00, 0x00, 0x00, 0x00};
-
 	const uint8x16_t rsstype_msk = {
 			0x0F, 0x0F, 0x0F, 0x0F,
 			0x00, 0x00, 0x00, 0x00,
@@ -114,12 +105,26 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 			PKT_RX_RSS_HASH, 0, 0, 0,
 			0, 0, 0, PKT_RX_FDIR};
 
+	const uint8x16_t vlan_msk = {
+			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
+			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
+			0, 0, 0, 0,
+			0, 0, 0, 0,
+			0, 0, 0, 0};
+
+	const uint8x16_t vlan_map = {
+			0, 0, 0, 0,
+			0, 0, 0, 0,
+			vlan_flags, 0, 0, 0,
+			0, 0, 0, 0};
+
 	ptype = vzipq_u8(sterr_tmp1.val[0], sterr_tmp2.val[0]).val[0];
 	ptype = vandq_u8(ptype, rsstype_msk);
 	ptype = vqtbl1q_u8(rss_flags, ptype);
 
-	vtag = vshrq_n_u8(staterr, VTAG_SHIFT);
-	vtag = vandq_u8(vtag, pkttype_msk);
+	/* extract vlan_flags from IXGBE_RXD_STAT_VP bits of staterr */
+	vtag = vandq_u8(staterr, vlan_msk);
+	vtag = vqtbl1q_u8(vlan_map, vtag);
 	vtag = vorrq_u8(ptype, vtag);
 
 	vol.word = vgetq_lane_u32(vreinterpretq_u32_u8(vtag), 0);
@@ -221,6 +226,7 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		};
 	uint16x8_t crc_adjust = {0, 0, rxq->crc_len, 0,
 				 rxq->crc_len, 0, 0, 0};
+	uint8_t vlan_flags;
 
 	/* nb_pkts has to be floor-aligned to RTE_IXGBE_DESCS_PER_LOOP */
 	nb_pkts = RTE_ALIGN_FLOOR(nb_pkts, RTE_IXGBE_DESCS_PER_LOOP);
@@ -250,6 +256,10 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	 */
 	sw_ring = &rxq->sw_ring[rxq->rx_tail];
 
+	/* ensure these 2 flags are in the lower 8 bits */
+	RTE_BUILD_BUG_ON((PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED) > UINT8_MAX);
+	vlan_flags = rxq->vlan_flags & UINT8_MAX;
+
 	/* A. load 4 packet in one loop
 	 * B. copy 4 mbuf point from swring to rx_pkts
 	 * C. calc the number of DD bits among the 4 packets
@@ -311,7 +321,7 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		staterr = vzipq_u8(sterr_tmp1.val[1], sterr_tmp2.val[1]).val[0];
 
 		/* set ol_flags with vlan packet type */
-		desc_to_olflags_v(sterr_tmp1, sterr_tmp2, staterr,
+		desc_to_olflags_v(sterr_tmp1, sterr_tmp2, staterr, vlan_flags,
 				  &rx_pkts[pos]);
 
 		/* D.2 pkt 3,4 set in_port/nb_seg and remove crc */
-- 
2.17.1


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

* [dpdk-dev] [PATCH v2 2/4] net/ixgbe: support bad checksum flag for NEON vector
  2020-11-18 10:48 ` [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 1/4] net/ixgbe: add new flag of stripped VLAN " Feifei Wang
@ 2020-11-18 10:48   ` Feifei Wang
  2020-11-18 11:51     ` Wang, Haiyue
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 3/4] net/ixgbe: support good " Feifei Wang
                     ` (2 subsequent siblings)
  4 siblings, 1 reply; 18+ messages in thread
From: Feifei Wang @ 2020-11-18 10:48 UTC (permalink / raw)
  To: Jerin Jacob, Ruifeng Wang, Jeff Guo, Haiyue Wang; +Cc: dev, nd, Feifei Wang

Updated desc_to_olflags_v() to support PKT_RX_IP_CKSUM_BAD and
PKT_RX_L4_CKSUM_BAD in the ol_flags of the mbuf.

And then the NEON vector RX function can be called with hw_ip_checksum
enabled.

Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 47 +++++++++++++++++++------
 1 file changed, 36 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index e6d877af9..4d6f057e7 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -87,6 +87,8 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 {
 	uint8x16_t ptype;
 	uint8x16_t vtag;
+	uint8x16_t temp_csum;
+	uint32x4_t csum = {0, 0, 0, 0};
 
 	union {
 		uint8_t e[4];
@@ -105,26 +107,51 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 			PKT_RX_RSS_HASH, 0, 0, 0,
 			0, 0, 0, PKT_RX_FDIR};
 
-	const uint8x16_t vlan_msk = {
+	/* mask everything except vlan present and l4/ip csum error */
+	const uint8x16_t vlan_csum_msk = {
 			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
 			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
 			0, 0, 0, 0,
 			0, 0, 0, 0,
-			0, 0, 0, 0};
-
-	const uint8x16_t vlan_map = {
+			(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 24,
+			(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 24,
+			(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 24,
+			(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 24};
+
+	/* map vlan present (0x8), IPE (0x2), L4E (0x1) to ol_flags */
+	const uint8x16_t vlan_csum_map = {
+			0,
+			PKT_RX_L4_CKSUM_BAD,
+			PKT_RX_IP_CKSUM_BAD,
+			PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
 			0, 0, 0, 0,
-			0, 0, 0, 0,
-			vlan_flags, 0, 0, 0,
+			vlan_flags,
+			vlan_flags | PKT_RX_L4_CKSUM_BAD,
+			vlan_flags | PKT_RX_IP_CKSUM_BAD,
+			vlan_flags | PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
 			0, 0, 0, 0};
 
 	ptype = vzipq_u8(sterr_tmp1.val[0], sterr_tmp2.val[0]).val[0];
 	ptype = vandq_u8(ptype, rsstype_msk);
 	ptype = vqtbl1q_u8(rss_flags, ptype);
 
-	/* extract vlan_flags from IXGBE_RXD_STAT_VP bits of staterr */
-	vtag = vandq_u8(staterr, vlan_msk);
-	vtag = vqtbl1q_u8(vlan_map, vtag);
+	/* extract vlan_flags and csum_error from staterr */
+	vtag = vandq_u8(staterr, vlan_csum_msk);
+
+	/* csum bits are in the most significant, to use shuffle we need to
+	 * shift them. Change mask from 0xc0 to 0x03.
+	 */
+	temp_csum = vshrq_n_u8(vtag, 6);
+
+	/* 'OR' the most significant 32 bits containing the checksum
+	 * flags with the vlan present flags
+	 * Then bits layout of each lane(8bits) will be 'xxxx,VP,x,IPE,L4E'
+	 */
+	csum = vsetq_lane_u32(vgetq_lane_u32(vreinterpretq_u32_u8(temp_csum), 3), csum, 0);
+	vtag = vorrq_u8(vreinterpretq_u8_u32(csum), vtag);
+
+	/* convert VP, IPE, L4E to ol_flags */
+	vtag = vqtbl1q_u8(vlan_csum_map, vtag);
 	vtag = vorrq_u8(ptype, vtag);
 
 	vol.word = vgetq_lane_u32(vreinterpretq_u32_u8(vtag), 0);
@@ -391,7 +418,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
  * Notice:
  * - nb_pkts < RTE_IXGBE_DESCS_PER_LOOP, just return no packet
  * - floor align nb_pkts to a RTE_IXGBE_DESC_PER_LOOP power-of-two
- * - don't support ol_flags for rss and csum err
  */
 uint16_t
 ixgbe_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
@@ -404,7 +430,6 @@ ixgbe_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
  * vPMD receive routine that reassembles scattered packets
  *
  * Notice:
- * - don't support ol_flags for rss and csum err
  * - nb_pkts < RTE_IXGBE_DESCS_PER_LOOP, just return no packet
  * - floor align nb_pkts to a RTE_IXGBE_DESC_PER_LOOP power-of-two
  */
-- 
2.17.1


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

* [dpdk-dev] [PATCH v2 3/4] net/ixgbe: support good checksum flag for NEON vector
  2020-11-18 10:48 ` [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 1/4] net/ixgbe: add new flag of stripped VLAN " Feifei Wang
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 2/4] net/ixgbe: support bad checksum flag " Feifei Wang
@ 2020-11-18 10:48   ` Feifei Wang
  2020-11-18 11:51     ` Wang, Haiyue
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 4/4] net/ixgbe: enable IXGBE NEON vector when need to checksum Feifei Wang
  2020-12-11 12:06   ` [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector Ferruh Yigit
  4 siblings, 1 reply; 18+ messages in thread
From: Feifei Wang @ 2020-11-18 10:48 UTC (permalink / raw)
  To: Jerin Jacob, Ruifeng Wang, Jeff Guo, Haiyue Wang; +Cc: dev, nd, Feifei Wang

Add CKSUM_GOOD flag to distinguish a good checksum from an unknown one
in neon vertor RX function.

Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 37 +++++++++++++++++--------
 1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index 4d6f057e7..b2bee2228 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -86,13 +86,13 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 		  uint8x16_t staterr, uint8_t vlan_flags, struct rte_mbuf **rx_pkts)
 {
 	uint8x16_t ptype;
-	uint8x16_t vtag;
+	uint8x16_t vtag_lo, vtag_hi, vtag;
 	uint8x16_t temp_csum;
 	uint32x4_t csum = {0, 0, 0, 0};
 
 	union {
-		uint8_t e[4];
-		uint32_t word;
+		uint16_t e[4];
+		uint64_t word;
 	} vol;
 
 	const uint8x16_t rsstype_msk = {
@@ -119,18 +119,26 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 			(IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE) >> 24};
 
 	/* map vlan present (0x8), IPE (0x2), L4E (0x1) to ol_flags */
-	const uint8x16_t vlan_csum_map = {
-			0,
-			PKT_RX_L4_CKSUM_BAD,
+	const uint8x16_t vlan_csum_map_lo = {
+			PKT_RX_IP_CKSUM_GOOD,
+			PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_BAD,
 			PKT_RX_IP_CKSUM_BAD,
 			PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
 			0, 0, 0, 0,
-			vlan_flags,
-			vlan_flags | PKT_RX_L4_CKSUM_BAD,
+			vlan_flags | PKT_RX_IP_CKSUM_GOOD,
+			vlan_flags | PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_BAD,
 			vlan_flags | PKT_RX_IP_CKSUM_BAD,
 			vlan_flags | PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
 			0, 0, 0, 0};
 
+	const uint8x16_t vlan_csum_map_hi = {
+			PKT_RX_L4_CKSUM_GOOD >> sizeof(uint8_t), 0,
+			PKT_RX_L4_CKSUM_GOOD >> sizeof(uint8_t), 0,
+			0, 0, 0, 0,
+			PKT_RX_L4_CKSUM_GOOD >> sizeof(uint8_t), 0,
+			PKT_RX_L4_CKSUM_GOOD >> sizeof(uint8_t), 0,
+			0, 0, 0, 0};
+
 	ptype = vzipq_u8(sterr_tmp1.val[0], sterr_tmp2.val[0]).val[0];
 	ptype = vandq_u8(ptype, rsstype_msk);
 	ptype = vqtbl1q_u8(rss_flags, ptype);
@@ -150,11 +158,16 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 	csum = vsetq_lane_u32(vgetq_lane_u32(vreinterpretq_u32_u8(temp_csum), 3), csum, 0);
 	vtag = vorrq_u8(vreinterpretq_u8_u32(csum), vtag);
 
-	/* convert VP, IPE, L4E to ol_flags */
-	vtag = vqtbl1q_u8(vlan_csum_map, vtag);
-	vtag = vorrq_u8(ptype, vtag);
+	/* convert L4 checksum correct type to vtag_hi */
+	vtag_hi = vqtbl1q_u8(vlan_csum_map_hi, vtag);
+	vtag_hi = vshrq_n_u8(vtag_hi, 7);
+
+	/* convert VP, IPE, L4E to vtag_lo */
+	vtag_lo = vqtbl1q_u8(vlan_csum_map_lo, vtag);
+	vtag_lo = vorrq_u8(ptype, vtag_lo);
 
-	vol.word = vgetq_lane_u32(vreinterpretq_u32_u8(vtag), 0);
+	vtag = vzipq_u8(vtag_lo, vtag_hi).val[0];
+	vol.word = vgetq_lane_u64(vreinterpretq_u64_u8(vtag), 0);
 
 	rx_pkts[0]->ol_flags = vol.e[0];
 	rx_pkts[1]->ol_flags = vol.e[1];
-- 
2.17.1


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

* [dpdk-dev] [PATCH v2 4/4] net/ixgbe: enable IXGBE NEON vector when need to checksum
  2020-11-18 10:48 ` [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
                     ` (2 preceding siblings ...)
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 3/4] net/ixgbe: support good " Feifei Wang
@ 2020-11-18 10:48   ` Feifei Wang
  2020-11-18 11:51     ` Wang, Haiyue
  2020-12-11 12:06   ` [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector Ferruh Yigit
  4 siblings, 1 reply; 18+ messages in thread
From: Feifei Wang @ 2020-11-18 10:48 UTC (permalink / raw)
  To: Jerin Jacob, Ruifeng Wang, Jeff Guo, Haiyue Wang; +Cc: dev, nd, Feifei Wang

IXGBE NEON vector PMD now supports checksum offloading, hence can be used
when DEV_RX_OFFLOAD_CHECKSUM is set.

Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index b2bee2228..a5a5b2167 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -638,11 +638,5 @@ ixgbe_txq_vec_setup(struct ixgbe_tx_queue *txq)
 int __rte_cold
 ixgbe_rx_vec_dev_conf_condition_check(struct rte_eth_dev *dev)
 {
-	struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
-
-	/* no csum error report support */
-	if (rxmode->offloads & DEV_RX_OFFLOAD_CHECKSUM)
-		return -1;
-
 	return ixgbe_rx_vec_dev_conf_condition_check_default(dev);
 }
-- 
2.17.1


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

* [dpdk-dev] 回复: [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm
  2020-11-18  8:34   ` Wang, Haiyue
@ 2020-11-18 10:51     ` Feifei Wang
  0 siblings, 0 replies; 18+ messages in thread
From: Feifei Wang @ 2020-11-18 10:51 UTC (permalink / raw)
  To: Wang, Haiyue, jerinj, Ruifeng Wang, Guo, Jia; +Cc: dev, nd, nd

Hi, Haiyue

> -----邮件原件-----
> 发件人: Wang, Haiyue <haiyue.wang@intel.com>
> 发送时间: 2020年11月18日 16:34
> 收件人: Feifei Wang <Feifei.Wang2@arm.com>; jerinj@marvell.com; Ruifeng
> Wang <Ruifeng.Wang@arm.com>; Guo, Jia <jia.guo@intel.com>
> 抄送: dev@dpdk.org; nd <nd@arm.com>
> 主题: RE: [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm
> 
> Hi Feifei,
> 
> > -----Original Message-----
> > From: Feifei Wang <feifei.wang2@arm.com>
> > Sent: Wednesday, November 18, 2020 15:35
> > To: Jerin Jacob <jerinj@marvell.com>; Ruifeng Wang
> > <ruifeng.wang@arm.com>; Guo, Jia <jia.guo@intel.com>; Wang, Haiyue
> > <haiyue.wang@intel.com>
> > Cc: dev@dpdk.org; nd@arm.com; Feifei Wang <feifei.wang2@arm.com>
> > Subject: [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm
> >
> 
> And the commit message can be more descriptive like:
> http://git.dpdk.org/dpdk/commit/?id=6d28c53bf7a9063caa3197c6cc481e2a69e
> 3be96
> 
> No need to add the test result, you can put the result into cover letter.
> 
> BR,
> Haiyue

Thanks very much for your advice, the commit message has been changed in the new version.

Best Regards
Feifei
> 
> > Implemented PKT_RX_VLAN_STRIPPED for vector PMD on Arm platform.
> >
> > Test Results:
> > NICs: 82599(igb)
> > Driver: ixgbe(vector)
> > Packet: vlan-id=1
> >
> > $:./app/dpdk-testpmd -c 0x3 -w 0002:f9:00.0 -- -i
> > --port-topology=chained \ to enable vlan stripping:
> > --enable-hw-vlan-strip
> > test-pmd> set fwd rxonly
> > test-pmd> set verbose 1
> > test-pmd> start
> >
> > With this patch:
> > %enable vlan stripping:
> > testpmd> port 0/queue 0: received 1 packets
> > src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 -
> > length=70 - nb_segs=1 - VLAN tci=0x1
> > ol_flags: PKT_RX_VLAN PKT_RX_VLAN_STRIPPED
> >
> > %disable vlan stripping:
> > testpmd> port 0/queue 0: received 1 packets
> > src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x8100 -
> > length=74 - nb_segs=1 - VLAN tci=0x0
> > ol_flags: PKT_RX_VLAN
> >
> > Without this patch:
> > %enable vlan stripping:
> > testpmd> port 0/queue 0: received 1 packets
> > src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 -
> > length=70 - nb_segs=1 - VLAN tci=0x1
> > ol_flags: PKT_RX_VLAN
> >
> > %disable vlan stripping:
> > testpmd> port 0/queue 0: received 1 packets
> > src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x8100 -
> > length=74 - nb_segs=1 - VLAN tci=0x0
> > ol_flags: PKT_RX_VLAN
> >
> 
> 
> > Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> > Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> > ---
> >  drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 36
> > ++++++++++++++++---------
> >  1 file changed, 23 insertions(+), 13 deletions(-)
> >
> 
> 
> > 2.17.1


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

* Re: [dpdk-dev] [PATCH v2 1/4] net/ixgbe: add new flag of stripped VLAN for NEON vector
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 1/4] net/ixgbe: add new flag of stripped VLAN " Feifei Wang
@ 2020-11-18 11:51     ` Wang, Haiyue
  0 siblings, 0 replies; 18+ messages in thread
From: Wang, Haiyue @ 2020-11-18 11:51 UTC (permalink / raw)
  To: Feifei Wang, Jerin Jacob, Ruifeng Wang, Guo, Jia; +Cc: dev, nd

> -----Original Message-----
> From: Feifei Wang <feifei.wang2@arm.com>
> Sent: Wednesday, November 18, 2020 18:49
> To: Jerin Jacob <jerinj@marvell.com>; Ruifeng Wang <ruifeng.wang@arm.com>; Guo, Jia
> <jia.guo@intel.com>; Wang, Haiyue <haiyue.wang@intel.com>
> Cc: dev@dpdk.org; nd@arm.com; Feifei Wang <feifei.wang2@arm.com>
> Subject: [PATCH v2 1/4] net/ixgbe: add new flag of stripped VLAN for NEON vector
> 
> For NEON vector of IXGBE PMD, introduce new flag PKT_RX_VLAN_STRIPPED to
> show the case that the VLAN is stripped from the VLAN tagged packet.
> 
> This is because that the old flag PKT_RX_VLAN_PKT only indicates that the
> packet is VLAN tagged, but cannot show whether VLAN is in m->vlan_tci or
> in the packet at present. So add new flag to show the vlan has been
> stripped by the hardware and its tci is saved in m->vlan_tci when vlan
> stripping is enabled in the RX configuration of the IXGBE PMD.
> 
> Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> ---
>  drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 36 ++++++++++++++++---------
>  1 file changed, 23 insertions(+), 13 deletions(-)
> 


Acked-by: Haiyue Wang <haiyue.wang@intel.com>


> --
> 2.17.1


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

* Re: [dpdk-dev] [PATCH v2 2/4] net/ixgbe: support bad checksum flag for NEON vector
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 2/4] net/ixgbe: support bad checksum flag " Feifei Wang
@ 2020-11-18 11:51     ` Wang, Haiyue
  0 siblings, 0 replies; 18+ messages in thread
From: Wang, Haiyue @ 2020-11-18 11:51 UTC (permalink / raw)
  To: Feifei Wang, Jerin Jacob, Ruifeng Wang, Guo, Jia; +Cc: dev, nd

> -----Original Message-----
> From: Feifei Wang <feifei.wang2@arm.com>
> Sent: Wednesday, November 18, 2020 18:49
> To: Jerin Jacob <jerinj@marvell.com>; Ruifeng Wang <ruifeng.wang@arm.com>; Guo, Jia
> <jia.guo@intel.com>; Wang, Haiyue <haiyue.wang@intel.com>
> Cc: dev@dpdk.org; nd@arm.com; Feifei Wang <feifei.wang2@arm.com>
> Subject: [PATCH v2 2/4] net/ixgbe: support bad checksum flag for NEON vector
> 
> Updated desc_to_olflags_v() to support PKT_RX_IP_CKSUM_BAD and
> PKT_RX_L4_CKSUM_BAD in the ol_flags of the mbuf.
> 
> And then the NEON vector RX function can be called with hw_ip_checksum
> enabled.
> 
> Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> ---
>  drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 47 +++++++++++++++++++------
>  1 file changed, 36 insertions(+), 11 deletions(-)

Acked-by: Haiyue Wang <haiyue.wang@intel.com>

> --
> 2.17.1


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

* Re: [dpdk-dev] [PATCH v2 3/4] net/ixgbe: support good checksum flag for NEON vector
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 3/4] net/ixgbe: support good " Feifei Wang
@ 2020-11-18 11:51     ` Wang, Haiyue
  0 siblings, 0 replies; 18+ messages in thread
From: Wang, Haiyue @ 2020-11-18 11:51 UTC (permalink / raw)
  To: Feifei Wang, Jerin Jacob, Ruifeng Wang, Guo, Jia; +Cc: dev, nd

> -----Original Message-----
> From: Feifei Wang <feifei.wang2@arm.com>
> Sent: Wednesday, November 18, 2020 18:49
> To: Jerin Jacob <jerinj@marvell.com>; Ruifeng Wang <ruifeng.wang@arm.com>; Guo, Jia
> <jia.guo@intel.com>; Wang, Haiyue <haiyue.wang@intel.com>
> Cc: dev@dpdk.org; nd@arm.com; Feifei Wang <feifei.wang2@arm.com>
> Subject: [PATCH v2 3/4] net/ixgbe: support good checksum flag for NEON vector
> 
> Add CKSUM_GOOD flag to distinguish a good checksum from an unknown one
> in neon vertor RX function.
> 
> Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> ---
>  drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 37 +++++++++++++++++--------
>  1 file changed, 25 insertions(+), 12 deletions(-)
> 

Acked-by: Haiyue Wang <haiyue.wang@intel.com>

> --
> 2.17.1


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

* Re: [dpdk-dev] [PATCH v2 4/4] net/ixgbe: enable IXGBE NEON vector when need to checksum
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 4/4] net/ixgbe: enable IXGBE NEON vector when need to checksum Feifei Wang
@ 2020-11-18 11:51     ` Wang, Haiyue
  0 siblings, 0 replies; 18+ messages in thread
From: Wang, Haiyue @ 2020-11-18 11:51 UTC (permalink / raw)
  To: Feifei Wang, Jerin Jacob, Ruifeng Wang, Guo, Jia; +Cc: dev, nd

> -----Original Message-----
> From: Feifei Wang <feifei.wang2@arm.com>
> Sent: Wednesday, November 18, 2020 18:49
> To: Jerin Jacob <jerinj@marvell.com>; Ruifeng Wang <ruifeng.wang@arm.com>; Guo, Jia
> <jia.guo@intel.com>; Wang, Haiyue <haiyue.wang@intel.com>
> Cc: dev@dpdk.org; nd@arm.com; Feifei Wang <feifei.wang2@arm.com>
> Subject: [PATCH v2 4/4] net/ixgbe: enable IXGBE NEON vector when need to checksum
> 
> IXGBE NEON vector PMD now supports checksum offloading, hence can be used
> when DEV_RX_OFFLOAD_CHECKSUM is set.
> 
> Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> ---
>  drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 6 ------
>  1 file changed, 6 deletions(-)

Acked-by: Haiyue Wang <haiyue.wang@intel.com>

> --
> 2.17.1


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

* Re: [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector
  2020-11-18 10:48 ` [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
                     ` (3 preceding siblings ...)
  2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 4/4] net/ixgbe: enable IXGBE NEON vector when need to checksum Feifei Wang
@ 2020-12-11 12:06   ` Ferruh Yigit
  4 siblings, 0 replies; 18+ messages in thread
From: Ferruh Yigit @ 2020-12-11 12:06 UTC (permalink / raw)
  To: Feifei Wang; +Cc: dev, nd

On 11/18/2020 10:48 AM, Feifei Wang wrote:
> This patch series are mainly to enable checksum offloading for IXGBE NEON
> vector PMD, including good and bad checksum flags. In the meanwhile, the
> first patch enable VLAN stripping flag for Arm.
> Following are the test results for the patches:
> 
> NICs: 82599(igb)
> Driver: ixgbe(vector)
> $:./app/dpdk-testpmd -c 0x3 -w 0002:f9:00.0 -- -i --port-topology=chained
> test-pmd> set fwd rxonly
> test-pmd> set verbose 1
> test-pmd> start
> 
> With Patch a:
> enable vlan stripping:
> src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1 - VLAN tci=0x1
> ol_flags: PKT_RX_VLAN PKT_RX_VLAN_STRIPPED
> 
> With Patch b:
> Packet: IPv4_checksum = 0xee && UDP_checksum = 0xee
> src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1
> ol_flags: PKT_RX_L4_CKSUM_BAD PKT_RX_IP_CKSUM_BAD
> 
> With Patch c:
> Packet: IPv4_checksum = correct value && UDP_checksum = correct value
> ol_flags: PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD
> 
> v2:
> 1. update the commit message title to align the design (Wang, Haiyue)
> 2. make the commit message more descriptive and move the test results
>     to the cover letter (Wang, Haiyue)
> 
> Feifei Wang (4):
>   a). net/ixgbe: add new flag of stripped VLAN for NEON vector
>   b). net/ixgbe: support bad checksum flag for NEON vector
>   c). net/ixgbe: support good checksum flag for NEON vector
>   d). net/ixgbe: enable IXGBE NEON vector when need to checksum
> 
>   drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 94 ++++++++++++++++++-------
>   1 file changed, 68 insertions(+), 26 deletions(-)
> 

Merge note seems sent to different version, moving here:
Applied to dpdk-next-net-intel.

Pulling it to next-net.

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

* [dpdk-dev] [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm
  2020-11-18  6:29 [dpdk-dev] [PATCH v1 " Feifei Wang
@ 2020-11-18  6:29 ` Feifei Wang
  0 siblings, 0 replies; 18+ messages in thread
From: Feifei Wang @ 2020-11-18  6:29 UTC (permalink / raw)
  To: Jerin Jacob, Ruifeng Wang, Jeff Guo, Haiyue Wang; +Cc: dev, nd, Feifei Wang

Implemented PKT_RX_VLAN_STRIPPED for vector PMD on Arm platform.

Test Results:
NICs: 82599(igb)
Dirver: ixgbe(vector)
Packet: vlan-id=1

$:./app/dpdk-testpmd -c 0x3 -w 0002:f9:00.0 -- -i --port-topology=chained \
to enable vlan stripping: --enable-hw-vlan-strip
test-pmd> set fwd rxonly
test-pmd> set verbose 1
test-pmd> start

With this patch:
%enable vlan stripping:
testpmd> port 0/queue 0: received 1 packets
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1 - VLAN tci=0x1
ol_flags: PKT_RX_VLAN PKT_RX_VLAN_STRIPPED

%disable vlan stripping:
testpmd> port 0/queue 0: received 1 packets
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x8100 - length=74 - nb_segs=1 - VLAN tci=0x0
ol_flags: PKT_RX_VLAN

_________________________

Without this patch:
%enable vlan stripping:
testpmd> port 0/queue 0: received 1 packets
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x0800 - length=70 - nb_segs=1 - VLAN tci=0x1
ol_flags: PKT_RX_VLAN

%disable vlan stripping:
testpmd> port 0/queue 0: received 1 packets
src=00:00:00:00:00:02 - dst=00:00:00:00:00:01 - type=0x8100 - length=74 - nb_segs=1 - VLAN tci=0x0
ol_flags: PKT_RX_VLAN

Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c | 36 ++++++++++++++++---------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
index 4c81ae9dc..e6d877af9 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
@@ -81,11 +81,9 @@ ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
 	IXGBE_PCI_REG_WRITE(rxq->rdt_reg_addr, rx_id);
 }
 
-#define VTAG_SHIFT     (3)
-
 static inline void
 desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
-		  uint8x16_t staterr, struct rte_mbuf **rx_pkts)
+		  uint8x16_t staterr, uint8_t vlan_flags, struct rte_mbuf **rx_pkts)
 {
 	uint8x16_t ptype;
 	uint8x16_t vtag;
@@ -95,13 +93,6 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 		uint32_t word;
 	} vol;
 
-	const uint8x16_t pkttype_msk = {
-			PKT_RX_VLAN, PKT_RX_VLAN,
-			PKT_RX_VLAN, PKT_RX_VLAN,
-			0x00, 0x00, 0x00, 0x00,
-			0x00, 0x00, 0x00, 0x00,
-			0x00, 0x00, 0x00, 0x00};
-
 	const uint8x16_t rsstype_msk = {
 			0x0F, 0x0F, 0x0F, 0x0F,
 			0x00, 0x00, 0x00, 0x00,
@@ -114,12 +105,26 @@ desc_to_olflags_v(uint8x16x2_t sterr_tmp1, uint8x16x2_t sterr_tmp2,
 			PKT_RX_RSS_HASH, 0, 0, 0,
 			0, 0, 0, PKT_RX_FDIR};
 
+	const uint8x16_t vlan_msk = {
+			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
+			IXGBE_RXD_STAT_VP, IXGBE_RXD_STAT_VP,
+			0, 0, 0, 0,
+			0, 0, 0, 0,
+			0, 0, 0, 0};
+
+	const uint8x16_t vlan_map = {
+			0, 0, 0, 0,
+			0, 0, 0, 0,
+			vlan_flags, 0, 0, 0,
+			0, 0, 0, 0};
+
 	ptype = vzipq_u8(sterr_tmp1.val[0], sterr_tmp2.val[0]).val[0];
 	ptype = vandq_u8(ptype, rsstype_msk);
 	ptype = vqtbl1q_u8(rss_flags, ptype);
 
-	vtag = vshrq_n_u8(staterr, VTAG_SHIFT);
-	vtag = vandq_u8(vtag, pkttype_msk);
+	/* extract vlan_flags from IXGBE_RXD_STAT_VP bits of staterr */
+	vtag = vandq_u8(staterr, vlan_msk);
+	vtag = vqtbl1q_u8(vlan_map, vtag);
 	vtag = vorrq_u8(ptype, vtag);
 
 	vol.word = vgetq_lane_u32(vreinterpretq_u32_u8(vtag), 0);
@@ -221,6 +226,7 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		};
 	uint16x8_t crc_adjust = {0, 0, rxq->crc_len, 0,
 				 rxq->crc_len, 0, 0, 0};
+	uint8_t vlan_flags;
 
 	/* nb_pkts has to be floor-aligned to RTE_IXGBE_DESCS_PER_LOOP */
 	nb_pkts = RTE_ALIGN_FLOOR(nb_pkts, RTE_IXGBE_DESCS_PER_LOOP);
@@ -250,6 +256,10 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	 */
 	sw_ring = &rxq->sw_ring[rxq->rx_tail];
 
+	/* ensure these 2 flags are in the lower 8 bits */
+	RTE_BUILD_BUG_ON((PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED) > UINT8_MAX);
+	vlan_flags = rxq->vlan_flags & UINT8_MAX;
+
 	/* A. load 4 packet in one loop
 	 * B. copy 4 mbuf point from swring to rx_pkts
 	 * C. calc the number of DD bits among the 4 packets
@@ -311,7 +321,7 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		staterr = vzipq_u8(sterr_tmp1.val[1], sterr_tmp2.val[1]).val[0];
 
 		/* set ol_flags with vlan packet type */
-		desc_to_olflags_v(sterr_tmp1, sterr_tmp2, staterr,
+		desc_to_olflags_v(sterr_tmp1, sterr_tmp2, staterr, vlan_flags,
 				  &rx_pkts[pos]);
 
 		/* D.2 pkt 3,4 set in_port/nb_seg and remove crc */
-- 
2.17.1


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

end of thread, other threads:[~2020-12-11 12:06 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-18  7:35 [dpdk-dev] [PATCH v1 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm Feifei Wang
2020-11-18  8:34   ` Wang, Haiyue
2020-11-18 10:51     ` [dpdk-dev] 回复: " Feifei Wang
2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 2/4] net/ixgbe: support checksum flags for NEON vector Feifei Wang
2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 3/4] net/ixgbe: implement good checksum flag " Feifei Wang
2020-11-18  7:35 ` [dpdk-dev] [PATCH v1 4/4] net/ixgbe: enable IXGBE NEON vector PMD when CHECKSUM is set Feifei Wang
2020-11-18 10:48 ` [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector Feifei Wang
2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 1/4] net/ixgbe: add new flag of stripped VLAN " Feifei Wang
2020-11-18 11:51     ` Wang, Haiyue
2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 2/4] net/ixgbe: support bad checksum flag " Feifei Wang
2020-11-18 11:51     ` Wang, Haiyue
2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 3/4] net/ixgbe: support good " Feifei Wang
2020-11-18 11:51     ` Wang, Haiyue
2020-11-18 10:48   ` [dpdk-dev] [PATCH v2 4/4] net/ixgbe: enable IXGBE NEON vector when need to checksum Feifei Wang
2020-11-18 11:51     ` Wang, Haiyue
2020-12-11 12:06   ` [dpdk-dev] [PATCH v2 0/4] Enable Checksum Offloading for NEON vector Ferruh Yigit
  -- strict thread matches above, loose matches on Subject: below --
2020-11-18  6:29 [dpdk-dev] [PATCH v1 " Feifei Wang
2020-11-18  6:29 ` [dpdk-dev] [PATCH v1 1/4] net/ixgbe: add VLAN stripping support for Arm Feifei Wang

DPDK patches and discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://inbox.dpdk.org/dev/0 dev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dev dev/ https://inbox.dpdk.org/dev \
		dev@dpdk.org
	public-inbox-index dev

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dev


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git