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