]> git.baikalelectronics.ru Git - kernel.git/commitdiff
igb: Fix removal of unicast MAC filters of VFs
authorKaren Sornek <karen.sornek@intel.com>
Tue, 31 Aug 2021 11:16:35 +0000 (13:16 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Wed, 15 Dec 2021 19:08:18 +0000 (11:08 -0800)
Move checking condition of VF MAC filter before clearing
or adding MAC filter to VF to prevent potential blackout caused
by removal of necessary and working VF's MAC filter.

Fixes: 089e281baef6 ("igb: add VF trust infrastructure")
Signed-off-by: Karen Sornek <karen.sornek@intel.com>
Tested-by: Konrad Jankowski <konrad0.jankowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/igb/igb_main.c

index fd54d3ef890bc191503d5ace25e91ead932a2098..b597b8bfb9103bff34e4eb61a46dc47cc24aecec 100644 (file)
@@ -7648,6 +7648,20 @@ static int igb_set_vf_mac_filter(struct igb_adapter *adapter, const int vf,
        struct vf_mac_filter *entry = NULL;
        int ret = 0;
 
+       if ((vf_data->flags & IGB_VF_FLAG_PF_SET_MAC) &&
+           !vf_data->trusted) {
+               dev_warn(&pdev->dev,
+                        "VF %d requested MAC filter but is administratively denied\n",
+                         vf);
+               return -EINVAL;
+       }
+       if (!is_valid_ether_addr(addr)) {
+               dev_warn(&pdev->dev,
+                        "VF %d attempted to set invalid MAC filter\n",
+                         vf);
+               return -EINVAL;
+       }
+
        switch (info) {
        case E1000_VF_MAC_FILTER_CLR:
                /* remove all unicast MAC filters related to the current VF */
@@ -7661,20 +7675,6 @@ static int igb_set_vf_mac_filter(struct igb_adapter *adapter, const int vf,
                }
                break;
        case E1000_VF_MAC_FILTER_ADD:
-               if ((vf_data->flags & IGB_VF_FLAG_PF_SET_MAC) &&
-                   !vf_data->trusted) {
-                       dev_warn(&pdev->dev,
-                                "VF %d requested MAC filter but is administratively denied\n",
-                                vf);
-                       return -EINVAL;
-               }
-               if (!is_valid_ether_addr(addr)) {
-                       dev_warn(&pdev->dev,
-                                "VF %d attempted to set invalid MAC filter\n",
-                                vf);
-                       return -EINVAL;
-               }
-
                /* try to find empty slot in the list */
                list_for_each(pos, &adapter->vf_macs.l) {
                        entry = list_entry(pos, struct vf_mac_filter, l);