1 // SPDX-License-Identifier: GPL-2.0-or-later
2
3 #include <linux/netdevice.h>
4 #include <net/netdev_lock.h>
5
6 #include "dev.h"
7
8 /**
9 * dev_change_name() - change name of a device
10 * @dev: device
11 * @newname: name (or format string) must be at least IFNAMSIZ
12 *
13 * Change name of a device, can pass format strings "eth%d".
14 * for wildcarding.
15 *
16 * Return: 0 on success, -errno on failure.
17 */
dev_change_name(struct net_device * dev,const char * newname)18 int dev_change_name(struct net_device *dev, const char *newname)
19 {
20 int ret;
21
22 netdev_lock_ops(dev);
23 ret = netif_change_name(dev, newname);
24 netdev_unlock_ops(dev);
25
26 return ret;
27 }
28
29 /**
30 * dev_set_alias() - change ifalias of a device
31 * @dev: device
32 * @alias: name up to IFALIASZ
33 * @len: limit of bytes to copy from info
34 *
35 * Set ifalias for a device.
36 *
37 * Return: 0 on success, -errno on failure.
38 */
dev_set_alias(struct net_device * dev,const char * alias,size_t len)39 int dev_set_alias(struct net_device *dev, const char *alias, size_t len)
40 {
41 int ret;
42
43 netdev_lock_ops(dev);
44 ret = netif_set_alias(dev, alias, len);
45 netdev_unlock_ops(dev);
46
47 return ret;
48 }
49 EXPORT_SYMBOL(dev_set_alias);
50
51 /**
52 * dev_change_flags() - change device settings
53 * @dev: device
54 * @flags: device state flags
55 * @extack: netlink extended ack
56 *
57 * Change settings on device based state flags. The flags are
58 * in the userspace exported format.
59 *
60 * Return: 0 on success, -errno on failure.
61 */
dev_change_flags(struct net_device * dev,unsigned int flags,struct netlink_ext_ack * extack)62 int dev_change_flags(struct net_device *dev, unsigned int flags,
63 struct netlink_ext_ack *extack)
64 {
65 int ret;
66
67 netdev_lock_ops(dev);
68 ret = netif_change_flags(dev, flags, extack);
69 netdev_unlock_ops(dev);
70
71 return ret;
72 }
73 EXPORT_SYMBOL(dev_change_flags);
74
75 /**
76 * dev_set_group() - change group this device belongs to
77 * @dev: device
78 * @new_group: group this device should belong to
79 */
dev_set_group(struct net_device * dev,int new_group)80 void dev_set_group(struct net_device *dev, int new_group)
81 {
82 netdev_lock_ops(dev);
83 netif_set_group(dev, new_group);
84 netdev_unlock_ops(dev);
85 }
86
dev_set_mac_address_user(struct net_device * dev,struct sockaddr * sa,struct netlink_ext_ack * extack)87 int dev_set_mac_address_user(struct net_device *dev, struct sockaddr *sa,
88 struct netlink_ext_ack *extack)
89 {
90 int ret;
91
92 down_write(&dev_addr_sem);
93 netdev_lock_ops(dev);
94 ret = netif_set_mac_address(dev, sa, extack);
95 netdev_unlock_ops(dev);
96 up_write(&dev_addr_sem);
97
98 return ret;
99 }
100 EXPORT_SYMBOL(dev_set_mac_address_user);
101
102 /**
103 * dev_change_net_namespace() - move device to different nethost namespace
104 * @dev: device
105 * @net: network namespace
106 * @pat: If not NULL name pattern to try if the current device name
107 * is already taken in the destination network namespace.
108 *
109 * This function shuts down a device interface and moves it
110 * to a new network namespace. On success 0 is returned, on
111 * a failure a netagive errno code is returned.
112 *
113 * Callers must hold the rtnl semaphore.
114 *
115 * Return: 0 on success, -errno on failure.
116 */
dev_change_net_namespace(struct net_device * dev,struct net * net,const char * pat)117 int dev_change_net_namespace(struct net_device *dev, struct net *net,
118 const char *pat)
119 {
120 return __dev_change_net_namespace(dev, net, pat, 0, NULL);
121 }
122 EXPORT_SYMBOL_GPL(dev_change_net_namespace);
123
124 /**
125 * dev_change_carrier() - change device carrier
126 * @dev: device
127 * @new_carrier: new value
128 *
129 * Change device carrier
130 *
131 * Return: 0 on success, -errno on failure.
132 */
dev_change_carrier(struct net_device * dev,bool new_carrier)133 int dev_change_carrier(struct net_device *dev, bool new_carrier)
134 {
135 int ret;
136
137 netdev_lock_ops(dev);
138 ret = netif_change_carrier(dev, new_carrier);
139 netdev_unlock_ops(dev);
140
141 return ret;
142 }
143
144 /**
145 * dev_change_tx_queue_len() - change TX queue length of a netdevice
146 * @dev: device
147 * @new_len: new tx queue length
148 *
149 * Return: 0 on success, -errno on failure.
150 */
dev_change_tx_queue_len(struct net_device * dev,unsigned long new_len)151 int dev_change_tx_queue_len(struct net_device *dev, unsigned long new_len)
152 {
153 int ret;
154
155 netdev_lock_ops(dev);
156 ret = netif_change_tx_queue_len(dev, new_len);
157 netdev_unlock_ops(dev);
158
159 return ret;
160 }
161
162 /**
163 * dev_change_proto_down() - set carrier according to proto_down
164 * @dev: device
165 * @proto_down: new value
166 *
167 * Return: 0 on success, -errno on failure.
168 */
dev_change_proto_down(struct net_device * dev,bool proto_down)169 int dev_change_proto_down(struct net_device *dev, bool proto_down)
170 {
171 int ret;
172
173 netdev_lock_ops(dev);
174 ret = netif_change_proto_down(dev, proto_down);
175 netdev_unlock_ops(dev);
176
177 return ret;
178 }
179
180 /**
181 * dev_open() - prepare an interface for use
182 * @dev: device to open
183 * @extack: netlink extended ack
184 *
185 * Takes a device from down to up state. The device's private open
186 * function is invoked and then the multicast lists are loaded. Finally
187 * the device is moved into the up state and a %NETDEV_UP message is
188 * sent to the netdev notifier chain.
189 *
190 * Calling this function on an active interface is a nop. On a failure
191 * a negative errno code is returned.
192 *
193 * Return: 0 on success, -errno on failure.
194 */
dev_open(struct net_device * dev,struct netlink_ext_ack * extack)195 int dev_open(struct net_device *dev, struct netlink_ext_ack *extack)
196 {
197 int ret;
198
199 netdev_lock_ops(dev);
200 ret = netif_open(dev, extack);
201 netdev_unlock_ops(dev);
202
203 return ret;
204 }
205 EXPORT_SYMBOL(dev_open);
206
207 /**
208 * dev_close() - shutdown an interface
209 * @dev: device to shutdown
210 *
211 * This function moves an active device into down state. A
212 * %NETDEV_GOING_DOWN is sent to the netdev notifier chain. The device
213 * is then deactivated and finally a %NETDEV_DOWN is sent to the notifier
214 * chain.
215 */
dev_close(struct net_device * dev)216 void dev_close(struct net_device *dev)
217 {
218 netdev_lock_ops(dev);
219 netif_close(dev);
220 netdev_unlock_ops(dev);
221 }
222 EXPORT_SYMBOL(dev_close);
223
dev_eth_ioctl(struct net_device * dev,struct ifreq * ifr,unsigned int cmd)224 int dev_eth_ioctl(struct net_device *dev,
225 struct ifreq *ifr, unsigned int cmd)
226 {
227 const struct net_device_ops *ops = dev->netdev_ops;
228 int ret = -ENODEV;
229
230 if (!ops->ndo_eth_ioctl)
231 return -EOPNOTSUPP;
232
233 netdev_lock_ops(dev);
234 if (netif_device_present(dev))
235 ret = ops->ndo_eth_ioctl(dev, ifr, cmd);
236 netdev_unlock_ops(dev);
237
238 return ret;
239 }
240 EXPORT_SYMBOL(dev_eth_ioctl);
241
dev_set_mtu(struct net_device * dev,int new_mtu)242 int dev_set_mtu(struct net_device *dev, int new_mtu)
243 {
244 int ret;
245
246 netdev_lock_ops(dev);
247 ret = netif_set_mtu(dev, new_mtu);
248 netdev_unlock_ops(dev);
249
250 return ret;
251 }
252 EXPORT_SYMBOL(dev_set_mtu);
253
254 /**
255 * dev_disable_lro() - disable Large Receive Offload on a device
256 * @dev: device
257 *
258 * Disable Large Receive Offload (LRO) on a net device. Must be
259 * called under RTNL. This is needed if received packets may be
260 * forwarded to another interface.
261 */
dev_disable_lro(struct net_device * dev)262 void dev_disable_lro(struct net_device *dev)
263 {
264 netdev_lock_ops(dev);
265 netif_disable_lro(dev);
266 netdev_unlock_ops(dev);
267 }
268 EXPORT_SYMBOL(dev_disable_lro);
269
270 /**
271 * dev_set_promiscuity() - update promiscuity count on a device
272 * @dev: device
273 * @inc: modifier
274 *
275 * Add or remove promiscuity from a device. While the count in the device
276 * remains above zero the interface remains promiscuous. Once it hits zero
277 * the device reverts back to normal filtering operation. A negative inc
278 * value is used to drop promiscuity on the device.
279 * Return 0 if successful or a negative errno code on error.
280 */
dev_set_promiscuity(struct net_device * dev,int inc)281 int dev_set_promiscuity(struct net_device *dev, int inc)
282 {
283 int ret;
284
285 netdev_lock_ops(dev);
286 ret = netif_set_promiscuity(dev, inc);
287 netdev_unlock_ops(dev);
288
289 return ret;
290 }
291 EXPORT_SYMBOL(dev_set_promiscuity);
292
293 /**
294 * dev_set_allmulti() - update allmulti count on a device
295 * @dev: device
296 * @inc: modifier
297 *
298 * Add or remove reception of all multicast frames to a device. While the
299 * count in the device remains above zero the interface remains listening
300 * to all interfaces. Once it hits zero the device reverts back to normal
301 * filtering operation. A negative @inc value is used to drop the counter
302 * when releasing a resource needing all multicasts.
303 *
304 * Return: 0 on success, -errno on failure.
305 */
306
dev_set_allmulti(struct net_device * dev,int inc)307 int dev_set_allmulti(struct net_device *dev, int inc)
308 {
309 int ret;
310
311 netdev_lock_ops(dev);
312 ret = netif_set_allmulti(dev, inc, true);
313 netdev_unlock_ops(dev);
314
315 return ret;
316 }
317 EXPORT_SYMBOL(dev_set_allmulti);
318
319 /**
320 * dev_set_mac_address() - change Media Access Control Address
321 * @dev: device
322 * @sa: new address
323 * @extack: netlink extended ack
324 *
325 * Change the hardware (MAC) address of the device
326 *
327 * Return: 0 on success, -errno on failure.
328 */
dev_set_mac_address(struct net_device * dev,struct sockaddr * sa,struct netlink_ext_ack * extack)329 int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
330 struct netlink_ext_ack *extack)
331 {
332 int ret;
333
334 netdev_lock_ops(dev);
335 ret = netif_set_mac_address(dev, sa, extack);
336 netdev_unlock_ops(dev);
337
338 return ret;
339 }
340 EXPORT_SYMBOL(dev_set_mac_address);
341
dev_xdp_propagate(struct net_device * dev,struct netdev_bpf * bpf)342 int dev_xdp_propagate(struct net_device *dev, struct netdev_bpf *bpf)
343 {
344 int ret;
345
346 netdev_lock_ops(dev);
347 ret = netif_xdp_propagate(dev, bpf);
348 netdev_unlock_ops(dev);
349
350 return ret;
351 }
352 EXPORT_SYMBOL_GPL(dev_xdp_propagate);
353
354 /**
355 * netdev_state_change() - device changes state
356 * @dev: device to cause notification
357 *
358 * Called to indicate a device has changed state. This function calls
359 * the notifier chains for netdev_chain and sends a NEWLINK message
360 * to the routing socket.
361 */
netdev_state_change(struct net_device * dev)362 void netdev_state_change(struct net_device *dev)
363 {
364 netdev_lock_ops(dev);
365 netif_state_change(dev);
366 netdev_unlock_ops(dev);
367 }
368 EXPORT_SYMBOL(netdev_state_change);
369