]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - net/ipv6/ip6mr.c
Merge tag 'devicetree-fixes-for-5.7' of git://git.kernel.org/pub/scm/linux/kernel...
[mirror_ubuntu-jammy-kernel.git] / net / ipv6 / ip6mr.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Linux IPv6 multicast routing support for BSD pim6sd
4 * Based on net/ipv4/ipmr.c.
5 *
6 * (c) 2004 Mickael Hoerdt, <hoerdt@clarinet.u-strasbg.fr>
7 * LSIIT Laboratory, Strasbourg, France
8 * (c) 2004 Jean-Philippe Andriot, <jean-philippe.andriot@6WIND.com>
9 * 6WIND, Paris, France
10 * Copyright (C)2007,2008 USAGI/WIDE Project
11 * YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
12 */
13
14 #include <linux/uaccess.h>
15 #include <linux/types.h>
16 #include <linux/sched.h>
17 #include <linux/errno.h>
18 #include <linux/mm.h>
19 #include <linux/kernel.h>
20 #include <linux/fcntl.h>
21 #include <linux/stat.h>
22 #include <linux/socket.h>
23 #include <linux/inet.h>
24 #include <linux/netdevice.h>
25 #include <linux/inetdevice.h>
26 #include <linux/proc_fs.h>
27 #include <linux/seq_file.h>
28 #include <linux/init.h>
29 #include <linux/compat.h>
30 #include <linux/rhashtable.h>
31 #include <net/protocol.h>
32 #include <linux/skbuff.h>
33 #include <net/raw.h>
34 #include <linux/notifier.h>
35 #include <linux/if_arp.h>
36 #include <net/checksum.h>
37 #include <net/netlink.h>
38 #include <net/fib_rules.h>
39
40 #include <net/ipv6.h>
41 #include <net/ip6_route.h>
42 #include <linux/mroute6.h>
43 #include <linux/pim.h>
44 #include <net/addrconf.h>
45 #include <linux/netfilter_ipv6.h>
46 #include <linux/export.h>
47 #include <net/ip6_checksum.h>
48 #include <linux/netconf.h>
49 #include <net/ip_tunnels.h>
50
51 #include <linux/nospec.h>
52
53 struct ip6mr_rule {
54 struct fib_rule common;
55 };
56
57 struct ip6mr_result {
58 struct mr_table *mrt;
59 };
60
61 /* Big lock, protecting vif table, mrt cache and mroute socket state.
62 Note that the changes are semaphored via rtnl_lock.
63 */
64
65 static DEFINE_RWLOCK(mrt_lock);
66
67 /* Multicast router control variables */
68
69 /* Special spinlock for queue of unresolved entries */
70 static DEFINE_SPINLOCK(mfc_unres_lock);
71
72 /* We return to original Alan's scheme. Hash table of resolved
73 entries is changed only in process context and protected
74 with weak lock mrt_lock. Queue of unresolved entries is protected
75 with strong spinlock mfc_unres_lock.
76
77 In this case data path is free of exclusive locks at all.
78 */
79
80 static struct kmem_cache *mrt_cachep __read_mostly;
81
82 static struct mr_table *ip6mr_new_table(struct net *net, u32 id);
83 static void ip6mr_free_table(struct mr_table *mrt);
84
85 static void ip6_mr_forward(struct net *net, struct mr_table *mrt,
86 struct net_device *dev, struct sk_buff *skb,
87 struct mfc6_cache *cache);
88 static int ip6mr_cache_report(struct mr_table *mrt, struct sk_buff *pkt,
89 mifi_t mifi, int assert);
90 static void mr6_netlink_event(struct mr_table *mrt, struct mfc6_cache *mfc,
91 int cmd);
92 static void mrt6msg_netlink_event(struct mr_table *mrt, struct sk_buff *pkt);
93 static int ip6mr_rtm_dumproute(struct sk_buff *skb,
94 struct netlink_callback *cb);
95 static void mroute_clean_tables(struct mr_table *mrt, int flags);
96 static void ipmr_expire_process(struct timer_list *t);
97
98 #ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES
99 #define ip6mr_for_each_table(mrt, net) \
100 list_for_each_entry_rcu(mrt, &net->ipv6.mr6_tables, list, \
101 lockdep_rtnl_is_held())
102
103 static struct mr_table *ip6mr_mr_table_iter(struct net *net,
104 struct mr_table *mrt)
105 {
106 struct mr_table *ret;
107
108 if (!mrt)
109 ret = list_entry_rcu(net->ipv6.mr6_tables.next,
110 struct mr_table, list);
111 else
112 ret = list_entry_rcu(mrt->list.next,
113 struct mr_table, list);
114
115 if (&ret->list == &net->ipv6.mr6_tables)
116 return NULL;
117 return ret;
118 }
119
120 static struct mr_table *ip6mr_get_table(struct net *net, u32 id)
121 {
122 struct mr_table *mrt;
123
124 ip6mr_for_each_table(mrt, net) {
125 if (mrt->id == id)
126 return mrt;
127 }
128 return NULL;
129 }
130
131 static int ip6mr_fib_lookup(struct net *net, struct flowi6 *flp6,
132 struct mr_table **mrt)
133 {
134 int err;
135 struct ip6mr_result res;
136 struct fib_lookup_arg arg = {
137 .result = &res,
138 .flags = FIB_LOOKUP_NOREF,
139 };
140
141 /* update flow if oif or iif point to device enslaved to l3mdev */
142 l3mdev_update_flow(net, flowi6_to_flowi(flp6));
143
144 err = fib_rules_lookup(net->ipv6.mr6_rules_ops,
145 flowi6_to_flowi(flp6), 0, &arg);
146 if (err < 0)
147 return err;
148 *mrt = res.mrt;
149 return 0;
150 }
151
152 static int ip6mr_rule_action(struct fib_rule *rule, struct flowi *flp,
153 int flags, struct fib_lookup_arg *arg)
154 {
155 struct ip6mr_result *res = arg->result;
156 struct mr_table *mrt;
157
158 switch (rule->action) {
159 case FR_ACT_TO_TBL:
160 break;
161 case FR_ACT_UNREACHABLE:
162 return -ENETUNREACH;
163 case FR_ACT_PROHIBIT:
164 return -EACCES;
165 case FR_ACT_BLACKHOLE:
166 default:
167 return -EINVAL;
168 }
169
170 arg->table = fib_rule_get_table(rule, arg);
171
172 mrt = ip6mr_get_table(rule->fr_net, arg->table);
173 if (!mrt)
174 return -EAGAIN;
175 res->mrt = mrt;
176 return 0;
177 }
178
179 static int ip6mr_rule_match(struct fib_rule *rule, struct flowi *flp, int flags)
180 {
181 return 1;
182 }
183
184 static const struct nla_policy ip6mr_rule_policy[FRA_MAX + 1] = {
185 FRA_GENERIC_POLICY,
186 };
187
188 static int ip6mr_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
189 struct fib_rule_hdr *frh, struct nlattr **tb,
190 struct netlink_ext_ack *extack)
191 {
192 return 0;
193 }
194
195 static int ip6mr_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh,
196 struct nlattr **tb)
197 {
198 return 1;
199 }
200
201 static int ip6mr_rule_fill(struct fib_rule *rule, struct sk_buff *skb,
202 struct fib_rule_hdr *frh)
203 {
204 frh->dst_len = 0;
205 frh->src_len = 0;
206 frh->tos = 0;
207 return 0;
208 }
209
210 static const struct fib_rules_ops __net_initconst ip6mr_rules_ops_template = {
211 .family = RTNL_FAMILY_IP6MR,
212 .rule_size = sizeof(struct ip6mr_rule),
213 .addr_size = sizeof(struct in6_addr),
214 .action = ip6mr_rule_action,
215 .match = ip6mr_rule_match,
216 .configure = ip6mr_rule_configure,
217 .compare = ip6mr_rule_compare,
218 .fill = ip6mr_rule_fill,
219 .nlgroup = RTNLGRP_IPV6_RULE,
220 .policy = ip6mr_rule_policy,
221 .owner = THIS_MODULE,
222 };
223
224 static int __net_init ip6mr_rules_init(struct net *net)
225 {
226 struct fib_rules_ops *ops;
227 struct mr_table *mrt;
228 int err;
229
230 ops = fib_rules_register(&ip6mr_rules_ops_template, net);
231 if (IS_ERR(ops))
232 return PTR_ERR(ops);
233
234 INIT_LIST_HEAD(&net->ipv6.mr6_tables);
235
236 mrt = ip6mr_new_table(net, RT6_TABLE_DFLT);
237 if (IS_ERR(mrt)) {
238 err = PTR_ERR(mrt);
239 goto err1;
240 }
241
242 err = fib_default_rule_add(ops, 0x7fff, RT6_TABLE_DFLT, 0);
243 if (err < 0)
244 goto err2;
245
246 net->ipv6.mr6_rules_ops = ops;
247 return 0;
248
249 err2:
250 ip6mr_free_table(mrt);
251 err1:
252 fib_rules_unregister(ops);
253 return err;
254 }
255
256 static void __net_exit ip6mr_rules_exit(struct net *net)
257 {
258 struct mr_table *mrt, *next;
259
260 rtnl_lock();
261 list_for_each_entry_safe(mrt, next, &net->ipv6.mr6_tables, list) {
262 list_del(&mrt->list);
263 ip6mr_free_table(mrt);
264 }
265 fib_rules_unregister(net->ipv6.mr6_rules_ops);
266 rtnl_unlock();
267 }
268
269 static int ip6mr_rules_dump(struct net *net, struct notifier_block *nb,
270 struct netlink_ext_ack *extack)
271 {
272 return fib_rules_dump(net, nb, RTNL_FAMILY_IP6MR, extack);
273 }
274
275 static unsigned int ip6mr_rules_seq_read(struct net *net)
276 {
277 return fib_rules_seq_read(net, RTNL_FAMILY_IP6MR);
278 }
279
280 bool ip6mr_rule_default(const struct fib_rule *rule)
281 {
282 return fib_rule_matchall(rule) && rule->action == FR_ACT_TO_TBL &&
283 rule->table == RT6_TABLE_DFLT && !rule->l3mdev;
284 }
285 EXPORT_SYMBOL(ip6mr_rule_default);
286 #else
287 #define ip6mr_for_each_table(mrt, net) \
288 for (mrt = net->ipv6.mrt6; mrt; mrt = NULL)
289
290 static struct mr_table *ip6mr_mr_table_iter(struct net *net,
291 struct mr_table *mrt)
292 {
293 if (!mrt)
294 return net->ipv6.mrt6;
295 return NULL;
296 }
297
298 static struct mr_table *ip6mr_get_table(struct net *net, u32 id)
299 {
300 return net->ipv6.mrt6;
301 }
302
303 static int ip6mr_fib_lookup(struct net *net, struct flowi6 *flp6,
304 struct mr_table **mrt)
305 {
306 *mrt = net->ipv6.mrt6;
307 return 0;
308 }
309
310 static int __net_init ip6mr_rules_init(struct net *net)
311 {
312 struct mr_table *mrt;
313
314 mrt = ip6mr_new_table(net, RT6_TABLE_DFLT);
315 if (IS_ERR(mrt))
316 return PTR_ERR(mrt);
317 net->ipv6.mrt6 = mrt;
318 return 0;
319 }
320
321 static void __net_exit ip6mr_rules_exit(struct net *net)
322 {
323 rtnl_lock();
324 ip6mr_free_table(net->ipv6.mrt6);
325 net->ipv6.mrt6 = NULL;
326 rtnl_unlock();
327 }
328
329 static int ip6mr_rules_dump(struct net *net, struct notifier_block *nb,
330 struct netlink_ext_ack *extack)
331 {
332 return 0;
333 }
334
335 static unsigned int ip6mr_rules_seq_read(struct net *net)
336 {
337 return 0;
338 }
339 #endif
340
341 static int ip6mr_hash_cmp(struct rhashtable_compare_arg *arg,
342 const void *ptr)
343 {
344 const struct mfc6_cache_cmp_arg *cmparg = arg->key;
345 struct mfc6_cache *c = (struct mfc6_cache *)ptr;
346
347 return !ipv6_addr_equal(&c->mf6c_mcastgrp, &cmparg->mf6c_mcastgrp) ||
348 !ipv6_addr_equal(&c->mf6c_origin, &cmparg->mf6c_origin);
349 }
350
351 static const struct rhashtable_params ip6mr_rht_params = {
352 .head_offset = offsetof(struct mr_mfc, mnode),
353 .key_offset = offsetof(struct mfc6_cache, cmparg),
354 .key_len = sizeof(struct mfc6_cache_cmp_arg),
355 .nelem_hint = 3,
356 .obj_cmpfn = ip6mr_hash_cmp,
357 .automatic_shrinking = true,
358 };
359
360 static void ip6mr_new_table_set(struct mr_table *mrt,
361 struct net *net)
362 {
363 #ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES
364 list_add_tail_rcu(&mrt->list, &net->ipv6.mr6_tables);
365 #endif
366 }
367
368 static struct mfc6_cache_cmp_arg ip6mr_mr_table_ops_cmparg_any = {
369 .mf6c_origin = IN6ADDR_ANY_INIT,
370 .mf6c_mcastgrp = IN6ADDR_ANY_INIT,
371 };
372
373 static struct mr_table_ops ip6mr_mr_table_ops = {
374 .rht_params = &ip6mr_rht_params,
375 .cmparg_any = &ip6mr_mr_table_ops_cmparg_any,
376 };
377
378 static struct mr_table *ip6mr_new_table(struct net *net, u32 id)
379 {
380 struct mr_table *mrt;
381
382 mrt = ip6mr_get_table(net, id);
383 if (mrt)
384 return mrt;
385
386 return mr_table_alloc(net, id, &ip6mr_mr_table_ops,
387 ipmr_expire_process, ip6mr_new_table_set);
388 }
389
390 static void ip6mr_free_table(struct mr_table *mrt)
391 {
392 del_timer_sync(&mrt->ipmr_expire_timer);
393 mroute_clean_tables(mrt, MRT6_FLUSH_MIFS | MRT6_FLUSH_MIFS_STATIC |
394 MRT6_FLUSH_MFC | MRT6_FLUSH_MFC_STATIC);
395 rhltable_destroy(&mrt->mfc_hash);
396 kfree(mrt);
397 }
398
399 #ifdef CONFIG_PROC_FS
400 /* The /proc interfaces to multicast routing
401 * /proc/ip6_mr_cache /proc/ip6_mr_vif
402 */
403
404 static void *ip6mr_vif_seq_start(struct seq_file *seq, loff_t *pos)
405 __acquires(mrt_lock)
406 {
407 struct mr_vif_iter *iter = seq->private;
408 struct net *net = seq_file_net(seq);
409 struct mr_table *mrt;
410
411 mrt = ip6mr_get_table(net, RT6_TABLE_DFLT);
412 if (!mrt)
413 return ERR_PTR(-ENOENT);
414
415 iter->mrt = mrt;
416
417 read_lock(&mrt_lock);
418 return mr_vif_seq_start(seq, pos);
419 }
420
421 static void ip6mr_vif_seq_stop(struct seq_file *seq, void *v)
422 __releases(mrt_lock)
423 {
424 read_unlock(&mrt_lock);
425 }
426
427 static int ip6mr_vif_seq_show(struct seq_file *seq, void *v)
428 {
429 struct mr_vif_iter *iter = seq->private;
430 struct mr_table *mrt = iter->mrt;
431
432 if (v == SEQ_START_TOKEN) {
433 seq_puts(seq,
434 "Interface BytesIn PktsIn BytesOut PktsOut Flags\n");
435 } else {
436 const struct vif_device *vif = v;
437 const char *name = vif->dev ? vif->dev->name : "none";
438
439 seq_printf(seq,
440 "%2td %-10s %8ld %7ld %8ld %7ld %05X\n",
441 vif - mrt->vif_table,
442 name, vif->bytes_in, vif->pkt_in,
443 vif->bytes_out, vif->pkt_out,
444 vif->flags);
445 }
446 return 0;
447 }
448
449 static const struct seq_operations ip6mr_vif_seq_ops = {
450 .start = ip6mr_vif_seq_start,
451 .next = mr_vif_seq_next,
452 .stop = ip6mr_vif_seq_stop,
453 .show = ip6mr_vif_seq_show,
454 };
455
456 static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos)
457 {
458 struct net *net = seq_file_net(seq);
459 struct mr_table *mrt;
460
461 mrt = ip6mr_get_table(net, RT6_TABLE_DFLT);
462 if (!mrt)
463 return ERR_PTR(-ENOENT);
464
465 return mr_mfc_seq_start(seq, pos, mrt, &mfc_unres_lock);
466 }
467
468 static int ipmr_mfc_seq_show(struct seq_file *seq, void *v)
469 {
470 int n;
471
472 if (v == SEQ_START_TOKEN) {
473 seq_puts(seq,
474 "Group "
475 "Origin "
476 "Iif Pkts Bytes Wrong Oifs\n");
477 } else {
478 const struct mfc6_cache *mfc = v;
479 const struct mr_mfc_iter *it = seq->private;
480 struct mr_table *mrt = it->mrt;
481
482 seq_printf(seq, "%pI6 %pI6 %-3hd",
483 &mfc->mf6c_mcastgrp, &mfc->mf6c_origin,
484 mfc->_c.mfc_parent);
485
486 if (it->cache != &mrt->mfc_unres_queue) {
487 seq_printf(seq, " %8lu %8lu %8lu",
488 mfc->_c.mfc_un.res.pkt,
489 mfc->_c.mfc_un.res.bytes,
490 mfc->_c.mfc_un.res.wrong_if);
491 for (n = mfc->_c.mfc_un.res.minvif;
492 n < mfc->_c.mfc_un.res.maxvif; n++) {
493 if (VIF_EXISTS(mrt, n) &&
494 mfc->_c.mfc_un.res.ttls[n] < 255)
495 seq_printf(seq,
496 " %2d:%-3d", n,
497 mfc->_c.mfc_un.res.ttls[n]);
498 }
499 } else {
500 /* unresolved mfc_caches don't contain
501 * pkt, bytes and wrong_if values
502 */
503 seq_printf(seq, " %8lu %8lu %8lu", 0ul, 0ul, 0ul);
504 }
505 seq_putc(seq, '\n');
506 }
507 return 0;
508 }
509
510 static const struct seq_operations ipmr_mfc_seq_ops = {
511 .start = ipmr_mfc_seq_start,
512 .next = mr_mfc_seq_next,
513 .stop = mr_mfc_seq_stop,
514 .show = ipmr_mfc_seq_show,
515 };
516 #endif
517
518 #ifdef CONFIG_IPV6_PIMSM_V2
519
520 static int pim6_rcv(struct sk_buff *skb)
521 {
522 struct pimreghdr *pim;
523 struct ipv6hdr *encap;
524 struct net_device *reg_dev = NULL;
525 struct net *net = dev_net(skb->dev);
526 struct mr_table *mrt;
527 struct flowi6 fl6 = {
528 .flowi6_iif = skb->dev->ifindex,
529 .flowi6_mark = skb->mark,
530 };
531 int reg_vif_num;
532
533 if (!pskb_may_pull(skb, sizeof(*pim) + sizeof(*encap)))
534 goto drop;
535
536 pim = (struct pimreghdr *)skb_transport_header(skb);
537 if (pim->type != ((PIM_VERSION << 4) | PIM_TYPE_REGISTER) ||
538 (pim->flags & PIM_NULL_REGISTER) ||
539 (csum_ipv6_magic(&ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr,
540 sizeof(*pim), IPPROTO_PIM,
541 csum_partial((void *)pim, sizeof(*pim), 0)) &&
542 csum_fold(skb_checksum(skb, 0, skb->len, 0))))
543 goto drop;
544
545 /* check if the inner packet is destined to mcast group */
546 encap = (struct ipv6hdr *)(skb_transport_header(skb) +
547 sizeof(*pim));
548
549 if (!ipv6_addr_is_multicast(&encap->daddr) ||
550 encap->payload_len == 0 ||
551 ntohs(encap->payload_len) + sizeof(*pim) > skb->len)
552 goto drop;
553
554 if (ip6mr_fib_lookup(net, &fl6, &mrt) < 0)
555 goto drop;
556 reg_vif_num = mrt->mroute_reg_vif_num;
557
558 read_lock(&mrt_lock);
559 if (reg_vif_num >= 0)
560 reg_dev = mrt->vif_table[reg_vif_num].dev;
561 if (reg_dev)
562 dev_hold(reg_dev);
563 read_unlock(&mrt_lock);
564
565 if (!reg_dev)
566 goto drop;
567
568 skb->mac_header = skb->network_header;
569 skb_pull(skb, (u8 *)encap - skb->data);
570 skb_reset_network_header(skb);
571 skb->protocol = htons(ETH_P_IPV6);
572 skb->ip_summed = CHECKSUM_NONE;
573
574 skb_tunnel_rx(skb, reg_dev, dev_net(reg_dev));
575
576 netif_rx(skb);
577
578 dev_put(reg_dev);
579 return 0;
580 drop:
581 kfree_skb(skb);
582 return 0;
583 }
584
585 static const struct inet6_protocol pim6_protocol = {
586 .handler = pim6_rcv,
587 };
588
589 /* Service routines creating virtual interfaces: PIMREG */
590
591 static netdev_tx_t reg_vif_xmit(struct sk_buff *skb,
592 struct net_device *dev)
593 {
594 struct net *net = dev_net(dev);
595 struct mr_table *mrt;
596 struct flowi6 fl6 = {
597 .flowi6_oif = dev->ifindex,
598 .flowi6_iif = skb->skb_iif ? : LOOPBACK_IFINDEX,
599 .flowi6_mark = skb->mark,
600 };
601
602 if (!pskb_inet_may_pull(skb))
603 goto tx_err;
604
605 if (ip6mr_fib_lookup(net, &fl6, &mrt) < 0)
606 goto tx_err;
607
608 read_lock(&mrt_lock);
609 dev->stats.tx_bytes += skb->len;
610 dev->stats.tx_packets++;
611 ip6mr_cache_report(mrt, skb, mrt->mroute_reg_vif_num, MRT6MSG_WHOLEPKT);
612 read_unlock(&mrt_lock);
613 kfree_skb(skb);
614 return NETDEV_TX_OK;
615
616 tx_err:
617 dev->stats.tx_errors++;
618 kfree_skb(skb);
619 return NETDEV_TX_OK;
620 }
621
622 static int reg_vif_get_iflink(const struct net_device *dev)
623 {
624 return 0;
625 }
626
627 static const struct net_device_ops reg_vif_netdev_ops = {
628 .ndo_start_xmit = reg_vif_xmit,
629 .ndo_get_iflink = reg_vif_get_iflink,
630 };
631
632 static void reg_vif_setup(struct net_device *dev)
633 {
634 dev->type = ARPHRD_PIMREG;
635 dev->mtu = 1500 - sizeof(struct ipv6hdr) - 8;
636 dev->flags = IFF_NOARP;
637 dev->netdev_ops = &reg_vif_netdev_ops;
638 dev->needs_free_netdev = true;
639 dev->features |= NETIF_F_NETNS_LOCAL;
640 }
641
642 static struct net_device *ip6mr_reg_vif(struct net *net, struct mr_table *mrt)
643 {
644 struct net_device *dev;
645 char name[IFNAMSIZ];
646
647 if (mrt->id == RT6_TABLE_DFLT)
648 sprintf(name, "pim6reg");
649 else
650 sprintf(name, "pim6reg%u", mrt->id);
651
652 dev = alloc_netdev(0, name, NET_NAME_UNKNOWN, reg_vif_setup);
653 if (!dev)
654 return NULL;
655
656 dev_net_set(dev, net);
657
658 if (register_netdevice(dev)) {
659 free_netdev(dev);
660 return NULL;
661 }
662
663 if (dev_open(dev, NULL))
664 goto failure;
665
666 dev_hold(dev);
667 return dev;
668
669 failure:
670 unregister_netdevice(dev);
671 return NULL;
672 }
673 #endif
674
675 static int call_ip6mr_vif_entry_notifiers(struct net *net,
676 enum fib_event_type event_type,
677 struct vif_device *vif,
678 mifi_t vif_index, u32 tb_id)
679 {
680 return mr_call_vif_notifiers(net, RTNL_FAMILY_IP6MR, event_type,
681 vif, vif_index, tb_id,
682 &net->ipv6.ipmr_seq);
683 }
684
685 static int call_ip6mr_mfc_entry_notifiers(struct net *net,
686 enum fib_event_type event_type,
687 struct mfc6_cache *mfc, u32 tb_id)
688 {
689 return mr_call_mfc_notifiers(net, RTNL_FAMILY_IP6MR, event_type,
690 &mfc->_c, tb_id, &net->ipv6.ipmr_seq);
691 }
692
693 /* Delete a VIF entry */
694 static int mif6_delete(struct mr_table *mrt, int vifi, int notify,
695 struct list_head *head)
696 {
697 struct vif_device *v;
698 struct net_device *dev;
699 struct inet6_dev *in6_dev;
700
701 if (vifi < 0 || vifi >= mrt->maxvif)
702 return -EADDRNOTAVAIL;
703
704 v = &mrt->vif_table[vifi];
705
706 if (VIF_EXISTS(mrt, vifi))
707 call_ip6mr_vif_entry_notifiers(read_pnet(&mrt->net),
708 FIB_EVENT_VIF_DEL, v, vifi,
709 mrt->id);
710
711 write_lock_bh(&mrt_lock);
712 dev = v->dev;
713 v->dev = NULL;
714
715 if (!dev) {
716 write_unlock_bh(&mrt_lock);
717 return -EADDRNOTAVAIL;
718 }
719
720 #ifdef CONFIG_IPV6_PIMSM_V2
721 if (vifi == mrt->mroute_reg_vif_num)
722 mrt->mroute_reg_vif_num = -1;
723 #endif
724
725 if (vifi + 1 == mrt->maxvif) {
726 int tmp;
727 for (tmp = vifi - 1; tmp >= 0; tmp--) {
728 if (VIF_EXISTS(mrt, tmp))
729 break;
730 }
731 mrt->maxvif = tmp + 1;
732 }
733
734 write_unlock_bh(&mrt_lock);
735
736 dev_set_allmulti(dev, -1);
737
738 in6_dev = __in6_dev_get(dev);
739 if (in6_dev) {
740 in6_dev->cnf.mc_forwarding--;
741 inet6_netconf_notify_devconf(dev_net(dev), RTM_NEWNETCONF,
742 NETCONFA_MC_FORWARDING,
743 dev->ifindex, &in6_dev->cnf);
744 }
745
746 if ((v->flags & MIFF_REGISTER) && !notify)
747 unregister_netdevice_queue(dev, head);
748
749 dev_put(dev);
750 return 0;
751 }
752
753 static inline void ip6mr_cache_free_rcu(struct rcu_head *head)
754 {
755 struct mr_mfc *c = container_of(head, struct mr_mfc, rcu);
756
757 kmem_cache_free(mrt_cachep, (struct mfc6_cache *)c);
758 }
759
760 static inline void ip6mr_cache_free(struct mfc6_cache *c)
761 {
762 call_rcu(&c->_c.rcu, ip6mr_cache_free_rcu);
763 }
764
765 /* Destroy an unresolved cache entry, killing queued skbs
766 and reporting error to netlink readers.
767 */
768
769 static void ip6mr_destroy_unres(struct mr_table *mrt, struct mfc6_cache *c)
770 {
771 struct net *net = read_pnet(&mrt->net);
772 struct sk_buff *skb;
773
774 atomic_dec(&mrt->cache_resolve_queue_len);
775
776 while ((skb = skb_dequeue(&c->_c.mfc_un.unres.unresolved)) != NULL) {
777 if (ipv6_hdr(skb)->version == 0) {
778 struct nlmsghdr *nlh = skb_pull(skb,
779 sizeof(struct ipv6hdr));
780 nlh->nlmsg_type = NLMSG_ERROR;
781 nlh->nlmsg_len = nlmsg_msg_size(sizeof(struct nlmsgerr));
782 skb_trim(skb, nlh->nlmsg_len);
783 ((struct nlmsgerr *)nlmsg_data(nlh))->error = -ETIMEDOUT;
784 rtnl_unicast(skb, net, NETLINK_CB(skb).portid);
785 } else
786 kfree_skb(skb);
787 }
788
789 ip6mr_cache_free(c);
790 }
791
792
793 /* Timer process for all the unresolved queue. */
794
795 static void ipmr_do_expire_process(struct mr_table *mrt)
796 {
797 unsigned long now = jiffies;
798 unsigned long expires = 10 * HZ;
799 struct mr_mfc *c, *next;
800
801 list_for_each_entry_safe(c, next, &mrt->mfc_unres_queue, list) {
802 if (time_after(c->mfc_un.unres.expires, now)) {
803 /* not yet... */
804 unsigned long interval = c->mfc_un.unres.expires - now;
805 if (interval < expires)
806 expires = interval;
807 continue;
808 }
809
810 list_del(&c->list);
811 mr6_netlink_event(mrt, (struct mfc6_cache *)c, RTM_DELROUTE);
812 ip6mr_destroy_unres(mrt, (struct mfc6_cache *)c);
813 }
814
815 if (!list_empty(&mrt->mfc_unres_queue))
816 mod_timer(&mrt->ipmr_expire_timer, jiffies + expires);
817 }
818
819 static void ipmr_expire_process(struct timer_list *t)
820 {
821 struct mr_table *mrt = from_timer(mrt, t, ipmr_expire_timer);
822
823 if (!spin_trylock(&mfc_unres_lock)) {
824 mod_timer(&mrt->ipmr_expire_timer, jiffies + 1);
825 return;
826 }
827
828 if (!list_empty(&mrt->mfc_unres_queue))
829 ipmr_do_expire_process(mrt);
830
831 spin_unlock(&mfc_unres_lock);
832 }
833
834 /* Fill oifs list. It is called under write locked mrt_lock. */
835
836 static void ip6mr_update_thresholds(struct mr_table *mrt,
837 struct mr_mfc *cache,
838 unsigned char *ttls)
839 {
840 int vifi;
841
842 cache->mfc_un.res.minvif = MAXMIFS;
843 cache->mfc_un.res.maxvif = 0;
844 memset(cache->mfc_un.res.ttls, 255, MAXMIFS);
845
846 for (vifi = 0; vifi < mrt->maxvif; vifi++) {
847 if (VIF_EXISTS(mrt, vifi) &&
848 ttls[vifi] && ttls[vifi] < 255) {
849 cache->mfc_un.res.ttls[vifi] = ttls[vifi];
850 if (cache->mfc_un.res.minvif > vifi)
851 cache->mfc_un.res.minvif = vifi;
852 if (cache->mfc_un.res.maxvif <= vifi)
853 cache->mfc_un.res.maxvif = vifi + 1;
854 }
855 }
856 cache->mfc_un.res.lastuse = jiffies;
857 }
858
859 static int mif6_add(struct net *net, struct mr_table *mrt,
860 struct mif6ctl *vifc, int mrtsock)
861 {
862 int vifi = vifc->mif6c_mifi;
863 struct vif_device *v = &mrt->vif_table[vifi];
864 struct net_device *dev;
865 struct inet6_dev *in6_dev;
866 int err;
867
868 /* Is vif busy ? */
869 if (VIF_EXISTS(mrt, vifi))
870 return -EADDRINUSE;
871
872 switch (vifc->mif6c_flags) {
873 #ifdef CONFIG_IPV6_PIMSM_V2
874 case MIFF_REGISTER:
875 /*
876 * Special Purpose VIF in PIM
877 * All the packets will be sent to the daemon
878 */
879 if (mrt->mroute_reg_vif_num >= 0)
880 return -EADDRINUSE;
881 dev = ip6mr_reg_vif(net, mrt);
882 if (!dev)
883 return -ENOBUFS;
884 err = dev_set_allmulti(dev, 1);
885 if (err) {
886 unregister_netdevice(dev);
887 dev_put(dev);
888 return err;
889 }
890 break;
891 #endif
892 case 0:
893 dev = dev_get_by_index(net, vifc->mif6c_pifi);
894 if (!dev)
895 return -EADDRNOTAVAIL;
896 err = dev_set_allmulti(dev, 1);
897 if (err) {
898 dev_put(dev);
899 return err;
900 }
901 break;
902 default:
903 return -EINVAL;
904 }
905
906 in6_dev = __in6_dev_get(dev);
907 if (in6_dev) {
908 in6_dev->cnf.mc_forwarding++;
909 inet6_netconf_notify_devconf(dev_net(dev), RTM_NEWNETCONF,
910 NETCONFA_MC_FORWARDING,
911 dev->ifindex, &in6_dev->cnf);
912 }
913
914 /* Fill in the VIF structures */
915 vif_device_init(v, dev, vifc->vifc_rate_limit, vifc->vifc_threshold,
916 vifc->mif6c_flags | (!mrtsock ? VIFF_STATIC : 0),
917 MIFF_REGISTER);
918
919 /* And finish update writing critical data */
920 write_lock_bh(&mrt_lock);
921 v->dev = dev;
922 #ifdef CONFIG_IPV6_PIMSM_V2
923 if (v->flags & MIFF_REGISTER)
924 mrt->mroute_reg_vif_num = vifi;
925 #endif
926 if (vifi + 1 > mrt->maxvif)
927 mrt->maxvif = vifi + 1;
928 write_unlock_bh(&mrt_lock);
929 call_ip6mr_vif_entry_notifiers(net, FIB_EVENT_VIF_ADD,
930 v, vifi, mrt->id);
931 return 0;
932 }
933
934 static struct mfc6_cache *ip6mr_cache_find(struct mr_table *mrt,
935 const struct in6_addr *origin,
936 const struct in6_addr *mcastgrp)
937 {
938 struct mfc6_cache_cmp_arg arg = {
939 .mf6c_origin = *origin,
940 .mf6c_mcastgrp = *mcastgrp,
941 };
942
943 return mr_mfc_find(mrt, &arg);
944 }
945
946 /* Look for a (*,G) entry */
947 static struct mfc6_cache *ip6mr_cache_find_any(struct mr_table *mrt,
948 struct in6_addr *mcastgrp,
949 mifi_t mifi)
950 {
951 struct mfc6_cache_cmp_arg arg = {
952 .mf6c_origin = in6addr_any,
953 .mf6c_mcastgrp = *mcastgrp,
954 };
955
956 if (ipv6_addr_any(mcastgrp))
957 return mr_mfc_find_any_parent(mrt, mifi);
958 return mr_mfc_find_any(mrt, mifi, &arg);
959 }
960
961 /* Look for a (S,G,iif) entry if parent != -1 */
962 static struct mfc6_cache *
963 ip6mr_cache_find_parent(struct mr_table *mrt,
964 const struct in6_addr *origin,
965 const struct in6_addr *mcastgrp,
966 int parent)
967 {
968 struct mfc6_cache_cmp_arg arg = {
969 .mf6c_origin = *origin,
970 .mf6c_mcastgrp = *mcastgrp,
971 };
972
973 return mr_mfc_find_parent(mrt, &arg, parent);
974 }
975
976 /* Allocate a multicast cache entry */
977 static struct mfc6_cache *ip6mr_cache_alloc(void)
978 {
979 struct mfc6_cache *c = kmem_cache_zalloc(mrt_cachep, GFP_KERNEL);
980 if (!c)
981 return NULL;
982 c->_c.mfc_un.res.last_assert = jiffies - MFC_ASSERT_THRESH - 1;
983 c->_c.mfc_un.res.minvif = MAXMIFS;
984 c->_c.free = ip6mr_cache_free_rcu;
985 refcount_set(&c->_c.mfc_un.res.refcount, 1);
986 return c;
987 }
988
989 static struct mfc6_cache *ip6mr_cache_alloc_unres(void)
990 {
991 struct mfc6_cache *c = kmem_cache_zalloc(mrt_cachep, GFP_ATOMIC);
992 if (!c)
993 return NULL;
994 skb_queue_head_init(&c->_c.mfc_un.unres.unresolved);
995 c->_c.mfc_un.unres.expires = jiffies + 10 * HZ;
996 return c;
997 }
998
999 /*
1000 * A cache entry has gone into a resolved state from queued
1001 */
1002
1003 static void ip6mr_cache_resolve(struct net *net, struct mr_table *mrt,
1004 struct mfc6_cache *uc, struct mfc6_cache *c)
1005 {
1006 struct sk_buff *skb;
1007
1008 /*
1009 * Play the pending entries through our router
1010 */
1011
1012 while ((skb = __skb_dequeue(&uc->_c.mfc_un.unres.unresolved))) {
1013 if (ipv6_hdr(skb)->version == 0) {
1014 struct nlmsghdr *nlh = skb_pull(skb,
1015 sizeof(struct ipv6hdr));
1016
1017 if (mr_fill_mroute(mrt, skb, &c->_c,
1018 nlmsg_data(nlh)) > 0) {
1019 nlh->nlmsg_len = skb_tail_pointer(skb) - (u8 *)nlh;
1020 } else {
1021 nlh->nlmsg_type = NLMSG_ERROR;
1022 nlh->nlmsg_len = nlmsg_msg_size(sizeof(struct nlmsgerr));
1023 skb_trim(skb, nlh->nlmsg_len);
1024 ((struct nlmsgerr *)nlmsg_data(nlh))->error = -EMSGSIZE;
1025 }
1026 rtnl_unicast(skb, net, NETLINK_CB(skb).portid);
1027 } else
1028 ip6_mr_forward(net, mrt, skb->dev, skb, c);
1029 }
1030 }
1031
1032 /*
1033 * Bounce a cache query up to pim6sd and netlink.
1034 *
1035 * Called under mrt_lock.
1036 */
1037
1038 static int ip6mr_cache_report(struct mr_table *mrt, struct sk_buff *pkt,
1039 mifi_t mifi, int assert)
1040 {
1041 struct sock *mroute6_sk;
1042 struct sk_buff *skb;
1043 struct mrt6msg *msg;
1044 int ret;
1045
1046 #ifdef CONFIG_IPV6_PIMSM_V2
1047 if (assert == MRT6MSG_WHOLEPKT)
1048 skb = skb_realloc_headroom(pkt, -skb_network_offset(pkt)
1049 +sizeof(*msg));
1050 else
1051 #endif
1052 skb = alloc_skb(sizeof(struct ipv6hdr) + sizeof(*msg), GFP_ATOMIC);
1053
1054 if (!skb)
1055 return -ENOBUFS;
1056
1057 /* I suppose that internal messages
1058 * do not require checksums */
1059
1060 skb->ip_summed = CHECKSUM_UNNECESSARY;
1061
1062 #ifdef CONFIG_IPV6_PIMSM_V2
1063 if (assert == MRT6MSG_WHOLEPKT) {
1064 /* Ugly, but we have no choice with this interface.
1065 Duplicate old header, fix length etc.
1066 And all this only to mangle msg->im6_msgtype and
1067 to set msg->im6_mbz to "mbz" :-)
1068 */
1069 skb_push(skb, -skb_network_offset(pkt));
1070
1071 skb_push(skb, sizeof(*msg));
1072 skb_reset_transport_header(skb);
1073 msg = (struct mrt6msg *)skb_transport_header(skb);
1074 msg->im6_mbz = 0;
1075 msg->im6_msgtype = MRT6MSG_WHOLEPKT;
1076 msg->im6_mif = mrt->mroute_reg_vif_num;
1077 msg->im6_pad = 0;
1078 msg->im6_src = ipv6_hdr(pkt)->saddr;
1079 msg->im6_dst = ipv6_hdr(pkt)->daddr;
1080
1081 skb->ip_summed = CHECKSUM_UNNECESSARY;
1082 } else
1083 #endif
1084 {
1085 /*
1086 * Copy the IP header
1087 */
1088
1089 skb_put(skb, sizeof(struct ipv6hdr));
1090 skb_reset_network_header(skb);
1091 skb_copy_to_linear_data(skb, ipv6_hdr(pkt), sizeof(struct ipv6hdr));
1092
1093 /*
1094 * Add our header
1095 */
1096 skb_put(skb, sizeof(*msg));
1097 skb_reset_transport_header(skb);
1098 msg = (struct mrt6msg *)skb_transport_header(skb);
1099
1100 msg->im6_mbz = 0;
1101 msg->im6_msgtype = assert;
1102 msg->im6_mif = mifi;
1103 msg->im6_pad = 0;
1104 msg->im6_src = ipv6_hdr(pkt)->saddr;
1105 msg->im6_dst = ipv6_hdr(pkt)->daddr;
1106
1107 skb_dst_set(skb, dst_clone(skb_dst(pkt)));
1108 skb->ip_summed = CHECKSUM_UNNECESSARY;
1109 }
1110
1111 rcu_read_lock();
1112 mroute6_sk = rcu_dereference(mrt->mroute_sk);
1113 if (!mroute6_sk) {
1114 rcu_read_unlock();
1115 kfree_skb(skb);
1116 return -EINVAL;
1117 }
1118
1119 mrt6msg_netlink_event(mrt, skb);
1120
1121 /* Deliver to user space multicast routing algorithms */
1122 ret = sock_queue_rcv_skb(mroute6_sk, skb);
1123 rcu_read_unlock();
1124 if (ret < 0) {
1125 net_warn_ratelimited("mroute6: pending queue full, dropping entries\n");
1126 kfree_skb(skb);
1127 }
1128
1129 return ret;
1130 }
1131
1132 /* Queue a packet for resolution. It gets locked cache entry! */
1133 static int ip6mr_cache_unresolved(struct mr_table *mrt, mifi_t mifi,
1134 struct sk_buff *skb, struct net_device *dev)
1135 {
1136 struct mfc6_cache *c;
1137 bool found = false;
1138 int err;
1139
1140 spin_lock_bh(&mfc_unres_lock);
1141 list_for_each_entry(c, &mrt->mfc_unres_queue, _c.list) {
1142 if (ipv6_addr_equal(&c->mf6c_mcastgrp, &ipv6_hdr(skb)->daddr) &&
1143 ipv6_addr_equal(&c->mf6c_origin, &ipv6_hdr(skb)->saddr)) {
1144 found = true;
1145 break;
1146 }
1147 }
1148
1149 if (!found) {
1150 /*
1151 * Create a new entry if allowable
1152 */
1153
1154 c = ip6mr_cache_alloc_unres();
1155 if (!c) {
1156 spin_unlock_bh(&mfc_unres_lock);
1157
1158 kfree_skb(skb);
1159 return -ENOBUFS;
1160 }
1161
1162 /* Fill in the new cache entry */
1163 c->_c.mfc_parent = -1;
1164 c->mf6c_origin = ipv6_hdr(skb)->saddr;
1165 c->mf6c_mcastgrp = ipv6_hdr(skb)->daddr;
1166
1167 /*
1168 * Reflect first query at pim6sd
1169 */
1170 err = ip6mr_cache_report(mrt, skb, mifi, MRT6MSG_NOCACHE);
1171 if (err < 0) {
1172 /* If the report failed throw the cache entry
1173 out - Brad Parker
1174 */
1175 spin_unlock_bh(&mfc_unres_lock);
1176
1177 ip6mr_cache_free(c);
1178 kfree_skb(skb);
1179 return err;
1180 }
1181
1182 atomic_inc(&mrt->cache_resolve_queue_len);
1183 list_add(&c->_c.list, &mrt->mfc_unres_queue);
1184 mr6_netlink_event(mrt, c, RTM_NEWROUTE);
1185
1186 ipmr_do_expire_process(mrt);
1187 }
1188
1189 /* See if we can append the packet */
1190 if (c->_c.mfc_un.unres.unresolved.qlen > 3) {
1191 kfree_skb(skb);
1192 err = -ENOBUFS;
1193 } else {
1194 if (dev) {
1195 skb->dev = dev;
1196 skb->skb_iif = dev->ifindex;
1197 }
1198 skb_queue_tail(&c->_c.mfc_un.unres.unresolved, skb);
1199 err = 0;
1200 }
1201
1202 spin_unlock_bh(&mfc_unres_lock);
1203 return err;
1204 }
1205
1206 /*
1207 * MFC6 cache manipulation by user space
1208 */
1209
1210 static int ip6mr_mfc_delete(struct mr_table *mrt, struct mf6cctl *mfc,
1211 int parent)
1212 {
1213 struct mfc6_cache *c;
1214
1215 /* The entries are added/deleted only under RTNL */
1216 rcu_read_lock();
1217 c = ip6mr_cache_find_parent(mrt, &mfc->mf6cc_origin.sin6_addr,
1218 &mfc->mf6cc_mcastgrp.sin6_addr, parent);
1219 rcu_read_unlock();
1220 if (!c)
1221 return -ENOENT;
1222 rhltable_remove(&mrt->mfc_hash, &c->_c.mnode, ip6mr_rht_params);
1223 list_del_rcu(&c->_c.list);
1224
1225 call_ip6mr_mfc_entry_notifiers(read_pnet(&mrt->net),
1226 FIB_EVENT_ENTRY_DEL, c, mrt->id);
1227 mr6_netlink_event(mrt, c, RTM_DELROUTE);
1228 mr_cache_put(&c->_c);
1229 return 0;
1230 }
1231
1232 static int ip6mr_device_event(struct notifier_block *this,
1233 unsigned long event, void *ptr)
1234 {
1235 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1236 struct net *net = dev_net(dev);
1237 struct mr_table *mrt;
1238 struct vif_device *v;
1239 int ct;
1240
1241 if (event != NETDEV_UNREGISTER)
1242 return NOTIFY_DONE;
1243
1244 ip6mr_for_each_table(mrt, net) {
1245 v = &mrt->vif_table[0];
1246 for (ct = 0; ct < mrt->maxvif; ct++, v++) {
1247 if (v->dev == dev)
1248 mif6_delete(mrt, ct, 1, NULL);
1249 }
1250 }
1251
1252 return NOTIFY_DONE;
1253 }
1254
1255 static unsigned int ip6mr_seq_read(struct net *net)
1256 {
1257 ASSERT_RTNL();
1258
1259 return net->ipv6.ipmr_seq + ip6mr_rules_seq_read(net);
1260 }
1261
1262 static int ip6mr_dump(struct net *net, struct notifier_block *nb,
1263 struct netlink_ext_ack *extack)
1264 {
1265 return mr_dump(net, nb, RTNL_FAMILY_IP6MR, ip6mr_rules_dump,
1266 ip6mr_mr_table_iter, &mrt_lock, extack);
1267 }
1268
1269 static struct notifier_block ip6_mr_notifier = {
1270 .notifier_call = ip6mr_device_event
1271 };
1272
1273 static const struct fib_notifier_ops ip6mr_notifier_ops_template = {
1274 .family = RTNL_FAMILY_IP6MR,
1275 .fib_seq_read = ip6mr_seq_read,
1276 .fib_dump = ip6mr_dump,
1277 .owner = THIS_MODULE,
1278 };
1279
1280 static int __net_init ip6mr_notifier_init(struct net *net)
1281 {
1282 struct fib_notifier_ops *ops;
1283
1284 net->ipv6.ipmr_seq = 0;
1285
1286 ops = fib_notifier_ops_register(&ip6mr_notifier_ops_template, net);
1287 if (IS_ERR(ops))
1288 return PTR_ERR(ops);
1289
1290 net->ipv6.ip6mr_notifier_ops = ops;
1291
1292 return 0;
1293 }
1294
1295 static void __net_exit ip6mr_notifier_exit(struct net *net)
1296 {
1297 fib_notifier_ops_unregister(net->ipv6.ip6mr_notifier_ops);
1298 net->ipv6.ip6mr_notifier_ops = NULL;
1299 }
1300
1301 /* Setup for IP multicast routing */
1302 static int __net_init ip6mr_net_init(struct net *net)
1303 {
1304 int err;
1305
1306 err = ip6mr_notifier_init(net);
1307 if (err)
1308 return err;
1309
1310 err = ip6mr_rules_init(net);
1311 if (err < 0)
1312 goto ip6mr_rules_fail;
1313
1314 #ifdef CONFIG_PROC_FS
1315 err = -ENOMEM;
1316 if (!proc_create_net("ip6_mr_vif", 0, net->proc_net, &ip6mr_vif_seq_ops,
1317 sizeof(struct mr_vif_iter)))
1318 goto proc_vif_fail;
1319 if (!proc_create_net("ip6_mr_cache", 0, net->proc_net, &ipmr_mfc_seq_ops,
1320 sizeof(struct mr_mfc_iter)))
1321 goto proc_cache_fail;
1322 #endif
1323
1324 return 0;
1325
1326 #ifdef CONFIG_PROC_FS
1327 proc_cache_fail:
1328 remove_proc_entry("ip6_mr_vif", net->proc_net);
1329 proc_vif_fail:
1330 ip6mr_rules_exit(net);
1331 #endif
1332 ip6mr_rules_fail:
1333 ip6mr_notifier_exit(net);
1334 return err;
1335 }
1336
1337 static void __net_exit ip6mr_net_exit(struct net *net)
1338 {
1339 #ifdef CONFIG_PROC_FS
1340 remove_proc_entry("ip6_mr_cache", net->proc_net);
1341 remove_proc_entry("ip6_mr_vif", net->proc_net);
1342 #endif
1343 ip6mr_rules_exit(net);
1344 ip6mr_notifier_exit(net);
1345 }
1346
1347 static struct pernet_operations ip6mr_net_ops = {
1348 .init = ip6mr_net_init,
1349 .exit = ip6mr_net_exit,
1350 };
1351
1352 int __init ip6_mr_init(void)
1353 {
1354 int err;
1355
1356 mrt_cachep = kmem_cache_create("ip6_mrt_cache",
1357 sizeof(struct mfc6_cache),
1358 0, SLAB_HWCACHE_ALIGN,
1359 NULL);
1360 if (!mrt_cachep)
1361 return -ENOMEM;
1362
1363 err = register_pernet_subsys(&ip6mr_net_ops);
1364 if (err)
1365 goto reg_pernet_fail;
1366
1367 err = register_netdevice_notifier(&ip6_mr_notifier);
1368 if (err)
1369 goto reg_notif_fail;
1370 #ifdef CONFIG_IPV6_PIMSM_V2
1371 if (inet6_add_protocol(&pim6_protocol, IPPROTO_PIM) < 0) {
1372 pr_err("%s: can't add PIM protocol\n", __func__);
1373 err = -EAGAIN;
1374 goto add_proto_fail;
1375 }
1376 #endif
1377 err = rtnl_register_module(THIS_MODULE, RTNL_FAMILY_IP6MR, RTM_GETROUTE,
1378 NULL, ip6mr_rtm_dumproute, 0);
1379 if (err == 0)
1380 return 0;
1381
1382 #ifdef CONFIG_IPV6_PIMSM_V2
1383 inet6_del_protocol(&pim6_protocol, IPPROTO_PIM);
1384 add_proto_fail:
1385 unregister_netdevice_notifier(&ip6_mr_notifier);
1386 #endif
1387 reg_notif_fail:
1388 unregister_pernet_subsys(&ip6mr_net_ops);
1389 reg_pernet_fail:
1390 kmem_cache_destroy(mrt_cachep);
1391 return err;
1392 }
1393
1394 void ip6_mr_cleanup(void)
1395 {
1396 rtnl_unregister(RTNL_FAMILY_IP6MR, RTM_GETROUTE);
1397 #ifdef CONFIG_IPV6_PIMSM_V2
1398 inet6_del_protocol(&pim6_protocol, IPPROTO_PIM);
1399 #endif
1400 unregister_netdevice_notifier(&ip6_mr_notifier);
1401 unregister_pernet_subsys(&ip6mr_net_ops);
1402 kmem_cache_destroy(mrt_cachep);
1403 }
1404
1405 static int ip6mr_mfc_add(struct net *net, struct mr_table *mrt,
1406 struct mf6cctl *mfc, int mrtsock, int parent)
1407 {
1408 unsigned char ttls[MAXMIFS];
1409 struct mfc6_cache *uc, *c;
1410 struct mr_mfc *_uc;
1411 bool found;
1412 int i, err;
1413
1414 if (mfc->mf6cc_parent >= MAXMIFS)
1415 return -ENFILE;
1416
1417 memset(ttls, 255, MAXMIFS);
1418 for (i = 0; i < MAXMIFS; i++) {
1419 if (IF_ISSET(i, &mfc->mf6cc_ifset))
1420 ttls[i] = 1;
1421 }
1422
1423 /* The entries are added/deleted only under RTNL */
1424 rcu_read_lock();
1425 c = ip6mr_cache_find_parent(mrt, &mfc->mf6cc_origin.sin6_addr,
1426 &mfc->mf6cc_mcastgrp.sin6_addr, parent);
1427 rcu_read_unlock();
1428 if (c) {
1429 write_lock_bh(&mrt_lock);
1430 c->_c.mfc_parent = mfc->mf6cc_parent;
1431 ip6mr_update_thresholds(mrt, &c->_c, ttls);
1432 if (!mrtsock)
1433 c->_c.mfc_flags |= MFC_STATIC;
1434 write_unlock_bh(&mrt_lock);
1435 call_ip6mr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_REPLACE,
1436 c, mrt->id);
1437 mr6_netlink_event(mrt, c, RTM_NEWROUTE);
1438 return 0;
1439 }
1440
1441 if (!ipv6_addr_any(&mfc->mf6cc_mcastgrp.sin6_addr) &&
1442 !ipv6_addr_is_multicast(&mfc->mf6cc_mcastgrp.sin6_addr))
1443 return -EINVAL;
1444
1445 c = ip6mr_cache_alloc();
1446 if (!c)
1447 return -ENOMEM;
1448
1449 c->mf6c_origin = mfc->mf6cc_origin.sin6_addr;
1450 c->mf6c_mcastgrp = mfc->mf6cc_mcastgrp.sin6_addr;
1451 c->_c.mfc_parent = mfc->mf6cc_parent;
1452 ip6mr_update_thresholds(mrt, &c->_c, ttls);
1453 if (!mrtsock)
1454 c->_c.mfc_flags |= MFC_STATIC;
1455
1456 err = rhltable_insert_key(&mrt->mfc_hash, &c->cmparg, &c->_c.mnode,
1457 ip6mr_rht_params);
1458 if (err) {
1459 pr_err("ip6mr: rhtable insert error %d\n", err);
1460 ip6mr_cache_free(c);
1461 return err;
1462 }
1463 list_add_tail_rcu(&c->_c.list, &mrt->mfc_cache_list);
1464
1465 /* Check to see if we resolved a queued list. If so we
1466 * need to send on the frames and tidy up.
1467 */
1468 found = false;
1469 spin_lock_bh(&mfc_unres_lock);
1470 list_for_each_entry(_uc, &mrt->mfc_unres_queue, list) {
1471 uc = (struct mfc6_cache *)_uc;
1472 if (ipv6_addr_equal(&uc->mf6c_origin, &c->mf6c_origin) &&
1473 ipv6_addr_equal(&uc->mf6c_mcastgrp, &c->mf6c_mcastgrp)) {
1474 list_del(&_uc->list);
1475 atomic_dec(&mrt->cache_resolve_queue_len);
1476 found = true;
1477 break;
1478 }
1479 }
1480 if (list_empty(&mrt->mfc_unres_queue))
1481 del_timer(&mrt->ipmr_expire_timer);
1482 spin_unlock_bh(&mfc_unres_lock);
1483
1484 if (found) {
1485 ip6mr_cache_resolve(net, mrt, uc, c);
1486 ip6mr_cache_free(uc);
1487 }
1488 call_ip6mr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_ADD,
1489 c, mrt->id);
1490 mr6_netlink_event(mrt, c, RTM_NEWROUTE);
1491 return 0;
1492 }
1493
1494 /*
1495 * Close the multicast socket, and clear the vif tables etc
1496 */
1497
1498 static void mroute_clean_tables(struct mr_table *mrt, int flags)
1499 {
1500 struct mr_mfc *c, *tmp;
1501 LIST_HEAD(list);
1502 int i;
1503
1504 /* Shut down all active vif entries */
1505 if (flags & (MRT6_FLUSH_MIFS | MRT6_FLUSH_MIFS_STATIC)) {
1506 for (i = 0; i < mrt->maxvif; i++) {
1507 if (((mrt->vif_table[i].flags & VIFF_STATIC) &&
1508 !(flags & MRT6_FLUSH_MIFS_STATIC)) ||
1509 (!(mrt->vif_table[i].flags & VIFF_STATIC) && !(flags & MRT6_FLUSH_MIFS)))
1510 continue;
1511 mif6_delete(mrt, i, 0, &list);
1512 }
1513 unregister_netdevice_many(&list);
1514 }
1515
1516 /* Wipe the cache */
1517 if (flags & (MRT6_FLUSH_MFC | MRT6_FLUSH_MFC_STATIC)) {
1518 list_for_each_entry_safe(c, tmp, &mrt->mfc_cache_list, list) {
1519 if (((c->mfc_flags & MFC_STATIC) && !(flags & MRT6_FLUSH_MFC_STATIC)) ||
1520 (!(c->mfc_flags & MFC_STATIC) && !(flags & MRT6_FLUSH_MFC)))
1521 continue;
1522 rhltable_remove(&mrt->mfc_hash, &c->mnode, ip6mr_rht_params);
1523 list_del_rcu(&c->list);
1524 call_ip6mr_mfc_entry_notifiers(read_pnet(&mrt->net),
1525 FIB_EVENT_ENTRY_DEL,
1526 (struct mfc6_cache *)c, mrt->id);
1527 mr6_netlink_event(mrt, (struct mfc6_cache *)c, RTM_DELROUTE);
1528 mr_cache_put(c);
1529 }
1530 }
1531
1532 if (flags & MRT6_FLUSH_MFC) {
1533 if (atomic_read(&mrt->cache_resolve_queue_len) != 0) {
1534 spin_lock_bh(&mfc_unres_lock);
1535 list_for_each_entry_safe(c, tmp, &mrt->mfc_unres_queue, list) {
1536 list_del(&c->list);
1537 mr6_netlink_event(mrt, (struct mfc6_cache *)c,
1538 RTM_DELROUTE);
1539 ip6mr_destroy_unres(mrt, (struct mfc6_cache *)c);
1540 }
1541 spin_unlock_bh(&mfc_unres_lock);
1542 }
1543 }
1544 }
1545
1546 static int ip6mr_sk_init(struct mr_table *mrt, struct sock *sk)
1547 {
1548 int err = 0;
1549 struct net *net = sock_net(sk);
1550
1551 rtnl_lock();
1552 write_lock_bh(&mrt_lock);
1553 if (rtnl_dereference(mrt->mroute_sk)) {
1554 err = -EADDRINUSE;
1555 } else {
1556 rcu_assign_pointer(mrt->mroute_sk, sk);
1557 sock_set_flag(sk, SOCK_RCU_FREE);
1558 net->ipv6.devconf_all->mc_forwarding++;
1559 }
1560 write_unlock_bh(&mrt_lock);
1561
1562 if (!err)
1563 inet6_netconf_notify_devconf(net, RTM_NEWNETCONF,
1564 NETCONFA_MC_FORWARDING,
1565 NETCONFA_IFINDEX_ALL,
1566 net->ipv6.devconf_all);
1567 rtnl_unlock();
1568
1569 return err;
1570 }
1571
1572 int ip6mr_sk_done(struct sock *sk)
1573 {
1574 int err = -EACCES;
1575 struct net *net = sock_net(sk);
1576 struct mr_table *mrt;
1577
1578 if (sk->sk_type != SOCK_RAW ||
1579 inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
1580 return err;
1581
1582 rtnl_lock();
1583 ip6mr_for_each_table(mrt, net) {
1584 if (sk == rtnl_dereference(mrt->mroute_sk)) {
1585 write_lock_bh(&mrt_lock);
1586 RCU_INIT_POINTER(mrt->mroute_sk, NULL);
1587 /* Note that mroute_sk had SOCK_RCU_FREE set,
1588 * so the RCU grace period before sk freeing
1589 * is guaranteed by sk_destruct()
1590 */
1591 net->ipv6.devconf_all->mc_forwarding--;
1592 write_unlock_bh(&mrt_lock);
1593 inet6_netconf_notify_devconf(net, RTM_NEWNETCONF,
1594 NETCONFA_MC_FORWARDING,
1595 NETCONFA_IFINDEX_ALL,
1596 net->ipv6.devconf_all);
1597
1598 mroute_clean_tables(mrt, MRT6_FLUSH_MIFS | MRT6_FLUSH_MFC);
1599 err = 0;
1600 break;
1601 }
1602 }
1603 rtnl_unlock();
1604
1605 return err;
1606 }
1607
1608 bool mroute6_is_socket(struct net *net, struct sk_buff *skb)
1609 {
1610 struct mr_table *mrt;
1611 struct flowi6 fl6 = {
1612 .flowi6_iif = skb->skb_iif ? : LOOPBACK_IFINDEX,
1613 .flowi6_oif = skb->dev->ifindex,
1614 .flowi6_mark = skb->mark,
1615 };
1616
1617 if (ip6mr_fib_lookup(net, &fl6, &mrt) < 0)
1618 return NULL;
1619
1620 return rcu_access_pointer(mrt->mroute_sk);
1621 }
1622 EXPORT_SYMBOL(mroute6_is_socket);
1623
1624 /*
1625 * Socket options and virtual interface manipulation. The whole
1626 * virtual interface system is a complete heap, but unfortunately
1627 * that's how BSD mrouted happens to think. Maybe one day with a proper
1628 * MOSPF/PIM router set up we can clean this up.
1629 */
1630
1631 int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, unsigned int optlen)
1632 {
1633 int ret, parent = 0;
1634 struct mif6ctl vif;
1635 struct mf6cctl mfc;
1636 mifi_t mifi;
1637 struct net *net = sock_net(sk);
1638 struct mr_table *mrt;
1639
1640 if (sk->sk_type != SOCK_RAW ||
1641 inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
1642 return -EOPNOTSUPP;
1643
1644 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT);
1645 if (!mrt)
1646 return -ENOENT;
1647
1648 if (optname != MRT6_INIT) {
1649 if (sk != rcu_access_pointer(mrt->mroute_sk) &&
1650 !ns_capable(net->user_ns, CAP_NET_ADMIN))
1651 return -EACCES;
1652 }
1653
1654 switch (optname) {
1655 case MRT6_INIT:
1656 if (optlen < sizeof(int))
1657 return -EINVAL;
1658
1659 return ip6mr_sk_init(mrt, sk);
1660
1661 case MRT6_DONE:
1662 return ip6mr_sk_done(sk);
1663
1664 case MRT6_ADD_MIF:
1665 if (optlen < sizeof(vif))
1666 return -EINVAL;
1667 if (copy_from_user(&vif, optval, sizeof(vif)))
1668 return -EFAULT;
1669 if (vif.mif6c_mifi >= MAXMIFS)
1670 return -ENFILE;
1671 rtnl_lock();
1672 ret = mif6_add(net, mrt, &vif,
1673 sk == rtnl_dereference(mrt->mroute_sk));
1674 rtnl_unlock();
1675 return ret;
1676
1677 case MRT6_DEL_MIF:
1678 if (optlen < sizeof(mifi_t))
1679 return -EINVAL;
1680 if (copy_from_user(&mifi, optval, sizeof(mifi_t)))
1681 return -EFAULT;
1682 rtnl_lock();
1683 ret = mif6_delete(mrt, mifi, 0, NULL);
1684 rtnl_unlock();
1685 return ret;
1686
1687 /*
1688 * Manipulate the forwarding caches. These live
1689 * in a sort of kernel/user symbiosis.
1690 */
1691 case MRT6_ADD_MFC:
1692 case MRT6_DEL_MFC:
1693 parent = -1;
1694 fallthrough;
1695 case MRT6_ADD_MFC_PROXY:
1696 case MRT6_DEL_MFC_PROXY:
1697 if (optlen < sizeof(mfc))
1698 return -EINVAL;
1699 if (copy_from_user(&mfc, optval, sizeof(mfc)))
1700 return -EFAULT;
1701 if (parent == 0)
1702 parent = mfc.mf6cc_parent;
1703 rtnl_lock();
1704 if (optname == MRT6_DEL_MFC || optname == MRT6_DEL_MFC_PROXY)
1705 ret = ip6mr_mfc_delete(mrt, &mfc, parent);
1706 else
1707 ret = ip6mr_mfc_add(net, mrt, &mfc,
1708 sk ==
1709 rtnl_dereference(mrt->mroute_sk),
1710 parent);
1711 rtnl_unlock();
1712 return ret;
1713
1714 case MRT6_FLUSH:
1715 {
1716 int flags;
1717
1718 if (optlen != sizeof(flags))
1719 return -EINVAL;
1720 if (get_user(flags, (int __user *)optval))
1721 return -EFAULT;
1722 rtnl_lock();
1723 mroute_clean_tables(mrt, flags);
1724 rtnl_unlock();
1725 return 0;
1726 }
1727
1728 /*
1729 * Control PIM assert (to activate pim will activate assert)
1730 */
1731 case MRT6_ASSERT:
1732 {
1733 int v;
1734
1735 if (optlen != sizeof(v))
1736 return -EINVAL;
1737 if (get_user(v, (int __user *)optval))
1738 return -EFAULT;
1739 mrt->mroute_do_assert = v;
1740 return 0;
1741 }
1742
1743 #ifdef CONFIG_IPV6_PIMSM_V2
1744 case MRT6_PIM:
1745 {
1746 int v;
1747
1748 if (optlen != sizeof(v))
1749 return -EINVAL;
1750 if (get_user(v, (int __user *)optval))
1751 return -EFAULT;
1752 v = !!v;
1753 rtnl_lock();
1754 ret = 0;
1755 if (v != mrt->mroute_do_pim) {
1756 mrt->mroute_do_pim = v;
1757 mrt->mroute_do_assert = v;
1758 }
1759 rtnl_unlock();
1760 return ret;
1761 }
1762
1763 #endif
1764 #ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES
1765 case MRT6_TABLE:
1766 {
1767 u32 v;
1768
1769 if (optlen != sizeof(u32))
1770 return -EINVAL;
1771 if (get_user(v, (u32 __user *)optval))
1772 return -EFAULT;
1773 /* "pim6reg%u" should not exceed 16 bytes (IFNAMSIZ) */
1774 if (v != RT_TABLE_DEFAULT && v >= 100000000)
1775 return -EINVAL;
1776 if (sk == rcu_access_pointer(mrt->mroute_sk))
1777 return -EBUSY;
1778
1779 rtnl_lock();
1780 ret = 0;
1781 mrt = ip6mr_new_table(net, v);
1782 if (IS_ERR(mrt))
1783 ret = PTR_ERR(mrt);
1784 else
1785 raw6_sk(sk)->ip6mr_table = v;
1786 rtnl_unlock();
1787 return ret;
1788 }
1789 #endif
1790 /*
1791 * Spurious command, or MRT6_VERSION which you cannot
1792 * set.
1793 */
1794 default:
1795 return -ENOPROTOOPT;
1796 }
1797 }
1798
1799 /*
1800 * Getsock opt support for the multicast routing system.
1801 */
1802
1803 int ip6_mroute_getsockopt(struct sock *sk, int optname, char __user *optval,
1804 int __user *optlen)
1805 {
1806 int olr;
1807 int val;
1808 struct net *net = sock_net(sk);
1809 struct mr_table *mrt;
1810
1811 if (sk->sk_type != SOCK_RAW ||
1812 inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
1813 return -EOPNOTSUPP;
1814
1815 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT);
1816 if (!mrt)
1817 return -ENOENT;
1818
1819 switch (optname) {
1820 case MRT6_VERSION:
1821 val = 0x0305;
1822 break;
1823 #ifdef CONFIG_IPV6_PIMSM_V2
1824 case MRT6_PIM:
1825 val = mrt->mroute_do_pim;
1826 break;
1827 #endif
1828 case MRT6_ASSERT:
1829 val = mrt->mroute_do_assert;
1830 break;
1831 default:
1832 return -ENOPROTOOPT;
1833 }
1834
1835 if (get_user(olr, optlen))
1836 return -EFAULT;
1837
1838 olr = min_t(int, olr, sizeof(int));
1839 if (olr < 0)
1840 return -EINVAL;
1841
1842 if (put_user(olr, optlen))
1843 return -EFAULT;
1844 if (copy_to_user(optval, &val, olr))
1845 return -EFAULT;
1846 return 0;
1847 }
1848
1849 /*
1850 * The IP multicast ioctl support routines.
1851 */
1852
1853 int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg)
1854 {
1855 struct sioc_sg_req6 sr;
1856 struct sioc_mif_req6 vr;
1857 struct vif_device *vif;
1858 struct mfc6_cache *c;
1859 struct net *net = sock_net(sk);
1860 struct mr_table *mrt;
1861
1862 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT);
1863 if (!mrt)
1864 return -ENOENT;
1865
1866 switch (cmd) {
1867 case SIOCGETMIFCNT_IN6:
1868 if (copy_from_user(&vr, arg, sizeof(vr)))
1869 return -EFAULT;
1870 if (vr.mifi >= mrt->maxvif)
1871 return -EINVAL;
1872 vr.mifi = array_index_nospec(vr.mifi, mrt->maxvif);
1873 read_lock(&mrt_lock);
1874 vif = &mrt->vif_table[vr.mifi];
1875 if (VIF_EXISTS(mrt, vr.mifi)) {
1876 vr.icount = vif->pkt_in;
1877 vr.ocount = vif->pkt_out;
1878 vr.ibytes = vif->bytes_in;
1879 vr.obytes = vif->bytes_out;
1880 read_unlock(&mrt_lock);
1881
1882 if (copy_to_user(arg, &vr, sizeof(vr)))
1883 return -EFAULT;
1884 return 0;
1885 }
1886 read_unlock(&mrt_lock);
1887 return -EADDRNOTAVAIL;
1888 case SIOCGETSGCNT_IN6:
1889 if (copy_from_user(&sr, arg, sizeof(sr)))
1890 return -EFAULT;
1891
1892 rcu_read_lock();
1893 c = ip6mr_cache_find(mrt, &sr.src.sin6_addr, &sr.grp.sin6_addr);
1894 if (c) {
1895 sr.pktcnt = c->_c.mfc_un.res.pkt;
1896 sr.bytecnt = c->_c.mfc_un.res.bytes;
1897 sr.wrong_if = c->_c.mfc_un.res.wrong_if;
1898 rcu_read_unlock();
1899
1900 if (copy_to_user(arg, &sr, sizeof(sr)))
1901 return -EFAULT;
1902 return 0;
1903 }
1904 rcu_read_unlock();
1905 return -EADDRNOTAVAIL;
1906 default:
1907 return -ENOIOCTLCMD;
1908 }
1909 }
1910
1911 #ifdef CONFIG_COMPAT
1912 struct compat_sioc_sg_req6 {
1913 struct sockaddr_in6 src;
1914 struct sockaddr_in6 grp;
1915 compat_ulong_t pktcnt;
1916 compat_ulong_t bytecnt;
1917 compat_ulong_t wrong_if;
1918 };
1919
1920 struct compat_sioc_mif_req6 {
1921 mifi_t mifi;
1922 compat_ulong_t icount;
1923 compat_ulong_t ocount;
1924 compat_ulong_t ibytes;
1925 compat_ulong_t obytes;
1926 };
1927
1928 int ip6mr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg)
1929 {
1930 struct compat_sioc_sg_req6 sr;
1931 struct compat_sioc_mif_req6 vr;
1932 struct vif_device *vif;
1933 struct mfc6_cache *c;
1934 struct net *net = sock_net(sk);
1935 struct mr_table *mrt;
1936
1937 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT);
1938 if (!mrt)
1939 return -ENOENT;
1940
1941 switch (cmd) {
1942 case SIOCGETMIFCNT_IN6:
1943 if (copy_from_user(&vr, arg, sizeof(vr)))
1944 return -EFAULT;
1945 if (vr.mifi >= mrt->maxvif)
1946 return -EINVAL;
1947 vr.mifi = array_index_nospec(vr.mifi, mrt->maxvif);
1948 read_lock(&mrt_lock);
1949 vif = &mrt->vif_table[vr.mifi];
1950 if (VIF_EXISTS(mrt, vr.mifi)) {
1951 vr.icount = vif->pkt_in;
1952 vr.ocount = vif->pkt_out;
1953 vr.ibytes = vif->bytes_in;
1954 vr.obytes = vif->bytes_out;
1955 read_unlock(&mrt_lock);
1956
1957 if (copy_to_user(arg, &vr, sizeof(vr)))
1958 return -EFAULT;
1959 return 0;
1960 }
1961 read_unlock(&mrt_lock);
1962 return -EADDRNOTAVAIL;
1963 case SIOCGETSGCNT_IN6:
1964 if (copy_from_user(&sr, arg, sizeof(sr)))
1965 return -EFAULT;
1966
1967 rcu_read_lock();
1968 c = ip6mr_cache_find(mrt, &sr.src.sin6_addr, &sr.grp.sin6_addr);
1969 if (c) {
1970 sr.pktcnt = c->_c.mfc_un.res.pkt;
1971 sr.bytecnt = c->_c.mfc_un.res.bytes;
1972 sr.wrong_if = c->_c.mfc_un.res.wrong_if;
1973 rcu_read_unlock();
1974
1975 if (copy_to_user(arg, &sr, sizeof(sr)))
1976 return -EFAULT;
1977 return 0;
1978 }
1979 rcu_read_unlock();
1980 return -EADDRNOTAVAIL;
1981 default:
1982 return -ENOIOCTLCMD;
1983 }
1984 }
1985 #endif
1986
1987 static inline int ip6mr_forward2_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
1988 {
1989 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
1990 IPSTATS_MIB_OUTFORWDATAGRAMS);
1991 IP6_ADD_STATS(net, ip6_dst_idev(skb_dst(skb)),
1992 IPSTATS_MIB_OUTOCTETS, skb->len);
1993 return dst_output(net, sk, skb);
1994 }
1995
1996 /*
1997 * Processing handlers for ip6mr_forward
1998 */
1999
2000 static int ip6mr_forward2(struct net *net, struct mr_table *mrt,
2001 struct sk_buff *skb, int vifi)
2002 {
2003 struct ipv6hdr *ipv6h;
2004 struct vif_device *vif = &mrt->vif_table[vifi];
2005 struct net_device *dev;
2006 struct dst_entry *dst;
2007 struct flowi6 fl6;
2008
2009 if (!vif->dev)
2010 goto out_free;
2011
2012 #ifdef CONFIG_IPV6_PIMSM_V2
2013 if (vif->flags & MIFF_REGISTER) {
2014 vif->pkt_out++;
2015 vif->bytes_out += skb->len;
2016 vif->dev->stats.tx_bytes += skb->len;
2017 vif->dev->stats.tx_packets++;
2018 ip6mr_cache_report(mrt, skb, vifi, MRT6MSG_WHOLEPKT);
2019 goto out_free;
2020 }
2021 #endif
2022
2023 ipv6h = ipv6_hdr(skb);
2024
2025 fl6 = (struct flowi6) {
2026 .flowi6_oif = vif->link,
2027 .daddr = ipv6h->daddr,
2028 };
2029
2030 dst = ip6_route_output(net, NULL, &fl6);
2031 if (dst->error) {
2032 dst_release(dst);
2033 goto out_free;
2034 }
2035
2036 skb_dst_drop(skb);
2037 skb_dst_set(skb, dst);
2038
2039 /*
2040 * RFC1584 teaches, that DVMRP/PIM router must deliver packets locally
2041 * not only before forwarding, but after forwarding on all output
2042 * interfaces. It is clear, if mrouter runs a multicasting
2043 * program, it should receive packets not depending to what interface
2044 * program is joined.
2045 * If we will not make it, the program will have to join on all
2046 * interfaces. On the other hand, multihoming host (or router, but
2047 * not mrouter) cannot join to more than one interface - it will
2048 * result in receiving multiple packets.
2049 */
2050 dev = vif->dev;
2051 skb->dev = dev;
2052 vif->pkt_out++;
2053 vif->bytes_out += skb->len;
2054
2055 /* We are about to write */
2056 /* XXX: extension headers? */
2057 if (skb_cow(skb, sizeof(*ipv6h) + LL_RESERVED_SPACE(dev)))
2058 goto out_free;
2059
2060 ipv6h = ipv6_hdr(skb);
2061 ipv6h->hop_limit--;
2062
2063 IP6CB(skb)->flags |= IP6SKB_FORWARDED;
2064
2065 return NF_HOOK(NFPROTO_IPV6, NF_INET_FORWARD,
2066 net, NULL, skb, skb->dev, dev,
2067 ip6mr_forward2_finish);
2068
2069 out_free:
2070 kfree_skb(skb);
2071 return 0;
2072 }
2073
2074 static int ip6mr_find_vif(struct mr_table *mrt, struct net_device *dev)
2075 {
2076 int ct;
2077
2078 for (ct = mrt->maxvif - 1; ct >= 0; ct--) {
2079 if (mrt->vif_table[ct].dev == dev)
2080 break;
2081 }
2082 return ct;
2083 }
2084
2085 static void ip6_mr_forward(struct net *net, struct mr_table *mrt,
2086 struct net_device *dev, struct sk_buff *skb,
2087 struct mfc6_cache *c)
2088 {
2089 int psend = -1;
2090 int vif, ct;
2091 int true_vifi = ip6mr_find_vif(mrt, dev);
2092
2093 vif = c->_c.mfc_parent;
2094 c->_c.mfc_un.res.pkt++;
2095 c->_c.mfc_un.res.bytes += skb->len;
2096 c->_c.mfc_un.res.lastuse = jiffies;
2097
2098 if (ipv6_addr_any(&c->mf6c_origin) && true_vifi >= 0) {
2099 struct mfc6_cache *cache_proxy;
2100
2101 /* For an (*,G) entry, we only check that the incoming
2102 * interface is part of the static tree.
2103 */
2104 rcu_read_lock();
2105 cache_proxy = mr_mfc_find_any_parent(mrt, vif);
2106 if (cache_proxy &&
2107 cache_proxy->_c.mfc_un.res.ttls[true_vifi] < 255) {
2108 rcu_read_unlock();
2109 goto forward;
2110 }
2111 rcu_read_unlock();
2112 }
2113
2114 /*
2115 * Wrong interface: drop packet and (maybe) send PIM assert.
2116 */
2117 if (mrt->vif_table[vif].dev != dev) {
2118 c->_c.mfc_un.res.wrong_if++;
2119
2120 if (true_vifi >= 0 && mrt->mroute_do_assert &&
2121 /* pimsm uses asserts, when switching from RPT to SPT,
2122 so that we cannot check that packet arrived on an oif.
2123 It is bad, but otherwise we would need to move pretty
2124 large chunk of pimd to kernel. Ough... --ANK
2125 */
2126 (mrt->mroute_do_pim ||
2127 c->_c.mfc_un.res.ttls[true_vifi] < 255) &&
2128 time_after(jiffies,
2129 c->_c.mfc_un.res.last_assert +
2130 MFC_ASSERT_THRESH)) {
2131 c->_c.mfc_un.res.last_assert = jiffies;
2132 ip6mr_cache_report(mrt, skb, true_vifi, MRT6MSG_WRONGMIF);
2133 }
2134 goto dont_forward;
2135 }
2136
2137 forward:
2138 mrt->vif_table[vif].pkt_in++;
2139 mrt->vif_table[vif].bytes_in += skb->len;
2140
2141 /*
2142 * Forward the frame
2143 */
2144 if (ipv6_addr_any(&c->mf6c_origin) &&
2145 ipv6_addr_any(&c->mf6c_mcastgrp)) {
2146 if (true_vifi >= 0 &&
2147 true_vifi != c->_c.mfc_parent &&
2148 ipv6_hdr(skb)->hop_limit >
2149 c->_c.mfc_un.res.ttls[c->_c.mfc_parent]) {
2150 /* It's an (*,*) entry and the packet is not coming from
2151 * the upstream: forward the packet to the upstream
2152 * only.
2153 */
2154 psend = c->_c.mfc_parent;
2155 goto last_forward;
2156 }
2157 goto dont_forward;
2158 }
2159 for (ct = c->_c.mfc_un.res.maxvif - 1;
2160 ct >= c->_c.mfc_un.res.minvif; ct--) {
2161 /* For (*,G) entry, don't forward to the incoming interface */
2162 if ((!ipv6_addr_any(&c->mf6c_origin) || ct != true_vifi) &&
2163 ipv6_hdr(skb)->hop_limit > c->_c.mfc_un.res.ttls[ct]) {
2164 if (psend != -1) {
2165 struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
2166 if (skb2)
2167 ip6mr_forward2(net, mrt, skb2, psend);
2168 }
2169 psend = ct;
2170 }
2171 }
2172 last_forward:
2173 if (psend != -1) {
2174 ip6mr_forward2(net, mrt, skb, psend);
2175 return;
2176 }
2177
2178 dont_forward:
2179 kfree_skb(skb);
2180 }
2181
2182
2183 /*
2184 * Multicast packets for forwarding arrive here
2185 */
2186
2187 int ip6_mr_input(struct sk_buff *skb)
2188 {
2189 struct mfc6_cache *cache;
2190 struct net *net = dev_net(skb->dev);
2191 struct mr_table *mrt;
2192 struct flowi6 fl6 = {
2193 .flowi6_iif = skb->dev->ifindex,
2194 .flowi6_mark = skb->mark,
2195 };
2196 int err;
2197 struct net_device *dev;
2198
2199 /* skb->dev passed in is the master dev for vrfs.
2200 * Get the proper interface that does have a vif associated with it.
2201 */
2202 dev = skb->dev;
2203 if (netif_is_l3_master(skb->dev)) {
2204 dev = dev_get_by_index_rcu(net, IPCB(skb)->iif);
2205 if (!dev) {
2206 kfree_skb(skb);
2207 return -ENODEV;
2208 }
2209 }
2210
2211 err = ip6mr_fib_lookup(net, &fl6, &mrt);
2212 if (err < 0) {
2213 kfree_skb(skb);
2214 return err;
2215 }
2216
2217 read_lock(&mrt_lock);
2218 cache = ip6mr_cache_find(mrt,
2219 &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr);
2220 if (!cache) {
2221 int vif = ip6mr_find_vif(mrt, dev);
2222
2223 if (vif >= 0)
2224 cache = ip6mr_cache_find_any(mrt,
2225 &ipv6_hdr(skb)->daddr,
2226 vif);
2227 }
2228
2229 /*
2230 * No usable cache entry
2231 */
2232 if (!cache) {
2233 int vif;
2234
2235 vif = ip6mr_find_vif(mrt, dev);
2236 if (vif >= 0) {
2237 int err = ip6mr_cache_unresolved(mrt, vif, skb, dev);
2238 read_unlock(&mrt_lock);
2239
2240 return err;
2241 }
2242 read_unlock(&mrt_lock);
2243 kfree_skb(skb);
2244 return -ENODEV;
2245 }
2246
2247 ip6_mr_forward(net, mrt, dev, skb, cache);
2248
2249 read_unlock(&mrt_lock);
2250
2251 return 0;
2252 }
2253
2254 int ip6mr_get_route(struct net *net, struct sk_buff *skb, struct rtmsg *rtm,
2255 u32 portid)
2256 {
2257 int err;
2258 struct mr_table *mrt;
2259 struct mfc6_cache *cache;
2260 struct rt6_info *rt = (struct rt6_info *)skb_dst(skb);
2261
2262 mrt = ip6mr_get_table(net, RT6_TABLE_DFLT);
2263 if (!mrt)
2264 return -ENOENT;
2265
2266 read_lock(&mrt_lock);
2267 cache = ip6mr_cache_find(mrt, &rt->rt6i_src.addr, &rt->rt6i_dst.addr);
2268 if (!cache && skb->dev) {
2269 int vif = ip6mr_find_vif(mrt, skb->dev);
2270
2271 if (vif >= 0)
2272 cache = ip6mr_cache_find_any(mrt, &rt->rt6i_dst.addr,
2273 vif);
2274 }
2275
2276 if (!cache) {
2277 struct sk_buff *skb2;
2278 struct ipv6hdr *iph;
2279 struct net_device *dev;
2280 int vif;
2281
2282 dev = skb->dev;
2283 if (!dev || (vif = ip6mr_find_vif(mrt, dev)) < 0) {
2284 read_unlock(&mrt_lock);
2285 return -ENODEV;
2286 }
2287
2288 /* really correct? */
2289 skb2 = alloc_skb(sizeof(struct ipv6hdr), GFP_ATOMIC);
2290 if (!skb2) {
2291 read_unlock(&mrt_lock);
2292 return -ENOMEM;
2293 }
2294
2295 NETLINK_CB(skb2).portid = portid;
2296 skb_reset_transport_header(skb2);
2297
2298 skb_put(skb2, sizeof(struct ipv6hdr));
2299 skb_reset_network_header(skb2);
2300
2301 iph = ipv6_hdr(skb2);
2302 iph->version = 0;
2303 iph->priority = 0;
2304 iph->flow_lbl[0] = 0;
2305 iph->flow_lbl[1] = 0;
2306 iph->flow_lbl[2] = 0;
2307 iph->payload_len = 0;
2308 iph->nexthdr = IPPROTO_NONE;
2309 iph->hop_limit = 0;
2310 iph->saddr = rt->rt6i_src.addr;
2311 iph->daddr = rt->rt6i_dst.addr;
2312
2313 err = ip6mr_cache_unresolved(mrt, vif, skb2, dev);
2314 read_unlock(&mrt_lock);
2315
2316 return err;
2317 }
2318
2319 err = mr_fill_mroute(mrt, skb, &cache->_c, rtm);
2320 read_unlock(&mrt_lock);
2321 return err;
2322 }
2323
2324 static int ip6mr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
2325 u32 portid, u32 seq, struct mfc6_cache *c, int cmd,
2326 int flags)
2327 {
2328 struct nlmsghdr *nlh;
2329 struct rtmsg *rtm;
2330 int err;
2331
2332 nlh = nlmsg_put(skb, portid, seq, cmd, sizeof(*rtm), flags);
2333 if (!nlh)
2334 return -EMSGSIZE;
2335
2336 rtm = nlmsg_data(nlh);
2337 rtm->rtm_family = RTNL_FAMILY_IP6MR;
2338 rtm->rtm_dst_len = 128;
2339 rtm->rtm_src_len = 128;
2340 rtm->rtm_tos = 0;
2341 rtm->rtm_table = mrt->id;
2342 if (nla_put_u32(skb, RTA_TABLE, mrt->id))
2343 goto nla_put_failure;
2344 rtm->rtm_type = RTN_MULTICAST;
2345 rtm->rtm_scope = RT_SCOPE_UNIVERSE;
2346 if (c->_c.mfc_flags & MFC_STATIC)
2347 rtm->rtm_protocol = RTPROT_STATIC;
2348 else
2349 rtm->rtm_protocol = RTPROT_MROUTED;
2350 rtm->rtm_flags = 0;
2351
2352 if (nla_put_in6_addr(skb, RTA_SRC, &c->mf6c_origin) ||
2353 nla_put_in6_addr(skb, RTA_DST, &c->mf6c_mcastgrp))
2354 goto nla_put_failure;
2355 err = mr_fill_mroute(mrt, skb, &c->_c, rtm);
2356 /* do not break the dump if cache is unresolved */
2357 if (err < 0 && err != -ENOENT)
2358 goto nla_put_failure;
2359
2360 nlmsg_end(skb, nlh);
2361 return 0;
2362
2363 nla_put_failure:
2364 nlmsg_cancel(skb, nlh);
2365 return -EMSGSIZE;
2366 }
2367
2368 static int _ip6mr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
2369 u32 portid, u32 seq, struct mr_mfc *c,
2370 int cmd, int flags)
2371 {
2372 return ip6mr_fill_mroute(mrt, skb, portid, seq, (struct mfc6_cache *)c,
2373 cmd, flags);
2374 }
2375
2376 static int mr6_msgsize(bool unresolved, int maxvif)
2377 {
2378 size_t len =
2379 NLMSG_ALIGN(sizeof(struct rtmsg))
2380 + nla_total_size(4) /* RTA_TABLE */
2381 + nla_total_size(sizeof(struct in6_addr)) /* RTA_SRC */
2382 + nla_total_size(sizeof(struct in6_addr)) /* RTA_DST */
2383 ;
2384
2385 if (!unresolved)
2386 len = len
2387 + nla_total_size(4) /* RTA_IIF */
2388 + nla_total_size(0) /* RTA_MULTIPATH */
2389 + maxvif * NLA_ALIGN(sizeof(struct rtnexthop))
2390 /* RTA_MFC_STATS */
2391 + nla_total_size_64bit(sizeof(struct rta_mfc_stats))
2392 ;
2393
2394 return len;
2395 }
2396
2397 static void mr6_netlink_event(struct mr_table *mrt, struct mfc6_cache *mfc,
2398 int cmd)
2399 {
2400 struct net *net = read_pnet(&mrt->net);
2401 struct sk_buff *skb;
2402 int err = -ENOBUFS;
2403
2404 skb = nlmsg_new(mr6_msgsize(mfc->_c.mfc_parent >= MAXMIFS, mrt->maxvif),
2405 GFP_ATOMIC);
2406 if (!skb)
2407 goto errout;
2408
2409 err = ip6mr_fill_mroute(mrt, skb, 0, 0, mfc, cmd, 0);
2410 if (err < 0)
2411 goto errout;
2412
2413 rtnl_notify(skb, net, 0, RTNLGRP_IPV6_MROUTE, NULL, GFP_ATOMIC);
2414 return;
2415
2416 errout:
2417 kfree_skb(skb);
2418 if (err < 0)
2419 rtnl_set_sk_err(net, RTNLGRP_IPV6_MROUTE, err);
2420 }
2421
2422 static size_t mrt6msg_netlink_msgsize(size_t payloadlen)
2423 {
2424 size_t len =
2425 NLMSG_ALIGN(sizeof(struct rtgenmsg))
2426 + nla_total_size(1) /* IP6MRA_CREPORT_MSGTYPE */
2427 + nla_total_size(4) /* IP6MRA_CREPORT_MIF_ID */
2428 /* IP6MRA_CREPORT_SRC_ADDR */
2429 + nla_total_size(sizeof(struct in6_addr))
2430 /* IP6MRA_CREPORT_DST_ADDR */
2431 + nla_total_size(sizeof(struct in6_addr))
2432 /* IP6MRA_CREPORT_PKT */
2433 + nla_total_size(payloadlen)
2434 ;
2435
2436 return len;
2437 }
2438
2439 static void mrt6msg_netlink_event(struct mr_table *mrt, struct sk_buff *pkt)
2440 {
2441 struct net *net = read_pnet(&mrt->net);
2442 struct nlmsghdr *nlh;
2443 struct rtgenmsg *rtgenm;
2444 struct mrt6msg *msg;
2445 struct sk_buff *skb;
2446 struct nlattr *nla;
2447 int payloadlen;
2448
2449 payloadlen = pkt->len - sizeof(struct mrt6msg);
2450 msg = (struct mrt6msg *)skb_transport_header(pkt);
2451
2452 skb = nlmsg_new(mrt6msg_netlink_msgsize(payloadlen), GFP_ATOMIC);
2453 if (!skb)
2454 goto errout;
2455
2456 nlh = nlmsg_put(skb, 0, 0, RTM_NEWCACHEREPORT,
2457 sizeof(struct rtgenmsg), 0);
2458 if (!nlh)
2459 goto errout;
2460 rtgenm = nlmsg_data(nlh);
2461 rtgenm->rtgen_family = RTNL_FAMILY_IP6MR;
2462 if (nla_put_u8(skb, IP6MRA_CREPORT_MSGTYPE, msg->im6_msgtype) ||
2463 nla_put_u32(skb, IP6MRA_CREPORT_MIF_ID, msg->im6_mif) ||
2464 nla_put_in6_addr(skb, IP6MRA_CREPORT_SRC_ADDR,
2465 &msg->im6_src) ||
2466 nla_put_in6_addr(skb, IP6MRA_CREPORT_DST_ADDR,
2467 &msg->im6_dst))
2468 goto nla_put_failure;
2469
2470 nla = nla_reserve(skb, IP6MRA_CREPORT_PKT, payloadlen);
2471 if (!nla || skb_copy_bits(pkt, sizeof(struct mrt6msg),
2472 nla_data(nla), payloadlen))
2473 goto nla_put_failure;
2474
2475 nlmsg_end(skb, nlh);
2476
2477 rtnl_notify(skb, net, 0, RTNLGRP_IPV6_MROUTE_R, NULL, GFP_ATOMIC);
2478 return;
2479
2480 nla_put_failure:
2481 nlmsg_cancel(skb, nlh);
2482 errout:
2483 kfree_skb(skb);
2484 rtnl_set_sk_err(net, RTNLGRP_IPV6_MROUTE_R, -ENOBUFS);
2485 }
2486
2487 static int ip6mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)
2488 {
2489 const struct nlmsghdr *nlh = cb->nlh;
2490 struct fib_dump_filter filter = {};
2491 int err;
2492
2493 if (cb->strict_check) {
2494 err = ip_valid_fib_dump_req(sock_net(skb->sk), nlh,
2495 &filter, cb);
2496 if (err < 0)
2497 return err;
2498 }
2499
2500 if (filter.table_id) {
2501 struct mr_table *mrt;
2502
2503 mrt = ip6mr_get_table(sock_net(skb->sk), filter.table_id);
2504 if (!mrt) {
2505 if (filter.dump_all_families)
2506 return skb->len;
2507
2508 NL_SET_ERR_MSG_MOD(cb->extack, "MR table does not exist");
2509 return -ENOENT;
2510 }
2511 err = mr_table_dump(mrt, skb, cb, _ip6mr_fill_mroute,
2512 &mfc_unres_lock, &filter);
2513 return skb->len ? : err;
2514 }
2515
2516 return mr_rtm_dumproute(skb, cb, ip6mr_mr_table_iter,
2517 _ip6mr_fill_mroute, &mfc_unres_lock, &filter);
2518 }