net: iflib: fix vlan processing in the drivers
The logic that sets iri_vtag and M_VLANTAG does not handle the case where the 802.11q VLAN tag is 0. Fix this issue across the iflib drivers. While there, also improve and align the VLAN tag check extraction, by moving it outside the RX descriptor loop, eliminating a local variable and additional checks. PR: 260068 Reviewed by: kbowling, gallatin Reported by: erj MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D33156
This commit is contained in:
parent
52f45d8ace
commit
f7926a6d0c
@ -671,9 +671,9 @@ em_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
u32 pkt_info;
|
u32 pkt_info;
|
||||||
u32 staterr = 0;
|
u32 staterr = 0;
|
||||||
bool eop;
|
bool eop;
|
||||||
int i, cidx, vtag;
|
int i, cidx;
|
||||||
|
|
||||||
i = vtag = 0;
|
i = 0;
|
||||||
cidx = ri->iri_cidx;
|
cidx = ri->iri_cidx;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@ -710,12 +710,9 @@ em_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
em_receive_checksum(staterr, staterr >> 24, ri);
|
em_receive_checksum(staterr, staterr >> 24, ri);
|
||||||
|
|
||||||
if (staterr & E1000_RXD_STAT_VP) {
|
if (staterr & E1000_RXD_STAT_VP) {
|
||||||
vtag = le16toh(rxd->wb.upper.vlan);
|
ri->iri_vtag = le16toh(rxd->wb.upper.vlan);
|
||||||
}
|
|
||||||
|
|
||||||
ri->iri_vtag = vtag;
|
|
||||||
if (vtag)
|
|
||||||
ri->iri_flags |= M_VLANTAG;
|
ri->iri_flags |= M_VLANTAG;
|
||||||
|
}
|
||||||
|
|
||||||
ri->iri_flowid = le32toh(rxd->wb.lower.hi_dword.rss);
|
ri->iri_flowid = le32toh(rxd->wb.lower.hi_dword.rss);
|
||||||
ri->iri_rsstype = em_determine_rsstype(pkt_info);
|
ri->iri_rsstype = em_determine_rsstype(pkt_info);
|
||||||
|
@ -436,12 +436,12 @@ igb_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
struct rx_ring *rxr = &que->rxr;
|
struct rx_ring *rxr = &que->rxr;
|
||||||
union e1000_adv_rx_desc *rxd;
|
union e1000_adv_rx_desc *rxd;
|
||||||
|
|
||||||
uint16_t pkt_info, len, vtag;
|
uint16_t pkt_info, len;
|
||||||
uint32_t ptype, staterr;
|
uint32_t ptype, staterr;
|
||||||
int i, cidx;
|
int i, cidx;
|
||||||
bool eop;
|
bool eop;
|
||||||
|
|
||||||
staterr = i = vtag = 0;
|
staterr = i = 0;
|
||||||
cidx = ri->iri_cidx;
|
cidx = ri->iri_cidx;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@ -460,13 +460,6 @@ igb_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
rxd->wb.upper.status_error = 0;
|
rxd->wb.upper.status_error = 0;
|
||||||
eop = ((staterr & E1000_RXD_STAT_EOP) == E1000_RXD_STAT_EOP);
|
eop = ((staterr & E1000_RXD_STAT_EOP) == E1000_RXD_STAT_EOP);
|
||||||
|
|
||||||
if (((sc->hw.mac.type == e1000_i350) ||
|
|
||||||
(sc->hw.mac.type == e1000_i354)) &&
|
|
||||||
(staterr & E1000_RXDEXT_STATERR_LB))
|
|
||||||
vtag = be16toh(rxd->wb.upper.vlan);
|
|
||||||
else
|
|
||||||
vtag = le16toh(rxd->wb.upper.vlan);
|
|
||||||
|
|
||||||
/* Make sure bad packets are discarded */
|
/* Make sure bad packets are discarded */
|
||||||
if (eop && ((staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) != 0)) {
|
if (eop && ((staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) != 0)) {
|
||||||
sc->dropped_pkts++;
|
sc->dropped_pkts++;
|
||||||
@ -495,9 +488,13 @@ igb_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
if ((scctx->isc_capenable & IFCAP_RXCSUM) != 0)
|
if ((scctx->isc_capenable & IFCAP_RXCSUM) != 0)
|
||||||
igb_rx_checksum(staterr, ri, ptype);
|
igb_rx_checksum(staterr, ri, ptype);
|
||||||
|
|
||||||
if ((scctx->isc_capenable & IFCAP_VLAN_HWTAGGING) != 0 &&
|
if (staterr & E1000_RXD_STAT_VP) {
|
||||||
(staterr & E1000_RXD_STAT_VP) != 0) {
|
if (((sc->hw.mac.type == e1000_i350) ||
|
||||||
ri->iri_vtag = vtag;
|
(sc->hw.mac.type == e1000_i354)) &&
|
||||||
|
(staterr & E1000_RXDEXT_STATERR_LB))
|
||||||
|
ri->iri_vtag = be16toh(rxd->wb.upper.vlan);
|
||||||
|
else
|
||||||
|
ri->iri_vtag = le16toh(rxd->wb.upper.vlan);
|
||||||
ri->iri_flags |= M_VLANTAG;
|
ri->iri_flags |= M_VLANTAG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -670,7 +670,7 @@ iavf_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
struct rx_ring *rxr = &que->rxr;
|
struct rx_ring *rxr = &que->rxr;
|
||||||
union iavf_rx_desc *cur;
|
union iavf_rx_desc *cur;
|
||||||
u32 status, error;
|
u32 status, error;
|
||||||
u16 plen, vtag;
|
u16 plen;
|
||||||
u64 qword;
|
u64 qword;
|
||||||
u8 ptype;
|
u8 ptype;
|
||||||
bool eop;
|
bool eop;
|
||||||
@ -701,10 +701,6 @@ iavf_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
|
|
||||||
cur->wb.qword1.status_error_len = 0;
|
cur->wb.qword1.status_error_len = 0;
|
||||||
eop = (status & (1 << IAVF_RX_DESC_STATUS_EOF_SHIFT));
|
eop = (status & (1 << IAVF_RX_DESC_STATUS_EOF_SHIFT));
|
||||||
if (status & (1 << IAVF_RX_DESC_STATUS_L2TAG1P_SHIFT))
|
|
||||||
vtag = le16toh(cur->wb.qword0.lo_dword.l2tag1);
|
|
||||||
else
|
|
||||||
vtag = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Make sure bad packets are discarded,
|
** Make sure bad packets are discarded,
|
||||||
@ -731,10 +727,11 @@ iavf_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
iavf_rx_checksum(ri, status, error, ptype);
|
iavf_rx_checksum(ri, status, error, ptype);
|
||||||
ri->iri_flowid = le32toh(cur->wb.qword0.hi_dword.rss);
|
ri->iri_flowid = le32toh(cur->wb.qword0.hi_dword.rss);
|
||||||
ri->iri_rsstype = iavf_ptype_to_hash(ptype);
|
ri->iri_rsstype = iavf_ptype_to_hash(ptype);
|
||||||
ri->iri_vtag = vtag;
|
if (status & (1 << IAVF_RX_DESC_STATUS_L2TAG1P_SHIFT)) {
|
||||||
ri->iri_nfrags = i;
|
ri->iri_vtag = le16toh(cur->wb.qword0.lo_dword.l2tag1);
|
||||||
if (vtag)
|
|
||||||
ri->iri_flags |= M_VLANTAG;
|
ri->iri_flags |= M_VLANTAG;
|
||||||
|
}
|
||||||
|
ri->iri_nfrags = i;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -285,7 +285,7 @@ ice_ift_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
if_softc_ctx_t scctx = sc->scctx;
|
if_softc_ctx_t scctx = sc->scctx;
|
||||||
struct ice_rx_queue *rxq = &sc->pf_vsi.rx_queues[ri->iri_qsidx];
|
struct ice_rx_queue *rxq = &sc->pf_vsi.rx_queues[ri->iri_qsidx];
|
||||||
union ice_32b_rx_flex_desc *cur;
|
union ice_32b_rx_flex_desc *cur;
|
||||||
u16 status0, plen, vtag, ptype;
|
u16 status0, plen, ptype;
|
||||||
bool eop;
|
bool eop;
|
||||||
size_t cidx;
|
size_t cidx;
|
||||||
int i;
|
int i;
|
||||||
@ -310,10 +310,6 @@ ice_ift_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
|
|
||||||
cur->wb.status_error0 = 0;
|
cur->wb.status_error0 = 0;
|
||||||
eop = (status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_EOF_S));
|
eop = (status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_EOF_S));
|
||||||
if (status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_L2TAG1P_S))
|
|
||||||
vtag = le16toh(cur->wb.l2tag1);
|
|
||||||
else
|
|
||||||
vtag = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure packets with bad L2 values are discarded.
|
* Make sure packets with bad L2 values are discarded.
|
||||||
@ -340,10 +336,11 @@ ice_ift_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
&ri->iri_csum_data, status0, ptype);
|
&ri->iri_csum_data, status0, ptype);
|
||||||
ri->iri_flowid = le32toh(RX_FLEX_NIC(&cur->wb, rss_hash));
|
ri->iri_flowid = le32toh(RX_FLEX_NIC(&cur->wb, rss_hash));
|
||||||
ri->iri_rsstype = ice_ptype_to_hash(ptype);
|
ri->iri_rsstype = ice_ptype_to_hash(ptype);
|
||||||
ri->iri_vtag = vtag;
|
if (status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_L2TAG1P_S)) {
|
||||||
ri->iri_nfrags = i;
|
ri->iri_vtag = le16toh(cur->wb.l2tag1);
|
||||||
if (vtag)
|
|
||||||
ri->iri_flags |= M_VLANTAG;
|
ri->iri_flags |= M_VLANTAG;
|
||||||
|
}
|
||||||
|
ri->iri_nfrags = i;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -461,12 +461,12 @@ igc_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
struct rx_ring *rxr = &que->rxr;
|
struct rx_ring *rxr = &que->rxr;
|
||||||
union igc_adv_rx_desc *rxd;
|
union igc_adv_rx_desc *rxd;
|
||||||
|
|
||||||
uint16_t pkt_info, len, vtag;
|
uint16_t pkt_info, len;
|
||||||
uint32_t ptype, staterr;
|
uint32_t ptype, staterr;
|
||||||
int i, cidx;
|
int i, cidx;
|
||||||
bool eop;
|
bool eop;
|
||||||
|
|
||||||
staterr = i = vtag = 0;
|
staterr = i = 0;
|
||||||
cidx = ri->iri_cidx;
|
cidx = ri->iri_cidx;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@ -485,8 +485,6 @@ igc_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
rxd->wb.upper.status_error = 0;
|
rxd->wb.upper.status_error = 0;
|
||||||
eop = ((staterr & IGC_RXD_STAT_EOP) == IGC_RXD_STAT_EOP);
|
eop = ((staterr & IGC_RXD_STAT_EOP) == IGC_RXD_STAT_EOP);
|
||||||
|
|
||||||
vtag = le16toh(rxd->wb.upper.vlan);
|
|
||||||
|
|
||||||
/* Make sure bad packets are discarded */
|
/* Make sure bad packets are discarded */
|
||||||
if (eop && ((staterr & IGC_RXDEXT_STATERR_RXE) != 0)) {
|
if (eop && ((staterr & IGC_RXDEXT_STATERR_RXE) != 0)) {
|
||||||
adapter->dropped_pkts++;
|
adapter->dropped_pkts++;
|
||||||
@ -517,7 +515,7 @@ igc_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
|
|
||||||
if ((scctx->isc_capenable & IFCAP_VLAN_HWTAGGING) != 0 &&
|
if ((scctx->isc_capenable & IFCAP_VLAN_HWTAGGING) != 0 &&
|
||||||
(staterr & IGC_RXD_STAT_VP) != 0) {
|
(staterr & IGC_RXD_STAT_VP) != 0) {
|
||||||
ri->iri_vtag = vtag;
|
ri->iri_vtag = le16toh(rxd->wb.upper.vlan);
|
||||||
ri->iri_flags |= M_VLANTAG;
|
ri->iri_flags |= M_VLANTAG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,7 +399,6 @@ ixgbe_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
union ixgbe_adv_rx_desc *rxd;
|
union ixgbe_adv_rx_desc *rxd;
|
||||||
|
|
||||||
uint16_t pkt_info, len, cidx, i;
|
uint16_t pkt_info, len, cidx, i;
|
||||||
uint16_t vtag = 0;
|
|
||||||
uint32_t ptype;
|
uint32_t ptype;
|
||||||
uint32_t staterr = 0;
|
uint32_t staterr = 0;
|
||||||
bool eop;
|
bool eop;
|
||||||
@ -424,12 +423,6 @@ ixgbe_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
rxd->wb.upper.status_error = 0;
|
rxd->wb.upper.status_error = 0;
|
||||||
eop = ((staterr & IXGBE_RXD_STAT_EOP) != 0);
|
eop = ((staterr & IXGBE_RXD_STAT_EOP) != 0);
|
||||||
|
|
||||||
if ( (rxr->vtag_strip) && (staterr & IXGBE_RXD_STAT_VP) ) {
|
|
||||||
vtag = le16toh(rxd->wb.upper.vlan);
|
|
||||||
} else {
|
|
||||||
vtag = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make sure bad packets are discarded */
|
/* Make sure bad packets are discarded */
|
||||||
if (eop && (staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK) != 0) {
|
if (eop && (staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK) != 0) {
|
||||||
if (sc->feat_en & IXGBE_FEATURE_VF)
|
if (sc->feat_en & IXGBE_FEATURE_VF)
|
||||||
@ -463,10 +456,12 @@ ixgbe_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
else
|
else
|
||||||
ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH;
|
ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH;
|
||||||
}
|
}
|
||||||
ri->iri_vtag = vtag;
|
if ((rxr->vtag_strip) && (staterr & IXGBE_RXD_STAT_VP)) {
|
||||||
ri->iri_nfrags = i;
|
ri->iri_vtag = le16toh(rxd->wb.upper.vlan);
|
||||||
if (vtag)
|
|
||||||
ri->iri_flags |= M_VLANTAG;
|
ri->iri_flags |= M_VLANTAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
ri->iri_nfrags = i;
|
||||||
return (0);
|
return (0);
|
||||||
} /* ixgbe_isc_rxd_pkt_get */
|
} /* ixgbe_isc_rxd_pkt_get */
|
||||||
|
|
||||||
|
@ -663,7 +663,7 @@ ixl_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
struct rx_ring *rxr = &que->rxr;
|
struct rx_ring *rxr = &que->rxr;
|
||||||
union i40e_rx_desc *cur;
|
union i40e_rx_desc *cur;
|
||||||
u32 status, error;
|
u32 status, error;
|
||||||
u16 plen, vtag;
|
u16 plen;
|
||||||
u64 qword;
|
u64 qword;
|
||||||
u8 ptype;
|
u8 ptype;
|
||||||
bool eop;
|
bool eop;
|
||||||
@ -694,10 +694,6 @@ ixl_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
|
|
||||||
cur->wb.qword1.status_error_len = 0;
|
cur->wb.qword1.status_error_len = 0;
|
||||||
eop = (status & (1 << I40E_RX_DESC_STATUS_EOF_SHIFT));
|
eop = (status & (1 << I40E_RX_DESC_STATUS_EOF_SHIFT));
|
||||||
if (status & (1 << I40E_RX_DESC_STATUS_L2TAG1P_SHIFT))
|
|
||||||
vtag = le16toh(cur->wb.qword0.lo_dword.l2tag1);
|
|
||||||
else
|
|
||||||
vtag = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Make sure bad packets are discarded,
|
** Make sure bad packets are discarded,
|
||||||
@ -724,10 +720,11 @@ ixl_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
|
|||||||
rxr->csum_errs += ixl_rx_checksum(ri, status, error, ptype);
|
rxr->csum_errs += ixl_rx_checksum(ri, status, error, ptype);
|
||||||
ri->iri_flowid = le32toh(cur->wb.qword0.hi_dword.rss);
|
ri->iri_flowid = le32toh(cur->wb.qword0.hi_dword.rss);
|
||||||
ri->iri_rsstype = ixl_ptype_to_hash(ptype);
|
ri->iri_rsstype = ixl_ptype_to_hash(ptype);
|
||||||
ri->iri_vtag = vtag;
|
if (status & (1 << I40E_RX_DESC_STATUS_L2TAG1P_SHIFT)) {
|
||||||
ri->iri_nfrags = i;
|
ri->iri_vtag = le16toh(cur->wb.qword0.lo_dword.l2tag1);
|
||||||
if (vtag)
|
|
||||||
ri->iri_flags |= M_VLANTAG;
|
ri->iri_flags |= M_VLANTAG;
|
||||||
|
}
|
||||||
|
ri->iri_nfrags = i;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user