mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 05:55:44 +02:00
igb: Fix removal of unicast MAC filters of VFs
[ Upstream commit584af82154] 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:1b8b062a99("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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
12c1938870
commit
ddac50d04f
|
|
@ -7654,6 +7654,20 @@ static int igb_set_vf_mac_filter(struct igb_adapter *adapter, const int vf,
|
||||||
struct vf_mac_filter *entry = NULL;
|
struct vf_mac_filter *entry = NULL;
|
||||||
int ret = 0;
|
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) {
|
switch (info) {
|
||||||
case E1000_VF_MAC_FILTER_CLR:
|
case E1000_VF_MAC_FILTER_CLR:
|
||||||
/* remove all unicast MAC filters related to the current VF */
|
/* remove all unicast MAC filters related to the current VF */
|
||||||
|
|
@ -7667,20 +7681,6 @@ static int igb_set_vf_mac_filter(struct igb_adapter *adapter, const int vf,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case E1000_VF_MAC_FILTER_ADD:
|
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 */
|
/* try to find empty slot in the list */
|
||||||
list_for_each(pos, &adapter->vf_macs.l) {
|
list_for_each(pos, &adapter->vf_macs.l) {
|
||||||
entry = list_entry(pos, struct vf_mac_filter, l);
|
entry = list_entry(pos, struct vf_mac_filter, l);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user