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