]> git.ipfire.org Git - people/ms/linux.git/blame - net/ipv6/route.c
ptp: Fix compiler warnings in the testptp utility
[people/ms/linux.git] / net / ipv6 / route.c
CommitLineData
1da177e4
LT
1/*
2 * Linux INET6 implementation
3 * FIB front-end.
4 *
5 * Authors:
1ab1457c 6 * Pedro Roque <roque@di.fc.ul.pt>
1da177e4 7 *
1da177e4
LT
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version
11 * 2 of the License, or (at your option) any later version.
12 */
13
14/* Changes:
15 *
16 * YOSHIFUJI Hideaki @USAGI
17 * reworked default router selection.
18 * - respect outgoing interface
19 * - select from (probably) reachable routers (i.e.
20 * routers in REACHABLE, STALE, DELAY or PROBE states).
21 * - always select the same router if it is (probably)
22 * reachable. otherwise, round-robin the list.
c0bece9f
YH
23 * Ville Nuorvala
24 * Fixed routing subtrees.
1da177e4
LT
25 */
26
f3213831
JP
27#define pr_fmt(fmt) "IPv6: " fmt
28
4fc268d2 29#include <linux/capability.h>
1da177e4 30#include <linux/errno.h>
bc3b2d7f 31#include <linux/export.h>
1da177e4
LT
32#include <linux/types.h>
33#include <linux/times.h>
34#include <linux/socket.h>
35#include <linux/sockios.h>
36#include <linux/net.h>
37#include <linux/route.h>
38#include <linux/netdevice.h>
39#include <linux/in6.h>
7bc570c8 40#include <linux/mroute6.h>
1da177e4 41#include <linux/init.h>
1da177e4 42#include <linux/if_arp.h>
1da177e4
LT
43#include <linux/proc_fs.h>
44#include <linux/seq_file.h>
5b7c931d 45#include <linux/nsproxy.h>
5a0e3ad6 46#include <linux/slab.h>
457c4cbc 47#include <net/net_namespace.h>
1da177e4
LT
48#include <net/snmp.h>
49#include <net/ipv6.h>
50#include <net/ip6_fib.h>
51#include <net/ip6_route.h>
52#include <net/ndisc.h>
53#include <net/addrconf.h>
54#include <net/tcp.h>
55#include <linux/rtnetlink.h>
56#include <net/dst.h>
57#include <net/xfrm.h>
8d71740c 58#include <net/netevent.h>
21713ebc 59#include <net/netlink.h>
51ebd318 60#include <net/nexthop.h>
1da177e4
LT
61
62#include <asm/uaccess.h>
63
64#ifdef CONFIG_SYSCTL
65#include <linux/sysctl.h>
66#endif
67
afc154e9 68enum rt6_nud_state {
7e980569
JB
69 RT6_NUD_FAIL_HARD = -3,
70 RT6_NUD_FAIL_PROBE = -2,
71 RT6_NUD_FAIL_DO_RR = -1,
afc154e9
HFS
72 RT6_NUD_SUCCEED = 1
73};
74
1716a961 75static struct rt6_info *ip6_rt_copy(struct rt6_info *ort,
21efcfa0 76 const struct in6_addr *dest);
1da177e4 77static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie);
0dbaee3b 78static unsigned int ip6_default_advmss(const struct dst_entry *dst);
ebb762f2 79static unsigned int ip6_mtu(const struct dst_entry *dst);
1da177e4
LT
80static struct dst_entry *ip6_negative_advice(struct dst_entry *);
81static void ip6_dst_destroy(struct dst_entry *);
82static void ip6_dst_ifdown(struct dst_entry *,
83 struct net_device *dev, int how);
569d3645 84static int ip6_dst_gc(struct dst_ops *ops);
1da177e4
LT
85
86static int ip6_pkt_discard(struct sk_buff *skb);
87static int ip6_pkt_discard_out(struct sk_buff *skb);
7150aede
K
88static int ip6_pkt_prohibit(struct sk_buff *skb);
89static int ip6_pkt_prohibit_out(struct sk_buff *skb);
1da177e4 90static void ip6_link_failure(struct sk_buff *skb);
6700c270
DM
91static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
92 struct sk_buff *skb, u32 mtu);
93static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk,
94 struct sk_buff *skb);
52bd4c0c 95static int rt6_score_route(struct rt6_info *rt, int oif, int strict);
1da177e4 96
70ceb4f5 97#ifdef CONFIG_IPV6_ROUTE_INFO
efa2cea0 98static struct rt6_info *rt6_add_route_info(struct net *net,
b71d1d42
ED
99 const struct in6_addr *prefix, int prefixlen,
100 const struct in6_addr *gwaddr, int ifindex,
95c96174 101 unsigned int pref);
efa2cea0 102static struct rt6_info *rt6_get_route_info(struct net *net,
b71d1d42
ED
103 const struct in6_addr *prefix, int prefixlen,
104 const struct in6_addr *gwaddr, int ifindex);
70ceb4f5
YH
105#endif
106
e8243534 107static void rt6_bind_peer(struct rt6_info *rt, int create)
108{
109 struct inet_peer_base *base;
110 struct inet_peer *peer;
111
112 base = inetpeer_base_ptr(rt->_rt6i_peer);
113 if (!base)
114 return;
115
116 peer = inet_getpeer_v6(base, &rt->rt6i_dst.addr, create);
117 if (peer) {
118 if (!rt6_set_peer(rt, peer))
119 inet_putpeer(peer);
120 }
121}
122
123static struct inet_peer *__rt6_get_peer(struct rt6_info *rt, int create)
124{
125 if (rt6_has_peer(rt))
126 return rt6_peer_ptr(rt);
127
128 rt6_bind_peer(rt, create);
129 return (rt6_has_peer(rt) ? rt6_peer_ptr(rt) : NULL);
130}
131
132static struct inet_peer *rt6_get_peer_create(struct rt6_info *rt)
133{
134 return __rt6_get_peer(rt, 1);
135}
136
06582540
DM
137static u32 *ipv6_cow_metrics(struct dst_entry *dst, unsigned long old)
138{
139 struct rt6_info *rt = (struct rt6_info *) dst;
140 struct inet_peer *peer;
141 u32 *p = NULL;
142
8e2ec639
YZ
143 if (!(rt->dst.flags & DST_HOST))
144 return NULL;
145
fbfe95a4 146 peer = rt6_get_peer_create(rt);
06582540
DM
147 if (peer) {
148 u32 *old_p = __DST_METRICS_PTR(old);
149 unsigned long prev, new;
150
151 p = peer->metrics;
152 if (inet_metrics_new(peer))
153 memcpy(p, old_p, sizeof(u32) * RTAX_MAX);
154
155 new = (unsigned long) p;
156 prev = cmpxchg(&dst->_metrics, old, new);
157
158 if (prev != old) {
159 p = __DST_METRICS_PTR(prev);
160 if (prev & DST_METRICS_READ_ONLY)
161 p = NULL;
162 }
163 }
164 return p;
165}
166
f894cbf8
DM
167static inline const void *choose_neigh_daddr(struct rt6_info *rt,
168 struct sk_buff *skb,
169 const void *daddr)
39232973
DM
170{
171 struct in6_addr *p = &rt->rt6i_gateway;
172
a7563f34 173 if (!ipv6_addr_any(p))
39232973 174 return (const void *) p;
f894cbf8
DM
175 else if (skb)
176 return &ipv6_hdr(skb)->daddr;
39232973
DM
177 return daddr;
178}
179
f894cbf8
DM
180static struct neighbour *ip6_neigh_lookup(const struct dst_entry *dst,
181 struct sk_buff *skb,
182 const void *daddr)
d3aaeb38 183{
39232973
DM
184 struct rt6_info *rt = (struct rt6_info *) dst;
185 struct neighbour *n;
186
f894cbf8 187 daddr = choose_neigh_daddr(rt, skb, daddr);
8e022ee6 188 n = __ipv6_neigh_lookup(dst->dev, daddr);
f83c7790
DM
189 if (n)
190 return n;
191 return neigh_create(&nd_tbl, daddr, dst->dev);
192}
193
9a7ec3a9 194static struct dst_ops ip6_dst_ops_template = {
1da177e4 195 .family = AF_INET6,
09640e63 196 .protocol = cpu_to_be16(ETH_P_IPV6),
1da177e4
LT
197 .gc = ip6_dst_gc,
198 .gc_thresh = 1024,
199 .check = ip6_dst_check,
0dbaee3b 200 .default_advmss = ip6_default_advmss,
ebb762f2 201 .mtu = ip6_mtu,
06582540 202 .cow_metrics = ipv6_cow_metrics,
1da177e4
LT
203 .destroy = ip6_dst_destroy,
204 .ifdown = ip6_dst_ifdown,
205 .negative_advice = ip6_negative_advice,
206 .link_failure = ip6_link_failure,
207 .update_pmtu = ip6_rt_update_pmtu,
6e157b6a 208 .redirect = rt6_do_redirect,
1ac06e03 209 .local_out = __ip6_local_out,
d3aaeb38 210 .neigh_lookup = ip6_neigh_lookup,
1da177e4
LT
211};
212
ebb762f2 213static unsigned int ip6_blackhole_mtu(const struct dst_entry *dst)
ec831ea7 214{
618f9bc7
SK
215 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
216
217 return mtu ? : dst->dev->mtu;
ec831ea7
RD
218}
219
6700c270
DM
220static void ip6_rt_blackhole_update_pmtu(struct dst_entry *dst, struct sock *sk,
221 struct sk_buff *skb, u32 mtu)
14e50e57
DM
222{
223}
224
6700c270
DM
225static void ip6_rt_blackhole_redirect(struct dst_entry *dst, struct sock *sk,
226 struct sk_buff *skb)
b587ee3b
DM
227{
228}
229
0972ddb2
HB
230static u32 *ip6_rt_blackhole_cow_metrics(struct dst_entry *dst,
231 unsigned long old)
232{
233 return NULL;
234}
235
14e50e57
DM
236static struct dst_ops ip6_dst_blackhole_ops = {
237 .family = AF_INET6,
09640e63 238 .protocol = cpu_to_be16(ETH_P_IPV6),
14e50e57
DM
239 .destroy = ip6_dst_destroy,
240 .check = ip6_dst_check,
ebb762f2 241 .mtu = ip6_blackhole_mtu,
214f45c9 242 .default_advmss = ip6_default_advmss,
14e50e57 243 .update_pmtu = ip6_rt_blackhole_update_pmtu,
b587ee3b 244 .redirect = ip6_rt_blackhole_redirect,
0972ddb2 245 .cow_metrics = ip6_rt_blackhole_cow_metrics,
d3aaeb38 246 .neigh_lookup = ip6_neigh_lookup,
14e50e57
DM
247};
248
62fa8a84 249static const u32 ip6_template_metrics[RTAX_MAX] = {
14edd87d 250 [RTAX_HOPLIMIT - 1] = 0,
62fa8a84
DM
251};
252
fb0af4c7 253static const struct rt6_info ip6_null_entry_template = {
d8d1f30b
CG
254 .dst = {
255 .__refcnt = ATOMIC_INIT(1),
256 .__use = 1,
2c20cbd7 257 .obsolete = DST_OBSOLETE_FORCE_CHK,
d8d1f30b 258 .error = -ENETUNREACH,
d8d1f30b
CG
259 .input = ip6_pkt_discard,
260 .output = ip6_pkt_discard_out,
1da177e4
LT
261 },
262 .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
4f724279 263 .rt6i_protocol = RTPROT_KERNEL,
1da177e4
LT
264 .rt6i_metric = ~(u32) 0,
265 .rt6i_ref = ATOMIC_INIT(1),
266};
267
101367c2
TG
268#ifdef CONFIG_IPV6_MULTIPLE_TABLES
269
fb0af4c7 270static const struct rt6_info ip6_prohibit_entry_template = {
d8d1f30b
CG
271 .dst = {
272 .__refcnt = ATOMIC_INIT(1),
273 .__use = 1,
2c20cbd7 274 .obsolete = DST_OBSOLETE_FORCE_CHK,
d8d1f30b 275 .error = -EACCES,
d8d1f30b
CG
276 .input = ip6_pkt_prohibit,
277 .output = ip6_pkt_prohibit_out,
101367c2
TG
278 },
279 .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
4f724279 280 .rt6i_protocol = RTPROT_KERNEL,
101367c2
TG
281 .rt6i_metric = ~(u32) 0,
282 .rt6i_ref = ATOMIC_INIT(1),
283};
284
fb0af4c7 285static const struct rt6_info ip6_blk_hole_entry_template = {
d8d1f30b
CG
286 .dst = {
287 .__refcnt = ATOMIC_INIT(1),
288 .__use = 1,
2c20cbd7 289 .obsolete = DST_OBSOLETE_FORCE_CHK,
d8d1f30b 290 .error = -EINVAL,
d8d1f30b
CG
291 .input = dst_discard,
292 .output = dst_discard,
101367c2
TG
293 },
294 .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
4f724279 295 .rt6i_protocol = RTPROT_KERNEL,
101367c2
TG
296 .rt6i_metric = ~(u32) 0,
297 .rt6i_ref = ATOMIC_INIT(1),
298};
299
300#endif
301
1da177e4 302/* allocate dst with ip6_dst_ops */
97bab73f 303static inline struct rt6_info *ip6_dst_alloc(struct net *net,
957c665f 304 struct net_device *dev,
8b96d22d
DM
305 int flags,
306 struct fib6_table *table)
1da177e4 307{
97bab73f 308 struct rt6_info *rt = dst_alloc(&net->ipv6.ip6_dst_ops, dev,
6f3118b5 309 0, DST_OBSOLETE_FORCE_CHK, flags);
cf911662 310
97bab73f 311 if (rt) {
8104891b
SK
312 struct dst_entry *dst = &rt->dst;
313
314 memset(dst + 1, 0, sizeof(*rt) - sizeof(*dst));
8b96d22d 315 rt6_init_peer(rt, table ? &table->tb6_peers : net->ipv6.peers);
ca4c3fc2 316 rt->rt6i_genid = rt_genid_ipv6(net);
51ebd318 317 INIT_LIST_HEAD(&rt->rt6i_siblings);
97bab73f 318 }
cf911662 319 return rt;
1da177e4
LT
320}
321
322static void ip6_dst_destroy(struct dst_entry *dst)
323{
324 struct rt6_info *rt = (struct rt6_info *)dst;
325 struct inet6_dev *idev = rt->rt6i_idev;
ecd98837 326 struct dst_entry *from = dst->from;
1da177e4 327
8e2ec639
YZ
328 if (!(rt->dst.flags & DST_HOST))
329 dst_destroy_metrics_generic(dst);
330
38308473 331 if (idev) {
1da177e4
LT
332 rt->rt6i_idev = NULL;
333 in6_dev_put(idev);
1ab1457c 334 }
1716a961 335
ecd98837
YH
336 dst->from = NULL;
337 dst_release(from);
1716a961 338
97bab73f
DM
339 if (rt6_has_peer(rt)) {
340 struct inet_peer *peer = rt6_peer_ptr(rt);
b3419363
DM
341 inet_putpeer(peer);
342 }
343}
344
1da177e4
LT
345static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
346 int how)
347{
348 struct rt6_info *rt = (struct rt6_info *)dst;
349 struct inet6_dev *idev = rt->rt6i_idev;
5a3e55d6 350 struct net_device *loopback_dev =
c346dca1 351 dev_net(dev)->loopback_dev;
1da177e4 352
97cac082
DM
353 if (dev != loopback_dev) {
354 if (idev && idev->dev == dev) {
355 struct inet6_dev *loopback_idev =
356 in6_dev_get(loopback_dev);
357 if (loopback_idev) {
358 rt->rt6i_idev = loopback_idev;
359 in6_dev_put(idev);
360 }
361 }
1da177e4
LT
362 }
363}
364
a50feda5 365static bool rt6_check_expired(const struct rt6_info *rt)
1da177e4 366{
1716a961
G
367 if (rt->rt6i_flags & RTF_EXPIRES) {
368 if (time_after(jiffies, rt->dst.expires))
a50feda5 369 return true;
1716a961 370 } else if (rt->dst.from) {
3fd91fb3 371 return rt6_check_expired((struct rt6_info *) rt->dst.from);
1716a961 372 }
a50feda5 373 return false;
1da177e4
LT
374}
375
a50feda5 376static bool rt6_need_strict(const struct in6_addr *daddr)
c71099ac 377{
a02cec21
ED
378 return ipv6_addr_type(daddr) &
379 (IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL | IPV6_ADDR_LOOPBACK);
c71099ac
TG
380}
381
51ebd318
ND
382/* Multipath route selection:
383 * Hash based function using packet header and flowlabel.
384 * Adapted from fib_info_hashfn()
385 */
386static int rt6_info_hash_nhsfn(unsigned int candidate_count,
387 const struct flowi6 *fl6)
388{
389 unsigned int val = fl6->flowi6_proto;
390
c08977bb
YH
391 val ^= ipv6_addr_hash(&fl6->daddr);
392 val ^= ipv6_addr_hash(&fl6->saddr);
51ebd318
ND
393
394 /* Work only if this not encapsulated */
395 switch (fl6->flowi6_proto) {
396 case IPPROTO_UDP:
397 case IPPROTO_TCP:
398 case IPPROTO_SCTP:
b3ce5ae1
ND
399 val ^= (__force u16)fl6->fl6_sport;
400 val ^= (__force u16)fl6->fl6_dport;
51ebd318
ND
401 break;
402
403 case IPPROTO_ICMPV6:
b3ce5ae1
ND
404 val ^= (__force u16)fl6->fl6_icmp_type;
405 val ^= (__force u16)fl6->fl6_icmp_code;
51ebd318
ND
406 break;
407 }
408 /* RFC6438 recommands to use flowlabel */
b3ce5ae1 409 val ^= (__force u32)fl6->flowlabel;
51ebd318
ND
410
411 /* Perhaps, we need to tune, this function? */
412 val = val ^ (val >> 7) ^ (val >> 12);
413 return val % candidate_count;
414}
415
416static struct rt6_info *rt6_multipath_select(struct rt6_info *match,
52bd4c0c
ND
417 struct flowi6 *fl6, int oif,
418 int strict)
51ebd318
ND
419{
420 struct rt6_info *sibling, *next_sibling;
421 int route_choosen;
422
423 route_choosen = rt6_info_hash_nhsfn(match->rt6i_nsiblings + 1, fl6);
424 /* Don't change the route, if route_choosen == 0
425 * (siblings does not include ourself)
426 */
427 if (route_choosen)
428 list_for_each_entry_safe(sibling, next_sibling,
429 &match->rt6i_siblings, rt6i_siblings) {
430 route_choosen--;
431 if (route_choosen == 0) {
52bd4c0c
ND
432 if (rt6_score_route(sibling, oif, strict) < 0)
433 break;
51ebd318
ND
434 match = sibling;
435 break;
436 }
437 }
438 return match;
439}
440
1da177e4 441/*
c71099ac 442 * Route lookup. Any table->tb6_lock is implied.
1da177e4
LT
443 */
444
8ed67789
DL
445static inline struct rt6_info *rt6_device_match(struct net *net,
446 struct rt6_info *rt,
b71d1d42 447 const struct in6_addr *saddr,
1da177e4 448 int oif,
d420895e 449 int flags)
1da177e4
LT
450{
451 struct rt6_info *local = NULL;
452 struct rt6_info *sprt;
453
dd3abc4e
YH
454 if (!oif && ipv6_addr_any(saddr))
455 goto out;
456
d8d1f30b 457 for (sprt = rt; sprt; sprt = sprt->dst.rt6_next) {
d1918542 458 struct net_device *dev = sprt->dst.dev;
dd3abc4e
YH
459
460 if (oif) {
1da177e4
LT
461 if (dev->ifindex == oif)
462 return sprt;
463 if (dev->flags & IFF_LOOPBACK) {
38308473 464 if (!sprt->rt6i_idev ||
1da177e4 465 sprt->rt6i_idev->dev->ifindex != oif) {
d420895e 466 if (flags & RT6_LOOKUP_F_IFACE && oif)
1da177e4 467 continue;
1ab1457c 468 if (local && (!oif ||
1da177e4
LT
469 local->rt6i_idev->dev->ifindex == oif))
470 continue;
471 }
472 local = sprt;
473 }
dd3abc4e
YH
474 } else {
475 if (ipv6_chk_addr(net, saddr, dev,
476 flags & RT6_LOOKUP_F_IFACE))
477 return sprt;
1da177e4 478 }
dd3abc4e 479 }
1da177e4 480
dd3abc4e 481 if (oif) {
1da177e4
LT
482 if (local)
483 return local;
484
d420895e 485 if (flags & RT6_LOOKUP_F_IFACE)
8ed67789 486 return net->ipv6.ip6_null_entry;
1da177e4 487 }
dd3abc4e 488out:
1da177e4
LT
489 return rt;
490}
491
27097255 492#ifdef CONFIG_IPV6_ROUTER_PREF
c2f17e82
HFS
493struct __rt6_probe_work {
494 struct work_struct work;
495 struct in6_addr target;
496 struct net_device *dev;
497};
498
499static void rt6_probe_deferred(struct work_struct *w)
500{
501 struct in6_addr mcaddr;
502 struct __rt6_probe_work *work =
503 container_of(w, struct __rt6_probe_work, work);
504
505 addrconf_addr_solict_mult(&work->target, &mcaddr);
506 ndisc_send_ns(work->dev, NULL, &work->target, &mcaddr, NULL);
507 dev_put(work->dev);
508 kfree(w);
509}
510
27097255
YH
511static void rt6_probe(struct rt6_info *rt)
512{
f2c31e32 513 struct neighbour *neigh;
27097255
YH
514 /*
515 * Okay, this does not seem to be appropriate
516 * for now, however, we need to check if it
517 * is really so; aka Router Reachability Probing.
518 *
519 * Router Reachability Probe MUST be rate-limited
520 * to no more than one per minute.
521 */
2152caea 522 if (!rt || !(rt->rt6i_flags & RTF_GATEWAY))
7ff74a59 523 return;
2152caea
YH
524 rcu_read_lock_bh();
525 neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
526 if (neigh) {
527 write_lock(&neigh->lock);
528 if (neigh->nud_state & NUD_VALID)
529 goto out;
7ff74a59 530 }
2152caea
YH
531
532 if (!neigh ||
52e16356 533 time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) {
c2f17e82 534 struct __rt6_probe_work *work;
27097255 535
c2f17e82
HFS
536 work = kmalloc(sizeof(*work), GFP_ATOMIC);
537
538 if (neigh && work)
7e980569 539 __neigh_set_probe_once(neigh);
c2f17e82
HFS
540
541 if (neigh)
2152caea
YH
542 write_unlock(&neigh->lock);
543
c2f17e82
HFS
544 if (work) {
545 INIT_WORK(&work->work, rt6_probe_deferred);
546 work->target = rt->rt6i_gateway;
547 dev_hold(rt->dst.dev);
548 work->dev = rt->dst.dev;
549 schedule_work(&work->work);
550 }
f2c31e32 551 } else {
2152caea
YH
552out:
553 write_unlock(&neigh->lock);
f2c31e32 554 }
2152caea 555 rcu_read_unlock_bh();
27097255
YH
556}
557#else
558static inline void rt6_probe(struct rt6_info *rt)
559{
27097255
YH
560}
561#endif
562
1da177e4 563/*
554cfb7e 564 * Default Router Selection (RFC 2461 6.3.6)
1da177e4 565 */
b6f99a21 566static inline int rt6_check_dev(struct rt6_info *rt, int oif)
554cfb7e 567{
d1918542 568 struct net_device *dev = rt->dst.dev;
161980f4 569 if (!oif || dev->ifindex == oif)
554cfb7e 570 return 2;
161980f4
DM
571 if ((dev->flags & IFF_LOOPBACK) &&
572 rt->rt6i_idev && rt->rt6i_idev->dev->ifindex == oif)
573 return 1;
574 return 0;
554cfb7e 575}
1da177e4 576
afc154e9 577static inline enum rt6_nud_state rt6_check_neigh(struct rt6_info *rt)
1da177e4 578{
f2c31e32 579 struct neighbour *neigh;
afc154e9 580 enum rt6_nud_state ret = RT6_NUD_FAIL_HARD;
f2c31e32 581
4d0c5911
YH
582 if (rt->rt6i_flags & RTF_NONEXTHOP ||
583 !(rt->rt6i_flags & RTF_GATEWAY))
afc154e9 584 return RT6_NUD_SUCCEED;
145a3621
YH
585
586 rcu_read_lock_bh();
587 neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
588 if (neigh) {
589 read_lock(&neigh->lock);
554cfb7e 590 if (neigh->nud_state & NUD_VALID)
afc154e9 591 ret = RT6_NUD_SUCCEED;
398bcbeb 592#ifdef CONFIG_IPV6_ROUTER_PREF
a5a81f0b 593 else if (!(neigh->nud_state & NUD_FAILED))
afc154e9 594 ret = RT6_NUD_SUCCEED;
7e980569
JB
595 else
596 ret = RT6_NUD_FAIL_PROBE;
398bcbeb 597#endif
145a3621 598 read_unlock(&neigh->lock);
afc154e9
HFS
599 } else {
600 ret = IS_ENABLED(CONFIG_IPV6_ROUTER_PREF) ?
7e980569 601 RT6_NUD_SUCCEED : RT6_NUD_FAIL_DO_RR;
a5a81f0b 602 }
145a3621
YH
603 rcu_read_unlock_bh();
604
a5a81f0b 605 return ret;
1da177e4
LT
606}
607
554cfb7e
YH
608static int rt6_score_route(struct rt6_info *rt, int oif,
609 int strict)
1da177e4 610{
a5a81f0b 611 int m;
1ab1457c 612
4d0c5911 613 m = rt6_check_dev(rt, oif);
77d16f45 614 if (!m && (strict & RT6_LOOKUP_F_IFACE))
afc154e9 615 return RT6_NUD_FAIL_HARD;
ebacaaa0
YH
616#ifdef CONFIG_IPV6_ROUTER_PREF
617 m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2;
618#endif
afc154e9
HFS
619 if (strict & RT6_LOOKUP_F_REACHABLE) {
620 int n = rt6_check_neigh(rt);
621 if (n < 0)
622 return n;
623 }
554cfb7e
YH
624 return m;
625}
626
f11e6659 627static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict,
afc154e9
HFS
628 int *mpri, struct rt6_info *match,
629 bool *do_rr)
554cfb7e 630{
f11e6659 631 int m;
afc154e9 632 bool match_do_rr = false;
f11e6659
DM
633
634 if (rt6_check_expired(rt))
635 goto out;
636
637 m = rt6_score_route(rt, oif, strict);
7e980569 638 if (m == RT6_NUD_FAIL_DO_RR) {
afc154e9
HFS
639 match_do_rr = true;
640 m = 0; /* lowest valid score */
7e980569 641 } else if (m == RT6_NUD_FAIL_HARD) {
f11e6659 642 goto out;
afc154e9
HFS
643 }
644
645 if (strict & RT6_LOOKUP_F_REACHABLE)
646 rt6_probe(rt);
f11e6659 647
7e980569 648 /* note that m can be RT6_NUD_FAIL_PROBE at this point */
f11e6659 649 if (m > *mpri) {
afc154e9 650 *do_rr = match_do_rr;
f11e6659
DM
651 *mpri = m;
652 match = rt;
f11e6659 653 }
f11e6659
DM
654out:
655 return match;
656}
657
658static struct rt6_info *find_rr_leaf(struct fib6_node *fn,
659 struct rt6_info *rr_head,
afc154e9
HFS
660 u32 metric, int oif, int strict,
661 bool *do_rr)
f11e6659
DM
662{
663 struct rt6_info *rt, *match;
554cfb7e 664 int mpri = -1;
1da177e4 665
f11e6659
DM
666 match = NULL;
667 for (rt = rr_head; rt && rt->rt6i_metric == metric;
d8d1f30b 668 rt = rt->dst.rt6_next)
afc154e9 669 match = find_match(rt, oif, strict, &mpri, match, do_rr);
f11e6659 670 for (rt = fn->leaf; rt && rt != rr_head && rt->rt6i_metric == metric;
d8d1f30b 671 rt = rt->dst.rt6_next)
afc154e9 672 match = find_match(rt, oif, strict, &mpri, match, do_rr);
1da177e4 673
f11e6659
DM
674 return match;
675}
1da177e4 676
f11e6659
DM
677static struct rt6_info *rt6_select(struct fib6_node *fn, int oif, int strict)
678{
679 struct rt6_info *match, *rt0;
8ed67789 680 struct net *net;
afc154e9 681 bool do_rr = false;
1da177e4 682
f11e6659
DM
683 rt0 = fn->rr_ptr;
684 if (!rt0)
685 fn->rr_ptr = rt0 = fn->leaf;
1da177e4 686
afc154e9
HFS
687 match = find_rr_leaf(fn, rt0, rt0->rt6i_metric, oif, strict,
688 &do_rr);
1da177e4 689
afc154e9 690 if (do_rr) {
d8d1f30b 691 struct rt6_info *next = rt0->dst.rt6_next;
f11e6659 692
554cfb7e 693 /* no entries matched; do round-robin */
f11e6659
DM
694 if (!next || next->rt6i_metric != rt0->rt6i_metric)
695 next = fn->leaf;
696
697 if (next != rt0)
698 fn->rr_ptr = next;
1da177e4 699 }
1da177e4 700
d1918542 701 net = dev_net(rt0->dst.dev);
a02cec21 702 return match ? match : net->ipv6.ip6_null_entry;
1da177e4
LT
703}
704
70ceb4f5
YH
705#ifdef CONFIG_IPV6_ROUTE_INFO
706int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
b71d1d42 707 const struct in6_addr *gwaddr)
70ceb4f5 708{
c346dca1 709 struct net *net = dev_net(dev);
70ceb4f5
YH
710 struct route_info *rinfo = (struct route_info *) opt;
711 struct in6_addr prefix_buf, *prefix;
712 unsigned int pref;
4bed72e4 713 unsigned long lifetime;
70ceb4f5
YH
714 struct rt6_info *rt;
715
716 if (len < sizeof(struct route_info)) {
717 return -EINVAL;
718 }
719
720 /* Sanity check for prefix_len and length */
721 if (rinfo->length > 3) {
722 return -EINVAL;
723 } else if (rinfo->prefix_len > 128) {
724 return -EINVAL;
725 } else if (rinfo->prefix_len > 64) {
726 if (rinfo->length < 2) {
727 return -EINVAL;
728 }
729 } else if (rinfo->prefix_len > 0) {
730 if (rinfo->length < 1) {
731 return -EINVAL;
732 }
733 }
734
735 pref = rinfo->route_pref;
736 if (pref == ICMPV6_ROUTER_PREF_INVALID)
3933fc95 737 return -EINVAL;
70ceb4f5 738
4bed72e4 739 lifetime = addrconf_timeout_fixup(ntohl(rinfo->lifetime), HZ);
70ceb4f5
YH
740
741 if (rinfo->length == 3)
742 prefix = (struct in6_addr *)rinfo->prefix;
743 else {
744 /* this function is safe */
745 ipv6_addr_prefix(&prefix_buf,
746 (struct in6_addr *)rinfo->prefix,
747 rinfo->prefix_len);
748 prefix = &prefix_buf;
749 }
750
f104a567
DJ
751 if (rinfo->prefix_len == 0)
752 rt = rt6_get_dflt_router(gwaddr, dev);
753 else
754 rt = rt6_get_route_info(net, prefix, rinfo->prefix_len,
755 gwaddr, dev->ifindex);
70ceb4f5
YH
756
757 if (rt && !lifetime) {
e0a1ad73 758 ip6_del_rt(rt);
70ceb4f5
YH
759 rt = NULL;
760 }
761
762 if (!rt && lifetime)
efa2cea0 763 rt = rt6_add_route_info(net, prefix, rinfo->prefix_len, gwaddr, dev->ifindex,
70ceb4f5
YH
764 pref);
765 else if (rt)
766 rt->rt6i_flags = RTF_ROUTEINFO |
767 (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
768
769 if (rt) {
1716a961
G
770 if (!addrconf_finite_timeout(lifetime))
771 rt6_clean_expires(rt);
772 else
773 rt6_set_expires(rt, jiffies + HZ * lifetime);
774
94e187c0 775 ip6_rt_put(rt);
70ceb4f5
YH
776 }
777 return 0;
778}
779#endif
780
8ed67789 781#define BACKTRACK(__net, saddr) \
982f56f3 782do { \
8ed67789 783 if (rt == __net->ipv6.ip6_null_entry) { \
982f56f3 784 struct fib6_node *pn; \
e0eda7bb 785 while (1) { \
982f56f3
YH
786 if (fn->fn_flags & RTN_TL_ROOT) \
787 goto out; \
788 pn = fn->parent; \
789 if (FIB6_SUBTREE(pn) && FIB6_SUBTREE(pn) != fn) \
8bce65b9 790 fn = fib6_lookup(FIB6_SUBTREE(pn), NULL, saddr); \
982f56f3
YH
791 else \
792 fn = pn; \
793 if (fn->fn_flags & RTN_RTINFO) \
794 goto restart; \
c71099ac 795 } \
c71099ac 796 } \
38308473 797} while (0)
c71099ac 798
8ed67789
DL
799static struct rt6_info *ip6_pol_route_lookup(struct net *net,
800 struct fib6_table *table,
4c9483b2 801 struct flowi6 *fl6, int flags)
1da177e4
LT
802{
803 struct fib6_node *fn;
804 struct rt6_info *rt;
805
c71099ac 806 read_lock_bh(&table->tb6_lock);
4c9483b2 807 fn = fib6_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
c71099ac
TG
808restart:
809 rt = fn->leaf;
4c9483b2 810 rt = rt6_device_match(net, rt, &fl6->saddr, fl6->flowi6_oif, flags);
51ebd318 811 if (rt->rt6i_nsiblings && fl6->flowi6_oif == 0)
52bd4c0c 812 rt = rt6_multipath_select(rt, fl6, fl6->flowi6_oif, flags);
4c9483b2 813 BACKTRACK(net, &fl6->saddr);
c71099ac 814out:
d8d1f30b 815 dst_use(&rt->dst, jiffies);
c71099ac 816 read_unlock_bh(&table->tb6_lock);
c71099ac
TG
817 return rt;
818
819}
820
ea6e574e
FW
821struct dst_entry * ip6_route_lookup(struct net *net, struct flowi6 *fl6,
822 int flags)
823{
824 return fib6_rule_lookup(net, fl6, flags, ip6_pol_route_lookup);
825}
826EXPORT_SYMBOL_GPL(ip6_route_lookup);
827
9acd9f3a
YH
828struct rt6_info *rt6_lookup(struct net *net, const struct in6_addr *daddr,
829 const struct in6_addr *saddr, int oif, int strict)
c71099ac 830{
4c9483b2
DM
831 struct flowi6 fl6 = {
832 .flowi6_oif = oif,
833 .daddr = *daddr,
c71099ac
TG
834 };
835 struct dst_entry *dst;
77d16f45 836 int flags = strict ? RT6_LOOKUP_F_IFACE : 0;
c71099ac 837
adaa70bb 838 if (saddr) {
4c9483b2 839 memcpy(&fl6.saddr, saddr, sizeof(*saddr));
adaa70bb
TG
840 flags |= RT6_LOOKUP_F_HAS_SADDR;
841 }
842
4c9483b2 843 dst = fib6_rule_lookup(net, &fl6, flags, ip6_pol_route_lookup);
c71099ac
TG
844 if (dst->error == 0)
845 return (struct rt6_info *) dst;
846
847 dst_release(dst);
848
1da177e4
LT
849 return NULL;
850}
851
7159039a
YH
852EXPORT_SYMBOL(rt6_lookup);
853
c71099ac 854/* ip6_ins_rt is called with FREE table->tb6_lock.
1da177e4
LT
855 It takes new route entry, the addition fails by any reason the
856 route is freed. In any case, if caller does not hold it, it may
857 be destroyed.
858 */
859
86872cb5 860static int __ip6_ins_rt(struct rt6_info *rt, struct nl_info *info)
1da177e4
LT
861{
862 int err;
c71099ac 863 struct fib6_table *table;
1da177e4 864
c71099ac
TG
865 table = rt->rt6i_table;
866 write_lock_bh(&table->tb6_lock);
86872cb5 867 err = fib6_add(&table->tb6_root, rt, info);
c71099ac 868 write_unlock_bh(&table->tb6_lock);
1da177e4
LT
869
870 return err;
871}
872
40e22e8f
TG
873int ip6_ins_rt(struct rt6_info *rt)
874{
4d1169c1 875 struct nl_info info = {
d1918542 876 .nl_net = dev_net(rt->dst.dev),
4d1169c1 877 };
528c4ceb 878 return __ip6_ins_rt(rt, &info);
40e22e8f
TG
879}
880
1716a961 881static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort,
21efcfa0 882 const struct in6_addr *daddr,
b71d1d42 883 const struct in6_addr *saddr)
1da177e4 884{
1da177e4
LT
885 struct rt6_info *rt;
886
887 /*
888 * Clone the route.
889 */
890
21efcfa0 891 rt = ip6_rt_copy(ort, daddr);
1da177e4
LT
892
893 if (rt) {
249a3630
DJ
894 if (ort->rt6i_dst.plen != 128 &&
895 ipv6_addr_equal(&ort->rt6i_dst.addr, daddr))
896 rt->rt6i_flags |= RTF_ANYCAST;
1da177e4 897
1da177e4 898 rt->rt6i_flags |= RTF_CACHE;
1da177e4
LT
899
900#ifdef CONFIG_IPV6_SUBTREES
901 if (rt->rt6i_src.plen && saddr) {
4e3fd7a0 902 rt->rt6i_src.addr = *saddr;
1da177e4
LT
903 rt->rt6i_src.plen = 128;
904 }
905#endif
95a9a5ba 906 }
1da177e4 907
95a9a5ba
YH
908 return rt;
909}
1da177e4 910
21efcfa0
ED
911static struct rt6_info *rt6_alloc_clone(struct rt6_info *ort,
912 const struct in6_addr *daddr)
299d9939 913{
21efcfa0
ED
914 struct rt6_info *rt = ip6_rt_copy(ort, daddr);
915
887c95cc 916 if (rt)
299d9939 917 rt->rt6i_flags |= RTF_CACHE;
299d9939
YH
918 return rt;
919}
920
8ed67789 921static struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, int oif,
4c9483b2 922 struct flowi6 *fl6, int flags)
1da177e4
LT
923{
924 struct fib6_node *fn;
519fbd87 925 struct rt6_info *rt, *nrt;
c71099ac 926 int strict = 0;
1da177e4 927 int attempts = 3;
519fbd87 928 int err;
53b7997f 929 int reachable = net->ipv6.devconf_all->forwarding ? 0 : RT6_LOOKUP_F_REACHABLE;
1da177e4 930
77d16f45 931 strict |= flags & RT6_LOOKUP_F_IFACE;
1da177e4
LT
932
933relookup:
c71099ac 934 read_lock_bh(&table->tb6_lock);
1da177e4 935
8238dd06 936restart_2:
4c9483b2 937 fn = fib6_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
1da177e4
LT
938
939restart:
4acad72d 940 rt = rt6_select(fn, oif, strict | reachable);
52bd4c0c
ND
941 if (rt->rt6i_nsiblings)
942 rt = rt6_multipath_select(rt, fl6, oif, strict | reachable);
4c9483b2 943 BACKTRACK(net, &fl6->saddr);
8ed67789 944 if (rt == net->ipv6.ip6_null_entry ||
8238dd06 945 rt->rt6i_flags & RTF_CACHE)
1ddef044 946 goto out;
1da177e4 947
d8d1f30b 948 dst_hold(&rt->dst);
c71099ac 949 read_unlock_bh(&table->tb6_lock);
fb9de91e 950
c440f160 951 if (!(rt->rt6i_flags & (RTF_NONEXTHOP | RTF_GATEWAY)))
4c9483b2 952 nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr);
7343ff31 953 else if (!(rt->dst.flags & DST_HOST))
4c9483b2 954 nrt = rt6_alloc_clone(rt, &fl6->daddr);
7343ff31
DM
955 else
956 goto out2;
e40cf353 957
94e187c0 958 ip6_rt_put(rt);
8ed67789 959 rt = nrt ? : net->ipv6.ip6_null_entry;
1da177e4 960
d8d1f30b 961 dst_hold(&rt->dst);
519fbd87 962 if (nrt) {
40e22e8f 963 err = ip6_ins_rt(nrt);
519fbd87 964 if (!err)
1da177e4 965 goto out2;
1da177e4 966 }
1da177e4 967
519fbd87
YH
968 if (--attempts <= 0)
969 goto out2;
970
971 /*
c71099ac 972 * Race condition! In the gap, when table->tb6_lock was
519fbd87
YH
973 * released someone could insert this route. Relookup.
974 */
94e187c0 975 ip6_rt_put(rt);
519fbd87
YH
976 goto relookup;
977
978out:
8238dd06
YH
979 if (reachable) {
980 reachable = 0;
981 goto restart_2;
982 }
d8d1f30b 983 dst_hold(&rt->dst);
c71099ac 984 read_unlock_bh(&table->tb6_lock);
1da177e4 985out2:
d8d1f30b
CG
986 rt->dst.lastuse = jiffies;
987 rt->dst.__use++;
c71099ac
TG
988
989 return rt;
1da177e4
LT
990}
991
8ed67789 992static struct rt6_info *ip6_pol_route_input(struct net *net, struct fib6_table *table,
4c9483b2 993 struct flowi6 *fl6, int flags)
4acad72d 994{
4c9483b2 995 return ip6_pol_route(net, table, fl6->flowi6_iif, fl6, flags);
4acad72d
PE
996}
997
72331bc0
SL
998static struct dst_entry *ip6_route_input_lookup(struct net *net,
999 struct net_device *dev,
1000 struct flowi6 *fl6, int flags)
1001{
1002 if (rt6_need_strict(&fl6->daddr) && dev->type != ARPHRD_PIMREG)
1003 flags |= RT6_LOOKUP_F_IFACE;
1004
1005 return fib6_rule_lookup(net, fl6, flags, ip6_pol_route_input);
1006}
1007
c71099ac
TG
1008void ip6_route_input(struct sk_buff *skb)
1009{
b71d1d42 1010 const struct ipv6hdr *iph = ipv6_hdr(skb);
c346dca1 1011 struct net *net = dev_net(skb->dev);
adaa70bb 1012 int flags = RT6_LOOKUP_F_HAS_SADDR;
4c9483b2
DM
1013 struct flowi6 fl6 = {
1014 .flowi6_iif = skb->dev->ifindex,
1015 .daddr = iph->daddr,
1016 .saddr = iph->saddr,
6502ca52 1017 .flowlabel = ip6_flowinfo(iph),
4c9483b2
DM
1018 .flowi6_mark = skb->mark,
1019 .flowi6_proto = iph->nexthdr,
c71099ac 1020 };
adaa70bb 1021
72331bc0 1022 skb_dst_set(skb, ip6_route_input_lookup(net, skb->dev, &fl6, flags));
c71099ac
TG
1023}
1024
8ed67789 1025static struct rt6_info *ip6_pol_route_output(struct net *net, struct fib6_table *table,
4c9483b2 1026 struct flowi6 *fl6, int flags)
1da177e4 1027{
4c9483b2 1028 return ip6_pol_route(net, table, fl6->flowi6_oif, fl6, flags);
c71099ac
TG
1029}
1030
9c7a4f9c 1031struct dst_entry * ip6_route_output(struct net *net, const struct sock *sk,
4c9483b2 1032 struct flowi6 *fl6)
c71099ac
TG
1033{
1034 int flags = 0;
1035
1fb9489b 1036 fl6->flowi6_iif = LOOPBACK_IFINDEX;
4dc27d1c 1037
4c9483b2 1038 if ((sk && sk->sk_bound_dev_if) || rt6_need_strict(&fl6->daddr))
77d16f45 1039 flags |= RT6_LOOKUP_F_IFACE;
c71099ac 1040
4c9483b2 1041 if (!ipv6_addr_any(&fl6->saddr))
adaa70bb 1042 flags |= RT6_LOOKUP_F_HAS_SADDR;
0c9a2ac1
YH
1043 else if (sk)
1044 flags |= rt6_srcprefs2flags(inet6_sk(sk)->srcprefs);
adaa70bb 1045
4c9483b2 1046 return fib6_rule_lookup(net, fl6, flags, ip6_pol_route_output);
1da177e4
LT
1047}
1048
7159039a 1049EXPORT_SYMBOL(ip6_route_output);
1da177e4 1050
2774c131 1051struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_orig)
14e50e57 1052{
5c1e6aa3 1053 struct rt6_info *rt, *ort = (struct rt6_info *) dst_orig;
14e50e57
DM
1054 struct dst_entry *new = NULL;
1055
f5b0a874 1056 rt = dst_alloc(&ip6_dst_blackhole_ops, ort->dst.dev, 1, DST_OBSOLETE_NONE, 0);
14e50e57 1057 if (rt) {
d8d1f30b 1058 new = &rt->dst;
14e50e57 1059
8104891b
SK
1060 memset(new + 1, 0, sizeof(*rt) - sizeof(*new));
1061 rt6_init_peer(rt, net->ipv6.peers);
1062
14e50e57 1063 new->__use = 1;
352e512c
HX
1064 new->input = dst_discard;
1065 new->output = dst_discard;
14e50e57 1066
21efcfa0
ED
1067 if (dst_metrics_read_only(&ort->dst))
1068 new->_metrics = ort->dst._metrics;
1069 else
1070 dst_copy_metrics(new, &ort->dst);
14e50e57
DM
1071 rt->rt6i_idev = ort->rt6i_idev;
1072 if (rt->rt6i_idev)
1073 in6_dev_hold(rt->rt6i_idev);
14e50e57 1074
4e3fd7a0 1075 rt->rt6i_gateway = ort->rt6i_gateway;
1716a961 1076 rt->rt6i_flags = ort->rt6i_flags;
14e50e57
DM
1077 rt->rt6i_metric = 0;
1078
1079 memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key));
1080#ifdef CONFIG_IPV6_SUBTREES
1081 memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key));
1082#endif
1083
1084 dst_free(new);
1085 }
1086
69ead7af
DM
1087 dst_release(dst_orig);
1088 return new ? new : ERR_PTR(-ENOMEM);
14e50e57 1089}
14e50e57 1090
1da177e4
LT
1091/*
1092 * Destination cache support functions
1093 */
1094
1095static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie)
1096{
1097 struct rt6_info *rt;
1098
1099 rt = (struct rt6_info *) dst;
1100
6f3118b5
ND
1101 /* All IPV6 dsts are created with ->obsolete set to the value
1102 * DST_OBSOLETE_FORCE_CHK which forces validation calls down
1103 * into this function always.
1104 */
ca4c3fc2 1105 if (rt->rt6i_genid != rt_genid_ipv6(dev_net(rt->dst.dev)))
6f3118b5
ND
1106 return NULL;
1107
e3bc10bd
HFS
1108 if (!rt->rt6i_node || (rt->rt6i_node->fn_sernum != cookie))
1109 return NULL;
a4477c4d 1110
e3bc10bd
HFS
1111 if (rt6_check_expired(rt))
1112 return NULL;
1113
1114 return dst;
1da177e4
LT
1115}
1116
1117static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)
1118{
1119 struct rt6_info *rt = (struct rt6_info *) dst;
1120
1121 if (rt) {
54c1a859
YH
1122 if (rt->rt6i_flags & RTF_CACHE) {
1123 if (rt6_check_expired(rt)) {
1124 ip6_del_rt(rt);
1125 dst = NULL;
1126 }
1127 } else {
1da177e4 1128 dst_release(dst);
54c1a859
YH
1129 dst = NULL;
1130 }
1da177e4 1131 }
54c1a859 1132 return dst;
1da177e4
LT
1133}
1134
1135static void ip6_link_failure(struct sk_buff *skb)
1136{
1137 struct rt6_info *rt;
1138
3ffe533c 1139 icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0);
1da177e4 1140
adf30907 1141 rt = (struct rt6_info *) skb_dst(skb);
1da177e4 1142 if (rt) {
1eb4f758
HFS
1143 if (rt->rt6i_flags & RTF_CACHE) {
1144 dst_hold(&rt->dst);
1145 if (ip6_del_rt(rt))
1146 dst_free(&rt->dst);
1147 } else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT)) {
1da177e4 1148 rt->rt6i_node->fn_sernum = -1;
1eb4f758 1149 }
1da177e4
LT
1150 }
1151}
1152
6700c270
DM
1153static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
1154 struct sk_buff *skb, u32 mtu)
1da177e4
LT
1155{
1156 struct rt6_info *rt6 = (struct rt6_info*)dst;
1157
81aded24 1158 dst_confirm(dst);
1da177e4 1159 if (mtu < dst_mtu(dst) && rt6->rt6i_dst.plen == 128) {
81aded24
DM
1160 struct net *net = dev_net(dst->dev);
1161
1da177e4
LT
1162 rt6->rt6i_flags |= RTF_MODIFIED;
1163 if (mtu < IPV6_MIN_MTU) {
defb3519 1164 u32 features = dst_metric(dst, RTAX_FEATURES);
1da177e4 1165 mtu = IPV6_MIN_MTU;
defb3519
DM
1166 features |= RTAX_FEATURE_ALLFRAG;
1167 dst_metric_set(dst, RTAX_FEATURES, features);
1da177e4 1168 }
defb3519 1169 dst_metric_set(dst, RTAX_MTU, mtu);
81aded24 1170 rt6_update_expires(rt6, net->ipv6.sysctl.ip6_rt_mtu_expires);
1da177e4
LT
1171 }
1172}
1173
42ae66c8
DM
1174void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu,
1175 int oif, u32 mark)
81aded24
DM
1176{
1177 const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data;
1178 struct dst_entry *dst;
1179 struct flowi6 fl6;
1180
1181 memset(&fl6, 0, sizeof(fl6));
1182 fl6.flowi6_oif = oif;
1183 fl6.flowi6_mark = mark;
81aded24
DM
1184 fl6.daddr = iph->daddr;
1185 fl6.saddr = iph->saddr;
6502ca52 1186 fl6.flowlabel = ip6_flowinfo(iph);
81aded24
DM
1187
1188 dst = ip6_route_output(net, NULL, &fl6);
1189 if (!dst->error)
6700c270 1190 ip6_rt_update_pmtu(dst, NULL, skb, ntohl(mtu));
81aded24
DM
1191 dst_release(dst);
1192}
1193EXPORT_SYMBOL_GPL(ip6_update_pmtu);
1194
1195void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, __be32 mtu)
1196{
1197 ip6_update_pmtu(skb, sock_net(sk), mtu,
1198 sk->sk_bound_dev_if, sk->sk_mark);
1199}
1200EXPORT_SYMBOL_GPL(ip6_sk_update_pmtu);
1201
b55b76b2
DJ
1202/* Handle redirects */
1203struct ip6rd_flowi {
1204 struct flowi6 fl6;
1205 struct in6_addr gateway;
1206};
1207
1208static struct rt6_info *__ip6_route_redirect(struct net *net,
1209 struct fib6_table *table,
1210 struct flowi6 *fl6,
1211 int flags)
1212{
1213 struct ip6rd_flowi *rdfl = (struct ip6rd_flowi *)fl6;
1214 struct rt6_info *rt;
1215 struct fib6_node *fn;
1216
1217 /* Get the "current" route for this destination and
1218 * check if the redirect has come from approriate router.
1219 *
1220 * RFC 4861 specifies that redirects should only be
1221 * accepted if they come from the nexthop to the target.
1222 * Due to the way the routes are chosen, this notion
1223 * is a bit fuzzy and one might need to check all possible
1224 * routes.
1225 */
1226
1227 read_lock_bh(&table->tb6_lock);
1228 fn = fib6_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
1229restart:
1230 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
1231 if (rt6_check_expired(rt))
1232 continue;
1233 if (rt->dst.error)
1234 break;
1235 if (!(rt->rt6i_flags & RTF_GATEWAY))
1236 continue;
1237 if (fl6->flowi6_oif != rt->dst.dev->ifindex)
1238 continue;
1239 if (!ipv6_addr_equal(&rdfl->gateway, &rt->rt6i_gateway))
1240 continue;
1241 break;
1242 }
1243
1244 if (!rt)
1245 rt = net->ipv6.ip6_null_entry;
1246 else if (rt->dst.error) {
1247 rt = net->ipv6.ip6_null_entry;
1248 goto out;
1249 }
1250 BACKTRACK(net, &fl6->saddr);
1251out:
1252 dst_hold(&rt->dst);
1253
1254 read_unlock_bh(&table->tb6_lock);
1255
1256 return rt;
1257};
1258
1259static struct dst_entry *ip6_route_redirect(struct net *net,
1260 const struct flowi6 *fl6,
1261 const struct in6_addr *gateway)
1262{
1263 int flags = RT6_LOOKUP_F_HAS_SADDR;
1264 struct ip6rd_flowi rdfl;
1265
1266 rdfl.fl6 = *fl6;
1267 rdfl.gateway = *gateway;
1268
1269 return fib6_rule_lookup(net, &rdfl.fl6,
1270 flags, __ip6_route_redirect);
1271}
1272
3a5ad2ee
DM
1273void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark)
1274{
1275 const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data;
1276 struct dst_entry *dst;
1277 struct flowi6 fl6;
1278
1279 memset(&fl6, 0, sizeof(fl6));
1280 fl6.flowi6_oif = oif;
1281 fl6.flowi6_mark = mark;
3a5ad2ee
DM
1282 fl6.daddr = iph->daddr;
1283 fl6.saddr = iph->saddr;
6502ca52 1284 fl6.flowlabel = ip6_flowinfo(iph);
3a5ad2ee 1285
b55b76b2
DJ
1286 dst = ip6_route_redirect(net, &fl6, &ipv6_hdr(skb)->saddr);
1287 rt6_do_redirect(dst, NULL, skb);
3a5ad2ee
DM
1288 dst_release(dst);
1289}
1290EXPORT_SYMBOL_GPL(ip6_redirect);
1291
c92a59ec
DJ
1292void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif,
1293 u32 mark)
1294{
1295 const struct ipv6hdr *iph = ipv6_hdr(skb);
1296 const struct rd_msg *msg = (struct rd_msg *)icmp6_hdr(skb);
1297 struct dst_entry *dst;
1298 struct flowi6 fl6;
1299
1300 memset(&fl6, 0, sizeof(fl6));
1301 fl6.flowi6_oif = oif;
1302 fl6.flowi6_mark = mark;
c92a59ec
DJ
1303 fl6.daddr = msg->dest;
1304 fl6.saddr = iph->daddr;
1305
b55b76b2
DJ
1306 dst = ip6_route_redirect(net, &fl6, &iph->saddr);
1307 rt6_do_redirect(dst, NULL, skb);
c92a59ec
DJ
1308 dst_release(dst);
1309}
1310
3a5ad2ee
DM
1311void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk)
1312{
1313 ip6_redirect(skb, sock_net(sk), sk->sk_bound_dev_if, sk->sk_mark);
1314}
1315EXPORT_SYMBOL_GPL(ip6_sk_redirect);
1316
0dbaee3b 1317static unsigned int ip6_default_advmss(const struct dst_entry *dst)
1da177e4 1318{
0dbaee3b
DM
1319 struct net_device *dev = dst->dev;
1320 unsigned int mtu = dst_mtu(dst);
1321 struct net *net = dev_net(dev);
1322
1da177e4
LT
1323 mtu -= sizeof(struct ipv6hdr) + sizeof(struct tcphdr);
1324
5578689a
DL
1325 if (mtu < net->ipv6.sysctl.ip6_rt_min_advmss)
1326 mtu = net->ipv6.sysctl.ip6_rt_min_advmss;
1da177e4
LT
1327
1328 /*
1ab1457c
YH
1329 * Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and
1330 * corresponding MSS is IPV6_MAXPLEN - tcp_header_size.
1331 * IPV6_MAXPLEN is also valid and means: "any MSS,
1da177e4
LT
1332 * rely only on pmtu discovery"
1333 */
1334 if (mtu > IPV6_MAXPLEN - sizeof(struct tcphdr))
1335 mtu = IPV6_MAXPLEN;
1336 return mtu;
1337}
1338
ebb762f2 1339static unsigned int ip6_mtu(const struct dst_entry *dst)
d33e4553 1340{
d33e4553 1341 struct inet6_dev *idev;
618f9bc7
SK
1342 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
1343
1344 if (mtu)
1345 return mtu;
1346
1347 mtu = IPV6_MIN_MTU;
d33e4553
DM
1348
1349 rcu_read_lock();
1350 idev = __in6_dev_get(dst->dev);
1351 if (idev)
1352 mtu = idev->cnf.mtu6;
1353 rcu_read_unlock();
1354
1355 return mtu;
1356}
1357
3b00944c
YH
1358static struct dst_entry *icmp6_dst_gc_list;
1359static DEFINE_SPINLOCK(icmp6_dst_lock);
5d0bbeeb 1360
3b00944c 1361struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
87a11578 1362 struct flowi6 *fl6)
1da177e4 1363{
87a11578 1364 struct dst_entry *dst;
1da177e4
LT
1365 struct rt6_info *rt;
1366 struct inet6_dev *idev = in6_dev_get(dev);
c346dca1 1367 struct net *net = dev_net(dev);
1da177e4 1368
38308473 1369 if (unlikely(!idev))
122bdf67 1370 return ERR_PTR(-ENODEV);
1da177e4 1371
8b96d22d 1372 rt = ip6_dst_alloc(net, dev, 0, NULL);
38308473 1373 if (unlikely(!rt)) {
1da177e4 1374 in6_dev_put(idev);
87a11578 1375 dst = ERR_PTR(-ENOMEM);
1da177e4
LT
1376 goto out;
1377 }
1378
8e2ec639
YZ
1379 rt->dst.flags |= DST_HOST;
1380 rt->dst.output = ip6_output;
d8d1f30b 1381 atomic_set(&rt->dst.__refcnt, 1);
550bab42 1382 rt->rt6i_gateway = fl6->daddr;
87a11578 1383 rt->rt6i_dst.addr = fl6->daddr;
8e2ec639
YZ
1384 rt->rt6i_dst.plen = 128;
1385 rt->rt6i_idev = idev;
14edd87d 1386 dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 0);
1da177e4 1387
3b00944c 1388 spin_lock_bh(&icmp6_dst_lock);
d8d1f30b
CG
1389 rt->dst.next = icmp6_dst_gc_list;
1390 icmp6_dst_gc_list = &rt->dst;
3b00944c 1391 spin_unlock_bh(&icmp6_dst_lock);
1da177e4 1392
5578689a 1393 fib6_force_start_gc(net);
1da177e4 1394
87a11578
DM
1395 dst = xfrm_lookup(net, &rt->dst, flowi6_to_flowi(fl6), NULL, 0);
1396
1da177e4 1397out:
87a11578 1398 return dst;
1da177e4
LT
1399}
1400
3d0f24a7 1401int icmp6_dst_gc(void)
1da177e4 1402{
e9476e95 1403 struct dst_entry *dst, **pprev;
3d0f24a7 1404 int more = 0;
1da177e4 1405
3b00944c
YH
1406 spin_lock_bh(&icmp6_dst_lock);
1407 pprev = &icmp6_dst_gc_list;
5d0bbeeb 1408
1da177e4
LT
1409 while ((dst = *pprev) != NULL) {
1410 if (!atomic_read(&dst->__refcnt)) {
1411 *pprev = dst->next;
1412 dst_free(dst);
1da177e4
LT
1413 } else {
1414 pprev = &dst->next;
3d0f24a7 1415 ++more;
1da177e4
LT
1416 }
1417 }
1418
3b00944c 1419 spin_unlock_bh(&icmp6_dst_lock);
5d0bbeeb 1420
3d0f24a7 1421 return more;
1da177e4
LT
1422}
1423
1e493d19
DM
1424static void icmp6_clean_all(int (*func)(struct rt6_info *rt, void *arg),
1425 void *arg)
1426{
1427 struct dst_entry *dst, **pprev;
1428
1429 spin_lock_bh(&icmp6_dst_lock);
1430 pprev = &icmp6_dst_gc_list;
1431 while ((dst = *pprev) != NULL) {
1432 struct rt6_info *rt = (struct rt6_info *) dst;
1433 if (func(rt, arg)) {
1434 *pprev = dst->next;
1435 dst_free(dst);
1436 } else {
1437 pprev = &dst->next;
1438 }
1439 }
1440 spin_unlock_bh(&icmp6_dst_lock);
1441}
1442
569d3645 1443static int ip6_dst_gc(struct dst_ops *ops)
1da177e4 1444{
86393e52 1445 struct net *net = container_of(ops, struct net, ipv6.ip6_dst_ops);
7019b78e
DL
1446 int rt_min_interval = net->ipv6.sysctl.ip6_rt_gc_min_interval;
1447 int rt_max_size = net->ipv6.sysctl.ip6_rt_max_size;
1448 int rt_elasticity = net->ipv6.sysctl.ip6_rt_gc_elasticity;
1449 int rt_gc_timeout = net->ipv6.sysctl.ip6_rt_gc_timeout;
1450 unsigned long rt_last_gc = net->ipv6.ip6_rt_last_gc;
fc66f95c 1451 int entries;
7019b78e 1452
fc66f95c 1453 entries = dst_entries_get_fast(ops);
49a18d86 1454 if (time_after(rt_last_gc + rt_min_interval, jiffies) &&
fc66f95c 1455 entries <= rt_max_size)
1da177e4
LT
1456 goto out;
1457
6891a346 1458 net->ipv6.ip6_rt_gc_expire++;
2ac3ac8f 1459 fib6_run_gc(net->ipv6.ip6_rt_gc_expire, net, entries > rt_max_size);
fc66f95c
ED
1460 entries = dst_entries_get_slow(ops);
1461 if (entries < ops->gc_thresh)
7019b78e 1462 net->ipv6.ip6_rt_gc_expire = rt_gc_timeout>>1;
1da177e4 1463out:
7019b78e 1464 net->ipv6.ip6_rt_gc_expire -= net->ipv6.ip6_rt_gc_expire>>rt_elasticity;
fc66f95c 1465 return entries > rt_max_size;
1da177e4
LT
1466}
1467
1da177e4
LT
1468/*
1469 *
1470 */
1471
86872cb5 1472int ip6_route_add(struct fib6_config *cfg)
1da177e4
LT
1473{
1474 int err;
5578689a 1475 struct net *net = cfg->fc_nlinfo.nl_net;
1da177e4
LT
1476 struct rt6_info *rt = NULL;
1477 struct net_device *dev = NULL;
1478 struct inet6_dev *idev = NULL;
c71099ac 1479 struct fib6_table *table;
1da177e4
LT
1480 int addr_type;
1481
86872cb5 1482 if (cfg->fc_dst_len > 128 || cfg->fc_src_len > 128)
1da177e4
LT
1483 return -EINVAL;
1484#ifndef CONFIG_IPV6_SUBTREES
86872cb5 1485 if (cfg->fc_src_len)
1da177e4
LT
1486 return -EINVAL;
1487#endif
86872cb5 1488 if (cfg->fc_ifindex) {
1da177e4 1489 err = -ENODEV;
5578689a 1490 dev = dev_get_by_index(net, cfg->fc_ifindex);
1da177e4
LT
1491 if (!dev)
1492 goto out;
1493 idev = in6_dev_get(dev);
1494 if (!idev)
1495 goto out;
1496 }
1497
86872cb5
TG
1498 if (cfg->fc_metric == 0)
1499 cfg->fc_metric = IP6_RT_PRIO_USER;
1da177e4 1500
d71314b4 1501 err = -ENOBUFS;
38308473
DM
1502 if (cfg->fc_nlinfo.nlh &&
1503 !(cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_CREATE)) {
d71314b4 1504 table = fib6_get_table(net, cfg->fc_table);
38308473 1505 if (!table) {
f3213831 1506 pr_warn("NLM_F_CREATE should be specified when creating new route\n");
d71314b4
MV
1507 table = fib6_new_table(net, cfg->fc_table);
1508 }
1509 } else {
1510 table = fib6_new_table(net, cfg->fc_table);
1511 }
38308473
DM
1512
1513 if (!table)
c71099ac 1514 goto out;
c71099ac 1515
c88507fb 1516 rt = ip6_dst_alloc(net, NULL, (cfg->fc_flags & RTF_ADDRCONF) ? 0 : DST_NOCOUNT, table);
1da177e4 1517
38308473 1518 if (!rt) {
1da177e4
LT
1519 err = -ENOMEM;
1520 goto out;
1521 }
1522
1716a961
G
1523 if (cfg->fc_flags & RTF_EXPIRES)
1524 rt6_set_expires(rt, jiffies +
1525 clock_t_to_jiffies(cfg->fc_expires));
1526 else
1527 rt6_clean_expires(rt);
1da177e4 1528
86872cb5
TG
1529 if (cfg->fc_protocol == RTPROT_UNSPEC)
1530 cfg->fc_protocol = RTPROT_BOOT;
1531 rt->rt6i_protocol = cfg->fc_protocol;
1532
1533 addr_type = ipv6_addr_type(&cfg->fc_dst);
1da177e4
LT
1534
1535 if (addr_type & IPV6_ADDR_MULTICAST)
d8d1f30b 1536 rt->dst.input = ip6_mc_input;
ab79ad14
1537 else if (cfg->fc_flags & RTF_LOCAL)
1538 rt->dst.input = ip6_input;
1da177e4 1539 else
d8d1f30b 1540 rt->dst.input = ip6_forward;
1da177e4 1541
d8d1f30b 1542 rt->dst.output = ip6_output;
1da177e4 1543
86872cb5
TG
1544 ipv6_addr_prefix(&rt->rt6i_dst.addr, &cfg->fc_dst, cfg->fc_dst_len);
1545 rt->rt6i_dst.plen = cfg->fc_dst_len;
1da177e4 1546 if (rt->rt6i_dst.plen == 128)
11d53b49 1547 rt->dst.flags |= DST_HOST;
1da177e4 1548
8e2ec639
YZ
1549 if (!(rt->dst.flags & DST_HOST) && cfg->fc_mx) {
1550 u32 *metrics = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL);
1551 if (!metrics) {
1552 err = -ENOMEM;
1553 goto out;
1554 }
1555 dst_init_metrics(&rt->dst, metrics, 0);
1556 }
1da177e4 1557#ifdef CONFIG_IPV6_SUBTREES
86872cb5
TG
1558 ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len);
1559 rt->rt6i_src.plen = cfg->fc_src_len;
1da177e4
LT
1560#endif
1561
86872cb5 1562 rt->rt6i_metric = cfg->fc_metric;
1da177e4
LT
1563
1564 /* We cannot add true routes via loopback here,
1565 they would result in kernel looping; promote them to reject routes
1566 */
86872cb5 1567 if ((cfg->fc_flags & RTF_REJECT) ||
38308473
DM
1568 (dev && (dev->flags & IFF_LOOPBACK) &&
1569 !(addr_type & IPV6_ADDR_LOOPBACK) &&
1570 !(cfg->fc_flags & RTF_LOCAL))) {
1da177e4 1571 /* hold loopback dev/idev if we haven't done so. */
5578689a 1572 if (dev != net->loopback_dev) {
1da177e4
LT
1573 if (dev) {
1574 dev_put(dev);
1575 in6_dev_put(idev);
1576 }
5578689a 1577 dev = net->loopback_dev;
1da177e4
LT
1578 dev_hold(dev);
1579 idev = in6_dev_get(dev);
1580 if (!idev) {
1581 err = -ENODEV;
1582 goto out;
1583 }
1584 }
1da177e4 1585 rt->rt6i_flags = RTF_REJECT|RTF_NONEXTHOP;
ef2c7d7b
ND
1586 switch (cfg->fc_type) {
1587 case RTN_BLACKHOLE:
1588 rt->dst.error = -EINVAL;
7150aede
K
1589 rt->dst.output = dst_discard;
1590 rt->dst.input = dst_discard;
ef2c7d7b
ND
1591 break;
1592 case RTN_PROHIBIT:
1593 rt->dst.error = -EACCES;
7150aede
K
1594 rt->dst.output = ip6_pkt_prohibit_out;
1595 rt->dst.input = ip6_pkt_prohibit;
ef2c7d7b 1596 break;
b4949ab2 1597 case RTN_THROW:
ef2c7d7b 1598 default:
7150aede
K
1599 rt->dst.error = (cfg->fc_type == RTN_THROW) ? -EAGAIN
1600 : -ENETUNREACH;
1601 rt->dst.output = ip6_pkt_discard_out;
1602 rt->dst.input = ip6_pkt_discard;
ef2c7d7b
ND
1603 break;
1604 }
1da177e4
LT
1605 goto install_route;
1606 }
1607
86872cb5 1608 if (cfg->fc_flags & RTF_GATEWAY) {
b71d1d42 1609 const struct in6_addr *gw_addr;
1da177e4
LT
1610 int gwa_type;
1611
86872cb5 1612 gw_addr = &cfg->fc_gateway;
4e3fd7a0 1613 rt->rt6i_gateway = *gw_addr;
1da177e4
LT
1614 gwa_type = ipv6_addr_type(gw_addr);
1615
1616 if (gwa_type != (IPV6_ADDR_LINKLOCAL|IPV6_ADDR_UNICAST)) {
1617 struct rt6_info *grt;
1618
1619 /* IPv6 strictly inhibits using not link-local
1620 addresses as nexthop address.
1621 Otherwise, router will not able to send redirects.
1622 It is very good, but in some (rare!) circumstances
1623 (SIT, PtP, NBMA NOARP links) it is handy to allow
1624 some exceptions. --ANK
1625 */
1626 err = -EINVAL;
38308473 1627 if (!(gwa_type & IPV6_ADDR_UNICAST))
1da177e4
LT
1628 goto out;
1629
5578689a 1630 grt = rt6_lookup(net, gw_addr, NULL, cfg->fc_ifindex, 1);
1da177e4
LT
1631
1632 err = -EHOSTUNREACH;
38308473 1633 if (!grt)
1da177e4
LT
1634 goto out;
1635 if (dev) {
d1918542 1636 if (dev != grt->dst.dev) {
94e187c0 1637 ip6_rt_put(grt);
1da177e4
LT
1638 goto out;
1639 }
1640 } else {
d1918542 1641 dev = grt->dst.dev;
1da177e4
LT
1642 idev = grt->rt6i_idev;
1643 dev_hold(dev);
1644 in6_dev_hold(grt->rt6i_idev);
1645 }
38308473 1646 if (!(grt->rt6i_flags & RTF_GATEWAY))
1da177e4 1647 err = 0;
94e187c0 1648 ip6_rt_put(grt);
1da177e4
LT
1649
1650 if (err)
1651 goto out;
1652 }
1653 err = -EINVAL;
38308473 1654 if (!dev || (dev->flags & IFF_LOOPBACK))
1da177e4
LT
1655 goto out;
1656 }
1657
1658 err = -ENODEV;
38308473 1659 if (!dev)
1da177e4
LT
1660 goto out;
1661
c3968a85
DW
1662 if (!ipv6_addr_any(&cfg->fc_prefsrc)) {
1663 if (!ipv6_chk_addr(net, &cfg->fc_prefsrc, dev, 0)) {
1664 err = -EINVAL;
1665 goto out;
1666 }
4e3fd7a0 1667 rt->rt6i_prefsrc.addr = cfg->fc_prefsrc;
c3968a85
DW
1668 rt->rt6i_prefsrc.plen = 128;
1669 } else
1670 rt->rt6i_prefsrc.plen = 0;
1671
86872cb5 1672 rt->rt6i_flags = cfg->fc_flags;
1da177e4
LT
1673
1674install_route:
86872cb5
TG
1675 if (cfg->fc_mx) {
1676 struct nlattr *nla;
1677 int remaining;
1678
1679 nla_for_each_attr(nla, cfg->fc_mx, cfg->fc_mx_len, remaining) {
8f4c1f9b 1680 int type = nla_type(nla);
86872cb5
TG
1681
1682 if (type) {
1683 if (type > RTAX_MAX) {
1da177e4
LT
1684 err = -EINVAL;
1685 goto out;
1686 }
86872cb5 1687
defb3519 1688 dst_metric_set(&rt->dst, type, nla_get_u32(nla));
1da177e4 1689 }
1da177e4
LT
1690 }
1691 }
1692
d8d1f30b 1693 rt->dst.dev = dev;
1da177e4 1694 rt->rt6i_idev = idev;
c71099ac 1695 rt->rt6i_table = table;
63152fc0 1696
c346dca1 1697 cfg->fc_nlinfo.nl_net = dev_net(dev);
63152fc0 1698
86872cb5 1699 return __ip6_ins_rt(rt, &cfg->fc_nlinfo);
1da177e4
LT
1700
1701out:
1702 if (dev)
1703 dev_put(dev);
1704 if (idev)
1705 in6_dev_put(idev);
1706 if (rt)
d8d1f30b 1707 dst_free(&rt->dst);
1da177e4
LT
1708 return err;
1709}
1710
86872cb5 1711static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info)
1da177e4
LT
1712{
1713 int err;
c71099ac 1714 struct fib6_table *table;
d1918542 1715 struct net *net = dev_net(rt->dst.dev);
1da177e4 1716
6825a26c
G
1717 if (rt == net->ipv6.ip6_null_entry) {
1718 err = -ENOENT;
1719 goto out;
1720 }
6c813a72 1721
c71099ac
TG
1722 table = rt->rt6i_table;
1723 write_lock_bh(&table->tb6_lock);
86872cb5 1724 err = fib6_del(rt, info);
c71099ac 1725 write_unlock_bh(&table->tb6_lock);
1da177e4 1726
6825a26c 1727out:
94e187c0 1728 ip6_rt_put(rt);
1da177e4
LT
1729 return err;
1730}
1731
e0a1ad73
TG
1732int ip6_del_rt(struct rt6_info *rt)
1733{
4d1169c1 1734 struct nl_info info = {
d1918542 1735 .nl_net = dev_net(rt->dst.dev),
4d1169c1 1736 };
528c4ceb 1737 return __ip6_del_rt(rt, &info);
e0a1ad73
TG
1738}
1739
86872cb5 1740static int ip6_route_del(struct fib6_config *cfg)
1da177e4 1741{
c71099ac 1742 struct fib6_table *table;
1da177e4
LT
1743 struct fib6_node *fn;
1744 struct rt6_info *rt;
1745 int err = -ESRCH;
1746
5578689a 1747 table = fib6_get_table(cfg->fc_nlinfo.nl_net, cfg->fc_table);
38308473 1748 if (!table)
c71099ac
TG
1749 return err;
1750
1751 read_lock_bh(&table->tb6_lock);
1da177e4 1752
c71099ac 1753 fn = fib6_locate(&table->tb6_root,
86872cb5
TG
1754 &cfg->fc_dst, cfg->fc_dst_len,
1755 &cfg->fc_src, cfg->fc_src_len);
1ab1457c 1756
1da177e4 1757 if (fn) {
d8d1f30b 1758 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
86872cb5 1759 if (cfg->fc_ifindex &&
d1918542
DM
1760 (!rt->dst.dev ||
1761 rt->dst.dev->ifindex != cfg->fc_ifindex))
1da177e4 1762 continue;
86872cb5
TG
1763 if (cfg->fc_flags & RTF_GATEWAY &&
1764 !ipv6_addr_equal(&cfg->fc_gateway, &rt->rt6i_gateway))
1da177e4 1765 continue;
86872cb5 1766 if (cfg->fc_metric && cfg->fc_metric != rt->rt6i_metric)
1da177e4 1767 continue;
d8d1f30b 1768 dst_hold(&rt->dst);
c71099ac 1769 read_unlock_bh(&table->tb6_lock);
1da177e4 1770
86872cb5 1771 return __ip6_del_rt(rt, &cfg->fc_nlinfo);
1da177e4
LT
1772 }
1773 }
c71099ac 1774 read_unlock_bh(&table->tb6_lock);
1da177e4
LT
1775
1776 return err;
1777}
1778
6700c270 1779static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb)
a6279458 1780{
e8599ff4 1781 struct net *net = dev_net(skb->dev);
a6279458 1782 struct netevent_redirect netevent;
e8599ff4 1783 struct rt6_info *rt, *nrt = NULL;
e8599ff4
DM
1784 struct ndisc_options ndopts;
1785 struct inet6_dev *in6_dev;
1786 struct neighbour *neigh;
71bcdba0 1787 struct rd_msg *msg;
6e157b6a
DM
1788 int optlen, on_link;
1789 u8 *lladdr;
e8599ff4 1790
29a3cad5 1791 optlen = skb_tail_pointer(skb) - skb_transport_header(skb);
71bcdba0 1792 optlen -= sizeof(*msg);
e8599ff4
DM
1793
1794 if (optlen < 0) {
6e157b6a 1795 net_dbg_ratelimited("rt6_do_redirect: packet too short\n");
e8599ff4
DM
1796 return;
1797 }
1798
71bcdba0 1799 msg = (struct rd_msg *)icmp6_hdr(skb);
e8599ff4 1800
71bcdba0 1801 if (ipv6_addr_is_multicast(&msg->dest)) {
6e157b6a 1802 net_dbg_ratelimited("rt6_do_redirect: destination address is multicast\n");
e8599ff4
DM
1803 return;
1804 }
1805
6e157b6a 1806 on_link = 0;
71bcdba0 1807 if (ipv6_addr_equal(&msg->dest, &msg->target)) {
e8599ff4 1808 on_link = 1;
71bcdba0 1809 } else if (ipv6_addr_type(&msg->target) !=
e8599ff4 1810 (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
6e157b6a 1811 net_dbg_ratelimited("rt6_do_redirect: target address is not link-local unicast\n");
e8599ff4
DM
1812 return;
1813 }
1814
1815 in6_dev = __in6_dev_get(skb->dev);
1816 if (!in6_dev)
1817 return;
1818 if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_redirects)
1819 return;
1820
1821 /* RFC2461 8.1:
1822 * The IP source address of the Redirect MUST be the same as the current
1823 * first-hop router for the specified ICMP Destination Address.
1824 */
1825
71bcdba0 1826 if (!ndisc_parse_options(msg->opt, optlen, &ndopts)) {
e8599ff4
DM
1827 net_dbg_ratelimited("rt6_redirect: invalid ND options\n");
1828 return;
1829 }
6e157b6a
DM
1830
1831 lladdr = NULL;
e8599ff4
DM
1832 if (ndopts.nd_opts_tgt_lladdr) {
1833 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr,
1834 skb->dev);
1835 if (!lladdr) {
1836 net_dbg_ratelimited("rt6_redirect: invalid link-layer address length\n");
1837 return;
1838 }
1839 }
1840
6e157b6a
DM
1841 rt = (struct rt6_info *) dst;
1842 if (rt == net->ipv6.ip6_null_entry) {
1843 net_dbg_ratelimited("rt6_redirect: source isn't a valid nexthop for redirect target\n");
e8599ff4 1844 return;
6e157b6a 1845 }
e8599ff4 1846
6e157b6a
DM
1847 /* Redirect received -> path was valid.
1848 * Look, redirects are sent only in response to data packets,
1849 * so that this nexthop apparently is reachable. --ANK
1850 */
1851 dst_confirm(&rt->dst);
a6279458 1852
71bcdba0 1853 neigh = __neigh_lookup(&nd_tbl, &msg->target, skb->dev, 1);
6e157b6a
DM
1854 if (!neigh)
1855 return;
a6279458 1856
1da177e4
LT
1857 /*
1858 * We have finally decided to accept it.
1859 */
1860
1ab1457c 1861 neigh_update(neigh, lladdr, NUD_STALE,
1da177e4
LT
1862 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1863 NEIGH_UPDATE_F_OVERRIDE|
1864 (on_link ? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1865 NEIGH_UPDATE_F_ISROUTER))
1866 );
1867
71bcdba0 1868 nrt = ip6_rt_copy(rt, &msg->dest);
38308473 1869 if (!nrt)
1da177e4
LT
1870 goto out;
1871
1872 nrt->rt6i_flags = RTF_GATEWAY|RTF_UP|RTF_DYNAMIC|RTF_CACHE;
1873 if (on_link)
1874 nrt->rt6i_flags &= ~RTF_GATEWAY;
1875
4e3fd7a0 1876 nrt->rt6i_gateway = *(struct in6_addr *)neigh->primary_key;
1da177e4 1877
40e22e8f 1878 if (ip6_ins_rt(nrt))
1da177e4
LT
1879 goto out;
1880
d8d1f30b
CG
1881 netevent.old = &rt->dst;
1882 netevent.new = &nrt->dst;
71bcdba0 1883 netevent.daddr = &msg->dest;
60592833 1884 netevent.neigh = neigh;
8d71740c
TT
1885 call_netevent_notifiers(NETEVENT_REDIRECT, &netevent);
1886
38308473 1887 if (rt->rt6i_flags & RTF_CACHE) {
6e157b6a 1888 rt = (struct rt6_info *) dst_clone(&rt->dst);
e0a1ad73 1889 ip6_del_rt(rt);
1da177e4
LT
1890 }
1891
1892out:
e8599ff4 1893 neigh_release(neigh);
6e157b6a
DM
1894}
1895
1da177e4
LT
1896/*
1897 * Misc support functions
1898 */
1899
1716a961 1900static struct rt6_info *ip6_rt_copy(struct rt6_info *ort,
21efcfa0 1901 const struct in6_addr *dest)
1da177e4 1902{
d1918542 1903 struct net *net = dev_net(ort->dst.dev);
8b96d22d
DM
1904 struct rt6_info *rt = ip6_dst_alloc(net, ort->dst.dev, 0,
1905 ort->rt6i_table);
1da177e4
LT
1906
1907 if (rt) {
d8d1f30b
CG
1908 rt->dst.input = ort->dst.input;
1909 rt->dst.output = ort->dst.output;
8e2ec639 1910 rt->dst.flags |= DST_HOST;
d8d1f30b 1911
4e3fd7a0 1912 rt->rt6i_dst.addr = *dest;
8e2ec639 1913 rt->rt6i_dst.plen = 128;
defb3519 1914 dst_copy_metrics(&rt->dst, &ort->dst);
d8d1f30b 1915 rt->dst.error = ort->dst.error;
1da177e4
LT
1916 rt->rt6i_idev = ort->rt6i_idev;
1917 if (rt->rt6i_idev)
1918 in6_dev_hold(rt->rt6i_idev);
d8d1f30b 1919 rt->dst.lastuse = jiffies;
1da177e4 1920
550bab42
JA
1921 if (ort->rt6i_flags & RTF_GATEWAY)
1922 rt->rt6i_gateway = ort->rt6i_gateway;
1923 else
1924 rt->rt6i_gateway = *dest;
1716a961 1925 rt->rt6i_flags = ort->rt6i_flags;
24f5b855 1926 rt6_set_from(rt, ort);
1da177e4
LT
1927 rt->rt6i_metric = 0;
1928
1da177e4
LT
1929#ifdef CONFIG_IPV6_SUBTREES
1930 memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key));
1931#endif
0f6c6392 1932 memcpy(&rt->rt6i_prefsrc, &ort->rt6i_prefsrc, sizeof(struct rt6key));
c71099ac 1933 rt->rt6i_table = ort->rt6i_table;
1da177e4
LT
1934 }
1935 return rt;
1936}
1937
70ceb4f5 1938#ifdef CONFIG_IPV6_ROUTE_INFO
efa2cea0 1939static struct rt6_info *rt6_get_route_info(struct net *net,
b71d1d42
ED
1940 const struct in6_addr *prefix, int prefixlen,
1941 const struct in6_addr *gwaddr, int ifindex)
70ceb4f5
YH
1942{
1943 struct fib6_node *fn;
1944 struct rt6_info *rt = NULL;
c71099ac
TG
1945 struct fib6_table *table;
1946
efa2cea0 1947 table = fib6_get_table(net, RT6_TABLE_INFO);
38308473 1948 if (!table)
c71099ac 1949 return NULL;
70ceb4f5 1950
5744dd9b 1951 read_lock_bh(&table->tb6_lock);
c71099ac 1952 fn = fib6_locate(&table->tb6_root, prefix ,prefixlen, NULL, 0);
70ceb4f5
YH
1953 if (!fn)
1954 goto out;
1955
d8d1f30b 1956 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
d1918542 1957 if (rt->dst.dev->ifindex != ifindex)
70ceb4f5
YH
1958 continue;
1959 if ((rt->rt6i_flags & (RTF_ROUTEINFO|RTF_GATEWAY)) != (RTF_ROUTEINFO|RTF_GATEWAY))
1960 continue;
1961 if (!ipv6_addr_equal(&rt->rt6i_gateway, gwaddr))
1962 continue;
d8d1f30b 1963 dst_hold(&rt->dst);
70ceb4f5
YH
1964 break;
1965 }
1966out:
5744dd9b 1967 read_unlock_bh(&table->tb6_lock);
70ceb4f5
YH
1968 return rt;
1969}
1970
efa2cea0 1971static struct rt6_info *rt6_add_route_info(struct net *net,
b71d1d42
ED
1972 const struct in6_addr *prefix, int prefixlen,
1973 const struct in6_addr *gwaddr, int ifindex,
95c96174 1974 unsigned int pref)
70ceb4f5 1975{
86872cb5
TG
1976 struct fib6_config cfg = {
1977 .fc_table = RT6_TABLE_INFO,
238fc7ea 1978 .fc_metric = IP6_RT_PRIO_USER,
86872cb5
TG
1979 .fc_ifindex = ifindex,
1980 .fc_dst_len = prefixlen,
1981 .fc_flags = RTF_GATEWAY | RTF_ADDRCONF | RTF_ROUTEINFO |
1982 RTF_UP | RTF_PREF(pref),
15e47304 1983 .fc_nlinfo.portid = 0,
efa2cea0
DL
1984 .fc_nlinfo.nlh = NULL,
1985 .fc_nlinfo.nl_net = net,
86872cb5
TG
1986 };
1987
4e3fd7a0
AD
1988 cfg.fc_dst = *prefix;
1989 cfg.fc_gateway = *gwaddr;
70ceb4f5 1990
e317da96
YH
1991 /* We should treat it as a default route if prefix length is 0. */
1992 if (!prefixlen)
86872cb5 1993 cfg.fc_flags |= RTF_DEFAULT;
70ceb4f5 1994
86872cb5 1995 ip6_route_add(&cfg);
70ceb4f5 1996
efa2cea0 1997 return rt6_get_route_info(net, prefix, prefixlen, gwaddr, ifindex);
70ceb4f5
YH
1998}
1999#endif
2000
b71d1d42 2001struct rt6_info *rt6_get_dflt_router(const struct in6_addr *addr, struct net_device *dev)
1ab1457c 2002{
1da177e4 2003 struct rt6_info *rt;
c71099ac 2004 struct fib6_table *table;
1da177e4 2005
c346dca1 2006 table = fib6_get_table(dev_net(dev), RT6_TABLE_DFLT);
38308473 2007 if (!table)
c71099ac 2008 return NULL;
1da177e4 2009
5744dd9b 2010 read_lock_bh(&table->tb6_lock);
d8d1f30b 2011 for (rt = table->tb6_root.leaf; rt; rt=rt->dst.rt6_next) {
d1918542 2012 if (dev == rt->dst.dev &&
045927ff 2013 ((rt->rt6i_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) &&
1da177e4
LT
2014 ipv6_addr_equal(&rt->rt6i_gateway, addr))
2015 break;
2016 }
2017 if (rt)
d8d1f30b 2018 dst_hold(&rt->dst);
5744dd9b 2019 read_unlock_bh(&table->tb6_lock);
1da177e4
LT
2020 return rt;
2021}
2022
b71d1d42 2023struct rt6_info *rt6_add_dflt_router(const struct in6_addr *gwaddr,
ebacaaa0
YH
2024 struct net_device *dev,
2025 unsigned int pref)
1da177e4 2026{
86872cb5
TG
2027 struct fib6_config cfg = {
2028 .fc_table = RT6_TABLE_DFLT,
238fc7ea 2029 .fc_metric = IP6_RT_PRIO_USER,
86872cb5
TG
2030 .fc_ifindex = dev->ifindex,
2031 .fc_flags = RTF_GATEWAY | RTF_ADDRCONF | RTF_DEFAULT |
2032 RTF_UP | RTF_EXPIRES | RTF_PREF(pref),
15e47304 2033 .fc_nlinfo.portid = 0,
5578689a 2034 .fc_nlinfo.nlh = NULL,
c346dca1 2035 .fc_nlinfo.nl_net = dev_net(dev),
86872cb5 2036 };
1da177e4 2037
4e3fd7a0 2038 cfg.fc_gateway = *gwaddr;
1da177e4 2039
86872cb5 2040 ip6_route_add(&cfg);
1da177e4 2041
1da177e4
LT
2042 return rt6_get_dflt_router(gwaddr, dev);
2043}
2044
7b4da532 2045void rt6_purge_dflt_routers(struct net *net)
1da177e4
LT
2046{
2047 struct rt6_info *rt;
c71099ac
TG
2048 struct fib6_table *table;
2049
2050 /* NOTE: Keep consistent with rt6_get_dflt_router */
7b4da532 2051 table = fib6_get_table(net, RT6_TABLE_DFLT);
38308473 2052 if (!table)
c71099ac 2053 return;
1da177e4
LT
2054
2055restart:
c71099ac 2056 read_lock_bh(&table->tb6_lock);
d8d1f30b 2057 for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) {
3e8b0ac3
LC
2058 if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF) &&
2059 (!rt->rt6i_idev || rt->rt6i_idev->cnf.accept_ra != 2)) {
d8d1f30b 2060 dst_hold(&rt->dst);
c71099ac 2061 read_unlock_bh(&table->tb6_lock);
e0a1ad73 2062 ip6_del_rt(rt);
1da177e4
LT
2063 goto restart;
2064 }
2065 }
c71099ac 2066 read_unlock_bh(&table->tb6_lock);
1da177e4
LT
2067}
2068
5578689a
DL
2069static void rtmsg_to_fib6_config(struct net *net,
2070 struct in6_rtmsg *rtmsg,
86872cb5
TG
2071 struct fib6_config *cfg)
2072{
2073 memset(cfg, 0, sizeof(*cfg));
2074
2075 cfg->fc_table = RT6_TABLE_MAIN;
2076 cfg->fc_ifindex = rtmsg->rtmsg_ifindex;
2077 cfg->fc_metric = rtmsg->rtmsg_metric;
2078 cfg->fc_expires = rtmsg->rtmsg_info;
2079 cfg->fc_dst_len = rtmsg->rtmsg_dst_len;
2080 cfg->fc_src_len = rtmsg->rtmsg_src_len;
2081 cfg->fc_flags = rtmsg->rtmsg_flags;
2082
5578689a 2083 cfg->fc_nlinfo.nl_net = net;
f1243c2d 2084
4e3fd7a0
AD
2085 cfg->fc_dst = rtmsg->rtmsg_dst;
2086 cfg->fc_src = rtmsg->rtmsg_src;
2087 cfg->fc_gateway = rtmsg->rtmsg_gateway;
86872cb5
TG
2088}
2089
5578689a 2090int ipv6_route_ioctl(struct net *net, unsigned int cmd, void __user *arg)
1da177e4 2091{
86872cb5 2092 struct fib6_config cfg;
1da177e4
LT
2093 struct in6_rtmsg rtmsg;
2094 int err;
2095
2096 switch(cmd) {
2097 case SIOCADDRT: /* Add a route */
2098 case SIOCDELRT: /* Delete a route */
af31f412 2099 if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
1da177e4
LT
2100 return -EPERM;
2101 err = copy_from_user(&rtmsg, arg,
2102 sizeof(struct in6_rtmsg));
2103 if (err)
2104 return -EFAULT;
86872cb5 2105
5578689a 2106 rtmsg_to_fib6_config(net, &rtmsg, &cfg);
86872cb5 2107
1da177e4
LT
2108 rtnl_lock();
2109 switch (cmd) {
2110 case SIOCADDRT:
86872cb5 2111 err = ip6_route_add(&cfg);
1da177e4
LT
2112 break;
2113 case SIOCDELRT:
86872cb5 2114 err = ip6_route_del(&cfg);
1da177e4
LT
2115 break;
2116 default:
2117 err = -EINVAL;
2118 }
2119 rtnl_unlock();
2120
2121 return err;
3ff50b79 2122 }
1da177e4
LT
2123
2124 return -EINVAL;
2125}
2126
2127/*
2128 * Drop the packet on the floor
2129 */
2130
d5fdd6ba 2131static int ip6_pkt_drop(struct sk_buff *skb, u8 code, int ipstats_mib_noroutes)
1da177e4 2132{
612f09e8 2133 int type;
adf30907 2134 struct dst_entry *dst = skb_dst(skb);
612f09e8
YH
2135 switch (ipstats_mib_noroutes) {
2136 case IPSTATS_MIB_INNOROUTES:
0660e03f 2137 type = ipv6_addr_type(&ipv6_hdr(skb)->daddr);
45bb0060 2138 if (type == IPV6_ADDR_ANY) {
3bd653c8
DL
2139 IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst),
2140 IPSTATS_MIB_INADDRERRORS);
612f09e8
YH
2141 break;
2142 }
2143 /* FALLTHROUGH */
2144 case IPSTATS_MIB_OUTNOROUTES:
3bd653c8
DL
2145 IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst),
2146 ipstats_mib_noroutes);
612f09e8
YH
2147 break;
2148 }
3ffe533c 2149 icmpv6_send(skb, ICMPV6_DEST_UNREACH, code, 0);
1da177e4
LT
2150 kfree_skb(skb);
2151 return 0;
2152}
2153
9ce8ade0
TG
2154static int ip6_pkt_discard(struct sk_buff *skb)
2155{
612f09e8 2156 return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_INNOROUTES);
9ce8ade0
TG
2157}
2158
20380731 2159static int ip6_pkt_discard_out(struct sk_buff *skb)
1da177e4 2160{
adf30907 2161 skb->dev = skb_dst(skb)->dev;
612f09e8 2162 return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES);
1da177e4
LT
2163}
2164
9ce8ade0
TG
2165static int ip6_pkt_prohibit(struct sk_buff *skb)
2166{
612f09e8 2167 return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_INNOROUTES);
9ce8ade0
TG
2168}
2169
2170static int ip6_pkt_prohibit_out(struct sk_buff *skb)
2171{
adf30907 2172 skb->dev = skb_dst(skb)->dev;
612f09e8 2173 return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
9ce8ade0
TG
2174}
2175
1da177e4
LT
2176/*
2177 * Allocate a dst for local (unicast / anycast) address.
2178 */
2179
2180struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
2181 const struct in6_addr *addr,
8f031519 2182 bool anycast)
1da177e4 2183{
c346dca1 2184 struct net *net = dev_net(idev->dev);
a3300ef4
HFS
2185 struct rt6_info *rt = ip6_dst_alloc(net, net->loopback_dev,
2186 DST_NOCOUNT, NULL);
2187 if (!rt)
1da177e4
LT
2188 return ERR_PTR(-ENOMEM);
2189
1da177e4
LT
2190 in6_dev_hold(idev);
2191
11d53b49 2192 rt->dst.flags |= DST_HOST;
d8d1f30b
CG
2193 rt->dst.input = ip6_input;
2194 rt->dst.output = ip6_output;
1da177e4 2195 rt->rt6i_idev = idev;
1da177e4
LT
2196
2197 rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP;
58c4fb86
YH
2198 if (anycast)
2199 rt->rt6i_flags |= RTF_ANYCAST;
2200 else
1da177e4 2201 rt->rt6i_flags |= RTF_LOCAL;
1da177e4 2202
550bab42 2203 rt->rt6i_gateway = *addr;
4e3fd7a0 2204 rt->rt6i_dst.addr = *addr;
1da177e4 2205 rt->rt6i_dst.plen = 128;
5578689a 2206 rt->rt6i_table = fib6_get_table(net, RT6_TABLE_LOCAL);
1da177e4 2207
d8d1f30b 2208 atomic_set(&rt->dst.__refcnt, 1);
1da177e4
LT
2209
2210 return rt;
2211}
2212
c3968a85
DW
2213int ip6_route_get_saddr(struct net *net,
2214 struct rt6_info *rt,
b71d1d42 2215 const struct in6_addr *daddr,
c3968a85
DW
2216 unsigned int prefs,
2217 struct in6_addr *saddr)
2218{
2219 struct inet6_dev *idev = ip6_dst_idev((struct dst_entry*)rt);
2220 int err = 0;
2221 if (rt->rt6i_prefsrc.plen)
4e3fd7a0 2222 *saddr = rt->rt6i_prefsrc.addr;
c3968a85
DW
2223 else
2224 err = ipv6_dev_get_saddr(net, idev ? idev->dev : NULL,
2225 daddr, prefs, saddr);
2226 return err;
2227}
2228
2229/* remove deleted ip from prefsrc entries */
2230struct arg_dev_net_ip {
2231 struct net_device *dev;
2232 struct net *net;
2233 struct in6_addr *addr;
2234};
2235
2236static int fib6_remove_prefsrc(struct rt6_info *rt, void *arg)
2237{
2238 struct net_device *dev = ((struct arg_dev_net_ip *)arg)->dev;
2239 struct net *net = ((struct arg_dev_net_ip *)arg)->net;
2240 struct in6_addr *addr = ((struct arg_dev_net_ip *)arg)->addr;
2241
d1918542 2242 if (((void *)rt->dst.dev == dev || !dev) &&
c3968a85
DW
2243 rt != net->ipv6.ip6_null_entry &&
2244 ipv6_addr_equal(addr, &rt->rt6i_prefsrc.addr)) {
2245 /* remove prefsrc entry */
2246 rt->rt6i_prefsrc.plen = 0;
2247 }
2248 return 0;
2249}
2250
2251void rt6_remove_prefsrc(struct inet6_ifaddr *ifp)
2252{
2253 struct net *net = dev_net(ifp->idev->dev);
2254 struct arg_dev_net_ip adni = {
2255 .dev = ifp->idev->dev,
2256 .net = net,
2257 .addr = &ifp->addr,
2258 };
0c3584d5 2259 fib6_clean_all(net, fib6_remove_prefsrc, &adni);
c3968a85
DW
2260}
2261
8ed67789
DL
2262struct arg_dev_net {
2263 struct net_device *dev;
2264 struct net *net;
2265};
2266
1da177e4
LT
2267static int fib6_ifdown(struct rt6_info *rt, void *arg)
2268{
bc3ef660 2269 const struct arg_dev_net *adn = arg;
2270 const struct net_device *dev = adn->dev;
8ed67789 2271
d1918542 2272 if ((rt->dst.dev == dev || !dev) &&
c159d30c 2273 rt != adn->net->ipv6.ip6_null_entry)
1da177e4 2274 return -1;
c159d30c 2275
1da177e4
LT
2276 return 0;
2277}
2278
f3db4851 2279void rt6_ifdown(struct net *net, struct net_device *dev)
1da177e4 2280{
8ed67789
DL
2281 struct arg_dev_net adn = {
2282 .dev = dev,
2283 .net = net,
2284 };
2285
0c3584d5 2286 fib6_clean_all(net, fib6_ifdown, &adn);
1e493d19 2287 icmp6_clean_all(fib6_ifdown, &adn);
1da177e4
LT
2288}
2289
95c96174 2290struct rt6_mtu_change_arg {
1da177e4 2291 struct net_device *dev;
95c96174 2292 unsigned int mtu;
1da177e4
LT
2293};
2294
2295static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg)
2296{
2297 struct rt6_mtu_change_arg *arg = (struct rt6_mtu_change_arg *) p_arg;
2298 struct inet6_dev *idev;
2299
2300 /* In IPv6 pmtu discovery is not optional,
2301 so that RTAX_MTU lock cannot disable it.
2302 We still use this lock to block changes
2303 caused by addrconf/ndisc.
2304 */
2305
2306 idev = __in6_dev_get(arg->dev);
38308473 2307 if (!idev)
1da177e4
LT
2308 return 0;
2309
2310 /* For administrative MTU increase, there is no way to discover
2311 IPv6 PMTU increase, so PMTU increase should be updated here.
2312 Since RFC 1981 doesn't include administrative MTU increase
2313 update PMTU increase is a MUST. (i.e. jumbo frame)
2314 */
2315 /*
2316 If new MTU is less than route PMTU, this new MTU will be the
2317 lowest MTU in the path, update the route PMTU to reflect PMTU
2318 decreases; if new MTU is greater than route PMTU, and the
2319 old MTU is the lowest MTU in the path, update the route PMTU
2320 to reflect the increase. In this case if the other nodes' MTU
2321 also have the lowest MTU, TOO BIG MESSAGE will be lead to
2322 PMTU discouvery.
2323 */
d1918542 2324 if (rt->dst.dev == arg->dev &&
d8d1f30b
CG
2325 !dst_metric_locked(&rt->dst, RTAX_MTU) &&
2326 (dst_mtu(&rt->dst) >= arg->mtu ||
2327 (dst_mtu(&rt->dst) < arg->mtu &&
2328 dst_mtu(&rt->dst) == idev->cnf.mtu6))) {
defb3519 2329 dst_metric_set(&rt->dst, RTAX_MTU, arg->mtu);
566cfd8f 2330 }
1da177e4
LT
2331 return 0;
2332}
2333
95c96174 2334void rt6_mtu_change(struct net_device *dev, unsigned int mtu)
1da177e4 2335{
c71099ac
TG
2336 struct rt6_mtu_change_arg arg = {
2337 .dev = dev,
2338 .mtu = mtu,
2339 };
1da177e4 2340
0c3584d5 2341 fib6_clean_all(dev_net(dev), rt6_mtu_change_route, &arg);
1da177e4
LT
2342}
2343
ef7c79ed 2344static const struct nla_policy rtm_ipv6_policy[RTA_MAX+1] = {
5176f91e 2345 [RTA_GATEWAY] = { .len = sizeof(struct in6_addr) },
86872cb5 2346 [RTA_OIF] = { .type = NLA_U32 },
ab364a6f 2347 [RTA_IIF] = { .type = NLA_U32 },
86872cb5
TG
2348 [RTA_PRIORITY] = { .type = NLA_U32 },
2349 [RTA_METRICS] = { .type = NLA_NESTED },
51ebd318 2350 [RTA_MULTIPATH] = { .len = sizeof(struct rtnexthop) },
86872cb5
TG
2351};
2352
2353static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
2354 struct fib6_config *cfg)
1da177e4 2355{
86872cb5
TG
2356 struct rtmsg *rtm;
2357 struct nlattr *tb[RTA_MAX+1];
2358 int err;
1da177e4 2359
86872cb5
TG
2360 err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv6_policy);
2361 if (err < 0)
2362 goto errout;
1da177e4 2363
86872cb5
TG
2364 err = -EINVAL;
2365 rtm = nlmsg_data(nlh);
2366 memset(cfg, 0, sizeof(*cfg));
2367
2368 cfg->fc_table = rtm->rtm_table;
2369 cfg->fc_dst_len = rtm->rtm_dst_len;
2370 cfg->fc_src_len = rtm->rtm_src_len;
2371 cfg->fc_flags = RTF_UP;
2372 cfg->fc_protocol = rtm->rtm_protocol;
ef2c7d7b 2373 cfg->fc_type = rtm->rtm_type;
86872cb5 2374
ef2c7d7b
ND
2375 if (rtm->rtm_type == RTN_UNREACHABLE ||
2376 rtm->rtm_type == RTN_BLACKHOLE ||
b4949ab2
ND
2377 rtm->rtm_type == RTN_PROHIBIT ||
2378 rtm->rtm_type == RTN_THROW)
86872cb5
TG
2379 cfg->fc_flags |= RTF_REJECT;
2380
ab79ad14
2381 if (rtm->rtm_type == RTN_LOCAL)
2382 cfg->fc_flags |= RTF_LOCAL;
2383
15e47304 2384 cfg->fc_nlinfo.portid = NETLINK_CB(skb).portid;
86872cb5 2385 cfg->fc_nlinfo.nlh = nlh;
3b1e0a65 2386 cfg->fc_nlinfo.nl_net = sock_net(skb->sk);
86872cb5
TG
2387
2388 if (tb[RTA_GATEWAY]) {
2389 nla_memcpy(&cfg->fc_gateway, tb[RTA_GATEWAY], 16);
2390 cfg->fc_flags |= RTF_GATEWAY;
1da177e4 2391 }
86872cb5
TG
2392
2393 if (tb[RTA_DST]) {
2394 int plen = (rtm->rtm_dst_len + 7) >> 3;
2395
2396 if (nla_len(tb[RTA_DST]) < plen)
2397 goto errout;
2398
2399 nla_memcpy(&cfg->fc_dst, tb[RTA_DST], plen);
1da177e4 2400 }
86872cb5
TG
2401
2402 if (tb[RTA_SRC]) {
2403 int plen = (rtm->rtm_src_len + 7) >> 3;
2404
2405 if (nla_len(tb[RTA_SRC]) < plen)
2406 goto errout;
2407
2408 nla_memcpy(&cfg->fc_src, tb[RTA_SRC], plen);
1da177e4 2409 }
86872cb5 2410
c3968a85
DW
2411 if (tb[RTA_PREFSRC])
2412 nla_memcpy(&cfg->fc_prefsrc, tb[RTA_PREFSRC], 16);
2413
86872cb5
TG
2414 if (tb[RTA_OIF])
2415 cfg->fc_ifindex = nla_get_u32(tb[RTA_OIF]);
2416
2417 if (tb[RTA_PRIORITY])
2418 cfg->fc_metric = nla_get_u32(tb[RTA_PRIORITY]);
2419
2420 if (tb[RTA_METRICS]) {
2421 cfg->fc_mx = nla_data(tb[RTA_METRICS]);
2422 cfg->fc_mx_len = nla_len(tb[RTA_METRICS]);
1da177e4 2423 }
86872cb5
TG
2424
2425 if (tb[RTA_TABLE])
2426 cfg->fc_table = nla_get_u32(tb[RTA_TABLE]);
2427
51ebd318
ND
2428 if (tb[RTA_MULTIPATH]) {
2429 cfg->fc_mp = nla_data(tb[RTA_MULTIPATH]);
2430 cfg->fc_mp_len = nla_len(tb[RTA_MULTIPATH]);
2431 }
2432
86872cb5
TG
2433 err = 0;
2434errout:
2435 return err;
1da177e4
LT
2436}
2437
51ebd318
ND
2438static int ip6_route_multipath(struct fib6_config *cfg, int add)
2439{
2440 struct fib6_config r_cfg;
2441 struct rtnexthop *rtnh;
2442 int remaining;
2443 int attrlen;
2444 int err = 0, last_err = 0;
2445
2446beginning:
2447 rtnh = (struct rtnexthop *)cfg->fc_mp;
2448 remaining = cfg->fc_mp_len;
2449
2450 /* Parse a Multipath Entry */
2451 while (rtnh_ok(rtnh, remaining)) {
2452 memcpy(&r_cfg, cfg, sizeof(*cfg));
2453 if (rtnh->rtnh_ifindex)
2454 r_cfg.fc_ifindex = rtnh->rtnh_ifindex;
2455
2456 attrlen = rtnh_attrlen(rtnh);
2457 if (attrlen > 0) {
2458 struct nlattr *nla, *attrs = rtnh_attrs(rtnh);
2459
2460 nla = nla_find(attrs, attrlen, RTA_GATEWAY);
2461 if (nla) {
2462 nla_memcpy(&r_cfg.fc_gateway, nla, 16);
2463 r_cfg.fc_flags |= RTF_GATEWAY;
2464 }
2465 }
2466 err = add ? ip6_route_add(&r_cfg) : ip6_route_del(&r_cfg);
2467 if (err) {
2468 last_err = err;
2469 /* If we are trying to remove a route, do not stop the
2470 * loop when ip6_route_del() fails (because next hop is
2471 * already gone), we should try to remove all next hops.
2472 */
2473 if (add) {
2474 /* If add fails, we should try to delete all
2475 * next hops that have been already added.
2476 */
2477 add = 0;
2478 goto beginning;
2479 }
2480 }
1a72418b
ND
2481 /* Because each route is added like a single route we remove
2482 * this flag after the first nexthop (if there is a collision,
2483 * we have already fail to add the first nexthop:
2484 * fib6_add_rt2node() has reject it).
2485 */
2486 cfg->fc_nlinfo.nlh->nlmsg_flags &= ~NLM_F_EXCL;
51ebd318
ND
2487 rtnh = rtnh_next(rtnh, &remaining);
2488 }
2489
2490 return last_err;
2491}
2492
661d2967 2493static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh)
1da177e4 2494{
86872cb5
TG
2495 struct fib6_config cfg;
2496 int err;
1da177e4 2497
86872cb5
TG
2498 err = rtm_to_fib6_config(skb, nlh, &cfg);
2499 if (err < 0)
2500 return err;
2501
51ebd318
ND
2502 if (cfg.fc_mp)
2503 return ip6_route_multipath(&cfg, 0);
2504 else
2505 return ip6_route_del(&cfg);
1da177e4
LT
2506}
2507
661d2967 2508static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh)
1da177e4 2509{
86872cb5
TG
2510 struct fib6_config cfg;
2511 int err;
1da177e4 2512
86872cb5
TG
2513 err = rtm_to_fib6_config(skb, nlh, &cfg);
2514 if (err < 0)
2515 return err;
2516
51ebd318
ND
2517 if (cfg.fc_mp)
2518 return ip6_route_multipath(&cfg, 1);
2519 else
2520 return ip6_route_add(&cfg);
1da177e4
LT
2521}
2522
339bf98f
TG
2523static inline size_t rt6_nlmsg_size(void)
2524{
2525 return NLMSG_ALIGN(sizeof(struct rtmsg))
2526 + nla_total_size(16) /* RTA_SRC */
2527 + nla_total_size(16) /* RTA_DST */
2528 + nla_total_size(16) /* RTA_GATEWAY */
2529 + nla_total_size(16) /* RTA_PREFSRC */
2530 + nla_total_size(4) /* RTA_TABLE */
2531 + nla_total_size(4) /* RTA_IIF */
2532 + nla_total_size(4) /* RTA_OIF */
2533 + nla_total_size(4) /* RTA_PRIORITY */
6a2b9ce0 2534 + RTAX_MAX * nla_total_size(4) /* RTA_METRICS */
339bf98f
TG
2535 + nla_total_size(sizeof(struct rta_cacheinfo));
2536}
2537
191cd582
BH
2538static int rt6_fill_node(struct net *net,
2539 struct sk_buff *skb, struct rt6_info *rt,
0d51aa80 2540 struct in6_addr *dst, struct in6_addr *src,
15e47304 2541 int iif, int type, u32 portid, u32 seq,
7bc570c8 2542 int prefix, int nowait, unsigned int flags)
1da177e4
LT
2543{
2544 struct rtmsg *rtm;
2d7202bf 2545 struct nlmsghdr *nlh;
e3703b3d 2546 long expires;
9e762a4a 2547 u32 table;
1da177e4
LT
2548
2549 if (prefix) { /* user wants prefix routes only */
2550 if (!(rt->rt6i_flags & RTF_PREFIX_RT)) {
2551 /* success since this is not a prefix route */
2552 return 1;
2553 }
2554 }
2555
15e47304 2556 nlh = nlmsg_put(skb, portid, seq, type, sizeof(*rtm), flags);
38308473 2557 if (!nlh)
26932566 2558 return -EMSGSIZE;
2d7202bf
TG
2559
2560 rtm = nlmsg_data(nlh);
1da177e4
LT
2561 rtm->rtm_family = AF_INET6;
2562 rtm->rtm_dst_len = rt->rt6i_dst.plen;
2563 rtm->rtm_src_len = rt->rt6i_src.plen;
2564 rtm->rtm_tos = 0;
c71099ac 2565 if (rt->rt6i_table)
9e762a4a 2566 table = rt->rt6i_table->tb6_id;
c71099ac 2567 else
9e762a4a
PM
2568 table = RT6_TABLE_UNSPEC;
2569 rtm->rtm_table = table;
c78679e8
DM
2570 if (nla_put_u32(skb, RTA_TABLE, table))
2571 goto nla_put_failure;
ef2c7d7b
ND
2572 if (rt->rt6i_flags & RTF_REJECT) {
2573 switch (rt->dst.error) {
2574 case -EINVAL:
2575 rtm->rtm_type = RTN_BLACKHOLE;
2576 break;
2577 case -EACCES:
2578 rtm->rtm_type = RTN_PROHIBIT;
2579 break;
b4949ab2
ND
2580 case -EAGAIN:
2581 rtm->rtm_type = RTN_THROW;
2582 break;
ef2c7d7b
ND
2583 default:
2584 rtm->rtm_type = RTN_UNREACHABLE;
2585 break;
2586 }
2587 }
38308473 2588 else if (rt->rt6i_flags & RTF_LOCAL)
ab79ad14 2589 rtm->rtm_type = RTN_LOCAL;
d1918542 2590 else if (rt->dst.dev && (rt->dst.dev->flags & IFF_LOOPBACK))
1da177e4
LT
2591 rtm->rtm_type = RTN_LOCAL;
2592 else
2593 rtm->rtm_type = RTN_UNICAST;
2594 rtm->rtm_flags = 0;
2595 rtm->rtm_scope = RT_SCOPE_UNIVERSE;
2596 rtm->rtm_protocol = rt->rt6i_protocol;
38308473 2597 if (rt->rt6i_flags & RTF_DYNAMIC)
1da177e4 2598 rtm->rtm_protocol = RTPROT_REDIRECT;
f0396f60
DO
2599 else if (rt->rt6i_flags & RTF_ADDRCONF) {
2600 if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ROUTEINFO))
2601 rtm->rtm_protocol = RTPROT_RA;
2602 else
2603 rtm->rtm_protocol = RTPROT_KERNEL;
2604 }
1da177e4 2605
38308473 2606 if (rt->rt6i_flags & RTF_CACHE)
1da177e4
LT
2607 rtm->rtm_flags |= RTM_F_CLONED;
2608
2609 if (dst) {
c78679e8
DM
2610 if (nla_put(skb, RTA_DST, 16, dst))
2611 goto nla_put_failure;
1ab1457c 2612 rtm->rtm_dst_len = 128;
1da177e4 2613 } else if (rtm->rtm_dst_len)
c78679e8
DM
2614 if (nla_put(skb, RTA_DST, 16, &rt->rt6i_dst.addr))
2615 goto nla_put_failure;
1da177e4
LT
2616#ifdef CONFIG_IPV6_SUBTREES
2617 if (src) {
c78679e8
DM
2618 if (nla_put(skb, RTA_SRC, 16, src))
2619 goto nla_put_failure;
1ab1457c 2620 rtm->rtm_src_len = 128;
c78679e8
DM
2621 } else if (rtm->rtm_src_len &&
2622 nla_put(skb, RTA_SRC, 16, &rt->rt6i_src.addr))
2623 goto nla_put_failure;
1da177e4 2624#endif
7bc570c8
YH
2625 if (iif) {
2626#ifdef CONFIG_IPV6_MROUTE
2627 if (ipv6_addr_is_multicast(&rt->rt6i_dst.addr)) {
8229efda 2628 int err = ip6mr_get_route(net, skb, rtm, nowait);
7bc570c8
YH
2629 if (err <= 0) {
2630 if (!nowait) {
2631 if (err == 0)
2632 return 0;
2633 goto nla_put_failure;
2634 } else {
2635 if (err == -EMSGSIZE)
2636 goto nla_put_failure;
2637 }
2638 }
2639 } else
2640#endif
c78679e8
DM
2641 if (nla_put_u32(skb, RTA_IIF, iif))
2642 goto nla_put_failure;
7bc570c8 2643 } else if (dst) {
1da177e4 2644 struct in6_addr saddr_buf;
c78679e8
DM
2645 if (ip6_route_get_saddr(net, rt, dst, 0, &saddr_buf) == 0 &&
2646 nla_put(skb, RTA_PREFSRC, 16, &saddr_buf))
2647 goto nla_put_failure;
1da177e4 2648 }
2d7202bf 2649
c3968a85
DW
2650 if (rt->rt6i_prefsrc.plen) {
2651 struct in6_addr saddr_buf;
4e3fd7a0 2652 saddr_buf = rt->rt6i_prefsrc.addr;
c78679e8
DM
2653 if (nla_put(skb, RTA_PREFSRC, 16, &saddr_buf))
2654 goto nla_put_failure;
c3968a85
DW
2655 }
2656
defb3519 2657 if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0)
2d7202bf
TG
2658 goto nla_put_failure;
2659
dd0cbf29
YH
2660 if (rt->rt6i_flags & RTF_GATEWAY) {
2661 if (nla_put(skb, RTA_GATEWAY, 16, &rt->rt6i_gateway) < 0)
94f826b8 2662 goto nla_put_failure;
94f826b8 2663 }
2d7202bf 2664
c78679e8
DM
2665 if (rt->dst.dev &&
2666 nla_put_u32(skb, RTA_OIF, rt->dst.dev->ifindex))
2667 goto nla_put_failure;
2668 if (nla_put_u32(skb, RTA_PRIORITY, rt->rt6i_metric))
2669 goto nla_put_failure;
8253947e
LW
2670
2671 expires = (rt->rt6i_flags & RTF_EXPIRES) ? rt->dst.expires - jiffies : 0;
69cdf8f9 2672
87a50699 2673 if (rtnl_put_cacheinfo(skb, &rt->dst, 0, expires, rt->dst.error) < 0)
e3703b3d 2674 goto nla_put_failure;
2d7202bf
TG
2675
2676 return nlmsg_end(skb, nlh);
2677
2678nla_put_failure:
26932566
PM
2679 nlmsg_cancel(skb, nlh);
2680 return -EMSGSIZE;
1da177e4
LT
2681}
2682
1b43af54 2683int rt6_dump_route(struct rt6_info *rt, void *p_arg)
1da177e4
LT
2684{
2685 struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg;
2686 int prefix;
2687
2d7202bf
TG
2688 if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) {
2689 struct rtmsg *rtm = nlmsg_data(arg->cb->nlh);
1da177e4
LT
2690 prefix = (rtm->rtm_flags & RTM_F_PREFIX) != 0;
2691 } else
2692 prefix = 0;
2693
191cd582
BH
2694 return rt6_fill_node(arg->net,
2695 arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE,
15e47304 2696 NETLINK_CB(arg->cb->skb).portid, arg->cb->nlh->nlmsg_seq,
7bc570c8 2697 prefix, 0, NLM_F_MULTI);
1da177e4
LT
2698}
2699
661d2967 2700static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh)
1da177e4 2701{
3b1e0a65 2702 struct net *net = sock_net(in_skb->sk);
ab364a6f
TG
2703 struct nlattr *tb[RTA_MAX+1];
2704 struct rt6_info *rt;
1da177e4 2705 struct sk_buff *skb;
ab364a6f 2706 struct rtmsg *rtm;
4c9483b2 2707 struct flowi6 fl6;
72331bc0 2708 int err, iif = 0, oif = 0;
1da177e4 2709
ab364a6f
TG
2710 err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv6_policy);
2711 if (err < 0)
2712 goto errout;
1da177e4 2713
ab364a6f 2714 err = -EINVAL;
4c9483b2 2715 memset(&fl6, 0, sizeof(fl6));
1da177e4 2716
ab364a6f
TG
2717 if (tb[RTA_SRC]) {
2718 if (nla_len(tb[RTA_SRC]) < sizeof(struct in6_addr))
2719 goto errout;
2720
4e3fd7a0 2721 fl6.saddr = *(struct in6_addr *)nla_data(tb[RTA_SRC]);
ab364a6f
TG
2722 }
2723
2724 if (tb[RTA_DST]) {
2725 if (nla_len(tb[RTA_DST]) < sizeof(struct in6_addr))
2726 goto errout;
2727
4e3fd7a0 2728 fl6.daddr = *(struct in6_addr *)nla_data(tb[RTA_DST]);
ab364a6f
TG
2729 }
2730
2731 if (tb[RTA_IIF])
2732 iif = nla_get_u32(tb[RTA_IIF]);
2733
2734 if (tb[RTA_OIF])
72331bc0 2735 oif = nla_get_u32(tb[RTA_OIF]);
1da177e4
LT
2736
2737 if (iif) {
2738 struct net_device *dev;
72331bc0
SL
2739 int flags = 0;
2740
5578689a 2741 dev = __dev_get_by_index(net, iif);
1da177e4
LT
2742 if (!dev) {
2743 err = -ENODEV;
ab364a6f 2744 goto errout;
1da177e4 2745 }
72331bc0
SL
2746
2747 fl6.flowi6_iif = iif;
2748
2749 if (!ipv6_addr_any(&fl6.saddr))
2750 flags |= RT6_LOOKUP_F_HAS_SADDR;
2751
2752 rt = (struct rt6_info *)ip6_route_input_lookup(net, dev, &fl6,
2753 flags);
2754 } else {
2755 fl6.flowi6_oif = oif;
2756
2757 rt = (struct rt6_info *)ip6_route_output(net, NULL, &fl6);
1da177e4
LT
2758 }
2759
ab364a6f 2760 skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
38308473 2761 if (!skb) {
94e187c0 2762 ip6_rt_put(rt);
ab364a6f
TG
2763 err = -ENOBUFS;
2764 goto errout;
2765 }
1da177e4 2766
ab364a6f
TG
2767 /* Reserve room for dummy headers, this skb can pass
2768 through good chunk of routing engine.
2769 */
459a98ed 2770 skb_reset_mac_header(skb);
ab364a6f 2771 skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr));
1da177e4 2772
d8d1f30b 2773 skb_dst_set(skb, &rt->dst);
1da177e4 2774
4c9483b2 2775 err = rt6_fill_node(net, skb, rt, &fl6.daddr, &fl6.saddr, iif,
15e47304 2776 RTM_NEWROUTE, NETLINK_CB(in_skb).portid,
7bc570c8 2777 nlh->nlmsg_seq, 0, 0, 0);
1da177e4 2778 if (err < 0) {
ab364a6f
TG
2779 kfree_skb(skb);
2780 goto errout;
1da177e4
LT
2781 }
2782
15e47304 2783 err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
ab364a6f 2784errout:
1da177e4 2785 return err;
1da177e4
LT
2786}
2787
86872cb5 2788void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info)
1da177e4
LT
2789{
2790 struct sk_buff *skb;
5578689a 2791 struct net *net = info->nl_net;
528c4ceb
DL
2792 u32 seq;
2793 int err;
2794
2795 err = -ENOBUFS;
38308473 2796 seq = info->nlh ? info->nlh->nlmsg_seq : 0;
86872cb5 2797
339bf98f 2798 skb = nlmsg_new(rt6_nlmsg_size(), gfp_any());
38308473 2799 if (!skb)
21713ebc
TG
2800 goto errout;
2801
191cd582 2802 err = rt6_fill_node(net, skb, rt, NULL, NULL, 0,
15e47304 2803 event, info->portid, seq, 0, 0, 0);
26932566
PM
2804 if (err < 0) {
2805 /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
2806 WARN_ON(err == -EMSGSIZE);
2807 kfree_skb(skb);
2808 goto errout;
2809 }
15e47304 2810 rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE,
1ce85fe4
PNA
2811 info->nlh, gfp_any());
2812 return;
21713ebc
TG
2813errout:
2814 if (err < 0)
5578689a 2815 rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err);
1da177e4
LT
2816}
2817
8ed67789 2818static int ip6_route_dev_notify(struct notifier_block *this,
351638e7 2819 unsigned long event, void *ptr)
8ed67789 2820{
351638e7 2821 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
c346dca1 2822 struct net *net = dev_net(dev);
8ed67789
DL
2823
2824 if (event == NETDEV_REGISTER && (dev->flags & IFF_LOOPBACK)) {
d8d1f30b 2825 net->ipv6.ip6_null_entry->dst.dev = dev;
8ed67789
DL
2826 net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev);
2827#ifdef CONFIG_IPV6_MULTIPLE_TABLES
d8d1f30b 2828 net->ipv6.ip6_prohibit_entry->dst.dev = dev;
8ed67789 2829 net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
d8d1f30b 2830 net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
8ed67789
DL
2831 net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
2832#endif
2833 }
2834
2835 return NOTIFY_OK;
2836}
2837
1da177e4
LT
2838/*
2839 * /proc
2840 */
2841
2842#ifdef CONFIG_PROC_FS
2843
33120b30
AD
2844static const struct file_operations ipv6_route_proc_fops = {
2845 .owner = THIS_MODULE,
2846 .open = ipv6_route_open,
2847 .read = seq_read,
2848 .llseek = seq_lseek,
8d2ca1d7 2849 .release = seq_release_net,
33120b30
AD
2850};
2851
1da177e4
LT
2852static int rt6_stats_seq_show(struct seq_file *seq, void *v)
2853{
69ddb805 2854 struct net *net = (struct net *)seq->private;
1da177e4 2855 seq_printf(seq, "%04x %04x %04x %04x %04x %04x %04x\n",
69ddb805
DL
2856 net->ipv6.rt6_stats->fib_nodes,
2857 net->ipv6.rt6_stats->fib_route_nodes,
2858 net->ipv6.rt6_stats->fib_rt_alloc,
2859 net->ipv6.rt6_stats->fib_rt_entries,
2860 net->ipv6.rt6_stats->fib_rt_cache,
fc66f95c 2861 dst_entries_get_slow(&net->ipv6.ip6_dst_ops),
69ddb805 2862 net->ipv6.rt6_stats->fib_discarded_routes);
1da177e4
LT
2863
2864 return 0;
2865}
2866
2867static int rt6_stats_seq_open(struct inode *inode, struct file *file)
2868{
de05c557 2869 return single_open_net(inode, file, rt6_stats_seq_show);
69ddb805
DL
2870}
2871
9a32144e 2872static const struct file_operations rt6_stats_seq_fops = {
1da177e4
LT
2873 .owner = THIS_MODULE,
2874 .open = rt6_stats_seq_open,
2875 .read = seq_read,
2876 .llseek = seq_lseek,
b6fcbdb4 2877 .release = single_release_net,
1da177e4
LT
2878};
2879#endif /* CONFIG_PROC_FS */
2880
2881#ifdef CONFIG_SYSCTL
2882
1da177e4 2883static
fe2c6338 2884int ipv6_sysctl_rtcache_flush(struct ctl_table *ctl, int write,
1da177e4
LT
2885 void __user *buffer, size_t *lenp, loff_t *ppos)
2886{
c486da34
LAG
2887 struct net *net;
2888 int delay;
2889 if (!write)
1da177e4 2890 return -EINVAL;
c486da34
LAG
2891
2892 net = (struct net *)ctl->extra1;
2893 delay = net->ipv6.sysctl.flush_delay;
2894 proc_dointvec(ctl, write, buffer, lenp, ppos);
2ac3ac8f 2895 fib6_run_gc(delay <= 0 ? 0 : (unsigned long)delay, net, delay > 0);
c486da34 2896 return 0;
1da177e4
LT
2897}
2898
fe2c6338 2899struct ctl_table ipv6_route_table_template[] = {
1ab1457c 2900 {
1da177e4 2901 .procname = "flush",
4990509f 2902 .data = &init_net.ipv6.sysctl.flush_delay,
1da177e4 2903 .maxlen = sizeof(int),
89c8b3a1 2904 .mode = 0200,
6d9f239a 2905 .proc_handler = ipv6_sysctl_rtcache_flush
1da177e4
LT
2906 },
2907 {
1da177e4 2908 .procname = "gc_thresh",
9a7ec3a9 2909 .data = &ip6_dst_ops_template.gc_thresh,
1da177e4
LT
2910 .maxlen = sizeof(int),
2911 .mode = 0644,
6d9f239a 2912 .proc_handler = proc_dointvec,
1da177e4
LT
2913 },
2914 {
1da177e4 2915 .procname = "max_size",
4990509f 2916 .data = &init_net.ipv6.sysctl.ip6_rt_max_size,
1da177e4
LT
2917 .maxlen = sizeof(int),
2918 .mode = 0644,
6d9f239a 2919 .proc_handler = proc_dointvec,
1da177e4
LT
2920 },
2921 {
1da177e4 2922 .procname = "gc_min_interval",
4990509f 2923 .data = &init_net.ipv6.sysctl.ip6_rt_gc_min_interval,
1da177e4
LT
2924 .maxlen = sizeof(int),
2925 .mode = 0644,
6d9f239a 2926 .proc_handler = proc_dointvec_jiffies,
1da177e4
LT
2927 },
2928 {
1da177e4 2929 .procname = "gc_timeout",
4990509f 2930 .data = &init_net.ipv6.sysctl.ip6_rt_gc_timeout,
1da177e4
LT
2931 .maxlen = sizeof(int),
2932 .mode = 0644,
6d9f239a 2933 .proc_handler = proc_dointvec_jiffies,
1da177e4
LT
2934 },
2935 {
1da177e4 2936 .procname = "gc_interval",
4990509f 2937 .data = &init_net.ipv6.sysctl.ip6_rt_gc_interval,
1da177e4
LT
2938 .maxlen = sizeof(int),
2939 .mode = 0644,
6d9f239a 2940 .proc_handler = proc_dointvec_jiffies,
1da177e4
LT
2941 },
2942 {
1da177e4 2943 .procname = "gc_elasticity",
4990509f 2944 .data = &init_net.ipv6.sysctl.ip6_rt_gc_elasticity,
1da177e4
LT
2945 .maxlen = sizeof(int),
2946 .mode = 0644,
f3d3f616 2947 .proc_handler = proc_dointvec,
1da177e4
LT
2948 },
2949 {
1da177e4 2950 .procname = "mtu_expires",
4990509f 2951 .data = &init_net.ipv6.sysctl.ip6_rt_mtu_expires,
1da177e4
LT
2952 .maxlen = sizeof(int),
2953 .mode = 0644,
6d9f239a 2954 .proc_handler = proc_dointvec_jiffies,
1da177e4
LT
2955 },
2956 {
1da177e4 2957 .procname = "min_adv_mss",
4990509f 2958 .data = &init_net.ipv6.sysctl.ip6_rt_min_advmss,
1da177e4
LT
2959 .maxlen = sizeof(int),
2960 .mode = 0644,
f3d3f616 2961 .proc_handler = proc_dointvec,
1da177e4
LT
2962 },
2963 {
1da177e4 2964 .procname = "gc_min_interval_ms",
4990509f 2965 .data = &init_net.ipv6.sysctl.ip6_rt_gc_min_interval,
1da177e4
LT
2966 .maxlen = sizeof(int),
2967 .mode = 0644,
6d9f239a 2968 .proc_handler = proc_dointvec_ms_jiffies,
1da177e4 2969 },
f8572d8f 2970 { }
1da177e4
LT
2971};
2972
2c8c1e72 2973struct ctl_table * __net_init ipv6_route_sysctl_init(struct net *net)
760f2d01
DL
2974{
2975 struct ctl_table *table;
2976
2977 table = kmemdup(ipv6_route_table_template,
2978 sizeof(ipv6_route_table_template),
2979 GFP_KERNEL);
5ee09105
YH
2980
2981 if (table) {
2982 table[0].data = &net->ipv6.sysctl.flush_delay;
c486da34 2983 table[0].extra1 = net;
86393e52 2984 table[1].data = &net->ipv6.ip6_dst_ops.gc_thresh;
5ee09105
YH
2985 table[2].data = &net->ipv6.sysctl.ip6_rt_max_size;
2986 table[3].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
2987 table[4].data = &net->ipv6.sysctl.ip6_rt_gc_timeout;
2988 table[5].data = &net->ipv6.sysctl.ip6_rt_gc_interval;
2989 table[6].data = &net->ipv6.sysctl.ip6_rt_gc_elasticity;
2990 table[7].data = &net->ipv6.sysctl.ip6_rt_mtu_expires;
2991 table[8].data = &net->ipv6.sysctl.ip6_rt_min_advmss;
9c69fabe 2992 table[9].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
464dc801
EB
2993
2994 /* Don't export sysctls to unprivileged users */
2995 if (net->user_ns != &init_user_ns)
2996 table[0].procname = NULL;
5ee09105
YH
2997 }
2998
760f2d01
DL
2999 return table;
3000}
1da177e4
LT
3001#endif
3002
2c8c1e72 3003static int __net_init ip6_route_net_init(struct net *net)
cdb18761 3004{
633d424b 3005 int ret = -ENOMEM;
8ed67789 3006
86393e52
AD
3007 memcpy(&net->ipv6.ip6_dst_ops, &ip6_dst_ops_template,
3008 sizeof(net->ipv6.ip6_dst_ops));
f2fc6a54 3009
fc66f95c
ED
3010 if (dst_entries_init(&net->ipv6.ip6_dst_ops) < 0)
3011 goto out_ip6_dst_ops;
3012
8ed67789
DL
3013 net->ipv6.ip6_null_entry = kmemdup(&ip6_null_entry_template,
3014 sizeof(*net->ipv6.ip6_null_entry),
3015 GFP_KERNEL);
3016 if (!net->ipv6.ip6_null_entry)
fc66f95c 3017 goto out_ip6_dst_entries;
d8d1f30b 3018 net->ipv6.ip6_null_entry->dst.path =
8ed67789 3019 (struct dst_entry *)net->ipv6.ip6_null_entry;
d8d1f30b 3020 net->ipv6.ip6_null_entry->dst.ops = &net->ipv6.ip6_dst_ops;
62fa8a84
DM
3021 dst_init_metrics(&net->ipv6.ip6_null_entry->dst,
3022 ip6_template_metrics, true);
8ed67789
DL
3023
3024#ifdef CONFIG_IPV6_MULTIPLE_TABLES
3025 net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
3026 sizeof(*net->ipv6.ip6_prohibit_entry),
3027 GFP_KERNEL);
68fffc67
PZ
3028 if (!net->ipv6.ip6_prohibit_entry)
3029 goto out_ip6_null_entry;
d8d1f30b 3030 net->ipv6.ip6_prohibit_entry->dst.path =
8ed67789 3031 (struct dst_entry *)net->ipv6.ip6_prohibit_entry;
d8d1f30b 3032 net->ipv6.ip6_prohibit_entry->dst.ops = &net->ipv6.ip6_dst_ops;
62fa8a84
DM
3033 dst_init_metrics(&net->ipv6.ip6_prohibit_entry->dst,
3034 ip6_template_metrics, true);
8ed67789
DL
3035
3036 net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template,
3037 sizeof(*net->ipv6.ip6_blk_hole_entry),
3038 GFP_KERNEL);
68fffc67
PZ
3039 if (!net->ipv6.ip6_blk_hole_entry)
3040 goto out_ip6_prohibit_entry;
d8d1f30b 3041 net->ipv6.ip6_blk_hole_entry->dst.path =
8ed67789 3042 (struct dst_entry *)net->ipv6.ip6_blk_hole_entry;
d8d1f30b 3043 net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
62fa8a84
DM
3044 dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
3045 ip6_template_metrics, true);
8ed67789
DL
3046#endif
3047
b339a47c
PZ
3048 net->ipv6.sysctl.flush_delay = 0;
3049 net->ipv6.sysctl.ip6_rt_max_size = 4096;
3050 net->ipv6.sysctl.ip6_rt_gc_min_interval = HZ / 2;
3051 net->ipv6.sysctl.ip6_rt_gc_timeout = 60*HZ;
3052 net->ipv6.sysctl.ip6_rt_gc_interval = 30*HZ;
3053 net->ipv6.sysctl.ip6_rt_gc_elasticity = 9;
3054 net->ipv6.sysctl.ip6_rt_mtu_expires = 10*60*HZ;
3055 net->ipv6.sysctl.ip6_rt_min_advmss = IPV6_MIN_MTU - 20 - 40;
3056
6891a346
BT
3057 net->ipv6.ip6_rt_gc_expire = 30*HZ;
3058
8ed67789
DL
3059 ret = 0;
3060out:
3061 return ret;
f2fc6a54 3062
68fffc67
PZ
3063#ifdef CONFIG_IPV6_MULTIPLE_TABLES
3064out_ip6_prohibit_entry:
3065 kfree(net->ipv6.ip6_prohibit_entry);
3066out_ip6_null_entry:
3067 kfree(net->ipv6.ip6_null_entry);
3068#endif
fc66f95c
ED
3069out_ip6_dst_entries:
3070 dst_entries_destroy(&net->ipv6.ip6_dst_ops);
f2fc6a54 3071out_ip6_dst_ops:
f2fc6a54 3072 goto out;
cdb18761
DL
3073}
3074
2c8c1e72 3075static void __net_exit ip6_route_net_exit(struct net *net)
cdb18761 3076{
8ed67789
DL
3077 kfree(net->ipv6.ip6_null_entry);
3078#ifdef CONFIG_IPV6_MULTIPLE_TABLES
3079 kfree(net->ipv6.ip6_prohibit_entry);
3080 kfree(net->ipv6.ip6_blk_hole_entry);
3081#endif
41bb78b4 3082 dst_entries_destroy(&net->ipv6.ip6_dst_ops);
cdb18761
DL
3083}
3084
d189634e
TG
3085static int __net_init ip6_route_net_init_late(struct net *net)
3086{
3087#ifdef CONFIG_PROC_FS
d4beaa66
G
3088 proc_create("ipv6_route", 0, net->proc_net, &ipv6_route_proc_fops);
3089 proc_create("rt6_stats", S_IRUGO, net->proc_net, &rt6_stats_seq_fops);
d189634e
TG
3090#endif
3091 return 0;
3092}
3093
3094static void __net_exit ip6_route_net_exit_late(struct net *net)
3095{
3096#ifdef CONFIG_PROC_FS
ece31ffd
G
3097 remove_proc_entry("ipv6_route", net->proc_net);
3098 remove_proc_entry("rt6_stats", net->proc_net);
d189634e
TG
3099#endif
3100}
3101
cdb18761
DL
3102static struct pernet_operations ip6_route_net_ops = {
3103 .init = ip6_route_net_init,
3104 .exit = ip6_route_net_exit,
3105};
3106
c3426b47
DM
3107static int __net_init ipv6_inetpeer_init(struct net *net)
3108{
3109 struct inet_peer_base *bp = kmalloc(sizeof(*bp), GFP_KERNEL);
3110
3111 if (!bp)
3112 return -ENOMEM;
3113 inet_peer_base_init(bp);
3114 net->ipv6.peers = bp;
3115 return 0;
3116}
3117
3118static void __net_exit ipv6_inetpeer_exit(struct net *net)
3119{
3120 struct inet_peer_base *bp = net->ipv6.peers;
3121
3122 net->ipv6.peers = NULL;
56a6b248 3123 inetpeer_invalidate_tree(bp);
c3426b47
DM
3124 kfree(bp);
3125}
3126
2b823f72 3127static struct pernet_operations ipv6_inetpeer_ops = {
c3426b47
DM
3128 .init = ipv6_inetpeer_init,
3129 .exit = ipv6_inetpeer_exit,
3130};
3131
d189634e
TG
3132static struct pernet_operations ip6_route_net_late_ops = {
3133 .init = ip6_route_net_init_late,
3134 .exit = ip6_route_net_exit_late,
3135};
3136
8ed67789
DL
3137static struct notifier_block ip6_route_dev_notifier = {
3138 .notifier_call = ip6_route_dev_notify,
3139 .priority = 0,
3140};
3141
433d49c3 3142int __init ip6_route_init(void)
1da177e4 3143{
433d49c3
DL
3144 int ret;
3145
9a7ec3a9
DL
3146 ret = -ENOMEM;
3147 ip6_dst_ops_template.kmem_cachep =
e5d679f3 3148 kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0,
f845ab6b 3149 SLAB_HWCACHE_ALIGN, NULL);
9a7ec3a9 3150 if (!ip6_dst_ops_template.kmem_cachep)
c19a28e1 3151 goto out;
14e50e57 3152
fc66f95c 3153 ret = dst_entries_init(&ip6_dst_blackhole_ops);
8ed67789 3154 if (ret)
bdb3289f 3155 goto out_kmem_cache;
bdb3289f 3156
c3426b47
DM
3157 ret = register_pernet_subsys(&ipv6_inetpeer_ops);
3158 if (ret)
e8803b6c 3159 goto out_dst_entries;
2a0c451a 3160
7e52b33b
DM
3161 ret = register_pernet_subsys(&ip6_route_net_ops);
3162 if (ret)
3163 goto out_register_inetpeer;
c3426b47 3164
5dc121e9
AE
3165 ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops_template.kmem_cachep;
3166
8ed67789
DL
3167 /* Registering of the loopback is done before this portion of code,
3168 * the loopback reference in rt6_info will not be taken, do it
3169 * manually for init_net */
d8d1f30b 3170 init_net.ipv6.ip6_null_entry->dst.dev = init_net.loopback_dev;
8ed67789
DL
3171 init_net.ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
3172 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
d8d1f30b 3173 init_net.ipv6.ip6_prohibit_entry->dst.dev = init_net.loopback_dev;
8ed67789 3174 init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
d8d1f30b 3175 init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
8ed67789
DL
3176 init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
3177 #endif
e8803b6c 3178 ret = fib6_init();
433d49c3 3179 if (ret)
8ed67789 3180 goto out_register_subsys;
433d49c3 3181
433d49c3
DL
3182 ret = xfrm6_init();
3183 if (ret)
e8803b6c 3184 goto out_fib6_init;
c35b7e72 3185
433d49c3
DL
3186 ret = fib6_rules_init();
3187 if (ret)
3188 goto xfrm6_init;
7e5449c2 3189
d189634e
TG
3190 ret = register_pernet_subsys(&ip6_route_net_late_ops);
3191 if (ret)
3192 goto fib6_rules_init;
3193
433d49c3 3194 ret = -ENOBUFS;
c7ac8679
GR
3195 if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, NULL) ||
3196 __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, NULL) ||
3197 __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, NULL))
d189634e 3198 goto out_register_late_subsys;
c127ea2c 3199
8ed67789 3200 ret = register_netdevice_notifier(&ip6_route_dev_notifier);
cdb18761 3201 if (ret)
d189634e 3202 goto out_register_late_subsys;
8ed67789 3203
433d49c3
DL
3204out:
3205 return ret;
3206
d189634e
TG
3207out_register_late_subsys:
3208 unregister_pernet_subsys(&ip6_route_net_late_ops);
433d49c3 3209fib6_rules_init:
433d49c3
DL
3210 fib6_rules_cleanup();
3211xfrm6_init:
433d49c3 3212 xfrm6_fini();
2a0c451a
TG
3213out_fib6_init:
3214 fib6_gc_cleanup();
8ed67789
DL
3215out_register_subsys:
3216 unregister_pernet_subsys(&ip6_route_net_ops);
7e52b33b
DM
3217out_register_inetpeer:
3218 unregister_pernet_subsys(&ipv6_inetpeer_ops);
fc66f95c
ED
3219out_dst_entries:
3220 dst_entries_destroy(&ip6_dst_blackhole_ops);
433d49c3 3221out_kmem_cache:
f2fc6a54 3222 kmem_cache_destroy(ip6_dst_ops_template.kmem_cachep);
433d49c3 3223 goto out;
1da177e4
LT
3224}
3225
3226void ip6_route_cleanup(void)
3227{
8ed67789 3228 unregister_netdevice_notifier(&ip6_route_dev_notifier);
d189634e 3229 unregister_pernet_subsys(&ip6_route_net_late_ops);
101367c2 3230 fib6_rules_cleanup();
1da177e4 3231 xfrm6_fini();
1da177e4 3232 fib6_gc_cleanup();
c3426b47 3233 unregister_pernet_subsys(&ipv6_inetpeer_ops);
8ed67789 3234 unregister_pernet_subsys(&ip6_route_net_ops);
41bb78b4 3235 dst_entries_destroy(&ip6_dst_blackhole_ops);
f2fc6a54 3236 kmem_cache_destroy(ip6_dst_ops_template.kmem_cachep);
1da177e4 3237}