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 /**
271*78cd4083SStanislav Fomichev * dev_set_promiscuity() - update promiscuity count on a device
272*78cd4083SStanislav Fomichev * @dev: device
273*78cd4083SStanislav Fomichev * @inc: modifier
274*78cd4083SStanislav Fomichev *
275*78cd4083SStanislav Fomichev * Add or remove promiscuity from a device. While the count in the device
276*78cd4083SStanislav Fomichev * remains above zero the interface remains promiscuous. Once it hits zero
277*78cd4083SStanislav Fomichev * the device reverts back to normal filtering operation. A negative inc
278*78cd4083SStanislav Fomichev * value is used to drop promiscuity on the device.
279*78cd4083SStanislav Fomichev * Return 0 if successful or a negative errno code on error.
280*78cd4083SStanislav Fomichev */
dev_set_promiscuity(struct net_device * dev,int inc)281*78cd4083SStanislav Fomichev int dev_set_promiscuity(struct net_device *dev, int inc)
282*78cd4083SStanislav Fomichev {
283*78cd4083SStanislav Fomichev int ret;
284*78cd4083SStanislav Fomichev
285*78cd4083SStanislav Fomichev netdev_lock_ops(dev);
286*78cd4083SStanislav Fomichev ret = netif_set_promiscuity(dev, inc);
287*78cd4083SStanislav Fomichev netdev_unlock_ops(dev);
288*78cd4083SStanislav Fomichev
289*78cd4083SStanislav Fomichev return ret;
290*78cd4083SStanislav Fomichev }
291*78cd4083SStanislav Fomichev EXPORT_SYMBOL(dev_set_promiscuity);
292*78cd4083SStanislav Fomichev
293*78cd4083SStanislav Fomichev /**
294ad7c7b21SStanislav Fomichev * dev_set_allmulti() - update allmulti count on a device
295ad7c7b21SStanislav Fomichev * @dev: device
296ad7c7b21SStanislav Fomichev * @inc: modifier
297ad7c7b21SStanislav Fomichev *
298ad7c7b21SStanislav Fomichev * Add or remove reception of all multicast frames to a device. While the
299ad7c7b21SStanislav Fomichev * count in the device remains above zero the interface remains listening
300ad7c7b21SStanislav Fomichev * to all interfaces. Once it hits zero the device reverts back to normal
301ad7c7b21SStanislav Fomichev * filtering operation. A negative @inc value is used to drop the counter
302ad7c7b21SStanislav Fomichev * when releasing a resource needing all multicasts.
303ad7c7b21SStanislav Fomichev *
304ad7c7b21SStanislav Fomichev * Return: 0 on success, -errno on failure.
305ad7c7b21SStanislav Fomichev */
306ad7c7b21SStanislav Fomichev
dev_set_allmulti(struct net_device * dev,int inc)307ad7c7b21SStanislav Fomichev int dev_set_allmulti(struct net_device *dev, int inc)
308ad7c7b21SStanislav Fomichev {
309ad7c7b21SStanislav Fomichev int ret;
310ad7c7b21SStanislav Fomichev
311ad7c7b21SStanislav Fomichev netdev_lock_ops(dev);
312ad7c7b21SStanislav Fomichev ret = netif_set_allmulti(dev, inc, true);
313ad7c7b21SStanislav Fomichev netdev_unlock_ops(dev);
314ad7c7b21SStanislav Fomichev
315ad7c7b21SStanislav Fomichev return ret;
316ad7c7b21SStanislav Fomichev }
317ad7c7b21SStanislav Fomichev EXPORT_SYMBOL(dev_set_allmulti);
318ad7c7b21SStanislav Fomichev
319ad7c7b21SStanislav Fomichev /**
320ad7c7b21SStanislav Fomichev * dev_set_mac_address() - change Media Access Control Address
321ad7c7b21SStanislav Fomichev * @dev: device
322ad7c7b21SStanislav Fomichev * @sa: new address
323ad7c7b21SStanislav Fomichev * @extack: netlink extended ack
324ad7c7b21SStanislav Fomichev *
325ad7c7b21SStanislav Fomichev * Change the hardware (MAC) address of the device
326ad7c7b21SStanislav Fomichev *
327ad7c7b21SStanislav Fomichev * Return: 0 on success, -errno on failure.
328ad7c7b21SStanislav Fomichev */
dev_set_mac_address(struct net_device * dev,struct sockaddr * sa,struct netlink_ext_ack * extack)329ad7c7b21SStanislav Fomichev int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
330ad7c7b21SStanislav Fomichev struct netlink_ext_ack *extack)
331ad7c7b21SStanislav Fomichev {
332ad7c7b21SStanislav Fomichev int ret;
333ad7c7b21SStanislav Fomichev
3348033d2aeSStanislav Fomichev netdev_lock_ops(dev);
335ad7c7b21SStanislav Fomichev ret = netif_set_mac_address(dev, sa, extack);
3368033d2aeSStanislav Fomichev netdev_unlock_ops(dev);
337ad7c7b21SStanislav Fomichev
338ad7c7b21SStanislav Fomichev return ret;
339ad7c7b21SStanislav Fomichev }
340ad7c7b21SStanislav Fomichev EXPORT_SYMBOL(dev_set_mac_address);
34197246d6dSStanislav Fomichev
dev_xdp_propagate(struct net_device * dev,struct netdev_bpf * bpf)34297246d6dSStanislav Fomichev int dev_xdp_propagate(struct net_device *dev, struct netdev_bpf *bpf)
34397246d6dSStanislav Fomichev {
34497246d6dSStanislav Fomichev int ret;
34597246d6dSStanislav Fomichev
34697246d6dSStanislav Fomichev netdev_lock_ops(dev);
34797246d6dSStanislav Fomichev ret = netif_xdp_propagate(dev, bpf);
34897246d6dSStanislav Fomichev netdev_unlock_ops(dev);
34997246d6dSStanislav Fomichev
35097246d6dSStanislav Fomichev return ret;
35197246d6dSStanislav Fomichev }
35297246d6dSStanislav Fomichev EXPORT_SYMBOL_GPL(dev_xdp_propagate);
35304efcee6SStanislav Fomichev
35404efcee6SStanislav Fomichev /**
35504efcee6SStanislav Fomichev * netdev_state_change() - device changes state
35604efcee6SStanislav Fomichev * @dev: device to cause notification
35704efcee6SStanislav Fomichev *
35804efcee6SStanislav Fomichev * Called to indicate a device has changed state. This function calls
35904efcee6SStanislav Fomichev * the notifier chains for netdev_chain and sends a NEWLINK message
36004efcee6SStanislav Fomichev * to the routing socket.
36104efcee6SStanislav Fomichev */
netdev_state_change(struct net_device * dev)36204efcee6SStanislav Fomichev void netdev_state_change(struct net_device *dev)
36304efcee6SStanislav Fomichev {
36404efcee6SStanislav Fomichev netdev_lock_ops(dev);
36504efcee6SStanislav Fomichev netif_state_change(dev);
36604efcee6SStanislav Fomichev netdev_unlock_ops(dev);
36704efcee6SStanislav Fomichev }
36804efcee6SStanislav Fomichev EXPORT_SYMBOL(netdev_state_change);
369