|
@@ -271,6 +271,36 @@ void eth_header_cache_update(struct hh_cache *hh,
|
|
|
}
|
|
|
EXPORT_SYMBOL(eth_header_cache_update);
|
|
|
|
|
|
+/**
|
|
|
+ * eth_prepare_mac_addr_change - prepare for mac change
|
|
|
+ * @dev: network device
|
|
|
+ * @p: socket address
|
|
|
+ */
|
|
|
+int eth_prepare_mac_addr_change(struct net_device *dev, void *p)
|
|
|
+{
|
|
|
+ struct sockaddr *addr = p;
|
|
|
+
|
|
|
+ if (!(dev->priv_flags & IFF_LIVE_ADDR_CHANGE) && netif_running(dev))
|
|
|
+ return -EBUSY;
|
|
|
+ if (!is_valid_ether_addr(addr->sa_data))
|
|
|
+ return -EADDRNOTAVAIL;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(eth_prepare_mac_addr_change);
|
|
|
+
|
|
|
+/**
|
|
|
+ * eth_commit_mac_addr_change - commit mac change
|
|
|
+ * @dev: network device
|
|
|
+ * @p: socket address
|
|
|
+ */
|
|
|
+void eth_commit_mac_addr_change(struct net_device *dev, void *p)
|
|
|
+{
|
|
|
+ struct sockaddr *addr = p;
|
|
|
+
|
|
|
+ memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(eth_commit_mac_addr_change);
|
|
|
+
|
|
|
/**
|
|
|
* eth_mac_addr - set new Ethernet hardware address
|
|
|
* @dev: network device
|
|
@@ -283,13 +313,12 @@ EXPORT_SYMBOL(eth_header_cache_update);
|
|
|
*/
|
|
|
int eth_mac_addr(struct net_device *dev, void *p)
|
|
|
{
|
|
|
- struct sockaddr *addr = p;
|
|
|
+ int ret;
|
|
|
|
|
|
- if (!(dev->priv_flags & IFF_LIVE_ADDR_CHANGE) && netif_running(dev))
|
|
|
- return -EBUSY;
|
|
|
- if (!is_valid_ether_addr(addr->sa_data))
|
|
|
- return -EADDRNOTAVAIL;
|
|
|
- memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
|
|
|
+ ret = eth_prepare_mac_addr_change(dev, p);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+ eth_commit_mac_addr_change(dev, p);
|
|
|
return 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL(eth_mac_addr);
|