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