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