xref: /linux/net/core/dev_api.c (revision ab59a8605604f71bbbc16077270dc3f39648b7fc)
17e4d784fSStanislav Fomichev // SPDX-License-Identifier: GPL-2.0-or-later
28ef890dfSJakub Kicinski 
37e4d784fSStanislav Fomichev #include <linux/netdevice.h>
48ef890dfSJakub Kicinski #include <net/netdev_lock.h>
57e4d784fSStanislav Fomichev 
67e4d784fSStanislav Fomichev #include "dev.h"
77e4d784fSStanislav Fomichev 
87e4d784fSStanislav Fomichev /**
97e4d784fSStanislav Fomichev  * dev_change_name() - change name of a device
107e4d784fSStanislav Fomichev  * @dev: device
117e4d784fSStanislav Fomichev  * @newname: name (or format string) must be at least IFNAMSIZ
127e4d784fSStanislav Fomichev  *
137e4d784fSStanislav Fomichev  * Change name of a device, can pass format strings "eth%d".
147e4d784fSStanislav Fomichev  * for wildcarding.
157e4d784fSStanislav Fomichev  *
167e4d784fSStanislav Fomichev  * Return: 0 on success, -errno on failure.
177e4d784fSStanislav Fomichev  */
dev_change_name(struct net_device * dev,const char * newname)187e4d784fSStanislav Fomichev int dev_change_name(struct net_device *dev, const char *newname)
197e4d784fSStanislav Fomichev {
207e4d784fSStanislav Fomichev 	int ret;
217e4d784fSStanislav Fomichev 
227e4d784fSStanislav Fomichev 	netdev_lock_ops(dev);
237e4d784fSStanislav Fomichev 	ret = netif_change_name(dev, newname);
247e4d784fSStanislav Fomichev 	netdev_unlock_ops(dev);
257e4d784fSStanislav Fomichev 
267e4d784fSStanislav Fomichev 	return ret;
277e4d784fSStanislav Fomichev }
287e4d784fSStanislav Fomichev 
297e4d784fSStanislav Fomichev /**
307e4d784fSStanislav Fomichev  * dev_set_alias() - change ifalias of a device
317e4d784fSStanislav Fomichev  * @dev: device
327e4d784fSStanislav Fomichev  * @alias: name up to IFALIASZ
337e4d784fSStanislav Fomichev  * @len: limit of bytes to copy from info
347e4d784fSStanislav Fomichev  *
357e4d784fSStanislav Fomichev  * Set ifalias for a device.
367e4d784fSStanislav Fomichev  *
377e4d784fSStanislav Fomichev  * Return: 0 on success, -errno on failure.
387e4d784fSStanislav Fomichev  */
dev_set_alias(struct net_device * dev,const char * alias,size_t len)397e4d784fSStanislav Fomichev int dev_set_alias(struct net_device *dev, const char *alias, size_t len)
407e4d784fSStanislav Fomichev {
417e4d784fSStanislav Fomichev 	int ret;
427e4d784fSStanislav Fomichev 
437e4d784fSStanislav Fomichev 	netdev_lock_ops(dev);
447e4d784fSStanislav Fomichev 	ret = netif_set_alias(dev, alias, len);
457e4d784fSStanislav Fomichev 	netdev_unlock_ops(dev);
467e4d784fSStanislav Fomichev 
477e4d784fSStanislav Fomichev 	return ret;
487e4d784fSStanislav Fomichev }
497e4d784fSStanislav Fomichev EXPORT_SYMBOL(dev_set_alias);
507e4d784fSStanislav Fomichev 
517e4d784fSStanislav Fomichev /**
527e4d784fSStanislav Fomichev  * dev_change_flags() - change device settings
537e4d784fSStanislav Fomichev  * @dev: device
547e4d784fSStanislav Fomichev  * @flags: device state flags
557e4d784fSStanislav Fomichev  * @extack: netlink extended ack
567e4d784fSStanislav Fomichev  *
577e4d784fSStanislav Fomichev  * Change settings on device based state flags. The flags are
587e4d784fSStanislav Fomichev  * in the userspace exported format.
597e4d784fSStanislav Fomichev  *
607e4d784fSStanislav Fomichev  * Return: 0 on success, -errno on failure.
617e4d784fSStanislav Fomichev  */
dev_change_flags(struct net_device * dev,unsigned int flags,struct netlink_ext_ack * extack)627e4d784fSStanislav Fomichev int dev_change_flags(struct net_device *dev, unsigned int flags,
637e4d784fSStanislav Fomichev 		     struct netlink_ext_ack *extack)
647e4d784fSStanislav Fomichev {
657e4d784fSStanislav Fomichev 	int ret;
667e4d784fSStanislav Fomichev 
677e4d784fSStanislav Fomichev 	netdev_lock_ops(dev);
687e4d784fSStanislav Fomichev 	ret = netif_change_flags(dev, flags, extack);
697e4d784fSStanislav Fomichev 	netdev_unlock_ops(dev);
707e4d784fSStanislav Fomichev 
717e4d784fSStanislav Fomichev 	return ret;
727e4d784fSStanislav Fomichev }
737e4d784fSStanislav Fomichev EXPORT_SYMBOL(dev_change_flags);
747e4d784fSStanislav Fomichev 
757e4d784fSStanislav Fomichev /**
767e4d784fSStanislav Fomichev  * dev_set_group() - change group this device belongs to
777e4d784fSStanislav Fomichev  * @dev: device
787e4d784fSStanislav Fomichev  * @new_group: group this device should belong to
797e4d784fSStanislav Fomichev  */
dev_set_group(struct net_device * dev,int new_group)807e4d784fSStanislav Fomichev void dev_set_group(struct net_device *dev, int new_group)
817e4d784fSStanislav Fomichev {
827e4d784fSStanislav Fomichev 	netdev_lock_ops(dev);
837e4d784fSStanislav Fomichev 	netif_set_group(dev, new_group);
847e4d784fSStanislav Fomichev 	netdev_unlock_ops(dev);
857e4d784fSStanislav Fomichev }
867e4d784fSStanislav Fomichev 
dev_set_mac_address_user(struct net_device * dev,struct sockaddr * sa,struct netlink_ext_ack * extack)878033d2aeSStanislav Fomichev int dev_set_mac_address_user(struct net_device *dev, struct sockaddr *sa,
888033d2aeSStanislav Fomichev 			     struct netlink_ext_ack *extack)
898033d2aeSStanislav Fomichev {
908033d2aeSStanislav Fomichev 	int ret;
918033d2aeSStanislav Fomichev 
926dd13251SStanislav Fomichev 	down_write(&dev_addr_sem);
938033d2aeSStanislav Fomichev 	netdev_lock_ops(dev);
946dd13251SStanislav Fomichev 	ret = netif_set_mac_address(dev, sa, extack);
958033d2aeSStanislav Fomichev 	netdev_unlock_ops(dev);
966dd13251SStanislav Fomichev 	up_write(&dev_addr_sem);
978033d2aeSStanislav Fomichev 
988033d2aeSStanislav Fomichev 	return ret;
998033d2aeSStanislav Fomichev }
1008033d2aeSStanislav Fomichev EXPORT_SYMBOL(dev_set_mac_address_user);
1018033d2aeSStanislav Fomichev 
1027e4d784fSStanislav Fomichev /**
1037e4d784fSStanislav Fomichev  * dev_change_net_namespace() - move device to different nethost namespace
1047e4d784fSStanislav Fomichev  * @dev: device
1057e4d784fSStanislav Fomichev  * @net: network namespace
1067e4d784fSStanislav Fomichev  * @pat: If not NULL name pattern to try if the current device name
1077e4d784fSStanislav Fomichev  *       is already taken in the destination network namespace.
1087e4d784fSStanislav Fomichev  *
1097e4d784fSStanislav Fomichev  * This function shuts down a device interface and moves it
1107e4d784fSStanislav Fomichev  * to a new network namespace. On success 0 is returned, on
1117e4d784fSStanislav Fomichev  * a failure a netagive errno code is returned.
1127e4d784fSStanislav Fomichev  *
1137e4d784fSStanislav Fomichev  * Callers must hold the rtnl semaphore.
1147e4d784fSStanislav Fomichev  *
1157e4d784fSStanislav Fomichev  * Return: 0 on success, -errno on failure.
1167e4d784fSStanislav Fomichev  */
dev_change_net_namespace(struct net_device * dev,struct net * net,const char * pat)1177e4d784fSStanislav Fomichev int dev_change_net_namespace(struct net_device *dev, struct net *net,
1187e4d784fSStanislav Fomichev 			     const char *pat)
1197e4d784fSStanislav Fomichev {
1204c975fd7SStanislav Fomichev 	return __dev_change_net_namespace(dev, net, pat, 0, NULL);
1217e4d784fSStanislav Fomichev }
1227e4d784fSStanislav Fomichev EXPORT_SYMBOL_GPL(dev_change_net_namespace);
1237e4d784fSStanislav Fomichev 
1247e4d784fSStanislav Fomichev /**
1257e4d784fSStanislav Fomichev  * dev_change_carrier() - change device carrier
1267e4d784fSStanislav Fomichev  * @dev: device
1277e4d784fSStanislav Fomichev  * @new_carrier: new value
1287e4d784fSStanislav Fomichev  *
1297e4d784fSStanislav Fomichev  * Change device carrier
1307e4d784fSStanislav Fomichev  *
1317e4d784fSStanislav Fomichev  * Return: 0 on success, -errno on failure.
1327e4d784fSStanislav Fomichev  */
dev_change_carrier(struct net_device * dev,bool new_carrier)1337e4d784fSStanislav Fomichev int dev_change_carrier(struct net_device *dev, bool new_carrier)
1347e4d784fSStanislav Fomichev {
1357e4d784fSStanislav Fomichev 	int ret;
1367e4d784fSStanislav Fomichev 
1377e4d784fSStanislav Fomichev 	netdev_lock_ops(dev);
1387e4d784fSStanislav Fomichev 	ret = netif_change_carrier(dev, new_carrier);
1397e4d784fSStanislav Fomichev 	netdev_unlock_ops(dev);
1407e4d784fSStanislav Fomichev 
1417e4d784fSStanislav Fomichev 	return ret;
1427e4d784fSStanislav Fomichev }
1437e4d784fSStanislav Fomichev 
1447e4d784fSStanislav Fomichev /**
1457e4d784fSStanislav Fomichev  * dev_change_tx_queue_len() - change TX queue length of a netdevice
1467e4d784fSStanislav Fomichev  * @dev: device
1477e4d784fSStanislav Fomichev  * @new_len: new tx queue length
1487e4d784fSStanislav Fomichev  *
1497e4d784fSStanislav Fomichev  * Return: 0 on success, -errno on failure.
1507e4d784fSStanislav Fomichev  */
dev_change_tx_queue_len(struct net_device * dev,unsigned long new_len)1517e4d784fSStanislav Fomichev int dev_change_tx_queue_len(struct net_device *dev, unsigned long new_len)
1527e4d784fSStanislav Fomichev {
1537e4d784fSStanislav Fomichev 	int ret;
1547e4d784fSStanislav Fomichev 
1557e4d784fSStanislav Fomichev 	netdev_lock_ops(dev);
1567e4d784fSStanislav Fomichev 	ret = netif_change_tx_queue_len(dev, new_len);
1577e4d784fSStanislav Fomichev 	netdev_unlock_ops(dev);
1587e4d784fSStanislav Fomichev 
1597e4d784fSStanislav Fomichev 	return ret;
1607e4d784fSStanislav Fomichev }
1617e4d784fSStanislav Fomichev 
1627e4d784fSStanislav Fomichev /**
1637e4d784fSStanislav Fomichev  * dev_change_proto_down() - set carrier according to proto_down
1647e4d784fSStanislav Fomichev  * @dev: device
1657e4d784fSStanislav Fomichev  * @proto_down: new value
1667e4d784fSStanislav Fomichev  *
1677e4d784fSStanislav Fomichev  * Return: 0 on success, -errno on failure.
1687e4d784fSStanislav Fomichev  */
dev_change_proto_down(struct net_device * dev,bool proto_down)1697e4d784fSStanislav Fomichev int dev_change_proto_down(struct net_device *dev, bool proto_down)
1707e4d784fSStanislav Fomichev {
1717e4d784fSStanislav Fomichev 	int ret;
1727e4d784fSStanislav Fomichev 
1737e4d784fSStanislav Fomichev 	netdev_lock_ops(dev);
1747e4d784fSStanislav Fomichev 	ret = netif_change_proto_down(dev, proto_down);
1757e4d784fSStanislav Fomichev 	netdev_unlock_ops(dev);
1767e4d784fSStanislav Fomichev 
1777e4d784fSStanislav Fomichev 	return ret;
1787e4d784fSStanislav Fomichev }
1797e4d784fSStanislav Fomichev 
1807e4d784fSStanislav Fomichev /**
1817e4d784fSStanislav Fomichev  * dev_open() - prepare an interface for use
1827e4d784fSStanislav Fomichev  * @dev: device to open
1837e4d784fSStanislav Fomichev  * @extack: netlink extended ack
1847e4d784fSStanislav Fomichev  *
1857e4d784fSStanislav Fomichev  * Takes a device from down to up state. The device's private open
1867e4d784fSStanislav Fomichev  * function is invoked and then the multicast lists are loaded. Finally
1877e4d784fSStanislav Fomichev  * the device is moved into the up state and a %NETDEV_UP message is
1887e4d784fSStanislav Fomichev  * sent to the netdev notifier chain.
1897e4d784fSStanislav Fomichev  *
1907e4d784fSStanislav Fomichev  * Calling this function on an active interface is a nop. On a failure
1917e4d784fSStanislav Fomichev  * a negative errno code is returned.
1927e4d784fSStanislav Fomichev  *
1937e4d784fSStanislav Fomichev  * Return: 0 on success, -errno on failure.
1947e4d784fSStanislav Fomichev  */
dev_open(struct net_device * dev,struct netlink_ext_ack * extack)1957e4d784fSStanislav Fomichev int dev_open(struct net_device *dev, struct netlink_ext_ack *extack)
1967e4d784fSStanislav Fomichev {
1977e4d784fSStanislav Fomichev 	int ret;
1987e4d784fSStanislav Fomichev 
1997e4d784fSStanislav Fomichev 	netdev_lock_ops(dev);
2007e4d784fSStanislav Fomichev 	ret = netif_open(dev, extack);
2017e4d784fSStanislav Fomichev 	netdev_unlock_ops(dev);
2027e4d784fSStanislav Fomichev 
2037e4d784fSStanislav Fomichev 	return ret;
2047e4d784fSStanislav Fomichev }
2057e4d784fSStanislav Fomichev EXPORT_SYMBOL(dev_open);
2067e4d784fSStanislav Fomichev 
2077e4d784fSStanislav Fomichev /**
2087e4d784fSStanislav Fomichev  * dev_close() - shutdown an interface
2097e4d784fSStanislav Fomichev  * @dev: device to shutdown
2107e4d784fSStanislav Fomichev  *
2117e4d784fSStanislav Fomichev  * This function moves an active device into down state. A
2127e4d784fSStanislav Fomichev  * %NETDEV_GOING_DOWN is sent to the netdev notifier chain. The device
2137e4d784fSStanislav Fomichev  * is then deactivated and finally a %NETDEV_DOWN is sent to the notifier
2147e4d784fSStanislav Fomichev  * chain.
2157e4d784fSStanislav Fomichev  */
dev_close(struct net_device * dev)2167e4d784fSStanislav Fomichev void dev_close(struct net_device *dev)
2177e4d784fSStanislav Fomichev {
2187e4d784fSStanislav Fomichev 	netdev_lock_ops(dev);
2197e4d784fSStanislav Fomichev 	netif_close(dev);
2207e4d784fSStanislav Fomichev 	netdev_unlock_ops(dev);
2217e4d784fSStanislav Fomichev }
2227e4d784fSStanislav Fomichev EXPORT_SYMBOL(dev_close);
223ffb7ed19SStanislav Fomichev 
dev_eth_ioctl(struct net_device * dev,struct ifreq * ifr,unsigned int cmd)224ffb7ed19SStanislav Fomichev int dev_eth_ioctl(struct net_device *dev,
225ffb7ed19SStanislav Fomichev 		  struct ifreq *ifr, unsigned int cmd)
226ffb7ed19SStanislav Fomichev {
227ffb7ed19SStanislav Fomichev 	const struct net_device_ops *ops = dev->netdev_ops;
228ffb7ed19SStanislav Fomichev 	int ret = -ENODEV;
229ffb7ed19SStanislav Fomichev 
230ffb7ed19SStanislav Fomichev 	if (!ops->ndo_eth_ioctl)
231ffb7ed19SStanislav Fomichev 		return -EOPNOTSUPP;
232ffb7ed19SStanislav Fomichev 
233ffb7ed19SStanislav Fomichev 	netdev_lock_ops(dev);
234ffb7ed19SStanislav Fomichev 	if (netif_device_present(dev))
235ffb7ed19SStanislav Fomichev 		ret = ops->ndo_eth_ioctl(dev, ifr, cmd);
236ffb7ed19SStanislav Fomichev 	netdev_unlock_ops(dev);
237ffb7ed19SStanislav Fomichev 
238ffb7ed19SStanislav Fomichev 	return ret;
239ffb7ed19SStanislav Fomichev }
240ffb7ed19SStanislav Fomichev EXPORT_SYMBOL(dev_eth_ioctl);
241ffb7ed19SStanislav Fomichev 
dev_set_mtu(struct net_device * dev,int new_mtu)242ffb7ed19SStanislav Fomichev int dev_set_mtu(struct net_device *dev, int new_mtu)
243ffb7ed19SStanislav Fomichev {
244ffb7ed19SStanislav Fomichev 	int ret;
245ffb7ed19SStanislav Fomichev 
246ffb7ed19SStanislav Fomichev 	netdev_lock_ops(dev);
247ffb7ed19SStanislav Fomichev 	ret = netif_set_mtu(dev, new_mtu);
248ffb7ed19SStanislav Fomichev 	netdev_unlock_ops(dev);
249ffb7ed19SStanislav Fomichev 
250ffb7ed19SStanislav Fomichev 	return ret;
251ffb7ed19SStanislav Fomichev }
252ffb7ed19SStanislav Fomichev EXPORT_SYMBOL(dev_set_mtu);
253ad7c7b21SStanislav Fomichev 
254ad7c7b21SStanislav Fomichev /**
255ad7c7b21SStanislav Fomichev  * dev_disable_lro() - disable Large Receive Offload on a device
256ad7c7b21SStanislav Fomichev  * @dev: device
257ad7c7b21SStanislav Fomichev  *
258ad7c7b21SStanislav Fomichev  * Disable Large Receive Offload (LRO) on a net device.  Must be
259ad7c7b21SStanislav Fomichev  * called under RTNL.  This is needed if received packets may be
260ad7c7b21SStanislav Fomichev  * forwarded to another interface.
261ad7c7b21SStanislav Fomichev  */
dev_disable_lro(struct net_device * dev)262ad7c7b21SStanislav Fomichev void dev_disable_lro(struct net_device *dev)
263ad7c7b21SStanislav Fomichev {
264ad7c7b21SStanislav Fomichev 	netdev_lock_ops(dev);
265ad7c7b21SStanislav Fomichev 	netif_disable_lro(dev);
266ad7c7b21SStanislav Fomichev 	netdev_unlock_ops(dev);
267ad7c7b21SStanislav Fomichev }
268ad7c7b21SStanislav Fomichev EXPORT_SYMBOL(dev_disable_lro);
269ad7c7b21SStanislav Fomichev 
270ad7c7b21SStanislav Fomichev /**
271ad7c7b21SStanislav Fomichev  * dev_set_allmulti() - update allmulti count on a device
272ad7c7b21SStanislav Fomichev  * @dev: device
273ad7c7b21SStanislav Fomichev  * @inc: modifier
274ad7c7b21SStanislav Fomichev  *
275ad7c7b21SStanislav Fomichev  * Add or remove reception of all multicast frames to a device. While the
276ad7c7b21SStanislav Fomichev  * count in the device remains above zero the interface remains listening
277ad7c7b21SStanislav Fomichev  * to all interfaces. Once it hits zero the device reverts back to normal
278ad7c7b21SStanislav Fomichev  * filtering operation. A negative @inc value is used to drop the counter
279ad7c7b21SStanislav Fomichev  * when releasing a resource needing all multicasts.
280ad7c7b21SStanislav Fomichev  *
281ad7c7b21SStanislav Fomichev  * Return: 0 on success, -errno on failure.
282ad7c7b21SStanislav Fomichev  */
283ad7c7b21SStanislav Fomichev 
dev_set_allmulti(struct net_device * dev,int inc)284ad7c7b21SStanislav Fomichev int dev_set_allmulti(struct net_device *dev, int inc)
285ad7c7b21SStanislav Fomichev {
286ad7c7b21SStanislav Fomichev 	int ret;
287ad7c7b21SStanislav Fomichev 
288ad7c7b21SStanislav Fomichev 	netdev_lock_ops(dev);
289ad7c7b21SStanislav Fomichev 	ret = netif_set_allmulti(dev, inc, true);
290ad7c7b21SStanislav Fomichev 	netdev_unlock_ops(dev);
291ad7c7b21SStanislav Fomichev 
292ad7c7b21SStanislav Fomichev 	return ret;
293ad7c7b21SStanislav Fomichev }
294ad7c7b21SStanislav Fomichev EXPORT_SYMBOL(dev_set_allmulti);
295ad7c7b21SStanislav Fomichev 
296ad7c7b21SStanislav Fomichev /**
297ad7c7b21SStanislav Fomichev  * dev_set_mac_address() - change Media Access Control Address
298ad7c7b21SStanislav Fomichev  * @dev: device
299ad7c7b21SStanislav Fomichev  * @sa: new address
300ad7c7b21SStanislav Fomichev  * @extack: netlink extended ack
301ad7c7b21SStanislav Fomichev  *
302ad7c7b21SStanislav Fomichev  * Change the hardware (MAC) address of the device
303ad7c7b21SStanislav Fomichev  *
304ad7c7b21SStanislav Fomichev  * Return: 0 on success, -errno on failure.
305ad7c7b21SStanislav Fomichev  */
dev_set_mac_address(struct net_device * dev,struct sockaddr * sa,struct netlink_ext_ack * extack)306ad7c7b21SStanislav Fomichev int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
307ad7c7b21SStanislav Fomichev 			struct netlink_ext_ack *extack)
308ad7c7b21SStanislav Fomichev {
309ad7c7b21SStanislav Fomichev 	int ret;
310ad7c7b21SStanislav Fomichev 
3118033d2aeSStanislav Fomichev 	netdev_lock_ops(dev);
312ad7c7b21SStanislav Fomichev 	ret = netif_set_mac_address(dev, sa, extack);
3138033d2aeSStanislav Fomichev 	netdev_unlock_ops(dev);
314ad7c7b21SStanislav Fomichev 
315ad7c7b21SStanislav Fomichev 	return ret;
316ad7c7b21SStanislav Fomichev }
317ad7c7b21SStanislav Fomichev EXPORT_SYMBOL(dev_set_mac_address);
31897246d6dSStanislav Fomichev 
dev_xdp_propagate(struct net_device * dev,struct netdev_bpf * bpf)31997246d6dSStanislav Fomichev int dev_xdp_propagate(struct net_device *dev, struct netdev_bpf *bpf)
32097246d6dSStanislav Fomichev {
32197246d6dSStanislav Fomichev 	int ret;
32297246d6dSStanislav Fomichev 
32397246d6dSStanislav Fomichev 	netdev_lock_ops(dev);
32497246d6dSStanislav Fomichev 	ret = netif_xdp_propagate(dev, bpf);
32597246d6dSStanislav Fomichev 	netdev_unlock_ops(dev);
32697246d6dSStanislav Fomichev 
32797246d6dSStanislav Fomichev 	return ret;
32897246d6dSStanislav Fomichev }
32997246d6dSStanislav Fomichev EXPORT_SYMBOL_GPL(dev_xdp_propagate);
330*04efcee6SStanislav Fomichev 
331*04efcee6SStanislav Fomichev /**
332*04efcee6SStanislav Fomichev  * netdev_state_change() - device changes state
333*04efcee6SStanislav Fomichev  * @dev: device to cause notification
334*04efcee6SStanislav Fomichev  *
335*04efcee6SStanislav Fomichev  * Called to indicate a device has changed state. This function calls
336*04efcee6SStanislav Fomichev  * the notifier chains for netdev_chain and sends a NEWLINK message
337*04efcee6SStanislav Fomichev  * to the routing socket.
338*04efcee6SStanislav Fomichev  */
netdev_state_change(struct net_device * dev)339*04efcee6SStanislav Fomichev void netdev_state_change(struct net_device *dev)
340*04efcee6SStanislav Fomichev {
341*04efcee6SStanislav Fomichev 	netdev_lock_ops(dev);
342*04efcee6SStanislav Fomichev 	netif_state_change(dev);
343*04efcee6SStanislav Fomichev 	netdev_unlock_ops(dev);
344*04efcee6SStanislav Fomichev }
345*04efcee6SStanislav Fomichev EXPORT_SYMBOL(netdev_state_change);
346