Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: dev: Add extack argument to dev_set_mac_address()

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>

authored by

Petr Machata and committed by
David S. Miller
3a37a963 95302c39

+29 -24
+5 -4
drivers/net/bonding/bond_alb.c
··· 1031 1031 */ 1032 1032 memcpy(ss.__data, addr, len); 1033 1033 ss.ss_family = dev->type; 1034 - if (dev_set_mac_address(dev, (struct sockaddr *)&ss)) { 1034 + if (dev_set_mac_address(dev, (struct sockaddr *)&ss, NULL)) { 1035 1035 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", 1036 1036 dev->name); 1037 1037 return -EOPNOTSUPP; ··· 1250 1250 bond_hw_addr_copy(tmp_addr, slave->dev->dev_addr, 1251 1251 slave->dev->addr_len); 1252 1252 1253 - res = dev_set_mac_address(slave->dev, addr); 1253 + res = dev_set_mac_address(slave->dev, addr, NULL); 1254 1254 1255 1255 /* restore net_device's hw address */ 1256 1256 bond_hw_addr_copy(slave->dev->dev_addr, tmp_addr, ··· 1273 1273 bond_hw_addr_copy(tmp_addr, rollback_slave->dev->dev_addr, 1274 1274 rollback_slave->dev->addr_len); 1275 1275 dev_set_mac_address(rollback_slave->dev, 1276 - (struct sockaddr *)&ss); 1276 + (struct sockaddr *)&ss, NULL); 1277 1277 bond_hw_addr_copy(rollback_slave->dev->dev_addr, tmp_addr, 1278 1278 rollback_slave->dev->addr_len); 1279 1279 } ··· 1732 1732 bond->dev->addr_len); 1733 1733 ss.ss_family = bond->dev->type; 1734 1734 /* we don't care if it can't change its mac, best effort */ 1735 - dev_set_mac_address(new_slave->dev, (struct sockaddr *)&ss); 1735 + dev_set_mac_address(new_slave->dev, (struct sockaddr *)&ss, 1736 + NULL); 1736 1737 1737 1738 bond_hw_addr_copy(new_slave->dev->dev_addr, tmp_addr, 1738 1739 new_slave->dev->addr_len);
+8 -7
drivers/net/bonding/bond_main.c
··· 680 680 } 681 681 682 682 rv = dev_set_mac_address(new_active->dev, 683 - (struct sockaddr *)&ss); 683 + (struct sockaddr *)&ss, NULL); 684 684 if (rv) { 685 685 netdev_err(bond->dev, "Error %d setting MAC of slave %s\n", 686 686 -rv, new_active->dev->name); ··· 695 695 ss.ss_family = old_active->dev->type; 696 696 697 697 rv = dev_set_mac_address(old_active->dev, 698 - (struct sockaddr *)&ss); 698 + (struct sockaddr *)&ss, NULL); 699 699 if (rv) 700 700 netdev_err(bond->dev, "Error %d setting MAC of slave %s\n", 701 701 -rv, new_active->dev->name); ··· 1527 1527 */ 1528 1528 memcpy(ss.__data, bond_dev->dev_addr, bond_dev->addr_len); 1529 1529 ss.ss_family = slave_dev->type; 1530 - res = dev_set_mac_address(slave_dev, (struct sockaddr *)&ss); 1530 + res = dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, 1531 + extack); 1531 1532 if (res) { 1532 1533 netdev_dbg(bond_dev, "Error %d calling set_mac_address\n", res); 1533 1534 goto err_restore_mtu; ··· 1819 1818 bond_hw_addr_copy(ss.__data, new_slave->perm_hwaddr, 1820 1819 new_slave->dev->addr_len); 1821 1820 ss.ss_family = slave_dev->type; 1822 - dev_set_mac_address(slave_dev, (struct sockaddr *)&ss); 1821 + dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, NULL); 1823 1822 } 1824 1823 1825 1824 err_restore_mtu: ··· 2000 1999 bond_hw_addr_copy(ss.__data, slave->perm_hwaddr, 2001 2000 slave->dev->addr_len); 2002 2001 ss.ss_family = slave_dev->type; 2003 - dev_set_mac_address(slave_dev, (struct sockaddr *)&ss); 2002 + dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, NULL); 2004 2003 } 2005 2004 2006 2005 if (unregister) ··· 3733 3732 3734 3733 bond_for_each_slave(bond, slave, iter) { 3735 3734 netdev_dbg(bond_dev, "slave %p %s\n", slave, slave->dev->name); 3736 - res = dev_set_mac_address(slave->dev, addr); 3735 + res = dev_set_mac_address(slave->dev, addr, NULL); 3737 3736 if (res) { 3738 3737 /* TODO: consider downing the slave 3739 3738 * and retry ? ··· 3762 3761 break; 3763 3762 3764 3763 tmp_res = dev_set_mac_address(rollback_slave->dev, 3765 - (struct sockaddr *)&tmp_ss); 3764 + (struct sockaddr *)&tmp_ss, NULL); 3766 3765 if (tmp_res) { 3767 3766 netdev_dbg(bond_dev, "unwind err %d dev %s\n", 3768 3767 tmp_res, rollback_slave->dev->name);
+2 -2
drivers/net/hyperv/netvsc_drv.c
··· 1247 1247 return -ENODEV; 1248 1248 1249 1249 if (vf_netdev) { 1250 - err = dev_set_mac_address(vf_netdev, addr); 1250 + err = dev_set_mac_address(vf_netdev, addr, NULL); 1251 1251 if (err) 1252 1252 return err; 1253 1253 } ··· 1258 1258 } else if (vf_netdev) { 1259 1259 /* rollback change on VF */ 1260 1260 memcpy(addr->sa_data, ndev->dev_addr, ETH_ALEN); 1261 - dev_set_mac_address(vf_netdev, addr); 1261 + dev_set_mac_address(vf_netdev, addr, NULL); 1262 1262 } 1263 1263 1264 1264 return err;
+2 -2
drivers/net/macvlan.c
··· 744 744 745 745 if (vlan->mode == MACVLAN_MODE_PASSTHRU) { 746 746 macvlan_set_addr_change(vlan->port); 747 - return dev_set_mac_address(vlan->lowerdev, addr); 747 + return dev_set_mac_address(vlan->lowerdev, addr, NULL); 748 748 } 749 749 750 750 if (macvlan_addr_busy(vlan->port, addr->sa_data)) ··· 1213 1213 1214 1214 sa.sa_family = port->dev->type; 1215 1215 memcpy(&sa.sa_data, port->perm_addr, port->dev->addr_len); 1216 - dev_set_mac_address(port->dev, &sa); 1216 + dev_set_mac_address(port->dev, &sa, NULL); 1217 1217 } 1218 1218 1219 1219 kfree(port);
+1 -1
drivers/net/tap.c
··· 1113 1113 rtnl_unlock(); 1114 1114 return -ENOLINK; 1115 1115 } 1116 - ret = dev_set_mac_address(tap->dev, &sa); 1116 + ret = dev_set_mac_address(tap->dev, &sa, NULL); 1117 1117 tap_put_tap_dev(tap); 1118 1118 rtnl_unlock(); 1119 1119 return ret;
+1 -1
drivers/net/team/team.c
··· 59 59 60 60 memcpy(addr.__data, dev_addr, port_dev->addr_len); 61 61 addr.ss_family = port_dev->type; 62 - return dev_set_mac_address(port_dev, (struct sockaddr *)&addr); 62 + return dev_set_mac_address(port_dev, (struct sockaddr *)&addr, NULL); 63 63 } 64 64 65 65 static int team_port_set_orig_dev_addr(struct team_port *port)
+1 -1
drivers/net/tun.c
··· 3202 3202 tun_debug(KERN_DEBUG, tun, "set hw address: %pM\n", 3203 3203 ifr.ifr_hwaddr.sa_data); 3204 3204 3205 - ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr); 3205 + ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr, NULL); 3206 3206 break; 3207 3207 3208 3208 case TUNGETSNDBUF:
+1 -1
drivers/usb/gadget/function/u_ether.c
··· 879 879 sa.sa_family = net->type; 880 880 memcpy(sa.sa_data, dev->dev_mac, ETH_ALEN); 881 881 rtnl_lock(); 882 - status = dev_set_mac_address(net, &sa); 882 + status = dev_set_mac_address(net, &sa, NULL); 883 883 rtnl_unlock(); 884 884 if (status) 885 885 pr_warn("cannot set self ethernet address: %d\n", status);
+2 -1
include/linux/netdevice.h
··· 3628 3628 int dev_set_mtu(struct net_device *, int); 3629 3629 int dev_change_tx_queue_len(struct net_device *, unsigned long); 3630 3630 void dev_set_group(struct net_device *, int); 3631 - int dev_set_mac_address(struct net_device *, struct sockaddr *); 3631 + int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa, 3632 + struct netlink_ext_ack *extack); 3632 3633 int dev_change_carrier(struct net_device *, bool new_carrier); 3633 3634 int dev_get_phys_port_id(struct net_device *dev, 3634 3635 struct netdev_phys_item_id *ppid);
+3 -1
net/core/dev.c
··· 7759 7759 * dev_set_mac_address - Change Media Access Control Address 7760 7760 * @dev: device 7761 7761 * @sa: new address 7762 + * @extack: netlink extended ack 7762 7763 * 7763 7764 * Change the hardware (MAC) address of the device 7764 7765 */ 7765 - int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa) 7766 + int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa, 7767 + struct netlink_ext_ack *extack) 7766 7768 { 7767 7769 const struct net_device_ops *ops = dev->netdev_ops; 7768 7770 int err;
+1 -1
net/core/dev_ioctl.c
··· 246 246 case SIOCSIFHWADDR: 247 247 if (dev->addr_len > sizeof(struct sockaddr)) 248 248 return -EINVAL; 249 - return dev_set_mac_address(dev, &ifr->ifr_hwaddr); 249 + return dev_set_mac_address(dev, &ifr->ifr_hwaddr, NULL); 250 250 251 251 case SIOCSIFHWBROADCAST: 252 252 if (ifr->ifr_hwaddr.sa_family != dev->type)
+1 -1
net/core/rtnetlink.c
··· 2444 2444 sa->sa_family = dev->type; 2445 2445 memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]), 2446 2446 dev->addr_len); 2447 - err = dev_set_mac_address(dev, sa); 2447 + err = dev_set_mac_address(dev, sa, extack); 2448 2448 kfree(sa); 2449 2449 if (err) 2450 2450 goto errout;
+1 -1
net/ieee802154/nl-phy.c
··· 242 242 * dev_set_mac_address require RTNL_LOCK 243 243 */ 244 244 rtnl_lock(); 245 - rc = dev_set_mac_address(dev, &addr); 245 + rc = dev_set_mac_address(dev, &addr, NULL); 246 246 rtnl_unlock(); 247 247 if (rc) 248 248 goto dev_unregister;