1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * INET An implementation of the TCP/IP protocol suite for the LINUX
4 * operating system. INET is implemented using the BSD Socket
5 * interface as the means of communication with the user level.
6 *
7 * Routing netlink socket interface: protocol independent part.
8 *
9 * Authors: Alexey Kuznetsov, <[email protected]>
10 *
11 * Fixes:
12 * Vitaly E. Lavrov RTA_OK arithmetic was wrong.
13 */
14
15 #include <linux/bitops.h>
16 #include <linux/errno.h>
17 #include <linux/module.h>
18 #include <linux/types.h>
19 #include <linux/socket.h>
20 #include <linux/kernel.h>
21 #include <linux/timer.h>
22 #include <linux/string.h>
23 #include <linux/sockios.h>
24 #include <linux/net.h>
25 #include <linux/fcntl.h>
26 #include <linux/mm.h>
27 #include <linux/slab.h>
28 #include <linux/interrupt.h>
29 #include <linux/capability.h>
30 #include <linux/skbuff.h>
31 #include <linux/init.h>
32 #include <linux/security.h>
33 #include <linux/mutex.h>
34 #include <linux/if_addr.h>
35 #include <linux/if_bridge.h>
36 #include <linux/if_vlan.h>
37 #include <linux/pci.h>
38 #include <linux/etherdevice.h>
39 #include <linux/bpf.h>
40
41 #include <linux/uaccess.h>
42
43 #include <linux/inet.h>
44 #include <linux/netdevice.h>
45 #include <net/ip.h>
46 #include <net/protocol.h>
47 #include <net/arp.h>
48 #include <net/route.h>
49 #include <net/udp.h>
50 #include <net/tcp.h>
51 #include <net/sock.h>
52 #include <net/pkt_sched.h>
53 #include <net/fib_rules.h>
54 #include <net/rtnetlink.h>
55 #include <net/net_namespace.h>
56 #include <net/devlink.h>
57 #if IS_ENABLED(CONFIG_IPV6)
58 #include <net/addrconf.h>
59 #endif
60 #include <linux/dpll.h>
61
62 #include "dev.h"
63
64 #define RTNL_MAX_TYPE 50
65 #define RTNL_SLAVE_MAX_TYPE 44
66
67 struct rtnl_link {
68 rtnl_doit_func doit;
69 rtnl_dumpit_func dumpit;
70 struct module *owner;
71 unsigned int flags;
72 struct rcu_head rcu;
73 };
74
75 static DEFINE_MUTEX(rtnl_mutex);
76
rtnl_lock(void)77 void rtnl_lock(void)
78 {
79 mutex_lock(&rtnl_mutex);
80 }
81 EXPORT_SYMBOL(rtnl_lock);
82
rtnl_lock_killable(void)83 int rtnl_lock_killable(void)
84 {
85 return mutex_lock_killable(&rtnl_mutex);
86 }
87
88 static struct sk_buff *defer_kfree_skb_list;
rtnl_kfree_skbs(struct sk_buff * head,struct sk_buff * tail)89 void rtnl_kfree_skbs(struct sk_buff *head, struct sk_buff *tail)
90 {
91 if (head && tail) {
92 tail->next = defer_kfree_skb_list;
93 defer_kfree_skb_list = head;
94 }
95 }
96 EXPORT_SYMBOL(rtnl_kfree_skbs);
97
__rtnl_unlock(void)98 void __rtnl_unlock(void)
99 {
100 struct sk_buff *head = defer_kfree_skb_list;
101
102 defer_kfree_skb_list = NULL;
103
104 /* Ensure that we didn't actually add any TODO item when __rtnl_unlock()
105 * is used. In some places, e.g. in cfg80211, we have code that will do
106 * something like
107 * rtnl_lock()
108 * wiphy_lock()
109 * ...
110 * rtnl_unlock()
111 *
112 * and because netdev_run_todo() acquires the RTNL for items on the list
113 * we could cause a situation such as this:
114 * Thread 1 Thread 2
115 * rtnl_lock()
116 * unregister_netdevice()
117 * __rtnl_unlock()
118 * rtnl_lock()
119 * wiphy_lock()
120 * rtnl_unlock()
121 * netdev_run_todo()
122 * __rtnl_unlock()
123 *
124 * // list not empty now
125 * // because of thread 2
126 * rtnl_lock()
127 * while (!list_empty(...))
128 * rtnl_lock()
129 * wiphy_lock()
130 * **** DEADLOCK ****
131 *
132 * However, usage of __rtnl_unlock() is rare, and so we can ensure that
133 * it's not used in cases where something is added to do the list.
134 */
135 WARN_ON(!list_empty(&net_todo_list));
136
137 mutex_unlock(&rtnl_mutex);
138
139 while (head) {
140 struct sk_buff *next = head->next;
141
142 kfree_skb(head);
143 cond_resched();
144 head = next;
145 }
146 }
147
rtnl_unlock(void)148 void rtnl_unlock(void)
149 {
150 /* This fellow will unlock it for us. */
151 netdev_run_todo();
152 }
153 EXPORT_SYMBOL(rtnl_unlock);
154
rtnl_trylock(void)155 int rtnl_trylock(void)
156 {
157 return mutex_trylock(&rtnl_mutex);
158 }
159 EXPORT_SYMBOL(rtnl_trylock);
160
rtnl_is_locked(void)161 int rtnl_is_locked(void)
162 {
163 return mutex_is_locked(&rtnl_mutex);
164 }
165 EXPORT_SYMBOL(rtnl_is_locked);
166
refcount_dec_and_rtnl_lock(refcount_t * r)167 bool refcount_dec_and_rtnl_lock(refcount_t *r)
168 {
169 return refcount_dec_and_mutex_lock(r, &rtnl_mutex);
170 }
171 EXPORT_SYMBOL(refcount_dec_and_rtnl_lock);
172
173 #ifdef CONFIG_PROVE_LOCKING
lockdep_rtnl_is_held(void)174 bool lockdep_rtnl_is_held(void)
175 {
176 return lockdep_is_held(&rtnl_mutex);
177 }
178 EXPORT_SYMBOL(lockdep_rtnl_is_held);
179 #endif /* #ifdef CONFIG_PROVE_LOCKING */
180
181 #ifdef CONFIG_DEBUG_NET_SMALL_RTNL
__rtnl_net_lock(struct net * net)182 void __rtnl_net_lock(struct net *net)
183 {
184 ASSERT_RTNL();
185
186 mutex_lock(&net->rtnl_mutex);
187 }
188 EXPORT_SYMBOL(__rtnl_net_lock);
189
__rtnl_net_unlock(struct net * net)190 void __rtnl_net_unlock(struct net *net)
191 {
192 ASSERT_RTNL();
193
194 mutex_unlock(&net->rtnl_mutex);
195 }
196 EXPORT_SYMBOL(__rtnl_net_unlock);
197
rtnl_net_lock(struct net * net)198 void rtnl_net_lock(struct net *net)
199 {
200 rtnl_lock();
201 __rtnl_net_lock(net);
202 }
203 EXPORT_SYMBOL(rtnl_net_lock);
204
rtnl_net_unlock(struct net * net)205 void rtnl_net_unlock(struct net *net)
206 {
207 __rtnl_net_unlock(net);
208 rtnl_unlock();
209 }
210 EXPORT_SYMBOL(rtnl_net_unlock);
211
rtnl_net_trylock(struct net * net)212 int rtnl_net_trylock(struct net *net)
213 {
214 int ret = rtnl_trylock();
215
216 if (ret)
217 __rtnl_net_lock(net);
218
219 return ret;
220 }
221 EXPORT_SYMBOL(rtnl_net_trylock);
222
rtnl_net_lock_killable(struct net * net)223 int rtnl_net_lock_killable(struct net *net)
224 {
225 int ret = rtnl_lock_killable();
226
227 if (!ret)
228 __rtnl_net_lock(net);
229
230 return ret;
231 }
232
rtnl_net_cmp_locks(const struct net * net_a,const struct net * net_b)233 static int rtnl_net_cmp_locks(const struct net *net_a, const struct net *net_b)
234 {
235 if (net_eq(net_a, net_b))
236 return 0;
237
238 /* always init_net first */
239 if (net_eq(net_a, &init_net))
240 return -1;
241
242 if (net_eq(net_b, &init_net))
243 return 1;
244
245 /* otherwise lock in ascending order */
246 return net_a < net_b ? -1 : 1;
247 }
248
rtnl_net_lock_cmp_fn(const struct lockdep_map * a,const struct lockdep_map * b)249 int rtnl_net_lock_cmp_fn(const struct lockdep_map *a, const struct lockdep_map *b)
250 {
251 const struct net *net_a, *net_b;
252
253 net_a = container_of(a, struct net, rtnl_mutex.dep_map);
254 net_b = container_of(b, struct net, rtnl_mutex.dep_map);
255
256 return rtnl_net_cmp_locks(net_a, net_b);
257 }
258
rtnl_net_is_locked(struct net * net)259 bool rtnl_net_is_locked(struct net *net)
260 {
261 return rtnl_is_locked() && mutex_is_locked(&net->rtnl_mutex);
262 }
263 EXPORT_SYMBOL(rtnl_net_is_locked);
264
lockdep_rtnl_net_is_held(struct net * net)265 bool lockdep_rtnl_net_is_held(struct net *net)
266 {
267 return lockdep_rtnl_is_held() && lockdep_is_held(&net->rtnl_mutex);
268 }
269 EXPORT_SYMBOL(lockdep_rtnl_net_is_held);
270 #else
rtnl_net_cmp_locks(const struct net * net_a,const struct net * net_b)271 static int rtnl_net_cmp_locks(const struct net *net_a, const struct net *net_b)
272 {
273 /* No need to swap */
274 return -1;
275 }
276 #endif
277
278 struct rtnl_nets {
279 /* ->newlink() needs to freeze 3 netns at most;
280 * 2 for the new device, 1 for its peer.
281 */
282 struct net *net[3];
283 unsigned char len;
284 };
285
rtnl_nets_init(struct rtnl_nets * rtnl_nets)286 static void rtnl_nets_init(struct rtnl_nets *rtnl_nets)
287 {
288 memset(rtnl_nets, 0, sizeof(*rtnl_nets));
289 }
290
rtnl_nets_destroy(struct rtnl_nets * rtnl_nets)291 static void rtnl_nets_destroy(struct rtnl_nets *rtnl_nets)
292 {
293 int i;
294
295 for (i = 0; i < rtnl_nets->len; i++) {
296 put_net(rtnl_nets->net[i]);
297 rtnl_nets->net[i] = NULL;
298 }
299
300 rtnl_nets->len = 0;
301 }
302
303 /**
304 * rtnl_nets_add - Add netns to be locked before ->newlink().
305 *
306 * @rtnl_nets: rtnl_nets pointer passed to ->get_peer_net().
307 * @net: netns pointer with an extra refcnt held.
308 *
309 * The extra refcnt is released in rtnl_nets_destroy().
310 */
rtnl_nets_add(struct rtnl_nets * rtnl_nets,struct net * net)311 static void rtnl_nets_add(struct rtnl_nets *rtnl_nets, struct net *net)
312 {
313 int i;
314
315 DEBUG_NET_WARN_ON_ONCE(rtnl_nets->len == ARRAY_SIZE(rtnl_nets->net));
316
317 for (i = 0; i < rtnl_nets->len; i++) {
318 switch (rtnl_net_cmp_locks(rtnl_nets->net[i], net)) {
319 case 0:
320 put_net(net);
321 return;
322 case 1:
323 swap(rtnl_nets->net[i], net);
324 }
325 }
326
327 rtnl_nets->net[i] = net;
328 rtnl_nets->len++;
329 }
330
rtnl_nets_lock(struct rtnl_nets * rtnl_nets)331 static void rtnl_nets_lock(struct rtnl_nets *rtnl_nets)
332 {
333 int i;
334
335 rtnl_lock();
336
337 for (i = 0; i < rtnl_nets->len; i++)
338 __rtnl_net_lock(rtnl_nets->net[i]);
339 }
340
rtnl_nets_unlock(struct rtnl_nets * rtnl_nets)341 static void rtnl_nets_unlock(struct rtnl_nets *rtnl_nets)
342 {
343 int i;
344
345 for (i = 0; i < rtnl_nets->len; i++)
346 __rtnl_net_unlock(rtnl_nets->net[i]);
347
348 rtnl_unlock();
349 }
350
351 static struct rtnl_link __rcu *__rcu *rtnl_msg_handlers[RTNL_FAMILY_MAX + 1];
352
rtm_msgindex(int msgtype)353 static inline int rtm_msgindex(int msgtype)
354 {
355 int msgindex = msgtype - RTM_BASE;
356
357 /*
358 * msgindex < 0 implies someone tried to register a netlink
359 * control code. msgindex >= RTM_NR_MSGTYPES may indicate that
360 * the message type has not been added to linux/rtnetlink.h
361 */
362 BUG_ON(msgindex < 0 || msgindex >= RTM_NR_MSGTYPES);
363
364 return msgindex;
365 }
366
rtnl_get_link(int protocol,int msgtype)367 static struct rtnl_link *rtnl_get_link(int protocol, int msgtype)
368 {
369 struct rtnl_link __rcu **tab;
370
371 if (protocol >= ARRAY_SIZE(rtnl_msg_handlers))
372 protocol = PF_UNSPEC;
373
374 tab = rcu_dereference_rtnl(rtnl_msg_handlers[protocol]);
375 if (!tab)
376 tab = rcu_dereference_rtnl(rtnl_msg_handlers[PF_UNSPEC]);
377
378 return rcu_dereference_rtnl(tab[msgtype]);
379 }
380
rtnl_register_internal(struct module * owner,int protocol,int msgtype,rtnl_doit_func doit,rtnl_dumpit_func dumpit,unsigned int flags)381 static int rtnl_register_internal(struct module *owner,
382 int protocol, int msgtype,
383 rtnl_doit_func doit, rtnl_dumpit_func dumpit,
384 unsigned int flags)
385 {
386 struct rtnl_link *link, *old;
387 struct rtnl_link __rcu **tab;
388 int msgindex;
389 int ret = -ENOBUFS;
390
391 BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
392 msgindex = rtm_msgindex(msgtype);
393
394 rtnl_lock();
395 tab = rtnl_dereference(rtnl_msg_handlers[protocol]);
396 if (tab == NULL) {
397 tab = kcalloc(RTM_NR_MSGTYPES, sizeof(void *), GFP_KERNEL);
398 if (!tab)
399 goto unlock;
400
401 /* ensures we see the 0 stores */
402 rcu_assign_pointer(rtnl_msg_handlers[protocol], tab);
403 }
404
405 old = rtnl_dereference(tab[msgindex]);
406 if (old) {
407 link = kmemdup(old, sizeof(*old), GFP_KERNEL);
408 if (!link)
409 goto unlock;
410 } else {
411 link = kzalloc(sizeof(*link), GFP_KERNEL);
412 if (!link)
413 goto unlock;
414 }
415
416 WARN_ON(link->owner && link->owner != owner);
417 link->owner = owner;
418
419 WARN_ON(doit && link->doit && link->doit != doit);
420 if (doit)
421 link->doit = doit;
422 WARN_ON(dumpit && link->dumpit && link->dumpit != dumpit);
423 if (dumpit)
424 link->dumpit = dumpit;
425
426 WARN_ON(rtnl_msgtype_kind(msgtype) != RTNL_KIND_DEL &&
427 (flags & RTNL_FLAG_BULK_DEL_SUPPORTED));
428 link->flags |= flags;
429
430 /* publish protocol:msgtype */
431 rcu_assign_pointer(tab[msgindex], link);
432 ret = 0;
433 if (old)
434 kfree_rcu(old, rcu);
435 unlock:
436 rtnl_unlock();
437 return ret;
438 }
439
440 /**
441 * rtnl_unregister - Unregister a rtnetlink message type
442 * @protocol: Protocol family or PF_UNSPEC
443 * @msgtype: rtnetlink message type
444 *
445 * Returns 0 on success or a negative error code.
446 */
rtnl_unregister(int protocol,int msgtype)447 static int rtnl_unregister(int protocol, int msgtype)
448 {
449 struct rtnl_link __rcu **tab;
450 struct rtnl_link *link;
451 int msgindex;
452
453 BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
454 msgindex = rtm_msgindex(msgtype);
455
456 rtnl_lock();
457 tab = rtnl_dereference(rtnl_msg_handlers[protocol]);
458 if (!tab) {
459 rtnl_unlock();
460 return -ENOENT;
461 }
462
463 link = rcu_replace_pointer_rtnl(tab[msgindex], NULL);
464 rtnl_unlock();
465
466 kfree_rcu(link, rcu);
467
468 return 0;
469 }
470
471 /**
472 * rtnl_unregister_all - Unregister all rtnetlink message type of a protocol
473 * @protocol : Protocol family or PF_UNSPEC
474 *
475 * Identical to calling rtnl_unregster() for all registered message types
476 * of a certain protocol family.
477 */
rtnl_unregister_all(int protocol)478 void rtnl_unregister_all(int protocol)
479 {
480 struct rtnl_link __rcu **tab;
481 struct rtnl_link *link;
482 int msgindex;
483
484 BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
485
486 rtnl_lock();
487 tab = rcu_replace_pointer_rtnl(rtnl_msg_handlers[protocol], NULL);
488 if (!tab) {
489 rtnl_unlock();
490 return;
491 }
492 for (msgindex = 0; msgindex < RTM_NR_MSGTYPES; msgindex++) {
493 link = rcu_replace_pointer_rtnl(tab[msgindex], NULL);
494 kfree_rcu(link, rcu);
495 }
496 rtnl_unlock();
497
498 synchronize_net();
499
500 kfree(tab);
501 }
502 EXPORT_SYMBOL_GPL(rtnl_unregister_all);
503
504 /**
505 * __rtnl_register_many - Register rtnetlink message types
506 * @handlers: Array of struct rtnl_msg_handlers
507 * @n: The length of @handlers
508 *
509 * Registers the specified function pointers (at least one of them has
510 * to be non-NULL) to be called whenever a request message for the
511 * specified protocol family and message type is received.
512 *
513 * The special protocol family PF_UNSPEC may be used to define fallback
514 * function pointers for the case when no entry for the specific protocol
515 * family exists.
516 *
517 * When one element of @handlers fails to register,
518 * 1) built-in: panics.
519 * 2) modules : the previous successful registrations are unwinded
520 * and an error is returned.
521 *
522 * Use rtnl_register_many().
523 */
__rtnl_register_many(const struct rtnl_msg_handler * handlers,int n)524 int __rtnl_register_many(const struct rtnl_msg_handler *handlers, int n)
525 {
526 const struct rtnl_msg_handler *handler;
527 int i, err;
528
529 for (i = 0, handler = handlers; i < n; i++, handler++) {
530 err = rtnl_register_internal(handler->owner, handler->protocol,
531 handler->msgtype, handler->doit,
532 handler->dumpit, handler->flags);
533 if (err) {
534 if (!handler->owner)
535 panic("Unable to register rtnetlink message "
536 "handlers, %pS\n", handlers);
537
538 __rtnl_unregister_many(handlers, i);
539 break;
540 }
541 }
542
543 return err;
544 }
545 EXPORT_SYMBOL_GPL(__rtnl_register_many);
546
__rtnl_unregister_many(const struct rtnl_msg_handler * handlers,int n)547 void __rtnl_unregister_many(const struct rtnl_msg_handler *handlers, int n)
548 {
549 const struct rtnl_msg_handler *handler;
550 int i;
551
552 for (i = n - 1, handler = handlers + n - 1; i >= 0; i--, handler--)
553 rtnl_unregister(handler->protocol, handler->msgtype);
554 }
555 EXPORT_SYMBOL_GPL(__rtnl_unregister_many);
556
557 static DEFINE_MUTEX(link_ops_mutex);
558 static LIST_HEAD(link_ops);
559
rtnl_link_ops_get(const char * kind,int * srcu_index)560 static struct rtnl_link_ops *rtnl_link_ops_get(const char *kind, int *srcu_index)
561 {
562 struct rtnl_link_ops *ops;
563
564 rcu_read_lock();
565
566 list_for_each_entry_rcu(ops, &link_ops, list) {
567 if (!strcmp(ops->kind, kind)) {
568 *srcu_index = srcu_read_lock(&ops->srcu);
569 goto unlock;
570 }
571 }
572
573 ops = NULL;
574 unlock:
575 rcu_read_unlock();
576
577 return ops;
578 }
579
rtnl_link_ops_put(struct rtnl_link_ops * ops,int srcu_index)580 static void rtnl_link_ops_put(struct rtnl_link_ops *ops, int srcu_index)
581 {
582 srcu_read_unlock(&ops->srcu, srcu_index);
583 }
584
585 /**
586 * rtnl_link_register - Register rtnl_link_ops with rtnetlink.
587 * @ops: struct rtnl_link_ops * to register
588 *
589 * Returns 0 on success or a negative error code.
590 */
rtnl_link_register(struct rtnl_link_ops * ops)591 int rtnl_link_register(struct rtnl_link_ops *ops)
592 {
593 struct rtnl_link_ops *tmp;
594 int err;
595
596 /* Sanity-check max sizes to avoid stack buffer overflow. */
597 if (WARN_ON(ops->maxtype > RTNL_MAX_TYPE ||
598 ops->slave_maxtype > RTNL_SLAVE_MAX_TYPE))
599 return -EINVAL;
600
601 /* The check for alloc/setup is here because if ops
602 * does not have that filled up, it is not possible
603 * to use the ops for creating device. So do not
604 * fill up dellink as well. That disables rtnl_dellink.
605 */
606 if ((ops->alloc || ops->setup) && !ops->dellink)
607 ops->dellink = unregister_netdevice_queue;
608
609 err = init_srcu_struct(&ops->srcu);
610 if (err)
611 return err;
612
613 mutex_lock(&link_ops_mutex);
614
615 list_for_each_entry(tmp, &link_ops, list) {
616 if (!strcmp(ops->kind, tmp->kind)) {
617 err = -EEXIST;
618 goto unlock;
619 }
620 }
621
622 list_add_tail_rcu(&ops->list, &link_ops);
623 unlock:
624 mutex_unlock(&link_ops_mutex);
625
626 return err;
627 }
628 EXPORT_SYMBOL_GPL(rtnl_link_register);
629
__rtnl_kill_links(struct net * net,struct rtnl_link_ops * ops)630 static void __rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops)
631 {
632 struct net_device *dev;
633 LIST_HEAD(list_kill);
634
635 for_each_netdev(net, dev) {
636 if (dev->rtnl_link_ops == ops)
637 ops->dellink(dev, &list_kill);
638 }
639 unregister_netdevice_many(&list_kill);
640 }
641
642 /* Return with the rtnl_lock held when there are no network
643 * devices unregistering in any network namespace.
644 */
rtnl_lock_unregistering_all(void)645 static void rtnl_lock_unregistering_all(void)
646 {
647 DEFINE_WAIT_FUNC(wait, woken_wake_function);
648
649 add_wait_queue(&netdev_unregistering_wq, &wait);
650 for (;;) {
651 rtnl_lock();
652 /* We held write locked pernet_ops_rwsem, and parallel
653 * setup_net() and cleanup_net() are not possible.
654 */
655 if (!atomic_read(&dev_unreg_count))
656 break;
657 __rtnl_unlock();
658
659 wait_woken(&wait, TASK_UNINTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
660 }
661 remove_wait_queue(&netdev_unregistering_wq, &wait);
662 }
663
664 /**
665 * rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink.
666 * @ops: struct rtnl_link_ops * to unregister
667 */
rtnl_link_unregister(struct rtnl_link_ops * ops)668 void rtnl_link_unregister(struct rtnl_link_ops *ops)
669 {
670 struct net *net;
671
672 mutex_lock(&link_ops_mutex);
673 list_del_rcu(&ops->list);
674 mutex_unlock(&link_ops_mutex);
675
676 synchronize_srcu(&ops->srcu);
677 cleanup_srcu_struct(&ops->srcu);
678
679 /* Close the race with setup_net() and cleanup_net() */
680 down_write(&pernet_ops_rwsem);
681 rtnl_lock_unregistering_all();
682
683 for_each_net(net)
684 __rtnl_kill_links(net, ops);
685
686 rtnl_unlock();
687 up_write(&pernet_ops_rwsem);
688 }
689 EXPORT_SYMBOL_GPL(rtnl_link_unregister);
690
rtnl_link_get_slave_info_data_size(const struct net_device * dev)691 static size_t rtnl_link_get_slave_info_data_size(const struct net_device *dev)
692 {
693 struct net_device *master_dev;
694 const struct rtnl_link_ops *ops;
695 size_t size = 0;
696
697 rcu_read_lock();
698
699 master_dev = netdev_master_upper_dev_get_rcu((struct net_device *)dev);
700 if (!master_dev)
701 goto out;
702
703 ops = master_dev->rtnl_link_ops;
704 if (!ops || !ops->get_slave_size)
705 goto out;
706 /* IFLA_INFO_SLAVE_DATA + nested data */
707 size = nla_total_size(sizeof(struct nlattr)) +
708 ops->get_slave_size(master_dev, dev);
709
710 out:
711 rcu_read_unlock();
712 return size;
713 }
714
rtnl_link_get_size(const struct net_device * dev)715 static size_t rtnl_link_get_size(const struct net_device *dev)
716 {
717 const struct rtnl_link_ops *ops = dev->rtnl_link_ops;
718 size_t size;
719
720 if (!ops)
721 return 0;
722
723 size = nla_total_size(sizeof(struct nlattr)) + /* IFLA_LINKINFO */
724 nla_total_size(strlen(ops->kind) + 1); /* IFLA_INFO_KIND */
725
726 if (ops->get_size)
727 /* IFLA_INFO_DATA + nested data */
728 size += nla_total_size(sizeof(struct nlattr)) +
729 ops->get_size(dev);
730
731 if (ops->get_xstats_size)
732 /* IFLA_INFO_XSTATS */
733 size += nla_total_size(ops->get_xstats_size(dev));
734
735 size += rtnl_link_get_slave_info_data_size(dev);
736
737 return size;
738 }
739
740 static LIST_HEAD(rtnl_af_ops);
741
rtnl_af_lookup(const int family,int * srcu_index)742 static struct rtnl_af_ops *rtnl_af_lookup(const int family, int *srcu_index)
743 {
744 struct rtnl_af_ops *ops;
745
746 ASSERT_RTNL();
747
748 rcu_read_lock();
749
750 list_for_each_entry_rcu(ops, &rtnl_af_ops, list) {
751 if (ops->family == family) {
752 *srcu_index = srcu_read_lock(&ops->srcu);
753 goto unlock;
754 }
755 }
756
757 ops = NULL;
758 unlock:
759 rcu_read_unlock();
760
761 return ops;
762 }
763
rtnl_af_put(struct rtnl_af_ops * ops,int srcu_index)764 static void rtnl_af_put(struct rtnl_af_ops *ops, int srcu_index)
765 {
766 srcu_read_unlock(&ops->srcu, srcu_index);
767 }
768
769 /**
770 * rtnl_af_register - Register rtnl_af_ops with rtnetlink.
771 * @ops: struct rtnl_af_ops * to register
772 *
773 * Return: 0 on success or a negative error code.
774 */
rtnl_af_register(struct rtnl_af_ops * ops)775 int rtnl_af_register(struct rtnl_af_ops *ops)
776 {
777 int err = init_srcu_struct(&ops->srcu);
778
779 if (err)
780 return err;
781
782 rtnl_lock();
783 list_add_tail_rcu(&ops->list, &rtnl_af_ops);
784 rtnl_unlock();
785
786 return 0;
787 }
788 EXPORT_SYMBOL_GPL(rtnl_af_register);
789
790 /**
791 * rtnl_af_unregister - Unregister rtnl_af_ops from rtnetlink.
792 * @ops: struct rtnl_af_ops * to unregister
793 */
rtnl_af_unregister(struct rtnl_af_ops * ops)794 void rtnl_af_unregister(struct rtnl_af_ops *ops)
795 {
796 rtnl_lock();
797 list_del_rcu(&ops->list);
798 rtnl_unlock();
799
800 synchronize_rcu();
801 synchronize_srcu(&ops->srcu);
802 cleanup_srcu_struct(&ops->srcu);
803 }
804 EXPORT_SYMBOL_GPL(rtnl_af_unregister);
805
rtnl_link_get_af_size(const struct net_device * dev,u32 ext_filter_mask)806 static size_t rtnl_link_get_af_size(const struct net_device *dev,
807 u32 ext_filter_mask)
808 {
809 struct rtnl_af_ops *af_ops;
810 size_t size;
811
812 /* IFLA_AF_SPEC */
813 size = nla_total_size(sizeof(struct nlattr));
814
815 rcu_read_lock();
816 list_for_each_entry_rcu(af_ops, &rtnl_af_ops, list) {
817 if (af_ops->get_link_af_size) {
818 /* AF_* + nested data */
819 size += nla_total_size(sizeof(struct nlattr)) +
820 af_ops->get_link_af_size(dev, ext_filter_mask);
821 }
822 }
823 rcu_read_unlock();
824
825 return size;
826 }
827
rtnl_have_link_slave_info(const struct net_device * dev)828 static bool rtnl_have_link_slave_info(const struct net_device *dev)
829 {
830 struct net_device *master_dev;
831 bool ret = false;
832
833 rcu_read_lock();
834
835 master_dev = netdev_master_upper_dev_get_rcu((struct net_device *)dev);
836 if (master_dev && master_dev->rtnl_link_ops)
837 ret = true;
838 rcu_read_unlock();
839 return ret;
840 }
841
rtnl_link_slave_info_fill(struct sk_buff * skb,const struct net_device * dev)842 static int rtnl_link_slave_info_fill(struct sk_buff *skb,
843 const struct net_device *dev)
844 {
845 struct net_device *master_dev;
846 const struct rtnl_link_ops *ops;
847 struct nlattr *slave_data;
848 int err;
849
850 master_dev = netdev_master_upper_dev_get((struct net_device *) dev);
851 if (!master_dev)
852 return 0;
853 ops = master_dev->rtnl_link_ops;
854 if (!ops)
855 return 0;
856 if (nla_put_string(skb, IFLA_INFO_SLAVE_KIND, ops->kind) < 0)
857 return -EMSGSIZE;
858 if (ops->fill_slave_info) {
859 slave_data = nla_nest_start_noflag(skb, IFLA_INFO_SLAVE_DATA);
860 if (!slave_data)
861 return -EMSGSIZE;
862 err = ops->fill_slave_info(skb, master_dev, dev);
863 if (err < 0)
864 goto err_cancel_slave_data;
865 nla_nest_end(skb, slave_data);
866 }
867 return 0;
868
869 err_cancel_slave_data:
870 nla_nest_cancel(skb, slave_data);
871 return err;
872 }
873
rtnl_link_info_fill(struct sk_buff * skb,const struct net_device * dev)874 static int rtnl_link_info_fill(struct sk_buff *skb,
875 const struct net_device *dev)
876 {
877 const struct rtnl_link_ops *ops = dev->rtnl_link_ops;
878 struct nlattr *data;
879 int err;
880
881 if (!ops)
882 return 0;
883 if (nla_put_string(skb, IFLA_INFO_KIND, ops->kind) < 0)
884 return -EMSGSIZE;
885 if (ops->fill_xstats) {
886 err = ops->fill_xstats(skb, dev);
887 if (err < 0)
888 return err;
889 }
890 if (ops->fill_info) {
891 data = nla_nest_start_noflag(skb, IFLA_INFO_DATA);
892 if (data == NULL)
893 return -EMSGSIZE;
894 err = ops->fill_info(skb, dev);
895 if (err < 0)
896 goto err_cancel_data;
897 nla_nest_end(skb, data);
898 }
899 return 0;
900
901 err_cancel_data:
902 nla_nest_cancel(skb, data);
903 return err;
904 }
905
rtnl_link_fill(struct sk_buff * skb,const struct net_device * dev)906 static int rtnl_link_fill(struct sk_buff *skb, const struct net_device *dev)
907 {
908 struct nlattr *linkinfo;
909 int err = -EMSGSIZE;
910
911 linkinfo = nla_nest_start_noflag(skb, IFLA_LINKINFO);
912 if (linkinfo == NULL)
913 goto out;
914
915 err = rtnl_link_info_fill(skb, dev);
916 if (err < 0)
917 goto err_cancel_link;
918
919 err = rtnl_link_slave_info_fill(skb, dev);
920 if (err < 0)
921 goto err_cancel_link;
922
923 nla_nest_end(skb, linkinfo);
924 return 0;
925
926 err_cancel_link:
927 nla_nest_cancel(skb, linkinfo);
928 out:
929 return err;
930 }
931
rtnetlink_send(struct sk_buff * skb,struct net * net,u32 pid,unsigned int group,int echo)932 int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigned int group, int echo)
933 {
934 struct sock *rtnl = net->rtnl;
935
936 return nlmsg_notify(rtnl, skb, pid, group, echo, GFP_KERNEL);
937 }
938
rtnl_unicast(struct sk_buff * skb,struct net * net,u32 pid)939 int rtnl_unicast(struct sk_buff *skb, struct net *net, u32 pid)
940 {
941 struct sock *rtnl = net->rtnl;
942
943 return nlmsg_unicast(rtnl, skb, pid);
944 }
945 EXPORT_SYMBOL(rtnl_unicast);
946
rtnl_notify(struct sk_buff * skb,struct net * net,u32 pid,u32 group,const struct nlmsghdr * nlh,gfp_t flags)947 void rtnl_notify(struct sk_buff *skb, struct net *net, u32 pid, u32 group,
948 const struct nlmsghdr *nlh, gfp_t flags)
949 {
950 struct sock *rtnl = net->rtnl;
951
952 nlmsg_notify(rtnl, skb, pid, group, nlmsg_report(nlh), flags);
953 }
954 EXPORT_SYMBOL(rtnl_notify);
955
rtnl_set_sk_err(struct net * net,u32 group,int error)956 void rtnl_set_sk_err(struct net *net, u32 group, int error)
957 {
958 struct sock *rtnl = net->rtnl;
959
960 netlink_set_err(rtnl, 0, group, error);
961 }
962 EXPORT_SYMBOL(rtnl_set_sk_err);
963
rtnetlink_put_metrics(struct sk_buff * skb,u32 * metrics)964 int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics)
965 {
966 struct nlattr *mx;
967 int i, valid = 0;
968
969 /* nothing is dumped for dst_default_metrics, so just skip the loop */
970 if (metrics == dst_default_metrics.metrics)
971 return 0;
972
973 mx = nla_nest_start_noflag(skb, RTA_METRICS);
974 if (mx == NULL)
975 return -ENOBUFS;
976
977 for (i = 0; i < RTAX_MAX; i++) {
978 if (metrics[i]) {
979 if (i == RTAX_CC_ALGO - 1) {
980 char tmp[TCP_CA_NAME_MAX], *name;
981
982 name = tcp_ca_get_name_by_key(metrics[i], tmp);
983 if (!name)
984 continue;
985 if (nla_put_string(skb, i + 1, name))
986 goto nla_put_failure;
987 } else if (i == RTAX_FEATURES - 1) {
988 u32 user_features = metrics[i] & RTAX_FEATURE_MASK;
989
990 if (!user_features)
991 continue;
992 BUILD_BUG_ON(RTAX_FEATURE_MASK & DST_FEATURE_MASK);
993 if (nla_put_u32(skb, i + 1, user_features))
994 goto nla_put_failure;
995 } else {
996 if (nla_put_u32(skb, i + 1, metrics[i]))
997 goto nla_put_failure;
998 }
999 valid++;
1000 }
1001 }
1002
1003 if (!valid) {
1004 nla_nest_cancel(skb, mx);
1005 return 0;
1006 }
1007
1008 return nla_nest_end(skb, mx);
1009
1010 nla_put_failure:
1011 nla_nest_cancel(skb, mx);
1012 return -EMSGSIZE;
1013 }
1014 EXPORT_SYMBOL(rtnetlink_put_metrics);
1015
rtnl_put_cacheinfo(struct sk_buff * skb,struct dst_entry * dst,u32 id,long expires,u32 error)1016 int rtnl_put_cacheinfo(struct sk_buff *skb, struct dst_entry *dst, u32 id,
1017 long expires, u32 error)
1018 {
1019 struct rta_cacheinfo ci = {
1020 .rta_error = error,
1021 .rta_id = id,
1022 };
1023
1024 if (dst) {
1025 ci.rta_lastuse = jiffies_delta_to_clock_t(jiffies - dst->lastuse);
1026 ci.rta_used = dst->__use;
1027 ci.rta_clntref = rcuref_read(&dst->__rcuref);
1028 }
1029 if (expires) {
1030 unsigned long clock;
1031
1032 clock = jiffies_to_clock_t(abs(expires));
1033 clock = min_t(unsigned long, clock, INT_MAX);
1034 ci.rta_expires = (expires > 0) ? clock : -clock;
1035 }
1036 return nla_put(skb, RTA_CACHEINFO, sizeof(ci), &ci);
1037 }
1038 EXPORT_SYMBOL_GPL(rtnl_put_cacheinfo);
1039
netdev_set_operstate(struct net_device * dev,int newstate)1040 void netdev_set_operstate(struct net_device *dev, int newstate)
1041 {
1042 unsigned int old = READ_ONCE(dev->operstate);
1043
1044 do {
1045 if (old == newstate)
1046 return;
1047 } while (!try_cmpxchg(&dev->operstate, &old, newstate));
1048
1049 netdev_state_change(dev);
1050 }
1051 EXPORT_SYMBOL(netdev_set_operstate);
1052
set_operstate(struct net_device * dev,unsigned char transition)1053 static void set_operstate(struct net_device *dev, unsigned char transition)
1054 {
1055 unsigned char operstate = READ_ONCE(dev->operstate);
1056
1057 switch (transition) {
1058 case IF_OPER_UP:
1059 if ((operstate == IF_OPER_DORMANT ||
1060 operstate == IF_OPER_TESTING ||
1061 operstate == IF_OPER_UNKNOWN) &&
1062 !netif_dormant(dev) && !netif_testing(dev))
1063 operstate = IF_OPER_UP;
1064 break;
1065
1066 case IF_OPER_TESTING:
1067 if (netif_oper_up(dev))
1068 operstate = IF_OPER_TESTING;
1069 break;
1070
1071 case IF_OPER_DORMANT:
1072 if (netif_oper_up(dev))
1073 operstate = IF_OPER_DORMANT;
1074 break;
1075 }
1076
1077 netdev_set_operstate(dev, operstate);
1078 }
1079
rtnl_dev_get_flags(const struct net_device * dev)1080 static unsigned int rtnl_dev_get_flags(const struct net_device *dev)
1081 {
1082 return (dev->flags & ~(IFF_PROMISC | IFF_ALLMULTI)) |
1083 (dev->gflags & (IFF_PROMISC | IFF_ALLMULTI));
1084 }
1085
rtnl_dev_combine_flags(const struct net_device * dev,const struct ifinfomsg * ifm)1086 static unsigned int rtnl_dev_combine_flags(const struct net_device *dev,
1087 const struct ifinfomsg *ifm)
1088 {
1089 unsigned int flags = ifm->ifi_flags;
1090
1091 /* bugwards compatibility: ifi_change == 0 is treated as ~0 */
1092 if (ifm->ifi_change)
1093 flags = (flags & ifm->ifi_change) |
1094 (rtnl_dev_get_flags(dev) & ~ifm->ifi_change);
1095
1096 return flags;
1097 }
1098
copy_rtnl_link_stats(struct rtnl_link_stats * a,const struct rtnl_link_stats64 * b)1099 static void copy_rtnl_link_stats(struct rtnl_link_stats *a,
1100 const struct rtnl_link_stats64 *b)
1101 {
1102 a->rx_packets = b->rx_packets;
1103 a->tx_packets = b->tx_packets;
1104 a->rx_bytes = b->rx_bytes;
1105 a->tx_bytes = b->tx_bytes;
1106 a->rx_errors = b->rx_errors;
1107 a->tx_errors = b->tx_errors;
1108 a->rx_dropped = b->rx_dropped;
1109 a->tx_dropped = b->tx_dropped;
1110
1111 a->multicast = b->multicast;
1112 a->collisions = b->collisions;
1113
1114 a->rx_length_errors = b->rx_length_errors;
1115 a->rx_over_errors = b->rx_over_errors;
1116 a->rx_crc_errors = b->rx_crc_errors;
1117 a->rx_frame_errors = b->rx_frame_errors;
1118 a->rx_fifo_errors = b->rx_fifo_errors;
1119 a->rx_missed_errors = b->rx_missed_errors;
1120
1121 a->tx_aborted_errors = b->tx_aborted_errors;
1122 a->tx_carrier_errors = b->tx_carrier_errors;
1123 a->tx_fifo_errors = b->tx_fifo_errors;
1124 a->tx_heartbeat_errors = b->tx_heartbeat_errors;
1125 a->tx_window_errors = b->tx_window_errors;
1126
1127 a->rx_compressed = b->rx_compressed;
1128 a->tx_compressed = b->tx_compressed;
1129
1130 a->rx_nohandler = b->rx_nohandler;
1131 }
1132
1133 /* All VF info */
rtnl_vfinfo_size(const struct net_device * dev,u32 ext_filter_mask)1134 static inline int rtnl_vfinfo_size(const struct net_device *dev,
1135 u32 ext_filter_mask)
1136 {
1137 if (dev->dev.parent && (ext_filter_mask & RTEXT_FILTER_VF)) {
1138 int num_vfs = dev_num_vf(dev->dev.parent);
1139 size_t size = nla_total_size(0);
1140 size += num_vfs *
1141 (nla_total_size(0) +
1142 nla_total_size(sizeof(struct ifla_vf_mac)) +
1143 nla_total_size(sizeof(struct ifla_vf_broadcast)) +
1144 nla_total_size(sizeof(struct ifla_vf_vlan)) +
1145 nla_total_size(0) + /* nest IFLA_VF_VLAN_LIST */
1146 nla_total_size(MAX_VLAN_LIST_LEN *
1147 sizeof(struct ifla_vf_vlan_info)) +
1148 nla_total_size(sizeof(struct ifla_vf_spoofchk)) +
1149 nla_total_size(sizeof(struct ifla_vf_tx_rate)) +
1150 nla_total_size(sizeof(struct ifla_vf_rate)) +
1151 nla_total_size(sizeof(struct ifla_vf_link_state)) +
1152 nla_total_size(sizeof(struct ifla_vf_rss_query_en)) +
1153 nla_total_size(sizeof(struct ifla_vf_trust)));
1154 if (~ext_filter_mask & RTEXT_FILTER_SKIP_STATS) {
1155 size += num_vfs *
1156 (nla_total_size(0) + /* nest IFLA_VF_STATS */
1157 /* IFLA_VF_STATS_RX_PACKETS */
1158 nla_total_size_64bit(sizeof(__u64)) +
1159 /* IFLA_VF_STATS_TX_PACKETS */
1160 nla_total_size_64bit(sizeof(__u64)) +
1161 /* IFLA_VF_STATS_RX_BYTES */
1162 nla_total_size_64bit(sizeof(__u64)) +
1163 /* IFLA_VF_STATS_TX_BYTES */
1164 nla_total_size_64bit(sizeof(__u64)) +
1165 /* IFLA_VF_STATS_BROADCAST */
1166 nla_total_size_64bit(sizeof(__u64)) +
1167 /* IFLA_VF_STATS_MULTICAST */
1168 nla_total_size_64bit(sizeof(__u64)) +
1169 /* IFLA_VF_STATS_RX_DROPPED */
1170 nla_total_size_64bit(sizeof(__u64)) +
1171 /* IFLA_VF_STATS_TX_DROPPED */
1172 nla_total_size_64bit(sizeof(__u64)));
1173 }
1174 if (dev->netdev_ops->ndo_get_vf_guid)
1175 size += num_vfs * 2 *
1176 nla_total_size(sizeof(struct ifla_vf_guid));
1177 return size;
1178 } else
1179 return 0;
1180 }
1181
rtnl_port_size(const struct net_device * dev,u32 ext_filter_mask)1182 static size_t rtnl_port_size(const struct net_device *dev,
1183 u32 ext_filter_mask)
1184 {
1185 size_t port_size = nla_total_size(4) /* PORT_VF */
1186 + nla_total_size(PORT_PROFILE_MAX) /* PORT_PROFILE */
1187 + nla_total_size(PORT_UUID_MAX) /* PORT_INSTANCE_UUID */
1188 + nla_total_size(PORT_UUID_MAX) /* PORT_HOST_UUID */
1189 + nla_total_size(1) /* PROT_VDP_REQUEST */
1190 + nla_total_size(2); /* PORT_VDP_RESPONSE */
1191 size_t vf_ports_size = nla_total_size(sizeof(struct nlattr));
1192 size_t vf_port_size = nla_total_size(sizeof(struct nlattr))
1193 + port_size;
1194 size_t port_self_size = nla_total_size(sizeof(struct nlattr))
1195 + port_size;
1196
1197 if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent ||
1198 !(ext_filter_mask & RTEXT_FILTER_VF))
1199 return 0;
1200 if (dev_num_vf(dev->dev.parent))
1201 return port_self_size + vf_ports_size +
1202 vf_port_size * dev_num_vf(dev->dev.parent);
1203 else
1204 return port_self_size;
1205 }
1206
rtnl_xdp_size(void)1207 static size_t rtnl_xdp_size(void)
1208 {
1209 size_t xdp_size = nla_total_size(0) + /* nest IFLA_XDP */
1210 nla_total_size(1) + /* XDP_ATTACHED */
1211 nla_total_size(4) + /* XDP_PROG_ID (or 1st mode) */
1212 nla_total_size(4); /* XDP_<mode>_PROG_ID */
1213
1214 return xdp_size;
1215 }
1216
rtnl_prop_list_size(const struct net_device * dev)1217 static size_t rtnl_prop_list_size(const struct net_device *dev)
1218 {
1219 struct netdev_name_node *name_node;
1220 unsigned int cnt = 0;
1221
1222 rcu_read_lock();
1223 list_for_each_entry_rcu(name_node, &dev->name_node->list, list)
1224 cnt++;
1225 rcu_read_unlock();
1226
1227 if (!cnt)
1228 return 0;
1229
1230 return nla_total_size(0) + cnt * nla_total_size(ALTIFNAMSIZ);
1231 }
1232
rtnl_proto_down_size(const struct net_device * dev)1233 static size_t rtnl_proto_down_size(const struct net_device *dev)
1234 {
1235 size_t size = nla_total_size(1);
1236
1237 /* Assume dev->proto_down_reason is not zero. */
1238 size += nla_total_size(0) + nla_total_size(4);
1239
1240 return size;
1241 }
1242
rtnl_devlink_port_size(const struct net_device * dev)1243 static size_t rtnl_devlink_port_size(const struct net_device *dev)
1244 {
1245 size_t size = nla_total_size(0); /* nest IFLA_DEVLINK_PORT */
1246
1247 if (dev->devlink_port)
1248 size += devlink_nl_port_handle_size(dev->devlink_port);
1249
1250 return size;
1251 }
1252
rtnl_dpll_pin_size(const struct net_device * dev)1253 static size_t rtnl_dpll_pin_size(const struct net_device *dev)
1254 {
1255 size_t size = nla_total_size(0); /* nest IFLA_DPLL_PIN */
1256
1257 size += dpll_netdev_pin_handle_size(dev);
1258
1259 return size;
1260 }
1261
if_nlmsg_size(const struct net_device * dev,u32 ext_filter_mask)1262 static noinline size_t if_nlmsg_size(const struct net_device *dev,
1263 u32 ext_filter_mask)
1264 {
1265 return NLMSG_ALIGN(sizeof(struct ifinfomsg))
1266 + nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */
1267 + nla_total_size(IFALIASZ) /* IFLA_IFALIAS */
1268 + nla_total_size(IFNAMSIZ) /* IFLA_QDISC */
1269 + nla_total_size_64bit(sizeof(struct rtnl_link_ifmap))
1270 + nla_total_size(sizeof(struct rtnl_link_stats))
1271 + nla_total_size_64bit(sizeof(struct rtnl_link_stats64))
1272 + nla_total_size(MAX_ADDR_LEN) /* IFLA_ADDRESS */
1273 + nla_total_size(MAX_ADDR_LEN) /* IFLA_BROADCAST */
1274 + nla_total_size(4) /* IFLA_TXQLEN */
1275 + nla_total_size(4) /* IFLA_WEIGHT */
1276 + nla_total_size(4) /* IFLA_MTU */
1277 + nla_total_size(4) /* IFLA_LINK */
1278 + nla_total_size(4) /* IFLA_MASTER */
1279 + nla_total_size(1) /* IFLA_CARRIER */
1280 + nla_total_size(4) /* IFLA_PROMISCUITY */
1281 + nla_total_size(4) /* IFLA_ALLMULTI */
1282 + nla_total_size(4) /* IFLA_NUM_TX_QUEUES */
1283 + nla_total_size(4) /* IFLA_NUM_RX_QUEUES */
1284 + nla_total_size(4) /* IFLA_GSO_MAX_SEGS */
1285 + nla_total_size(4) /* IFLA_GSO_MAX_SIZE */
1286 + nla_total_size(4) /* IFLA_GRO_MAX_SIZE */
1287 + nla_total_size(4) /* IFLA_GSO_IPV4_MAX_SIZE */
1288 + nla_total_size(4) /* IFLA_GRO_IPV4_MAX_SIZE */
1289 + nla_total_size(4) /* IFLA_TSO_MAX_SIZE */
1290 + nla_total_size(4) /* IFLA_TSO_MAX_SEGS */
1291 + nla_total_size(1) /* IFLA_OPERSTATE */
1292 + nla_total_size(1) /* IFLA_LINKMODE */
1293 + nla_total_size(4) /* IFLA_CARRIER_CHANGES */
1294 + nla_total_size(4) /* IFLA_LINK_NETNSID */
1295 + nla_total_size(4) /* IFLA_GROUP */
1296 + nla_total_size(ext_filter_mask
1297 & RTEXT_FILTER_VF ? 4 : 0) /* IFLA_NUM_VF */
1298 + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */
1299 + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */
1300 + rtnl_link_get_size(dev) /* IFLA_LINKINFO */
1301 + rtnl_link_get_af_size(dev, ext_filter_mask) /* IFLA_AF_SPEC */
1302 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */
1303 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */
1304 + nla_total_size(IFNAMSIZ) /* IFLA_PHYS_PORT_NAME */
1305 + rtnl_xdp_size() /* IFLA_XDP */
1306 + nla_total_size(4) /* IFLA_EVENT */
1307 + nla_total_size(4) /* IFLA_NEW_NETNSID */
1308 + nla_total_size(4) /* IFLA_NEW_IFINDEX */
1309 + rtnl_proto_down_size(dev) /* proto down */
1310 + nla_total_size(4) /* IFLA_TARGET_NETNSID */
1311 + nla_total_size(4) /* IFLA_CARRIER_UP_COUNT */
1312 + nla_total_size(4) /* IFLA_CARRIER_DOWN_COUNT */
1313 + nla_total_size(4) /* IFLA_MIN_MTU */
1314 + nla_total_size(4) /* IFLA_MAX_MTU */
1315 + rtnl_prop_list_size(dev)
1316 + nla_total_size(MAX_ADDR_LEN) /* IFLA_PERM_ADDRESS */
1317 + rtnl_devlink_port_size(dev)
1318 + rtnl_dpll_pin_size(dev)
1319 + nla_total_size(8) /* IFLA_MAX_PACING_OFFLOAD_HORIZON */
1320 + 0;
1321 }
1322
rtnl_vf_ports_fill(struct sk_buff * skb,struct net_device * dev)1323 static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev)
1324 {
1325 struct nlattr *vf_ports;
1326 struct nlattr *vf_port;
1327 int vf;
1328 int err;
1329
1330 vf_ports = nla_nest_start_noflag(skb, IFLA_VF_PORTS);
1331 if (!vf_ports)
1332 return -EMSGSIZE;
1333
1334 for (vf = 0; vf < dev_num_vf(dev->dev.parent); vf++) {
1335 vf_port = nla_nest_start_noflag(skb, IFLA_VF_PORT);
1336 if (!vf_port)
1337 goto nla_put_failure;
1338 if (nla_put_u32(skb, IFLA_PORT_VF, vf))
1339 goto nla_put_failure;
1340 err = dev->netdev_ops->ndo_get_vf_port(dev, vf, skb);
1341 if (err == -EMSGSIZE)
1342 goto nla_put_failure;
1343 if (err) {
1344 nla_nest_cancel(skb, vf_port);
1345 continue;
1346 }
1347 nla_nest_end(skb, vf_port);
1348 }
1349
1350 nla_nest_end(skb, vf_ports);
1351
1352 return 0;
1353
1354 nla_put_failure:
1355 nla_nest_cancel(skb, vf_ports);
1356 return -EMSGSIZE;
1357 }
1358
rtnl_port_self_fill(struct sk_buff * skb,struct net_device * dev)1359 static int rtnl_port_self_fill(struct sk_buff *skb, struct net_device *dev)
1360 {
1361 struct nlattr *port_self;
1362 int err;
1363
1364 port_self = nla_nest_start_noflag(skb, IFLA_PORT_SELF);
1365 if (!port_self)
1366 return -EMSGSIZE;
1367
1368 err = dev->netdev_ops->ndo_get_vf_port(dev, PORT_SELF_VF, skb);
1369 if (err) {
1370 nla_nest_cancel(skb, port_self);
1371 return (err == -EMSGSIZE) ? err : 0;
1372 }
1373
1374 nla_nest_end(skb, port_self);
1375
1376 return 0;
1377 }
1378
rtnl_port_fill(struct sk_buff * skb,struct net_device * dev,u32 ext_filter_mask)1379 static int rtnl_port_fill(struct sk_buff *skb, struct net_device *dev,
1380 u32 ext_filter_mask)
1381 {
1382 int err;
1383
1384 if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent ||
1385 !(ext_filter_mask & RTEXT_FILTER_VF))
1386 return 0;
1387
1388 err = rtnl_port_self_fill(skb, dev);
1389 if (err)
1390 return err;
1391
1392 if (dev_num_vf(dev->dev.parent)) {
1393 err = rtnl_vf_ports_fill(skb, dev);
1394 if (err)
1395 return err;
1396 }
1397
1398 return 0;
1399 }
1400
rtnl_phys_port_id_fill(struct sk_buff * skb,struct net_device * dev)1401 static int rtnl_phys_port_id_fill(struct sk_buff *skb, struct net_device *dev)
1402 {
1403 int err;
1404 struct netdev_phys_item_id ppid;
1405
1406 err = dev_get_phys_port_id(dev, &ppid);
1407 if (err) {
1408 if (err == -EOPNOTSUPP)
1409 return 0;
1410 return err;
1411 }
1412
1413 if (nla_put(skb, IFLA_PHYS_PORT_ID, ppid.id_len, ppid.id))
1414 return -EMSGSIZE;
1415
1416 return 0;
1417 }
1418
rtnl_phys_port_name_fill(struct sk_buff * skb,struct net_device * dev)1419 static int rtnl_phys_port_name_fill(struct sk_buff *skb, struct net_device *dev)
1420 {
1421 char name[IFNAMSIZ];
1422 int err;
1423
1424 err = dev_get_phys_port_name(dev, name, sizeof(name));
1425 if (err) {
1426 if (err == -EOPNOTSUPP)
1427 return 0;
1428 return err;
1429 }
1430
1431 if (nla_put_string(skb, IFLA_PHYS_PORT_NAME, name))
1432 return -EMSGSIZE;
1433
1434 return 0;
1435 }
1436
rtnl_phys_switch_id_fill(struct sk_buff * skb,struct net_device * dev)1437 static int rtnl_phys_switch_id_fill(struct sk_buff *skb, struct net_device *dev)
1438 {
1439 struct netdev_phys_item_id ppid = { };
1440 int err;
1441
1442 err = dev_get_port_parent_id(dev, &ppid, false);
1443 if (err) {
1444 if (err == -EOPNOTSUPP)
1445 return 0;
1446 return err;
1447 }
1448
1449 if (nla_put(skb, IFLA_PHYS_SWITCH_ID, ppid.id_len, ppid.id))
1450 return -EMSGSIZE;
1451
1452 return 0;
1453 }
1454
rtnl_fill_stats(struct sk_buff * skb,struct net_device * dev)1455 static noinline_for_stack int rtnl_fill_stats(struct sk_buff *skb,
1456 struct net_device *dev)
1457 {
1458 struct rtnl_link_stats64 *sp;
1459 struct nlattr *attr;
1460
1461 attr = nla_reserve_64bit(skb, IFLA_STATS64,
1462 sizeof(struct rtnl_link_stats64), IFLA_PAD);
1463 if (!attr)
1464 return -EMSGSIZE;
1465
1466 sp = nla_data(attr);
1467 dev_get_stats(dev, sp);
1468
1469 attr = nla_reserve(skb, IFLA_STATS,
1470 sizeof(struct rtnl_link_stats));
1471 if (!attr)
1472 return -EMSGSIZE;
1473
1474 copy_rtnl_link_stats(nla_data(attr), sp);
1475
1476 return 0;
1477 }
1478
rtnl_fill_vfinfo(struct sk_buff * skb,struct net_device * dev,int vfs_num,u32 ext_filter_mask)1479 static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb,
1480 struct net_device *dev,
1481 int vfs_num,
1482 u32 ext_filter_mask)
1483 {
1484 struct ifla_vf_rss_query_en vf_rss_query_en;
1485 struct nlattr *vf, *vfstats, *vfvlanlist;
1486 struct ifla_vf_link_state vf_linkstate;
1487 struct ifla_vf_vlan_info vf_vlan_info;
1488 struct ifla_vf_spoofchk vf_spoofchk;
1489 struct ifla_vf_tx_rate vf_tx_rate;
1490 struct ifla_vf_stats vf_stats;
1491 struct ifla_vf_trust vf_trust;
1492 struct ifla_vf_vlan vf_vlan;
1493 struct ifla_vf_rate vf_rate;
1494 struct ifla_vf_mac vf_mac;
1495 struct ifla_vf_broadcast vf_broadcast;
1496 struct ifla_vf_info ivi;
1497 struct ifla_vf_guid node_guid;
1498 struct ifla_vf_guid port_guid;
1499
1500 memset(&ivi, 0, sizeof(ivi));
1501
1502 /* Not all SR-IOV capable drivers support the
1503 * spoofcheck and "RSS query enable" query. Preset to
1504 * -1 so the user space tool can detect that the driver
1505 * didn't report anything.
1506 */
1507 ivi.spoofchk = -1;
1508 ivi.rss_query_en = -1;
1509 ivi.trusted = -1;
1510 /* The default value for VF link state is "auto"
1511 * IFLA_VF_LINK_STATE_AUTO which equals zero
1512 */
1513 ivi.linkstate = 0;
1514 /* VLAN Protocol by default is 802.1Q */
1515 ivi.vlan_proto = htons(ETH_P_8021Q);
1516 if (dev->netdev_ops->ndo_get_vf_config(dev, vfs_num, &ivi))
1517 return 0;
1518
1519 memset(&vf_vlan_info, 0, sizeof(vf_vlan_info));
1520 memset(&node_guid, 0, sizeof(node_guid));
1521 memset(&port_guid, 0, sizeof(port_guid));
1522
1523 vf_mac.vf =
1524 vf_vlan.vf =
1525 vf_vlan_info.vf =
1526 vf_rate.vf =
1527 vf_tx_rate.vf =
1528 vf_spoofchk.vf =
1529 vf_linkstate.vf =
1530 vf_rss_query_en.vf =
1531 vf_trust.vf =
1532 node_guid.vf =
1533 port_guid.vf = ivi.vf;
1534
1535 memcpy(vf_mac.mac, ivi.mac, sizeof(ivi.mac));
1536 memcpy(vf_broadcast.broadcast, dev->broadcast, dev->addr_len);
1537 vf_vlan.vlan = ivi.vlan;
1538 vf_vlan.qos = ivi.qos;
1539 vf_vlan_info.vlan = ivi.vlan;
1540 vf_vlan_info.qos = ivi.qos;
1541 vf_vlan_info.vlan_proto = ivi.vlan_proto;
1542 vf_tx_rate.rate = ivi.max_tx_rate;
1543 vf_rate.min_tx_rate = ivi.min_tx_rate;
1544 vf_rate.max_tx_rate = ivi.max_tx_rate;
1545 vf_spoofchk.setting = ivi.spoofchk;
1546 vf_linkstate.link_state = ivi.linkstate;
1547 vf_rss_query_en.setting = ivi.rss_query_en;
1548 vf_trust.setting = ivi.trusted;
1549 vf = nla_nest_start_noflag(skb, IFLA_VF_INFO);
1550 if (!vf)
1551 return -EMSGSIZE;
1552 if (nla_put(skb, IFLA_VF_MAC, sizeof(vf_mac), &vf_mac) ||
1553 nla_put(skb, IFLA_VF_BROADCAST, sizeof(vf_broadcast), &vf_broadcast) ||
1554 nla_put(skb, IFLA_VF_VLAN, sizeof(vf_vlan), &vf_vlan) ||
1555 nla_put(skb, IFLA_VF_RATE, sizeof(vf_rate),
1556 &vf_rate) ||
1557 nla_put(skb, IFLA_VF_TX_RATE, sizeof(vf_tx_rate),
1558 &vf_tx_rate) ||
1559 nla_put(skb, IFLA_VF_SPOOFCHK, sizeof(vf_spoofchk),
1560 &vf_spoofchk) ||
1561 nla_put(skb, IFLA_VF_LINK_STATE, sizeof(vf_linkstate),
1562 &vf_linkstate) ||
1563 nla_put(skb, IFLA_VF_RSS_QUERY_EN,
1564 sizeof(vf_rss_query_en),
1565 &vf_rss_query_en) ||
1566 nla_put(skb, IFLA_VF_TRUST,
1567 sizeof(vf_trust), &vf_trust))
1568 goto nla_put_vf_failure;
1569
1570 if (dev->netdev_ops->ndo_get_vf_guid &&
1571 !dev->netdev_ops->ndo_get_vf_guid(dev, vfs_num, &node_guid,
1572 &port_guid)) {
1573 if (nla_put(skb, IFLA_VF_IB_NODE_GUID, sizeof(node_guid),
1574 &node_guid) ||
1575 nla_put(skb, IFLA_VF_IB_PORT_GUID, sizeof(port_guid),
1576 &port_guid))
1577 goto nla_put_vf_failure;
1578 }
1579 vfvlanlist = nla_nest_start_noflag(skb, IFLA_VF_VLAN_LIST);
1580 if (!vfvlanlist)
1581 goto nla_put_vf_failure;
1582 if (nla_put(skb, IFLA_VF_VLAN_INFO, sizeof(vf_vlan_info),
1583 &vf_vlan_info)) {
1584 nla_nest_cancel(skb, vfvlanlist);
1585 goto nla_put_vf_failure;
1586 }
1587 nla_nest_end(skb, vfvlanlist);
1588 if (~ext_filter_mask & RTEXT_FILTER_SKIP_STATS) {
1589 memset(&vf_stats, 0, sizeof(vf_stats));
1590 if (dev->netdev_ops->ndo_get_vf_stats)
1591 dev->netdev_ops->ndo_get_vf_stats(dev, vfs_num,
1592 &vf_stats);
1593 vfstats = nla_nest_start_noflag(skb, IFLA_VF_STATS);
1594 if (!vfstats)
1595 goto nla_put_vf_failure;
1596 if (nla_put_u64_64bit(skb, IFLA_VF_STATS_RX_PACKETS,
1597 vf_stats.rx_packets, IFLA_VF_STATS_PAD) ||
1598 nla_put_u64_64bit(skb, IFLA_VF_STATS_TX_PACKETS,
1599 vf_stats.tx_packets, IFLA_VF_STATS_PAD) ||
1600 nla_put_u64_64bit(skb, IFLA_VF_STATS_RX_BYTES,
1601 vf_stats.rx_bytes, IFLA_VF_STATS_PAD) ||
1602 nla_put_u64_64bit(skb, IFLA_VF_STATS_TX_BYTES,
1603 vf_stats.tx_bytes, IFLA_VF_STATS_PAD) ||
1604 nla_put_u64_64bit(skb, IFLA_VF_STATS_BROADCAST,
1605 vf_stats.broadcast, IFLA_VF_STATS_PAD) ||
1606 nla_put_u64_64bit(skb, IFLA_VF_STATS_MULTICAST,
1607 vf_stats.multicast, IFLA_VF_STATS_PAD) ||
1608 nla_put_u64_64bit(skb, IFLA_VF_STATS_RX_DROPPED,
1609 vf_stats.rx_dropped, IFLA_VF_STATS_PAD) ||
1610 nla_put_u64_64bit(skb, IFLA_VF_STATS_TX_DROPPED,
1611 vf_stats.tx_dropped, IFLA_VF_STATS_PAD)) {
1612 nla_nest_cancel(skb, vfstats);
1613 goto nla_put_vf_failure;
1614 }
1615 nla_nest_end(skb, vfstats);
1616 }
1617 nla_nest_end(skb, vf);
1618 return 0;
1619
1620 nla_put_vf_failure:
1621 nla_nest_cancel(skb, vf);
1622 return -EMSGSIZE;
1623 }
1624
rtnl_fill_vf(struct sk_buff * skb,struct net_device * dev,u32 ext_filter_mask)1625 static noinline_for_stack int rtnl_fill_vf(struct sk_buff *skb,
1626 struct net_device *dev,
1627 u32 ext_filter_mask)
1628 {
1629 struct nlattr *vfinfo;
1630 int i, num_vfs;
1631
1632 if (!dev->dev.parent || ((ext_filter_mask & RTEXT_FILTER_VF) == 0))
1633 return 0;
1634
1635 num_vfs = dev_num_vf(dev->dev.parent);
1636 if (nla_put_u32(skb, IFLA_NUM_VF, num_vfs))
1637 return -EMSGSIZE;
1638
1639 if (!dev->netdev_ops->ndo_get_vf_config)
1640 return 0;
1641
1642 vfinfo = nla_nest_start_noflag(skb, IFLA_VFINFO_LIST);
1643 if (!vfinfo)
1644 return -EMSGSIZE;
1645
1646 for (i = 0; i < num_vfs; i++) {
1647 if (rtnl_fill_vfinfo(skb, dev, i, ext_filter_mask)) {
1648 nla_nest_cancel(skb, vfinfo);
1649 return -EMSGSIZE;
1650 }
1651 }
1652
1653 nla_nest_end(skb, vfinfo);
1654 return 0;
1655 }
1656
rtnl_fill_link_ifmap(struct sk_buff * skb,const struct net_device * dev)1657 static int rtnl_fill_link_ifmap(struct sk_buff *skb,
1658 const struct net_device *dev)
1659 {
1660 struct rtnl_link_ifmap map;
1661
1662 memset(&map, 0, sizeof(map));
1663 map.mem_start = READ_ONCE(dev->mem_start);
1664 map.mem_end = READ_ONCE(dev->mem_end);
1665 map.base_addr = READ_ONCE(dev->base_addr);
1666 map.irq = READ_ONCE(dev->irq);
1667 map.dma = READ_ONCE(dev->dma);
1668 map.port = READ_ONCE(dev->if_port);
1669
1670 if (nla_put_64bit(skb, IFLA_MAP, sizeof(map), &map, IFLA_PAD))
1671 return -EMSGSIZE;
1672
1673 return 0;
1674 }
1675
rtnl_xdp_prog_skb(struct net_device * dev)1676 static u32 rtnl_xdp_prog_skb(struct net_device *dev)
1677 {
1678 const struct bpf_prog *generic_xdp_prog;
1679 u32 res = 0;
1680
1681 rcu_read_lock();
1682 generic_xdp_prog = rcu_dereference(dev->xdp_prog);
1683 if (generic_xdp_prog)
1684 res = generic_xdp_prog->aux->id;
1685 rcu_read_unlock();
1686
1687 return res;
1688 }
1689
rtnl_xdp_prog_drv(struct net_device * dev)1690 static u32 rtnl_xdp_prog_drv(struct net_device *dev)
1691 {
1692 return dev_xdp_prog_id(dev, XDP_MODE_DRV);
1693 }
1694
rtnl_xdp_prog_hw(struct net_device * dev)1695 static u32 rtnl_xdp_prog_hw(struct net_device *dev)
1696 {
1697 return dev_xdp_prog_id(dev, XDP_MODE_HW);
1698 }
1699
rtnl_xdp_report_one(struct sk_buff * skb,struct net_device * dev,u32 * prog_id,u8 * mode,u8 tgt_mode,u32 attr,u32 (* get_prog_id)(struct net_device * dev))1700 static int rtnl_xdp_report_one(struct sk_buff *skb, struct net_device *dev,
1701 u32 *prog_id, u8 *mode, u8 tgt_mode, u32 attr,
1702 u32 (*get_prog_id)(struct net_device *dev))
1703 {
1704 u32 curr_id;
1705 int err;
1706
1707 curr_id = get_prog_id(dev);
1708 if (!curr_id)
1709 return 0;
1710
1711 *prog_id = curr_id;
1712 err = nla_put_u32(skb, attr, curr_id);
1713 if (err)
1714 return err;
1715
1716 if (*mode != XDP_ATTACHED_NONE)
1717 *mode = XDP_ATTACHED_MULTI;
1718 else
1719 *mode = tgt_mode;
1720
1721 return 0;
1722 }
1723
rtnl_xdp_fill(struct sk_buff * skb,struct net_device * dev)1724 static int rtnl_xdp_fill(struct sk_buff *skb, struct net_device *dev)
1725 {
1726 struct nlattr *xdp;
1727 u32 prog_id;
1728 int err;
1729 u8 mode;
1730
1731 xdp = nla_nest_start_noflag(skb, IFLA_XDP);
1732 if (!xdp)
1733 return -EMSGSIZE;
1734
1735 prog_id = 0;
1736 mode = XDP_ATTACHED_NONE;
1737 err = rtnl_xdp_report_one(skb, dev, &prog_id, &mode, XDP_ATTACHED_SKB,
1738 IFLA_XDP_SKB_PROG_ID, rtnl_xdp_prog_skb);
1739 if (err)
1740 goto err_cancel;
1741 err = rtnl_xdp_report_one(skb, dev, &prog_id, &mode, XDP_ATTACHED_DRV,
1742 IFLA_XDP_DRV_PROG_ID, rtnl_xdp_prog_drv);
1743 if (err)
1744 goto err_cancel;
1745 err = rtnl_xdp_report_one(skb, dev, &prog_id, &mode, XDP_ATTACHED_HW,
1746 IFLA_XDP_HW_PROG_ID, rtnl_xdp_prog_hw);
1747 if (err)
1748 goto err_cancel;
1749
1750 err = nla_put_u8(skb, IFLA_XDP_ATTACHED, mode);
1751 if (err)
1752 goto err_cancel;
1753
1754 if (prog_id && mode != XDP_ATTACHED_MULTI) {
1755 err = nla_put_u32(skb, IFLA_XDP_PROG_ID, prog_id);
1756 if (err)
1757 goto err_cancel;
1758 }
1759
1760 nla_nest_end(skb, xdp);
1761 return 0;
1762
1763 err_cancel:
1764 nla_nest_cancel(skb, xdp);
1765 return err;
1766 }
1767
rtnl_get_event(unsigned long event)1768 static u32 rtnl_get_event(unsigned long event)
1769 {
1770 u32 rtnl_event_type = IFLA_EVENT_NONE;
1771
1772 switch (event) {
1773 case NETDEV_REBOOT:
1774 rtnl_event_type = IFLA_EVENT_REBOOT;
1775 break;
1776 case NETDEV_FEAT_CHANGE:
1777 rtnl_event_type = IFLA_EVENT_FEATURES;
1778 break;
1779 case NETDEV_BONDING_FAILOVER:
1780 rtnl_event_type = IFLA_EVENT_BONDING_FAILOVER;
1781 break;
1782 case NETDEV_NOTIFY_PEERS:
1783 rtnl_event_type = IFLA_EVENT_NOTIFY_PEERS;
1784 break;
1785 case NETDEV_RESEND_IGMP:
1786 rtnl_event_type = IFLA_EVENT_IGMP_RESEND;
1787 break;
1788 case NETDEV_CHANGEINFODATA:
1789 rtnl_event_type = IFLA_EVENT_BONDING_OPTIONS;
1790 break;
1791 default:
1792 break;
1793 }
1794
1795 return rtnl_event_type;
1796 }
1797
put_master_ifindex(struct sk_buff * skb,struct net_device * dev)1798 static int put_master_ifindex(struct sk_buff *skb, struct net_device *dev)
1799 {
1800 const struct net_device *upper_dev;
1801 int ret = 0;
1802
1803 rcu_read_lock();
1804
1805 upper_dev = netdev_master_upper_dev_get_rcu(dev);
1806 if (upper_dev)
1807 ret = nla_put_u32(skb, IFLA_MASTER,
1808 READ_ONCE(upper_dev->ifindex));
1809
1810 rcu_read_unlock();
1811 return ret;
1812 }
1813
nla_put_iflink(struct sk_buff * skb,const struct net_device * dev,bool force)1814 static int nla_put_iflink(struct sk_buff *skb, const struct net_device *dev,
1815 bool force)
1816 {
1817 int iflink = dev_get_iflink(dev);
1818
1819 if (force || READ_ONCE(dev->ifindex) != iflink)
1820 return nla_put_u32(skb, IFLA_LINK, iflink);
1821
1822 return 0;
1823 }
1824
nla_put_ifalias(struct sk_buff * skb,struct net_device * dev)1825 static noinline_for_stack int nla_put_ifalias(struct sk_buff *skb,
1826 struct net_device *dev)
1827 {
1828 char buf[IFALIASZ];
1829 int ret;
1830
1831 ret = dev_get_alias(dev, buf, sizeof(buf));
1832 return ret > 0 ? nla_put_string(skb, IFLA_IFALIAS, buf) : 0;
1833 }
1834
rtnl_fill_link_netnsid(struct sk_buff * skb,const struct net_device * dev,struct net * src_net,gfp_t gfp)1835 static int rtnl_fill_link_netnsid(struct sk_buff *skb,
1836 const struct net_device *dev,
1837 struct net *src_net, gfp_t gfp)
1838 {
1839 bool put_iflink = false;
1840
1841 if (dev->rtnl_link_ops && dev->rtnl_link_ops->get_link_net) {
1842 struct net *link_net = dev->rtnl_link_ops->get_link_net(dev);
1843
1844 if (!net_eq(dev_net(dev), link_net)) {
1845 int id = peernet2id_alloc(src_net, link_net, gfp);
1846
1847 if (nla_put_s32(skb, IFLA_LINK_NETNSID, id))
1848 return -EMSGSIZE;
1849
1850 put_iflink = true;
1851 }
1852 }
1853
1854 return nla_put_iflink(skb, dev, put_iflink);
1855 }
1856
rtnl_fill_link_af(struct sk_buff * skb,const struct net_device * dev,u32 ext_filter_mask)1857 static int rtnl_fill_link_af(struct sk_buff *skb,
1858 const struct net_device *dev,
1859 u32 ext_filter_mask)
1860 {
1861 const struct rtnl_af_ops *af_ops;
1862 struct nlattr *af_spec;
1863
1864 af_spec = nla_nest_start_noflag(skb, IFLA_AF_SPEC);
1865 if (!af_spec)
1866 return -EMSGSIZE;
1867
1868 list_for_each_entry_rcu(af_ops, &rtnl_af_ops, list) {
1869 struct nlattr *af;
1870 int err;
1871
1872 if (!af_ops->fill_link_af)
1873 continue;
1874
1875 af = nla_nest_start_noflag(skb, af_ops->family);
1876 if (!af)
1877 return -EMSGSIZE;
1878
1879 err = af_ops->fill_link_af(skb, dev, ext_filter_mask);
1880 /*
1881 * Caller may return ENODATA to indicate that there
1882 * was no data to be dumped. This is not an error, it
1883 * means we should trim the attribute header and
1884 * continue.
1885 */
1886 if (err == -ENODATA)
1887 nla_nest_cancel(skb, af);
1888 else if (err < 0)
1889 return -EMSGSIZE;
1890
1891 nla_nest_end(skb, af);
1892 }
1893
1894 nla_nest_end(skb, af_spec);
1895 return 0;
1896 }
1897
rtnl_fill_alt_ifnames(struct sk_buff * skb,const struct net_device * dev)1898 static int rtnl_fill_alt_ifnames(struct sk_buff *skb,
1899 const struct net_device *dev)
1900 {
1901 struct netdev_name_node *name_node;
1902 int count = 0;
1903
1904 list_for_each_entry_rcu(name_node, &dev->name_node->list, list) {
1905 if (nla_put_string(skb, IFLA_ALT_IFNAME, name_node->name))
1906 return -EMSGSIZE;
1907 count++;
1908 }
1909 return count;
1910 }
1911
1912 /* RCU protected. */
rtnl_fill_prop_list(struct sk_buff * skb,const struct net_device * dev)1913 static int rtnl_fill_prop_list(struct sk_buff *skb,
1914 const struct net_device *dev)
1915 {
1916 struct nlattr *prop_list;
1917 int ret;
1918
1919 prop_list = nla_nest_start(skb, IFLA_PROP_LIST);
1920 if (!prop_list)
1921 return -EMSGSIZE;
1922
1923 ret = rtnl_fill_alt_ifnames(skb, dev);
1924 if (ret <= 0)
1925 goto nest_cancel;
1926
1927 nla_nest_end(skb, prop_list);
1928 return 0;
1929
1930 nest_cancel:
1931 nla_nest_cancel(skb, prop_list);
1932 return ret;
1933 }
1934
rtnl_fill_proto_down(struct sk_buff * skb,const struct net_device * dev)1935 static int rtnl_fill_proto_down(struct sk_buff *skb,
1936 const struct net_device *dev)
1937 {
1938 struct nlattr *pr;
1939 u32 preason;
1940
1941 if (nla_put_u8(skb, IFLA_PROTO_DOWN, READ_ONCE(dev->proto_down)))
1942 goto nla_put_failure;
1943
1944 preason = READ_ONCE(dev->proto_down_reason);
1945 if (!preason)
1946 return 0;
1947
1948 pr = nla_nest_start(skb, IFLA_PROTO_DOWN_REASON);
1949 if (!pr)
1950 return -EMSGSIZE;
1951
1952 if (nla_put_u32(skb, IFLA_PROTO_DOWN_REASON_VALUE, preason)) {
1953 nla_nest_cancel(skb, pr);
1954 goto nla_put_failure;
1955 }
1956
1957 nla_nest_end(skb, pr);
1958 return 0;
1959
1960 nla_put_failure:
1961 return -EMSGSIZE;
1962 }
1963
rtnl_fill_devlink_port(struct sk_buff * skb,const struct net_device * dev)1964 static int rtnl_fill_devlink_port(struct sk_buff *skb,
1965 const struct net_device *dev)
1966 {
1967 struct nlattr *devlink_port_nest;
1968 int ret;
1969
1970 devlink_port_nest = nla_nest_start(skb, IFLA_DEVLINK_PORT);
1971 if (!devlink_port_nest)
1972 return -EMSGSIZE;
1973
1974 if (dev->devlink_port) {
1975 ret = devlink_nl_port_handle_fill(skb, dev->devlink_port);
1976 if (ret < 0)
1977 goto nest_cancel;
1978 }
1979
1980 nla_nest_end(skb, devlink_port_nest);
1981 return 0;
1982
1983 nest_cancel:
1984 nla_nest_cancel(skb, devlink_port_nest);
1985 return ret;
1986 }
1987
rtnl_fill_dpll_pin(struct sk_buff * skb,const struct net_device * dev)1988 static int rtnl_fill_dpll_pin(struct sk_buff *skb,
1989 const struct net_device *dev)
1990 {
1991 struct nlattr *dpll_pin_nest;
1992 int ret;
1993
1994 dpll_pin_nest = nla_nest_start(skb, IFLA_DPLL_PIN);
1995 if (!dpll_pin_nest)
1996 return -EMSGSIZE;
1997
1998 ret = dpll_netdev_add_pin_handle(skb, dev);
1999 if (ret < 0)
2000 goto nest_cancel;
2001
2002 nla_nest_end(skb, dpll_pin_nest);
2003 return 0;
2004
2005 nest_cancel:
2006 nla_nest_cancel(skb, dpll_pin_nest);
2007 return ret;
2008 }
2009
rtnl_fill_ifinfo(struct sk_buff * skb,struct net_device * dev,struct net * src_net,int type,u32 pid,u32 seq,u32 change,unsigned int flags,u32 ext_filter_mask,u32 event,int * new_nsid,int new_ifindex,int tgt_netnsid,gfp_t gfp)2010 static int rtnl_fill_ifinfo(struct sk_buff *skb,
2011 struct net_device *dev, struct net *src_net,
2012 int type, u32 pid, u32 seq, u32 change,
2013 unsigned int flags, u32 ext_filter_mask,
2014 u32 event, int *new_nsid, int new_ifindex,
2015 int tgt_netnsid, gfp_t gfp)
2016 {
2017 char devname[IFNAMSIZ];
2018 struct ifinfomsg *ifm;
2019 struct nlmsghdr *nlh;
2020 struct Qdisc *qdisc;
2021
2022 ASSERT_RTNL();
2023 nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ifm), flags);
2024 if (nlh == NULL)
2025 return -EMSGSIZE;
2026
2027 ifm = nlmsg_data(nlh);
2028 ifm->ifi_family = AF_UNSPEC;
2029 ifm->__ifi_pad = 0;
2030 ifm->ifi_type = READ_ONCE(dev->type);
2031 ifm->ifi_index = READ_ONCE(dev->ifindex);
2032 ifm->ifi_flags = dev_get_flags(dev);
2033 ifm->ifi_change = change;
2034
2035 if (tgt_netnsid >= 0 && nla_put_s32(skb, IFLA_TARGET_NETNSID, tgt_netnsid))
2036 goto nla_put_failure;
2037
2038 netdev_copy_name(dev, devname);
2039 if (nla_put_string(skb, IFLA_IFNAME, devname))
2040 goto nla_put_failure;
2041
2042 if (nla_put_u32(skb, IFLA_TXQLEN, READ_ONCE(dev->tx_queue_len)) ||
2043 nla_put_u8(skb, IFLA_OPERSTATE,
2044 netif_running(dev) ? READ_ONCE(dev->operstate) :
2045 IF_OPER_DOWN) ||
2046 nla_put_u8(skb, IFLA_LINKMODE, READ_ONCE(dev->link_mode)) ||
2047 nla_put_u32(skb, IFLA_MTU, READ_ONCE(dev->mtu)) ||
2048 nla_put_u32(skb, IFLA_MIN_MTU, READ_ONCE(dev->min_mtu)) ||
2049 nla_put_u32(skb, IFLA_MAX_MTU, READ_ONCE(dev->max_mtu)) ||
2050 nla_put_u32(skb, IFLA_GROUP, READ_ONCE(dev->group)) ||
2051 nla_put_u32(skb, IFLA_PROMISCUITY, READ_ONCE(dev->promiscuity)) ||
2052 nla_put_u32(skb, IFLA_ALLMULTI, READ_ONCE(dev->allmulti)) ||
2053 nla_put_u32(skb, IFLA_NUM_TX_QUEUES,
2054 READ_ONCE(dev->num_tx_queues)) ||
2055 nla_put_u32(skb, IFLA_GSO_MAX_SEGS,
2056 READ_ONCE(dev->gso_max_segs)) ||
2057 nla_put_u32(skb, IFLA_GSO_MAX_SIZE,
2058 READ_ONCE(dev->gso_max_size)) ||
2059 nla_put_u32(skb, IFLA_GRO_MAX_SIZE,
2060 READ_ONCE(dev->gro_max_size)) ||
2061 nla_put_u32(skb, IFLA_GSO_IPV4_MAX_SIZE,
2062 READ_ONCE(dev->gso_ipv4_max_size)) ||
2063 nla_put_u32(skb, IFLA_GRO_IPV4_MAX_SIZE,
2064 READ_ONCE(dev->gro_ipv4_max_size)) ||
2065 nla_put_u32(skb, IFLA_TSO_MAX_SIZE,
2066 READ_ONCE(dev->tso_max_size)) ||
2067 nla_put_u32(skb, IFLA_TSO_MAX_SEGS,
2068 READ_ONCE(dev->tso_max_segs)) ||
2069 nla_put_uint(skb, IFLA_MAX_PACING_OFFLOAD_HORIZON,
2070 READ_ONCE(dev->max_pacing_offload_horizon)) ||
2071 #ifdef CONFIG_RPS
2072 nla_put_u32(skb, IFLA_NUM_RX_QUEUES,
2073 READ_ONCE(dev->num_rx_queues)) ||
2074 #endif
2075 put_master_ifindex(skb, dev) ||
2076 nla_put_u8(skb, IFLA_CARRIER, netif_carrier_ok(dev)) ||
2077 nla_put_ifalias(skb, dev) ||
2078 nla_put_u32(skb, IFLA_CARRIER_CHANGES,
2079 atomic_read(&dev->carrier_up_count) +
2080 atomic_read(&dev->carrier_down_count)) ||
2081 nla_put_u32(skb, IFLA_CARRIER_UP_COUNT,
2082 atomic_read(&dev->carrier_up_count)) ||
2083 nla_put_u32(skb, IFLA_CARRIER_DOWN_COUNT,
2084 atomic_read(&dev->carrier_down_count)))
2085 goto nla_put_failure;
2086
2087 if (rtnl_fill_proto_down(skb, dev))
2088 goto nla_put_failure;
2089
2090 if (event != IFLA_EVENT_NONE) {
2091 if (nla_put_u32(skb, IFLA_EVENT, event))
2092 goto nla_put_failure;
2093 }
2094
2095 if (dev->addr_len) {
2096 if (nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr) ||
2097 nla_put(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast))
2098 goto nla_put_failure;
2099 }
2100
2101 if (rtnl_phys_port_id_fill(skb, dev))
2102 goto nla_put_failure;
2103
2104 if (rtnl_phys_port_name_fill(skb, dev))
2105 goto nla_put_failure;
2106
2107 if (rtnl_phys_switch_id_fill(skb, dev))
2108 goto nla_put_failure;
2109
2110 if (rtnl_fill_stats(skb, dev))
2111 goto nla_put_failure;
2112
2113 if (rtnl_fill_vf(skb, dev, ext_filter_mask))
2114 goto nla_put_failure;
2115
2116 if (rtnl_port_fill(skb, dev, ext_filter_mask))
2117 goto nla_put_failure;
2118
2119 if (rtnl_xdp_fill(skb, dev))
2120 goto nla_put_failure;
2121
2122 if (dev->rtnl_link_ops || rtnl_have_link_slave_info(dev)) {
2123 if (rtnl_link_fill(skb, dev) < 0)
2124 goto nla_put_failure;
2125 }
2126
2127 if (new_nsid &&
2128 nla_put_s32(skb, IFLA_NEW_NETNSID, *new_nsid) < 0)
2129 goto nla_put_failure;
2130 if (new_ifindex &&
2131 nla_put_s32(skb, IFLA_NEW_IFINDEX, new_ifindex) < 0)
2132 goto nla_put_failure;
2133
2134 if (memchr_inv(dev->perm_addr, '\0', dev->addr_len) &&
2135 nla_put(skb, IFLA_PERM_ADDRESS, dev->addr_len, dev->perm_addr))
2136 goto nla_put_failure;
2137
2138 rcu_read_lock();
2139 if (rtnl_fill_link_netnsid(skb, dev, src_net, GFP_ATOMIC))
2140 goto nla_put_failure_rcu;
2141 qdisc = rcu_dereference(dev->qdisc);
2142 if (qdisc && nla_put_string(skb, IFLA_QDISC, qdisc->ops->id))
2143 goto nla_put_failure_rcu;
2144 if (rtnl_fill_link_af(skb, dev, ext_filter_mask))
2145 goto nla_put_failure_rcu;
2146 if (rtnl_fill_link_ifmap(skb, dev))
2147 goto nla_put_failure_rcu;
2148 if (rtnl_fill_prop_list(skb, dev))
2149 goto nla_put_failure_rcu;
2150 rcu_read_unlock();
2151
2152 if (dev->dev.parent &&
2153 nla_put_string(skb, IFLA_PARENT_DEV_NAME,
2154 dev_name(dev->dev.parent)))
2155 goto nla_put_failure;
2156
2157 if (dev->dev.parent && dev->dev.parent->bus &&
2158 nla_put_string(skb, IFLA_PARENT_DEV_BUS_NAME,
2159 dev->dev.parent->bus->name))
2160 goto nla_put_failure;
2161
2162 if (rtnl_fill_devlink_port(skb, dev))
2163 goto nla_put_failure;
2164
2165 if (rtnl_fill_dpll_pin(skb, dev))
2166 goto nla_put_failure;
2167
2168 nlmsg_end(skb, nlh);
2169 return 0;
2170
2171 nla_put_failure_rcu:
2172 rcu_read_unlock();
2173 nla_put_failure:
2174 nlmsg_cancel(skb, nlh);
2175 return -EMSGSIZE;
2176 }
2177
2178 static const struct nla_policy ifla_policy[IFLA_MAX+1] = {
2179 [IFLA_UNSPEC] = { .strict_start_type = IFLA_DPLL_PIN },
2180 [IFLA_IFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ-1 },
2181 [IFLA_ADDRESS] = { .type = NLA_BINARY, .len = MAX_ADDR_LEN },
2182 [IFLA_BROADCAST] = { .type = NLA_BINARY, .len = MAX_ADDR_LEN },
2183 [IFLA_MAP] = { .len = sizeof(struct rtnl_link_ifmap) },
2184 [IFLA_MTU] = { .type = NLA_U32 },
2185 [IFLA_LINK] = { .type = NLA_U32 },
2186 [IFLA_MASTER] = { .type = NLA_U32 },
2187 [IFLA_CARRIER] = { .type = NLA_U8 },
2188 [IFLA_TXQLEN] = { .type = NLA_U32 },
2189 [IFLA_WEIGHT] = { .type = NLA_U32 },
2190 [IFLA_OPERSTATE] = { .type = NLA_U8 },
2191 [IFLA_LINKMODE] = { .type = NLA_U8 },
2192 [IFLA_LINKINFO] = { .type = NLA_NESTED },
2193 [IFLA_NET_NS_PID] = { .type = NLA_U32 },
2194 [IFLA_NET_NS_FD] = { .type = NLA_U32 },
2195 /* IFLA_IFALIAS is a string, but policy is set to NLA_BINARY to
2196 * allow 0-length string (needed to remove an alias).
2197 */
2198 [IFLA_IFALIAS] = { .type = NLA_BINARY, .len = IFALIASZ - 1 },
2199 [IFLA_VFINFO_LIST] = {. type = NLA_NESTED },
2200 [IFLA_VF_PORTS] = { .type = NLA_NESTED },
2201 [IFLA_PORT_SELF] = { .type = NLA_NESTED },
2202 [IFLA_AF_SPEC] = { .type = NLA_NESTED },
2203 [IFLA_EXT_MASK] = { .type = NLA_U32 },
2204 [IFLA_PROMISCUITY] = { .type = NLA_U32 },
2205 [IFLA_NUM_TX_QUEUES] = { .type = NLA_U32 },
2206 [IFLA_NUM_RX_QUEUES] = { .type = NLA_U32 },
2207 [IFLA_GSO_MAX_SEGS] = { .type = NLA_U32 },
2208 [IFLA_GSO_MAX_SIZE] = NLA_POLICY_MIN(NLA_U32, MAX_TCP_HEADER + 1),
2209 [IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN },
2210 [IFLA_CARRIER_CHANGES] = { .type = NLA_U32 }, /* ignored */
2211 [IFLA_PHYS_SWITCH_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN },
2212 [IFLA_LINK_NETNSID] = { .type = NLA_S32 },
2213 [IFLA_PROTO_DOWN] = { .type = NLA_U8 },
2214 [IFLA_XDP] = { .type = NLA_NESTED },
2215 [IFLA_EVENT] = { .type = NLA_U32 },
2216 [IFLA_GROUP] = { .type = NLA_U32 },
2217 [IFLA_TARGET_NETNSID] = { .type = NLA_S32 },
2218 [IFLA_CARRIER_UP_COUNT] = { .type = NLA_U32 },
2219 [IFLA_CARRIER_DOWN_COUNT] = { .type = NLA_U32 },
2220 [IFLA_MIN_MTU] = { .type = NLA_U32 },
2221 [IFLA_MAX_MTU] = { .type = NLA_U32 },
2222 [IFLA_PROP_LIST] = { .type = NLA_NESTED },
2223 [IFLA_ALT_IFNAME] = { .type = NLA_STRING,
2224 .len = ALTIFNAMSIZ - 1 },
2225 [IFLA_PERM_ADDRESS] = { .type = NLA_REJECT },
2226 [IFLA_PROTO_DOWN_REASON] = { .type = NLA_NESTED },
2227 [IFLA_NEW_IFINDEX] = NLA_POLICY_MIN(NLA_S32, 1),
2228 [IFLA_PARENT_DEV_NAME] = { .type = NLA_NUL_STRING },
2229 [IFLA_GRO_MAX_SIZE] = { .type = NLA_U32 },
2230 [IFLA_TSO_MAX_SIZE] = { .type = NLA_REJECT },
2231 [IFLA_TSO_MAX_SEGS] = { .type = NLA_REJECT },
2232 [IFLA_ALLMULTI] = { .type = NLA_REJECT },
2233 [IFLA_GSO_IPV4_MAX_SIZE] = NLA_POLICY_MIN(NLA_U32, MAX_TCP_HEADER + 1),
2234 [IFLA_GRO_IPV4_MAX_SIZE] = { .type = NLA_U32 },
2235 };
2236
2237 static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = {
2238 [IFLA_INFO_KIND] = { .type = NLA_STRING },
2239 [IFLA_INFO_DATA] = { .type = NLA_NESTED },
2240 [IFLA_INFO_SLAVE_KIND] = { .type = NLA_STRING },
2241 [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED },
2242 };
2243
2244 static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = {
2245 [IFLA_VF_MAC] = { .len = sizeof(struct ifla_vf_mac) },
2246 [IFLA_VF_BROADCAST] = { .type = NLA_REJECT },
2247 [IFLA_VF_VLAN] = { .len = sizeof(struct ifla_vf_vlan) },
2248 [IFLA_VF_VLAN_LIST] = { .type = NLA_NESTED },
2249 [IFLA_VF_TX_RATE] = { .len = sizeof(struct ifla_vf_tx_rate) },
2250 [IFLA_VF_SPOOFCHK] = { .len = sizeof(struct ifla_vf_spoofchk) },
2251 [IFLA_VF_RATE] = { .len = sizeof(struct ifla_vf_rate) },
2252 [IFLA_VF_LINK_STATE] = { .len = sizeof(struct ifla_vf_link_state) },
2253 [IFLA_VF_RSS_QUERY_EN] = { .len = sizeof(struct ifla_vf_rss_query_en) },
2254 [IFLA_VF_STATS] = { .type = NLA_NESTED },
2255 [IFLA_VF_TRUST] = { .len = sizeof(struct ifla_vf_trust) },
2256 [IFLA_VF_IB_NODE_GUID] = { .len = sizeof(struct ifla_vf_guid) },
2257 [IFLA_VF_IB_PORT_GUID] = { .len = sizeof(struct ifla_vf_guid) },
2258 };
2259
2260 static const struct nla_policy ifla_port_policy[IFLA_PORT_MAX+1] = {
2261 [IFLA_PORT_VF] = { .type = NLA_U32 },
2262 [IFLA_PORT_PROFILE] = { .type = NLA_STRING,
2263 .len = PORT_PROFILE_MAX },
2264 [IFLA_PORT_INSTANCE_UUID] = { .type = NLA_BINARY,
2265 .len = PORT_UUID_MAX },
2266 [IFLA_PORT_HOST_UUID] = { .type = NLA_STRING,
2267 .len = PORT_UUID_MAX },
2268 [IFLA_PORT_REQUEST] = { .type = NLA_U8, },
2269 [IFLA_PORT_RESPONSE] = { .type = NLA_U16, },
2270
2271 /* Unused, but we need to keep it here since user space could
2272 * fill it. It's also broken with regard to NLA_BINARY use in
2273 * combination with structs.
2274 */
2275 [IFLA_PORT_VSI_TYPE] = { .type = NLA_BINARY,
2276 .len = sizeof(struct ifla_port_vsi) },
2277 };
2278
2279 static const struct nla_policy ifla_xdp_policy[IFLA_XDP_MAX + 1] = {
2280 [IFLA_XDP_UNSPEC] = { .strict_start_type = IFLA_XDP_EXPECTED_FD },
2281 [IFLA_XDP_FD] = { .type = NLA_S32 },
2282 [IFLA_XDP_EXPECTED_FD] = { .type = NLA_S32 },
2283 [IFLA_XDP_ATTACHED] = { .type = NLA_U8 },
2284 [IFLA_XDP_FLAGS] = { .type = NLA_U32 },
2285 [IFLA_XDP_PROG_ID] = { .type = NLA_U32 },
2286 };
2287
linkinfo_to_kind_ops(const struct nlattr * nla,int * ops_srcu_index)2288 static struct rtnl_link_ops *linkinfo_to_kind_ops(const struct nlattr *nla,
2289 int *ops_srcu_index)
2290 {
2291 struct nlattr *linfo[IFLA_INFO_MAX + 1];
2292 struct rtnl_link_ops *ops = NULL;
2293
2294 if (nla_parse_nested_deprecated(linfo, IFLA_INFO_MAX, nla, ifla_info_policy, NULL) < 0)
2295 return NULL;
2296
2297 if (linfo[IFLA_INFO_KIND]) {
2298 char kind[MODULE_NAME_LEN];
2299
2300 nla_strscpy(kind, linfo[IFLA_INFO_KIND], sizeof(kind));
2301 ops = rtnl_link_ops_get(kind, ops_srcu_index);
2302 }
2303
2304 return ops;
2305 }
2306
link_master_filtered(struct net_device * dev,int master_idx)2307 static bool link_master_filtered(struct net_device *dev, int master_idx)
2308 {
2309 struct net_device *master;
2310
2311 if (!master_idx)
2312 return false;
2313
2314 master = netdev_master_upper_dev_get(dev);
2315
2316 /* 0 is already used to denote IFLA_MASTER wasn't passed, therefore need
2317 * another invalid value for ifindex to denote "no master".
2318 */
2319 if (master_idx == -1)
2320 return !!master;
2321
2322 if (!master || master->ifindex != master_idx)
2323 return true;
2324
2325 return false;
2326 }
2327
link_kind_filtered(const struct net_device * dev,const struct rtnl_link_ops * kind_ops)2328 static bool link_kind_filtered(const struct net_device *dev,
2329 const struct rtnl_link_ops *kind_ops)
2330 {
2331 if (kind_ops && dev->rtnl_link_ops != kind_ops)
2332 return true;
2333
2334 return false;
2335 }
2336
link_dump_filtered(struct net_device * dev,int master_idx,const struct rtnl_link_ops * kind_ops)2337 static bool link_dump_filtered(struct net_device *dev,
2338 int master_idx,
2339 const struct rtnl_link_ops *kind_ops)
2340 {
2341 if (link_master_filtered(dev, master_idx) ||
2342 link_kind_filtered(dev, kind_ops))
2343 return true;
2344
2345 return false;
2346 }
2347
2348 /**
2349 * rtnl_get_net_ns_capable - Get netns if sufficiently privileged.
2350 * @sk: netlink socket
2351 * @netnsid: network namespace identifier
2352 *
2353 * Returns the network namespace identified by netnsid on success or an error
2354 * pointer on failure.
2355 */
rtnl_get_net_ns_capable(struct sock * sk,int netnsid)2356 struct net *rtnl_get_net_ns_capable(struct sock *sk, int netnsid)
2357 {
2358 struct net *net;
2359
2360 net = get_net_ns_by_id(sock_net(sk), netnsid);
2361 if (!net)
2362 return ERR_PTR(-EINVAL);
2363
2364 /* For now, the caller is required to have CAP_NET_ADMIN in
2365 * the user namespace owning the target net ns.
2366 */
2367 if (!sk_ns_capable(sk, net->user_ns, CAP_NET_ADMIN)) {
2368 put_net(net);
2369 return ERR_PTR(-EACCES);
2370 }
2371 return net;
2372 }
2373 EXPORT_SYMBOL_GPL(rtnl_get_net_ns_capable);
2374
rtnl_valid_dump_ifinfo_req(const struct nlmsghdr * nlh,bool strict_check,struct nlattr ** tb,struct netlink_ext_ack * extack)2375 static int rtnl_valid_dump_ifinfo_req(const struct nlmsghdr *nlh,
2376 bool strict_check, struct nlattr **tb,
2377 struct netlink_ext_ack *extack)
2378 {
2379 int hdrlen;
2380
2381 if (strict_check) {
2382 struct ifinfomsg *ifm;
2383
2384 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifm))) {
2385 NL_SET_ERR_MSG(extack, "Invalid header for link dump");
2386 return -EINVAL;
2387 }
2388
2389 ifm = nlmsg_data(nlh);
2390 if (ifm->__ifi_pad || ifm->ifi_type || ifm->ifi_flags ||
2391 ifm->ifi_change) {
2392 NL_SET_ERR_MSG(extack, "Invalid values in header for link dump request");
2393 return -EINVAL;
2394 }
2395 if (ifm->ifi_index) {
2396 NL_SET_ERR_MSG(extack, "Filter by device index not supported for link dumps");
2397 return -EINVAL;
2398 }
2399
2400 return nlmsg_parse_deprecated_strict(nlh, sizeof(*ifm), tb,
2401 IFLA_MAX, ifla_policy,
2402 extack);
2403 }
2404
2405 /* A hack to preserve kernel<->userspace interface.
2406 * The correct header is ifinfomsg. It is consistent with rtnl_getlink.
2407 * However, before Linux v3.9 the code here assumed rtgenmsg and that's
2408 * what iproute2 < v3.9.0 used.
2409 * We can detect the old iproute2. Even including the IFLA_EXT_MASK
2410 * attribute, its netlink message is shorter than struct ifinfomsg.
2411 */
2412 hdrlen = nlmsg_len(nlh) < sizeof(struct ifinfomsg) ?
2413 sizeof(struct rtgenmsg) : sizeof(struct ifinfomsg);
2414
2415 return nlmsg_parse_deprecated(nlh, hdrlen, tb, IFLA_MAX, ifla_policy,
2416 extack);
2417 }
2418
rtnl_dump_ifinfo(struct sk_buff * skb,struct netlink_callback * cb)2419 static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
2420 {
2421 struct netlink_ext_ack *extack = cb->extack;
2422 struct rtnl_link_ops *kind_ops = NULL;
2423 const struct nlmsghdr *nlh = cb->nlh;
2424 struct net *net = sock_net(skb->sk);
2425 unsigned int flags = NLM_F_MULTI;
2426 struct nlattr *tb[IFLA_MAX+1];
2427 struct {
2428 unsigned long ifindex;
2429 } *ctx = (void *)cb->ctx;
2430 struct net *tgt_net = net;
2431 u32 ext_filter_mask = 0;
2432 struct net_device *dev;
2433 int ops_srcu_index;
2434 int master_idx = 0;
2435 int netnsid = -1;
2436 int err, i;
2437
2438 err = rtnl_valid_dump_ifinfo_req(nlh, cb->strict_check, tb, extack);
2439 if (err < 0) {
2440 if (cb->strict_check)
2441 return err;
2442
2443 goto walk_entries;
2444 }
2445
2446 for (i = 0; i <= IFLA_MAX; ++i) {
2447 if (!tb[i])
2448 continue;
2449
2450 /* new attributes should only be added with strict checking */
2451 switch (i) {
2452 case IFLA_TARGET_NETNSID:
2453 netnsid = nla_get_s32(tb[i]);
2454 tgt_net = rtnl_get_net_ns_capable(skb->sk, netnsid);
2455 if (IS_ERR(tgt_net)) {
2456 NL_SET_ERR_MSG(extack, "Invalid target network namespace id");
2457 err = PTR_ERR(tgt_net);
2458 netnsid = -1;
2459 goto out;
2460 }
2461 break;
2462 case IFLA_EXT_MASK:
2463 ext_filter_mask = nla_get_u32(tb[i]);
2464 break;
2465 case IFLA_MASTER:
2466 master_idx = nla_get_u32(tb[i]);
2467 break;
2468 case IFLA_LINKINFO:
2469 kind_ops = linkinfo_to_kind_ops(tb[i], &ops_srcu_index);
2470 break;
2471 default:
2472 if (cb->strict_check) {
2473 NL_SET_ERR_MSG(extack, "Unsupported attribute in link dump request");
2474 err = -EINVAL;
2475 goto out;
2476 }
2477 }
2478 }
2479
2480 if (master_idx || kind_ops)
2481 flags |= NLM_F_DUMP_FILTERED;
2482
2483 walk_entries:
2484 err = 0;
2485 for_each_netdev_dump(tgt_net, dev, ctx->ifindex) {
2486 if (link_dump_filtered(dev, master_idx, kind_ops))
2487 continue;
2488 err = rtnl_fill_ifinfo(skb, dev, net, RTM_NEWLINK,
2489 NETLINK_CB(cb->skb).portid,
2490 nlh->nlmsg_seq, 0, flags,
2491 ext_filter_mask, 0, NULL, 0,
2492 netnsid, GFP_KERNEL);
2493 if (err < 0)
2494 break;
2495 }
2496
2497
2498 cb->seq = tgt_net->dev_base_seq;
2499 nl_dump_check_consistent(cb, nlmsg_hdr(skb));
2500
2501 out:
2502
2503 if (kind_ops)
2504 rtnl_link_ops_put(kind_ops, ops_srcu_index);
2505 if (netnsid >= 0)
2506 put_net(tgt_net);
2507
2508 return err;
2509 }
2510
rtnl_nla_parse_ifinfomsg(struct nlattr ** tb,const struct nlattr * nla_peer,struct netlink_ext_ack * exterr)2511 int rtnl_nla_parse_ifinfomsg(struct nlattr **tb, const struct nlattr *nla_peer,
2512 struct netlink_ext_ack *exterr)
2513 {
2514 const struct ifinfomsg *ifmp;
2515 const struct nlattr *attrs;
2516 size_t len;
2517
2518 ifmp = nla_data(nla_peer);
2519 attrs = nla_data(nla_peer) + sizeof(struct ifinfomsg);
2520 len = nla_len(nla_peer) - sizeof(struct ifinfomsg);
2521
2522 if (ifmp->ifi_index < 0) {
2523 NL_SET_ERR_MSG_ATTR(exterr, nla_peer,
2524 "ifindex can't be negative");
2525 return -EINVAL;
2526 }
2527
2528 return nla_parse_deprecated(tb, IFLA_MAX, attrs, len, ifla_policy,
2529 exterr);
2530 }
2531 EXPORT_SYMBOL(rtnl_nla_parse_ifinfomsg);
2532
rtnl_link_get_net_ifla(struct nlattr * tb[])2533 static struct net *rtnl_link_get_net_ifla(struct nlattr *tb[])
2534 {
2535 struct net *net = NULL;
2536
2537 /* Examine the link attributes and figure out which
2538 * network namespace we are talking about.
2539 */
2540 if (tb[IFLA_NET_NS_PID])
2541 net = get_net_ns_by_pid(nla_get_u32(tb[IFLA_NET_NS_PID]));
2542 else if (tb[IFLA_NET_NS_FD])
2543 net = get_net_ns_by_fd(nla_get_u32(tb[IFLA_NET_NS_FD]));
2544
2545 return net;
2546 }
2547
rtnl_link_get_net(struct net * src_net,struct nlattr * tb[])2548 struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[])
2549 {
2550 struct net *net = rtnl_link_get_net_ifla(tb);
2551
2552 if (!net)
2553 net = get_net(src_net);
2554
2555 return net;
2556 }
2557 EXPORT_SYMBOL(rtnl_link_get_net);
2558
2559 /* Figure out which network namespace we are talking about by
2560 * examining the link attributes in the following order:
2561 *
2562 * 1. IFLA_NET_NS_PID
2563 * 2. IFLA_NET_NS_FD
2564 * 3. IFLA_TARGET_NETNSID
2565 */
rtnl_link_get_net_by_nlattr(struct net * src_net,struct nlattr * tb[])2566 static struct net *rtnl_link_get_net_by_nlattr(struct net *src_net,
2567 struct nlattr *tb[])
2568 {
2569 struct net *net;
2570
2571 if (tb[IFLA_NET_NS_PID] || tb[IFLA_NET_NS_FD])
2572 return rtnl_link_get_net(src_net, tb);
2573
2574 if (!tb[IFLA_TARGET_NETNSID])
2575 return get_net(src_net);
2576
2577 net = get_net_ns_by_id(src_net, nla_get_u32(tb[IFLA_TARGET_NETNSID]));
2578 if (!net)
2579 return ERR_PTR(-EINVAL);
2580
2581 return net;
2582 }
2583
rtnl_link_get_net_capable(const struct sk_buff * skb,struct net * src_net,struct nlattr * tb[],int cap)2584 static struct net *rtnl_link_get_net_capable(const struct sk_buff *skb,
2585 struct net *src_net,
2586 struct nlattr *tb[], int cap)
2587 {
2588 struct net *net;
2589
2590 net = rtnl_link_get_net_by_nlattr(src_net, tb);
2591 if (IS_ERR(net))
2592 return net;
2593
2594 if (!netlink_ns_capable(skb, net->user_ns, cap)) {
2595 put_net(net);
2596 return ERR_PTR(-EPERM);
2597 }
2598
2599 return net;
2600 }
2601
2602 /* Verify that rtnetlink requests do not pass additional properties
2603 * potentially referring to different network namespaces.
2604 */
rtnl_ensure_unique_netns(struct nlattr * tb[],struct netlink_ext_ack * extack,bool netns_id_only)2605 static int rtnl_ensure_unique_netns(struct nlattr *tb[],
2606 struct netlink_ext_ack *extack,
2607 bool netns_id_only)
2608 {
2609
2610 if (netns_id_only) {
2611 if (!tb[IFLA_NET_NS_PID] && !tb[IFLA_NET_NS_FD])
2612 return 0;
2613
2614 NL_SET_ERR_MSG(extack, "specified netns attribute not supported");
2615 return -EOPNOTSUPP;
2616 }
2617
2618 if (tb[IFLA_TARGET_NETNSID] && (tb[IFLA_NET_NS_PID] || tb[IFLA_NET_NS_FD]))
2619 goto invalid_attr;
2620
2621 if (tb[IFLA_NET_NS_PID] && (tb[IFLA_TARGET_NETNSID] || tb[IFLA_NET_NS_FD]))
2622 goto invalid_attr;
2623
2624 if (tb[IFLA_NET_NS_FD] && (tb[IFLA_TARGET_NETNSID] || tb[IFLA_NET_NS_PID]))
2625 goto invalid_attr;
2626
2627 return 0;
2628
2629 invalid_attr:
2630 NL_SET_ERR_MSG(extack, "multiple netns identifying attributes specified");
2631 return -EINVAL;
2632 }
2633
rtnl_set_vf_rate(struct net_device * dev,int vf,int min_tx_rate,int max_tx_rate)2634 static int rtnl_set_vf_rate(struct net_device *dev, int vf, int min_tx_rate,
2635 int max_tx_rate)
2636 {
2637 const struct net_device_ops *ops = dev->netdev_ops;
2638
2639 if (!ops->ndo_set_vf_rate)
2640 return -EOPNOTSUPP;
2641 if (max_tx_rate && max_tx_rate < min_tx_rate)
2642 return -EINVAL;
2643
2644 return ops->ndo_set_vf_rate(dev, vf, min_tx_rate, max_tx_rate);
2645 }
2646
validate_linkmsg(struct net_device * dev,struct nlattr * tb[],struct netlink_ext_ack * extack)2647 static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[],
2648 struct netlink_ext_ack *extack)
2649 {
2650 if (tb[IFLA_ADDRESS] &&
2651 nla_len(tb[IFLA_ADDRESS]) < dev->addr_len)
2652 return -EINVAL;
2653
2654 if (tb[IFLA_BROADCAST] &&
2655 nla_len(tb[IFLA_BROADCAST]) < dev->addr_len)
2656 return -EINVAL;
2657
2658 if (tb[IFLA_GSO_MAX_SIZE] &&
2659 nla_get_u32(tb[IFLA_GSO_MAX_SIZE]) > dev->tso_max_size) {
2660 NL_SET_ERR_MSG(extack, "too big gso_max_size");
2661 return -EINVAL;
2662 }
2663
2664 if (tb[IFLA_GSO_MAX_SEGS] &&
2665 (nla_get_u32(tb[IFLA_GSO_MAX_SEGS]) > GSO_MAX_SEGS ||
2666 nla_get_u32(tb[IFLA_GSO_MAX_SEGS]) > dev->tso_max_segs)) {
2667 NL_SET_ERR_MSG(extack, "too big gso_max_segs");
2668 return -EINVAL;
2669 }
2670
2671 if (tb[IFLA_GRO_MAX_SIZE] &&
2672 nla_get_u32(tb[IFLA_GRO_MAX_SIZE]) > GRO_MAX_SIZE) {
2673 NL_SET_ERR_MSG(extack, "too big gro_max_size");
2674 return -EINVAL;
2675 }
2676
2677 if (tb[IFLA_GSO_IPV4_MAX_SIZE] &&
2678 nla_get_u32(tb[IFLA_GSO_IPV4_MAX_SIZE]) > dev->tso_max_size) {
2679 NL_SET_ERR_MSG(extack, "too big gso_ipv4_max_size");
2680 return -EINVAL;
2681 }
2682
2683 if (tb[IFLA_GRO_IPV4_MAX_SIZE] &&
2684 nla_get_u32(tb[IFLA_GRO_IPV4_MAX_SIZE]) > GRO_MAX_SIZE) {
2685 NL_SET_ERR_MSG(extack, "too big gro_ipv4_max_size");
2686 return -EINVAL;
2687 }
2688
2689 if (tb[IFLA_AF_SPEC]) {
2690 struct nlattr *af;
2691 int rem, err;
2692
2693 nla_for_each_nested(af, tb[IFLA_AF_SPEC], rem) {
2694 struct rtnl_af_ops *af_ops;
2695 int af_ops_srcu_index;
2696
2697 af_ops = rtnl_af_lookup(nla_type(af), &af_ops_srcu_index);
2698 if (!af_ops)
2699 return -EAFNOSUPPORT;
2700
2701 if (!af_ops->set_link_af)
2702 err = -EOPNOTSUPP;
2703 else if (af_ops->validate_link_af)
2704 err = af_ops->validate_link_af(dev, af, extack);
2705 else
2706 err = 0;
2707
2708 rtnl_af_put(af_ops, af_ops_srcu_index);
2709
2710 if (err < 0)
2711 return err;
2712 }
2713 }
2714
2715 return 0;
2716 }
2717
handle_infiniband_guid(struct net_device * dev,struct ifla_vf_guid * ivt,int guid_type)2718 static int handle_infiniband_guid(struct net_device *dev, struct ifla_vf_guid *ivt,
2719 int guid_type)
2720 {
2721 const struct net_device_ops *ops = dev->netdev_ops;
2722
2723 return ops->ndo_set_vf_guid(dev, ivt->vf, ivt->guid, guid_type);
2724 }
2725
handle_vf_guid(struct net_device * dev,struct ifla_vf_guid * ivt,int guid_type)2726 static int handle_vf_guid(struct net_device *dev, struct ifla_vf_guid *ivt, int guid_type)
2727 {
2728 if (dev->type != ARPHRD_INFINIBAND)
2729 return -EOPNOTSUPP;
2730
2731 return handle_infiniband_guid(dev, ivt, guid_type);
2732 }
2733
do_setvfinfo(struct net_device * dev,struct nlattr ** tb)2734 static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
2735 {
2736 const struct net_device_ops *ops = dev->netdev_ops;
2737 int err = -EINVAL;
2738
2739 if (tb[IFLA_VF_MAC]) {
2740 struct ifla_vf_mac *ivm = nla_data(tb[IFLA_VF_MAC]);
2741
2742 if (ivm->vf >= INT_MAX)
2743 return -EINVAL;
2744 err = -EOPNOTSUPP;
2745 if (ops->ndo_set_vf_mac)
2746 err = ops->ndo_set_vf_mac(dev, ivm->vf,
2747 ivm->mac);
2748 if (err < 0)
2749 return err;
2750 }
2751
2752 if (tb[IFLA_VF_VLAN]) {
2753 struct ifla_vf_vlan *ivv = nla_data(tb[IFLA_VF_VLAN]);
2754
2755 if (ivv->vf >= INT_MAX)
2756 return -EINVAL;
2757 err = -EOPNOTSUPP;
2758 if (ops->ndo_set_vf_vlan)
2759 err = ops->ndo_set_vf_vlan(dev, ivv->vf, ivv->vlan,
2760 ivv->qos,
2761 htons(ETH_P_8021Q));
2762 if (err < 0)
2763 return err;
2764 }
2765
2766 if (tb[IFLA_VF_VLAN_LIST]) {
2767 struct ifla_vf_vlan_info *ivvl[MAX_VLAN_LIST_LEN];
2768 struct nlattr *attr;
2769 int rem, len = 0;
2770
2771 err = -EOPNOTSUPP;
2772 if (!ops->ndo_set_vf_vlan)
2773 return err;
2774
2775 nla_for_each_nested(attr, tb[IFLA_VF_VLAN_LIST], rem) {
2776 if (nla_type(attr) != IFLA_VF_VLAN_INFO ||
2777 nla_len(attr) < sizeof(struct ifla_vf_vlan_info)) {
2778 return -EINVAL;
2779 }
2780 if (len >= MAX_VLAN_LIST_LEN)
2781 return -EOPNOTSUPP;
2782 ivvl[len] = nla_data(attr);
2783
2784 len++;
2785 }
2786 if (len == 0)
2787 return -EINVAL;
2788
2789 if (ivvl[0]->vf >= INT_MAX)
2790 return -EINVAL;
2791 err = ops->ndo_set_vf_vlan(dev, ivvl[0]->vf, ivvl[0]->vlan,
2792 ivvl[0]->qos, ivvl[0]->vlan_proto);
2793 if (err < 0)
2794 return err;
2795 }
2796
2797 if (tb[IFLA_VF_TX_RATE]) {
2798 struct ifla_vf_tx_rate *ivt = nla_data(tb[IFLA_VF_TX_RATE]);
2799 struct ifla_vf_info ivf;
2800
2801 if (ivt->vf >= INT_MAX)
2802 return -EINVAL;
2803 err = -EOPNOTSUPP;
2804 if (ops->ndo_get_vf_config)
2805 err = ops->ndo_get_vf_config(dev, ivt->vf, &ivf);
2806 if (err < 0)
2807 return err;
2808
2809 err = rtnl_set_vf_rate(dev, ivt->vf,
2810 ivf.min_tx_rate, ivt->rate);
2811 if (err < 0)
2812 return err;
2813 }
2814
2815 if (tb[IFLA_VF_RATE]) {
2816 struct ifla_vf_rate *ivt = nla_data(tb[IFLA_VF_RATE]);
2817
2818 if (ivt->vf >= INT_MAX)
2819 return -EINVAL;
2820
2821 err = rtnl_set_vf_rate(dev, ivt->vf,
2822 ivt->min_tx_rate, ivt->max_tx_rate);
2823 if (err < 0)
2824 return err;
2825 }
2826
2827 if (tb[IFLA_VF_SPOOFCHK]) {
2828 struct ifla_vf_spoofchk *ivs = nla_data(tb[IFLA_VF_SPOOFCHK]);
2829
2830 if (ivs->vf >= INT_MAX)
2831 return -EINVAL;
2832 err = -EOPNOTSUPP;
2833 if (ops->ndo_set_vf_spoofchk)
2834 err = ops->ndo_set_vf_spoofchk(dev, ivs->vf,
2835 ivs->setting);
2836 if (err < 0)
2837 return err;
2838 }
2839
2840 if (tb[IFLA_VF_LINK_STATE]) {
2841 struct ifla_vf_link_state *ivl = nla_data(tb[IFLA_VF_LINK_STATE]);
2842
2843 if (ivl->vf >= INT_MAX)
2844 return -EINVAL;
2845 err = -EOPNOTSUPP;
2846 if (ops->ndo_set_vf_link_state)
2847 err = ops->ndo_set_vf_link_state(dev, ivl->vf,
2848 ivl->link_state);
2849 if (err < 0)
2850 return err;
2851 }
2852
2853 if (tb[IFLA_VF_RSS_QUERY_EN]) {
2854 struct ifla_vf_rss_query_en *ivrssq_en;
2855
2856 err = -EOPNOTSUPP;
2857 ivrssq_en = nla_data(tb[IFLA_VF_RSS_QUERY_EN]);
2858 if (ivrssq_en->vf >= INT_MAX)
2859 return -EINVAL;
2860 if (ops->ndo_set_vf_rss_query_en)
2861 err = ops->ndo_set_vf_rss_query_en(dev, ivrssq_en->vf,
2862 ivrssq_en->setting);
2863 if (err < 0)
2864 return err;
2865 }
2866
2867 if (tb[IFLA_VF_TRUST]) {
2868 struct ifla_vf_trust *ivt = nla_data(tb[IFLA_VF_TRUST]);
2869
2870 if (ivt->vf >= INT_MAX)
2871 return -EINVAL;
2872 err = -EOPNOTSUPP;
2873 if (ops->ndo_set_vf_trust)
2874 err = ops->ndo_set_vf_trust(dev, ivt->vf, ivt->setting);
2875 if (err < 0)
2876 return err;
2877 }
2878
2879 if (tb[IFLA_VF_IB_NODE_GUID]) {
2880 struct ifla_vf_guid *ivt = nla_data(tb[IFLA_VF_IB_NODE_GUID]);
2881
2882 if (ivt->vf >= INT_MAX)
2883 return -EINVAL;
2884 if (!ops->ndo_set_vf_guid)
2885 return -EOPNOTSUPP;
2886 return handle_vf_guid(dev, ivt, IFLA_VF_IB_NODE_GUID);
2887 }
2888
2889 if (tb[IFLA_VF_IB_PORT_GUID]) {
2890 struct ifla_vf_guid *ivt = nla_data(tb[IFLA_VF_IB_PORT_GUID]);
2891
2892 if (ivt->vf >= INT_MAX)
2893 return -EINVAL;
2894 if (!ops->ndo_set_vf_guid)
2895 return -EOPNOTSUPP;
2896
2897 return handle_vf_guid(dev, ivt, IFLA_VF_IB_PORT_GUID);
2898 }
2899
2900 return err;
2901 }
2902
do_set_master(struct net_device * dev,int ifindex,struct netlink_ext_ack * extack)2903 static int do_set_master(struct net_device *dev, int ifindex,
2904 struct netlink_ext_ack *extack)
2905 {
2906 struct net_device *upper_dev = netdev_master_upper_dev_get(dev);
2907 const struct net_device_ops *ops;
2908 int err;
2909
2910 if (upper_dev) {
2911 if (upper_dev->ifindex == ifindex)
2912 return 0;
2913 ops = upper_dev->netdev_ops;
2914 if (ops->ndo_del_slave) {
2915 err = ops->ndo_del_slave(upper_dev, dev);
2916 if (err)
2917 return err;
2918 } else {
2919 return -EOPNOTSUPP;
2920 }
2921 }
2922
2923 if (ifindex) {
2924 upper_dev = __dev_get_by_index(dev_net(dev), ifindex);
2925 if (!upper_dev)
2926 return -EINVAL;
2927 ops = upper_dev->netdev_ops;
2928 if (ops->ndo_add_slave) {
2929 err = ops->ndo_add_slave(upper_dev, dev, extack);
2930 if (err)
2931 return err;
2932 } else {
2933 return -EOPNOTSUPP;
2934 }
2935 }
2936 return 0;
2937 }
2938
2939 static const struct nla_policy ifla_proto_down_reason_policy[IFLA_PROTO_DOWN_REASON_VALUE + 1] = {
2940 [IFLA_PROTO_DOWN_REASON_MASK] = { .type = NLA_U32 },
2941 [IFLA_PROTO_DOWN_REASON_VALUE] = { .type = NLA_U32 },
2942 };
2943
do_set_proto_down(struct net_device * dev,struct nlattr * nl_proto_down,struct nlattr * nl_proto_down_reason,struct netlink_ext_ack * extack)2944 static int do_set_proto_down(struct net_device *dev,
2945 struct nlattr *nl_proto_down,
2946 struct nlattr *nl_proto_down_reason,
2947 struct netlink_ext_ack *extack)
2948 {
2949 struct nlattr *pdreason[IFLA_PROTO_DOWN_REASON_MAX + 1];
2950 unsigned long mask = 0;
2951 u32 value;
2952 bool proto_down;
2953 int err;
2954
2955 if (!dev->change_proto_down) {
2956 NL_SET_ERR_MSG(extack, "Protodown not supported by device");
2957 return -EOPNOTSUPP;
2958 }
2959
2960 if (nl_proto_down_reason) {
2961 err = nla_parse_nested_deprecated(pdreason,
2962 IFLA_PROTO_DOWN_REASON_MAX,
2963 nl_proto_down_reason,
2964 ifla_proto_down_reason_policy,
2965 NULL);
2966 if (err < 0)
2967 return err;
2968
2969 if (!pdreason[IFLA_PROTO_DOWN_REASON_VALUE]) {
2970 NL_SET_ERR_MSG(extack, "Invalid protodown reason value");
2971 return -EINVAL;
2972 }
2973
2974 value = nla_get_u32(pdreason[IFLA_PROTO_DOWN_REASON_VALUE]);
2975
2976 if (pdreason[IFLA_PROTO_DOWN_REASON_MASK])
2977 mask = nla_get_u32(pdreason[IFLA_PROTO_DOWN_REASON_MASK]);
2978
2979 dev_change_proto_down_reason(dev, mask, value);
2980 }
2981
2982 if (nl_proto_down) {
2983 proto_down = nla_get_u8(nl_proto_down);
2984
2985 /* Don't turn off protodown if there are active reasons */
2986 if (!proto_down && dev->proto_down_reason) {
2987 NL_SET_ERR_MSG(extack, "Cannot clear protodown, active reasons");
2988 return -EBUSY;
2989 }
2990 err = dev_change_proto_down(dev,
2991 proto_down);
2992 if (err)
2993 return err;
2994 }
2995
2996 return 0;
2997 }
2998
2999 #define DO_SETLINK_MODIFIED 0x01
3000 /* notify flag means notify + modified. */
3001 #define DO_SETLINK_NOTIFY 0x03
do_setlink(const struct sk_buff * skb,struct net_device * dev,struct net * tgt_net,struct ifinfomsg * ifm,struct netlink_ext_ack * extack,struct nlattr ** tb,int status)3002 static int do_setlink(const struct sk_buff *skb, struct net_device *dev,
3003 struct net *tgt_net, struct ifinfomsg *ifm,
3004 struct netlink_ext_ack *extack,
3005 struct nlattr **tb, int status)
3006 {
3007 const struct net_device_ops *ops = dev->netdev_ops;
3008 char ifname[IFNAMSIZ];
3009 int err;
3010
3011 err = validate_linkmsg(dev, tb, extack);
3012 if (err < 0)
3013 goto errout;
3014
3015 if (tb[IFLA_IFNAME])
3016 nla_strscpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
3017 else
3018 ifname[0] = '\0';
3019
3020 if (!net_eq(tgt_net, dev_net(dev))) {
3021 const char *pat = ifname[0] ? ifname : NULL;
3022 int new_ifindex;
3023
3024 new_ifindex = nla_get_s32_default(tb[IFLA_NEW_IFINDEX], 0);
3025
3026 err = __dev_change_net_namespace(dev, tgt_net, pat, new_ifindex);
3027 if (err)
3028 goto errout;
3029
3030 status |= DO_SETLINK_MODIFIED;
3031 }
3032
3033 if (tb[IFLA_MAP]) {
3034 struct rtnl_link_ifmap *u_map;
3035 struct ifmap k_map;
3036
3037 if (!ops->ndo_set_config) {
3038 err = -EOPNOTSUPP;
3039 goto errout;
3040 }
3041
3042 if (!netif_device_present(dev)) {
3043 err = -ENODEV;
3044 goto errout;
3045 }
3046
3047 u_map = nla_data(tb[IFLA_MAP]);
3048 k_map.mem_start = (unsigned long) u_map->mem_start;
3049 k_map.mem_end = (unsigned long) u_map->mem_end;
3050 k_map.base_addr = (unsigned short) u_map->base_addr;
3051 k_map.irq = (unsigned char) u_map->irq;
3052 k_map.dma = (unsigned char) u_map->dma;
3053 k_map.port = (unsigned char) u_map->port;
3054
3055 err = ops->ndo_set_config(dev, &k_map);
3056 if (err < 0)
3057 goto errout;
3058
3059 status |= DO_SETLINK_NOTIFY;
3060 }
3061
3062 if (tb[IFLA_ADDRESS]) {
3063 struct sockaddr *sa;
3064 int len;
3065
3066 len = sizeof(sa_family_t) + max_t(size_t, dev->addr_len,
3067 sizeof(*sa));
3068 sa = kmalloc(len, GFP_KERNEL);
3069 if (!sa) {
3070 err = -ENOMEM;
3071 goto errout;
3072 }
3073 sa->sa_family = dev->type;
3074 memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]),
3075 dev->addr_len);
3076 err = dev_set_mac_address_user(dev, sa, extack);
3077 kfree(sa);
3078 if (err)
3079 goto errout;
3080 status |= DO_SETLINK_MODIFIED;
3081 }
3082
3083 if (tb[IFLA_MTU]) {
3084 err = dev_set_mtu_ext(dev, nla_get_u32(tb[IFLA_MTU]), extack);
3085 if (err < 0)
3086 goto errout;
3087 status |= DO_SETLINK_MODIFIED;
3088 }
3089
3090 if (tb[IFLA_GROUP]) {
3091 dev_set_group(dev, nla_get_u32(tb[IFLA_GROUP]));
3092 status |= DO_SETLINK_NOTIFY;
3093 }
3094
3095 /*
3096 * Interface selected by interface index but interface
3097 * name provided implies that a name change has been
3098 * requested.
3099 */
3100 if (ifm->ifi_index > 0 && ifname[0]) {
3101 err = dev_change_name(dev, ifname);
3102 if (err < 0)
3103 goto errout;
3104 status |= DO_SETLINK_MODIFIED;
3105 }
3106
3107 if (tb[IFLA_IFALIAS]) {
3108 err = dev_set_alias(dev, nla_data(tb[IFLA_IFALIAS]),
3109 nla_len(tb[IFLA_IFALIAS]));
3110 if (err < 0)
3111 goto errout;
3112 status |= DO_SETLINK_NOTIFY;
3113 }
3114
3115 if (tb[IFLA_BROADCAST]) {
3116 nla_memcpy(dev->broadcast, tb[IFLA_BROADCAST], dev->addr_len);
3117 call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
3118 }
3119
3120 if (ifm->ifi_flags || ifm->ifi_change) {
3121 err = dev_change_flags(dev, rtnl_dev_combine_flags(dev, ifm),
3122 extack);
3123 if (err < 0)
3124 goto errout;
3125 }
3126
3127 if (tb[IFLA_MASTER]) {
3128 err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]), extack);
3129 if (err)
3130 goto errout;
3131 status |= DO_SETLINK_MODIFIED;
3132 }
3133
3134 if (tb[IFLA_CARRIER]) {
3135 err = dev_change_carrier(dev, nla_get_u8(tb[IFLA_CARRIER]));
3136 if (err)
3137 goto errout;
3138 status |= DO_SETLINK_MODIFIED;
3139 }
3140
3141 if (tb[IFLA_TXQLEN]) {
3142 unsigned int value = nla_get_u32(tb[IFLA_TXQLEN]);
3143
3144 err = dev_change_tx_queue_len(dev, value);
3145 if (err)
3146 goto errout;
3147 status |= DO_SETLINK_MODIFIED;
3148 }
3149
3150 if (tb[IFLA_GSO_MAX_SIZE]) {
3151 u32 max_size = nla_get_u32(tb[IFLA_GSO_MAX_SIZE]);
3152
3153 if (dev->gso_max_size ^ max_size) {
3154 netif_set_gso_max_size(dev, max_size);
3155 status |= DO_SETLINK_MODIFIED;
3156 }
3157 }
3158
3159 if (tb[IFLA_GSO_MAX_SEGS]) {
3160 u32 max_segs = nla_get_u32(tb[IFLA_GSO_MAX_SEGS]);
3161
3162 if (dev->gso_max_segs ^ max_segs) {
3163 netif_set_gso_max_segs(dev, max_segs);
3164 status |= DO_SETLINK_MODIFIED;
3165 }
3166 }
3167
3168 if (tb[IFLA_GRO_MAX_SIZE]) {
3169 u32 gro_max_size = nla_get_u32(tb[IFLA_GRO_MAX_SIZE]);
3170
3171 if (dev->gro_max_size ^ gro_max_size) {
3172 netif_set_gro_max_size(dev, gro_max_size);
3173 status |= DO_SETLINK_MODIFIED;
3174 }
3175 }
3176
3177 if (tb[IFLA_GSO_IPV4_MAX_SIZE]) {
3178 u32 max_size = nla_get_u32(tb[IFLA_GSO_IPV4_MAX_SIZE]);
3179
3180 if (dev->gso_ipv4_max_size ^ max_size) {
3181 netif_set_gso_ipv4_max_size(dev, max_size);
3182 status |= DO_SETLINK_MODIFIED;
3183 }
3184 }
3185
3186 if (tb[IFLA_GRO_IPV4_MAX_SIZE]) {
3187 u32 gro_max_size = nla_get_u32(tb[IFLA_GRO_IPV4_MAX_SIZE]);
3188
3189 if (dev->gro_ipv4_max_size ^ gro_max_size) {
3190 netif_set_gro_ipv4_max_size(dev, gro_max_size);
3191 status |= DO_SETLINK_MODIFIED;
3192 }
3193 }
3194
3195 if (tb[IFLA_OPERSTATE])
3196 set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE]));
3197
3198 if (tb[IFLA_LINKMODE]) {
3199 unsigned char value = nla_get_u8(tb[IFLA_LINKMODE]);
3200
3201 if (dev->link_mode ^ value)
3202 status |= DO_SETLINK_NOTIFY;
3203 WRITE_ONCE(dev->link_mode, value);
3204 }
3205
3206 if (tb[IFLA_VFINFO_LIST]) {
3207 struct nlattr *vfinfo[IFLA_VF_MAX + 1];
3208 struct nlattr *attr;
3209 int rem;
3210
3211 nla_for_each_nested(attr, tb[IFLA_VFINFO_LIST], rem) {
3212 if (nla_type(attr) != IFLA_VF_INFO ||
3213 nla_len(attr) < NLA_HDRLEN) {
3214 err = -EINVAL;
3215 goto errout;
3216 }
3217 err = nla_parse_nested_deprecated(vfinfo, IFLA_VF_MAX,
3218 attr,
3219 ifla_vf_policy,
3220 NULL);
3221 if (err < 0)
3222 goto errout;
3223 err = do_setvfinfo(dev, vfinfo);
3224 if (err < 0)
3225 goto errout;
3226 status |= DO_SETLINK_NOTIFY;
3227 }
3228 }
3229 err = 0;
3230
3231 if (tb[IFLA_VF_PORTS]) {
3232 struct nlattr *port[IFLA_PORT_MAX+1];
3233 struct nlattr *attr;
3234 int vf;
3235 int rem;
3236
3237 err = -EOPNOTSUPP;
3238 if (!ops->ndo_set_vf_port)
3239 goto errout;
3240
3241 nla_for_each_nested(attr, tb[IFLA_VF_PORTS], rem) {
3242 if (nla_type(attr) != IFLA_VF_PORT ||
3243 nla_len(attr) < NLA_HDRLEN) {
3244 err = -EINVAL;
3245 goto errout;
3246 }
3247 err = nla_parse_nested_deprecated(port, IFLA_PORT_MAX,
3248 attr,
3249 ifla_port_policy,
3250 NULL);
3251 if (err < 0)
3252 goto errout;
3253 if (!port[IFLA_PORT_VF]) {
3254 err = -EOPNOTSUPP;
3255 goto errout;
3256 }
3257 vf = nla_get_u32(port[IFLA_PORT_VF]);
3258 err = ops->ndo_set_vf_port(dev, vf, port);
3259 if (err < 0)
3260 goto errout;
3261 status |= DO_SETLINK_NOTIFY;
3262 }
3263 }
3264 err = 0;
3265
3266 if (tb[IFLA_PORT_SELF]) {
3267 struct nlattr *port[IFLA_PORT_MAX+1];
3268
3269 err = nla_parse_nested_deprecated(port, IFLA_PORT_MAX,
3270 tb[IFLA_PORT_SELF],
3271 ifla_port_policy, NULL);
3272 if (err < 0)
3273 goto errout;
3274
3275 err = -EOPNOTSUPP;
3276 if (ops->ndo_set_vf_port)
3277 err = ops->ndo_set_vf_port(dev, PORT_SELF_VF, port);
3278 if (err < 0)
3279 goto errout;
3280 status |= DO_SETLINK_NOTIFY;
3281 }
3282
3283 if (tb[IFLA_AF_SPEC]) {
3284 struct nlattr *af;
3285 int rem;
3286
3287 nla_for_each_nested(af, tb[IFLA_AF_SPEC], rem) {
3288 struct rtnl_af_ops *af_ops;
3289 int af_ops_srcu_index;
3290
3291 af_ops = rtnl_af_lookup(nla_type(af), &af_ops_srcu_index);
3292 if (!af_ops) {
3293 err = -EAFNOSUPPORT;
3294 goto errout;
3295 }
3296
3297 err = af_ops->set_link_af(dev, af, extack);
3298 rtnl_af_put(af_ops, af_ops_srcu_index);
3299
3300 if (err < 0)
3301 goto errout;
3302
3303 status |= DO_SETLINK_NOTIFY;
3304 }
3305 }
3306 err = 0;
3307
3308 if (tb[IFLA_PROTO_DOWN] || tb[IFLA_PROTO_DOWN_REASON]) {
3309 err = do_set_proto_down(dev, tb[IFLA_PROTO_DOWN],
3310 tb[IFLA_PROTO_DOWN_REASON], extack);
3311 if (err)
3312 goto errout;
3313 status |= DO_SETLINK_NOTIFY;
3314 }
3315
3316 if (tb[IFLA_XDP]) {
3317 struct nlattr *xdp[IFLA_XDP_MAX + 1];
3318 u32 xdp_flags = 0;
3319
3320 err = nla_parse_nested_deprecated(xdp, IFLA_XDP_MAX,
3321 tb[IFLA_XDP],
3322 ifla_xdp_policy, NULL);
3323 if (err < 0)
3324 goto errout;
3325
3326 if (xdp[IFLA_XDP_ATTACHED] || xdp[IFLA_XDP_PROG_ID]) {
3327 err = -EINVAL;
3328 goto errout;
3329 }
3330
3331 if (xdp[IFLA_XDP_FLAGS]) {
3332 xdp_flags = nla_get_u32(xdp[IFLA_XDP_FLAGS]);
3333 if (xdp_flags & ~XDP_FLAGS_MASK) {
3334 err = -EINVAL;
3335 goto errout;
3336 }
3337 if (hweight32(xdp_flags & XDP_FLAGS_MODES) > 1) {
3338 err = -EINVAL;
3339 goto errout;
3340 }
3341 }
3342
3343 if (xdp[IFLA_XDP_FD]) {
3344 int expected_fd = -1;
3345
3346 if (xdp_flags & XDP_FLAGS_REPLACE) {
3347 if (!xdp[IFLA_XDP_EXPECTED_FD]) {
3348 err = -EINVAL;
3349 goto errout;
3350 }
3351 expected_fd =
3352 nla_get_s32(xdp[IFLA_XDP_EXPECTED_FD]);
3353 }
3354
3355 err = dev_change_xdp_fd(dev, extack,
3356 nla_get_s32(xdp[IFLA_XDP_FD]),
3357 expected_fd,
3358 xdp_flags);
3359 if (err)
3360 goto errout;
3361 status |= DO_SETLINK_NOTIFY;
3362 }
3363 }
3364
3365 errout:
3366 if (status & DO_SETLINK_MODIFIED) {
3367 if ((status & DO_SETLINK_NOTIFY) == DO_SETLINK_NOTIFY)
3368 netdev_state_change(dev);
3369
3370 if (err < 0)
3371 net_warn_ratelimited("A link change request failed with some changes committed already. Interface %s may have been left with an inconsistent configuration, please check.\n",
3372 dev->name);
3373 }
3374
3375 return err;
3376 }
3377
rtnl_dev_get(struct net * net,struct nlattr * tb[])3378 static struct net_device *rtnl_dev_get(struct net *net,
3379 struct nlattr *tb[])
3380 {
3381 char ifname[ALTIFNAMSIZ];
3382
3383 if (tb[IFLA_IFNAME])
3384 nla_strscpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
3385 else if (tb[IFLA_ALT_IFNAME])
3386 nla_strscpy(ifname, tb[IFLA_ALT_IFNAME], ALTIFNAMSIZ);
3387 else
3388 return NULL;
3389
3390 return __dev_get_by_name(net, ifname);
3391 }
3392
rtnl_setlink(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)3393 static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh,
3394 struct netlink_ext_ack *extack)
3395 {
3396 struct ifinfomsg *ifm = nlmsg_data(nlh);
3397 struct net *net = sock_net(skb->sk);
3398 struct nlattr *tb[IFLA_MAX+1];
3399 struct net_device *dev = NULL;
3400 struct rtnl_nets rtnl_nets;
3401 struct net *tgt_net;
3402 int err;
3403
3404 err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFLA_MAX,
3405 ifla_policy, extack);
3406 if (err < 0)
3407 goto errout;
3408
3409 err = rtnl_ensure_unique_netns(tb, extack, false);
3410 if (err < 0)
3411 goto errout;
3412
3413 tgt_net = rtnl_link_get_net_capable(skb, net, tb, CAP_NET_ADMIN);
3414 if (IS_ERR(tgt_net)) {
3415 err = PTR_ERR(tgt_net);
3416 goto errout;
3417 }
3418
3419 rtnl_nets_init(&rtnl_nets);
3420 rtnl_nets_add(&rtnl_nets, get_net(net));
3421 rtnl_nets_add(&rtnl_nets, tgt_net);
3422
3423 rtnl_nets_lock(&rtnl_nets);
3424
3425 if (ifm->ifi_index > 0)
3426 dev = __dev_get_by_index(net, ifm->ifi_index);
3427 else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME])
3428 dev = rtnl_dev_get(net, tb);
3429 else
3430 err = -EINVAL;
3431
3432 if (dev)
3433 err = do_setlink(skb, dev, tgt_net, ifm, extack, tb, 0);
3434 else if (!err)
3435 err = -ENODEV;
3436
3437 rtnl_nets_unlock(&rtnl_nets);
3438 rtnl_nets_destroy(&rtnl_nets);
3439 errout:
3440 return err;
3441 }
3442
rtnl_group_dellink(const struct net * net,int group)3443 static int rtnl_group_dellink(const struct net *net, int group)
3444 {
3445 struct net_device *dev, *aux;
3446 LIST_HEAD(list_kill);
3447 bool found = false;
3448
3449 if (!group)
3450 return -EPERM;
3451
3452 for_each_netdev(net, dev) {
3453 if (dev->group == group) {
3454 const struct rtnl_link_ops *ops;
3455
3456 found = true;
3457 ops = dev->rtnl_link_ops;
3458 if (!ops || !ops->dellink)
3459 return -EOPNOTSUPP;
3460 }
3461 }
3462
3463 if (!found)
3464 return -ENODEV;
3465
3466 for_each_netdev_safe(net, dev, aux) {
3467 if (dev->group == group) {
3468 const struct rtnl_link_ops *ops;
3469
3470 ops = dev->rtnl_link_ops;
3471 ops->dellink(dev, &list_kill);
3472 }
3473 }
3474 unregister_netdevice_many(&list_kill);
3475
3476 return 0;
3477 }
3478
rtnl_delete_link(struct net_device * dev,u32 portid,const struct nlmsghdr * nlh)3479 int rtnl_delete_link(struct net_device *dev, u32 portid, const struct nlmsghdr *nlh)
3480 {
3481 const struct rtnl_link_ops *ops;
3482 LIST_HEAD(list_kill);
3483
3484 ops = dev->rtnl_link_ops;
3485 if (!ops || !ops->dellink)
3486 return -EOPNOTSUPP;
3487
3488 ops->dellink(dev, &list_kill);
3489 unregister_netdevice_many_notify(&list_kill, portid, nlh);
3490
3491 return 0;
3492 }
3493 EXPORT_SYMBOL_GPL(rtnl_delete_link);
3494
rtnl_dellink(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)3495 static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
3496 struct netlink_ext_ack *extack)
3497 {
3498 struct ifinfomsg *ifm = nlmsg_data(nlh);
3499 struct net *net = sock_net(skb->sk);
3500 u32 portid = NETLINK_CB(skb).portid;
3501 struct nlattr *tb[IFLA_MAX+1];
3502 struct net_device *dev = NULL;
3503 struct net *tgt_net = net;
3504 int netnsid = -1;
3505 int err;
3506
3507 err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFLA_MAX,
3508 ifla_policy, extack);
3509 if (err < 0)
3510 return err;
3511
3512 err = rtnl_ensure_unique_netns(tb, extack, true);
3513 if (err < 0)
3514 return err;
3515
3516 if (tb[IFLA_TARGET_NETNSID]) {
3517 netnsid = nla_get_s32(tb[IFLA_TARGET_NETNSID]);
3518 tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid);
3519 if (IS_ERR(tgt_net))
3520 return PTR_ERR(tgt_net);
3521 }
3522
3523 rtnl_net_lock(tgt_net);
3524
3525 if (ifm->ifi_index > 0)
3526 dev = __dev_get_by_index(tgt_net, ifm->ifi_index);
3527 else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME])
3528 dev = rtnl_dev_get(tgt_net, tb);
3529
3530 if (dev)
3531 err = rtnl_delete_link(dev, portid, nlh);
3532 else if (ifm->ifi_index > 0 || tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME])
3533 err = -ENODEV;
3534 else if (tb[IFLA_GROUP])
3535 err = rtnl_group_dellink(tgt_net, nla_get_u32(tb[IFLA_GROUP]));
3536 else
3537 err = -EINVAL;
3538
3539 rtnl_net_unlock(tgt_net);
3540
3541 if (netnsid >= 0)
3542 put_net(tgt_net);
3543
3544 return err;
3545 }
3546
rtnl_configure_link(struct net_device * dev,const struct ifinfomsg * ifm,u32 portid,const struct nlmsghdr * nlh)3547 int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm,
3548 u32 portid, const struct nlmsghdr *nlh)
3549 {
3550 unsigned int old_flags;
3551 int err;
3552
3553 old_flags = dev->flags;
3554 if (ifm && (ifm->ifi_flags || ifm->ifi_change)) {
3555 err = __dev_change_flags(dev, rtnl_dev_combine_flags(dev, ifm),
3556 NULL);
3557 if (err < 0)
3558 return err;
3559 }
3560
3561 if (dev->rtnl_link_state == RTNL_LINK_INITIALIZED) {
3562 __dev_notify_flags(dev, old_flags, (old_flags ^ dev->flags), portid, nlh);
3563 } else {
3564 dev->rtnl_link_state = RTNL_LINK_INITIALIZED;
3565 __dev_notify_flags(dev, old_flags, ~0U, portid, nlh);
3566 }
3567 return 0;
3568 }
3569 EXPORT_SYMBOL(rtnl_configure_link);
3570
rtnl_create_link(struct net * net,const char * ifname,unsigned char name_assign_type,const struct rtnl_link_ops * ops,struct nlattr * tb[],struct netlink_ext_ack * extack)3571 struct net_device *rtnl_create_link(struct net *net, const char *ifname,
3572 unsigned char name_assign_type,
3573 const struct rtnl_link_ops *ops,
3574 struct nlattr *tb[],
3575 struct netlink_ext_ack *extack)
3576 {
3577 struct net_device *dev;
3578 unsigned int num_tx_queues = 1;
3579 unsigned int num_rx_queues = 1;
3580 int err;
3581
3582 if (tb[IFLA_NUM_TX_QUEUES])
3583 num_tx_queues = nla_get_u32(tb[IFLA_NUM_TX_QUEUES]);
3584 else if (ops->get_num_tx_queues)
3585 num_tx_queues = ops->get_num_tx_queues();
3586
3587 if (tb[IFLA_NUM_RX_QUEUES])
3588 num_rx_queues = nla_get_u32(tb[IFLA_NUM_RX_QUEUES]);
3589 else if (ops->get_num_rx_queues)
3590 num_rx_queues = ops->get_num_rx_queues();
3591
3592 if (num_tx_queues < 1 || num_tx_queues > 4096) {
3593 NL_SET_ERR_MSG(extack, "Invalid number of transmit queues");
3594 return ERR_PTR(-EINVAL);
3595 }
3596
3597 if (num_rx_queues < 1 || num_rx_queues > 4096) {
3598 NL_SET_ERR_MSG(extack, "Invalid number of receive queues");
3599 return ERR_PTR(-EINVAL);
3600 }
3601
3602 if (ops->alloc) {
3603 dev = ops->alloc(tb, ifname, name_assign_type,
3604 num_tx_queues, num_rx_queues);
3605 if (IS_ERR(dev))
3606 return dev;
3607 } else {
3608 dev = alloc_netdev_mqs(ops->priv_size, ifname,
3609 name_assign_type, ops->setup,
3610 num_tx_queues, num_rx_queues);
3611 }
3612
3613 if (!dev)
3614 return ERR_PTR(-ENOMEM);
3615
3616 err = validate_linkmsg(dev, tb, extack);
3617 if (err < 0) {
3618 free_netdev(dev);
3619 return ERR_PTR(err);
3620 }
3621
3622 dev_net_set(dev, net);
3623 dev->rtnl_link_ops = ops;
3624 dev->rtnl_link_state = RTNL_LINK_INITIALIZING;
3625
3626 if (tb[IFLA_MTU]) {
3627 u32 mtu = nla_get_u32(tb[IFLA_MTU]);
3628
3629 err = dev_validate_mtu(dev, mtu, extack);
3630 if (err) {
3631 free_netdev(dev);
3632 return ERR_PTR(err);
3633 }
3634 dev->mtu = mtu;
3635 }
3636 if (tb[IFLA_ADDRESS]) {
3637 __dev_addr_set(dev, nla_data(tb[IFLA_ADDRESS]),
3638 nla_len(tb[IFLA_ADDRESS]));
3639 dev->addr_assign_type = NET_ADDR_SET;
3640 }
3641 if (tb[IFLA_BROADCAST])
3642 memcpy(dev->broadcast, nla_data(tb[IFLA_BROADCAST]),
3643 nla_len(tb[IFLA_BROADCAST]));
3644 if (tb[IFLA_TXQLEN])
3645 dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]);
3646 if (tb[IFLA_OPERSTATE])
3647 set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE]));
3648 if (tb[IFLA_LINKMODE])
3649 dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]);
3650 if (tb[IFLA_GROUP])
3651 dev_set_group(dev, nla_get_u32(tb[IFLA_GROUP]));
3652 if (tb[IFLA_GSO_MAX_SIZE])
3653 netif_set_gso_max_size(dev, nla_get_u32(tb[IFLA_GSO_MAX_SIZE]));
3654 if (tb[IFLA_GSO_MAX_SEGS])
3655 netif_set_gso_max_segs(dev, nla_get_u32(tb[IFLA_GSO_MAX_SEGS]));
3656 if (tb[IFLA_GRO_MAX_SIZE])
3657 netif_set_gro_max_size(dev, nla_get_u32(tb[IFLA_GRO_MAX_SIZE]));
3658 if (tb[IFLA_GSO_IPV4_MAX_SIZE])
3659 netif_set_gso_ipv4_max_size(dev, nla_get_u32(tb[IFLA_GSO_IPV4_MAX_SIZE]));
3660 if (tb[IFLA_GRO_IPV4_MAX_SIZE])
3661 netif_set_gro_ipv4_max_size(dev, nla_get_u32(tb[IFLA_GRO_IPV4_MAX_SIZE]));
3662
3663 return dev;
3664 }
3665 EXPORT_SYMBOL(rtnl_create_link);
3666
3667 struct rtnl_newlink_tbs {
3668 struct nlattr *tb[IFLA_MAX + 1];
3669 struct nlattr *linkinfo[IFLA_INFO_MAX + 1];
3670 struct nlattr *attr[RTNL_MAX_TYPE + 1];
3671 struct nlattr *slave_attr[RTNL_SLAVE_MAX_TYPE + 1];
3672 };
3673
rtnl_changelink(const struct sk_buff * skb,struct nlmsghdr * nlh,const struct rtnl_link_ops * ops,struct net_device * dev,struct net * tgt_net,struct rtnl_newlink_tbs * tbs,struct nlattr ** data,struct netlink_ext_ack * extack)3674 static int rtnl_changelink(const struct sk_buff *skb, struct nlmsghdr *nlh,
3675 const struct rtnl_link_ops *ops,
3676 struct net_device *dev, struct net *tgt_net,
3677 struct rtnl_newlink_tbs *tbs,
3678 struct nlattr **data,
3679 struct netlink_ext_ack *extack)
3680 {
3681 struct nlattr ** const linkinfo = tbs->linkinfo;
3682 struct nlattr ** const tb = tbs->tb;
3683 int status = 0;
3684 int err;
3685
3686 if (nlh->nlmsg_flags & NLM_F_EXCL)
3687 return -EEXIST;
3688
3689 if (nlh->nlmsg_flags & NLM_F_REPLACE)
3690 return -EOPNOTSUPP;
3691
3692 if (linkinfo[IFLA_INFO_DATA]) {
3693 if (!ops || ops != dev->rtnl_link_ops || !ops->changelink)
3694 return -EOPNOTSUPP;
3695
3696 err = ops->changelink(dev, tb, data, extack);
3697 if (err < 0)
3698 return err;
3699
3700 status |= DO_SETLINK_NOTIFY;
3701 }
3702
3703 if (linkinfo[IFLA_INFO_SLAVE_DATA]) {
3704 const struct rtnl_link_ops *m_ops = NULL;
3705 struct nlattr **slave_data = NULL;
3706 struct net_device *master_dev;
3707
3708 master_dev = netdev_master_upper_dev_get(dev);
3709 if (master_dev)
3710 m_ops = master_dev->rtnl_link_ops;
3711
3712 if (!m_ops || !m_ops->slave_changelink)
3713 return -EOPNOTSUPP;
3714
3715 if (m_ops->slave_maxtype > RTNL_SLAVE_MAX_TYPE)
3716 return -EINVAL;
3717
3718 if (m_ops->slave_maxtype) {
3719 err = nla_parse_nested_deprecated(tbs->slave_attr,
3720 m_ops->slave_maxtype,
3721 linkinfo[IFLA_INFO_SLAVE_DATA],
3722 m_ops->slave_policy, extack);
3723 if (err < 0)
3724 return err;
3725
3726 slave_data = tbs->slave_attr;
3727 }
3728
3729 err = m_ops->slave_changelink(master_dev, dev, tb, slave_data, extack);
3730 if (err < 0)
3731 return err;
3732
3733 status |= DO_SETLINK_NOTIFY;
3734 }
3735
3736 return do_setlink(skb, dev, tgt_net, nlmsg_data(nlh), extack, tb, status);
3737 }
3738
rtnl_group_changelink(const struct sk_buff * skb,struct net * net,struct net * tgt_net,int group,struct ifinfomsg * ifm,struct netlink_ext_ack * extack,struct nlattr ** tb)3739 static int rtnl_group_changelink(const struct sk_buff *skb,
3740 struct net *net, struct net *tgt_net,
3741 int group, struct ifinfomsg *ifm,
3742 struct netlink_ext_ack *extack,
3743 struct nlattr **tb)
3744 {
3745 struct net_device *dev, *aux;
3746 int err;
3747
3748 for_each_netdev_safe(net, dev, aux) {
3749 if (dev->group == group) {
3750 err = do_setlink(skb, dev, tgt_net, ifm, extack, tb, 0);
3751 if (err < 0)
3752 return err;
3753 }
3754 }
3755
3756 return 0;
3757 }
3758
rtnl_newlink_create(struct sk_buff * skb,struct ifinfomsg * ifm,const struct rtnl_link_ops * ops,struct net * tgt_net,struct net * link_net,struct net * peer_net,const struct nlmsghdr * nlh,struct nlattr ** tb,struct nlattr ** data,struct netlink_ext_ack * extack)3759 static int rtnl_newlink_create(struct sk_buff *skb, struct ifinfomsg *ifm,
3760 const struct rtnl_link_ops *ops,
3761 struct net *tgt_net, struct net *link_net,
3762 struct net *peer_net,
3763 const struct nlmsghdr *nlh,
3764 struct nlattr **tb, struct nlattr **data,
3765 struct netlink_ext_ack *extack)
3766 {
3767 unsigned char name_assign_type = NET_NAME_USER;
3768 struct net *net = sock_net(skb->sk);
3769 u32 portid = NETLINK_CB(skb).portid;
3770 struct net_device *dev;
3771 char ifname[IFNAMSIZ];
3772 int err;
3773
3774 if (!ops->alloc && !ops->setup)
3775 return -EOPNOTSUPP;
3776
3777 if (tb[IFLA_IFNAME]) {
3778 nla_strscpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
3779 } else {
3780 snprintf(ifname, IFNAMSIZ, "%s%%d", ops->kind);
3781 name_assign_type = NET_NAME_ENUM;
3782 }
3783
3784 dev = rtnl_create_link(link_net ? : tgt_net, ifname,
3785 name_assign_type, ops, tb, extack);
3786 if (IS_ERR(dev)) {
3787 err = PTR_ERR(dev);
3788 goto out;
3789 }
3790
3791 dev->ifindex = ifm->ifi_index;
3792
3793 if (link_net)
3794 net = link_net;
3795 if (peer_net)
3796 net = peer_net;
3797
3798 if (ops->newlink)
3799 err = ops->newlink(net, dev, tb, data, extack);
3800 else
3801 err = register_netdevice(dev);
3802 if (err < 0) {
3803 free_netdev(dev);
3804 goto out;
3805 }
3806
3807 err = rtnl_configure_link(dev, ifm, portid, nlh);
3808 if (err < 0)
3809 goto out_unregister;
3810 if (link_net) {
3811 err = dev_change_net_namespace(dev, tgt_net, ifname);
3812 if (err < 0)
3813 goto out_unregister;
3814 }
3815 if (tb[IFLA_MASTER]) {
3816 err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]), extack);
3817 if (err)
3818 goto out_unregister;
3819 }
3820 out:
3821 return err;
3822 out_unregister:
3823 if (ops->newlink) {
3824 LIST_HEAD(list_kill);
3825
3826 ops->dellink(dev, &list_kill);
3827 unregister_netdevice_many(&list_kill);
3828 } else {
3829 unregister_netdevice(dev);
3830 }
3831 goto out;
3832 }
3833
rtnl_get_peer_net(const struct rtnl_link_ops * ops,struct nlattr * tbp[],struct nlattr * data[],struct netlink_ext_ack * extack)3834 static struct net *rtnl_get_peer_net(const struct rtnl_link_ops *ops,
3835 struct nlattr *tbp[],
3836 struct nlattr *data[],
3837 struct netlink_ext_ack *extack)
3838 {
3839 struct nlattr *tb[IFLA_MAX + 1];
3840 int err;
3841
3842 if (!data || !data[ops->peer_type])
3843 return rtnl_link_get_net_ifla(tbp);
3844
3845 err = rtnl_nla_parse_ifinfomsg(tb, data[ops->peer_type], extack);
3846 if (err < 0)
3847 return ERR_PTR(err);
3848
3849 if (ops->validate) {
3850 err = ops->validate(tb, NULL, extack);
3851 if (err < 0)
3852 return ERR_PTR(err);
3853 }
3854
3855 return rtnl_link_get_net_ifla(tb);
3856 }
3857
__rtnl_newlink(struct sk_buff * skb,struct nlmsghdr * nlh,const struct rtnl_link_ops * ops,struct net * tgt_net,struct net * link_net,struct net * peer_net,struct rtnl_newlink_tbs * tbs,struct nlattr ** data,struct netlink_ext_ack * extack)3858 static int __rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
3859 const struct rtnl_link_ops *ops,
3860 struct net *tgt_net, struct net *link_net,
3861 struct net *peer_net,
3862 struct rtnl_newlink_tbs *tbs,
3863 struct nlattr **data,
3864 struct netlink_ext_ack *extack)
3865 {
3866 struct nlattr ** const tb = tbs->tb;
3867 struct net *net = sock_net(skb->sk);
3868 struct net_device *dev;
3869 struct ifinfomsg *ifm;
3870 bool link_specified;
3871
3872 ifm = nlmsg_data(nlh);
3873 if (ifm->ifi_index > 0) {
3874 link_specified = true;
3875 dev = __dev_get_by_index(net, ifm->ifi_index);
3876 } else if (ifm->ifi_index < 0) {
3877 NL_SET_ERR_MSG(extack, "ifindex can't be negative");
3878 return -EINVAL;
3879 } else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME]) {
3880 link_specified = true;
3881 dev = rtnl_dev_get(net, tb);
3882 } else {
3883 link_specified = false;
3884 dev = NULL;
3885 }
3886
3887 if (dev)
3888 return rtnl_changelink(skb, nlh, ops, dev, tgt_net, tbs, data, extack);
3889
3890 if (!(nlh->nlmsg_flags & NLM_F_CREATE)) {
3891 /* No dev found and NLM_F_CREATE not set. Requested dev does not exist,
3892 * or it's for a group
3893 */
3894 if (link_specified || !tb[IFLA_GROUP])
3895 return -ENODEV;
3896
3897 return rtnl_group_changelink(skb, net, tgt_net,
3898 nla_get_u32(tb[IFLA_GROUP]),
3899 ifm, extack, tb);
3900 }
3901
3902 if (tb[IFLA_MAP] || tb[IFLA_PROTINFO])
3903 return -EOPNOTSUPP;
3904
3905 if (!ops) {
3906 NL_SET_ERR_MSG(extack, "Unknown device type");
3907 return -EOPNOTSUPP;
3908 }
3909
3910 return rtnl_newlink_create(skb, ifm, ops, tgt_net, link_net, peer_net, nlh,
3911 tb, data, extack);
3912 }
3913
rtnl_newlink(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)3914 static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
3915 struct netlink_ext_ack *extack)
3916 {
3917 struct net *tgt_net, *link_net = NULL, *peer_net = NULL;
3918 struct nlattr **tb, **linkinfo, **data = NULL;
3919 struct rtnl_link_ops *ops = NULL;
3920 struct rtnl_newlink_tbs *tbs;
3921 struct rtnl_nets rtnl_nets;
3922 int ops_srcu_index;
3923 int ret;
3924
3925 tbs = kmalloc(sizeof(*tbs), GFP_KERNEL);
3926 if (!tbs)
3927 return -ENOMEM;
3928
3929 tb = tbs->tb;
3930 ret = nlmsg_parse_deprecated(nlh, sizeof(struct ifinfomsg), tb,
3931 IFLA_MAX, ifla_policy, extack);
3932 if (ret < 0)
3933 goto free;
3934
3935 ret = rtnl_ensure_unique_netns(tb, extack, false);
3936 if (ret < 0)
3937 goto free;
3938
3939 linkinfo = tbs->linkinfo;
3940 if (tb[IFLA_LINKINFO]) {
3941 ret = nla_parse_nested_deprecated(linkinfo, IFLA_INFO_MAX,
3942 tb[IFLA_LINKINFO],
3943 ifla_info_policy, NULL);
3944 if (ret < 0)
3945 goto free;
3946 } else {
3947 memset(linkinfo, 0, sizeof(tbs->linkinfo));
3948 }
3949
3950 if (linkinfo[IFLA_INFO_KIND]) {
3951 char kind[MODULE_NAME_LEN];
3952
3953 nla_strscpy(kind, linkinfo[IFLA_INFO_KIND], sizeof(kind));
3954 ops = rtnl_link_ops_get(kind, &ops_srcu_index);
3955 #ifdef CONFIG_MODULES
3956 if (!ops) {
3957 request_module("rtnl-link-%s", kind);
3958 ops = rtnl_link_ops_get(kind, &ops_srcu_index);
3959 }
3960 #endif
3961 }
3962
3963 rtnl_nets_init(&rtnl_nets);
3964
3965 if (ops) {
3966 if (ops->maxtype > RTNL_MAX_TYPE) {
3967 ret = -EINVAL;
3968 goto put_ops;
3969 }
3970
3971 if (ops->maxtype && linkinfo[IFLA_INFO_DATA]) {
3972 ret = nla_parse_nested_deprecated(tbs->attr, ops->maxtype,
3973 linkinfo[IFLA_INFO_DATA],
3974 ops->policy, extack);
3975 if (ret < 0)
3976 goto put_ops;
3977
3978 data = tbs->attr;
3979 }
3980
3981 if (ops->validate) {
3982 ret = ops->validate(tb, data, extack);
3983 if (ret < 0)
3984 goto put_ops;
3985 }
3986
3987 if (ops->peer_type) {
3988 peer_net = rtnl_get_peer_net(ops, tb, data, extack);
3989 if (IS_ERR(peer_net)) {
3990 ret = PTR_ERR(peer_net);
3991 goto put_ops;
3992 }
3993 if (peer_net)
3994 rtnl_nets_add(&rtnl_nets, peer_net);
3995 }
3996 }
3997
3998 tgt_net = rtnl_link_get_net_capable(skb, sock_net(skb->sk), tb, CAP_NET_ADMIN);
3999 if (IS_ERR(tgt_net)) {
4000 ret = PTR_ERR(tgt_net);
4001 goto put_net;
4002 }
4003
4004 rtnl_nets_add(&rtnl_nets, tgt_net);
4005
4006 if (tb[IFLA_LINK_NETNSID]) {
4007 int id = nla_get_s32(tb[IFLA_LINK_NETNSID]);
4008
4009 link_net = get_net_ns_by_id(tgt_net, id);
4010 if (!link_net) {
4011 NL_SET_ERR_MSG(extack, "Unknown network namespace id");
4012 ret = -EINVAL;
4013 goto put_net;
4014 }
4015
4016 rtnl_nets_add(&rtnl_nets, link_net);
4017
4018 if (!netlink_ns_capable(skb, link_net->user_ns, CAP_NET_ADMIN)) {
4019 ret = -EPERM;
4020 goto put_net;
4021 }
4022 }
4023
4024 rtnl_nets_lock(&rtnl_nets);
4025 ret = __rtnl_newlink(skb, nlh, ops, tgt_net, link_net, peer_net, tbs, data, extack);
4026 rtnl_nets_unlock(&rtnl_nets);
4027
4028 put_net:
4029 rtnl_nets_destroy(&rtnl_nets);
4030 put_ops:
4031 if (ops)
4032 rtnl_link_ops_put(ops, ops_srcu_index);
4033 free:
4034 kfree(tbs);
4035 return ret;
4036 }
4037
rtnl_valid_getlink_req(struct sk_buff * skb,const struct nlmsghdr * nlh,struct nlattr ** tb,struct netlink_ext_ack * extack)4038 static int rtnl_valid_getlink_req(struct sk_buff *skb,
4039 const struct nlmsghdr *nlh,
4040 struct nlattr **tb,
4041 struct netlink_ext_ack *extack)
4042 {
4043 struct ifinfomsg *ifm;
4044 int i, err;
4045
4046 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifm))) {
4047 NL_SET_ERR_MSG(extack, "Invalid header for get link");
4048 return -EINVAL;
4049 }
4050
4051 if (!netlink_strict_get_check(skb))
4052 return nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFLA_MAX,
4053 ifla_policy, extack);
4054
4055 ifm = nlmsg_data(nlh);
4056 if (ifm->__ifi_pad || ifm->ifi_type || ifm->ifi_flags ||
4057 ifm->ifi_change) {
4058 NL_SET_ERR_MSG(extack, "Invalid values in header for get link request");
4059 return -EINVAL;
4060 }
4061
4062 err = nlmsg_parse_deprecated_strict(nlh, sizeof(*ifm), tb, IFLA_MAX,
4063 ifla_policy, extack);
4064 if (err)
4065 return err;
4066
4067 for (i = 0; i <= IFLA_MAX; i++) {
4068 if (!tb[i])
4069 continue;
4070
4071 switch (i) {
4072 case IFLA_IFNAME:
4073 case IFLA_ALT_IFNAME:
4074 case IFLA_EXT_MASK:
4075 case IFLA_TARGET_NETNSID:
4076 break;
4077 default:
4078 NL_SET_ERR_MSG(extack, "Unsupported attribute in get link request");
4079 return -EINVAL;
4080 }
4081 }
4082
4083 return 0;
4084 }
4085
rtnl_getlink(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)4086 static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr *nlh,
4087 struct netlink_ext_ack *extack)
4088 {
4089 struct net *net = sock_net(skb->sk);
4090 struct net *tgt_net = net;
4091 struct ifinfomsg *ifm;
4092 struct nlattr *tb[IFLA_MAX+1];
4093 struct net_device *dev = NULL;
4094 struct sk_buff *nskb;
4095 int netnsid = -1;
4096 int err;
4097 u32 ext_filter_mask = 0;
4098
4099 err = rtnl_valid_getlink_req(skb, nlh, tb, extack);
4100 if (err < 0)
4101 return err;
4102
4103 err = rtnl_ensure_unique_netns(tb, extack, true);
4104 if (err < 0)
4105 return err;
4106
4107 if (tb[IFLA_TARGET_NETNSID]) {
4108 netnsid = nla_get_s32(tb[IFLA_TARGET_NETNSID]);
4109 tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid);
4110 if (IS_ERR(tgt_net))
4111 return PTR_ERR(tgt_net);
4112 }
4113
4114 if (tb[IFLA_EXT_MASK])
4115 ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);
4116
4117 err = -EINVAL;
4118 ifm = nlmsg_data(nlh);
4119 if (ifm->ifi_index > 0)
4120 dev = __dev_get_by_index(tgt_net, ifm->ifi_index);
4121 else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME])
4122 dev = rtnl_dev_get(tgt_net, tb);
4123 else
4124 goto out;
4125
4126 err = -ENODEV;
4127 if (dev == NULL)
4128 goto out;
4129
4130 err = -ENOBUFS;
4131 nskb = nlmsg_new_large(if_nlmsg_size(dev, ext_filter_mask));
4132 if (nskb == NULL)
4133 goto out;
4134
4135 /* Synchronize the carrier state so we don't report a state
4136 * that we're not actually going to honour immediately; if
4137 * the driver just did a carrier off->on transition, we can
4138 * only TX if link watch work has run, but without this we'd
4139 * already report carrier on, even if it doesn't work yet.
4140 */
4141 linkwatch_sync_dev(dev);
4142
4143 err = rtnl_fill_ifinfo(nskb, dev, net,
4144 RTM_NEWLINK, NETLINK_CB(skb).portid,
4145 nlh->nlmsg_seq, 0, 0, ext_filter_mask,
4146 0, NULL, 0, netnsid, GFP_KERNEL);
4147 if (err < 0) {
4148 /* -EMSGSIZE implies BUG in if_nlmsg_size */
4149 WARN_ON(err == -EMSGSIZE);
4150 kfree_skb(nskb);
4151 } else
4152 err = rtnl_unicast(nskb, net, NETLINK_CB(skb).portid);
4153 out:
4154 if (netnsid >= 0)
4155 put_net(tgt_net);
4156
4157 return err;
4158 }
4159
rtnl_alt_ifname(int cmd,struct net_device * dev,struct nlattr * attr,bool * changed,struct netlink_ext_ack * extack)4160 static int rtnl_alt_ifname(int cmd, struct net_device *dev, struct nlattr *attr,
4161 bool *changed, struct netlink_ext_ack *extack)
4162 {
4163 char *alt_ifname;
4164 size_t size;
4165 int err;
4166
4167 err = nla_validate(attr, attr->nla_len, IFLA_MAX, ifla_policy, extack);
4168 if (err)
4169 return err;
4170
4171 if (cmd == RTM_NEWLINKPROP) {
4172 size = rtnl_prop_list_size(dev);
4173 size += nla_total_size(ALTIFNAMSIZ);
4174 if (size >= U16_MAX) {
4175 NL_SET_ERR_MSG(extack,
4176 "effective property list too long");
4177 return -EINVAL;
4178 }
4179 }
4180
4181 alt_ifname = nla_strdup(attr, GFP_KERNEL_ACCOUNT);
4182 if (!alt_ifname)
4183 return -ENOMEM;
4184
4185 if (cmd == RTM_NEWLINKPROP) {
4186 err = netdev_name_node_alt_create(dev, alt_ifname);
4187 if (!err)
4188 alt_ifname = NULL;
4189 } else if (cmd == RTM_DELLINKPROP) {
4190 err = netdev_name_node_alt_destroy(dev, alt_ifname);
4191 } else {
4192 WARN_ON_ONCE(1);
4193 err = -EINVAL;
4194 }
4195
4196 kfree(alt_ifname);
4197 if (!err)
4198 *changed = true;
4199 return err;
4200 }
4201
rtnl_linkprop(int cmd,struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)4202 static int rtnl_linkprop(int cmd, struct sk_buff *skb, struct nlmsghdr *nlh,
4203 struct netlink_ext_ack *extack)
4204 {
4205 struct net *net = sock_net(skb->sk);
4206 struct nlattr *tb[IFLA_MAX + 1];
4207 struct net_device *dev;
4208 struct ifinfomsg *ifm;
4209 bool changed = false;
4210 struct nlattr *attr;
4211 int err, rem;
4212
4213 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy, extack);
4214 if (err)
4215 return err;
4216
4217 err = rtnl_ensure_unique_netns(tb, extack, true);
4218 if (err)
4219 return err;
4220
4221 ifm = nlmsg_data(nlh);
4222 if (ifm->ifi_index > 0)
4223 dev = __dev_get_by_index(net, ifm->ifi_index);
4224 else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME])
4225 dev = rtnl_dev_get(net, tb);
4226 else
4227 return -EINVAL;
4228
4229 if (!dev)
4230 return -ENODEV;
4231
4232 if (!tb[IFLA_PROP_LIST])
4233 return 0;
4234
4235 nla_for_each_nested(attr, tb[IFLA_PROP_LIST], rem) {
4236 switch (nla_type(attr)) {
4237 case IFLA_ALT_IFNAME:
4238 err = rtnl_alt_ifname(cmd, dev, attr, &changed, extack);
4239 if (err)
4240 return err;
4241 break;
4242 }
4243 }
4244
4245 if (changed)
4246 netdev_state_change(dev);
4247 return 0;
4248 }
4249
rtnl_newlinkprop(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)4250 static int rtnl_newlinkprop(struct sk_buff *skb, struct nlmsghdr *nlh,
4251 struct netlink_ext_ack *extack)
4252 {
4253 return rtnl_linkprop(RTM_NEWLINKPROP, skb, nlh, extack);
4254 }
4255
rtnl_dellinkprop(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)4256 static int rtnl_dellinkprop(struct sk_buff *skb, struct nlmsghdr *nlh,
4257 struct netlink_ext_ack *extack)
4258 {
4259 return rtnl_linkprop(RTM_DELLINKPROP, skb, nlh, extack);
4260 }
4261
rtnl_calcit(struct sk_buff * skb,struct nlmsghdr * nlh)4262 static noinline_for_stack u32 rtnl_calcit(struct sk_buff *skb,
4263 struct nlmsghdr *nlh)
4264 {
4265 struct net *net = sock_net(skb->sk);
4266 size_t min_ifinfo_dump_size = 0;
4267 u32 ext_filter_mask = 0;
4268 struct net_device *dev;
4269 struct nlattr *nla;
4270 int hdrlen, rem;
4271
4272 /* Same kernel<->userspace interface hack as in rtnl_dump_ifinfo. */
4273 hdrlen = nlmsg_len(nlh) < sizeof(struct ifinfomsg) ?
4274 sizeof(struct rtgenmsg) : sizeof(struct ifinfomsg);
4275
4276 if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
4277 return NLMSG_GOODSIZE;
4278
4279 nla_for_each_attr_type(nla, IFLA_EXT_MASK,
4280 nlmsg_attrdata(nlh, hdrlen),
4281 nlmsg_attrlen(nlh, hdrlen), rem) {
4282 if (nla_len(nla) == sizeof(u32))
4283 ext_filter_mask = nla_get_u32(nla);
4284 }
4285
4286 if (!ext_filter_mask)
4287 return NLMSG_GOODSIZE;
4288 /*
4289 * traverse the list of net devices and compute the minimum
4290 * buffer size based upon the filter mask.
4291 */
4292 rcu_read_lock();
4293 for_each_netdev_rcu(net, dev) {
4294 min_ifinfo_dump_size = max(min_ifinfo_dump_size,
4295 if_nlmsg_size(dev, ext_filter_mask));
4296 }
4297 rcu_read_unlock();
4298
4299 return nlmsg_total_size(min_ifinfo_dump_size);
4300 }
4301
rtnl_dump_all(struct sk_buff * skb,struct netlink_callback * cb)4302 static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
4303 {
4304 int idx;
4305 int s_idx = cb->family;
4306 int type = cb->nlh->nlmsg_type - RTM_BASE;
4307 int ret = 0;
4308
4309 if (s_idx == 0)
4310 s_idx = 1;
4311
4312 for (idx = 1; idx <= RTNL_FAMILY_MAX; idx++) {
4313 struct rtnl_link __rcu **tab;
4314 struct rtnl_link *link;
4315 rtnl_dumpit_func dumpit;
4316
4317 if (idx < s_idx || idx == PF_PACKET)
4318 continue;
4319
4320 if (type < 0 || type >= RTM_NR_MSGTYPES)
4321 continue;
4322
4323 tab = rcu_dereference_rtnl(rtnl_msg_handlers[idx]);
4324 if (!tab)
4325 continue;
4326
4327 link = rcu_dereference_rtnl(tab[type]);
4328 if (!link)
4329 continue;
4330
4331 dumpit = link->dumpit;
4332 if (!dumpit)
4333 continue;
4334
4335 if (idx > s_idx) {
4336 memset(&cb->args[0], 0, sizeof(cb->args));
4337 cb->prev_seq = 0;
4338 cb->seq = 0;
4339 }
4340 ret = dumpit(skb, cb);
4341 if (ret)
4342 break;
4343 }
4344 cb->family = idx;
4345
4346 return skb->len ? : ret;
4347 }
4348
rtmsg_ifinfo_build_skb(int type,struct net_device * dev,unsigned int change,u32 event,gfp_t flags,int * new_nsid,int new_ifindex,u32 portid,const struct nlmsghdr * nlh)4349 struct sk_buff *rtmsg_ifinfo_build_skb(int type, struct net_device *dev,
4350 unsigned int change,
4351 u32 event, gfp_t flags, int *new_nsid,
4352 int new_ifindex, u32 portid,
4353 const struct nlmsghdr *nlh)
4354 {
4355 struct net *net = dev_net(dev);
4356 struct sk_buff *skb;
4357 int err = -ENOBUFS;
4358 u32 seq = 0;
4359
4360 skb = nlmsg_new(if_nlmsg_size(dev, 0), flags);
4361 if (skb == NULL)
4362 goto errout;
4363
4364 if (nlmsg_report(nlh))
4365 seq = nlmsg_seq(nlh);
4366 else
4367 portid = 0;
4368
4369 err = rtnl_fill_ifinfo(skb, dev, dev_net(dev),
4370 type, portid, seq, change, 0, 0, event,
4371 new_nsid, new_ifindex, -1, flags);
4372 if (err < 0) {
4373 /* -EMSGSIZE implies BUG in if_nlmsg_size() */
4374 WARN_ON(err == -EMSGSIZE);
4375 kfree_skb(skb);
4376 goto errout;
4377 }
4378 return skb;
4379 errout:
4380 rtnl_set_sk_err(net, RTNLGRP_LINK, err);
4381 return NULL;
4382 }
4383
rtmsg_ifinfo_send(struct sk_buff * skb,struct net_device * dev,gfp_t flags,u32 portid,const struct nlmsghdr * nlh)4384 void rtmsg_ifinfo_send(struct sk_buff *skb, struct net_device *dev, gfp_t flags,
4385 u32 portid, const struct nlmsghdr *nlh)
4386 {
4387 struct net *net = dev_net(dev);
4388
4389 rtnl_notify(skb, net, portid, RTNLGRP_LINK, nlh, flags);
4390 }
4391
rtmsg_ifinfo_event(int type,struct net_device * dev,unsigned int change,u32 event,gfp_t flags,int * new_nsid,int new_ifindex,u32 portid,const struct nlmsghdr * nlh)4392 static void rtmsg_ifinfo_event(int type, struct net_device *dev,
4393 unsigned int change, u32 event,
4394 gfp_t flags, int *new_nsid, int new_ifindex,
4395 u32 portid, const struct nlmsghdr *nlh)
4396 {
4397 struct sk_buff *skb;
4398
4399 if (dev->reg_state != NETREG_REGISTERED)
4400 return;
4401
4402 skb = rtmsg_ifinfo_build_skb(type, dev, change, event, flags, new_nsid,
4403 new_ifindex, portid, nlh);
4404 if (skb)
4405 rtmsg_ifinfo_send(skb, dev, flags, portid, nlh);
4406 }
4407
rtmsg_ifinfo(int type,struct net_device * dev,unsigned int change,gfp_t flags,u32 portid,const struct nlmsghdr * nlh)4408 void rtmsg_ifinfo(int type, struct net_device *dev, unsigned int change,
4409 gfp_t flags, u32 portid, const struct nlmsghdr *nlh)
4410 {
4411 rtmsg_ifinfo_event(type, dev, change, rtnl_get_event(0), flags,
4412 NULL, 0, portid, nlh);
4413 }
4414
rtmsg_ifinfo_newnet(int type,struct net_device * dev,unsigned int change,gfp_t flags,int * new_nsid,int new_ifindex)4415 void rtmsg_ifinfo_newnet(int type, struct net_device *dev, unsigned int change,
4416 gfp_t flags, int *new_nsid, int new_ifindex)
4417 {
4418 rtmsg_ifinfo_event(type, dev, change, rtnl_get_event(0), flags,
4419 new_nsid, new_ifindex, 0, NULL);
4420 }
4421
nlmsg_populate_fdb_fill(struct sk_buff * skb,struct net_device * dev,u8 * addr,u16 vid,u32 pid,u32 seq,int type,unsigned int flags,int nlflags,u16 ndm_state)4422 static int nlmsg_populate_fdb_fill(struct sk_buff *skb,
4423 struct net_device *dev,
4424 u8 *addr, u16 vid, u32 pid, u32 seq,
4425 int type, unsigned int flags,
4426 int nlflags, u16 ndm_state)
4427 {
4428 struct nlmsghdr *nlh;
4429 struct ndmsg *ndm;
4430
4431 nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), nlflags);
4432 if (!nlh)
4433 return -EMSGSIZE;
4434
4435 ndm = nlmsg_data(nlh);
4436 ndm->ndm_family = AF_BRIDGE;
4437 ndm->ndm_pad1 = 0;
4438 ndm->ndm_pad2 = 0;
4439 ndm->ndm_flags = flags;
4440 ndm->ndm_type = 0;
4441 ndm->ndm_ifindex = dev->ifindex;
4442 ndm->ndm_state = ndm_state;
4443
4444 if (nla_put(skb, NDA_LLADDR, dev->addr_len, addr))
4445 goto nla_put_failure;
4446 if (vid)
4447 if (nla_put(skb, NDA_VLAN, sizeof(u16), &vid))
4448 goto nla_put_failure;
4449
4450 nlmsg_end(skb, nlh);
4451 return 0;
4452
4453 nla_put_failure:
4454 nlmsg_cancel(skb, nlh);
4455 return -EMSGSIZE;
4456 }
4457
rtnl_fdb_nlmsg_size(const struct net_device * dev)4458 static inline size_t rtnl_fdb_nlmsg_size(const struct net_device *dev)
4459 {
4460 return NLMSG_ALIGN(sizeof(struct ndmsg)) +
4461 nla_total_size(dev->addr_len) + /* NDA_LLADDR */
4462 nla_total_size(sizeof(u16)) + /* NDA_VLAN */
4463 0;
4464 }
4465
rtnl_fdb_notify(struct net_device * dev,u8 * addr,u16 vid,int type,u16 ndm_state)4466 static void rtnl_fdb_notify(struct net_device *dev, u8 *addr, u16 vid, int type,
4467 u16 ndm_state)
4468 {
4469 struct net *net = dev_net(dev);
4470 struct sk_buff *skb;
4471 int err = -ENOBUFS;
4472
4473 skb = nlmsg_new(rtnl_fdb_nlmsg_size(dev), GFP_ATOMIC);
4474 if (!skb)
4475 goto errout;
4476
4477 err = nlmsg_populate_fdb_fill(skb, dev, addr, vid,
4478 0, 0, type, NTF_SELF, 0, ndm_state);
4479 if (err < 0) {
4480 kfree_skb(skb);
4481 goto errout;
4482 }
4483
4484 rtnl_notify(skb, net, 0, RTNLGRP_NEIGH, NULL, GFP_ATOMIC);
4485 return;
4486 errout:
4487 rtnl_set_sk_err(net, RTNLGRP_NEIGH, err);
4488 }
4489
4490 /*
4491 * ndo_dflt_fdb_add - default netdevice operation to add an FDB entry
4492 */
ndo_dflt_fdb_add(struct ndmsg * ndm,struct nlattr * tb[],struct net_device * dev,const unsigned char * addr,u16 vid,u16 flags)4493 int ndo_dflt_fdb_add(struct ndmsg *ndm,
4494 struct nlattr *tb[],
4495 struct net_device *dev,
4496 const unsigned char *addr, u16 vid,
4497 u16 flags)
4498 {
4499 int err = -EINVAL;
4500
4501 /* If aging addresses are supported device will need to
4502 * implement its own handler for this.
4503 */
4504 if (ndm->ndm_state && !(ndm->ndm_state & NUD_PERMANENT)) {
4505 netdev_info(dev, "default FDB implementation only supports local addresses\n");
4506 return err;
4507 }
4508
4509 if (tb[NDA_FLAGS_EXT]) {
4510 netdev_info(dev, "invalid flags given to default FDB implementation\n");
4511 return err;
4512 }
4513
4514 if (vid) {
4515 netdev_info(dev, "vlans aren't supported yet for dev_uc|mc_add()\n");
4516 return err;
4517 }
4518
4519 if (is_unicast_ether_addr(addr) || is_link_local_ether_addr(addr))
4520 err = dev_uc_add_excl(dev, addr);
4521 else if (is_multicast_ether_addr(addr))
4522 err = dev_mc_add_excl(dev, addr);
4523
4524 /* Only return duplicate errors if NLM_F_EXCL is set */
4525 if (err == -EEXIST && !(flags & NLM_F_EXCL))
4526 err = 0;
4527
4528 return err;
4529 }
4530 EXPORT_SYMBOL(ndo_dflt_fdb_add);
4531
fdb_vid_parse(struct nlattr * vlan_attr,u16 * p_vid,struct netlink_ext_ack * extack)4532 static int fdb_vid_parse(struct nlattr *vlan_attr, u16 *p_vid,
4533 struct netlink_ext_ack *extack)
4534 {
4535 u16 vid = 0;
4536
4537 if (vlan_attr) {
4538 if (nla_len(vlan_attr) != sizeof(u16)) {
4539 NL_SET_ERR_MSG(extack, "invalid vlan attribute size");
4540 return -EINVAL;
4541 }
4542
4543 vid = nla_get_u16(vlan_attr);
4544
4545 if (!vid || vid >= VLAN_VID_MASK) {
4546 NL_SET_ERR_MSG(extack, "invalid vlan id");
4547 return -EINVAL;
4548 }
4549 }
4550 *p_vid = vid;
4551 return 0;
4552 }
4553
rtnl_fdb_add(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)4554 static int rtnl_fdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
4555 struct netlink_ext_ack *extack)
4556 {
4557 struct net *net = sock_net(skb->sk);
4558 struct ndmsg *ndm;
4559 struct nlattr *tb[NDA_MAX+1];
4560 struct net_device *dev;
4561 u8 *addr;
4562 u16 vid;
4563 int err;
4564
4565 err = nlmsg_parse_deprecated(nlh, sizeof(*ndm), tb, NDA_MAX, NULL,
4566 extack);
4567 if (err < 0)
4568 return err;
4569
4570 ndm = nlmsg_data(nlh);
4571 if (ndm->ndm_ifindex == 0) {
4572 NL_SET_ERR_MSG(extack, "invalid ifindex");
4573 return -EINVAL;
4574 }
4575
4576 dev = __dev_get_by_index(net, ndm->ndm_ifindex);
4577 if (dev == NULL) {
4578 NL_SET_ERR_MSG(extack, "unknown ifindex");
4579 return -ENODEV;
4580 }
4581
4582 if (!tb[NDA_LLADDR] || nla_len(tb[NDA_LLADDR]) != ETH_ALEN) {
4583 NL_SET_ERR_MSG(extack, "invalid address");
4584 return -EINVAL;
4585 }
4586
4587 if (dev->type != ARPHRD_ETHER) {
4588 NL_SET_ERR_MSG(extack, "FDB add only supported for Ethernet devices");
4589 return -EINVAL;
4590 }
4591
4592 addr = nla_data(tb[NDA_LLADDR]);
4593
4594 err = fdb_vid_parse(tb[NDA_VLAN], &vid, extack);
4595 if (err)
4596 return err;
4597
4598 err = -EOPNOTSUPP;
4599
4600 /* Support fdb on master device the net/bridge default case */
4601 if ((!ndm->ndm_flags || ndm->ndm_flags & NTF_MASTER) &&
4602 netif_is_bridge_port(dev)) {
4603 struct net_device *br_dev = netdev_master_upper_dev_get(dev);
4604 const struct net_device_ops *ops = br_dev->netdev_ops;
4605 bool notified = false;
4606
4607 err = ops->ndo_fdb_add(ndm, tb, dev, addr, vid,
4608 nlh->nlmsg_flags, ¬ified, extack);
4609 if (err)
4610 goto out;
4611 else
4612 ndm->ndm_flags &= ~NTF_MASTER;
4613 }
4614
4615 /* Embedded bridge, macvlan, and any other device support */
4616 if ((ndm->ndm_flags & NTF_SELF)) {
4617 bool notified = false;
4618
4619 if (dev->netdev_ops->ndo_fdb_add)
4620 err = dev->netdev_ops->ndo_fdb_add(ndm, tb, dev, addr,
4621 vid,
4622 nlh->nlmsg_flags,
4623 ¬ified, extack);
4624 else
4625 err = ndo_dflt_fdb_add(ndm, tb, dev, addr, vid,
4626 nlh->nlmsg_flags);
4627
4628 if (!err && !notified) {
4629 rtnl_fdb_notify(dev, addr, vid, RTM_NEWNEIGH,
4630 ndm->ndm_state);
4631 ndm->ndm_flags &= ~NTF_SELF;
4632 }
4633 }
4634 out:
4635 return err;
4636 }
4637
4638 /*
4639 * ndo_dflt_fdb_del - default netdevice operation to delete an FDB entry
4640 */
ndo_dflt_fdb_del(struct ndmsg * ndm,struct nlattr * tb[],struct net_device * dev,const unsigned char * addr,u16 vid)4641 int ndo_dflt_fdb_del(struct ndmsg *ndm,
4642 struct nlattr *tb[],
4643 struct net_device *dev,
4644 const unsigned char *addr, u16 vid)
4645 {
4646 int err = -EINVAL;
4647
4648 /* If aging addresses are supported device will need to
4649 * implement its own handler for this.
4650 */
4651 if (!(ndm->ndm_state & NUD_PERMANENT)) {
4652 netdev_info(dev, "default FDB implementation only supports local addresses\n");
4653 return err;
4654 }
4655
4656 if (is_unicast_ether_addr(addr) || is_link_local_ether_addr(addr))
4657 err = dev_uc_del(dev, addr);
4658 else if (is_multicast_ether_addr(addr))
4659 err = dev_mc_del(dev, addr);
4660
4661 return err;
4662 }
4663 EXPORT_SYMBOL(ndo_dflt_fdb_del);
4664
rtnl_fdb_del(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)4665 static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
4666 struct netlink_ext_ack *extack)
4667 {
4668 bool del_bulk = !!(nlh->nlmsg_flags & NLM_F_BULK);
4669 struct net *net = sock_net(skb->sk);
4670 const struct net_device_ops *ops;
4671 struct ndmsg *ndm;
4672 struct nlattr *tb[NDA_MAX+1];
4673 struct net_device *dev;
4674 __u8 *addr = NULL;
4675 int err;
4676 u16 vid;
4677
4678 if (!netlink_capable(skb, CAP_NET_ADMIN))
4679 return -EPERM;
4680
4681 if (!del_bulk) {
4682 err = nlmsg_parse_deprecated(nlh, sizeof(*ndm), tb, NDA_MAX,
4683 NULL, extack);
4684 } else {
4685 /* For bulk delete, the drivers will parse the message with
4686 * policy.
4687 */
4688 err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, NULL, extack);
4689 }
4690 if (err < 0)
4691 return err;
4692
4693 ndm = nlmsg_data(nlh);
4694 if (ndm->ndm_ifindex == 0) {
4695 NL_SET_ERR_MSG(extack, "invalid ifindex");
4696 return -EINVAL;
4697 }
4698
4699 dev = __dev_get_by_index(net, ndm->ndm_ifindex);
4700 if (dev == NULL) {
4701 NL_SET_ERR_MSG(extack, "unknown ifindex");
4702 return -ENODEV;
4703 }
4704
4705 if (!del_bulk) {
4706 if (!tb[NDA_LLADDR] || nla_len(tb[NDA_LLADDR]) != ETH_ALEN) {
4707 NL_SET_ERR_MSG(extack, "invalid address");
4708 return -EINVAL;
4709 }
4710 addr = nla_data(tb[NDA_LLADDR]);
4711
4712 err = fdb_vid_parse(tb[NDA_VLAN], &vid, extack);
4713 if (err)
4714 return err;
4715 }
4716
4717 if (dev->type != ARPHRD_ETHER) {
4718 NL_SET_ERR_MSG(extack, "FDB delete only supported for Ethernet devices");
4719 return -EINVAL;
4720 }
4721
4722 err = -EOPNOTSUPP;
4723
4724 /* Support fdb on master device the net/bridge default case */
4725 if ((!ndm->ndm_flags || ndm->ndm_flags & NTF_MASTER) &&
4726 netif_is_bridge_port(dev)) {
4727 struct net_device *br_dev = netdev_master_upper_dev_get(dev);
4728 bool notified = false;
4729
4730 ops = br_dev->netdev_ops;
4731 if (!del_bulk) {
4732 if (ops->ndo_fdb_del)
4733 err = ops->ndo_fdb_del(ndm, tb, dev, addr, vid,
4734 ¬ified, extack);
4735 } else {
4736 if (ops->ndo_fdb_del_bulk)
4737 err = ops->ndo_fdb_del_bulk(nlh, dev, extack);
4738 }
4739
4740 if (err)
4741 goto out;
4742 else
4743 ndm->ndm_flags &= ~NTF_MASTER;
4744 }
4745
4746 /* Embedded bridge, macvlan, and any other device support */
4747 if (ndm->ndm_flags & NTF_SELF) {
4748 bool notified = false;
4749
4750 ops = dev->netdev_ops;
4751 if (!del_bulk) {
4752 if (ops->ndo_fdb_del)
4753 err = ops->ndo_fdb_del(ndm, tb, dev, addr, vid,
4754 ¬ified, extack);
4755 else
4756 err = ndo_dflt_fdb_del(ndm, tb, dev, addr, vid);
4757 } else {
4758 /* in case err was cleared by NTF_MASTER call */
4759 err = -EOPNOTSUPP;
4760 if (ops->ndo_fdb_del_bulk)
4761 err = ops->ndo_fdb_del_bulk(nlh, dev, extack);
4762 }
4763
4764 if (!err) {
4765 if (!del_bulk && !notified)
4766 rtnl_fdb_notify(dev, addr, vid, RTM_DELNEIGH,
4767 ndm->ndm_state);
4768 ndm->ndm_flags &= ~NTF_SELF;
4769 }
4770 }
4771 out:
4772 return err;
4773 }
4774
nlmsg_populate_fdb(struct sk_buff * skb,struct netlink_callback * cb,struct net_device * dev,int * idx,struct netdev_hw_addr_list * list)4775 static int nlmsg_populate_fdb(struct sk_buff *skb,
4776 struct netlink_callback *cb,
4777 struct net_device *dev,
4778 int *idx,
4779 struct netdev_hw_addr_list *list)
4780 {
4781 struct ndo_fdb_dump_context *ctx = (void *)cb->ctx;
4782 struct netdev_hw_addr *ha;
4783 u32 portid, seq;
4784 int err;
4785
4786 portid = NETLINK_CB(cb->skb).portid;
4787 seq = cb->nlh->nlmsg_seq;
4788
4789 list_for_each_entry(ha, &list->list, list) {
4790 if (*idx < ctx->fdb_idx)
4791 goto skip;
4792
4793 err = nlmsg_populate_fdb_fill(skb, dev, ha->addr, 0,
4794 portid, seq,
4795 RTM_NEWNEIGH, NTF_SELF,
4796 NLM_F_MULTI, NUD_PERMANENT);
4797 if (err < 0)
4798 return err;
4799 skip:
4800 *idx += 1;
4801 }
4802 return 0;
4803 }
4804
4805 /**
4806 * ndo_dflt_fdb_dump - default netdevice operation to dump an FDB table.
4807 * @skb: socket buffer to store message in
4808 * @cb: netlink callback
4809 * @dev: netdevice
4810 * @filter_dev: ignored
4811 * @idx: the number of FDB table entries dumped is added to *@idx
4812 *
4813 * Default netdevice operation to dump the existing unicast address list.
4814 * Returns number of addresses from list put in skb.
4815 */
ndo_dflt_fdb_dump(struct sk_buff * skb,struct netlink_callback * cb,struct net_device * dev,struct net_device * filter_dev,int * idx)4816 int ndo_dflt_fdb_dump(struct sk_buff *skb,
4817 struct netlink_callback *cb,
4818 struct net_device *dev,
4819 struct net_device *filter_dev,
4820 int *idx)
4821 {
4822 int err;
4823
4824 if (dev->type != ARPHRD_ETHER)
4825 return -EINVAL;
4826
4827 netif_addr_lock_bh(dev);
4828 err = nlmsg_populate_fdb(skb, cb, dev, idx, &dev->uc);
4829 if (err)
4830 goto out;
4831 err = nlmsg_populate_fdb(skb, cb, dev, idx, &dev->mc);
4832 out:
4833 netif_addr_unlock_bh(dev);
4834 return err;
4835 }
4836 EXPORT_SYMBOL(ndo_dflt_fdb_dump);
4837
valid_fdb_dump_strict(const struct nlmsghdr * nlh,int * br_idx,int * brport_idx,struct netlink_ext_ack * extack)4838 static int valid_fdb_dump_strict(const struct nlmsghdr *nlh,
4839 int *br_idx, int *brport_idx,
4840 struct netlink_ext_ack *extack)
4841 {
4842 struct nlattr *tb[NDA_MAX + 1];
4843 struct ndmsg *ndm;
4844 int err, i;
4845
4846 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ndm))) {
4847 NL_SET_ERR_MSG(extack, "Invalid header for fdb dump request");
4848 return -EINVAL;
4849 }
4850
4851 ndm = nlmsg_data(nlh);
4852 if (ndm->ndm_pad1 || ndm->ndm_pad2 || ndm->ndm_state ||
4853 ndm->ndm_flags || ndm->ndm_type) {
4854 NL_SET_ERR_MSG(extack, "Invalid values in header for fdb dump request");
4855 return -EINVAL;
4856 }
4857
4858 err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct ndmsg), tb,
4859 NDA_MAX, NULL, extack);
4860 if (err < 0)
4861 return err;
4862
4863 *brport_idx = ndm->ndm_ifindex;
4864 for (i = 0; i <= NDA_MAX; ++i) {
4865 if (!tb[i])
4866 continue;
4867
4868 switch (i) {
4869 case NDA_IFINDEX:
4870 if (nla_len(tb[i]) != sizeof(u32)) {
4871 NL_SET_ERR_MSG(extack, "Invalid IFINDEX attribute in fdb dump request");
4872 return -EINVAL;
4873 }
4874 *brport_idx = nla_get_u32(tb[NDA_IFINDEX]);
4875 break;
4876 case NDA_MASTER:
4877 if (nla_len(tb[i]) != sizeof(u32)) {
4878 NL_SET_ERR_MSG(extack, "Invalid MASTER attribute in fdb dump request");
4879 return -EINVAL;
4880 }
4881 *br_idx = nla_get_u32(tb[NDA_MASTER]);
4882 break;
4883 default:
4884 NL_SET_ERR_MSG(extack, "Unsupported attribute in fdb dump request");
4885 return -EINVAL;
4886 }
4887 }
4888
4889 return 0;
4890 }
4891
valid_fdb_dump_legacy(const struct nlmsghdr * nlh,int * br_idx,int * brport_idx,struct netlink_ext_ack * extack)4892 static int valid_fdb_dump_legacy(const struct nlmsghdr *nlh,
4893 int *br_idx, int *brport_idx,
4894 struct netlink_ext_ack *extack)
4895 {
4896 struct nlattr *tb[IFLA_MAX+1];
4897 int err;
4898
4899 /* A hack to preserve kernel<->userspace interface.
4900 * Before Linux v4.12 this code accepted ndmsg since iproute2 v3.3.0.
4901 * However, ndmsg is shorter than ifinfomsg thus nlmsg_parse() bails.
4902 * So, check for ndmsg with an optional u32 attribute (not used here).
4903 * Fortunately these sizes don't conflict with the size of ifinfomsg
4904 * with an optional attribute.
4905 */
4906 if (nlmsg_len(nlh) != sizeof(struct ndmsg) &&
4907 (nlmsg_len(nlh) != sizeof(struct ndmsg) +
4908 nla_attr_size(sizeof(u32)))) {
4909 struct ifinfomsg *ifm;
4910
4911 err = nlmsg_parse_deprecated(nlh, sizeof(struct ifinfomsg),
4912 tb, IFLA_MAX, ifla_policy,
4913 extack);
4914 if (err < 0) {
4915 return -EINVAL;
4916 } else if (err == 0) {
4917 if (tb[IFLA_MASTER])
4918 *br_idx = nla_get_u32(tb[IFLA_MASTER]);
4919 }
4920
4921 ifm = nlmsg_data(nlh);
4922 *brport_idx = ifm->ifi_index;
4923 }
4924 return 0;
4925 }
4926
rtnl_fdb_dump(struct sk_buff * skb,struct netlink_callback * cb)4927 static int rtnl_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb)
4928 {
4929 const struct net_device_ops *ops = NULL, *cops = NULL;
4930 struct ndo_fdb_dump_context *ctx = (void *)cb->ctx;
4931 struct net_device *dev, *br_dev = NULL;
4932 struct net *net = sock_net(skb->sk);
4933 int brport_idx = 0;
4934 int br_idx = 0;
4935 int fidx = 0;
4936 int err;
4937
4938 NL_ASSERT_CTX_FITS(struct ndo_fdb_dump_context);
4939
4940 if (cb->strict_check)
4941 err = valid_fdb_dump_strict(cb->nlh, &br_idx, &brport_idx,
4942 cb->extack);
4943 else
4944 err = valid_fdb_dump_legacy(cb->nlh, &br_idx, &brport_idx,
4945 cb->extack);
4946 if (err < 0)
4947 return err;
4948
4949 if (br_idx) {
4950 br_dev = __dev_get_by_index(net, br_idx);
4951 if (!br_dev)
4952 return -ENODEV;
4953
4954 ops = br_dev->netdev_ops;
4955 }
4956
4957 for_each_netdev_dump(net, dev, ctx->ifindex) {
4958 if (brport_idx && (dev->ifindex != brport_idx))
4959 continue;
4960
4961 if (!br_idx) { /* user did not specify a specific bridge */
4962 if (netif_is_bridge_port(dev)) {
4963 br_dev = netdev_master_upper_dev_get(dev);
4964 cops = br_dev->netdev_ops;
4965 }
4966 } else {
4967 if (dev != br_dev &&
4968 !netif_is_bridge_port(dev))
4969 continue;
4970
4971 if (br_dev != netdev_master_upper_dev_get(dev) &&
4972 !netif_is_bridge_master(dev))
4973 continue;
4974 cops = ops;
4975 }
4976
4977 if (netif_is_bridge_port(dev)) {
4978 if (cops && cops->ndo_fdb_dump) {
4979 err = cops->ndo_fdb_dump(skb, cb, br_dev, dev,
4980 &fidx);
4981 if (err == -EMSGSIZE)
4982 break;
4983 }
4984 }
4985
4986 if (dev->netdev_ops->ndo_fdb_dump)
4987 err = dev->netdev_ops->ndo_fdb_dump(skb, cb, dev, NULL,
4988 &fidx);
4989 else
4990 err = ndo_dflt_fdb_dump(skb, cb, dev, NULL, &fidx);
4991 if (err == -EMSGSIZE)
4992 break;
4993
4994 cops = NULL;
4995
4996 /* reset fdb offset to 0 for rest of the interfaces */
4997 ctx->fdb_idx = 0;
4998 fidx = 0;
4999 }
5000
5001 ctx->fdb_idx = fidx;
5002
5003 return skb->len;
5004 }
5005
valid_fdb_get_strict(const struct nlmsghdr * nlh,struct nlattr ** tb,u8 * ndm_flags,int * br_idx,int * brport_idx,u8 ** addr,u16 * vid,struct netlink_ext_ack * extack)5006 static int valid_fdb_get_strict(const struct nlmsghdr *nlh,
5007 struct nlattr **tb, u8 *ndm_flags,
5008 int *br_idx, int *brport_idx, u8 **addr,
5009 u16 *vid, struct netlink_ext_ack *extack)
5010 {
5011 struct ndmsg *ndm;
5012 int err, i;
5013
5014 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ndm))) {
5015 NL_SET_ERR_MSG(extack, "Invalid header for fdb get request");
5016 return -EINVAL;
5017 }
5018
5019 ndm = nlmsg_data(nlh);
5020 if (ndm->ndm_pad1 || ndm->ndm_pad2 || ndm->ndm_state ||
5021 ndm->ndm_type) {
5022 NL_SET_ERR_MSG(extack, "Invalid values in header for fdb get request");
5023 return -EINVAL;
5024 }
5025
5026 if (ndm->ndm_flags & ~(NTF_MASTER | NTF_SELF)) {
5027 NL_SET_ERR_MSG(extack, "Invalid flags in header for fdb get request");
5028 return -EINVAL;
5029 }
5030
5031 err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct ndmsg), tb,
5032 NDA_MAX, nda_policy, extack);
5033 if (err < 0)
5034 return err;
5035
5036 *ndm_flags = ndm->ndm_flags;
5037 *brport_idx = ndm->ndm_ifindex;
5038 for (i = 0; i <= NDA_MAX; ++i) {
5039 if (!tb[i])
5040 continue;
5041
5042 switch (i) {
5043 case NDA_MASTER:
5044 *br_idx = nla_get_u32(tb[i]);
5045 break;
5046 case NDA_LLADDR:
5047 if (nla_len(tb[i]) != ETH_ALEN) {
5048 NL_SET_ERR_MSG(extack, "Invalid address in fdb get request");
5049 return -EINVAL;
5050 }
5051 *addr = nla_data(tb[i]);
5052 break;
5053 case NDA_VLAN:
5054 err = fdb_vid_parse(tb[i], vid, extack);
5055 if (err)
5056 return err;
5057 break;
5058 case NDA_VNI:
5059 break;
5060 default:
5061 NL_SET_ERR_MSG(extack, "Unsupported attribute in fdb get request");
5062 return -EINVAL;
5063 }
5064 }
5065
5066 return 0;
5067 }
5068
rtnl_fdb_get(struct sk_buff * in_skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)5069 static int rtnl_fdb_get(struct sk_buff *in_skb, struct nlmsghdr *nlh,
5070 struct netlink_ext_ack *extack)
5071 {
5072 struct net_device *dev = NULL, *br_dev = NULL;
5073 const struct net_device_ops *ops = NULL;
5074 struct net *net = sock_net(in_skb->sk);
5075 struct nlattr *tb[NDA_MAX + 1];
5076 struct sk_buff *skb;
5077 int brport_idx = 0;
5078 u8 ndm_flags = 0;
5079 int br_idx = 0;
5080 u8 *addr = NULL;
5081 u16 vid = 0;
5082 int err;
5083
5084 err = valid_fdb_get_strict(nlh, tb, &ndm_flags, &br_idx,
5085 &brport_idx, &addr, &vid, extack);
5086 if (err < 0)
5087 return err;
5088
5089 if (!addr) {
5090 NL_SET_ERR_MSG(extack, "Missing lookup address for fdb get request");
5091 return -EINVAL;
5092 }
5093
5094 if (brport_idx) {
5095 dev = __dev_get_by_index(net, brport_idx);
5096 if (!dev) {
5097 NL_SET_ERR_MSG(extack, "Unknown device ifindex");
5098 return -ENODEV;
5099 }
5100 }
5101
5102 if (br_idx) {
5103 if (dev) {
5104 NL_SET_ERR_MSG(extack, "Master and device are mutually exclusive");
5105 return -EINVAL;
5106 }
5107
5108 br_dev = __dev_get_by_index(net, br_idx);
5109 if (!br_dev) {
5110 NL_SET_ERR_MSG(extack, "Invalid master ifindex");
5111 return -EINVAL;
5112 }
5113 ops = br_dev->netdev_ops;
5114 }
5115
5116 if (dev) {
5117 if (!ndm_flags || (ndm_flags & NTF_MASTER)) {
5118 if (!netif_is_bridge_port(dev)) {
5119 NL_SET_ERR_MSG(extack, "Device is not a bridge port");
5120 return -EINVAL;
5121 }
5122 br_dev = netdev_master_upper_dev_get(dev);
5123 if (!br_dev) {
5124 NL_SET_ERR_MSG(extack, "Master of device not found");
5125 return -EINVAL;
5126 }
5127 ops = br_dev->netdev_ops;
5128 } else {
5129 if (!(ndm_flags & NTF_SELF)) {
5130 NL_SET_ERR_MSG(extack, "Missing NTF_SELF");
5131 return -EINVAL;
5132 }
5133 ops = dev->netdev_ops;
5134 }
5135 }
5136
5137 if (!br_dev && !dev) {
5138 NL_SET_ERR_MSG(extack, "No device specified");
5139 return -ENODEV;
5140 }
5141
5142 if (!ops || !ops->ndo_fdb_get) {
5143 NL_SET_ERR_MSG(extack, "Fdb get operation not supported by device");
5144 return -EOPNOTSUPP;
5145 }
5146
5147 skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
5148 if (!skb)
5149 return -ENOBUFS;
5150
5151 if (br_dev)
5152 dev = br_dev;
5153 err = ops->ndo_fdb_get(skb, tb, dev, addr, vid,
5154 NETLINK_CB(in_skb).portid,
5155 nlh->nlmsg_seq, extack);
5156 if (err)
5157 goto out;
5158
5159 return rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
5160 out:
5161 kfree_skb(skb);
5162 return err;
5163 }
5164
brport_nla_put_flag(struct sk_buff * skb,u32 flags,u32 mask,unsigned int attrnum,unsigned int flag)5165 static int brport_nla_put_flag(struct sk_buff *skb, u32 flags, u32 mask,
5166 unsigned int attrnum, unsigned int flag)
5167 {
5168 if (mask & flag)
5169 return nla_put_u8(skb, attrnum, !!(flags & flag));
5170 return 0;
5171 }
5172
ndo_dflt_bridge_getlink(struct sk_buff * skb,u32 pid,u32 seq,struct net_device * dev,u16 mode,u32 flags,u32 mask,int nlflags,u32 filter_mask,int (* vlan_fill)(struct sk_buff * skb,struct net_device * dev,u32 filter_mask))5173 int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
5174 struct net_device *dev, u16 mode,
5175 u32 flags, u32 mask, int nlflags,
5176 u32 filter_mask,
5177 int (*vlan_fill)(struct sk_buff *skb,
5178 struct net_device *dev,
5179 u32 filter_mask))
5180 {
5181 struct nlmsghdr *nlh;
5182 struct ifinfomsg *ifm;
5183 struct nlattr *br_afspec;
5184 struct nlattr *protinfo;
5185 u8 operstate = netif_running(dev) ? dev->operstate : IF_OPER_DOWN;
5186 struct net_device *br_dev = netdev_master_upper_dev_get(dev);
5187 int err = 0;
5188
5189 nlh = nlmsg_put(skb, pid, seq, RTM_NEWLINK, sizeof(*ifm), nlflags);
5190 if (nlh == NULL)
5191 return -EMSGSIZE;
5192
5193 ifm = nlmsg_data(nlh);
5194 ifm->ifi_family = AF_BRIDGE;
5195 ifm->__ifi_pad = 0;
5196 ifm->ifi_type = dev->type;
5197 ifm->ifi_index = dev->ifindex;
5198 ifm->ifi_flags = dev_get_flags(dev);
5199 ifm->ifi_change = 0;
5200
5201
5202 if (nla_put_string(skb, IFLA_IFNAME, dev->name) ||
5203 nla_put_u32(skb, IFLA_MTU, dev->mtu) ||
5204 nla_put_u8(skb, IFLA_OPERSTATE, operstate) ||
5205 (br_dev &&
5206 nla_put_u32(skb, IFLA_MASTER, br_dev->ifindex)) ||
5207 (dev->addr_len &&
5208 nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) ||
5209 (dev->ifindex != dev_get_iflink(dev) &&
5210 nla_put_u32(skb, IFLA_LINK, dev_get_iflink(dev))))
5211 goto nla_put_failure;
5212
5213 br_afspec = nla_nest_start_noflag(skb, IFLA_AF_SPEC);
5214 if (!br_afspec)
5215 goto nla_put_failure;
5216
5217 if (nla_put_u16(skb, IFLA_BRIDGE_FLAGS, BRIDGE_FLAGS_SELF)) {
5218 nla_nest_cancel(skb, br_afspec);
5219 goto nla_put_failure;
5220 }
5221
5222 if (mode != BRIDGE_MODE_UNDEF) {
5223 if (nla_put_u16(skb, IFLA_BRIDGE_MODE, mode)) {
5224 nla_nest_cancel(skb, br_afspec);
5225 goto nla_put_failure;
5226 }
5227 }
5228 if (vlan_fill) {
5229 err = vlan_fill(skb, dev, filter_mask);
5230 if (err) {
5231 nla_nest_cancel(skb, br_afspec);
5232 goto nla_put_failure;
5233 }
5234 }
5235 nla_nest_end(skb, br_afspec);
5236
5237 protinfo = nla_nest_start(skb, IFLA_PROTINFO);
5238 if (!protinfo)
5239 goto nla_put_failure;
5240
5241 if (brport_nla_put_flag(skb, flags, mask,
5242 IFLA_BRPORT_MODE, BR_HAIRPIN_MODE) ||
5243 brport_nla_put_flag(skb, flags, mask,
5244 IFLA_BRPORT_GUARD, BR_BPDU_GUARD) ||
5245 brport_nla_put_flag(skb, flags, mask,
5246 IFLA_BRPORT_FAST_LEAVE,
5247 BR_MULTICAST_FAST_LEAVE) ||
5248 brport_nla_put_flag(skb, flags, mask,
5249 IFLA_BRPORT_PROTECT, BR_ROOT_BLOCK) ||
5250 brport_nla_put_flag(skb, flags, mask,
5251 IFLA_BRPORT_LEARNING, BR_LEARNING) ||
5252 brport_nla_put_flag(skb, flags, mask,
5253 IFLA_BRPORT_LEARNING_SYNC, BR_LEARNING_SYNC) ||
5254 brport_nla_put_flag(skb, flags, mask,
5255 IFLA_BRPORT_UNICAST_FLOOD, BR_FLOOD) ||
5256 brport_nla_put_flag(skb, flags, mask,
5257 IFLA_BRPORT_PROXYARP, BR_PROXYARP) ||
5258 brport_nla_put_flag(skb, flags, mask,
5259 IFLA_BRPORT_MCAST_FLOOD, BR_MCAST_FLOOD) ||
5260 brport_nla_put_flag(skb, flags, mask,
5261 IFLA_BRPORT_BCAST_FLOOD, BR_BCAST_FLOOD)) {
5262 nla_nest_cancel(skb, protinfo);
5263 goto nla_put_failure;
5264 }
5265
5266 nla_nest_end(skb, protinfo);
5267
5268 nlmsg_end(skb, nlh);
5269 return 0;
5270 nla_put_failure:
5271 nlmsg_cancel(skb, nlh);
5272 return err ? err : -EMSGSIZE;
5273 }
5274 EXPORT_SYMBOL_GPL(ndo_dflt_bridge_getlink);
5275
valid_bridge_getlink_req(const struct nlmsghdr * nlh,bool strict_check,u32 * filter_mask,struct netlink_ext_ack * extack)5276 static int valid_bridge_getlink_req(const struct nlmsghdr *nlh,
5277 bool strict_check, u32 *filter_mask,
5278 struct netlink_ext_ack *extack)
5279 {
5280 struct nlattr *tb[IFLA_MAX+1];
5281 int err, i;
5282
5283 if (strict_check) {
5284 struct ifinfomsg *ifm;
5285
5286 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifm))) {
5287 NL_SET_ERR_MSG(extack, "Invalid header for bridge link dump");
5288 return -EINVAL;
5289 }
5290
5291 ifm = nlmsg_data(nlh);
5292 if (ifm->__ifi_pad || ifm->ifi_type || ifm->ifi_flags ||
5293 ifm->ifi_change || ifm->ifi_index) {
5294 NL_SET_ERR_MSG(extack, "Invalid values in header for bridge link dump request");
5295 return -EINVAL;
5296 }
5297
5298 err = nlmsg_parse_deprecated_strict(nlh,
5299 sizeof(struct ifinfomsg),
5300 tb, IFLA_MAX, ifla_policy,
5301 extack);
5302 } else {
5303 err = nlmsg_parse_deprecated(nlh, sizeof(struct ifinfomsg),
5304 tb, IFLA_MAX, ifla_policy,
5305 extack);
5306 }
5307 if (err < 0)
5308 return err;
5309
5310 /* new attributes should only be added with strict checking */
5311 for (i = 0; i <= IFLA_MAX; ++i) {
5312 if (!tb[i])
5313 continue;
5314
5315 switch (i) {
5316 case IFLA_EXT_MASK:
5317 *filter_mask = nla_get_u32(tb[i]);
5318 break;
5319 default:
5320 if (strict_check) {
5321 NL_SET_ERR_MSG(extack, "Unsupported attribute in bridge link dump request");
5322 return -EINVAL;
5323 }
5324 }
5325 }
5326
5327 return 0;
5328 }
5329
rtnl_bridge_getlink(struct sk_buff * skb,struct netlink_callback * cb)5330 static int rtnl_bridge_getlink(struct sk_buff *skb, struct netlink_callback *cb)
5331 {
5332 const struct nlmsghdr *nlh = cb->nlh;
5333 struct net *net = sock_net(skb->sk);
5334 struct net_device *dev;
5335 int idx = 0;
5336 u32 portid = NETLINK_CB(cb->skb).portid;
5337 u32 seq = nlh->nlmsg_seq;
5338 u32 filter_mask = 0;
5339 int err;
5340
5341 err = valid_bridge_getlink_req(nlh, cb->strict_check, &filter_mask,
5342 cb->extack);
5343 if (err < 0 && cb->strict_check)
5344 return err;
5345
5346 rcu_read_lock();
5347 for_each_netdev_rcu(net, dev) {
5348 const struct net_device_ops *ops = dev->netdev_ops;
5349 struct net_device *br_dev = netdev_master_upper_dev_get(dev);
5350
5351 if (br_dev && br_dev->netdev_ops->ndo_bridge_getlink) {
5352 if (idx >= cb->args[0]) {
5353 err = br_dev->netdev_ops->ndo_bridge_getlink(
5354 skb, portid, seq, dev,
5355 filter_mask, NLM_F_MULTI);
5356 if (err < 0 && err != -EOPNOTSUPP) {
5357 if (likely(skb->len))
5358 break;
5359
5360 goto out_err;
5361 }
5362 }
5363 idx++;
5364 }
5365
5366 if (ops->ndo_bridge_getlink) {
5367 if (idx >= cb->args[0]) {
5368 err = ops->ndo_bridge_getlink(skb, portid,
5369 seq, dev,
5370 filter_mask,
5371 NLM_F_MULTI);
5372 if (err < 0 && err != -EOPNOTSUPP) {
5373 if (likely(skb->len))
5374 break;
5375
5376 goto out_err;
5377 }
5378 }
5379 idx++;
5380 }
5381 }
5382 err = skb->len;
5383 out_err:
5384 rcu_read_unlock();
5385 cb->args[0] = idx;
5386
5387 return err;
5388 }
5389
bridge_nlmsg_size(void)5390 static inline size_t bridge_nlmsg_size(void)
5391 {
5392 return NLMSG_ALIGN(sizeof(struct ifinfomsg))
5393 + nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */
5394 + nla_total_size(MAX_ADDR_LEN) /* IFLA_ADDRESS */
5395 + nla_total_size(sizeof(u32)) /* IFLA_MASTER */
5396 + nla_total_size(sizeof(u32)) /* IFLA_MTU */
5397 + nla_total_size(sizeof(u32)) /* IFLA_LINK */
5398 + nla_total_size(sizeof(u32)) /* IFLA_OPERSTATE */
5399 + nla_total_size(sizeof(u8)) /* IFLA_PROTINFO */
5400 + nla_total_size(sizeof(struct nlattr)) /* IFLA_AF_SPEC */
5401 + nla_total_size(sizeof(u16)) /* IFLA_BRIDGE_FLAGS */
5402 + nla_total_size(sizeof(u16)); /* IFLA_BRIDGE_MODE */
5403 }
5404
rtnl_bridge_notify(struct net_device * dev)5405 static int rtnl_bridge_notify(struct net_device *dev)
5406 {
5407 struct net *net = dev_net(dev);
5408 struct sk_buff *skb;
5409 int err = -EOPNOTSUPP;
5410
5411 if (!dev->netdev_ops->ndo_bridge_getlink)
5412 return 0;
5413
5414 skb = nlmsg_new(bridge_nlmsg_size(), GFP_ATOMIC);
5415 if (!skb) {
5416 err = -ENOMEM;
5417 goto errout;
5418 }
5419
5420 err = dev->netdev_ops->ndo_bridge_getlink(skb, 0, 0, dev, 0, 0);
5421 if (err < 0)
5422 goto errout;
5423
5424 /* Notification info is only filled for bridge ports, not the bridge
5425 * device itself. Therefore, a zero notification length is valid and
5426 * should not result in an error.
5427 */
5428 if (!skb->len)
5429 goto errout;
5430
5431 rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC);
5432 return 0;
5433 errout:
5434 WARN_ON(err == -EMSGSIZE);
5435 kfree_skb(skb);
5436 if (err)
5437 rtnl_set_sk_err(net, RTNLGRP_LINK, err);
5438 return err;
5439 }
5440
rtnl_bridge_setlink(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)5441 static int rtnl_bridge_setlink(struct sk_buff *skb, struct nlmsghdr *nlh,
5442 struct netlink_ext_ack *extack)
5443 {
5444 struct net *net = sock_net(skb->sk);
5445 struct ifinfomsg *ifm;
5446 struct net_device *dev;
5447 struct nlattr *br_spec, *attr, *br_flags_attr = NULL;
5448 int rem, err = -EOPNOTSUPP;
5449 u16 flags = 0;
5450
5451 if (nlmsg_len(nlh) < sizeof(*ifm))
5452 return -EINVAL;
5453
5454 ifm = nlmsg_data(nlh);
5455 if (ifm->ifi_family != AF_BRIDGE)
5456 return -EPFNOSUPPORT;
5457
5458 dev = __dev_get_by_index(net, ifm->ifi_index);
5459 if (!dev) {
5460 NL_SET_ERR_MSG(extack, "unknown ifindex");
5461 return -ENODEV;
5462 }
5463
5464 br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);
5465 if (br_spec) {
5466 nla_for_each_nested(attr, br_spec, rem) {
5467 if (nla_type(attr) == IFLA_BRIDGE_FLAGS && !br_flags_attr) {
5468 if (nla_len(attr) < sizeof(flags))
5469 return -EINVAL;
5470
5471 br_flags_attr = attr;
5472 flags = nla_get_u16(attr);
5473 }
5474
5475 if (nla_type(attr) == IFLA_BRIDGE_MODE) {
5476 if (nla_len(attr) < sizeof(u16))
5477 return -EINVAL;
5478 }
5479 }
5480 }
5481
5482 if (!flags || (flags & BRIDGE_FLAGS_MASTER)) {
5483 struct net_device *br_dev = netdev_master_upper_dev_get(dev);
5484
5485 if (!br_dev || !br_dev->netdev_ops->ndo_bridge_setlink) {
5486 err = -EOPNOTSUPP;
5487 goto out;
5488 }
5489
5490 err = br_dev->netdev_ops->ndo_bridge_setlink(dev, nlh, flags,
5491 extack);
5492 if (err)
5493 goto out;
5494
5495 flags &= ~BRIDGE_FLAGS_MASTER;
5496 }
5497
5498 if ((flags & BRIDGE_FLAGS_SELF)) {
5499 if (!dev->netdev_ops->ndo_bridge_setlink)
5500 err = -EOPNOTSUPP;
5501 else
5502 err = dev->netdev_ops->ndo_bridge_setlink(dev, nlh,
5503 flags,
5504 extack);
5505 if (!err) {
5506 flags &= ~BRIDGE_FLAGS_SELF;
5507
5508 /* Generate event to notify upper layer of bridge
5509 * change
5510 */
5511 err = rtnl_bridge_notify(dev);
5512 }
5513 }
5514
5515 if (br_flags_attr)
5516 memcpy(nla_data(br_flags_attr), &flags, sizeof(flags));
5517 out:
5518 return err;
5519 }
5520
rtnl_bridge_dellink(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)5521 static int rtnl_bridge_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
5522 struct netlink_ext_ack *extack)
5523 {
5524 struct net *net = sock_net(skb->sk);
5525 struct ifinfomsg *ifm;
5526 struct net_device *dev;
5527 struct nlattr *br_spec, *attr = NULL;
5528 int rem, err = -EOPNOTSUPP;
5529 u16 flags = 0;
5530 bool have_flags = false;
5531
5532 if (nlmsg_len(nlh) < sizeof(*ifm))
5533 return -EINVAL;
5534
5535 ifm = nlmsg_data(nlh);
5536 if (ifm->ifi_family != AF_BRIDGE)
5537 return -EPFNOSUPPORT;
5538
5539 dev = __dev_get_by_index(net, ifm->ifi_index);
5540 if (!dev) {
5541 NL_SET_ERR_MSG(extack, "unknown ifindex");
5542 return -ENODEV;
5543 }
5544
5545 br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);
5546 if (br_spec) {
5547 nla_for_each_nested_type(attr, IFLA_BRIDGE_FLAGS, br_spec,
5548 rem) {
5549 if (nla_len(attr) < sizeof(flags))
5550 return -EINVAL;
5551
5552 have_flags = true;
5553 flags = nla_get_u16(attr);
5554 break;
5555 }
5556 }
5557
5558 if (!flags || (flags & BRIDGE_FLAGS_MASTER)) {
5559 struct net_device *br_dev = netdev_master_upper_dev_get(dev);
5560
5561 if (!br_dev || !br_dev->netdev_ops->ndo_bridge_dellink) {
5562 err = -EOPNOTSUPP;
5563 goto out;
5564 }
5565
5566 err = br_dev->netdev_ops->ndo_bridge_dellink(dev, nlh, flags);
5567 if (err)
5568 goto out;
5569
5570 flags &= ~BRIDGE_FLAGS_MASTER;
5571 }
5572
5573 if ((flags & BRIDGE_FLAGS_SELF)) {
5574 if (!dev->netdev_ops->ndo_bridge_dellink)
5575 err = -EOPNOTSUPP;
5576 else
5577 err = dev->netdev_ops->ndo_bridge_dellink(dev, nlh,
5578 flags);
5579
5580 if (!err) {
5581 flags &= ~BRIDGE_FLAGS_SELF;
5582
5583 /* Generate event to notify upper layer of bridge
5584 * change
5585 */
5586 err = rtnl_bridge_notify(dev);
5587 }
5588 }
5589
5590 if (have_flags)
5591 memcpy(nla_data(attr), &flags, sizeof(flags));
5592 out:
5593 return err;
5594 }
5595
stats_attr_valid(unsigned int mask,int attrid,int idxattr)5596 static bool stats_attr_valid(unsigned int mask, int attrid, int idxattr)
5597 {
5598 return (mask & IFLA_STATS_FILTER_BIT(attrid)) &&
5599 (!idxattr || idxattr == attrid);
5600 }
5601
5602 static bool
rtnl_offload_xstats_have_ndo(const struct net_device * dev,int attr_id)5603 rtnl_offload_xstats_have_ndo(const struct net_device *dev, int attr_id)
5604 {
5605 return dev->netdev_ops &&
5606 dev->netdev_ops->ndo_has_offload_stats &&
5607 dev->netdev_ops->ndo_get_offload_stats &&
5608 dev->netdev_ops->ndo_has_offload_stats(dev, attr_id);
5609 }
5610
5611 static unsigned int
rtnl_offload_xstats_get_size_ndo(const struct net_device * dev,int attr_id)5612 rtnl_offload_xstats_get_size_ndo(const struct net_device *dev, int attr_id)
5613 {
5614 return rtnl_offload_xstats_have_ndo(dev, attr_id) ?
5615 sizeof(struct rtnl_link_stats64) : 0;
5616 }
5617
5618 static int
rtnl_offload_xstats_fill_ndo(struct net_device * dev,int attr_id,struct sk_buff * skb)5619 rtnl_offload_xstats_fill_ndo(struct net_device *dev, int attr_id,
5620 struct sk_buff *skb)
5621 {
5622 unsigned int size = rtnl_offload_xstats_get_size_ndo(dev, attr_id);
5623 struct nlattr *attr = NULL;
5624 void *attr_data;
5625 int err;
5626
5627 if (!size)
5628 return -ENODATA;
5629
5630 attr = nla_reserve_64bit(skb, attr_id, size,
5631 IFLA_OFFLOAD_XSTATS_UNSPEC);
5632 if (!attr)
5633 return -EMSGSIZE;
5634
5635 attr_data = nla_data(attr);
5636 memset(attr_data, 0, size);
5637
5638 err = dev->netdev_ops->ndo_get_offload_stats(attr_id, dev, attr_data);
5639 if (err)
5640 return err;
5641
5642 return 0;
5643 }
5644
5645 static unsigned int
rtnl_offload_xstats_get_size_stats(const struct net_device * dev,enum netdev_offload_xstats_type type)5646 rtnl_offload_xstats_get_size_stats(const struct net_device *dev,
5647 enum netdev_offload_xstats_type type)
5648 {
5649 bool enabled = netdev_offload_xstats_enabled(dev, type);
5650
5651 return enabled ? sizeof(struct rtnl_hw_stats64) : 0;
5652 }
5653
5654 struct rtnl_offload_xstats_request_used {
5655 bool request;
5656 bool used;
5657 };
5658
5659 static int
rtnl_offload_xstats_get_stats(struct net_device * dev,enum netdev_offload_xstats_type type,struct rtnl_offload_xstats_request_used * ru,struct rtnl_hw_stats64 * stats,struct netlink_ext_ack * extack)5660 rtnl_offload_xstats_get_stats(struct net_device *dev,
5661 enum netdev_offload_xstats_type type,
5662 struct rtnl_offload_xstats_request_used *ru,
5663 struct rtnl_hw_stats64 *stats,
5664 struct netlink_ext_ack *extack)
5665 {
5666 bool request;
5667 bool used;
5668 int err;
5669
5670 request = netdev_offload_xstats_enabled(dev, type);
5671 if (!request) {
5672 used = false;
5673 goto out;
5674 }
5675
5676 err = netdev_offload_xstats_get(dev, type, stats, &used, extack);
5677 if (err)
5678 return err;
5679
5680 out:
5681 if (ru) {
5682 ru->request = request;
5683 ru->used = used;
5684 }
5685 return 0;
5686 }
5687
5688 static int
rtnl_offload_xstats_fill_hw_s_info_one(struct sk_buff * skb,int attr_id,struct rtnl_offload_xstats_request_used * ru)5689 rtnl_offload_xstats_fill_hw_s_info_one(struct sk_buff *skb, int attr_id,
5690 struct rtnl_offload_xstats_request_used *ru)
5691 {
5692 struct nlattr *nest;
5693
5694 nest = nla_nest_start(skb, attr_id);
5695 if (!nest)
5696 return -EMSGSIZE;
5697
5698 if (nla_put_u8(skb, IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST, ru->request))
5699 goto nla_put_failure;
5700
5701 if (nla_put_u8(skb, IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED, ru->used))
5702 goto nla_put_failure;
5703
5704 nla_nest_end(skb, nest);
5705 return 0;
5706
5707 nla_put_failure:
5708 nla_nest_cancel(skb, nest);
5709 return -EMSGSIZE;
5710 }
5711
5712 static int
rtnl_offload_xstats_fill_hw_s_info(struct sk_buff * skb,struct net_device * dev,struct netlink_ext_ack * extack)5713 rtnl_offload_xstats_fill_hw_s_info(struct sk_buff *skb, struct net_device *dev,
5714 struct netlink_ext_ack *extack)
5715 {
5716 enum netdev_offload_xstats_type t_l3 = NETDEV_OFFLOAD_XSTATS_TYPE_L3;
5717 struct rtnl_offload_xstats_request_used ru_l3;
5718 struct nlattr *nest;
5719 int err;
5720
5721 err = rtnl_offload_xstats_get_stats(dev, t_l3, &ru_l3, NULL, extack);
5722 if (err)
5723 return err;
5724
5725 nest = nla_nest_start(skb, IFLA_OFFLOAD_XSTATS_HW_S_INFO);
5726 if (!nest)
5727 return -EMSGSIZE;
5728
5729 if (rtnl_offload_xstats_fill_hw_s_info_one(skb,
5730 IFLA_OFFLOAD_XSTATS_L3_STATS,
5731 &ru_l3))
5732 goto nla_put_failure;
5733
5734 nla_nest_end(skb, nest);
5735 return 0;
5736
5737 nla_put_failure:
5738 nla_nest_cancel(skb, nest);
5739 return -EMSGSIZE;
5740 }
5741
rtnl_offload_xstats_fill(struct sk_buff * skb,struct net_device * dev,int * prividx,u32 off_filter_mask,struct netlink_ext_ack * extack)5742 static int rtnl_offload_xstats_fill(struct sk_buff *skb, struct net_device *dev,
5743 int *prividx, u32 off_filter_mask,
5744 struct netlink_ext_ack *extack)
5745 {
5746 enum netdev_offload_xstats_type t_l3 = NETDEV_OFFLOAD_XSTATS_TYPE_L3;
5747 int attr_id_hw_s_info = IFLA_OFFLOAD_XSTATS_HW_S_INFO;
5748 int attr_id_l3_stats = IFLA_OFFLOAD_XSTATS_L3_STATS;
5749 int attr_id_cpu_hit = IFLA_OFFLOAD_XSTATS_CPU_HIT;
5750 bool have_data = false;
5751 int err;
5752
5753 if (*prividx <= attr_id_cpu_hit &&
5754 (off_filter_mask &
5755 IFLA_STATS_FILTER_BIT(attr_id_cpu_hit))) {
5756 err = rtnl_offload_xstats_fill_ndo(dev, attr_id_cpu_hit, skb);
5757 if (!err) {
5758 have_data = true;
5759 } else if (err != -ENODATA) {
5760 *prividx = attr_id_cpu_hit;
5761 return err;
5762 }
5763 }
5764
5765 if (*prividx <= attr_id_hw_s_info &&
5766 (off_filter_mask & IFLA_STATS_FILTER_BIT(attr_id_hw_s_info))) {
5767 *prividx = attr_id_hw_s_info;
5768
5769 err = rtnl_offload_xstats_fill_hw_s_info(skb, dev, extack);
5770 if (err)
5771 return err;
5772
5773 have_data = true;
5774 *prividx = 0;
5775 }
5776
5777 if (*prividx <= attr_id_l3_stats &&
5778 (off_filter_mask & IFLA_STATS_FILTER_BIT(attr_id_l3_stats))) {
5779 unsigned int size_l3;
5780 struct nlattr *attr;
5781
5782 *prividx = attr_id_l3_stats;
5783
5784 size_l3 = rtnl_offload_xstats_get_size_stats(dev, t_l3);
5785 if (!size_l3)
5786 goto skip_l3_stats;
5787 attr = nla_reserve_64bit(skb, attr_id_l3_stats, size_l3,
5788 IFLA_OFFLOAD_XSTATS_UNSPEC);
5789 if (!attr)
5790 return -EMSGSIZE;
5791
5792 err = rtnl_offload_xstats_get_stats(dev, t_l3, NULL,
5793 nla_data(attr), extack);
5794 if (err)
5795 return err;
5796
5797 have_data = true;
5798 skip_l3_stats:
5799 *prividx = 0;
5800 }
5801
5802 if (!have_data)
5803 return -ENODATA;
5804
5805 *prividx = 0;
5806 return 0;
5807 }
5808
5809 static unsigned int
rtnl_offload_xstats_get_size_hw_s_info_one(const struct net_device * dev,enum netdev_offload_xstats_type type)5810 rtnl_offload_xstats_get_size_hw_s_info_one(const struct net_device *dev,
5811 enum netdev_offload_xstats_type type)
5812 {
5813 return nla_total_size(0) +
5814 /* IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST */
5815 nla_total_size(sizeof(u8)) +
5816 /* IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED */
5817 nla_total_size(sizeof(u8)) +
5818 0;
5819 }
5820
5821 static unsigned int
rtnl_offload_xstats_get_size_hw_s_info(const struct net_device * dev)5822 rtnl_offload_xstats_get_size_hw_s_info(const struct net_device *dev)
5823 {
5824 enum netdev_offload_xstats_type t_l3 = NETDEV_OFFLOAD_XSTATS_TYPE_L3;
5825
5826 return nla_total_size(0) +
5827 /* IFLA_OFFLOAD_XSTATS_L3_STATS */
5828 rtnl_offload_xstats_get_size_hw_s_info_one(dev, t_l3) +
5829 0;
5830 }
5831
rtnl_offload_xstats_get_size(const struct net_device * dev,u32 off_filter_mask)5832 static int rtnl_offload_xstats_get_size(const struct net_device *dev,
5833 u32 off_filter_mask)
5834 {
5835 enum netdev_offload_xstats_type t_l3 = NETDEV_OFFLOAD_XSTATS_TYPE_L3;
5836 int attr_id_cpu_hit = IFLA_OFFLOAD_XSTATS_CPU_HIT;
5837 int nla_size = 0;
5838 int size;
5839
5840 if (off_filter_mask &
5841 IFLA_STATS_FILTER_BIT(attr_id_cpu_hit)) {
5842 size = rtnl_offload_xstats_get_size_ndo(dev, attr_id_cpu_hit);
5843 nla_size += nla_total_size_64bit(size);
5844 }
5845
5846 if (off_filter_mask &
5847 IFLA_STATS_FILTER_BIT(IFLA_OFFLOAD_XSTATS_HW_S_INFO))
5848 nla_size += rtnl_offload_xstats_get_size_hw_s_info(dev);
5849
5850 if (off_filter_mask &
5851 IFLA_STATS_FILTER_BIT(IFLA_OFFLOAD_XSTATS_L3_STATS)) {
5852 size = rtnl_offload_xstats_get_size_stats(dev, t_l3);
5853 nla_size += nla_total_size_64bit(size);
5854 }
5855
5856 if (nla_size != 0)
5857 nla_size += nla_total_size(0);
5858
5859 return nla_size;
5860 }
5861
5862 struct rtnl_stats_dump_filters {
5863 /* mask[0] filters outer attributes. Then individual nests have their
5864 * filtering mask at the index of the nested attribute.
5865 */
5866 u32 mask[IFLA_STATS_MAX + 1];
5867 };
5868
rtnl_fill_statsinfo(struct sk_buff * skb,struct net_device * dev,int type,u32 pid,u32 seq,u32 change,unsigned int flags,const struct rtnl_stats_dump_filters * filters,int * idxattr,int * prividx,struct netlink_ext_ack * extack)5869 static int rtnl_fill_statsinfo(struct sk_buff *skb, struct net_device *dev,
5870 int type, u32 pid, u32 seq, u32 change,
5871 unsigned int flags,
5872 const struct rtnl_stats_dump_filters *filters,
5873 int *idxattr, int *prividx,
5874 struct netlink_ext_ack *extack)
5875 {
5876 unsigned int filter_mask = filters->mask[0];
5877 struct if_stats_msg *ifsm;
5878 struct nlmsghdr *nlh;
5879 struct nlattr *attr;
5880 int s_prividx = *prividx;
5881 int err;
5882
5883 ASSERT_RTNL();
5884
5885 nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ifsm), flags);
5886 if (!nlh)
5887 return -EMSGSIZE;
5888
5889 ifsm = nlmsg_data(nlh);
5890 ifsm->family = PF_UNSPEC;
5891 ifsm->pad1 = 0;
5892 ifsm->pad2 = 0;
5893 ifsm->ifindex = dev->ifindex;
5894 ifsm->filter_mask = filter_mask;
5895
5896 if (stats_attr_valid(filter_mask, IFLA_STATS_LINK_64, *idxattr)) {
5897 struct rtnl_link_stats64 *sp;
5898
5899 attr = nla_reserve_64bit(skb, IFLA_STATS_LINK_64,
5900 sizeof(struct rtnl_link_stats64),
5901 IFLA_STATS_UNSPEC);
5902 if (!attr) {
5903 err = -EMSGSIZE;
5904 goto nla_put_failure;
5905 }
5906
5907 sp = nla_data(attr);
5908 dev_get_stats(dev, sp);
5909 }
5910
5911 if (stats_attr_valid(filter_mask, IFLA_STATS_LINK_XSTATS, *idxattr)) {
5912 const struct rtnl_link_ops *ops = dev->rtnl_link_ops;
5913
5914 if (ops && ops->fill_linkxstats) {
5915 *idxattr = IFLA_STATS_LINK_XSTATS;
5916 attr = nla_nest_start_noflag(skb,
5917 IFLA_STATS_LINK_XSTATS);
5918 if (!attr) {
5919 err = -EMSGSIZE;
5920 goto nla_put_failure;
5921 }
5922
5923 err = ops->fill_linkxstats(skb, dev, prividx, *idxattr);
5924 nla_nest_end(skb, attr);
5925 if (err)
5926 goto nla_put_failure;
5927 *idxattr = 0;
5928 }
5929 }
5930
5931 if (stats_attr_valid(filter_mask, IFLA_STATS_LINK_XSTATS_SLAVE,
5932 *idxattr)) {
5933 const struct rtnl_link_ops *ops = NULL;
5934 const struct net_device *master;
5935
5936 master = netdev_master_upper_dev_get(dev);
5937 if (master)
5938 ops = master->rtnl_link_ops;
5939 if (ops && ops->fill_linkxstats) {
5940 *idxattr = IFLA_STATS_LINK_XSTATS_SLAVE;
5941 attr = nla_nest_start_noflag(skb,
5942 IFLA_STATS_LINK_XSTATS_SLAVE);
5943 if (!attr) {
5944 err = -EMSGSIZE;
5945 goto nla_put_failure;
5946 }
5947
5948 err = ops->fill_linkxstats(skb, dev, prividx, *idxattr);
5949 nla_nest_end(skb, attr);
5950 if (err)
5951 goto nla_put_failure;
5952 *idxattr = 0;
5953 }
5954 }
5955
5956 if (stats_attr_valid(filter_mask, IFLA_STATS_LINK_OFFLOAD_XSTATS,
5957 *idxattr)) {
5958 u32 off_filter_mask;
5959
5960 off_filter_mask = filters->mask[IFLA_STATS_LINK_OFFLOAD_XSTATS];
5961 *idxattr = IFLA_STATS_LINK_OFFLOAD_XSTATS;
5962 attr = nla_nest_start_noflag(skb,
5963 IFLA_STATS_LINK_OFFLOAD_XSTATS);
5964 if (!attr) {
5965 err = -EMSGSIZE;
5966 goto nla_put_failure;
5967 }
5968
5969 err = rtnl_offload_xstats_fill(skb, dev, prividx,
5970 off_filter_mask, extack);
5971 if (err == -ENODATA)
5972 nla_nest_cancel(skb, attr);
5973 else
5974 nla_nest_end(skb, attr);
5975
5976 if (err && err != -ENODATA)
5977 goto nla_put_failure;
5978 *idxattr = 0;
5979 }
5980
5981 if (stats_attr_valid(filter_mask, IFLA_STATS_AF_SPEC, *idxattr)) {
5982 struct rtnl_af_ops *af_ops;
5983
5984 *idxattr = IFLA_STATS_AF_SPEC;
5985 attr = nla_nest_start_noflag(skb, IFLA_STATS_AF_SPEC);
5986 if (!attr) {
5987 err = -EMSGSIZE;
5988 goto nla_put_failure;
5989 }
5990
5991 rcu_read_lock();
5992 list_for_each_entry_rcu(af_ops, &rtnl_af_ops, list) {
5993 if (af_ops->fill_stats_af) {
5994 struct nlattr *af;
5995
5996 af = nla_nest_start_noflag(skb,
5997 af_ops->family);
5998 if (!af) {
5999 rcu_read_unlock();
6000 err = -EMSGSIZE;
6001 goto nla_put_failure;
6002 }
6003 err = af_ops->fill_stats_af(skb, dev);
6004
6005 if (err == -ENODATA) {
6006 nla_nest_cancel(skb, af);
6007 } else if (err < 0) {
6008 rcu_read_unlock();
6009 goto nla_put_failure;
6010 }
6011
6012 nla_nest_end(skb, af);
6013 }
6014 }
6015 rcu_read_unlock();
6016
6017 nla_nest_end(skb, attr);
6018
6019 *idxattr = 0;
6020 }
6021
6022 nlmsg_end(skb, nlh);
6023
6024 return 0;
6025
6026 nla_put_failure:
6027 /* not a multi message or no progress mean a real error */
6028 if (!(flags & NLM_F_MULTI) || s_prividx == *prividx)
6029 nlmsg_cancel(skb, nlh);
6030 else
6031 nlmsg_end(skb, nlh);
6032
6033 return err;
6034 }
6035
if_nlmsg_stats_size(const struct net_device * dev,const struct rtnl_stats_dump_filters * filters)6036 static size_t if_nlmsg_stats_size(const struct net_device *dev,
6037 const struct rtnl_stats_dump_filters *filters)
6038 {
6039 size_t size = NLMSG_ALIGN(sizeof(struct if_stats_msg));
6040 unsigned int filter_mask = filters->mask[0];
6041
6042 if (stats_attr_valid(filter_mask, IFLA_STATS_LINK_64, 0))
6043 size += nla_total_size_64bit(sizeof(struct rtnl_link_stats64));
6044
6045 if (stats_attr_valid(filter_mask, IFLA_STATS_LINK_XSTATS, 0)) {
6046 const struct rtnl_link_ops *ops = dev->rtnl_link_ops;
6047 int attr = IFLA_STATS_LINK_XSTATS;
6048
6049 if (ops && ops->get_linkxstats_size) {
6050 size += nla_total_size(ops->get_linkxstats_size(dev,
6051 attr));
6052 /* for IFLA_STATS_LINK_XSTATS */
6053 size += nla_total_size(0);
6054 }
6055 }
6056
6057 if (stats_attr_valid(filter_mask, IFLA_STATS_LINK_XSTATS_SLAVE, 0)) {
6058 struct net_device *_dev = (struct net_device *)dev;
6059 const struct rtnl_link_ops *ops = NULL;
6060 const struct net_device *master;
6061
6062 /* netdev_master_upper_dev_get can't take const */
6063 master = netdev_master_upper_dev_get(_dev);
6064 if (master)
6065 ops = master->rtnl_link_ops;
6066 if (ops && ops->get_linkxstats_size) {
6067 int attr = IFLA_STATS_LINK_XSTATS_SLAVE;
6068
6069 size += nla_total_size(ops->get_linkxstats_size(dev,
6070 attr));
6071 /* for IFLA_STATS_LINK_XSTATS_SLAVE */
6072 size += nla_total_size(0);
6073 }
6074 }
6075
6076 if (stats_attr_valid(filter_mask, IFLA_STATS_LINK_OFFLOAD_XSTATS, 0)) {
6077 u32 off_filter_mask;
6078
6079 off_filter_mask = filters->mask[IFLA_STATS_LINK_OFFLOAD_XSTATS];
6080 size += rtnl_offload_xstats_get_size(dev, off_filter_mask);
6081 }
6082
6083 if (stats_attr_valid(filter_mask, IFLA_STATS_AF_SPEC, 0)) {
6084 struct rtnl_af_ops *af_ops;
6085
6086 /* for IFLA_STATS_AF_SPEC */
6087 size += nla_total_size(0);
6088
6089 rcu_read_lock();
6090 list_for_each_entry_rcu(af_ops, &rtnl_af_ops, list) {
6091 if (af_ops->get_stats_af_size) {
6092 size += nla_total_size(
6093 af_ops->get_stats_af_size(dev));
6094
6095 /* for AF_* */
6096 size += nla_total_size(0);
6097 }
6098 }
6099 rcu_read_unlock();
6100 }
6101
6102 return size;
6103 }
6104
6105 #define RTNL_STATS_OFFLOAD_XSTATS_VALID ((1 << __IFLA_OFFLOAD_XSTATS_MAX) - 1)
6106
6107 static const struct nla_policy
6108 rtnl_stats_get_policy_filters[IFLA_STATS_MAX + 1] = {
6109 [IFLA_STATS_LINK_OFFLOAD_XSTATS] =
6110 NLA_POLICY_MASK(NLA_U32, RTNL_STATS_OFFLOAD_XSTATS_VALID),
6111 };
6112
6113 static const struct nla_policy
6114 rtnl_stats_get_policy[IFLA_STATS_GETSET_MAX + 1] = {
6115 [IFLA_STATS_GET_FILTERS] =
6116 NLA_POLICY_NESTED(rtnl_stats_get_policy_filters),
6117 };
6118
6119 static const struct nla_policy
6120 ifla_stats_set_policy[IFLA_STATS_GETSET_MAX + 1] = {
6121 [IFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS] = NLA_POLICY_MAX(NLA_U8, 1),
6122 };
6123
rtnl_stats_get_parse_filters(struct nlattr * ifla_filters,struct rtnl_stats_dump_filters * filters,struct netlink_ext_ack * extack)6124 static int rtnl_stats_get_parse_filters(struct nlattr *ifla_filters,
6125 struct rtnl_stats_dump_filters *filters,
6126 struct netlink_ext_ack *extack)
6127 {
6128 struct nlattr *tb[IFLA_STATS_MAX + 1];
6129 int err;
6130 int at;
6131
6132 err = nla_parse_nested(tb, IFLA_STATS_MAX, ifla_filters,
6133 rtnl_stats_get_policy_filters, extack);
6134 if (err < 0)
6135 return err;
6136
6137 for (at = 1; at <= IFLA_STATS_MAX; at++) {
6138 if (tb[at]) {
6139 if (!(filters->mask[0] & IFLA_STATS_FILTER_BIT(at))) {
6140 NL_SET_ERR_MSG(extack, "Filtered attribute not enabled in filter_mask");
6141 return -EINVAL;
6142 }
6143 filters->mask[at] = nla_get_u32(tb[at]);
6144 }
6145 }
6146
6147 return 0;
6148 }
6149
rtnl_stats_get_parse(const struct nlmsghdr * nlh,u32 filter_mask,struct rtnl_stats_dump_filters * filters,struct netlink_ext_ack * extack)6150 static int rtnl_stats_get_parse(const struct nlmsghdr *nlh,
6151 u32 filter_mask,
6152 struct rtnl_stats_dump_filters *filters,
6153 struct netlink_ext_ack *extack)
6154 {
6155 struct nlattr *tb[IFLA_STATS_GETSET_MAX + 1];
6156 int err;
6157 int i;
6158
6159 filters->mask[0] = filter_mask;
6160 for (i = 1; i < ARRAY_SIZE(filters->mask); i++)
6161 filters->mask[i] = -1U;
6162
6163 err = nlmsg_parse(nlh, sizeof(struct if_stats_msg), tb,
6164 IFLA_STATS_GETSET_MAX, rtnl_stats_get_policy, extack);
6165 if (err < 0)
6166 return err;
6167
6168 if (tb[IFLA_STATS_GET_FILTERS]) {
6169 err = rtnl_stats_get_parse_filters(tb[IFLA_STATS_GET_FILTERS],
6170 filters, extack);
6171 if (err)
6172 return err;
6173 }
6174
6175 return 0;
6176 }
6177
rtnl_valid_stats_req(const struct nlmsghdr * nlh,bool strict_check,bool is_dump,struct netlink_ext_ack * extack)6178 static int rtnl_valid_stats_req(const struct nlmsghdr *nlh, bool strict_check,
6179 bool is_dump, struct netlink_ext_ack *extack)
6180 {
6181 struct if_stats_msg *ifsm;
6182
6183 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifsm))) {
6184 NL_SET_ERR_MSG(extack, "Invalid header for stats dump");
6185 return -EINVAL;
6186 }
6187
6188 if (!strict_check)
6189 return 0;
6190
6191 ifsm = nlmsg_data(nlh);
6192
6193 /* only requests using strict checks can pass data to influence
6194 * the dump. The legacy exception is filter_mask.
6195 */
6196 if (ifsm->pad1 || ifsm->pad2 || (is_dump && ifsm->ifindex)) {
6197 NL_SET_ERR_MSG(extack, "Invalid values in header for stats dump request");
6198 return -EINVAL;
6199 }
6200 if (ifsm->filter_mask >= IFLA_STATS_FILTER_BIT(IFLA_STATS_MAX + 1)) {
6201 NL_SET_ERR_MSG(extack, "Invalid stats requested through filter mask");
6202 return -EINVAL;
6203 }
6204
6205 return 0;
6206 }
6207
rtnl_stats_get(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)6208 static int rtnl_stats_get(struct sk_buff *skb, struct nlmsghdr *nlh,
6209 struct netlink_ext_ack *extack)
6210 {
6211 struct rtnl_stats_dump_filters filters;
6212 struct net *net = sock_net(skb->sk);
6213 struct net_device *dev = NULL;
6214 int idxattr = 0, prividx = 0;
6215 struct if_stats_msg *ifsm;
6216 struct sk_buff *nskb;
6217 int err;
6218
6219 err = rtnl_valid_stats_req(nlh, netlink_strict_get_check(skb),
6220 false, extack);
6221 if (err)
6222 return err;
6223
6224 ifsm = nlmsg_data(nlh);
6225 if (ifsm->ifindex > 0)
6226 dev = __dev_get_by_index(net, ifsm->ifindex);
6227 else
6228 return -EINVAL;
6229
6230 if (!dev)
6231 return -ENODEV;
6232
6233 if (!ifsm->filter_mask) {
6234 NL_SET_ERR_MSG(extack, "Filter mask must be set for stats get");
6235 return -EINVAL;
6236 }
6237
6238 err = rtnl_stats_get_parse(nlh, ifsm->filter_mask, &filters, extack);
6239 if (err)
6240 return err;
6241
6242 nskb = nlmsg_new(if_nlmsg_stats_size(dev, &filters), GFP_KERNEL);
6243 if (!nskb)
6244 return -ENOBUFS;
6245
6246 err = rtnl_fill_statsinfo(nskb, dev, RTM_NEWSTATS,
6247 NETLINK_CB(skb).portid, nlh->nlmsg_seq, 0,
6248 0, &filters, &idxattr, &prividx, extack);
6249 if (err < 0) {
6250 /* -EMSGSIZE implies BUG in if_nlmsg_stats_size */
6251 WARN_ON(err == -EMSGSIZE);
6252 kfree_skb(nskb);
6253 } else {
6254 err = rtnl_unicast(nskb, net, NETLINK_CB(skb).portid);
6255 }
6256
6257 return err;
6258 }
6259
rtnl_stats_dump(struct sk_buff * skb,struct netlink_callback * cb)6260 static int rtnl_stats_dump(struct sk_buff *skb, struct netlink_callback *cb)
6261 {
6262 struct netlink_ext_ack *extack = cb->extack;
6263 struct rtnl_stats_dump_filters filters;
6264 struct net *net = sock_net(skb->sk);
6265 unsigned int flags = NLM_F_MULTI;
6266 struct if_stats_msg *ifsm;
6267 struct {
6268 unsigned long ifindex;
6269 int idxattr;
6270 int prividx;
6271 } *ctx = (void *)cb->ctx;
6272 struct net_device *dev;
6273 int err;
6274
6275 cb->seq = net->dev_base_seq;
6276
6277 err = rtnl_valid_stats_req(cb->nlh, cb->strict_check, true, extack);
6278 if (err)
6279 return err;
6280
6281 ifsm = nlmsg_data(cb->nlh);
6282 if (!ifsm->filter_mask) {
6283 NL_SET_ERR_MSG(extack, "Filter mask must be set for stats dump");
6284 return -EINVAL;
6285 }
6286
6287 err = rtnl_stats_get_parse(cb->nlh, ifsm->filter_mask, &filters,
6288 extack);
6289 if (err)
6290 return err;
6291
6292 for_each_netdev_dump(net, dev, ctx->ifindex) {
6293 err = rtnl_fill_statsinfo(skb, dev, RTM_NEWSTATS,
6294 NETLINK_CB(cb->skb).portid,
6295 cb->nlh->nlmsg_seq, 0,
6296 flags, &filters,
6297 &ctx->idxattr, &ctx->prividx,
6298 extack);
6299 /* If we ran out of room on the first message,
6300 * we're in trouble.
6301 */
6302 WARN_ON((err == -EMSGSIZE) && (skb->len == 0));
6303
6304 if (err < 0)
6305 break;
6306 ctx->prividx = 0;
6307 ctx->idxattr = 0;
6308 nl_dump_check_consistent(cb, nlmsg_hdr(skb));
6309 }
6310
6311 return err;
6312 }
6313
rtnl_offload_xstats_notify(struct net_device * dev)6314 void rtnl_offload_xstats_notify(struct net_device *dev)
6315 {
6316 struct rtnl_stats_dump_filters response_filters = {};
6317 struct net *net = dev_net(dev);
6318 int idxattr = 0, prividx = 0;
6319 struct sk_buff *skb;
6320 int err = -ENOBUFS;
6321
6322 ASSERT_RTNL();
6323
6324 response_filters.mask[0] |=
6325 IFLA_STATS_FILTER_BIT(IFLA_STATS_LINK_OFFLOAD_XSTATS);
6326 response_filters.mask[IFLA_STATS_LINK_OFFLOAD_XSTATS] |=
6327 IFLA_STATS_FILTER_BIT(IFLA_OFFLOAD_XSTATS_HW_S_INFO);
6328
6329 skb = nlmsg_new(if_nlmsg_stats_size(dev, &response_filters),
6330 GFP_KERNEL);
6331 if (!skb)
6332 goto errout;
6333
6334 err = rtnl_fill_statsinfo(skb, dev, RTM_NEWSTATS, 0, 0, 0, 0,
6335 &response_filters, &idxattr, &prividx, NULL);
6336 if (err < 0) {
6337 kfree_skb(skb);
6338 goto errout;
6339 }
6340
6341 rtnl_notify(skb, net, 0, RTNLGRP_STATS, NULL, GFP_KERNEL);
6342 return;
6343
6344 errout:
6345 rtnl_set_sk_err(net, RTNLGRP_STATS, err);
6346 }
6347 EXPORT_SYMBOL(rtnl_offload_xstats_notify);
6348
rtnl_stats_set(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)6349 static int rtnl_stats_set(struct sk_buff *skb, struct nlmsghdr *nlh,
6350 struct netlink_ext_ack *extack)
6351 {
6352 enum netdev_offload_xstats_type t_l3 = NETDEV_OFFLOAD_XSTATS_TYPE_L3;
6353 struct rtnl_stats_dump_filters response_filters = {};
6354 struct nlattr *tb[IFLA_STATS_GETSET_MAX + 1];
6355 struct net *net = sock_net(skb->sk);
6356 struct net_device *dev = NULL;
6357 struct if_stats_msg *ifsm;
6358 bool notify = false;
6359 int err;
6360
6361 err = rtnl_valid_stats_req(nlh, netlink_strict_get_check(skb),
6362 false, extack);
6363 if (err)
6364 return err;
6365
6366 ifsm = nlmsg_data(nlh);
6367 if (ifsm->family != AF_UNSPEC) {
6368 NL_SET_ERR_MSG(extack, "Address family should be AF_UNSPEC");
6369 return -EINVAL;
6370 }
6371
6372 if (ifsm->ifindex > 0)
6373 dev = __dev_get_by_index(net, ifsm->ifindex);
6374 else
6375 return -EINVAL;
6376
6377 if (!dev)
6378 return -ENODEV;
6379
6380 if (ifsm->filter_mask) {
6381 NL_SET_ERR_MSG(extack, "Filter mask must be 0 for stats set");
6382 return -EINVAL;
6383 }
6384
6385 err = nlmsg_parse(nlh, sizeof(*ifsm), tb, IFLA_STATS_GETSET_MAX,
6386 ifla_stats_set_policy, extack);
6387 if (err < 0)
6388 return err;
6389
6390 if (tb[IFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS]) {
6391 u8 req = nla_get_u8(tb[IFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS]);
6392
6393 if (req)
6394 err = netdev_offload_xstats_enable(dev, t_l3, extack);
6395 else
6396 err = netdev_offload_xstats_disable(dev, t_l3);
6397
6398 if (!err)
6399 notify = true;
6400 else if (err != -EALREADY)
6401 return err;
6402
6403 response_filters.mask[0] |=
6404 IFLA_STATS_FILTER_BIT(IFLA_STATS_LINK_OFFLOAD_XSTATS);
6405 response_filters.mask[IFLA_STATS_LINK_OFFLOAD_XSTATS] |=
6406 IFLA_STATS_FILTER_BIT(IFLA_OFFLOAD_XSTATS_HW_S_INFO);
6407 }
6408
6409 if (notify)
6410 rtnl_offload_xstats_notify(dev);
6411
6412 return 0;
6413 }
6414
rtnl_mdb_valid_dump_req(const struct nlmsghdr * nlh,struct netlink_ext_ack * extack)6415 static int rtnl_mdb_valid_dump_req(const struct nlmsghdr *nlh,
6416 struct netlink_ext_ack *extack)
6417 {
6418 struct br_port_msg *bpm;
6419
6420 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*bpm))) {
6421 NL_SET_ERR_MSG(extack, "Invalid header for mdb dump request");
6422 return -EINVAL;
6423 }
6424
6425 bpm = nlmsg_data(nlh);
6426 if (bpm->ifindex) {
6427 NL_SET_ERR_MSG(extack, "Filtering by device index is not supported for mdb dump request");
6428 return -EINVAL;
6429 }
6430 if (nlmsg_attrlen(nlh, sizeof(*bpm))) {
6431 NL_SET_ERR_MSG(extack, "Invalid data after header in mdb dump request");
6432 return -EINVAL;
6433 }
6434
6435 return 0;
6436 }
6437
6438 struct rtnl_mdb_dump_ctx {
6439 long idx;
6440 };
6441
rtnl_mdb_dump(struct sk_buff * skb,struct netlink_callback * cb)6442 static int rtnl_mdb_dump(struct sk_buff *skb, struct netlink_callback *cb)
6443 {
6444 struct rtnl_mdb_dump_ctx *ctx = (void *)cb->ctx;
6445 struct net *net = sock_net(skb->sk);
6446 struct net_device *dev;
6447 int idx, s_idx;
6448 int err;
6449
6450 NL_ASSERT_CTX_FITS(struct rtnl_mdb_dump_ctx);
6451
6452 if (cb->strict_check) {
6453 err = rtnl_mdb_valid_dump_req(cb->nlh, cb->extack);
6454 if (err)
6455 return err;
6456 }
6457
6458 s_idx = ctx->idx;
6459 idx = 0;
6460
6461 for_each_netdev(net, dev) {
6462 if (idx < s_idx)
6463 goto skip;
6464 if (!dev->netdev_ops->ndo_mdb_dump)
6465 goto skip;
6466
6467 err = dev->netdev_ops->ndo_mdb_dump(dev, skb, cb);
6468 if (err == -EMSGSIZE)
6469 goto out;
6470 /* Moving on to next device, reset markers and sequence
6471 * counters since they are all maintained per-device.
6472 */
6473 memset(cb->ctx, 0, sizeof(cb->ctx));
6474 cb->prev_seq = 0;
6475 cb->seq = 0;
6476 skip:
6477 idx++;
6478 }
6479
6480 out:
6481 ctx->idx = idx;
6482 return skb->len;
6483 }
6484
rtnl_validate_mdb_entry_get(const struct nlattr * attr,struct netlink_ext_ack * extack)6485 static int rtnl_validate_mdb_entry_get(const struct nlattr *attr,
6486 struct netlink_ext_ack *extack)
6487 {
6488 struct br_mdb_entry *entry = nla_data(attr);
6489
6490 if (nla_len(attr) != sizeof(struct br_mdb_entry)) {
6491 NL_SET_ERR_MSG_ATTR(extack, attr, "Invalid attribute length");
6492 return -EINVAL;
6493 }
6494
6495 if (entry->ifindex) {
6496 NL_SET_ERR_MSG(extack, "Entry ifindex cannot be specified");
6497 return -EINVAL;
6498 }
6499
6500 if (entry->state) {
6501 NL_SET_ERR_MSG(extack, "Entry state cannot be specified");
6502 return -EINVAL;
6503 }
6504
6505 if (entry->flags) {
6506 NL_SET_ERR_MSG(extack, "Entry flags cannot be specified");
6507 return -EINVAL;
6508 }
6509
6510 if (entry->vid >= VLAN_VID_MASK) {
6511 NL_SET_ERR_MSG(extack, "Invalid entry VLAN id");
6512 return -EINVAL;
6513 }
6514
6515 if (entry->addr.proto != htons(ETH_P_IP) &&
6516 entry->addr.proto != htons(ETH_P_IPV6) &&
6517 entry->addr.proto != 0) {
6518 NL_SET_ERR_MSG(extack, "Unknown entry protocol");
6519 return -EINVAL;
6520 }
6521
6522 return 0;
6523 }
6524
6525 static const struct nla_policy mdba_get_policy[MDBA_GET_ENTRY_MAX + 1] = {
6526 [MDBA_GET_ENTRY] = NLA_POLICY_VALIDATE_FN(NLA_BINARY,
6527 rtnl_validate_mdb_entry_get,
6528 sizeof(struct br_mdb_entry)),
6529 [MDBA_GET_ENTRY_ATTRS] = { .type = NLA_NESTED },
6530 };
6531
rtnl_mdb_get(struct sk_buff * in_skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)6532 static int rtnl_mdb_get(struct sk_buff *in_skb, struct nlmsghdr *nlh,
6533 struct netlink_ext_ack *extack)
6534 {
6535 struct nlattr *tb[MDBA_GET_ENTRY_MAX + 1];
6536 struct net *net = sock_net(in_skb->sk);
6537 struct br_port_msg *bpm;
6538 struct net_device *dev;
6539 int err;
6540
6541 err = nlmsg_parse(nlh, sizeof(struct br_port_msg), tb,
6542 MDBA_GET_ENTRY_MAX, mdba_get_policy, extack);
6543 if (err)
6544 return err;
6545
6546 bpm = nlmsg_data(nlh);
6547 if (!bpm->ifindex) {
6548 NL_SET_ERR_MSG(extack, "Invalid ifindex");
6549 return -EINVAL;
6550 }
6551
6552 dev = __dev_get_by_index(net, bpm->ifindex);
6553 if (!dev) {
6554 NL_SET_ERR_MSG(extack, "Device doesn't exist");
6555 return -ENODEV;
6556 }
6557
6558 if (NL_REQ_ATTR_CHECK(extack, NULL, tb, MDBA_GET_ENTRY)) {
6559 NL_SET_ERR_MSG(extack, "Missing MDBA_GET_ENTRY attribute");
6560 return -EINVAL;
6561 }
6562
6563 if (!dev->netdev_ops->ndo_mdb_get) {
6564 NL_SET_ERR_MSG(extack, "Device does not support MDB operations");
6565 return -EOPNOTSUPP;
6566 }
6567
6568 return dev->netdev_ops->ndo_mdb_get(dev, tb, NETLINK_CB(in_skb).portid,
6569 nlh->nlmsg_seq, extack);
6570 }
6571
rtnl_validate_mdb_entry(const struct nlattr * attr,struct netlink_ext_ack * extack)6572 static int rtnl_validate_mdb_entry(const struct nlattr *attr,
6573 struct netlink_ext_ack *extack)
6574 {
6575 struct br_mdb_entry *entry = nla_data(attr);
6576
6577 if (nla_len(attr) != sizeof(struct br_mdb_entry)) {
6578 NL_SET_ERR_MSG_ATTR(extack, attr, "Invalid attribute length");
6579 return -EINVAL;
6580 }
6581
6582 if (entry->ifindex == 0) {
6583 NL_SET_ERR_MSG(extack, "Zero entry ifindex is not allowed");
6584 return -EINVAL;
6585 }
6586
6587 if (entry->addr.proto == htons(ETH_P_IP)) {
6588 if (!ipv4_is_multicast(entry->addr.u.ip4) &&
6589 !ipv4_is_zeronet(entry->addr.u.ip4)) {
6590 NL_SET_ERR_MSG(extack, "IPv4 entry group address is not multicast or 0.0.0.0");
6591 return -EINVAL;
6592 }
6593 if (ipv4_is_local_multicast(entry->addr.u.ip4)) {
6594 NL_SET_ERR_MSG(extack, "IPv4 entry group address is local multicast");
6595 return -EINVAL;
6596 }
6597 #if IS_ENABLED(CONFIG_IPV6)
6598 } else if (entry->addr.proto == htons(ETH_P_IPV6)) {
6599 if (ipv6_addr_is_ll_all_nodes(&entry->addr.u.ip6)) {
6600 NL_SET_ERR_MSG(extack, "IPv6 entry group address is link-local all nodes");
6601 return -EINVAL;
6602 }
6603 #endif
6604 } else if (entry->addr.proto == 0) {
6605 /* L2 mdb */
6606 if (!is_multicast_ether_addr(entry->addr.u.mac_addr)) {
6607 NL_SET_ERR_MSG(extack, "L2 entry group is not multicast");
6608 return -EINVAL;
6609 }
6610 } else {
6611 NL_SET_ERR_MSG(extack, "Unknown entry protocol");
6612 return -EINVAL;
6613 }
6614
6615 if (entry->state != MDB_PERMANENT && entry->state != MDB_TEMPORARY) {
6616 NL_SET_ERR_MSG(extack, "Unknown entry state");
6617 return -EINVAL;
6618 }
6619 if (entry->vid >= VLAN_VID_MASK) {
6620 NL_SET_ERR_MSG(extack, "Invalid entry VLAN id");
6621 return -EINVAL;
6622 }
6623
6624 return 0;
6625 }
6626
6627 static const struct nla_policy mdba_policy[MDBA_SET_ENTRY_MAX + 1] = {
6628 [MDBA_SET_ENTRY_UNSPEC] = { .strict_start_type = MDBA_SET_ENTRY_ATTRS + 1 },
6629 [MDBA_SET_ENTRY] = NLA_POLICY_VALIDATE_FN(NLA_BINARY,
6630 rtnl_validate_mdb_entry,
6631 sizeof(struct br_mdb_entry)),
6632 [MDBA_SET_ENTRY_ATTRS] = { .type = NLA_NESTED },
6633 };
6634
rtnl_mdb_add(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)6635 static int rtnl_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
6636 struct netlink_ext_ack *extack)
6637 {
6638 struct nlattr *tb[MDBA_SET_ENTRY_MAX + 1];
6639 struct net *net = sock_net(skb->sk);
6640 struct br_port_msg *bpm;
6641 struct net_device *dev;
6642 int err;
6643
6644 err = nlmsg_parse_deprecated(nlh, sizeof(*bpm), tb,
6645 MDBA_SET_ENTRY_MAX, mdba_policy, extack);
6646 if (err)
6647 return err;
6648
6649 bpm = nlmsg_data(nlh);
6650 if (!bpm->ifindex) {
6651 NL_SET_ERR_MSG(extack, "Invalid ifindex");
6652 return -EINVAL;
6653 }
6654
6655 dev = __dev_get_by_index(net, bpm->ifindex);
6656 if (!dev) {
6657 NL_SET_ERR_MSG(extack, "Device doesn't exist");
6658 return -ENODEV;
6659 }
6660
6661 if (NL_REQ_ATTR_CHECK(extack, NULL, tb, MDBA_SET_ENTRY)) {
6662 NL_SET_ERR_MSG(extack, "Missing MDBA_SET_ENTRY attribute");
6663 return -EINVAL;
6664 }
6665
6666 if (!dev->netdev_ops->ndo_mdb_add) {
6667 NL_SET_ERR_MSG(extack, "Device does not support MDB operations");
6668 return -EOPNOTSUPP;
6669 }
6670
6671 return dev->netdev_ops->ndo_mdb_add(dev, tb, nlh->nlmsg_flags, extack);
6672 }
6673
rtnl_validate_mdb_entry_del_bulk(const struct nlattr * attr,struct netlink_ext_ack * extack)6674 static int rtnl_validate_mdb_entry_del_bulk(const struct nlattr *attr,
6675 struct netlink_ext_ack *extack)
6676 {
6677 struct br_mdb_entry *entry = nla_data(attr);
6678 struct br_mdb_entry zero_entry = {};
6679
6680 if (nla_len(attr) != sizeof(struct br_mdb_entry)) {
6681 NL_SET_ERR_MSG_ATTR(extack, attr, "Invalid attribute length");
6682 return -EINVAL;
6683 }
6684
6685 if (entry->state != MDB_PERMANENT && entry->state != MDB_TEMPORARY) {
6686 NL_SET_ERR_MSG(extack, "Unknown entry state");
6687 return -EINVAL;
6688 }
6689
6690 if (entry->flags) {
6691 NL_SET_ERR_MSG(extack, "Entry flags cannot be set");
6692 return -EINVAL;
6693 }
6694
6695 if (entry->vid >= VLAN_N_VID - 1) {
6696 NL_SET_ERR_MSG(extack, "Invalid entry VLAN id");
6697 return -EINVAL;
6698 }
6699
6700 if (memcmp(&entry->addr, &zero_entry.addr, sizeof(entry->addr))) {
6701 NL_SET_ERR_MSG(extack, "Entry address cannot be set");
6702 return -EINVAL;
6703 }
6704
6705 return 0;
6706 }
6707
6708 static const struct nla_policy mdba_del_bulk_policy[MDBA_SET_ENTRY_MAX + 1] = {
6709 [MDBA_SET_ENTRY] = NLA_POLICY_VALIDATE_FN(NLA_BINARY,
6710 rtnl_validate_mdb_entry_del_bulk,
6711 sizeof(struct br_mdb_entry)),
6712 [MDBA_SET_ENTRY_ATTRS] = { .type = NLA_NESTED },
6713 };
6714
rtnl_mdb_del(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)6715 static int rtnl_mdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
6716 struct netlink_ext_ack *extack)
6717 {
6718 bool del_bulk = !!(nlh->nlmsg_flags & NLM_F_BULK);
6719 struct nlattr *tb[MDBA_SET_ENTRY_MAX + 1];
6720 struct net *net = sock_net(skb->sk);
6721 struct br_port_msg *bpm;
6722 struct net_device *dev;
6723 int err;
6724
6725 if (!del_bulk)
6726 err = nlmsg_parse_deprecated(nlh, sizeof(*bpm), tb,
6727 MDBA_SET_ENTRY_MAX, mdba_policy,
6728 extack);
6729 else
6730 err = nlmsg_parse(nlh, sizeof(*bpm), tb, MDBA_SET_ENTRY_MAX,
6731 mdba_del_bulk_policy, extack);
6732 if (err)
6733 return err;
6734
6735 bpm = nlmsg_data(nlh);
6736 if (!bpm->ifindex) {
6737 NL_SET_ERR_MSG(extack, "Invalid ifindex");
6738 return -EINVAL;
6739 }
6740
6741 dev = __dev_get_by_index(net, bpm->ifindex);
6742 if (!dev) {
6743 NL_SET_ERR_MSG(extack, "Device doesn't exist");
6744 return -ENODEV;
6745 }
6746
6747 if (NL_REQ_ATTR_CHECK(extack, NULL, tb, MDBA_SET_ENTRY)) {
6748 NL_SET_ERR_MSG(extack, "Missing MDBA_SET_ENTRY attribute");
6749 return -EINVAL;
6750 }
6751
6752 if (del_bulk) {
6753 if (!dev->netdev_ops->ndo_mdb_del_bulk) {
6754 NL_SET_ERR_MSG(extack, "Device does not support MDB bulk deletion");
6755 return -EOPNOTSUPP;
6756 }
6757 return dev->netdev_ops->ndo_mdb_del_bulk(dev, tb, extack);
6758 }
6759
6760 if (!dev->netdev_ops->ndo_mdb_del) {
6761 NL_SET_ERR_MSG(extack, "Device does not support MDB operations");
6762 return -EOPNOTSUPP;
6763 }
6764
6765 return dev->netdev_ops->ndo_mdb_del(dev, tb, extack);
6766 }
6767
6768 /* Process one rtnetlink message. */
6769
rtnl_dumpit(struct sk_buff * skb,struct netlink_callback * cb)6770 static int rtnl_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
6771 {
6772 const bool needs_lock = !(cb->flags & RTNL_FLAG_DUMP_UNLOCKED);
6773 rtnl_dumpit_func dumpit = cb->data;
6774 int err;
6775
6776 /* Previous iteration have already finished, avoid calling->dumpit()
6777 * again, it may not expect to be called after it reached the end.
6778 */
6779 if (!dumpit)
6780 return 0;
6781
6782 if (needs_lock)
6783 rtnl_lock();
6784 err = dumpit(skb, cb);
6785 if (needs_lock)
6786 rtnl_unlock();
6787
6788 /* Old dump handlers used to send NLM_DONE as in a separate recvmsg().
6789 * Some applications which parse netlink manually depend on this.
6790 */
6791 if (cb->flags & RTNL_FLAG_DUMP_SPLIT_NLM_DONE) {
6792 if (err < 0 && err != -EMSGSIZE)
6793 return err;
6794 if (!err)
6795 cb->data = NULL;
6796
6797 return skb->len;
6798 }
6799 return err;
6800 }
6801
rtnetlink_dump_start(struct sock * ssk,struct sk_buff * skb,const struct nlmsghdr * nlh,struct netlink_dump_control * control)6802 static int rtnetlink_dump_start(struct sock *ssk, struct sk_buff *skb,
6803 const struct nlmsghdr *nlh,
6804 struct netlink_dump_control *control)
6805 {
6806 if (control->flags & RTNL_FLAG_DUMP_SPLIT_NLM_DONE ||
6807 !(control->flags & RTNL_FLAG_DUMP_UNLOCKED)) {
6808 WARN_ON(control->data);
6809 control->data = control->dump;
6810 control->dump = rtnl_dumpit;
6811 }
6812
6813 return netlink_dump_start(ssk, skb, nlh, control);
6814 }
6815
rtnetlink_rcv_msg(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)6816 static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
6817 struct netlink_ext_ack *extack)
6818 {
6819 struct net *net = sock_net(skb->sk);
6820 struct rtnl_link *link;
6821 enum rtnl_kinds kind;
6822 struct module *owner;
6823 int err = -EOPNOTSUPP;
6824 rtnl_doit_func doit;
6825 unsigned int flags;
6826 int family;
6827 int type;
6828
6829 type = nlh->nlmsg_type;
6830 if (type > RTM_MAX)
6831 return -EOPNOTSUPP;
6832
6833 type -= RTM_BASE;
6834
6835 /* All the messages must have at least 1 byte length */
6836 if (nlmsg_len(nlh) < sizeof(struct rtgenmsg))
6837 return 0;
6838
6839 family = ((struct rtgenmsg *)nlmsg_data(nlh))->rtgen_family;
6840 kind = rtnl_msgtype_kind(type);
6841
6842 if (kind != RTNL_KIND_GET && !netlink_net_capable(skb, CAP_NET_ADMIN))
6843 return -EPERM;
6844
6845 rcu_read_lock();
6846 if (kind == RTNL_KIND_GET && (nlh->nlmsg_flags & NLM_F_DUMP)) {
6847 struct sock *rtnl;
6848 rtnl_dumpit_func dumpit;
6849 u32 min_dump_alloc = 0;
6850
6851 link = rtnl_get_link(family, type);
6852 if (!link || !link->dumpit) {
6853 family = PF_UNSPEC;
6854 link = rtnl_get_link(family, type);
6855 if (!link || !link->dumpit)
6856 goto err_unlock;
6857 }
6858 owner = link->owner;
6859 dumpit = link->dumpit;
6860 flags = link->flags;
6861
6862 if (type == RTM_GETLINK - RTM_BASE)
6863 min_dump_alloc = rtnl_calcit(skb, nlh);
6864
6865 err = 0;
6866 /* need to do this before rcu_read_unlock() */
6867 if (!try_module_get(owner))
6868 err = -EPROTONOSUPPORT;
6869
6870 rcu_read_unlock();
6871
6872 rtnl = net->rtnl;
6873 if (err == 0) {
6874 struct netlink_dump_control c = {
6875 .dump = dumpit,
6876 .min_dump_alloc = min_dump_alloc,
6877 .module = owner,
6878 .flags = flags,
6879 };
6880 err = rtnetlink_dump_start(rtnl, skb, nlh, &c);
6881 /* netlink_dump_start() will keep a reference on
6882 * module if dump is still in progress.
6883 */
6884 module_put(owner);
6885 }
6886 return err;
6887 }
6888
6889 link = rtnl_get_link(family, type);
6890 if (!link || !link->doit) {
6891 family = PF_UNSPEC;
6892 link = rtnl_get_link(PF_UNSPEC, type);
6893 if (!link || !link->doit)
6894 goto out_unlock;
6895 }
6896
6897 owner = link->owner;
6898 if (!try_module_get(owner)) {
6899 err = -EPROTONOSUPPORT;
6900 goto out_unlock;
6901 }
6902
6903 flags = link->flags;
6904 if (kind == RTNL_KIND_DEL && (nlh->nlmsg_flags & NLM_F_BULK) &&
6905 !(flags & RTNL_FLAG_BULK_DEL_SUPPORTED)) {
6906 NL_SET_ERR_MSG(extack, "Bulk delete is not supported");
6907 module_put(owner);
6908 goto err_unlock;
6909 }
6910
6911 if (flags & RTNL_FLAG_DOIT_UNLOCKED) {
6912 doit = link->doit;
6913 rcu_read_unlock();
6914 if (doit)
6915 err = doit(skb, nlh, extack);
6916 module_put(owner);
6917 return err;
6918 }
6919 rcu_read_unlock();
6920
6921 rtnl_lock();
6922 link = rtnl_get_link(family, type);
6923 if (link && link->doit)
6924 err = link->doit(skb, nlh, extack);
6925 rtnl_unlock();
6926
6927 module_put(owner);
6928
6929 return err;
6930
6931 out_unlock:
6932 rcu_read_unlock();
6933 return err;
6934
6935 err_unlock:
6936 rcu_read_unlock();
6937 return -EOPNOTSUPP;
6938 }
6939
rtnetlink_rcv(struct sk_buff * skb)6940 static void rtnetlink_rcv(struct sk_buff *skb)
6941 {
6942 netlink_rcv_skb(skb, &rtnetlink_rcv_msg);
6943 }
6944
rtnetlink_bind(struct net * net,int group)6945 static int rtnetlink_bind(struct net *net, int group)
6946 {
6947 switch (group) {
6948 case RTNLGRP_IPV4_MROUTE_R:
6949 case RTNLGRP_IPV6_MROUTE_R:
6950 if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
6951 return -EPERM;
6952 break;
6953 }
6954 return 0;
6955 }
6956
rtnetlink_event(struct notifier_block * this,unsigned long event,void * ptr)6957 static int rtnetlink_event(struct notifier_block *this, unsigned long event, void *ptr)
6958 {
6959 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
6960
6961 switch (event) {
6962 case NETDEV_REBOOT:
6963 case NETDEV_CHANGEMTU:
6964 case NETDEV_CHANGEADDR:
6965 case NETDEV_CHANGENAME:
6966 case NETDEV_FEAT_CHANGE:
6967 case NETDEV_BONDING_FAILOVER:
6968 case NETDEV_POST_TYPE_CHANGE:
6969 case NETDEV_NOTIFY_PEERS:
6970 case NETDEV_CHANGEUPPER:
6971 case NETDEV_RESEND_IGMP:
6972 case NETDEV_CHANGEINFODATA:
6973 case NETDEV_CHANGELOWERSTATE:
6974 case NETDEV_CHANGE_TX_QUEUE_LEN:
6975 rtmsg_ifinfo_event(RTM_NEWLINK, dev, 0, rtnl_get_event(event),
6976 GFP_KERNEL, NULL, 0, 0, NULL);
6977 break;
6978 default:
6979 break;
6980 }
6981 return NOTIFY_DONE;
6982 }
6983
6984 static struct notifier_block rtnetlink_dev_notifier = {
6985 .notifier_call = rtnetlink_event,
6986 };
6987
6988
rtnetlink_net_init(struct net * net)6989 static int __net_init rtnetlink_net_init(struct net *net)
6990 {
6991 struct sock *sk;
6992 struct netlink_kernel_cfg cfg = {
6993 .groups = RTNLGRP_MAX,
6994 .input = rtnetlink_rcv,
6995 .flags = NL_CFG_F_NONROOT_RECV,
6996 .bind = rtnetlink_bind,
6997 };
6998
6999 sk = netlink_kernel_create(net, NETLINK_ROUTE, &cfg);
7000 if (!sk)
7001 return -ENOMEM;
7002 net->rtnl = sk;
7003 return 0;
7004 }
7005
rtnetlink_net_exit(struct net * net)7006 static void __net_exit rtnetlink_net_exit(struct net *net)
7007 {
7008 netlink_kernel_release(net->rtnl);
7009 net->rtnl = NULL;
7010 }
7011
7012 static struct pernet_operations rtnetlink_net_ops = {
7013 .init = rtnetlink_net_init,
7014 .exit = rtnetlink_net_exit,
7015 };
7016
7017 static const struct rtnl_msg_handler rtnetlink_rtnl_msg_handlers[] __initconst = {
7018 {.msgtype = RTM_NEWLINK, .doit = rtnl_newlink,
7019 .flags = RTNL_FLAG_DOIT_PERNET},
7020 {.msgtype = RTM_DELLINK, .doit = rtnl_dellink,
7021 .flags = RTNL_FLAG_DOIT_PERNET_WIP},
7022 {.msgtype = RTM_GETLINK, .doit = rtnl_getlink,
7023 .dumpit = rtnl_dump_ifinfo, .flags = RTNL_FLAG_DUMP_SPLIT_NLM_DONE},
7024 {.msgtype = RTM_SETLINK, .doit = rtnl_setlink,
7025 .flags = RTNL_FLAG_DOIT_PERNET_WIP},
7026 {.msgtype = RTM_GETADDR, .dumpit = rtnl_dump_all},
7027 {.msgtype = RTM_GETROUTE, .dumpit = rtnl_dump_all},
7028 {.msgtype = RTM_GETNETCONF, .dumpit = rtnl_dump_all},
7029 {.msgtype = RTM_GETSTATS, .doit = rtnl_stats_get,
7030 .dumpit = rtnl_stats_dump},
7031 {.msgtype = RTM_SETSTATS, .doit = rtnl_stats_set},
7032 {.msgtype = RTM_NEWLINKPROP, .doit = rtnl_newlinkprop},
7033 {.msgtype = RTM_DELLINKPROP, .doit = rtnl_dellinkprop},
7034 {.protocol = PF_BRIDGE, .msgtype = RTM_GETLINK,
7035 .dumpit = rtnl_bridge_getlink},
7036 {.protocol = PF_BRIDGE, .msgtype = RTM_DELLINK,
7037 .doit = rtnl_bridge_dellink},
7038 {.protocol = PF_BRIDGE, .msgtype = RTM_SETLINK,
7039 .doit = rtnl_bridge_setlink},
7040 {.protocol = PF_BRIDGE, .msgtype = RTM_NEWNEIGH, .doit = rtnl_fdb_add},
7041 {.protocol = PF_BRIDGE, .msgtype = RTM_DELNEIGH, .doit = rtnl_fdb_del,
7042 .flags = RTNL_FLAG_BULK_DEL_SUPPORTED},
7043 {.protocol = PF_BRIDGE, .msgtype = RTM_GETNEIGH, .doit = rtnl_fdb_get,
7044 .dumpit = rtnl_fdb_dump},
7045 {.protocol = PF_BRIDGE, .msgtype = RTM_NEWMDB, .doit = rtnl_mdb_add},
7046 {.protocol = PF_BRIDGE, .msgtype = RTM_DELMDB, .doit = rtnl_mdb_del,
7047 .flags = RTNL_FLAG_BULK_DEL_SUPPORTED},
7048 {.protocol = PF_BRIDGE, .msgtype = RTM_GETMDB, .doit = rtnl_mdb_get,
7049 .dumpit = rtnl_mdb_dump},
7050 };
7051
rtnetlink_init(void)7052 void __init rtnetlink_init(void)
7053 {
7054 if (register_pernet_subsys(&rtnetlink_net_ops))
7055 panic("rtnetlink_init: cannot initialize rtnetlink\n");
7056
7057 register_netdevice_notifier(&rtnetlink_dev_notifier);
7058
7059 rtnl_register_many(rtnetlink_rtnl_msg_handlers);
7060 }
7061