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