Linux Audio

Check our new training course

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