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