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.pietruszew...@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;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to