File Index
Files and directories
Sign in
FILE

dev_api.c

File preview with syntax highlighting.

linux-6.19.14/net/core/dev_api.c C
  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 */
 18int 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 */
 39int 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}
 49EXPORT_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 */
 62int 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}
 73EXPORT_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 */
 80void 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
 87int dev_set_mac_address_user(struct net_device *dev,
 88			     struct sockaddr_storage *ss,
 89			     struct netlink_ext_ack *extack)
 90{
 91	int ret;
 92
 93	down_write(&dev_addr_sem);
 94	netdev_lock_ops(dev);
 95	ret = netif_set_mac_address(dev, ss, extack);
 96	netdev_unlock_ops(dev);
 97	up_write(&dev_addr_sem);
 98
 99	return ret;
100}
101EXPORT_SYMBOL(dev_set_mac_address_user);
102
103/**
104 * dev_change_net_namespace() - move device to different nethost namespace
105 * @dev: device
106 * @net: network namespace
107 * @pat: If not NULL name pattern to try if the current device name
108 *       is already taken in the destination network namespace.
109 *
110 * This function shuts down a device interface and moves it
111 * to a new network namespace. On success 0 is returned, on
112 * a failure a netagive errno code is returned.
113 *
114 * Callers must hold the rtnl semaphore.
115 *
116 * Return: 0 on success, -errno on failure.
117 */
118int dev_change_net_namespace(struct net_device *dev, struct net *net,
119			     const char *pat)
120{
121	return __dev_change_net_namespace(dev, net, pat, 0, NULL);
122}
123EXPORT_SYMBOL_GPL(dev_change_net_namespace);
124
125/**
126 * dev_change_carrier() - change device carrier
127 * @dev: device
128 * @new_carrier: new value
129 *
130 * Change device carrier
131 *
132 * Return: 0 on success, -errno on failure.
133 */
134int dev_change_carrier(struct net_device *dev, bool new_carrier)
135{
136	int ret;
137
138	netdev_lock_ops(dev);
139	ret = netif_change_carrier(dev, new_carrier);
140	netdev_unlock_ops(dev);
141
142	return ret;
143}
144
145/**
146 * dev_change_tx_queue_len() - change TX queue length of a netdevice
147 * @dev: device
148 * @new_len: new tx queue length
149 *
150 * Return: 0 on success, -errno on failure.
151 */
152int dev_change_tx_queue_len(struct net_device *dev, unsigned long new_len)
153{
154	int ret;
155
156	netdev_lock_ops(dev);
157	ret = netif_change_tx_queue_len(dev, new_len);
158	netdev_unlock_ops(dev);
159
160	return ret;
161}
162
163/**
164 * dev_change_proto_down() - set carrier according to proto_down
165 * @dev: device
166 * @proto_down: new value
167 *
168 * Return: 0 on success, -errno on failure.
169 */
170int dev_change_proto_down(struct net_device *dev, bool proto_down)
171{
172	int ret;
173
174	netdev_lock_ops(dev);
175	ret = netif_change_proto_down(dev, proto_down);
176	netdev_unlock_ops(dev);
177
178	return ret;
179}
180
181/**
182 * dev_open() - prepare an interface for use
183 * @dev: device to open
184 * @extack: netlink extended ack
185 *
186 * Takes a device from down to up state. The device's private open
187 * function is invoked and then the multicast lists are loaded. Finally
188 * the device is moved into the up state and a %NETDEV_UP message is
189 * sent to the netdev notifier chain.
190 *
191 * Calling this function on an active interface is a nop. On a failure
192 * a negative errno code is returned.
193 *
194 * Return: 0 on success, -errno on failure.
195 */
196int dev_open(struct net_device *dev, struct netlink_ext_ack *extack)
197{
198	int ret;
199
200	netdev_lock_ops(dev);
201	ret = netif_open(dev, extack);
202	netdev_unlock_ops(dev);
203
204	return ret;
205}
206EXPORT_SYMBOL(dev_open);
207
208/**
209 * dev_close() - shutdown an interface
210 * @dev: device to shutdown
211 *
212 * This function moves an active device into down state. A
213 * %NETDEV_GOING_DOWN is sent to the netdev notifier chain. The device
214 * is then deactivated and finally a %NETDEV_DOWN is sent to the notifier
215 * chain.
216 */
217void dev_close(struct net_device *dev)
218{
219	netdev_lock_ops(dev);
220	netif_close(dev);
221	netdev_unlock_ops(dev);
222}
223EXPORT_SYMBOL(dev_close);
224
225int dev_eth_ioctl(struct net_device *dev,
226		  struct ifreq *ifr, unsigned int cmd)
227{
228	const struct net_device_ops *ops = dev->netdev_ops;
229	int ret = -ENODEV;
230
231	if (!ops->ndo_eth_ioctl)
232		return -EOPNOTSUPP;
233
234	netdev_lock_ops(dev);
235	if (netif_device_present(dev))
236		ret = ops->ndo_eth_ioctl(dev, ifr, cmd);
237	netdev_unlock_ops(dev);
238
239	return ret;
240}
241EXPORT_SYMBOL(dev_eth_ioctl);
242
243int dev_set_mtu(struct net_device *dev, int new_mtu)
244{
245	int ret;
246
247	netdev_lock_ops(dev);
248	ret = netif_set_mtu(dev, new_mtu);
249	netdev_unlock_ops(dev);
250
251	return ret;
252}
253EXPORT_SYMBOL(dev_set_mtu);
254
255/**
256 * dev_disable_lro() - disable Large Receive Offload on a device
257 * @dev: device
258 *
259 * Disable Large Receive Offload (LRO) on a net device.  Must be
260 * called under RTNL.  This is needed if received packets may be
261 * forwarded to another interface.
262 */
263void dev_disable_lro(struct net_device *dev)
264{
265	netdev_lock_ops(dev);
266	netif_disable_lro(dev);
267	netdev_unlock_ops(dev);
268}
269EXPORT_SYMBOL(dev_disable_lro);
270
271/**
272 * dev_set_promiscuity() - update promiscuity count on a device
273 * @dev: device
274 * @inc: modifier
275 *
276 * Add or remove promiscuity from a device. While the count in the device
277 * remains above zero the interface remains promiscuous. Once it hits zero
278 * the device reverts back to normal filtering operation. A negative inc
279 * value is used to drop promiscuity on the device.
280 * Return 0 if successful or a negative errno code on error.
281 */
282int dev_set_promiscuity(struct net_device *dev, int inc)
283{
284	int ret;
285
286	netdev_lock_ops(dev);
287	ret = netif_set_promiscuity(dev, inc);
288	netdev_unlock_ops(dev);
289
290	return ret;
291}
292EXPORT_SYMBOL(dev_set_promiscuity);
293
294/**
295 * dev_set_allmulti() - update allmulti count on a device
296 * @dev: device
297 * @inc: modifier
298 *
299 * Add or remove reception of all multicast frames to a device. While the
300 * count in the device remains above zero the interface remains listening
301 * to all interfaces. Once it hits zero the device reverts back to normal
302 * filtering operation. A negative @inc value is used to drop the counter
303 * when releasing a resource needing all multicasts.
304 *
305 * Return: 0 on success, -errno on failure.
306 */
307
308int dev_set_allmulti(struct net_device *dev, int inc)
309{
310	int ret;
311
312	netdev_lock_ops(dev);
313	ret = netif_set_allmulti(dev, inc, true);
314	netdev_unlock_ops(dev);
315
316	return ret;
317}
318EXPORT_SYMBOL(dev_set_allmulti);
319
320/**
321 * dev_set_mac_address() - change Media Access Control Address
322 * @dev: device
323 * @ss: new address
324 * @extack: netlink extended ack
325 *
326 * Change the hardware (MAC) address of the device
327 *
328 * Return: 0 on success, -errno on failure.
329 */
330int dev_set_mac_address(struct net_device *dev, struct sockaddr_storage *ss,
331			struct netlink_ext_ack *extack)
332{
333	int ret;
334
335	netdev_lock_ops(dev);
336	ret = netif_set_mac_address(dev, ss, extack);
337	netdev_unlock_ops(dev);
338
339	return ret;
340}
341EXPORT_SYMBOL(dev_set_mac_address);
342
343int dev_xdp_propagate(struct net_device *dev, struct netdev_bpf *bpf)
344{
345	int ret;
346
347	netdev_lock_ops(dev);
348	ret = netif_xdp_propagate(dev, bpf);
349	netdev_unlock_ops(dev);
350
351	return ret;
352}
353EXPORT_SYMBOL_GPL(dev_xdp_propagate);
354
355/**
356 * netdev_state_change() - device changes state
357 * @dev: device to cause notification
358 *
359 * Called to indicate a device has changed state. This function calls
360 * the notifier chains for netdev_chain and sends a NEWLINK message
361 * to the routing socket.
362 */
363void netdev_state_change(struct net_device *dev)
364{
365	netdev_lock_ops(dev);
366	netif_state_change(dev);
367	netdev_unlock_ops(dev);
368}
369EXPORT_SYMBOL(netdev_state_change);
370
371int dev_set_threaded(struct net_device *dev,
372		     enum netdev_napi_threaded threaded)
373{
374	int ret;
375
376	netdev_lock(dev);
377	ret = netif_set_threaded(dev, threaded);
378	netdev_unlock(dev);
379
380	return ret;
381}
382EXPORT_SYMBOL(dev_set_threaded);
~/ Read-only file preview.