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