net: dev: Issue NETDEV_PRE_CHANGEADDR
When a device address is about to be changed, or an address added to the list of device HW addresses, it is necessary to ensure that all interested parties can support the address. Therefore, send the NETDEV_PRE_CHANGEADDR notification, and if anyone bails on it, do not change the address. 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>
This commit is contained in:

committed by
David S. Miller

parent
1570415f08
commit
d59cdf9475
@@ -7756,6 +7756,27 @@ void dev_set_group(struct net_device *dev, int new_group)
|
||||
}
|
||||
EXPORT_SYMBOL(dev_set_group);
|
||||
|
||||
/**
|
||||
* dev_pre_changeaddr_notify - Call NETDEV_PRE_CHANGEADDR.
|
||||
* @dev: device
|
||||
* @addr: new address
|
||||
* @extack: netlink extended ack
|
||||
*/
|
||||
int dev_pre_changeaddr_notify(struct net_device *dev, const char *addr,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct netdev_notifier_pre_changeaddr_info info = {
|
||||
.info.dev = dev,
|
||||
.info.extack = extack,
|
||||
.dev_addr = addr,
|
||||
};
|
||||
int rc;
|
||||
|
||||
rc = call_netdevice_notifiers_info(NETDEV_PRE_CHANGEADDR, &info.info);
|
||||
return notifier_to_errno(rc);
|
||||
}
|
||||
EXPORT_SYMBOL(dev_pre_changeaddr_notify);
|
||||
|
||||
/**
|
||||
* dev_set_mac_address - Change Media Access Control Address
|
||||
* @dev: device
|
||||
@@ -7776,6 +7797,9 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
|
||||
return -EINVAL;
|
||||
if (!netif_device_present(dev))
|
||||
return -ENODEV;
|
||||
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;
|
||||
|
Reference in New Issue
Block a user