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;
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,
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);
};
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);
*/
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
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 */