Linux Audio

Check our new training course

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