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