Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci/ixgbe Add PROMISC support.



details:   https://anonhg.NetBSD.org/src/rev/325e32a4f685
branches:  trunk
changeset: 965333:325e32a4f685
user:      msaitoh <msaitoh%NetBSD.org@localhost>
date:      Fri Sep 13 08:09:24 2019 +0000

description:
Add PROMISC support.

diffstat:

 sys/dev/pci/ixgbe/ixv.c |  75 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 74 insertions(+), 1 deletions(-)

diffs (115 lines):

diff -r b3e7b522ea3d -r 325e32a4f685 sys/dev/pci/ixgbe/ixv.c
--- a/sys/dev/pci/ixgbe/ixv.c   Fri Sep 13 07:55:05 2019 +0000
+++ b/sys/dev/pci/ixgbe/ixv.c   Fri Sep 13 08:09:24 2019 +0000
@@ -1,4 +1,4 @@
-/*$NetBSD: ixv.c,v 1.136 2019/09/13 07:55:07 msaitoh Exp $*/
+/*$NetBSD: ixv.c,v 1.137 2019/09/13 08:09:24 msaitoh Exp $*/
 
 /******************************************************************************
 
@@ -112,6 +112,7 @@
 
 static void    ixv_enable_intr(struct adapter *);
 static void    ixv_disable_intr(struct adapter *);
+static int     ixv_set_promisc(struct adapter *);
 static void    ixv_set_multi(struct adapter *);
 static void    ixv_update_link_status(struct adapter *);
 static int     ixv_sysctl_debug(SYSCTLFN_PROTO);
@@ -1074,6 +1075,69 @@
        return (0);
 } /* ixv_media_change */
 
+/************************************************************************
+ * ixv_set_promisc
+ ************************************************************************/
+static int
+ixv_set_promisc(struct adapter *adapter)
+{
+       struct ifnet *ifp = adapter->ifp;
+       struct ixgbe_hw *hw = &adapter->hw;
+       struct ethercom *ec = &adapter->osdep.ec;
+       int error = 0;
+
+       KASSERT(mutex_owned(&adapter->core_mtx));
+       if (ifp->if_flags & IFF_PROMISC) {
+               error = hw->mac.ops.update_xcast_mode(hw,
+                   IXGBEVF_XCAST_MODE_PROMISC);
+               if (error == IXGBE_ERR_NOT_TRUSTED) {
+                       device_printf(adapter->dev,
+                           "this interface is not trusted\n");
+                       error = EPERM;
+               } else if (error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) {
+                       device_printf(adapter->dev,
+                           "the PF doesn't support promisc mode\n");
+                       error = EOPNOTSUPP;
+               } else if (error) {
+                       device_printf(adapter->dev,
+                           "failed to set promisc mode. error = %d\n",
+                           error);
+                       error = EIO;
+               }
+       } else if (ec->ec_flags & ETHER_F_ALLMULTI) {
+               error = hw->mac.ops.update_xcast_mode(hw,
+                   IXGBEVF_XCAST_MODE_ALLMULTI);
+               if (error == IXGBE_ERR_NOT_TRUSTED) {
+                       device_printf(adapter->dev,
+                           "this interface is not trusted\n");
+                       error = EPERM;
+               } else if (error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) {
+                       device_printf(adapter->dev,
+                           "the PF doesn't support allmulti mode\n");
+                       error = EOPNOTSUPP;
+               } else if (error) {
+                       device_printf(adapter->dev,
+                           "failed to set allmulti mode. error = %d\n",
+                           error);
+                       error = EIO;
+               }
+       } else {
+               error = hw->mac.ops.update_xcast_mode(hw,
+                   IXGBEVF_XCAST_MODE_MULTI);
+               if (error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) {
+                       /* normal operation */
+                       error = 0;
+               } else if (error) {
+                       device_printf(adapter->dev,
+                           "failed to chane filtering mode to normal. "
+                           "error = %d\n", error);
+                       error = EIO;
+               }
+               ec->ec_flags &= ~ETHER_F_ALLMULTI;
+       }
+
+       return error;
+} /* ixv_set_promisc */
 
 /************************************************************************
  * ixv_negotiate_api
@@ -2905,11 +2969,13 @@
 {
        struct ifnet *ifp = &ec->ec_if;
        struct adapter *adapter = ifp->if_softc;
+       u_short saved_flags;
        u_short change;
        int rv = 0;
 
        IXGBE_CORE_LOCK(adapter);
 
+       saved_flags = adapter->if_flags;
        change = ifp->if_flags ^ adapter->if_flags;
        if (change != 0)
                adapter->if_flags = ifp->if_flags;
@@ -2917,6 +2983,13 @@
        if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
                rv = ENETRESET;
                goto out;
+       } else if ((change & IFF_PROMISC) != 0) {
+               rv = ixv_set_promisc(adapter);
+               if (rv != 0) {
+                       /* Restore previous */
+                       adapter->if_flags = saved_flags;
+                       goto out;
+               }
        }
 
        /* Check for ec_capenable. */



Home | Main Index | Thread Index | Old Index