mirror of
https://git.FreeBSD.org/src.git
synced 2024-10-19 02:29:40 +00:00
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
This commit is contained in:
parent
4471ff1196
commit
2d0a012712
@ -929,6 +929,7 @@ struct adapter {
|
||||
u_int vxlan_refcount;
|
||||
int rawf_base;
|
||||
int nrawf;
|
||||
u_int vlan_id;
|
||||
|
||||
struct taskqueue *tq[MAX_NPORTS]; /* General purpose taskqueues */
|
||||
struct port_info *port[MAX_NPORTS];
|
||||
|
@ -2086,9 +2086,17 @@ eth_rx(struct adapter *sc, struct sge_rxq *rxq, const struct iq_desc *d,
|
||||
}
|
||||
|
||||
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) {
|
||||
@ -5476,7 +5484,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;
|
||||
@ -5977,7 +5986,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;
|
||||
|
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user