]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
i40e: Fix VF MAC filter removal
authorIvan Vecera <ivecera@redhat.com>
Fri, 29 Mar 2024 18:06:37 +0000 (11:06 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Apr 2024 14:35:52 +0000 (16:35 +0200)
commit ea2a1cfc3b2019bdea6324acd3c03606b60d71ad upstream.

Commit 73d9629e1c8c ("i40e: Do not allow untrusted VF to remove
administratively set MAC") fixed an issue where untrusted VF was
allowed to remove its own MAC address although this was assigned
administratively from PF. Unfortunately the introduced check
is wrong because it causes that MAC filters for other MAC addresses
including multi-cast ones are not removed.

<snip>
if (ether_addr_equal(addr, vf->default_lan_addr.addr) &&
    i40e_can_vf_change_mac(vf))
was_unimac_deleted = true;
else
continue;

if (i40e_del_mac_filter(vsi, al->list[i].addr)) {
...
</snip>

The else path with `continue` effectively skips any MAC filter
removal except one for primary MAC addr when VF is allowed to do so.
Fix the check condition so the `continue` is only done for primary
MAC address.

Fixes: 73d9629e1c8c ("i40e: Do not allow untrusted VF to remove administratively set MAC")
Signed-off-by: Ivan Vecera <ivecera@redhat.com>
Reviewed-by: Michal Schmidt <mschmidt@redhat.com>
Reviewed-by: Brett Creeley <brett.creeley@amd.com>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Link: https://lore.kernel.org/r/20240329180638.211412-1-anthony.l.nguyen@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c

index 082c0992099956e781355fb741c504978436f90c..8fb0a238824d8f48c40b8f817f4c244432030269 100644 (file)
@@ -3143,11 +3143,12 @@ static int i40e_vc_del_mac_addr_msg(struct i40e_vf *vf, u8 *msg)
                /* Allow to delete VF primary MAC only if it was not set
                 * administratively by PF or if VF is trusted.
                 */
-               if (ether_addr_equal(addr, vf->default_lan_addr.addr) &&
-                   i40e_can_vf_change_mac(vf))
-                       was_unimac_deleted = true;
-               else
-                       continue;
+               if (ether_addr_equal(addr, vf->default_lan_addr.addr)) {
+                       if (i40e_can_vf_change_mac(vf))
+                               was_unimac_deleted = true;
+                       else
+                               continue;
+               }
 
                if (i40e_del_mac_filter(vsi, al->list[i].addr)) {
                        ret = -EINVAL;