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