svn commit: r338593 - head/sys/dev/ixgbe

Eric Joyner erj at FreeBSD.org
Tue Sep 11 18:33:44 UTC 2018


Author: erj
Date: Tue Sep 11 18:33:43 2018
New Revision: 338593
URL: https://svnweb.freebsd.org/changeset/base/338593

Log:
  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 at intel.com>
  Reported by:	cperciva@
  Reviewed by:	cperciva@, Intel Networking
  Approved by:	re
  Sponsored by:	Intel Corporation
  Differential Revision:	https://reviews.freebsd.org/D17061

Modified:
  head/sys/dev/ixgbe/if_ixv.c
  head/sys/dev/ixgbe/ix_txrx.c

Modified: head/sys/dev/ixgbe/if_ixv.c
==============================================================================
--- head/sys/dev/ixgbe/if_ixv.c	Tue Sep 11 18:31:57 2018	(r338592)
+++ head/sys/dev/ixgbe/if_ixv.c	Tue Sep 11 18:33:43 2018	(r338593)
@@ -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,17 +1484,26 @@ 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

Modified: head/sys/dev/ixgbe/ix_txrx.c
==============================================================================
--- head/sys/dev/ixgbe/ix_txrx.c	Tue Sep 11 18:31:57 2018	(r338592)
+++ head/sys/dev/ixgbe/ix_txrx.c	Tue Sep 11 18:33:43 2018	(r338593)
@@ -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;


More information about the svn-src-all mailing list