From: "Chen Jing D(Mark)" <jing.d.c...@intel.com>

Using SSE instructions to parse error flags in HW Rx descriptor,
then set corresponding bits of mbuf.

Signed-off-by: Chen Jing D(Mark) <jing.d.chen at intel.com>
---
 doc/guides/rel_notes/release_2_3.rst |    2 +
 drivers/net/fm10k/fm10k_rxtx_vec.c   |   42 +++++++++++++++++++++++++++++++++-
 2 files changed, 43 insertions(+), 1 deletions(-)

diff --git a/doc/guides/rel_notes/release_2_3.rst 
b/doc/guides/rel_notes/release_2_3.rst
index 99de186..19e8aa2 100644
--- a/doc/guides/rel_notes/release_2_3.rst
+++ b/doc/guides/rel_notes/release_2_3.rst
@@ -3,7 +3,9 @@ DPDK Release 2.3

 New Features
 ------------
+* **Handle error flags in fm10k vector RX func**

+  * Parse err flags in Rx desc and set error bits in mbuf with vector 
instructions.

 Resolved Issues
 ---------------
diff --git a/drivers/net/fm10k/fm10k_rxtx_vec.c 
b/drivers/net/fm10k/fm10k_rxtx_vec.c
index 2a57eef..0c48a48 100644
--- a/drivers/net/fm10k/fm10k_rxtx_vec.c
+++ b/drivers/net/fm10k/fm10k_rxtx_vec.c
@@ -61,11 +61,17 @@ fm10k_reset_tx_queue(struct fm10k_tx_queue *txq);
 #define L3TYPE_SHIFT     (4)
 /* L4 type shift */
 #define L4TYPE_SHIFT     (7)
+/* HBO flag shift */
+#define HBOFLAG_SHIFT     (10)
+/* RXE flag shift */
+#define RXEFLAG_SHIFT     (13)
+/* IPE/L4E flag shift */
+#define L3L4EFLAG_SHIFT     (14)

 static inline void
 fm10k_desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts)
 {
-       __m128i ptype0, ptype1, vtag0, vtag1;
+       __m128i ptype0, ptype1, vtag0, vtag1, eflag0, eflag1, cksumflag;
        union {
                uint16_t e[4];
                uint64_t dword;
@@ -81,12 +87,29 @@ fm10k_desc_to_olflags_v(__m128i descs[4], struct rte_mbuf 
**rx_pkts)
                        0x0000, 0x0000, 0x0000, 0x0000,
                        0x000F, 0x000F, 0x000F, 0x000F);

+       /* mask for HBO and RXE flag flags */
+       const __m128i rxe_msk = _mm_set_epi16(
+                       0x0000, 0x0000, 0x0000, 0x0000,
+                       0x0001, 0x0001, 0x0001, 0x0001);
+
+       const __m128i l3l4cksum_flag = _mm_set_epi8(0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
+                       PKT_RX_IP_CKSUM_BAD, PKT_RX_L4_CKSUM_BAD, 0);
+
+       const __m128i rxe_flag = _mm_set_epi8(0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, PKT_RX_RECIP_ERR, 0);
+
        /* map rss type to rss hash flag */
        const __m128i rss_flags = _mm_set_epi8(0, 0, 0, 0,
                        0, 0, 0, PKT_RX_RSS_HASH,
                        PKT_RX_RSS_HASH, 0, PKT_RX_RSS_HASH, 0,
                        PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, 0);

+       /* Calculate RSS_hash and Vlan fields */
        ptype0 = _mm_unpacklo_epi16(descs[0], descs[1]);
        ptype1 = _mm_unpacklo_epi16(descs[2], descs[3]);
        vtag0 = _mm_unpackhi_epi16(descs[0], descs[1]);
@@ -97,10 +120,27 @@ fm10k_desc_to_olflags_v(__m128i descs[4], struct rte_mbuf 
**rx_pkts)
        ptype0 = _mm_shuffle_epi8(rss_flags, ptype0);

        vtag1 = _mm_unpacklo_epi32(vtag0, vtag1);
+       eflag0 = vtag1;
+       cksumflag = vtag1;
        vtag1 = _mm_srli_epi16(vtag1, VP_SHIFT);
        vtag1 = _mm_and_si128(vtag1, pkttype_msk);

        vtag1 = _mm_or_si128(ptype0, vtag1);
+
+       /* Process err flags, simply set RECIP_ERR bit if HBO/IXE is set */
+       eflag1 = _mm_srli_epi16(eflag0, RXEFLAG_SHIFT);
+       eflag0 = _mm_srli_epi16(eflag0, HBOFLAG_SHIFT);
+       eflag0 = _mm_or_si128(eflag0, eflag1);
+       eflag0 = _mm_and_si128(eflag1, rxe_msk);
+       eflag0 = _mm_shuffle_epi8(rxe_flag, eflag0);
+
+       vtag1 = _mm_or_si128(eflag0, vtag1);
+
+       /* Process L4/L3 checksum error flags */
+       cksumflag = _mm_srli_epi16(cksumflag, L3L4EFLAG_SHIFT);
+       cksumflag = _mm_shuffle_epi8(l3l4cksum_flag, cksumflag);
+       vtag1 = _mm_or_si128(cksumflag, vtag1);
+
        vol.dword = _mm_cvtsi128_si64(vtag1);

        rx_pkts[0]->ol_flags = vol.e[0];
-- 
1.7.7.6

Reply via email to