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