Hi, > -----Original Message----- > From: Shaw, Jeffrey B > Sent: Wednesday, October 5, 2016 5:13 PM > To: dev at dpdk.org > Cc: Zhang, Helin <helin.zhang at intel.com>; Wu, Jingjing > <jingjing.wu at intel.com>; damarion at cisco.com; Zhang, Qi Z > <qi.z.zhang at intel.com>; Chen, Jing D <jing.d.chen at intel.com> > Subject: [PATCH v2 2/2] i40e: Enable bad checksum flags in i40e vPMD > > From: Damjan Marion <damarion at cisco.com> > > Decode the checksum flags from the rx descriptor, setting the appropriate bit > in the mbuf ol_flags field when the flag indicates a bad checksum. > > Signed-off-by: Damjan Marion <damarion at cisco.com> > Signed-off-by: Jeff Shaw <jeffrey.b.shaw at intel.com> > --- > drivers/net/i40e/i40e_rxtx_vec.c | 48 +++++++++++++++++++++++--------------- > -- > 1 file changed, 28 insertions(+), 20 deletions(-) > > diff --git a/drivers/net/i40e/i40e_rxtx_vec.c > b/drivers/net/i40e/i40e_rxtx_vec.c > index 6c63141..d2267ad 100644 > --- a/drivers/net/i40e/i40e_rxtx_vec.c > +++ b/drivers/net/i40e/i40e_rxtx_vec.c > @@ -138,19 +138,14 @@ i40e_rxq_rearm(struct i40e_rx_queue *rxq) static > inline void desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts) { > - __m128i vlan0, vlan1, rss; > - union { > - uint16_t e[4]; > - uint64_t dword; > - } vol; > + __m128i vlan0, vlan1, rss, l3_l4e; > > /* mask everything except RSS, flow director and VLAN flags > * bit2 is for VLAN tag, bit11 for flow director indication > * bit13:12 for RSS indication. > */ > - const __m128i rss_vlan_msk = _mm_set_epi16( > - 0x0000, 0x0000, 0x0000, 0x0000, > - 0x3804, 0x3804, 0x3804, 0x3804); > + const __m128i rss_vlan_msk = _mm_set_epi32( > + 0x1c03004, 0x1c03004, 0x1c03004, 0x1c03004); > > /* map rss and vlan type to rss hash and vlan flag */ > const __m128i vlan_flags = _mm_set_epi8(0, 0, 0, 0, @@ -163,23 > +158,36 @@ desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts) > PKT_RX_RSS_HASH | PKT_RX_FDIR, > PKT_RX_RSS_HASH, 0, 0, > 0, 0, PKT_RX_FDIR, 0); > > - vlan0 = _mm_unpackhi_epi16(descs[0], descs[1]); > - vlan1 = _mm_unpackhi_epi16(descs[2], descs[3]); > - vlan0 = _mm_unpacklo_epi32(vlan0, vlan1); > + const __m128i l3_l4e_flags = _mm_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, > + PKT_RX_EIP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD > | PKT_RX_IP_CKSUM_BAD, > + PKT_RX_EIP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD, > + PKT_RX_EIP_CKSUM_BAD | PKT_RX_IP_CKSUM_BAD, > + PKT_RX_EIP_CKSUM_BAD, > + PKT_RX_L4_CKSUM_BAD | PKT_RX_IP_CKSUM_BAD, > + PKT_RX_L4_CKSUM_BAD, > + PKT_RX_IP_CKSUM_BAD, > + 0); > + > + vlan0 = _mm_unpackhi_epi32(descs[0], descs[1]); > + vlan1 = _mm_unpackhi_epi32(descs[2], descs[3]); > + vlan0 = _mm_unpacklo_epi64(vlan0, vlan1); > > vlan1 = _mm_and_si128(vlan0, rss_vlan_msk); > vlan0 = _mm_shuffle_epi8(vlan_flags, vlan1); > > - rss = _mm_srli_epi16(vlan1, 11); > + rss = _mm_srli_epi32(vlan1, 12); > rss = _mm_shuffle_epi8(rss_flags, rss);
My bad. Original code will use bit[13:11] to identify RSS and FDIR flag. Now It masked bit 11 out when creating " rss_vlan_msk" and doing shift above, while it still try to use original "rss_flags"?