net: avoid sk_forward_alloc overflows
[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 111 if (!(rt->dst.flags & DST_HOST))
e5fc2a02 112 return dst_cow_metrics_generic(dst, old);
8e2ec639 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 1143 rt6->rt6i_flags |= RTF_MODIFIED;
fa3f55df 1144 if (mtu < IPV6_MIN_MTU)
1da177e4 1145 mtu = IPV6_MIN_MTU;
fa3f55df 1146
defb3519 1147 dst_metric_set(dst, RTAX_MTU, mtu);
81aded24 1148 rt6_update_expires(rt6, net->ipv6.sysctl.ip6_rt_mtu_expires);
1da177e4
LT
1149 }
1150}
1151
42ae66c8
DM
1152void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu,
1153 int oif, u32 mark)
81aded24
DM
1154{
1155 const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data;
1156 struct dst_entry *dst;
1157 struct flowi6 fl6;
1158
1159 memset(&fl6, 0, sizeof(fl6));
1160 fl6.flowi6_oif = oif;
1161 fl6.flowi6_mark = mark;
3e12939a 1162 fl6.flowi6_flags = 0;
81aded24
DM
1163 fl6.daddr = iph->daddr;
1164 fl6.saddr = iph->saddr;
6502ca52 1165 fl6.flowlabel = ip6_flowinfo(iph);
81aded24
DM
1166
1167 dst = ip6_route_output(net, NULL, &fl6);
1168 if (!dst->error)
6700c270 1169 ip6_rt_update_pmtu(dst, NULL, skb, ntohl(mtu));
81aded24
DM
1170 dst_release(dst);
1171}
1172EXPORT_SYMBOL_GPL(ip6_update_pmtu);
1173
1174void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, __be32 mtu)
1175{
1176 ip6_update_pmtu(skb, sock_net(sk), mtu,
1177 sk->sk_bound_dev_if, sk->sk_mark);
1178}
1179EXPORT_SYMBOL_GPL(ip6_sk_update_pmtu);
1180
3a5ad2ee
DM
1181void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark)
1182{
1183 const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data;
1184 struct dst_entry *dst;
1185 struct flowi6 fl6;
1186
1187 memset(&fl6, 0, sizeof(fl6));
1188 fl6.flowi6_oif = oif;
1189 fl6.flowi6_mark = mark;
1190 fl6.flowi6_flags = 0;
1191 fl6.daddr = iph->daddr;
1192 fl6.saddr = iph->saddr;
6502ca52 1193 fl6.flowlabel = ip6_flowinfo(iph);
3a5ad2ee
DM
1194
1195 dst = ip6_route_output(net, NULL, &fl6);
1196 if (!dst->error)
6700c270 1197 rt6_do_redirect(dst, NULL, skb);
3a5ad2ee
DM
1198 dst_release(dst);
1199}
1200EXPORT_SYMBOL_GPL(ip6_redirect);
1201
1202void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk)
1203{
1204 ip6_redirect(skb, sock_net(sk), sk->sk_bound_dev_if, sk->sk_mark);
1205}
1206EXPORT_SYMBOL_GPL(ip6_sk_redirect);
1207
0dbaee3b 1208static unsigned int ip6_default_advmss(const struct dst_entry *dst)
1da177e4 1209{
0dbaee3b
DM
1210 struct net_device *dev = dst->dev;
1211 unsigned int mtu = dst_mtu(dst);
1212 struct net *net = dev_net(dev);
1213
1da177e4
LT
1214 mtu -= sizeof(struct ipv6hdr) + sizeof(struct tcphdr);
1215
5578689a
DL
1216 if (mtu < net->ipv6.sysctl.ip6_rt_min_advmss)
1217 mtu = net->ipv6.sysctl.ip6_rt_min_advmss;
1da177e4
LT
1218
1219 /*
1ab1457c
YH
1220 * Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and
1221 * corresponding MSS is IPV6_MAXPLEN - tcp_header_size.
1222 * IPV6_MAXPLEN is also valid and means: "any MSS,
1da177e4
LT
1223 * rely only on pmtu discovery"
1224 */
1225 if (mtu > IPV6_MAXPLEN - sizeof(struct tcphdr))
1226 mtu = IPV6_MAXPLEN;
1227 return mtu;
1228}
1229
ebb762f2 1230static unsigned int ip6_mtu(const struct dst_entry *dst)
d33e4553 1231{
d33e4553 1232 struct inet6_dev *idev;
618f9bc7
SK
1233 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
1234
1235 if (mtu)
132da31a 1236 goto out;
618f9bc7
SK
1237
1238 mtu = IPV6_MIN_MTU;
d33e4553
DM
1239
1240 rcu_read_lock();
1241 idev = __in6_dev_get(dst->dev);
1242 if (idev)
1243 mtu = idev->cnf.mtu6;
1244 rcu_read_unlock();
1245
132da31a
ED
1246out:
1247 return min_t(unsigned int, mtu, IP6_MAX_MTU);
d33e4553
DM
1248}
1249
3b00944c
YH
1250static struct dst_entry *icmp6_dst_gc_list;
1251static DEFINE_SPINLOCK(icmp6_dst_lock);
5d0bbeeb 1252
3b00944c 1253struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
87a11578 1254 struct flowi6 *fl6)
1da177e4 1255{
87a11578 1256 struct dst_entry *dst;
1da177e4
LT
1257 struct rt6_info *rt;
1258 struct inet6_dev *idev = in6_dev_get(dev);
c346dca1 1259 struct net *net = dev_net(dev);
1da177e4 1260
38308473 1261 if (unlikely(!idev))
122bdf67 1262 return ERR_PTR(-ENODEV);
1da177e4 1263
8b96d22d 1264 rt = ip6_dst_alloc(net, dev, 0, NULL);
38308473 1265 if (unlikely(!rt)) {
1da177e4 1266 in6_dev_put(idev);
87a11578 1267 dst = ERR_PTR(-ENOMEM);
1da177e4
LT
1268 goto out;
1269 }
1270
8e2ec639
YZ
1271 rt->dst.flags |= DST_HOST;
1272 rt->dst.output = ip6_output;
d8d1f30b 1273 atomic_set(&rt->dst.__refcnt, 1);
044d6efb 1274 rt->rt6i_gateway = fl6->daddr;
87a11578 1275 rt->rt6i_dst.addr = fl6->daddr;
8e2ec639
YZ
1276 rt->rt6i_dst.plen = 128;
1277 rt->rt6i_idev = idev;
14edd87d 1278 dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 0);
1da177e4 1279
3b00944c 1280 spin_lock_bh(&icmp6_dst_lock);
d8d1f30b
CG
1281 rt->dst.next = icmp6_dst_gc_list;
1282 icmp6_dst_gc_list = &rt->dst;
3b00944c 1283 spin_unlock_bh(&icmp6_dst_lock);
1da177e4 1284
5578689a 1285 fib6_force_start_gc(net);
1da177e4 1286
87a11578
DM
1287 dst = xfrm_lookup(net, &rt->dst, flowi6_to_flowi(fl6), NULL, 0);
1288
1da177e4 1289out:
87a11578 1290 return dst;
1da177e4
LT
1291}
1292
3d0f24a7 1293int icmp6_dst_gc(void)
1da177e4 1294{
e9476e95 1295 struct dst_entry *dst, **pprev;
3d0f24a7 1296 int more = 0;
1da177e4 1297
3b00944c
YH
1298 spin_lock_bh(&icmp6_dst_lock);
1299 pprev = &icmp6_dst_gc_list;
5d0bbeeb 1300
1da177e4
LT
1301 while ((dst = *pprev) != NULL) {
1302 if (!atomic_read(&dst->__refcnt)) {
1303 *pprev = dst->next;
1304 dst_free(dst);
1da177e4
LT
1305 } else {
1306 pprev = &dst->next;
3d0f24a7 1307 ++more;
1da177e4
LT
1308 }
1309 }
1310
3b00944c 1311 spin_unlock_bh(&icmp6_dst_lock);
5d0bbeeb 1312
3d0f24a7 1313 return more;
1da177e4
LT
1314}
1315
1e493d19
DM
1316static void icmp6_clean_all(int (*func)(struct rt6_info *rt, void *arg),
1317 void *arg)
1318{
1319 struct dst_entry *dst, **pprev;
1320
1321 spin_lock_bh(&icmp6_dst_lock);
1322 pprev = &icmp6_dst_gc_list;
1323 while ((dst = *pprev) != NULL) {
1324 struct rt6_info *rt = (struct rt6_info *) dst;
1325 if (func(rt, arg)) {
1326 *pprev = dst->next;
1327 dst_free(dst);
1328 } else {
1329 pprev = &dst->next;
1330 }
1331 }
1332 spin_unlock_bh(&icmp6_dst_lock);
1333}
1334
569d3645 1335static int ip6_dst_gc(struct dst_ops *ops)
1da177e4 1336{
86393e52 1337 struct net *net = container_of(ops, struct net, ipv6.ip6_dst_ops);
7019b78e
DL
1338 int rt_min_interval = net->ipv6.sysctl.ip6_rt_gc_min_interval;
1339 int rt_max_size = net->ipv6.sysctl.ip6_rt_max_size;
1340 int rt_elasticity = net->ipv6.sysctl.ip6_rt_gc_elasticity;
1341 int rt_gc_timeout = net->ipv6.sysctl.ip6_rt_gc_timeout;
1342 unsigned long rt_last_gc = net->ipv6.ip6_rt_last_gc;
fc66f95c 1343 int entries;
7019b78e 1344
fc66f95c 1345 entries = dst_entries_get_fast(ops);
c1e1eb15 1346 if (time_after(rt_last_gc + rt_min_interval, jiffies) &&
fc66f95c 1347 entries <= rt_max_size)
1da177e4
LT
1348 goto out;
1349
6891a346 1350 net->ipv6.ip6_rt_gc_expire++;
ba310bc8 1351 fib6_run_gc(net->ipv6.ip6_rt_gc_expire, net, entries > rt_max_size);
fc66f95c
ED
1352 entries = dst_entries_get_slow(ops);
1353 if (entries < ops->gc_thresh)
7019b78e 1354 net->ipv6.ip6_rt_gc_expire = rt_gc_timeout>>1;
1da177e4 1355out:
7019b78e 1356 net->ipv6.ip6_rt_gc_expire -= net->ipv6.ip6_rt_gc_expire>>rt_elasticity;
fc66f95c 1357 return entries > rt_max_size;
1da177e4
LT
1358}
1359
6b75d090 1360int ip6_dst_hoplimit(struct dst_entry *dst)
1da177e4 1361{
5170ae82 1362 int hoplimit = dst_metric_raw(dst, RTAX_HOPLIMIT);
a02e4b7d 1363 if (hoplimit == 0) {
6b75d090 1364 struct net_device *dev = dst->dev;
c68f24cc
ED
1365 struct inet6_dev *idev;
1366
1367 rcu_read_lock();
1368 idev = __in6_dev_get(dev);
1369 if (idev)
6b75d090 1370 hoplimit = idev->cnf.hop_limit;
c68f24cc 1371 else
53b7997f 1372 hoplimit = dev_net(dev)->ipv6.devconf_all->hop_limit;
c68f24cc 1373 rcu_read_unlock();
1da177e4
LT
1374 }
1375 return hoplimit;
1376}
abbf46ae 1377EXPORT_SYMBOL(ip6_dst_hoplimit);
1da177e4
LT
1378
1379/*
1380 *
1381 */
1382
86872cb5 1383int ip6_route_add(struct fib6_config *cfg)
1da177e4
LT
1384{
1385 int err;
5578689a 1386 struct net *net = cfg->fc_nlinfo.nl_net;
1da177e4
LT
1387 struct rt6_info *rt = NULL;
1388 struct net_device *dev = NULL;
1389 struct inet6_dev *idev = NULL;
c71099ac 1390 struct fib6_table *table;
1da177e4
LT
1391 int addr_type;
1392
86872cb5 1393 if (cfg->fc_dst_len > 128 || cfg->fc_src_len > 128)
1da177e4
LT
1394 return -EINVAL;
1395#ifndef CONFIG_IPV6_SUBTREES
86872cb5 1396 if (cfg->fc_src_len)
1da177e4
LT
1397 return -EINVAL;
1398#endif
86872cb5 1399 if (cfg->fc_ifindex) {
1da177e4 1400 err = -ENODEV;
5578689a 1401 dev = dev_get_by_index(net, cfg->fc_ifindex);
1da177e4
LT
1402 if (!dev)
1403 goto out;
1404 idev = in6_dev_get(dev);
1405 if (!idev)
1406 goto out;
1407 }
1408
86872cb5
TG
1409 if (cfg->fc_metric == 0)
1410 cfg->fc_metric = IP6_RT_PRIO_USER;
1da177e4 1411
d71314b4 1412 err = -ENOBUFS;
38308473
DM
1413 if (cfg->fc_nlinfo.nlh &&
1414 !(cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_CREATE)) {
d71314b4 1415 table = fib6_get_table(net, cfg->fc_table);
38308473 1416 if (!table) {
f3213831 1417 pr_warn("NLM_F_CREATE should be specified when creating new route\n");
d71314b4
MV
1418 table = fib6_new_table(net, cfg->fc_table);
1419 }
1420 } else {
1421 table = fib6_new_table(net, cfg->fc_table);
1422 }
38308473
DM
1423
1424 if (!table)
c71099ac 1425 goto out;
c71099ac 1426
8f41e6a8 1427 rt = ip6_dst_alloc(net, NULL, (cfg->fc_flags & RTF_ADDRCONF) ? 0 : DST_NOCOUNT, table);
1da177e4 1428
38308473 1429 if (!rt) {
1da177e4
LT
1430 err = -ENOMEM;
1431 goto out;
1432 }
1433
1716a961
G
1434 if (cfg->fc_flags & RTF_EXPIRES)
1435 rt6_set_expires(rt, jiffies +
1436 clock_t_to_jiffies(cfg->fc_expires));
1437 else
1438 rt6_clean_expires(rt);
1da177e4 1439
86872cb5
TG
1440 if (cfg->fc_protocol == RTPROT_UNSPEC)
1441 cfg->fc_protocol = RTPROT_BOOT;
1442 rt->rt6i_protocol = cfg->fc_protocol;
1443
1444 addr_type = ipv6_addr_type(&cfg->fc_dst);
1da177e4
LT
1445
1446 if (addr_type & IPV6_ADDR_MULTICAST)
d8d1f30b 1447 rt->dst.input = ip6_mc_input;
ab79ad14
1448 else if (cfg->fc_flags & RTF_LOCAL)
1449 rt->dst.input = ip6_input;
1da177e4 1450 else
d8d1f30b 1451 rt->dst.input = ip6_forward;
1da177e4 1452
d8d1f30b 1453 rt->dst.output = ip6_output;
1da177e4 1454
86872cb5
TG
1455 ipv6_addr_prefix(&rt->rt6i_dst.addr, &cfg->fc_dst, cfg->fc_dst_len);
1456 rt->rt6i_dst.plen = cfg->fc_dst_len;
1da177e4 1457 if (rt->rt6i_dst.plen == 128)
11d53b49 1458 rt->dst.flags |= DST_HOST;
1da177e4 1459
8e2ec639
YZ
1460 if (!(rt->dst.flags & DST_HOST) && cfg->fc_mx) {
1461 u32 *metrics = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL);
1462 if (!metrics) {
1463 err = -ENOMEM;
1464 goto out;
1465 }
1466 dst_init_metrics(&rt->dst, metrics, 0);
1467 }
1da177e4 1468#ifdef CONFIG_IPV6_SUBTREES
86872cb5
TG
1469 ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len);
1470 rt->rt6i_src.plen = cfg->fc_src_len;
1da177e4
LT
1471#endif
1472
86872cb5 1473 rt->rt6i_metric = cfg->fc_metric;
1da177e4
LT
1474
1475 /* We cannot add true routes via loopback here,
1476 they would result in kernel looping; promote them to reject routes
1477 */
86872cb5 1478 if ((cfg->fc_flags & RTF_REJECT) ||
38308473
DM
1479 (dev && (dev->flags & IFF_LOOPBACK) &&
1480 !(addr_type & IPV6_ADDR_LOOPBACK) &&
1481 !(cfg->fc_flags & RTF_LOCAL))) {
1da177e4 1482 /* hold loopback dev/idev if we haven't done so. */
5578689a 1483 if (dev != net->loopback_dev) {
1da177e4
LT
1484 if (dev) {
1485 dev_put(dev);
1486 in6_dev_put(idev);
1487 }
5578689a 1488 dev = net->loopback_dev;
1da177e4
LT
1489 dev_hold(dev);
1490 idev = in6_dev_get(dev);
1491 if (!idev) {
1492 err = -ENODEV;
1493 goto out;
1494 }
1495 }
1da177e4 1496 rt->rt6i_flags = RTF_REJECT|RTF_NONEXTHOP;
ef2c7d7b
ND
1497 switch (cfg->fc_type) {
1498 case RTN_BLACKHOLE:
1499 rt->dst.error = -EINVAL;
5af58eb0
K
1500 rt->dst.output = dst_discard;
1501 rt->dst.input = dst_discard;
ef2c7d7b
ND
1502 break;
1503 case RTN_PROHIBIT:
1504 rt->dst.error = -EACCES;
5af58eb0
K
1505 rt->dst.output = ip6_pkt_prohibit_out;
1506 rt->dst.input = ip6_pkt_prohibit;
ef2c7d7b 1507 break;
b4949ab2 1508 case RTN_THROW:
ef2c7d7b 1509 default:
5af58eb0
K
1510 rt->dst.error = (cfg->fc_type == RTN_THROW) ? -EAGAIN
1511 : -ENETUNREACH;
1512 rt->dst.output = ip6_pkt_discard_out;
1513 rt->dst.input = ip6_pkt_discard;
ef2c7d7b
ND
1514 break;
1515 }
1da177e4
LT
1516 goto install_route;
1517 }
1518
86872cb5 1519 if (cfg->fc_flags & RTF_GATEWAY) {
b71d1d42 1520 const struct in6_addr *gw_addr;
1da177e4
LT
1521 int gwa_type;
1522
86872cb5 1523 gw_addr = &cfg->fc_gateway;
4e3fd7a0 1524 rt->rt6i_gateway = *gw_addr;
1da177e4
LT
1525 gwa_type = ipv6_addr_type(gw_addr);
1526
1527 if (gwa_type != (IPV6_ADDR_LINKLOCAL|IPV6_ADDR_UNICAST)) {
1528 struct rt6_info *grt;
1529
1530 /* IPv6 strictly inhibits using not link-local
1531 addresses as nexthop address.
1532 Otherwise, router will not able to send redirects.
1533 It is very good, but in some (rare!) circumstances
1534 (SIT, PtP, NBMA NOARP links) it is handy to allow
1535 some exceptions. --ANK
1536 */
1537 err = -EINVAL;
38308473 1538 if (!(gwa_type & IPV6_ADDR_UNICAST))
1da177e4
LT
1539 goto out;
1540
5578689a 1541 grt = rt6_lookup(net, gw_addr, NULL, cfg->fc_ifindex, 1);
1da177e4
LT
1542
1543 err = -EHOSTUNREACH;
38308473 1544 if (!grt)
1da177e4
LT
1545 goto out;
1546 if (dev) {
d1918542 1547 if (dev != grt->dst.dev) {
94e187c0 1548 ip6_rt_put(grt);
1da177e4
LT
1549 goto out;
1550 }
1551 } else {
d1918542 1552 dev = grt->dst.dev;
1da177e4
LT
1553 idev = grt->rt6i_idev;
1554 dev_hold(dev);
1555 in6_dev_hold(grt->rt6i_idev);
1556 }
38308473 1557 if (!(grt->rt6i_flags & RTF_GATEWAY))
1da177e4 1558 err = 0;
94e187c0 1559 ip6_rt_put(grt);
1da177e4
LT
1560
1561 if (err)
1562 goto out;
1563 }
1564 err = -EINVAL;
38308473 1565 if (!dev || (dev->flags & IFF_LOOPBACK))
1da177e4
LT
1566 goto out;
1567 }
1568
1569 err = -ENODEV;
38308473 1570 if (!dev)
1da177e4
LT
1571 goto out;
1572
c3968a85
DW
1573 if (!ipv6_addr_any(&cfg->fc_prefsrc)) {
1574 if (!ipv6_chk_addr(net, &cfg->fc_prefsrc, dev, 0)) {
1575 err = -EINVAL;
1576 goto out;
1577 }
4e3fd7a0 1578 rt->rt6i_prefsrc.addr = cfg->fc_prefsrc;
c3968a85
DW
1579 rt->rt6i_prefsrc.plen = 128;
1580 } else
1581 rt->rt6i_prefsrc.plen = 0;
1582
86872cb5 1583 rt->rt6i_flags = cfg->fc_flags;
1da177e4
LT
1584
1585install_route:
86872cb5
TG
1586 if (cfg->fc_mx) {
1587 struct nlattr *nla;
1588 int remaining;
1589
1590 nla_for_each_attr(nla, cfg->fc_mx, cfg->fc_mx_len, remaining) {
8f4c1f9b 1591 int type = nla_type(nla);
86872cb5
TG
1592
1593 if (type) {
1594 if (type > RTAX_MAX) {
1da177e4
LT
1595 err = -EINVAL;
1596 goto out;
1597 }
86872cb5 1598
defb3519 1599 dst_metric_set(&rt->dst, type, nla_get_u32(nla));
1da177e4 1600 }
1da177e4
LT
1601 }
1602 }
1603
d8d1f30b 1604 rt->dst.dev = dev;
1da177e4 1605 rt->rt6i_idev = idev;
c71099ac 1606 rt->rt6i_table = table;
63152fc0 1607
c346dca1 1608 cfg->fc_nlinfo.nl_net = dev_net(dev);
63152fc0 1609
86872cb5 1610 return __ip6_ins_rt(rt, &cfg->fc_nlinfo);
1da177e4
LT
1611
1612out:
1613 if (dev)
1614 dev_put(dev);
1615 if (idev)
1616 in6_dev_put(idev);
1617 if (rt)
d8d1f30b 1618 dst_free(&rt->dst);
1da177e4
LT
1619 return err;
1620}
1621
86872cb5 1622static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info)
1da177e4
LT
1623{
1624 int err;
c71099ac 1625 struct fib6_table *table;
d1918542 1626 struct net *net = dev_net(rt->dst.dev);
1da177e4 1627
6825a26c
G
1628 if (rt == net->ipv6.ip6_null_entry) {
1629 err = -ENOENT;
1630 goto out;
1631 }
6c813a72 1632
c71099ac
TG
1633 table = rt->rt6i_table;
1634 write_lock_bh(&table->tb6_lock);
86872cb5 1635 err = fib6_del(rt, info);
c71099ac 1636 write_unlock_bh(&table->tb6_lock);
1da177e4 1637
6825a26c 1638out:
94e187c0 1639 ip6_rt_put(rt);
1da177e4
LT
1640 return err;
1641}
1642
e0a1ad73
TG
1643int ip6_del_rt(struct rt6_info *rt)
1644{
4d1169c1 1645 struct nl_info info = {
d1918542 1646 .nl_net = dev_net(rt->dst.dev),
4d1169c1 1647 };
528c4ceb 1648 return __ip6_del_rt(rt, &info);
e0a1ad73
TG
1649}
1650
86872cb5 1651static int ip6_route_del(struct fib6_config *cfg)
1da177e4 1652{
c71099ac 1653 struct fib6_table *table;
1da177e4
LT
1654 struct fib6_node *fn;
1655 struct rt6_info *rt;
1656 int err = -ESRCH;
1657
5578689a 1658 table = fib6_get_table(cfg->fc_nlinfo.nl_net, cfg->fc_table);
38308473 1659 if (!table)
c71099ac
TG
1660 return err;
1661
1662 read_lock_bh(&table->tb6_lock);
1da177e4 1663
c71099ac 1664 fn = fib6_locate(&table->tb6_root,
86872cb5
TG
1665 &cfg->fc_dst, cfg->fc_dst_len,
1666 &cfg->fc_src, cfg->fc_src_len);
1ab1457c 1667
1da177e4 1668 if (fn) {
d8d1f30b 1669 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
86872cb5 1670 if (cfg->fc_ifindex &&
d1918542
DM
1671 (!rt->dst.dev ||
1672 rt->dst.dev->ifindex != cfg->fc_ifindex))
1da177e4 1673 continue;
86872cb5
TG
1674 if (cfg->fc_flags & RTF_GATEWAY &&
1675 !ipv6_addr_equal(&cfg->fc_gateway, &rt->rt6i_gateway))
1da177e4 1676 continue;
86872cb5 1677 if (cfg->fc_metric && cfg->fc_metric != rt->rt6i_metric)
1da177e4 1678 continue;
d8d1f30b 1679 dst_hold(&rt->dst);
c71099ac 1680 read_unlock_bh(&table->tb6_lock);
1da177e4 1681
86872cb5 1682 return __ip6_del_rt(rt, &cfg->fc_nlinfo);
1da177e4
LT
1683 }
1684 }
c71099ac 1685 read_unlock_bh(&table->tb6_lock);
1da177e4
LT
1686
1687 return err;
1688}
1689
6700c270 1690static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb)
a6279458 1691{
e8599ff4 1692 struct net *net = dev_net(skb->dev);
a6279458 1693 struct netevent_redirect netevent;
e8599ff4 1694 struct rt6_info *rt, *nrt = NULL;
e8599ff4
DM
1695 struct ndisc_options ndopts;
1696 struct inet6_dev *in6_dev;
1697 struct neighbour *neigh;
71bcdba0 1698 struct rd_msg *msg;
6e157b6a
DM
1699 int optlen, on_link;
1700 u8 *lladdr;
e8599ff4
DM
1701
1702 optlen = skb->tail - skb->transport_header;
71bcdba0 1703 optlen -= sizeof(*msg);
e8599ff4
DM
1704
1705 if (optlen < 0) {
6e157b6a 1706 net_dbg_ratelimited("rt6_do_redirect: packet too short\n");
e8599ff4
DM
1707 return;
1708 }
1709
71bcdba0 1710 msg = (struct rd_msg *)icmp6_hdr(skb);
e8599ff4 1711
71bcdba0 1712 if (ipv6_addr_is_multicast(&msg->dest)) {
6e157b6a 1713 net_dbg_ratelimited("rt6_do_redirect: destination address is multicast\n");
e8599ff4
DM
1714 return;
1715 }
1716
6e157b6a 1717 on_link = 0;
71bcdba0 1718 if (ipv6_addr_equal(&msg->dest, &msg->target)) {
e8599ff4 1719 on_link = 1;
71bcdba0 1720 } else if (ipv6_addr_type(&msg->target) !=
e8599ff4 1721 (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
6e157b6a 1722 net_dbg_ratelimited("rt6_do_redirect: target address is not link-local unicast\n");
e8599ff4
DM
1723 return;
1724 }
1725
1726 in6_dev = __in6_dev_get(skb->dev);
1727 if (!in6_dev)
1728 return;
1729 if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_redirects)
1730 return;
1731
1732 /* RFC2461 8.1:
1733 * The IP source address of the Redirect MUST be the same as the current
1734 * first-hop router for the specified ICMP Destination Address.
1735 */
1736
71bcdba0 1737 if (!ndisc_parse_options(msg->opt, optlen, &ndopts)) {
e8599ff4
DM
1738 net_dbg_ratelimited("rt6_redirect: invalid ND options\n");
1739 return;
1740 }
6e157b6a
DM
1741
1742 lladdr = NULL;
e8599ff4
DM
1743 if (ndopts.nd_opts_tgt_lladdr) {
1744 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr,
1745 skb->dev);
1746 if (!lladdr) {
1747 net_dbg_ratelimited("rt6_redirect: invalid link-layer address length\n");
1748 return;
1749 }
1750 }
1751
6e157b6a
DM
1752 rt = (struct rt6_info *) dst;
1753 if (rt == net->ipv6.ip6_null_entry) {
1754 net_dbg_ratelimited("rt6_redirect: source isn't a valid nexthop for redirect target\n");
e8599ff4 1755 return;
6e157b6a 1756 }
e8599ff4 1757
6e157b6a
DM
1758 /* Redirect received -> path was valid.
1759 * Look, redirects are sent only in response to data packets,
1760 * so that this nexthop apparently is reachable. --ANK
1761 */
1762 dst_confirm(&rt->dst);
a6279458 1763
71bcdba0 1764 neigh = __neigh_lookup(&nd_tbl, &msg->target, skb->dev, 1);
6e157b6a
DM
1765 if (!neigh)
1766 return;
a6279458 1767
1da177e4
LT
1768 /*
1769 * We have finally decided to accept it.
1770 */
1771
1ab1457c 1772 neigh_update(neigh, lladdr, NUD_STALE,
1da177e4
LT
1773 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1774 NEIGH_UPDATE_F_OVERRIDE|
1775 (on_link ? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1776 NEIGH_UPDATE_F_ISROUTER))
1777 );
1778
71bcdba0 1779 nrt = ip6_rt_copy(rt, &msg->dest);
38308473 1780 if (!nrt)
1da177e4
LT
1781 goto out;
1782
1783 nrt->rt6i_flags = RTF_GATEWAY|RTF_UP|RTF_DYNAMIC|RTF_CACHE;
1784 if (on_link)
1785 nrt->rt6i_flags &= ~RTF_GATEWAY;
1786
4e3fd7a0 1787 nrt->rt6i_gateway = *(struct in6_addr *)neigh->primary_key;
1da177e4 1788
40e22e8f 1789 if (ip6_ins_rt(nrt))
1da177e4
LT
1790 goto out;
1791
d8d1f30b
CG
1792 netevent.old = &rt->dst;
1793 netevent.new = &nrt->dst;
71bcdba0 1794 netevent.daddr = &msg->dest;
60592833 1795 netevent.neigh = neigh;
8d71740c
TT
1796 call_netevent_notifiers(NETEVENT_REDIRECT, &netevent);
1797
38308473 1798 if (rt->rt6i_flags & RTF_CACHE) {
6e157b6a 1799 rt = (struct rt6_info *) dst_clone(&rt->dst);
e0a1ad73 1800 ip6_del_rt(rt);
1da177e4
LT
1801 }
1802
1803out:
e8599ff4 1804 neigh_release(neigh);
6e157b6a
DM
1805}
1806
1da177e4
LT
1807/*
1808 * Misc support functions
1809 */
1810
1716a961 1811static struct rt6_info *ip6_rt_copy(struct rt6_info *ort,
21efcfa0 1812 const struct in6_addr *dest)
1da177e4 1813{
d1918542 1814 struct net *net = dev_net(ort->dst.dev);
8b96d22d
DM
1815 struct rt6_info *rt = ip6_dst_alloc(net, ort->dst.dev, 0,
1816 ort->rt6i_table);
1da177e4
LT
1817
1818 if (rt) {
d8d1f30b
CG
1819 rt->dst.input = ort->dst.input;
1820 rt->dst.output = ort->dst.output;
8e2ec639 1821 rt->dst.flags |= DST_HOST;
d8d1f30b 1822
4e3fd7a0 1823 rt->rt6i_dst.addr = *dest;
8e2ec639 1824 rt->rt6i_dst.plen = 128;
defb3519 1825 dst_copy_metrics(&rt->dst, &ort->dst);
d8d1f30b 1826 rt->dst.error = ort->dst.error;
1da177e4
LT
1827 rt->rt6i_idev = ort->rt6i_idev;
1828 if (rt->rt6i_idev)
1829 in6_dev_hold(rt->rt6i_idev);
d8d1f30b 1830 rt->dst.lastuse = jiffies;
1da177e4 1831
044d6efb
JA
1832 if (ort->rt6i_flags & RTF_GATEWAY)
1833 rt->rt6i_gateway = ort->rt6i_gateway;
1834 else
1835 rt->rt6i_gateway = *dest;
1716a961 1836 rt->rt6i_flags = ort->rt6i_flags;
717e66b3 1837 rt6_set_from(rt, ort);
1da177e4
LT
1838 rt->rt6i_metric = 0;
1839
1da177e4
LT
1840#ifdef CONFIG_IPV6_SUBTREES
1841 memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key));
1842#endif
0f6c6392 1843 memcpy(&rt->rt6i_prefsrc, &ort->rt6i_prefsrc, sizeof(struct rt6key));
c71099ac 1844 rt->rt6i_table = ort->rt6i_table;
1da177e4
LT
1845 }
1846 return rt;
1847}
1848
70ceb4f5 1849#ifdef CONFIG_IPV6_ROUTE_INFO
efa2cea0 1850static struct rt6_info *rt6_get_route_info(struct net *net,
b71d1d42
ED
1851 const struct in6_addr *prefix, int prefixlen,
1852 const struct in6_addr *gwaddr, int ifindex)
70ceb4f5
YH
1853{
1854 struct fib6_node *fn;
1855 struct rt6_info *rt = NULL;
c71099ac
TG
1856 struct fib6_table *table;
1857
efa2cea0 1858 table = fib6_get_table(net, RT6_TABLE_INFO);
38308473 1859 if (!table)
c71099ac 1860 return NULL;
70ceb4f5 1861
5744dd9b 1862 read_lock_bh(&table->tb6_lock);
c71099ac 1863 fn = fib6_locate(&table->tb6_root, prefix ,prefixlen, NULL, 0);
70ceb4f5
YH
1864 if (!fn)
1865 goto out;
1866
d8d1f30b 1867 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
d1918542 1868 if (rt->dst.dev->ifindex != ifindex)
70ceb4f5
YH
1869 continue;
1870 if ((rt->rt6i_flags & (RTF_ROUTEINFO|RTF_GATEWAY)) != (RTF_ROUTEINFO|RTF_GATEWAY))
1871 continue;
1872 if (!ipv6_addr_equal(&rt->rt6i_gateway, gwaddr))
1873 continue;
d8d1f30b 1874 dst_hold(&rt->dst);
70ceb4f5
YH
1875 break;
1876 }
1877out:
5744dd9b 1878 read_unlock_bh(&table->tb6_lock);
70ceb4f5
YH
1879 return rt;
1880}
1881
efa2cea0 1882static struct rt6_info *rt6_add_route_info(struct net *net,
b71d1d42
ED
1883 const struct in6_addr *prefix, int prefixlen,
1884 const struct in6_addr *gwaddr, int ifindex,
95c96174 1885 unsigned int pref)
70ceb4f5 1886{
86872cb5
TG
1887 struct fib6_config cfg = {
1888 .fc_table = RT6_TABLE_INFO,
238fc7ea 1889 .fc_metric = IP6_RT_PRIO_USER,
86872cb5
TG
1890 .fc_ifindex = ifindex,
1891 .fc_dst_len = prefixlen,
1892 .fc_flags = RTF_GATEWAY | RTF_ADDRCONF | RTF_ROUTEINFO |
1893 RTF_UP | RTF_PREF(pref),
15e47304 1894 .fc_nlinfo.portid = 0,
efa2cea0
DL
1895 .fc_nlinfo.nlh = NULL,
1896 .fc_nlinfo.nl_net = net,
86872cb5
TG
1897 };
1898
4e3fd7a0
AD
1899 cfg.fc_dst = *prefix;
1900 cfg.fc_gateway = *gwaddr;
70ceb4f5 1901
e317da96
YH
1902 /* We should treat it as a default route if prefix length is 0. */
1903 if (!prefixlen)
86872cb5 1904 cfg.fc_flags |= RTF_DEFAULT;
70ceb4f5 1905
86872cb5 1906 ip6_route_add(&cfg);
70ceb4f5 1907
efa2cea0 1908 return rt6_get_route_info(net, prefix, prefixlen, gwaddr, ifindex);
70ceb4f5
YH
1909}
1910#endif
1911
b71d1d42 1912struct rt6_info *rt6_get_dflt_router(const struct in6_addr *addr, struct net_device *dev)
1ab1457c 1913{
1da177e4 1914 struct rt6_info *rt;
c71099ac 1915 struct fib6_table *table;
1da177e4 1916
c346dca1 1917 table = fib6_get_table(dev_net(dev), RT6_TABLE_DFLT);
38308473 1918 if (!table)
c71099ac 1919 return NULL;
1da177e4 1920
5744dd9b 1921 read_lock_bh(&table->tb6_lock);
d8d1f30b 1922 for (rt = table->tb6_root.leaf; rt; rt=rt->dst.rt6_next) {
d1918542 1923 if (dev == rt->dst.dev &&
045927ff 1924 ((rt->rt6i_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) &&
1da177e4
LT
1925 ipv6_addr_equal(&rt->rt6i_gateway, addr))
1926 break;
1927 }
1928 if (rt)
d8d1f30b 1929 dst_hold(&rt->dst);
5744dd9b 1930 read_unlock_bh(&table->tb6_lock);
1da177e4
LT
1931 return rt;
1932}
1933
b71d1d42 1934struct rt6_info *rt6_add_dflt_router(const struct in6_addr *gwaddr,
ebacaaa0
YH
1935 struct net_device *dev,
1936 unsigned int pref)
1da177e4 1937{
86872cb5
TG
1938 struct fib6_config cfg = {
1939 .fc_table = RT6_TABLE_DFLT,
238fc7ea 1940 .fc_metric = IP6_RT_PRIO_USER,
86872cb5
TG
1941 .fc_ifindex = dev->ifindex,
1942 .fc_flags = RTF_GATEWAY | RTF_ADDRCONF | RTF_DEFAULT |
1943 RTF_UP | RTF_EXPIRES | RTF_PREF(pref),
15e47304 1944 .fc_nlinfo.portid = 0,
5578689a 1945 .fc_nlinfo.nlh = NULL,
c346dca1 1946 .fc_nlinfo.nl_net = dev_net(dev),
86872cb5 1947 };
1da177e4 1948
4e3fd7a0 1949 cfg.fc_gateway = *gwaddr;
1da177e4 1950
86872cb5 1951 ip6_route_add(&cfg);
1da177e4 1952
1da177e4
LT
1953 return rt6_get_dflt_router(gwaddr, dev);
1954}
1955
7b4da532 1956void rt6_purge_dflt_routers(struct net *net)
1da177e4
LT
1957{
1958 struct rt6_info *rt;
c71099ac
TG
1959 struct fib6_table *table;
1960
1961 /* NOTE: Keep consistent with rt6_get_dflt_router */
7b4da532 1962 table = fib6_get_table(net, RT6_TABLE_DFLT);
38308473 1963 if (!table)
c71099ac 1964 return;
1da177e4
LT
1965
1966restart:
c71099ac 1967 read_lock_bh(&table->tb6_lock);
d8d1f30b 1968 for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) {
3e8b0ac3
LC
1969 if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF) &&
1970 (!rt->rt6i_idev || rt->rt6i_idev->cnf.accept_ra != 2)) {
d8d1f30b 1971 dst_hold(&rt->dst);
c71099ac 1972 read_unlock_bh(&table->tb6_lock);
e0a1ad73 1973 ip6_del_rt(rt);
1da177e4
LT
1974 goto restart;
1975 }
1976 }
c71099ac 1977 read_unlock_bh(&table->tb6_lock);
1da177e4
LT
1978}
1979
5578689a
DL
1980static void rtmsg_to_fib6_config(struct net *net,
1981 struct in6_rtmsg *rtmsg,
86872cb5
TG
1982 struct fib6_config *cfg)
1983{
1984 memset(cfg, 0, sizeof(*cfg));
1985
1986 cfg->fc_table = RT6_TABLE_MAIN;
1987 cfg->fc_ifindex = rtmsg->rtmsg_ifindex;
1988 cfg->fc_metric = rtmsg->rtmsg_metric;
1989 cfg->fc_expires = rtmsg->rtmsg_info;
1990 cfg->fc_dst_len = rtmsg->rtmsg_dst_len;
1991 cfg->fc_src_len = rtmsg->rtmsg_src_len;
1992 cfg->fc_flags = rtmsg->rtmsg_flags;
1993
5578689a 1994 cfg->fc_nlinfo.nl_net = net;
f1243c2d 1995
4e3fd7a0
AD
1996 cfg->fc_dst = rtmsg->rtmsg_dst;
1997 cfg->fc_src = rtmsg->rtmsg_src;
1998 cfg->fc_gateway = rtmsg->rtmsg_gateway;
86872cb5
TG
1999}
2000
5578689a 2001int ipv6_route_ioctl(struct net *net, unsigned int cmd, void __user *arg)
1da177e4 2002{
86872cb5 2003 struct fib6_config cfg;
1da177e4
LT
2004 struct in6_rtmsg rtmsg;
2005 int err;
2006
2007 switch(cmd) {
2008 case SIOCADDRT: /* Add a route */
2009 case SIOCDELRT: /* Delete a route */
af31f412 2010 if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
1da177e4
LT
2011 return -EPERM;
2012 err = copy_from_user(&rtmsg, arg,
2013 sizeof(struct in6_rtmsg));
2014 if (err)
2015 return -EFAULT;
86872cb5 2016
5578689a 2017 rtmsg_to_fib6_config(net, &rtmsg, &cfg);
86872cb5 2018
1da177e4
LT
2019 rtnl_lock();
2020 switch (cmd) {
2021 case SIOCADDRT:
86872cb5 2022 err = ip6_route_add(&cfg);
1da177e4
LT
2023 break;
2024 case SIOCDELRT:
86872cb5 2025 err = ip6_route_del(&cfg);
1da177e4
LT
2026 break;
2027 default:
2028 err = -EINVAL;
2029 }
2030 rtnl_unlock();
2031
2032 return err;
3ff50b79 2033 }
1da177e4
LT
2034
2035 return -EINVAL;
2036}
2037
2038/*
2039 * Drop the packet on the floor
2040 */
2041
d5fdd6ba 2042static int ip6_pkt_drop(struct sk_buff *skb, u8 code, int ipstats_mib_noroutes)
1da177e4 2043{
612f09e8 2044 int type;
adf30907 2045 struct dst_entry *dst = skb_dst(skb);
612f09e8
YH
2046 switch (ipstats_mib_noroutes) {
2047 case IPSTATS_MIB_INNOROUTES:
0660e03f 2048 type = ipv6_addr_type(&ipv6_hdr(skb)->daddr);
45bb0060 2049 if (type == IPV6_ADDR_ANY) {
3bd653c8
DL
2050 IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst),
2051 IPSTATS_MIB_INADDRERRORS);
612f09e8
YH
2052 break;
2053 }
2054 /* FALLTHROUGH */
2055 case IPSTATS_MIB_OUTNOROUTES:
3bd653c8
DL
2056 IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst),
2057 ipstats_mib_noroutes);
612f09e8
YH
2058 break;
2059 }
3ffe533c 2060 icmpv6_send(skb, ICMPV6_DEST_UNREACH, code, 0);
1da177e4
LT
2061 kfree_skb(skb);
2062 return 0;
2063}
2064
9ce8ade0
TG
2065static int ip6_pkt_discard(struct sk_buff *skb)
2066{
612f09e8 2067 return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_INNOROUTES);
9ce8ade0
TG
2068}
2069
20380731 2070static int ip6_pkt_discard_out(struct sk_buff *skb)
1da177e4 2071{
adf30907 2072 skb->dev = skb_dst(skb)->dev;
612f09e8 2073 return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES);
1da177e4
LT
2074}
2075
9ce8ade0
TG
2076static int ip6_pkt_prohibit(struct sk_buff *skb)
2077{
612f09e8 2078 return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_INNOROUTES);
9ce8ade0
TG
2079}
2080
2081static int ip6_pkt_prohibit_out(struct sk_buff *skb)
2082{
adf30907 2083 skb->dev = skb_dst(skb)->dev;
612f09e8 2084 return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
9ce8ade0
TG
2085}
2086
1da177e4
LT
2087/*
2088 * Allocate a dst for local (unicast / anycast) address.
2089 */
2090
2091struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
2092 const struct in6_addr *addr,
8f031519 2093 bool anycast)
1da177e4 2094{
c346dca1 2095 struct net *net = dev_net(idev->dev);
e28c2d64
HFS
2096 struct rt6_info *rt = ip6_dst_alloc(net, net->loopback_dev,
2097 DST_NOCOUNT, NULL);
2098 if (!rt)
1da177e4
LT
2099 return ERR_PTR(-ENOMEM);
2100
1da177e4
LT
2101 in6_dev_hold(idev);
2102
11d53b49 2103 rt->dst.flags |= DST_HOST;
d8d1f30b
CG
2104 rt->dst.input = ip6_input;
2105 rt->dst.output = ip6_output;
1da177e4 2106 rt->rt6i_idev = idev;
1da177e4
LT
2107
2108 rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP;
58c4fb86
YH
2109 if (anycast)
2110 rt->rt6i_flags |= RTF_ANYCAST;
2111 else
1da177e4 2112 rt->rt6i_flags |= RTF_LOCAL;
1da177e4 2113
044d6efb 2114 rt->rt6i_gateway = *addr;
4e3fd7a0 2115 rt->rt6i_dst.addr = *addr;
1da177e4 2116 rt->rt6i_dst.plen = 128;
5578689a 2117 rt->rt6i_table = fib6_get_table(net, RT6_TABLE_LOCAL);
1da177e4 2118
d8d1f30b 2119 atomic_set(&rt->dst.__refcnt, 1);
1da177e4
LT
2120
2121 return rt;
2122}
2123
c3968a85
DW
2124int ip6_route_get_saddr(struct net *net,
2125 struct rt6_info *rt,
b71d1d42 2126 const struct in6_addr *daddr,
c3968a85
DW
2127 unsigned int prefs,
2128 struct in6_addr *saddr)
2129{
2130 struct inet6_dev *idev = ip6_dst_idev((struct dst_entry*)rt);
2131 int err = 0;
2132 if (rt->rt6i_prefsrc.plen)
4e3fd7a0 2133 *saddr = rt->rt6i_prefsrc.addr;
c3968a85
DW
2134 else
2135 err = ipv6_dev_get_saddr(net, idev ? idev->dev : NULL,
2136 daddr, prefs, saddr);
2137 return err;
2138}
2139
2140/* remove deleted ip from prefsrc entries */
2141struct arg_dev_net_ip {
2142 struct net_device *dev;
2143 struct net *net;
2144 struct in6_addr *addr;
2145};
2146
2147static int fib6_remove_prefsrc(struct rt6_info *rt, void *arg)
2148{
2149 struct net_device *dev = ((struct arg_dev_net_ip *)arg)->dev;
2150 struct net *net = ((struct arg_dev_net_ip *)arg)->net;
2151 struct in6_addr *addr = ((struct arg_dev_net_ip *)arg)->addr;
2152
d1918542 2153 if (((void *)rt->dst.dev == dev || !dev) &&
c3968a85
DW
2154 rt != net->ipv6.ip6_null_entry &&
2155 ipv6_addr_equal(addr, &rt->rt6i_prefsrc.addr)) {
2156 /* remove prefsrc entry */
2157 rt->rt6i_prefsrc.plen = 0;
2158 }
2159 return 0;
2160}
2161
2162void rt6_remove_prefsrc(struct inet6_ifaddr *ifp)
2163{
2164 struct net *net = dev_net(ifp->idev->dev);
2165 struct arg_dev_net_ip adni = {
2166 .dev = ifp->idev->dev,
2167 .net = net,
2168 .addr = &ifp->addr,
2169 };
2170 fib6_clean_all(net, fib6_remove_prefsrc, 0, &adni);
2171}
2172
8ed67789
DL
2173struct arg_dev_net {
2174 struct net_device *dev;
2175 struct net *net;
2176};
2177
1da177e4
LT
2178static int fib6_ifdown(struct rt6_info *rt, void *arg)
2179{
bc3ef660 2180 const struct arg_dev_net *adn = arg;
2181 const struct net_device *dev = adn->dev;
8ed67789 2182
d1918542 2183 if ((rt->dst.dev == dev || !dev) &&
c159d30c 2184 rt != adn->net->ipv6.ip6_null_entry)
1da177e4 2185 return -1;
c159d30c 2186
1da177e4
LT
2187 return 0;
2188}
2189
f3db4851 2190void rt6_ifdown(struct net *net, struct net_device *dev)
1da177e4 2191{
8ed67789
DL
2192 struct arg_dev_net adn = {
2193 .dev = dev,
2194 .net = net,
2195 };
2196
2197 fib6_clean_all(net, fib6_ifdown, 0, &adn);
1e493d19 2198 icmp6_clean_all(fib6_ifdown, &adn);
1da177e4
LT
2199}
2200
95c96174 2201struct rt6_mtu_change_arg {
1da177e4 2202 struct net_device *dev;
95c96174 2203 unsigned int mtu;
1da177e4
LT
2204};
2205
2206static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg)
2207{
2208 struct rt6_mtu_change_arg *arg = (struct rt6_mtu_change_arg *) p_arg;
2209 struct inet6_dev *idev;
2210
2211 /* In IPv6 pmtu discovery is not optional,
2212 so that RTAX_MTU lock cannot disable it.
2213 We still use this lock to block changes
2214 caused by addrconf/ndisc.
2215 */
2216
2217 idev = __in6_dev_get(arg->dev);
38308473 2218 if (!idev)
1da177e4
LT
2219 return 0;
2220
2221 /* For administrative MTU increase, there is no way to discover
2222 IPv6 PMTU increase, so PMTU increase should be updated here.
2223 Since RFC 1981 doesn't include administrative MTU increase
2224 update PMTU increase is a MUST. (i.e. jumbo frame)
2225 */
2226 /*
2227 If new MTU is less than route PMTU, this new MTU will be the
2228 lowest MTU in the path, update the route PMTU to reflect PMTU
2229 decreases; if new MTU is greater than route PMTU, and the
2230 old MTU is the lowest MTU in the path, update the route PMTU
2231 to reflect the increase. In this case if the other nodes' MTU
2232 also have the lowest MTU, TOO BIG MESSAGE will be lead to
2233 PMTU discouvery.
2234 */
d1918542 2235 if (rt->dst.dev == arg->dev &&
d8d1f30b
CG
2236 !dst_metric_locked(&rt->dst, RTAX_MTU) &&
2237 (dst_mtu(&rt->dst) >= arg->mtu ||
2238 (dst_mtu(&rt->dst) < arg->mtu &&
2239 dst_mtu(&rt->dst) == idev->cnf.mtu6))) {
defb3519 2240 dst_metric_set(&rt->dst, RTAX_MTU, arg->mtu);
566cfd8f 2241 }
1da177e4
LT
2242 return 0;
2243}
2244
95c96174 2245void rt6_mtu_change(struct net_device *dev, unsigned int mtu)
1da177e4 2246{
c71099ac
TG
2247 struct rt6_mtu_change_arg arg = {
2248 .dev = dev,
2249 .mtu = mtu,
2250 };
1da177e4 2251
c346dca1 2252 fib6_clean_all(dev_net(dev), rt6_mtu_change_route, 0, &arg);
1da177e4
LT
2253}
2254
ef7c79ed 2255static const struct nla_policy rtm_ipv6_policy[RTA_MAX+1] = {
5176f91e 2256 [RTA_GATEWAY] = { .len = sizeof(struct in6_addr) },
86872cb5 2257 [RTA_OIF] = { .type = NLA_U32 },
ab364a6f 2258 [RTA_IIF] = { .type = NLA_U32 },
86872cb5
TG
2259 [RTA_PRIORITY] = { .type = NLA_U32 },
2260 [RTA_METRICS] = { .type = NLA_NESTED },
51ebd318 2261 [RTA_MULTIPATH] = { .len = sizeof(struct rtnexthop) },
86872cb5
TG
2262};
2263
2264static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
2265 struct fib6_config *cfg)
1da177e4 2266{
86872cb5
TG
2267 struct rtmsg *rtm;
2268 struct nlattr *tb[RTA_MAX+1];
2269 int err;
1da177e4 2270
86872cb5
TG
2271 err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv6_policy);
2272 if (err < 0)
2273 goto errout;
1da177e4 2274
86872cb5
TG
2275 err = -EINVAL;
2276 rtm = nlmsg_data(nlh);
2277 memset(cfg, 0, sizeof(*cfg));
2278
2279 cfg->fc_table = rtm->rtm_table;
2280 cfg->fc_dst_len = rtm->rtm_dst_len;
2281 cfg->fc_src_len = rtm->rtm_src_len;
2282 cfg->fc_flags = RTF_UP;
2283 cfg->fc_protocol = rtm->rtm_protocol;
ef2c7d7b 2284 cfg->fc_type = rtm->rtm_type;
86872cb5 2285
ef2c7d7b
ND
2286 if (rtm->rtm_type == RTN_UNREACHABLE ||
2287 rtm->rtm_type == RTN_BLACKHOLE ||
b4949ab2
ND
2288 rtm->rtm_type == RTN_PROHIBIT ||
2289 rtm->rtm_type == RTN_THROW)
86872cb5
TG
2290 cfg->fc_flags |= RTF_REJECT;
2291
ab79ad14
2292 if (rtm->rtm_type == RTN_LOCAL)
2293 cfg->fc_flags |= RTF_LOCAL;
2294
15e47304 2295 cfg->fc_nlinfo.portid = NETLINK_CB(skb).portid;
86872cb5 2296 cfg->fc_nlinfo.nlh = nlh;
3b1e0a65 2297 cfg->fc_nlinfo.nl_net = sock_net(skb->sk);
86872cb5
TG
2298
2299 if (tb[RTA_GATEWAY]) {
2300 nla_memcpy(&cfg->fc_gateway, tb[RTA_GATEWAY], 16);
2301 cfg->fc_flags |= RTF_GATEWAY;
1da177e4 2302 }
86872cb5
TG
2303
2304 if (tb[RTA_DST]) {
2305 int plen = (rtm->rtm_dst_len + 7) >> 3;
2306
2307 if (nla_len(tb[RTA_DST]) < plen)
2308 goto errout;
2309
2310 nla_memcpy(&cfg->fc_dst, tb[RTA_DST], plen);
1da177e4 2311 }
86872cb5
TG
2312
2313 if (tb[RTA_SRC]) {
2314 int plen = (rtm->rtm_src_len + 7) >> 3;
2315
2316 if (nla_len(tb[RTA_SRC]) < plen)
2317 goto errout;
2318
2319 nla_memcpy(&cfg->fc_src, tb[RTA_SRC], plen);
1da177e4 2320 }
86872cb5 2321
c3968a85
DW
2322 if (tb[RTA_PREFSRC])
2323 nla_memcpy(&cfg->fc_prefsrc, tb[RTA_PREFSRC], 16);
2324
86872cb5
TG
2325 if (tb[RTA_OIF])
2326 cfg->fc_ifindex = nla_get_u32(tb[RTA_OIF]);
2327
2328 if (tb[RTA_PRIORITY])
2329 cfg->fc_metric = nla_get_u32(tb[RTA_PRIORITY]);
2330
2331 if (tb[RTA_METRICS]) {
2332 cfg->fc_mx = nla_data(tb[RTA_METRICS]);
2333 cfg->fc_mx_len = nla_len(tb[RTA_METRICS]);
1da177e4 2334 }
86872cb5
TG
2335
2336 if (tb[RTA_TABLE])
2337 cfg->fc_table = nla_get_u32(tb[RTA_TABLE]);
2338
51ebd318
ND
2339 if (tb[RTA_MULTIPATH]) {
2340 cfg->fc_mp = nla_data(tb[RTA_MULTIPATH]);
2341 cfg->fc_mp_len = nla_len(tb[RTA_MULTIPATH]);
2342 }
2343
86872cb5
TG
2344 err = 0;
2345errout:
2346 return err;
1da177e4
LT
2347}
2348
51ebd318
ND
2349static int ip6_route_multipath(struct fib6_config *cfg, int add)
2350{
2351 struct fib6_config r_cfg;
2352 struct rtnexthop *rtnh;
2353 int remaining;
2354 int attrlen;
2355 int err = 0, last_err = 0;
2356
2357beginning:
2358 rtnh = (struct rtnexthop *)cfg->fc_mp;
2359 remaining = cfg->fc_mp_len;
2360
2361 /* Parse a Multipath Entry */
2362 while (rtnh_ok(rtnh, remaining)) {
2363 memcpy(&r_cfg, cfg, sizeof(*cfg));
2364 if (rtnh->rtnh_ifindex)
2365 r_cfg.fc_ifindex = rtnh->rtnh_ifindex;
2366
2367 attrlen = rtnh_attrlen(rtnh);
2368 if (attrlen > 0) {
2369 struct nlattr *nla, *attrs = rtnh_attrs(rtnh);
2370
2371 nla = nla_find(attrs, attrlen, RTA_GATEWAY);
2372 if (nla) {
2373 nla_memcpy(&r_cfg.fc_gateway, nla, 16);
2374 r_cfg.fc_flags |= RTF_GATEWAY;
2375 }
2376 }
2377 err = add ? ip6_route_add(&r_cfg) : ip6_route_del(&r_cfg);
2378 if (err) {
2379 last_err = err;
2380 /* If we are trying to remove a route, do not stop the
2381 * loop when ip6_route_del() fails (because next hop is
2382 * already gone), we should try to remove all next hops.
2383 */
2384 if (add) {
2385 /* If add fails, we should try to delete all
2386 * next hops that have been already added.
2387 */
2388 add = 0;
2389 goto beginning;
2390 }
2391 }
1a72418b
ND
2392 /* Because each route is added like a single route we remove
2393 * this flag after the first nexthop (if there is a collision,
2394 * we have already fail to add the first nexthop:
2395 * fib6_add_rt2node() has reject it).
2396 */
2397 cfg->fc_nlinfo.nlh->nlmsg_flags &= ~NLM_F_EXCL;
51ebd318
ND
2398 rtnh = rtnh_next(rtnh, &remaining);
2399 }
2400
2401 return last_err;
2402}
2403
661d2967 2404static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh)
1da177e4 2405{
86872cb5
TG
2406 struct fib6_config cfg;
2407 int err;
1da177e4 2408
86872cb5
TG
2409 err = rtm_to_fib6_config(skb, nlh, &cfg);
2410 if (err < 0)
2411 return err;
2412
51ebd318
ND
2413 if (cfg.fc_mp)
2414 return ip6_route_multipath(&cfg, 0);
2415 else
2416 return ip6_route_del(&cfg);
1da177e4
LT
2417}
2418
661d2967 2419static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh)
1da177e4 2420{
86872cb5
TG
2421 struct fib6_config cfg;
2422 int err;
1da177e4 2423
86872cb5
TG
2424 err = rtm_to_fib6_config(skb, nlh, &cfg);
2425 if (err < 0)
2426 return err;
2427
51ebd318
ND
2428 if (cfg.fc_mp)
2429 return ip6_route_multipath(&cfg, 1);
2430 else
2431 return ip6_route_add(&cfg);
1da177e4
LT
2432}
2433
339bf98f
TG
2434static inline size_t rt6_nlmsg_size(void)
2435{
2436 return NLMSG_ALIGN(sizeof(struct rtmsg))
2437 + nla_total_size(16) /* RTA_SRC */
2438 + nla_total_size(16) /* RTA_DST */
2439 + nla_total_size(16) /* RTA_GATEWAY */
2440 + nla_total_size(16) /* RTA_PREFSRC */
2441 + nla_total_size(4) /* RTA_TABLE */
2442 + nla_total_size(4) /* RTA_IIF */
2443 + nla_total_size(4) /* RTA_OIF */
2444 + nla_total_size(4) /* RTA_PRIORITY */
6a2b9ce0 2445 + RTAX_MAX * nla_total_size(4) /* RTA_METRICS */
339bf98f
TG
2446 + nla_total_size(sizeof(struct rta_cacheinfo));
2447}
2448
191cd582
BH
2449static int rt6_fill_node(struct net *net,
2450 struct sk_buff *skb, struct rt6_info *rt,
0d51aa80 2451 struct in6_addr *dst, struct in6_addr *src,
15e47304 2452 int iif, int type, u32 portid, u32 seq,
7bc570c8 2453 int prefix, int nowait, unsigned int flags)
1da177e4
LT
2454{
2455 struct rtmsg *rtm;
2d7202bf 2456 struct nlmsghdr *nlh;
e3703b3d 2457 long expires;
9e762a4a 2458 u32 table;
1da177e4
LT
2459
2460 if (prefix) { /* user wants prefix routes only */
2461 if (!(rt->rt6i_flags & RTF_PREFIX_RT)) {
2462 /* success since this is not a prefix route */
2463 return 1;
2464 }
2465 }
2466
15e47304 2467 nlh = nlmsg_put(skb, portid, seq, type, sizeof(*rtm), flags);
38308473 2468 if (!nlh)
26932566 2469 return -EMSGSIZE;
2d7202bf
TG
2470
2471 rtm = nlmsg_data(nlh);
1da177e4
LT
2472 rtm->rtm_family = AF_INET6;
2473 rtm->rtm_dst_len = rt->rt6i_dst.plen;
2474 rtm->rtm_src_len = rt->rt6i_src.plen;
2475 rtm->rtm_tos = 0;
c71099ac 2476 if (rt->rt6i_table)
9e762a4a 2477 table = rt->rt6i_table->tb6_id;
c71099ac 2478 else
9e762a4a
PM
2479 table = RT6_TABLE_UNSPEC;
2480 rtm->rtm_table = table;
c78679e8
DM
2481 if (nla_put_u32(skb, RTA_TABLE, table))
2482 goto nla_put_failure;
ef2c7d7b
ND
2483 if (rt->rt6i_flags & RTF_REJECT) {
2484 switch (rt->dst.error) {
2485 case -EINVAL:
2486 rtm->rtm_type = RTN_BLACKHOLE;
2487 break;
2488 case -EACCES:
2489 rtm->rtm_type = RTN_PROHIBIT;
2490 break;
b4949ab2
ND
2491 case -EAGAIN:
2492 rtm->rtm_type = RTN_THROW;
2493 break;
ef2c7d7b
ND
2494 default:
2495 rtm->rtm_type = RTN_UNREACHABLE;
2496 break;
2497 }
2498 }
38308473 2499 else if (rt->rt6i_flags & RTF_LOCAL)
ab79ad14 2500 rtm->rtm_type = RTN_LOCAL;
d1918542 2501 else if (rt->dst.dev && (rt->dst.dev->flags & IFF_LOOPBACK))
1da177e4
LT
2502 rtm->rtm_type = RTN_LOCAL;
2503 else
2504 rtm->rtm_type = RTN_UNICAST;
2505 rtm->rtm_flags = 0;
2506 rtm->rtm_scope = RT_SCOPE_UNIVERSE;
2507 rtm->rtm_protocol = rt->rt6i_protocol;
38308473 2508 if (rt->rt6i_flags & RTF_DYNAMIC)
1da177e4 2509 rtm->rtm_protocol = RTPROT_REDIRECT;
f0396f60
DO
2510 else if (rt->rt6i_flags & RTF_ADDRCONF) {
2511 if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ROUTEINFO))
2512 rtm->rtm_protocol = RTPROT_RA;
2513 else
2514 rtm->rtm_protocol = RTPROT_KERNEL;
2515 }
1da177e4 2516
38308473 2517 if (rt->rt6i_flags & RTF_CACHE)
1da177e4
LT
2518 rtm->rtm_flags |= RTM_F_CLONED;
2519
2520 if (dst) {
c78679e8
DM
2521 if (nla_put(skb, RTA_DST, 16, dst))
2522 goto nla_put_failure;
1ab1457c 2523 rtm->rtm_dst_len = 128;
1da177e4 2524 } else if (rtm->rtm_dst_len)
c78679e8
DM
2525 if (nla_put(skb, RTA_DST, 16, &rt->rt6i_dst.addr))
2526 goto nla_put_failure;
1da177e4
LT
2527#ifdef CONFIG_IPV6_SUBTREES
2528 if (src) {
c78679e8
DM
2529 if (nla_put(skb, RTA_SRC, 16, src))
2530 goto nla_put_failure;
1ab1457c 2531 rtm->rtm_src_len = 128;
c78679e8
DM
2532 } else if (rtm->rtm_src_len &&
2533 nla_put(skb, RTA_SRC, 16, &rt->rt6i_src.addr))
2534 goto nla_put_failure;
1da177e4 2535#endif
7bc570c8
YH
2536 if (iif) {
2537#ifdef CONFIG_IPV6_MROUTE
2538 if (ipv6_addr_is_multicast(&rt->rt6i_dst.addr)) {
8229efda 2539 int err = ip6mr_get_route(net, skb, rtm, nowait);
7bc570c8
YH
2540 if (err <= 0) {
2541 if (!nowait) {
2542 if (err == 0)
2543 return 0;
2544 goto nla_put_failure;
2545 } else {
2546 if (err == -EMSGSIZE)
2547 goto nla_put_failure;
2548 }
2549 }
2550 } else
2551#endif
c78679e8
DM
2552 if (nla_put_u32(skb, RTA_IIF, iif))
2553 goto nla_put_failure;
7bc570c8 2554 } else if (dst) {
1da177e4 2555 struct in6_addr saddr_buf;
c78679e8
DM
2556 if (ip6_route_get_saddr(net, rt, dst, 0, &saddr_buf) == 0 &&
2557 nla_put(skb, RTA_PREFSRC, 16, &saddr_buf))
2558 goto nla_put_failure;
1da177e4 2559 }
2d7202bf 2560
c3968a85
DW
2561 if (rt->rt6i_prefsrc.plen) {
2562 struct in6_addr saddr_buf;
4e3fd7a0 2563 saddr_buf = rt->rt6i_prefsrc.addr;
c78679e8
DM
2564 if (nla_put(skb, RTA_PREFSRC, 16, &saddr_buf))
2565 goto nla_put_failure;
c3968a85
DW
2566 }
2567
defb3519 2568 if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0)
2d7202bf
TG
2569 goto nla_put_failure;
2570
dd0cbf29
YH
2571 if (rt->rt6i_flags & RTF_GATEWAY) {
2572 if (nla_put(skb, RTA_GATEWAY, 16, &rt->rt6i_gateway) < 0)
94f826b8 2573 goto nla_put_failure;
94f826b8 2574 }
2d7202bf 2575
c78679e8
DM
2576 if (rt->dst.dev &&
2577 nla_put_u32(skb, RTA_OIF, rt->dst.dev->ifindex))
2578 goto nla_put_failure;
2579 if (nla_put_u32(skb, RTA_PRIORITY, rt->rt6i_metric))
2580 goto nla_put_failure;
8253947e
LW
2581
2582 expires = (rt->rt6i_flags & RTF_EXPIRES) ? rt->dst.expires - jiffies : 0;
69cdf8f9 2583
87a50699 2584 if (rtnl_put_cacheinfo(skb, &rt->dst, 0, expires, rt->dst.error) < 0)
e3703b3d 2585 goto nla_put_failure;
2d7202bf
TG
2586
2587 return nlmsg_end(skb, nlh);
2588
2589nla_put_failure:
26932566
PM
2590 nlmsg_cancel(skb, nlh);
2591 return -EMSGSIZE;
1da177e4
LT
2592}
2593
1b43af54 2594int rt6_dump_route(struct rt6_info *rt, void *p_arg)
1da177e4
LT
2595{
2596 struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg;
2597 int prefix;
2598
2d7202bf
TG
2599 if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) {
2600 struct rtmsg *rtm = nlmsg_data(arg->cb->nlh);
1da177e4
LT
2601 prefix = (rtm->rtm_flags & RTM_F_PREFIX) != 0;
2602 } else
2603 prefix = 0;
2604
191cd582
BH
2605 return rt6_fill_node(arg->net,
2606 arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE,
15e47304 2607 NETLINK_CB(arg->cb->skb).portid, arg->cb->nlh->nlmsg_seq,
7bc570c8 2608 prefix, 0, NLM_F_MULTI);
1da177e4
LT
2609}
2610
661d2967 2611static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh)
1da177e4 2612{
3b1e0a65 2613 struct net *net = sock_net(in_skb->sk);
ab364a6f
TG
2614 struct nlattr *tb[RTA_MAX+1];
2615 struct rt6_info *rt;
1da177e4 2616 struct sk_buff *skb;
ab364a6f 2617 struct rtmsg *rtm;
4c9483b2 2618 struct flowi6 fl6;
72331bc0 2619 int err, iif = 0, oif = 0;
1da177e4 2620
ab364a6f
TG
2621 err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv6_policy);
2622 if (err < 0)
2623 goto errout;
1da177e4 2624
ab364a6f 2625 err = -EINVAL;
4c9483b2 2626 memset(&fl6, 0, sizeof(fl6));
1da177e4 2627
ab364a6f
TG
2628 if (tb[RTA_SRC]) {
2629 if (nla_len(tb[RTA_SRC]) < sizeof(struct in6_addr))
2630 goto errout;
2631
4e3fd7a0 2632 fl6.saddr = *(struct in6_addr *)nla_data(tb[RTA_SRC]);
ab364a6f
TG
2633 }
2634
2635 if (tb[RTA_DST]) {
2636 if (nla_len(tb[RTA_DST]) < sizeof(struct in6_addr))
2637 goto errout;
2638
4e3fd7a0 2639 fl6.daddr = *(struct in6_addr *)nla_data(tb[RTA_DST]);
ab364a6f
TG
2640 }
2641
2642 if (tb[RTA_IIF])
2643 iif = nla_get_u32(tb[RTA_IIF]);
2644
2645 if (tb[RTA_OIF])
72331bc0 2646 oif = nla_get_u32(tb[RTA_OIF]);
1da177e4
LT
2647
2648 if (iif) {
2649 struct net_device *dev;
72331bc0
SL
2650 int flags = 0;
2651
5578689a 2652 dev = __dev_get_by_index(net, iif);
1da177e4
LT
2653 if (!dev) {
2654 err = -ENODEV;
ab364a6f 2655 goto errout;
1da177e4 2656 }
72331bc0
SL
2657
2658 fl6.flowi6_iif = iif;
2659
2660 if (!ipv6_addr_any(&fl6.saddr))
2661 flags |= RT6_LOOKUP_F_HAS_SADDR;
2662
2663 rt = (struct rt6_info *)ip6_route_input_lookup(net, dev, &fl6,
2664 flags);
2665 } else {
2666 fl6.flowi6_oif = oif;
2667
2668 rt = (struct rt6_info *)ip6_route_output(net, NULL, &fl6);
1da177e4
LT
2669 }
2670
ab364a6f 2671 skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
38308473 2672 if (!skb) {
94e187c0 2673 ip6_rt_put(rt);
ab364a6f
TG
2674 err = -ENOBUFS;
2675 goto errout;
2676 }
1da177e4 2677
ab364a6f
TG
2678 /* Reserve room for dummy headers, this skb can pass
2679 through good chunk of routing engine.
2680 */
459a98ed 2681 skb_reset_mac_header(skb);
ab364a6f 2682 skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr));
1da177e4 2683
d8d1f30b 2684 skb_dst_set(skb, &rt->dst);
1da177e4 2685
4c9483b2 2686 err = rt6_fill_node(net, skb, rt, &fl6.daddr, &fl6.saddr, iif,
15e47304 2687 RTM_NEWROUTE, NETLINK_CB(in_skb).portid,
7bc570c8 2688 nlh->nlmsg_seq, 0, 0, 0);
1da177e4 2689 if (err < 0) {
ab364a6f
TG
2690 kfree_skb(skb);
2691 goto errout;
1da177e4
LT
2692 }
2693
15e47304 2694 err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
ab364a6f 2695errout:
1da177e4 2696 return err;
1da177e4
LT
2697}
2698
86872cb5 2699void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info)
1da177e4
LT
2700{
2701 struct sk_buff *skb;
5578689a 2702 struct net *net = info->nl_net;
528c4ceb
DL
2703 u32 seq;
2704 int err;
2705
2706 err = -ENOBUFS;
38308473 2707 seq = info->nlh ? info->nlh->nlmsg_seq : 0;
86872cb5 2708
339bf98f 2709 skb = nlmsg_new(rt6_nlmsg_size(), gfp_any());
38308473 2710 if (!skb)
21713ebc
TG
2711 goto errout;
2712
191cd582 2713 err = rt6_fill_node(net, skb, rt, NULL, NULL, 0,
15e47304 2714 event, info->portid, seq, 0, 0, 0);
26932566
PM
2715 if (err < 0) {
2716 /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
2717 WARN_ON(err == -EMSGSIZE);
2718 kfree_skb(skb);
2719 goto errout;
2720 }
15e47304 2721 rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE,
1ce85fe4
PNA
2722 info->nlh, gfp_any());
2723 return;
21713ebc
TG
2724errout:
2725 if (err < 0)
5578689a 2726 rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err);
1da177e4
LT
2727}
2728
8ed67789
DL
2729static int ip6_route_dev_notify(struct notifier_block *this,
2730 unsigned long event, void *data)
2731{
2732 struct net_device *dev = (struct net_device *)data;
c346dca1 2733 struct net *net = dev_net(dev);
8ed67789
DL
2734
2735 if (event == NETDEV_REGISTER && (dev->flags & IFF_LOOPBACK)) {
d8d1f30b 2736 net->ipv6.ip6_null_entry->dst.dev = dev;
8ed67789
DL
2737 net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev);
2738#ifdef CONFIG_IPV6_MULTIPLE_TABLES
d8d1f30b 2739 net->ipv6.ip6_prohibit_entry->dst.dev = dev;
8ed67789 2740 net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
d8d1f30b 2741 net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
8ed67789
DL
2742 net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
2743#endif
2744 }
2745
2746 return NOTIFY_OK;
2747}
2748
1da177e4
LT
2749/*
2750 * /proc
2751 */
2752
2753#ifdef CONFIG_PROC_FS
2754
1da177e4
LT
2755struct rt6_proc_arg
2756{
2757 char *buffer;
2758 int offset;
2759 int length;
2760 int skip;
2761 int len;
2762};
2763
2764static int rt6_info_route(struct rt6_info *rt, void *p_arg)
2765{
33120b30 2766 struct seq_file *m = p_arg;
1da177e4 2767
4b7a4274 2768 seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen);
1da177e4
LT
2769
2770#ifdef CONFIG_IPV6_SUBTREES
4b7a4274 2771 seq_printf(m, "%pi6 %02x ", &rt->rt6i_src.addr, rt->rt6i_src.plen);
1da177e4 2772#else
33120b30 2773 seq_puts(m, "00000000000000000000000000000000 00 ");
1da177e4 2774#endif
dd0cbf29
YH
2775 if (rt->rt6i_flags & RTF_GATEWAY) {
2776 seq_printf(m, "%pi6", &rt->rt6i_gateway);
1da177e4 2777 } else {
33120b30 2778 seq_puts(m, "00000000000000000000000000000000");
1da177e4 2779 }
33120b30 2780 seq_printf(m, " %08x %08x %08x %08x %8s\n",
d8d1f30b
CG
2781 rt->rt6i_metric, atomic_read(&rt->dst.__refcnt),
2782 rt->dst.__use, rt->rt6i_flags,
d1918542 2783 rt->dst.dev ? rt->dst.dev->name : "");
1da177e4
LT
2784 return 0;
2785}
2786
33120b30 2787static int ipv6_route_show(struct seq_file *m, void *v)
1da177e4 2788{
f3db4851 2789 struct net *net = (struct net *)m->private;
32b293a5 2790 fib6_clean_all_ro(net, rt6_info_route, 0, m);
33120b30
AD
2791 return 0;
2792}
1da177e4 2793
33120b30
AD
2794static int ipv6_route_open(struct inode *inode, struct file *file)
2795{
de05c557 2796 return single_open_net(inode, file, ipv6_route_show);
f3db4851
DL
2797}
2798
33120b30
AD
2799static const struct file_operations ipv6_route_proc_fops = {
2800 .owner = THIS_MODULE,
2801 .open = ipv6_route_open,
2802 .read = seq_read,
2803 .llseek = seq_lseek,
b6fcbdb4 2804 .release = single_release_net,
33120b30
AD
2805};
2806
1da177e4
LT
2807static int rt6_stats_seq_show(struct seq_file *seq, void *v)
2808{
69ddb805 2809 struct net *net = (struct net *)seq->private;
1da177e4 2810 seq_printf(seq, "%04x %04x %04x %04x %04x %04x %04x\n",
69ddb805
DL
2811 net->ipv6.rt6_stats->fib_nodes,
2812 net->ipv6.rt6_stats->fib_route_nodes,
2813 net->ipv6.rt6_stats->fib_rt_alloc,
2814 net->ipv6.rt6_stats->fib_rt_entries,
2815 net->ipv6.rt6_stats->fib_rt_cache,
fc66f95c 2816 dst_entries_get_slow(&net->ipv6.ip6_dst_ops),
69ddb805 2817 net->ipv6.rt6_stats->fib_discarded_routes);
1da177e4
LT
2818
2819 return 0;
2820}
2821
2822static int rt6_stats_seq_open(struct inode *inode, struct file *file)
2823{
de05c557 2824 return single_open_net(inode, file, rt6_stats_seq_show);
69ddb805
DL
2825}
2826
9a32144e 2827static const struct file_operations rt6_stats_seq_fops = {
1da177e4
LT
2828 .owner = THIS_MODULE,
2829 .open = rt6_stats_seq_open,
2830 .read = seq_read,
2831 .llseek = seq_lseek,
b6fcbdb4 2832 .release = single_release_net,
1da177e4
LT
2833};
2834#endif /* CONFIG_PROC_FS */
2835
2836#ifdef CONFIG_SYSCTL
2837
1da177e4 2838static
8d65af78 2839int ipv6_sysctl_rtcache_flush(ctl_table *ctl, int write,
1da177e4
LT
2840 void __user *buffer, size_t *lenp, loff_t *ppos)
2841{
c486da34
LAG
2842 struct net *net;
2843 int delay;
2844 if (!write)
1da177e4 2845 return -EINVAL;
c486da34
LAG
2846
2847 net = (struct net *)ctl->extra1;
2848 delay = net->ipv6.sysctl.flush_delay;
2849 proc_dointvec(ctl, write, buffer, lenp, ppos);
ba310bc8 2850 fib6_run_gc(delay <= 0 ? 0 : (unsigned long)delay, net, delay > 0);
c486da34 2851 return 0;
1da177e4
LT
2852}
2853
760f2d01 2854ctl_table ipv6_route_table_template[] = {
1ab1457c 2855 {
1da177e4 2856 .procname = "flush",
4990509f 2857 .data = &init_net.ipv6.sysctl.flush_delay,
1da177e4 2858 .maxlen = sizeof(int),
89c8b3a1 2859 .mode = 0200,
6d9f239a 2860 .proc_handler = ipv6_sysctl_rtcache_flush
1da177e4
LT
2861 },
2862 {
1da177e4 2863 .procname = "gc_thresh",
9a7ec3a9 2864 .data = &ip6_dst_ops_template.gc_thresh,
1da177e4
LT
2865 .maxlen = sizeof(int),
2866 .mode = 0644,
6d9f239a 2867 .proc_handler = proc_dointvec,
1da177e4
LT
2868 },
2869 {
1da177e4 2870 .procname = "max_size",
4990509f 2871 .data = &init_net.ipv6.sysctl.ip6_rt_max_size,
1da177e4
LT
2872 .maxlen = sizeof(int),
2873 .mode = 0644,
6d9f239a 2874 .proc_handler = proc_dointvec,
1da177e4
LT
2875 },
2876 {
1da177e4 2877 .procname = "gc_min_interval",
4990509f 2878 .data = &init_net.ipv6.sysctl.ip6_rt_gc_min_interval,
1da177e4
LT
2879 .maxlen = sizeof(int),
2880 .mode = 0644,
6d9f239a 2881 .proc_handler = proc_dointvec_jiffies,
1da177e4
LT
2882 },
2883 {
1da177e4 2884 .procname = "gc_timeout",
4990509f 2885 .data = &init_net.ipv6.sysctl.ip6_rt_gc_timeout,
1da177e4
LT
2886 .maxlen = sizeof(int),
2887 .mode = 0644,
6d9f239a 2888 .proc_handler = proc_dointvec_jiffies,
1da177e4
LT
2889 },
2890 {
1da177e4 2891 .procname = "gc_interval",
4990509f 2892 .data = &init_net.ipv6.sysctl.ip6_rt_gc_interval,
1da177e4
LT
2893 .maxlen = sizeof(int),
2894 .mode = 0644,
6d9f239a 2895 .proc_handler = proc_dointvec_jiffies,
1da177e4
LT
2896 },
2897 {
1da177e4 2898 .procname = "gc_elasticity",
4990509f 2899 .data = &init_net.ipv6.sysctl.ip6_rt_gc_elasticity,
1da177e4
LT
2900 .maxlen = sizeof(int),
2901 .mode = 0644,
f3d3f616 2902 .proc_handler = proc_dointvec,
1da177e4
LT
2903 },
2904 {
1da177e4 2905 .procname = "mtu_expires",
4990509f 2906 .data = &init_net.ipv6.sysctl.ip6_rt_mtu_expires,
1da177e4
LT
2907 .maxlen = sizeof(int),
2908 .mode = 0644,
6d9f239a 2909 .proc_handler = proc_dointvec_jiffies,
1da177e4
LT
2910 },
2911 {
1da177e4 2912 .procname = "min_adv_mss",
4990509f 2913 .data = &init_net.ipv6.sysctl.ip6_rt_min_advmss,
1da177e4
LT
2914 .maxlen = sizeof(int),
2915 .mode = 0644,
f3d3f616 2916 .proc_handler = proc_dointvec,
1da177e4
LT
2917 },
2918 {
1da177e4 2919 .procname = "gc_min_interval_ms",
4990509f 2920 .data = &init_net.ipv6.sysctl.ip6_rt_gc_min_interval,
1da177e4
LT
2921 .maxlen = sizeof(int),
2922 .mode = 0644,
6d9f239a 2923 .proc_handler = proc_dointvec_ms_jiffies,
1da177e4 2924 },
f8572d8f 2925 { }
1da177e4
LT
2926};
2927
2c8c1e72 2928struct ctl_table * __net_init ipv6_route_sysctl_init(struct net *net)
760f2d01
DL
2929{
2930 struct ctl_table *table;
2931
2932 table = kmemdup(ipv6_route_table_template,
2933 sizeof(ipv6_route_table_template),
2934 GFP_KERNEL);
5ee09105
YH
2935
2936 if (table) {
2937 table[0].data = &net->ipv6.sysctl.flush_delay;
c486da34 2938 table[0].extra1 = net;
86393e52 2939 table[1].data = &net->ipv6.ip6_dst_ops.gc_thresh;
5ee09105
YH
2940 table[2].data = &net->ipv6.sysctl.ip6_rt_max_size;
2941 table[3].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
2942 table[4].data = &net->ipv6.sysctl.ip6_rt_gc_timeout;
2943 table[5].data = &net->ipv6.sysctl.ip6_rt_gc_interval;
2944 table[6].data = &net->ipv6.sysctl.ip6_rt_gc_elasticity;
2945 table[7].data = &net->ipv6.sysctl.ip6_rt_mtu_expires;
2946 table[8].data = &net->ipv6.sysctl.ip6_rt_min_advmss;
9c69fabe 2947 table[9].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
464dc801
EB
2948
2949 /* Don't export sysctls to unprivileged users */
2950 if (net->user_ns != &init_user_ns)
2951 table[0].procname = NULL;
5ee09105
YH
2952 }
2953
760f2d01
DL
2954 return table;
2955}
1da177e4
LT
2956#endif
2957
2c8c1e72 2958static int __net_init ip6_route_net_init(struct net *net)
cdb18761 2959{
633d424b 2960 int ret = -ENOMEM;
8ed67789 2961
86393e52
AD
2962 memcpy(&net->ipv6.ip6_dst_ops, &ip6_dst_ops_template,
2963 sizeof(net->ipv6.ip6_dst_ops));
f2fc6a54 2964
fc66f95c
ED
2965 if (dst_entries_init(&net->ipv6.ip6_dst_ops) < 0)
2966 goto out_ip6_dst_ops;
2967
8ed67789
DL
2968 net->ipv6.ip6_null_entry = kmemdup(&ip6_null_entry_template,
2969 sizeof(*net->ipv6.ip6_null_entry),
2970 GFP_KERNEL);
2971 if (!net->ipv6.ip6_null_entry)
fc66f95c 2972 goto out_ip6_dst_entries;
d8d1f30b 2973 net->ipv6.ip6_null_entry->dst.path =
8ed67789 2974 (struct dst_entry *)net->ipv6.ip6_null_entry;
d8d1f30b 2975 net->ipv6.ip6_null_entry->dst.ops = &net->ipv6.ip6_dst_ops;
62fa8a84
DM
2976 dst_init_metrics(&net->ipv6.ip6_null_entry->dst,
2977 ip6_template_metrics, true);
8ed67789
DL
2978
2979#ifdef CONFIG_IPV6_MULTIPLE_TABLES
2980 net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
2981 sizeof(*net->ipv6.ip6_prohibit_entry),
2982 GFP_KERNEL);
68fffc67
PZ
2983 if (!net->ipv6.ip6_prohibit_entry)
2984 goto out_ip6_null_entry;
d8d1f30b 2985 net->ipv6.ip6_prohibit_entry->dst.path =
8ed67789 2986 (struct dst_entry *)net->ipv6.ip6_prohibit_entry;
d8d1f30b 2987 net->ipv6.ip6_prohibit_entry->dst.ops = &net->ipv6.ip6_dst_ops;
62fa8a84
DM
2988 dst_init_metrics(&net->ipv6.ip6_prohibit_entry->dst,
2989 ip6_template_metrics, true);
8ed67789
DL
2990
2991 net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template,
2992 sizeof(*net->ipv6.ip6_blk_hole_entry),
2993 GFP_KERNEL);
68fffc67
PZ
2994 if (!net->ipv6.ip6_blk_hole_entry)
2995 goto out_ip6_prohibit_entry;
d8d1f30b 2996 net->ipv6.ip6_blk_hole_entry->dst.path =
8ed67789 2997 (struct dst_entry *)net->ipv6.ip6_blk_hole_entry;
d8d1f30b 2998 net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
62fa8a84
DM
2999 dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
3000 ip6_template_metrics, true);
8ed67789
DL
3001#endif
3002
b339a47c
PZ
3003 net->ipv6.sysctl.flush_delay = 0;
3004 net->ipv6.sysctl.ip6_rt_max_size = 4096;
3005 net->ipv6.sysctl.ip6_rt_gc_min_interval = HZ / 2;
3006 net->ipv6.sysctl.ip6_rt_gc_timeout = 60*HZ;
3007 net->ipv6.sysctl.ip6_rt_gc_interval = 30*HZ;
3008 net->ipv6.sysctl.ip6_rt_gc_elasticity = 9;
3009 net->ipv6.sysctl.ip6_rt_mtu_expires = 10*60*HZ;
3010 net->ipv6.sysctl.ip6_rt_min_advmss = IPV6_MIN_MTU - 20 - 40;
3011
6891a346
BT
3012 net->ipv6.ip6_rt_gc_expire = 30*HZ;
3013
8ed67789
DL
3014 ret = 0;
3015out:
3016 return ret;
f2fc6a54 3017
68fffc67
PZ
3018#ifdef CONFIG_IPV6_MULTIPLE_TABLES
3019out_ip6_prohibit_entry:
3020 kfree(net->ipv6.ip6_prohibit_entry);
3021out_ip6_null_entry:
3022 kfree(net->ipv6.ip6_null_entry);
3023#endif
fc66f95c
ED
3024out_ip6_dst_entries:
3025 dst_entries_destroy(&net->ipv6.ip6_dst_ops);
f2fc6a54 3026out_ip6_dst_ops:
f2fc6a54 3027 goto out;
cdb18761
DL
3028}
3029
2c8c1e72 3030static void __net_exit ip6_route_net_exit(struct net *net)
cdb18761 3031{
8ed67789
DL
3032 kfree(net->ipv6.ip6_null_entry);
3033#ifdef CONFIG_IPV6_MULTIPLE_TABLES
3034 kfree(net->ipv6.ip6_prohibit_entry);
3035 kfree(net->ipv6.ip6_blk_hole_entry);
3036#endif
41bb78b4 3037 dst_entries_destroy(&net->ipv6.ip6_dst_ops);
cdb18761
DL
3038}
3039
d189634e
TG
3040static int __net_init ip6_route_net_init_late(struct net *net)
3041{
3042#ifdef CONFIG_PROC_FS
d4beaa66
G
3043 proc_create("ipv6_route", 0, net->proc_net, &ipv6_route_proc_fops);
3044 proc_create("rt6_stats", S_IRUGO, net->proc_net, &rt6_stats_seq_fops);
d189634e
TG
3045#endif
3046 return 0;
3047}
3048
3049static void __net_exit ip6_route_net_exit_late(struct net *net)
3050{
3051#ifdef CONFIG_PROC_FS
ece31ffd
G
3052 remove_proc_entry("ipv6_route", net->proc_net);
3053 remove_proc_entry("rt6_stats", net->proc_net);
d189634e
TG
3054#endif
3055}
3056
cdb18761
DL
3057static struct pernet_operations ip6_route_net_ops = {
3058 .init = ip6_route_net_init,
3059 .exit = ip6_route_net_exit,
3060};
3061
c3426b47
DM
3062static int __net_init ipv6_inetpeer_init(struct net *net)
3063{
3064 struct inet_peer_base *bp = kmalloc(sizeof(*bp), GFP_KERNEL);
3065
3066 if (!bp)
3067 return -ENOMEM;
3068 inet_peer_base_init(bp);
3069 net->ipv6.peers = bp;
3070 return 0;
3071}
3072
3073static void __net_exit ipv6_inetpeer_exit(struct net *net)
3074{
3075 struct inet_peer_base *bp = net->ipv6.peers;
3076
3077 net->ipv6.peers = NULL;
56a6b248 3078 inetpeer_invalidate_tree(bp);
c3426b47
DM
3079 kfree(bp);
3080}
3081
2b823f72 3082static struct pernet_operations ipv6_inetpeer_ops = {
c3426b47
DM
3083 .init = ipv6_inetpeer_init,
3084 .exit = ipv6_inetpeer_exit,
3085};
3086
d189634e
TG
3087static struct pernet_operations ip6_route_net_late_ops = {
3088 .init = ip6_route_net_init_late,
3089 .exit = ip6_route_net_exit_late,
3090};
3091
8ed67789
DL
3092static struct notifier_block ip6_route_dev_notifier = {
3093 .notifier_call = ip6_route_dev_notify,
3094 .priority = 0,
3095};
3096
433d49c3 3097int __init ip6_route_init(void)
1da177e4 3098{
433d49c3
DL
3099 int ret;
3100
9a7ec3a9
DL
3101 ret = -ENOMEM;
3102 ip6_dst_ops_template.kmem_cachep =
e5d679f3 3103 kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0,
f845ab6b 3104 SLAB_HWCACHE_ALIGN, NULL);
9a7ec3a9 3105 if (!ip6_dst_ops_template.kmem_cachep)
c19a28e1 3106 goto out;
14e50e57 3107
fc66f95c 3108 ret = dst_entries_init(&ip6_dst_blackhole_ops);
8ed67789 3109 if (ret)
bdb3289f 3110 goto out_kmem_cache;
bdb3289f 3111
c3426b47
DM
3112 ret = register_pernet_subsys(&ipv6_inetpeer_ops);
3113 if (ret)
e8803b6c 3114 goto out_dst_entries;
2a0c451a 3115
7e52b33b
DM
3116 ret = register_pernet_subsys(&ip6_route_net_ops);
3117 if (ret)
3118 goto out_register_inetpeer;
c3426b47 3119
5dc121e9
AE
3120 ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops_template.kmem_cachep;
3121
8ed67789
DL
3122 /* Registering of the loopback is done before this portion of code,
3123 * the loopback reference in rt6_info will not be taken, do it
3124 * manually for init_net */
d8d1f30b 3125 init_net.ipv6.ip6_null_entry->dst.dev = init_net.loopback_dev;
8ed67789
DL
3126 init_net.ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
3127 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
d8d1f30b 3128 init_net.ipv6.ip6_prohibit_entry->dst.dev = init_net.loopback_dev;
8ed67789 3129 init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
d8d1f30b 3130 init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
8ed67789
DL
3131 init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
3132 #endif
e8803b6c 3133 ret = fib6_init();
433d49c3 3134 if (ret)
8ed67789 3135 goto out_register_subsys;
433d49c3 3136
433d49c3
DL
3137 ret = xfrm6_init();
3138 if (ret)
e8803b6c 3139 goto out_fib6_init;
c35b7e72 3140
433d49c3
DL
3141 ret = fib6_rules_init();
3142 if (ret)
3143 goto xfrm6_init;
7e5449c2 3144
d189634e
TG
3145 ret = register_pernet_subsys(&ip6_route_net_late_ops);
3146 if (ret)
3147 goto fib6_rules_init;
3148
433d49c3 3149 ret = -ENOBUFS;
c7ac8679
GR
3150 if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, NULL) ||
3151 __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, NULL) ||
3152 __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, NULL))
d189634e 3153 goto out_register_late_subsys;
c127ea2c 3154
8ed67789 3155 ret = register_netdevice_notifier(&ip6_route_dev_notifier);
cdb18761 3156 if (ret)
d189634e 3157 goto out_register_late_subsys;
8ed67789 3158
433d49c3
DL
3159out:
3160 return ret;
3161
d189634e
TG
3162out_register_late_subsys:
3163 unregister_pernet_subsys(&ip6_route_net_late_ops);
433d49c3 3164fib6_rules_init:
433d49c3
DL
3165 fib6_rules_cleanup();
3166xfrm6_init:
433d49c3 3167 xfrm6_fini();
2a0c451a
TG
3168out_fib6_init:
3169 fib6_gc_cleanup();
8ed67789
DL
3170out_register_subsys:
3171 unregister_pernet_subsys(&ip6_route_net_ops);
7e52b33b
DM
3172out_register_inetpeer:
3173 unregister_pernet_subsys(&ipv6_inetpeer_ops);
fc66f95c
ED
3174out_dst_entries:
3175 dst_entries_destroy(&ip6_dst_blackhole_ops);
433d49c3 3176out_kmem_cache:
f2fc6a54 3177 kmem_cache_destroy(ip6_dst_ops_template.kmem_cachep);
433d49c3 3178 goto out;
1da177e4
LT
3179}
3180
3181void ip6_route_cleanup(void)
3182{
8ed67789 3183 unregister_netdevice_notifier(&ip6_route_dev_notifier);
d189634e 3184 unregister_pernet_subsys(&ip6_route_net_late_ops);
101367c2 3185 fib6_rules_cleanup();
1da177e4 3186 xfrm6_fini();
1da177e4 3187 fib6_gc_cleanup();
c3426b47 3188 unregister_pernet_subsys(&ipv6_inetpeer_ops);
8ed67789 3189 unregister_pernet_subsys(&ip6_route_net_ops);
41bb78b4 3190 dst_entries_destroy(&ip6_dst_blackhole_ops);
f2fc6a54 3191 kmem_cache_destroy(ip6_dst_ops_template.kmem_cachep);
1da177e4 3192}