net: fix net device address assign type
authorPiotr Gardocki <piotrx.gardocki@intel.com>
Wed, 21 Jun 2023 13:21:06 +0000 (15:21 +0200)
committerJakub Kicinski <kuba@kernel.org>
Fri, 23 Jun 2023 02:55:12 +0000 (19:55 -0700)
Commit ad72c4a06acc introduced optimization to return from function
quickly if the MAC address is not changing at all. It was reported
that such change causes dev->addr_assign_type to not change
to NET_ADDR_SET from _PERM or _RANDOM.
Restore the old behavior and skip only call to ndo_set_mac_address.

Fixes: ad72c4a06acc ("net: add check for current MAC address in dev_set_mac_address")
Reported-by: Gal Pressman <gal@nvidia.com>
Signed-off-by: Piotr Gardocki <piotrx.gardocki@intel.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Link: https://lore.kernel.org/r/20230621132106.991342-1-piotrx.gardocki@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/dev.c

index e4ff0ad..69a3e54 100644 (file)
@@ -8781,14 +8781,14 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
                return -EINVAL;
        if (!netif_device_present(dev))
                return -ENODEV;
-       if (!memcmp(dev->dev_addr, sa->sa_data, dev->addr_len))
-               return 0;
        err = dev_pre_changeaddr_notify(dev, sa->sa_data, extack);
        if (err)
                return err;
-       err = ops->ndo_set_mac_address(dev, sa);
-       if (err)
-               return err;
+       if (memcmp(dev->dev_addr, sa->sa_data, dev->addr_len)) {
+               err = ops->ndo_set_mac_address(dev, sa);
+               if (err)
+                       return err;
+       }
        dev->addr_assign_type = NET_ADDR_SET;
        call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
        add_device_randomness(dev->dev_addr, dev->addr_len);