Skip to content

Commit

Permalink
net: iflib: fix vlan processing in the drivers
Browse files Browse the repository at this point in the history
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

(cherry picked from commit f7926a6)
  • Loading branch information
Vincenzo Maffione authored and Vincenzo Maffione committed Jan 27, 2022
1 parent e99828d commit 05c9fb0
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 50 deletions.
11 changes: 4 additions & 7 deletions sys/dev/e1000/em_txrx.c
Original file line number Diff line number Diff line change
Expand Up @@ -671,9 +671,9 @@ em_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
u32 pkt_info;
u32 staterr = 0;
bool eop;
int i, cidx, vtag;
int i, cidx;

i = vtag = 0;
i = 0;
cidx = ri->iri_cidx;

do {
Expand Down Expand Up @@ -710,12 +710,9 @@ em_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
em_receive_checksum(staterr, staterr >> 24, ri);

if (staterr & E1000_RXD_STAT_VP) {
vtag = le16toh(rxd->wb.upper.vlan);
}

ri->iri_vtag = vtag;
if (vtag)
ri->iri_vtag = le16toh(rxd->wb.upper.vlan);
ri->iri_flags |= M_VLANTAG;
}

ri->iri_flowid = le32toh(rxd->wb.lower.hi_dword.rss);
ri->iri_rsstype = em_determine_rsstype(pkt_info);
Expand Down
21 changes: 9 additions & 12 deletions sys/dev/e1000/igb_txrx.c
Original file line number Diff line number Diff line change
Expand Up @@ -436,12 +436,12 @@ igb_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
struct rx_ring *rxr = &que->rxr;
union e1000_adv_rx_desc *rxd;

uint16_t pkt_info, len, vtag;
uint16_t pkt_info, len;
uint32_t ptype, staterr;
int i, cidx;
bool eop;

staterr = i = vtag = 0;
staterr = i = 0;
cidx = ri->iri_cidx;

do {
Expand All @@ -460,13 +460,6 @@ igb_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
rxd->wb.upper.status_error = 0;
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 */
if (eop && ((staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) != 0)) {
sc->dropped_pkts++;
Expand Down Expand Up @@ -495,9 +488,13 @@ igb_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
if ((scctx->isc_capenable & IFCAP_RXCSUM) != 0)
igb_rx_checksum(staterr, ri, ptype);

if ((scctx->isc_capenable & IFCAP_VLAN_HWTAGGING) != 0 &&
(staterr & E1000_RXD_STAT_VP) != 0) {
ri->iri_vtag = vtag;
if (staterr & E1000_RXD_STAT_VP) {
if (((sc->hw.mac.type == e1000_i350) ||
(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;
}

Expand Down
13 changes: 5 additions & 8 deletions sys/dev/ice/ice_iflib_txrx.c
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ ice_ift_rxd_pkt_get(void *arg, if_rxd_info_t ri)
if_softc_ctx_t scctx = sc->scctx;
struct ice_rx_queue *rxq = &sc->pf_vsi.rx_queues[ri->iri_qsidx];
union ice_32b_rx_flex_desc *cur;
u16 status0, plen, vtag, ptype;
u16 status0, plen, ptype;
bool eop;
size_t cidx;
int i;
Expand All @@ -310,10 +310,6 @@ ice_ift_rxd_pkt_get(void *arg, if_rxd_info_t ri)

cur->wb.status_error0 = 0;
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.
Expand All @@ -340,10 +336,11 @@ ice_ift_rxd_pkt_get(void *arg, if_rxd_info_t ri)
&ri->iri_csum_data, status0, ptype);
ri->iri_flowid = le32toh(RX_FLEX_NIC(&cur->wb, rss_hash));
ri->iri_rsstype = ice_ptype_to_hash(ptype);
ri->iri_vtag = vtag;
ri->iri_nfrags = i;
if (vtag)
if (status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_L2TAG1P_S)) {
ri->iri_vtag = le16toh(cur->wb.l2tag1);
ri->iri_flags |= M_VLANTAG;
}
ri->iri_nfrags = i;
return (0);
}

Expand Down
8 changes: 3 additions & 5 deletions sys/dev/igc/igc_txrx.c
Original file line number Diff line number Diff line change
Expand Up @@ -461,12 +461,12 @@ igc_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
struct rx_ring *rxr = &que->rxr;
union igc_adv_rx_desc *rxd;

uint16_t pkt_info, len, vtag;
uint16_t pkt_info, len;
uint32_t ptype, staterr;
int i, cidx;
bool eop;

staterr = i = vtag = 0;
staterr = i = 0;
cidx = ri->iri_cidx;

do {
Expand All @@ -485,8 +485,6 @@ igc_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
rxd->wb.upper.status_error = 0;
eop = ((staterr & IGC_RXD_STAT_EOP) == IGC_RXD_STAT_EOP);

vtag = le16toh(rxd->wb.upper.vlan);

/* Make sure bad packets are discarded */
if (eop && ((staterr & IGC_RXDEXT_STATERR_RXE) != 0)) {
adapter->dropped_pkts++;
Expand Down Expand Up @@ -517,7 +515,7 @@ igc_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)

if ((scctx->isc_capenable & IFCAP_VLAN_HWTAGGING) != 0 &&
(staterr & IGC_RXD_STAT_VP) != 0) {
ri->iri_vtag = vtag;
ri->iri_vtag = le16toh(rxd->wb.upper.vlan);
ri->iri_flags |= M_VLANTAG;
}

Expand Down
15 changes: 5 additions & 10 deletions sys/dev/ixgbe/ix_txrx.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,6 @@ ixgbe_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
union ixgbe_adv_rx_desc *rxd;

uint16_t pkt_info, len, cidx, i;
uint16_t vtag = 0;
uint32_t ptype;
uint32_t staterr = 0;
bool eop;
Expand All @@ -424,12 +423,6 @@ ixgbe_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
rxd->wb.upper.status_error = 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 */
if (eop && (staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK) != 0) {
if (sc->feat_en & IXGBE_FEATURE_VF)
Expand Down Expand Up @@ -463,10 +456,12 @@ ixgbe_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
else
ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH;
}
ri->iri_vtag = vtag;
ri->iri_nfrags = i;
if (vtag)
if ((rxr->vtag_strip) && (staterr & IXGBE_RXD_STAT_VP)) {
ri->iri_vtag = le16toh(rxd->wb.upper.vlan);
ri->iri_flags |= M_VLANTAG;
}

ri->iri_nfrags = i;
return (0);
} /* ixgbe_isc_rxd_pkt_get */

Expand Down
13 changes: 5 additions & 8 deletions sys/dev/ixl/ixl_txrx.c
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,7 @@ ixl_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
struct rx_ring *rxr = &que->rxr;
union i40e_rx_desc *cur;
u32 status, error;
u16 plen, vtag;
u16 plen;
u64 qword;
u8 ptype;
bool eop;
Expand Down Expand Up @@ -694,10 +694,6 @@ ixl_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)

cur->wb.qword1.status_error_len = 0;
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,
Expand All @@ -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);
ri->iri_flowid = le32toh(cur->wb.qword0.hi_dword.rss);
ri->iri_rsstype = ixl_ptype_to_hash(ptype);
ri->iri_vtag = vtag;
ri->iri_nfrags = i;
if (vtag)
if (status & (1 << I40E_RX_DESC_STATUS_L2TAG1P_SHIFT)) {
ri->iri_vtag = le16toh(cur->wb.qword0.lo_dword.l2tag1);
ri->iri_flags |= M_VLANTAG;
}
ri->iri_nfrags = i;
return (0);
}

Expand Down

0 comments on commit 05c9fb0

Please sign in to comment.