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