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