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