cxgbev(4): Pay attention to the VLAN configuration for the VF.

Make sure that the transmit traffic is tagged correctly or else the
firmware will refuse to transmit and will report an ACL violation.

On receive the hardware will make sure that tagged traffic is delivered
to the appropriate VM.  The driver only asserts that the VLAN id that
was extracted from the wire traffic matches the VF's configuration.

All this works when associating a specific VLAN id with a VF.  The
'trunk' setting likely needs more work.

MFC after:	1 week
Sponsored by:	Chelsio Communications

(cherry picked from commit 2d0a01271223ce623c78f5c8236f8f3f4b6ef104)
This commit is contained in:
Navdeep Parhar 2024-06-17 10:11:16 -07:00 committed by Kristof Provost
parent 5d49a46b84
commit 536a452cc4
3 changed files with 18 additions and 5 deletions

View file

@ -928,6 +928,7 @@ struct adapter {
u_int vxlan_refcount;
int rawf_base;
int nrawf;
u_int vlan_id;
struct taskqueue *tq[MAX_NCHAN]; /* General purpose taskqueues */
struct port_info *port[MAX_NPORTS];

View file

@ -2086,9 +2086,17 @@ have_mbuf:
}
if (cpl->vlan_ex) {
m0->m_pkthdr.ether_vtag = be16toh(cpl->vlan);
m0->m_flags |= M_VLANTAG;
rxq->vlan_extraction++;
if (sc->flags & IS_VF && sc->vlan_id) {
/*
* HW is not setup correctly if extracted vlan_id does
* not match the VF's setting.
*/
MPASS(be16toh(cpl->vlan) == sc->vlan_id);
} else {
m0->m_pkthdr.ether_vtag = be16toh(cpl->vlan);
m0->m_flags |= M_VLANTAG;
rxq->vlan_extraction++;
}
}
if (rxq->iq.flags & IQ_RX_TIMESTAMP) {
@ -5477,7 +5485,8 @@ write_txpkt_vm_wr(struct adapter *sc, struct sge_txq *txq, struct mbuf *m0)
ctrl1 |= F_TXPKT_VLAN_VLD |
V_TXPKT_VLAN(m0->m_pkthdr.ether_vtag);
txq->vlan_insertion++;
}
} else if (sc->vlan_id)
ctrl1 |= F_TXPKT_VLAN_VLD | V_TXPKT_VLAN(sc->vlan_id);
/* CPL header */
cpl->ctrl0 = txq->cpl_ctrl0;
@ -5978,7 +5987,8 @@ write_txpkts_vm_wr(struct adapter *sc, struct sge_txq *txq)
ctrl1 |= F_TXPKT_VLAN_VLD |
V_TXPKT_VLAN(m->m_pkthdr.ether_vtag);
txq->vlan_insertion++;
}
} else if (sc->vlan_id)
ctrl1 |= F_TXPKT_VLAN_VLD | V_TXPKT_VLAN(sc->vlan_id);
/* CPL header */
cpl->ctrl0 = txq->cpl_ctrl0;

View file

@ -660,6 +660,8 @@ t4vf_attach(device_t dev)
t4_os_set_hw_addr(pi, mac);
pmask &= ~(1 << p);
sc->vlan_id = t4vf_get_vf_vlan(sc);
/* No t4_link_start. */
snprintf(pi->lockname, sizeof(pi->lockname), "%sp%d",