net: dev: Add extack argument to dev_set_mac_address()
authorPetr Machata <petrm@mellanox.com>
Thu, 13 Dec 2018 11:54:30 +0000 (11:54 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 14 Dec 2018 02:41:38 +0000 (18:41 -0800)
A follow-up patch will add a notifier type NETDEV_PRE_CHANGEADDR, which
allows vetoing of MAC address changes. One prominent path to that
notification is through dev_set_mac_address(). Therefore give this
function an extack argument, so that it can be packed together with the
notification. Thus a textual reason for rejection (or a warning) can be
communicated back to the user.

Signed-off-by: Petr Machata <petrm@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
13 files changed:
drivers/net/bonding/bond_alb.c
drivers/net/bonding/bond_main.c
drivers/net/hyperv/netvsc_drv.c
drivers/net/macvlan.c
drivers/net/tap.c
drivers/net/team/team.c
drivers/net/tun.c
drivers/usb/gadget/function/u_ether.c
include/linux/netdevice.h
net/core/dev.c
net/core/dev_ioctl.c
net/core/rtnetlink.c
net/ieee802154/nl-phy.c

index e82108c917a635f036a9e86eeeed5d09c9cbbf53..9431127bbc6030666519bd58673f55959a571443 100644 (file)
@@ -1031,7 +1031,7 @@ static int alb_set_slave_mac_addr(struct slave *slave, u8 addr[],
         */
        memcpy(ss.__data, addr, len);
        ss.ss_family = dev->type;
-       if (dev_set_mac_address(dev, (struct sockaddr *)&ss)) {
+       if (dev_set_mac_address(dev, (struct sockaddr *)&ss, NULL)) {
                netdev_err(slave->bond->dev, "dev_set_mac_address of dev %s failed! ALB mode requires that the base driver support setting the hw address also when the network device's interface is open\n",
                           dev->name);
                return -EOPNOTSUPP;
@@ -1250,7 +1250,7 @@ static int alb_set_mac_address(struct bonding *bond, void *addr)
                bond_hw_addr_copy(tmp_addr, slave->dev->dev_addr,
                                  slave->dev->addr_len);
 
-               res = dev_set_mac_address(slave->dev, addr);
+               res = dev_set_mac_address(slave->dev, addr, NULL);
 
                /* restore net_device's hw address */
                bond_hw_addr_copy(slave->dev->dev_addr, tmp_addr,
@@ -1273,7 +1273,7 @@ unwind:
                bond_hw_addr_copy(tmp_addr, rollback_slave->dev->dev_addr,
                                  rollback_slave->dev->addr_len);
                dev_set_mac_address(rollback_slave->dev,
-                                   (struct sockaddr *)&ss);
+                                   (struct sockaddr *)&ss, NULL);
                bond_hw_addr_copy(rollback_slave->dev->dev_addr, tmp_addr,
                                  rollback_slave->dev->addr_len);
        }
@@ -1732,7 +1732,8 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave
                                  bond->dev->addr_len);
                ss.ss_family = bond->dev->type;
                /* we don't care if it can't change its mac, best effort */
-               dev_set_mac_address(new_slave->dev, (struct sockaddr *)&ss);
+               dev_set_mac_address(new_slave->dev, (struct sockaddr *)&ss,
+                                   NULL);
 
                bond_hw_addr_copy(new_slave->dev->dev_addr, tmp_addr,
                                  new_slave->dev->addr_len);
index 6b34dbefa7dd2bfe6f21a0b618ef485e6eb69448..06039be630342542b4b01645363d4b7ba254d602 100644 (file)
@@ -680,7 +680,7 @@ static void bond_do_fail_over_mac(struct bonding *bond,
                }
 
                rv = dev_set_mac_address(new_active->dev,
-                                        (struct sockaddr *)&ss);
+                                        (struct sockaddr *)&ss, NULL);
                if (rv) {
                        netdev_err(bond->dev, "Error %d setting MAC of slave %s\n",
                                   -rv, new_active->dev->name);
@@ -695,7 +695,7 @@ static void bond_do_fail_over_mac(struct bonding *bond,
                ss.ss_family = old_active->dev->type;
 
                rv = dev_set_mac_address(old_active->dev,
-                                        (struct sockaddr *)&ss);
+                                        (struct sockaddr *)&ss, NULL);
                if (rv)
                        netdev_err(bond->dev, "Error %d setting MAC of slave %s\n",
                                   -rv, new_active->dev->name);
@@ -1527,7 +1527,8 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
                 */
                memcpy(ss.__data, bond_dev->dev_addr, bond_dev->addr_len);
                ss.ss_family = slave_dev->type;
-               res = dev_set_mac_address(slave_dev, (struct sockaddr *)&ss);
+               res = dev_set_mac_address(slave_dev, (struct sockaddr *)&ss,
+                                         extack);
                if (res) {
                        netdev_dbg(bond_dev, "Error %d calling set_mac_address\n", res);
                        goto err_restore_mtu;
@@ -1818,7 +1819,7 @@ err_restore_mac:
                bond_hw_addr_copy(ss.__data, new_slave->perm_hwaddr,
                                  new_slave->dev->addr_len);
                ss.ss_family = slave_dev->type;
-               dev_set_mac_address(slave_dev, (struct sockaddr *)&ss);
+               dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, NULL);
        }
 
 err_restore_mtu:
@@ -1999,7 +2000,7 @@ static int __bond_release_one(struct net_device *bond_dev,
                bond_hw_addr_copy(ss.__data, slave->perm_hwaddr,
                                  slave->dev->addr_len);
                ss.ss_family = slave_dev->type;
-               dev_set_mac_address(slave_dev, (struct sockaddr *)&ss);
+               dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, NULL);
        }
 
        if (unregister)
@@ -3732,7 +3733,7 @@ static int bond_set_mac_address(struct net_device *bond_dev, void *addr)
 
        bond_for_each_slave(bond, slave, iter) {
                netdev_dbg(bond_dev, "slave %p %s\n", slave, slave->dev->name);
-               res = dev_set_mac_address(slave->dev, addr);
+               res = dev_set_mac_address(slave->dev, addr, NULL);
                if (res) {
                        /* TODO: consider downing the slave
                         * and retry ?
@@ -3761,7 +3762,7 @@ unwind:
                        break;
 
                tmp_res = dev_set_mac_address(rollback_slave->dev,
-                                             (struct sockaddr *)&tmp_ss);
+                                             (struct sockaddr *)&tmp_ss, NULL);
                if (tmp_res) {
                        netdev_dbg(bond_dev, "unwind err %d dev %s\n",
                                   tmp_res, rollback_slave->dev->name);
index 18b5584d63779f54306cb65341307c3bd00bf237..91ed15ea58835c6704838c69ada7b5b0c98b6715 100644 (file)
@@ -1247,7 +1247,7 @@ static int netvsc_set_mac_addr(struct net_device *ndev, void *p)
                return -ENODEV;
 
        if (vf_netdev) {
-               err = dev_set_mac_address(vf_netdev, addr);
+               err = dev_set_mac_address(vf_netdev, addr, NULL);
                if (err)
                        return err;
        }
@@ -1258,7 +1258,7 @@ static int netvsc_set_mac_addr(struct net_device *ndev, void *p)
        } else if (vf_netdev) {
                /* rollback change on VF */
                memcpy(addr->sa_data, ndev->dev_addr, ETH_ALEN);
-               dev_set_mac_address(vf_netdev, addr);
+               dev_set_mac_address(vf_netdev, addr, NULL);
        }
 
        return err;
index 0da3d36b283becf838bed9357c0520e0714529e5..fc726ce4c164efaa30e713529f217a40c548a9ec 100644 (file)
@@ -744,7 +744,7 @@ static int macvlan_set_mac_address(struct net_device *dev, void *p)
 
        if (vlan->mode == MACVLAN_MODE_PASSTHRU) {
                macvlan_set_addr_change(vlan->port);
-               return dev_set_mac_address(vlan->lowerdev, addr);
+               return dev_set_mac_address(vlan->lowerdev, addr, NULL);
        }
 
        if (macvlan_addr_busy(vlan->port, addr->sa_data))
@@ -1213,7 +1213,7 @@ static void macvlan_port_destroy(struct net_device *dev)
 
                sa.sa_family = port->dev->type;
                memcpy(&sa.sa_data, port->perm_addr, port->dev->addr_len);
-               dev_set_mac_address(port->dev, &sa);
+               dev_set_mac_address(port->dev, &sa, NULL);
        }
 
        kfree(port);
index f03004f37eca600b25120b892400f1045f9576d6..443b2694130cda32682436931b67e3de73ee7645 100644 (file)
@@ -1113,7 +1113,7 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
                        rtnl_unlock();
                        return -ENOLINK;
                }
-               ret = dev_set_mac_address(tap->dev, &sa);
+               ret = dev_set_mac_address(tap->dev, &sa, NULL);
                tap_put_tap_dev(tap);
                rtnl_unlock();
                return ret;
index 93576e0240dd49f758b490a09731edb278a28c97..afd9d25d19924dcf5b343d23917d4cd6dc878d9b 100644 (file)
@@ -59,7 +59,7 @@ static int __set_port_dev_addr(struct net_device *port_dev,
 
        memcpy(addr.__data, dev_addr, port_dev->addr_len);
        addr.ss_family = port_dev->type;
-       return dev_set_mac_address(port_dev, (struct sockaddr *)&addr);
+       return dev_set_mac_address(port_dev, (struct sockaddr *)&addr, NULL);
 }
 
 static int team_port_set_orig_dev_addr(struct team_port *port)
index ea528248d7d022244ce937a282c6a578b8147c80..72577aa35b06018781b7abd5a29e3b37b1b4037b 100644 (file)
@@ -3202,7 +3202,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
                tun_debug(KERN_DEBUG, tun, "set hw address: %pM\n",
                          ifr.ifr_hwaddr.sa_data);
 
-               ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr);
+               ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr, NULL);
                break;
 
        case TUNGETSNDBUF:
index 0f026d445e316aec85c3dbcdbcb79700e39401ed..737bd77a575daa3fa0e83fdde8de806870647b65 100644 (file)
@@ -879,7 +879,7 @@ int gether_register_netdev(struct net_device *net)
        sa.sa_family = net->type;
        memcpy(sa.sa_data, dev->dev_mac, ETH_ALEN);
        rtnl_lock();
-       status = dev_set_mac_address(net, &sa);
+       status = dev_set_mac_address(net, &sa, NULL);
        rtnl_unlock();
        if (status)
                pr_warn("cannot set self ethernet address: %d\n", status);
index 36ca5f50f8226f1469eed58e38e57681f8179b4a..d89875ec21ac7a810b47896f5951dcb14d865391 100644 (file)
@@ -3628,7 +3628,8 @@ int dev_set_mtu_ext(struct net_device *dev, int mtu,
 int dev_set_mtu(struct net_device *, int);
 int dev_change_tx_queue_len(struct net_device *, unsigned long);
 void dev_set_group(struct net_device *, int);
-int dev_set_mac_address(struct net_device *, struct sockaddr *);
+int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
+                       struct netlink_ext_ack *extack);
 int dev_change_carrier(struct net_device *, bool new_carrier);
 int dev_get_phys_port_id(struct net_device *dev,
                         struct netdev_phys_item_id *ppid);
index 7542848733554c33b79a433de2597c2c8933bc2f..7250a3a73fa4a9300941f8785a85431e1cceaf6d 100644 (file)
@@ -7759,10 +7759,12 @@ EXPORT_SYMBOL(dev_set_group);
  *     dev_set_mac_address - Change Media Access Control Address
  *     @dev: device
  *     @sa: new address
+ *     @extack: netlink extended ack
  *
  *     Change the hardware (MAC) address of the device
  */
-int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa)
+int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
+                       struct netlink_ext_ack *extack)
 {
        const struct net_device_ops *ops = dev->netdev_ops;
        int err;
index da273ec3cc571d09dc2998bb12b7f12c384e0120..31380fd5a4e2ace4736384c3f182381768e3e0d5 100644 (file)
@@ -246,7 +246,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd)
        case SIOCSIFHWADDR:
                if (dev->addr_len > sizeof(struct sockaddr))
                        return -EINVAL;
-               return dev_set_mac_address(dev, &ifr->ifr_hwaddr);
+               return dev_set_mac_address(dev, &ifr->ifr_hwaddr, NULL);
 
        case SIOCSIFHWBROADCAST:
                if (ifr->ifr_hwaddr.sa_family != dev->type)
index 3b6e551f9e694b92153badca8e564f1bd1b7ea75..f8bdb8adab2cd5960c82d6a7f0cf78abf26e2556 100644 (file)
@@ -2444,7 +2444,7 @@ static int do_setlink(const struct sk_buff *skb,
                sa->sa_family = dev->type;
                memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]),
                       dev->addr_len);
-               err = dev_set_mac_address(dev, sa);
+               err = dev_set_mac_address(dev, sa, extack);
                kfree(sa);
                if (err)
                        goto errout;
index b231e40f006a696b7d2bf20f1eaecb0e501f6bbb..0c25c0bcc4da6edf8500815f7b1c0d0097cc58db 100644 (file)
@@ -242,7 +242,7 @@ int ieee802154_add_iface(struct sk_buff *skb, struct genl_info *info)
                 * dev_set_mac_address require RTNL_LOCK
                 */
                rtnl_lock();
-               rc = dev_set_mac_address(dev, &addr);
+               rc = dev_set_mac_address(dev, &addr, NULL);
                rtnl_unlock();
                if (rc)
                        goto dev_unregister;