diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 01497b7d1bdf..ed9aa4a91f1f 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -7757,6 +7757,27 @@ void dev_set_group(struct net_device *dev, int new_group) | |||
7757 | EXPORT_SYMBOL(dev_set_group); | 7757 | EXPORT_SYMBOL(dev_set_group); |
7758 | 7758 | ||
7759 | /** | 7759 | /** |
7760 | * dev_pre_changeaddr_notify - Call NETDEV_PRE_CHANGEADDR. | ||
7761 | * @dev: device | ||
7762 | * @addr: new address | ||
7763 | * @extack: netlink extended ack | ||
7764 | */ | ||
7765 | int dev_pre_changeaddr_notify(struct net_device *dev, const char *addr, | ||
7766 | struct netlink_ext_ack *extack) | ||
7767 | { | ||
7768 | struct netdev_notifier_pre_changeaddr_info info = { | ||
7769 | .info.dev = dev, | ||
7770 | .info.extack = extack, | ||
7771 | .dev_addr = addr, | ||
7772 | }; | ||
7773 | int rc; | ||
7774 | |||
7775 | rc = call_netdevice_notifiers_info(NETDEV_PRE_CHANGEADDR, &info.info); | ||
7776 | return notifier_to_errno(rc); | ||
7777 | } | ||
7778 | EXPORT_SYMBOL(dev_pre_changeaddr_notify); | ||
7779 | |||
7780 | /** | ||
7760 | * dev_set_mac_address - Change Media Access Control Address | 7781 | * dev_set_mac_address - Change Media Access Control Address |
7761 | * @dev: device | 7782 | * @dev: device |
7762 | * @sa: new address | 7783 | * @sa: new address |
@@ -7776,6 +7797,9 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa, | |||
7776 | return -EINVAL; | 7797 | return -EINVAL; |
7777 | if (!netif_device_present(dev)) | 7798 | if (!netif_device_present(dev)) |
7778 | return -ENODEV; | 7799 | return -ENODEV; |
7800 | err = dev_pre_changeaddr_notify(dev, sa->sa_data, extack); | ||
7801 | if (err) | ||
7802 | return err; | ||
7779 | err = ops->ndo_set_mac_address(dev, sa); | 7803 | err = ops->ndo_set_mac_address(dev, sa); |
7780 | if (err) | 7804 | if (err) |
7781 | return err; | 7805 | return err; |