mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
ix(4), ixv(4): VLAN tag stripping fixes for Amazon EC2 Enhanced Networking
From Piotr: ix(4), ixv(4): Add VLAN tag strip check when receiving packets ixv(4): Fix support for VLAN_HWTAGGING and VLAN_HWFILTER flags This change will prevent driver from passing VLAN tags when interface configuration is not expecting them. VF driver will check for VLAN_HWTAGGING and VLAN_HWFILTER flags and act adequately. This patch resolves problem occuring on EC2 platforms. Submitted by: Piotr Pietruszewski <piotr.pietruszewski@intel.com> Reported by: cperciva@ Reviewed by: cperciva@, Intel Networking Approved by: re Sponsored by: Intel Corporation Differential Revision: https://reviews.freebsd.org/D17061
This commit is contained in:
parent
26dfa867d2
commit
de35521a3b
2 changed files with 22 additions and 11 deletions
|
|
@ -1470,6 +1470,7 @@ ixv_initialize_receive_units(if_ctx_t ctx)
|
|||
static void
|
||||
ixv_setup_vlan_support(if_ctx_t ctx)
|
||||
{
|
||||
struct ifnet *ifp = iflib_get_ifp(ctx);
|
||||
struct adapter *adapter = iflib_get_softc(ctx);
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
u32 ctrl, vid, vfta, retry;
|
||||
|
|
@ -1483,18 +1484,27 @@ ixv_setup_vlan_support(if_ctx_t ctx)
|
|||
if (adapter->num_vlans == 0)
|
||||
return;
|
||||
|
||||
/* Enable the queues */
|
||||
for (int i = 0; i < adapter->num_rx_queues; i++) {
|
||||
ctrl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
|
||||
ctrl |= IXGBE_RXDCTL_VME;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), ctrl);
|
||||
/*
|
||||
* Let Rx path know that it needs to store VLAN tag
|
||||
* as part of extra mbuf info.
|
||||
*/
|
||||
adapter->rx_queues[i].rxr.vtag_strip = TRUE;
|
||||
if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) {
|
||||
/* Enable the queues */
|
||||
for (int i = 0; i < adapter->num_rx_queues; i++) {
|
||||
ctrl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
|
||||
ctrl |= IXGBE_RXDCTL_VME;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), ctrl);
|
||||
/*
|
||||
* Let Rx path know that it needs to store VLAN tag
|
||||
* as part of extra mbuf info.
|
||||
*/
|
||||
adapter->rx_queues[i].rxr.vtag_strip = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If filtering VLAN tags is disabled,
|
||||
* there is no need to fill VLAN Filter Table Array (VFTA).
|
||||
*/
|
||||
if ((ifp->if_capenable & IFCAP_VLAN_HWFILTER) == 0)
|
||||
return;
|
||||
|
||||
/*
|
||||
* A soft reset zero's out the VFTA, so
|
||||
* we need to repopulate it now.
|
||||
|
|
|
|||
|
|
@ -430,7 +430,8 @@ 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 (staterr & IXGBE_RXD_STAT_VP) {
|
||||
|
||||
if ( (rxr->vtag_strip) && (staterr & IXGBE_RXD_STAT_VP) ) {
|
||||
vtag = le16toh(rxd->wb.upper.vlan);
|
||||
} else {
|
||||
vtag = 0;
|
||||
|
|
|
|||
Loading…
Reference in a new issue