2 * Linux INET6 implementation
6 * Pedro Roque <roque@di.fc.ul.pt>
8 * $Id: route.c,v 1.56 2001/10/31 21:55:55 davem Exp $
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version
13 * 2 of the License, or (at your option) any later version.
18 * YOSHIFUJI Hideaki @USAGI
19 * reworked default router selection.
20 * - respect outgoing interface
21 * - select from (probably) reachable routers (i.e.
22 * routers in REACHABLE, STALE, DELAY or PROBE states).
23 * - always select the same router if it is (probably)
24 * reachable. otherwise, round-robin the list.
26 * Fixed routing subtrees.
29 #include <linux/capability.h>
30 #include <linux/errno.h>
31 #include <linux/types.h>
32 #include <linux/times.h>
33 #include <linux/socket.h>
34 #include <linux/sockios.h>
35 #include <linux/net.h>
36 #include <linux/route.h>
37 #include <linux/netdevice.h>
38 #include <linux/in6.h>
39 #include <linux/init.h>
40 #include <linux/if_arp.h>
43 #include <linux/proc_fs.h>
44 #include <linux/seq_file.h>
49 #include <net/ip6_fib.h>
50 #include <net/ip6_route.h>
51 #include <net/ndisc.h>
52 #include <net/addrconf.h>
54 #include <linux/rtnetlink.h>
57 #include <net/netevent.h>
58 #include <net/netlink.h>
60 #include <asm/uaccess.h>
63 #include <linux/sysctl.h>
66 /* Set to 3 to get tracing. */
70 #define RDBG(x) printk x
71 #define RT6_TRACE(x...) printk(KERN_DEBUG x)
74 #define RT6_TRACE(x...) do { ; } while (0)
77 #define CLONE_OFFLINK_ROUTE 0
79 static int ip6_rt_max_size
= 4096;
80 static int ip6_rt_gc_min_interval
= HZ
/ 2;
81 static int ip6_rt_gc_timeout
= 60*HZ
;
82 int ip6_rt_gc_interval
= 30*HZ
;
83 static int ip6_rt_gc_elasticity
= 9;
84 static int ip6_rt_mtu_expires
= 10*60*HZ
;
85 static int ip6_rt_min_advmss
= IPV6_MIN_MTU
- 20 - 40;
87 static struct rt6_info
* ip6_rt_copy(struct rt6_info
*ort
);
88 static struct dst_entry
*ip6_dst_check(struct dst_entry
*dst
, u32 cookie
);
89 static struct dst_entry
*ip6_negative_advice(struct dst_entry
*);
90 static void ip6_dst_destroy(struct dst_entry
*);
91 static void ip6_dst_ifdown(struct dst_entry
*,
92 struct net_device
*dev
, int how
);
93 static int ip6_dst_gc(void);
95 static int ip6_pkt_discard(struct sk_buff
*skb
);
96 static int ip6_pkt_discard_out(struct sk_buff
*skb
);
97 static void ip6_link_failure(struct sk_buff
*skb
);
98 static void ip6_rt_update_pmtu(struct dst_entry
*dst
, u32 mtu
);
100 #ifdef CONFIG_IPV6_ROUTE_INFO
101 static struct rt6_info
*rt6_add_route_info(struct in6_addr
*prefix
, int prefixlen
,
102 struct in6_addr
*gwaddr
, int ifindex
,
104 static struct rt6_info
*rt6_get_route_info(struct in6_addr
*prefix
, int prefixlen
,
105 struct in6_addr
*gwaddr
, int ifindex
);
108 static struct dst_ops ip6_dst_ops
= {
110 .protocol
= __constant_htons(ETH_P_IPV6
),
113 .check
= ip6_dst_check
,
114 .destroy
= ip6_dst_destroy
,
115 .ifdown
= ip6_dst_ifdown
,
116 .negative_advice
= ip6_negative_advice
,
117 .link_failure
= ip6_link_failure
,
118 .update_pmtu
= ip6_rt_update_pmtu
,
119 .entry_size
= sizeof(struct rt6_info
),
122 struct rt6_info ip6_null_entry
= {
125 .__refcnt
= ATOMIC_INIT(1),
127 .dev
= &loopback_dev
,
129 .error
= -ENETUNREACH
,
130 .metrics
= { [RTAX_HOPLIMIT
- 1] = 255, },
131 .input
= ip6_pkt_discard
,
132 .output
= ip6_pkt_discard_out
,
134 .path
= (struct dst_entry
*)&ip6_null_entry
,
137 .rt6i_flags
= (RTF_REJECT
| RTF_NONEXTHOP
),
138 .rt6i_metric
= ~(u32
) 0,
139 .rt6i_ref
= ATOMIC_INIT(1),
142 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
144 struct rt6_info ip6_prohibit_entry
= {
147 .__refcnt
= ATOMIC_INIT(1),
149 .dev
= &loopback_dev
,
152 .metrics
= { [RTAX_HOPLIMIT
- 1] = 255, },
153 .input
= ip6_pkt_discard
,
154 .output
= ip6_pkt_discard_out
,
156 .path
= (struct dst_entry
*)&ip6_prohibit_entry
,
159 .rt6i_flags
= (RTF_REJECT
| RTF_NONEXTHOP
),
160 .rt6i_metric
= ~(u32
) 0,
161 .rt6i_ref
= ATOMIC_INIT(1),
164 struct rt6_info ip6_blk_hole_entry
= {
167 .__refcnt
= ATOMIC_INIT(1),
169 .dev
= &loopback_dev
,
172 .metrics
= { [RTAX_HOPLIMIT
- 1] = 255, },
173 .input
= ip6_pkt_discard
,
174 .output
= ip6_pkt_discard_out
,
176 .path
= (struct dst_entry
*)&ip6_blk_hole_entry
,
179 .rt6i_flags
= (RTF_REJECT
| RTF_NONEXTHOP
),
180 .rt6i_metric
= ~(u32
) 0,
181 .rt6i_ref
= ATOMIC_INIT(1),
186 /* allocate dst with ip6_dst_ops */
187 static __inline__
struct rt6_info
*ip6_dst_alloc(void)
189 return (struct rt6_info
*)dst_alloc(&ip6_dst_ops
);
192 static void ip6_dst_destroy(struct dst_entry
*dst
)
194 struct rt6_info
*rt
= (struct rt6_info
*)dst
;
195 struct inet6_dev
*idev
= rt
->rt6i_idev
;
198 rt
->rt6i_idev
= NULL
;
203 static void ip6_dst_ifdown(struct dst_entry
*dst
, struct net_device
*dev
,
206 struct rt6_info
*rt
= (struct rt6_info
*)dst
;
207 struct inet6_dev
*idev
= rt
->rt6i_idev
;
209 if (dev
!= &loopback_dev
&& idev
!= NULL
&& idev
->dev
== dev
) {
210 struct inet6_dev
*loopback_idev
= in6_dev_get(&loopback_dev
);
211 if (loopback_idev
!= NULL
) {
212 rt
->rt6i_idev
= loopback_idev
;
218 static __inline__
int rt6_check_expired(const struct rt6_info
*rt
)
220 return (rt
->rt6i_flags
& RTF_EXPIRES
&&
221 time_after(jiffies
, rt
->rt6i_expires
));
224 static inline int rt6_need_strict(struct in6_addr
*daddr
)
226 return (ipv6_addr_type(daddr
) &
227 (IPV6_ADDR_MULTICAST
| IPV6_ADDR_LINKLOCAL
));
231 * Route lookup. Any table->tb6_lock is implied.
234 static __inline__
struct rt6_info
*rt6_device_match(struct rt6_info
*rt
,
238 struct rt6_info
*local
= NULL
;
239 struct rt6_info
*sprt
;
242 for (sprt
= rt
; sprt
; sprt
= sprt
->u
.next
) {
243 struct net_device
*dev
= sprt
->rt6i_dev
;
244 if (dev
->ifindex
== oif
)
246 if (dev
->flags
& IFF_LOOPBACK
) {
247 if (sprt
->rt6i_idev
== NULL
||
248 sprt
->rt6i_idev
->dev
->ifindex
!= oif
) {
251 if (local
&& (!oif
||
252 local
->rt6i_idev
->dev
->ifindex
== oif
))
263 return &ip6_null_entry
;
268 #ifdef CONFIG_IPV6_ROUTER_PREF
269 static void rt6_probe(struct rt6_info
*rt
)
271 struct neighbour
*neigh
= rt
? rt
->rt6i_nexthop
: NULL
;
273 * Okay, this does not seem to be appropriate
274 * for now, however, we need to check if it
275 * is really so; aka Router Reachability Probing.
277 * Router Reachability Probe MUST be rate-limited
278 * to no more than one per minute.
280 if (!neigh
|| (neigh
->nud_state
& NUD_VALID
))
282 read_lock_bh(&neigh
->lock
);
283 if (!(neigh
->nud_state
& NUD_VALID
) &&
284 time_after(jiffies
, neigh
->updated
+ rt
->rt6i_idev
->cnf
.rtr_probe_interval
)) {
285 struct in6_addr mcaddr
;
286 struct in6_addr
*target
;
288 neigh
->updated
= jiffies
;
289 read_unlock_bh(&neigh
->lock
);
291 target
= (struct in6_addr
*)&neigh
->primary_key
;
292 addrconf_addr_solict_mult(target
, &mcaddr
);
293 ndisc_send_ns(rt
->rt6i_dev
, NULL
, target
, &mcaddr
, NULL
);
295 read_unlock_bh(&neigh
->lock
);
298 static inline void rt6_probe(struct rt6_info
*rt
)
305 * Default Router Selection (RFC 2461 6.3.6)
307 static int inline rt6_check_dev(struct rt6_info
*rt
, int oif
)
309 struct net_device
*dev
= rt
->rt6i_dev
;
310 if (!oif
|| dev
->ifindex
== oif
)
312 if ((dev
->flags
& IFF_LOOPBACK
) &&
313 rt
->rt6i_idev
&& rt
->rt6i_idev
->dev
->ifindex
== oif
)
318 static int inline rt6_check_neigh(struct rt6_info
*rt
)
320 struct neighbour
*neigh
= rt
->rt6i_nexthop
;
322 if (rt
->rt6i_flags
& RTF_NONEXTHOP
||
323 !(rt
->rt6i_flags
& RTF_GATEWAY
))
326 read_lock_bh(&neigh
->lock
);
327 if (neigh
->nud_state
& NUD_VALID
)
329 read_unlock_bh(&neigh
->lock
);
334 static int rt6_score_route(struct rt6_info
*rt
, int oif
,
339 m
= rt6_check_dev(rt
, oif
);
340 if (!m
&& (strict
& RT6_LOOKUP_F_IFACE
))
342 #ifdef CONFIG_IPV6_ROUTER_PREF
343 m
|= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt
->rt6i_flags
)) << 2;
345 n
= rt6_check_neigh(rt
);
348 else if (!n
&& strict
& RT6_LOOKUP_F_REACHABLE
)
353 static struct rt6_info
*rt6_select(struct rt6_info
**head
, int oif
,
356 struct rt6_info
*match
= NULL
, *last
= NULL
;
357 struct rt6_info
*rt
, *rt0
= *head
;
361 RT6_TRACE("%s(head=%p(*head=%p), oif=%d)\n",
362 __FUNCTION__
, head
, head
? *head
: NULL
, oif
);
364 for (rt
= rt0
, metric
= rt0
->rt6i_metric
;
365 rt
&& rt
->rt6i_metric
== metric
&& (!last
|| rt
!= rt0
);
369 if (rt6_check_expired(rt
))
374 m
= rt6_score_route(rt
, oif
, strict
);
388 (strict
& RT6_LOOKUP_F_REACHABLE
) &&
389 last
&& last
!= rt0
) {
390 /* no entries matched; do round-robin */
391 static DEFINE_SPINLOCK(lock
);
394 rt0
->u
.next
= last
->u
.next
;
399 RT6_TRACE("%s() => %p, score=%d\n",
400 __FUNCTION__
, match
, mpri
);
402 return (match
? match
: &ip6_null_entry
);
405 #ifdef CONFIG_IPV6_ROUTE_INFO
406 int rt6_route_rcv(struct net_device
*dev
, u8
*opt
, int len
,
407 struct in6_addr
*gwaddr
)
409 struct route_info
*rinfo
= (struct route_info
*) opt
;
410 struct in6_addr prefix_buf
, *prefix
;
415 if (len
< sizeof(struct route_info
)) {
419 /* Sanity check for prefix_len and length */
420 if (rinfo
->length
> 3) {
422 } else if (rinfo
->prefix_len
> 128) {
424 } else if (rinfo
->prefix_len
> 64) {
425 if (rinfo
->length
< 2) {
428 } else if (rinfo
->prefix_len
> 0) {
429 if (rinfo
->length
< 1) {
434 pref
= rinfo
->route_pref
;
435 if (pref
== ICMPV6_ROUTER_PREF_INVALID
)
436 pref
= ICMPV6_ROUTER_PREF_MEDIUM
;
438 lifetime
= htonl(rinfo
->lifetime
);
439 if (lifetime
== 0xffffffff) {
441 } else if (lifetime
> 0x7fffffff/HZ
) {
442 /* Avoid arithmetic overflow */
443 lifetime
= 0x7fffffff/HZ
- 1;
446 if (rinfo
->length
== 3)
447 prefix
= (struct in6_addr
*)rinfo
->prefix
;
449 /* this function is safe */
450 ipv6_addr_prefix(&prefix_buf
,
451 (struct in6_addr
*)rinfo
->prefix
,
453 prefix
= &prefix_buf
;
456 rt
= rt6_get_route_info(prefix
, rinfo
->prefix_len
, gwaddr
, dev
->ifindex
);
458 if (rt
&& !lifetime
) {
464 rt
= rt6_add_route_info(prefix
, rinfo
->prefix_len
, gwaddr
, dev
->ifindex
,
467 rt
->rt6i_flags
= RTF_ROUTEINFO
|
468 (rt
->rt6i_flags
& ~RTF_PREF_MASK
) | RTF_PREF(pref
);
471 if (lifetime
== 0xffffffff) {
472 rt
->rt6i_flags
&= ~RTF_EXPIRES
;
474 rt
->rt6i_expires
= jiffies
+ HZ
* lifetime
;
475 rt
->rt6i_flags
|= RTF_EXPIRES
;
477 dst_release(&rt
->u
.dst
);
483 #define BACKTRACK(saddr) \
485 if (rt == &ip6_null_entry) { \
486 struct fib6_node *pn; \
488 if (fn->fn_flags & RTN_TL_ROOT) \
491 if (FIB6_SUBTREE(pn) && FIB6_SUBTREE(pn) != fn) \
492 fn = fib6_lookup(pn->subtree, NULL, saddr); \
495 if (fn->fn_flags & RTN_RTINFO) \
501 static struct rt6_info
*ip6_pol_route_lookup(struct fib6_table
*table
,
502 struct flowi
*fl
, int flags
)
504 struct fib6_node
*fn
;
507 read_lock_bh(&table
->tb6_lock
);
508 fn
= fib6_lookup(&table
->tb6_root
, &fl
->fl6_dst
, &fl
->fl6_src
);
511 rt
= rt6_device_match(rt
, fl
->oif
, flags
);
512 BACKTRACK(&fl
->fl6_src
);
513 dst_hold(&rt
->u
.dst
);
515 read_unlock_bh(&table
->tb6_lock
);
517 rt
->u
.dst
.lastuse
= jiffies
;
524 struct rt6_info
*rt6_lookup(struct in6_addr
*daddr
, struct in6_addr
*saddr
,
536 struct dst_entry
*dst
;
537 int flags
= strict
? RT6_LOOKUP_F_IFACE
: 0;
539 dst
= fib6_rule_lookup(&fl
, flags
, ip6_pol_route_lookup
);
541 return (struct rt6_info
*) dst
;
548 /* ip6_ins_rt is called with FREE table->tb6_lock.
549 It takes new route entry, the addition fails by any reason the
550 route is freed. In any case, if caller does not hold it, it may
554 static int __ip6_ins_rt(struct rt6_info
*rt
, struct nl_info
*info
)
557 struct fib6_table
*table
;
559 table
= rt
->rt6i_table
;
560 write_lock_bh(&table
->tb6_lock
);
561 err
= fib6_add(&table
->tb6_root
, rt
, info
);
562 write_unlock_bh(&table
->tb6_lock
);
567 int ip6_ins_rt(struct rt6_info
*rt
)
569 return __ip6_ins_rt(rt
, NULL
);
572 static struct rt6_info
*rt6_alloc_cow(struct rt6_info
*ort
, struct in6_addr
*daddr
,
573 struct in6_addr
*saddr
)
581 rt
= ip6_rt_copy(ort
);
584 if (!(rt
->rt6i_flags
&RTF_GATEWAY
)) {
585 if (rt
->rt6i_dst
.plen
!= 128 &&
586 ipv6_addr_equal(&rt
->rt6i_dst
.addr
, daddr
))
587 rt
->rt6i_flags
|= RTF_ANYCAST
;
588 ipv6_addr_copy(&rt
->rt6i_gateway
, daddr
);
591 ipv6_addr_copy(&rt
->rt6i_dst
.addr
, daddr
);
592 rt
->rt6i_dst
.plen
= 128;
593 rt
->rt6i_flags
|= RTF_CACHE
;
594 rt
->u
.dst
.flags
|= DST_HOST
;
596 #ifdef CONFIG_IPV6_SUBTREES
597 if (rt
->rt6i_src
.plen
&& saddr
) {
598 ipv6_addr_copy(&rt
->rt6i_src
.addr
, saddr
);
599 rt
->rt6i_src
.plen
= 128;
603 rt
->rt6i_nexthop
= ndisc_get_neigh(rt
->rt6i_dev
, &rt
->rt6i_gateway
);
610 static struct rt6_info
*rt6_alloc_clone(struct rt6_info
*ort
, struct in6_addr
*daddr
)
612 struct rt6_info
*rt
= ip6_rt_copy(ort
);
614 ipv6_addr_copy(&rt
->rt6i_dst
.addr
, daddr
);
615 rt
->rt6i_dst
.plen
= 128;
616 rt
->rt6i_flags
|= RTF_CACHE
;
617 if (rt
->rt6i_flags
& RTF_REJECT
)
618 rt
->u
.dst
.error
= ort
->u
.dst
.error
;
619 rt
->u
.dst
.flags
|= DST_HOST
;
620 rt
->rt6i_nexthop
= neigh_clone(ort
->rt6i_nexthop
);
625 static struct rt6_info
*ip6_pol_route_input(struct fib6_table
*table
,
626 struct flowi
*fl
, int flags
)
628 struct fib6_node
*fn
;
629 struct rt6_info
*rt
, *nrt
;
633 int reachable
= RT6_LOOKUP_F_REACHABLE
;
635 strict
|= flags
& RT6_LOOKUP_F_IFACE
;
638 read_lock_bh(&table
->tb6_lock
);
641 fn
= fib6_lookup(&table
->tb6_root
, &fl
->fl6_dst
, &fl
->fl6_src
);
644 rt
= rt6_select(&fn
->leaf
, fl
->iif
, strict
| reachable
);
645 BACKTRACK(&fl
->fl6_src
);
646 if (rt
== &ip6_null_entry
||
647 rt
->rt6i_flags
& RTF_CACHE
)
650 dst_hold(&rt
->u
.dst
);
651 read_unlock_bh(&table
->tb6_lock
);
653 if (!rt
->rt6i_nexthop
&& !(rt
->rt6i_flags
& RTF_NONEXTHOP
))
654 nrt
= rt6_alloc_cow(rt
, &fl
->fl6_dst
, &fl
->fl6_src
);
656 #if CLONE_OFFLINK_ROUTE
657 nrt
= rt6_alloc_clone(rt
, &fl
->fl6_dst
);
663 dst_release(&rt
->u
.dst
);
664 rt
= nrt
? : &ip6_null_entry
;
666 dst_hold(&rt
->u
.dst
);
668 err
= ip6_ins_rt(nrt
);
677 * Race condition! In the gap, when table->tb6_lock was
678 * released someone could insert this route. Relookup.
680 dst_release(&rt
->u
.dst
);
688 dst_hold(&rt
->u
.dst
);
689 read_unlock_bh(&table
->tb6_lock
);
691 rt
->u
.dst
.lastuse
= jiffies
;
697 void ip6_route_input(struct sk_buff
*skb
)
699 struct ipv6hdr
*iph
= skb
->nh
.ipv6h
;
701 .iif
= skb
->dev
->ifindex
,
706 .flowlabel
= (* (u32
*) iph
)&IPV6_FLOWINFO_MASK
,
709 .proto
= iph
->nexthdr
,
711 int flags
= rt6_need_strict(&iph
->daddr
) ? RT6_LOOKUP_F_IFACE
: 0;
713 skb
->dst
= fib6_rule_lookup(&fl
, flags
, ip6_pol_route_input
);
716 static struct rt6_info
*ip6_pol_route_output(struct fib6_table
*table
,
717 struct flowi
*fl
, int flags
)
719 struct fib6_node
*fn
;
720 struct rt6_info
*rt
, *nrt
;
724 int reachable
= RT6_LOOKUP_F_REACHABLE
;
726 strict
|= flags
& RT6_LOOKUP_F_IFACE
;
729 read_lock_bh(&table
->tb6_lock
);
732 fn
= fib6_lookup(&table
->tb6_root
, &fl
->fl6_dst
, &fl
->fl6_src
);
735 rt
= rt6_select(&fn
->leaf
, fl
->oif
, strict
| reachable
);
736 BACKTRACK(&fl
->fl6_src
);
737 if (rt
== &ip6_null_entry
||
738 rt
->rt6i_flags
& RTF_CACHE
)
741 dst_hold(&rt
->u
.dst
);
742 read_unlock_bh(&table
->tb6_lock
);
744 if (!rt
->rt6i_nexthop
&& !(rt
->rt6i_flags
& RTF_NONEXTHOP
))
745 nrt
= rt6_alloc_cow(rt
, &fl
->fl6_dst
, &fl
->fl6_src
);
747 #if CLONE_OFFLINK_ROUTE
748 nrt
= rt6_alloc_clone(rt
, &fl
->fl6_dst
);
754 dst_release(&rt
->u
.dst
);
755 rt
= nrt
? : &ip6_null_entry
;
757 dst_hold(&rt
->u
.dst
);
759 err
= ip6_ins_rt(nrt
);
768 * Race condition! In the gap, when table->tb6_lock was
769 * released someone could insert this route. Relookup.
771 dst_release(&rt
->u
.dst
);
779 dst_hold(&rt
->u
.dst
);
780 read_unlock_bh(&table
->tb6_lock
);
782 rt
->u
.dst
.lastuse
= jiffies
;
787 struct dst_entry
* ip6_route_output(struct sock
*sk
, struct flowi
*fl
)
791 if (rt6_need_strict(&fl
->fl6_dst
))
792 flags
|= RT6_LOOKUP_F_IFACE
;
794 return fib6_rule_lookup(fl
, flags
, ip6_pol_route_output
);
799 * Destination cache support functions
802 static struct dst_entry
*ip6_dst_check(struct dst_entry
*dst
, u32 cookie
)
806 rt
= (struct rt6_info
*) dst
;
808 if (rt
&& rt
->rt6i_node
&& (rt
->rt6i_node
->fn_sernum
== cookie
))
814 static struct dst_entry
*ip6_negative_advice(struct dst_entry
*dst
)
816 struct rt6_info
*rt
= (struct rt6_info
*) dst
;
819 if (rt
->rt6i_flags
& RTF_CACHE
)
827 static void ip6_link_failure(struct sk_buff
*skb
)
831 icmpv6_send(skb
, ICMPV6_DEST_UNREACH
, ICMPV6_ADDR_UNREACH
, 0, skb
->dev
);
833 rt
= (struct rt6_info
*) skb
->dst
;
835 if (rt
->rt6i_flags
&RTF_CACHE
) {
836 dst_set_expires(&rt
->u
.dst
, 0);
837 rt
->rt6i_flags
|= RTF_EXPIRES
;
838 } else if (rt
->rt6i_node
&& (rt
->rt6i_flags
& RTF_DEFAULT
))
839 rt
->rt6i_node
->fn_sernum
= -1;
843 static void ip6_rt_update_pmtu(struct dst_entry
*dst
, u32 mtu
)
845 struct rt6_info
*rt6
= (struct rt6_info
*)dst
;
847 if (mtu
< dst_mtu(dst
) && rt6
->rt6i_dst
.plen
== 128) {
848 rt6
->rt6i_flags
|= RTF_MODIFIED
;
849 if (mtu
< IPV6_MIN_MTU
) {
851 dst
->metrics
[RTAX_FEATURES
-1] |= RTAX_FEATURE_ALLFRAG
;
853 dst
->metrics
[RTAX_MTU
-1] = mtu
;
854 call_netevent_notifiers(NETEVENT_PMTU_UPDATE
, dst
);
858 static int ipv6_get_mtu(struct net_device
*dev
);
860 static inline unsigned int ipv6_advmss(unsigned int mtu
)
862 mtu
-= sizeof(struct ipv6hdr
) + sizeof(struct tcphdr
);
864 if (mtu
< ip6_rt_min_advmss
)
865 mtu
= ip6_rt_min_advmss
;
868 * Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and
869 * corresponding MSS is IPV6_MAXPLEN - tcp_header_size.
870 * IPV6_MAXPLEN is also valid and means: "any MSS,
871 * rely only on pmtu discovery"
873 if (mtu
> IPV6_MAXPLEN
- sizeof(struct tcphdr
))
878 static struct dst_entry
*ndisc_dst_gc_list
;
879 static DEFINE_SPINLOCK(ndisc_lock
);
881 struct dst_entry
*ndisc_dst_alloc(struct net_device
*dev
,
882 struct neighbour
*neigh
,
883 struct in6_addr
*addr
,
884 int (*output
)(struct sk_buff
*))
887 struct inet6_dev
*idev
= in6_dev_get(dev
);
889 if (unlikely(idev
== NULL
))
892 rt
= ip6_dst_alloc();
893 if (unlikely(rt
== NULL
)) {
902 neigh
= ndisc_get_neigh(dev
, addr
);
905 rt
->rt6i_idev
= idev
;
906 rt
->rt6i_nexthop
= neigh
;
907 atomic_set(&rt
->u
.dst
.__refcnt
, 1);
908 rt
->u
.dst
.metrics
[RTAX_HOPLIMIT
-1] = 255;
909 rt
->u
.dst
.metrics
[RTAX_MTU
-1] = ipv6_get_mtu(rt
->rt6i_dev
);
910 rt
->u
.dst
.metrics
[RTAX_ADVMSS
-1] = ipv6_advmss(dst_mtu(&rt
->u
.dst
));
911 rt
->u
.dst
.output
= output
;
913 #if 0 /* there's no chance to use these for ndisc */
914 rt
->u
.dst
.flags
= ipv6_addr_type(addr
) & IPV6_ADDR_UNICAST
917 ipv6_addr_copy(&rt
->rt6i_dst
.addr
, addr
);
918 rt
->rt6i_dst
.plen
= 128;
921 spin_lock_bh(&ndisc_lock
);
922 rt
->u
.dst
.next
= ndisc_dst_gc_list
;
923 ndisc_dst_gc_list
= &rt
->u
.dst
;
924 spin_unlock_bh(&ndisc_lock
);
926 fib6_force_start_gc();
929 return (struct dst_entry
*)rt
;
932 int ndisc_dst_gc(int *more
)
934 struct dst_entry
*dst
, *next
, **pprev
;
940 spin_lock_bh(&ndisc_lock
);
941 pprev
= &ndisc_dst_gc_list
;
943 while ((dst
= *pprev
) != NULL
) {
944 if (!atomic_read(&dst
->__refcnt
)) {
954 spin_unlock_bh(&ndisc_lock
);
959 static int ip6_dst_gc(void)
961 static unsigned expire
= 30*HZ
;
962 static unsigned long last_gc
;
963 unsigned long now
= jiffies
;
965 if (time_after(last_gc
+ ip6_rt_gc_min_interval
, now
) &&
966 atomic_read(&ip6_dst_ops
.entries
) <= ip6_rt_max_size
)
972 if (atomic_read(&ip6_dst_ops
.entries
) < ip6_dst_ops
.gc_thresh
)
973 expire
= ip6_rt_gc_timeout
>>1;
976 expire
-= expire
>>ip6_rt_gc_elasticity
;
977 return (atomic_read(&ip6_dst_ops
.entries
) > ip6_rt_max_size
);
980 /* Clean host part of a prefix. Not necessary in radix tree,
981 but results in cleaner routing tables.
983 Remove it only when all the things will work!
986 static int ipv6_get_mtu(struct net_device
*dev
)
988 int mtu
= IPV6_MIN_MTU
;
989 struct inet6_dev
*idev
;
991 idev
= in6_dev_get(dev
);
993 mtu
= idev
->cnf
.mtu6
;
999 int ipv6_get_hoplimit(struct net_device
*dev
)
1001 int hoplimit
= ipv6_devconf
.hop_limit
;
1002 struct inet6_dev
*idev
;
1004 idev
= in6_dev_get(dev
);
1006 hoplimit
= idev
->cnf
.hop_limit
;
1016 int ip6_route_add(struct fib6_config
*cfg
)
1019 struct rt6_info
*rt
= NULL
;
1020 struct net_device
*dev
= NULL
;
1021 struct inet6_dev
*idev
= NULL
;
1022 struct fib6_table
*table
;
1025 if (cfg
->fc_dst_len
> 128 || cfg
->fc_src_len
> 128)
1027 #ifndef CONFIG_IPV6_SUBTREES
1028 if (cfg
->fc_src_len
)
1031 if (cfg
->fc_ifindex
) {
1033 dev
= dev_get_by_index(cfg
->fc_ifindex
);
1036 idev
= in6_dev_get(dev
);
1041 if (cfg
->fc_metric
== 0)
1042 cfg
->fc_metric
= IP6_RT_PRIO_USER
;
1044 table
= fib6_new_table(cfg
->fc_table
);
1045 if (table
== NULL
) {
1050 rt
= ip6_dst_alloc();
1057 rt
->u
.dst
.obsolete
= -1;
1058 rt
->rt6i_expires
= jiffies
+ clock_t_to_jiffies(cfg
->fc_expires
);
1060 if (cfg
->fc_protocol
== RTPROT_UNSPEC
)
1061 cfg
->fc_protocol
= RTPROT_BOOT
;
1062 rt
->rt6i_protocol
= cfg
->fc_protocol
;
1064 addr_type
= ipv6_addr_type(&cfg
->fc_dst
);
1066 if (addr_type
& IPV6_ADDR_MULTICAST
)
1067 rt
->u
.dst
.input
= ip6_mc_input
;
1069 rt
->u
.dst
.input
= ip6_forward
;
1071 rt
->u
.dst
.output
= ip6_output
;
1073 ipv6_addr_prefix(&rt
->rt6i_dst
.addr
, &cfg
->fc_dst
, cfg
->fc_dst_len
);
1074 rt
->rt6i_dst
.plen
= cfg
->fc_dst_len
;
1075 if (rt
->rt6i_dst
.plen
== 128)
1076 rt
->u
.dst
.flags
= DST_HOST
;
1078 #ifdef CONFIG_IPV6_SUBTREES
1079 ipv6_addr_prefix(&rt
->rt6i_src
.addr
, &cfg
->fc_src
, cfg
->fc_src_len
);
1080 rt
->rt6i_src
.plen
= cfg
->fc_src_len
;
1083 rt
->rt6i_metric
= cfg
->fc_metric
;
1085 /* We cannot add true routes via loopback here,
1086 they would result in kernel looping; promote them to reject routes
1088 if ((cfg
->fc_flags
& RTF_REJECT
) ||
1089 (dev
&& (dev
->flags
&IFF_LOOPBACK
) && !(addr_type
&IPV6_ADDR_LOOPBACK
))) {
1090 /* hold loopback dev/idev if we haven't done so. */
1091 if (dev
!= &loopback_dev
) {
1096 dev
= &loopback_dev
;
1098 idev
= in6_dev_get(dev
);
1104 rt
->u
.dst
.output
= ip6_pkt_discard_out
;
1105 rt
->u
.dst
.input
= ip6_pkt_discard
;
1106 rt
->u
.dst
.error
= -ENETUNREACH
;
1107 rt
->rt6i_flags
= RTF_REJECT
|RTF_NONEXTHOP
;
1111 if (cfg
->fc_flags
& RTF_GATEWAY
) {
1112 struct in6_addr
*gw_addr
;
1115 gw_addr
= &cfg
->fc_gateway
;
1116 ipv6_addr_copy(&rt
->rt6i_gateway
, gw_addr
);
1117 gwa_type
= ipv6_addr_type(gw_addr
);
1119 if (gwa_type
!= (IPV6_ADDR_LINKLOCAL
|IPV6_ADDR_UNICAST
)) {
1120 struct rt6_info
*grt
;
1122 /* IPv6 strictly inhibits using not link-local
1123 addresses as nexthop address.
1124 Otherwise, router will not able to send redirects.
1125 It is very good, but in some (rare!) circumstances
1126 (SIT, PtP, NBMA NOARP links) it is handy to allow
1127 some exceptions. --ANK
1130 if (!(gwa_type
&IPV6_ADDR_UNICAST
))
1133 grt
= rt6_lookup(gw_addr
, NULL
, cfg
->fc_ifindex
, 1);
1135 err
= -EHOSTUNREACH
;
1139 if (dev
!= grt
->rt6i_dev
) {
1140 dst_release(&grt
->u
.dst
);
1144 dev
= grt
->rt6i_dev
;
1145 idev
= grt
->rt6i_idev
;
1147 in6_dev_hold(grt
->rt6i_idev
);
1149 if (!(grt
->rt6i_flags
&RTF_GATEWAY
))
1151 dst_release(&grt
->u
.dst
);
1157 if (dev
== NULL
|| (dev
->flags
&IFF_LOOPBACK
))
1165 if (cfg
->fc_flags
& (RTF_GATEWAY
| RTF_NONEXTHOP
)) {
1166 rt
->rt6i_nexthop
= __neigh_lookup_errno(&nd_tbl
, &rt
->rt6i_gateway
, dev
);
1167 if (IS_ERR(rt
->rt6i_nexthop
)) {
1168 err
= PTR_ERR(rt
->rt6i_nexthop
);
1169 rt
->rt6i_nexthop
= NULL
;
1174 rt
->rt6i_flags
= cfg
->fc_flags
;
1181 nla_for_each_attr(nla
, cfg
->fc_mx
, cfg
->fc_mx_len
, remaining
) {
1182 int type
= nla
->nla_type
;
1185 if (type
> RTAX_MAX
) {
1190 rt
->u
.dst
.metrics
[type
- 1] = nla_get_u32(nla
);
1195 if (rt
->u
.dst
.metrics
[RTAX_HOPLIMIT
-1] == 0)
1196 rt
->u
.dst
.metrics
[RTAX_HOPLIMIT
-1] = -1;
1197 if (!rt
->u
.dst
.metrics
[RTAX_MTU
-1])
1198 rt
->u
.dst
.metrics
[RTAX_MTU
-1] = ipv6_get_mtu(dev
);
1199 if (!rt
->u
.dst
.metrics
[RTAX_ADVMSS
-1])
1200 rt
->u
.dst
.metrics
[RTAX_ADVMSS
-1] = ipv6_advmss(dst_mtu(&rt
->u
.dst
));
1201 rt
->u
.dst
.dev
= dev
;
1202 rt
->rt6i_idev
= idev
;
1203 rt
->rt6i_table
= table
;
1204 return __ip6_ins_rt(rt
, &cfg
->fc_nlinfo
);
1212 dst_free((struct dst_entry
*) rt
);
1216 static int __ip6_del_rt(struct rt6_info
*rt
, struct nl_info
*info
)
1219 struct fib6_table
*table
;
1221 if (rt
== &ip6_null_entry
)
1224 table
= rt
->rt6i_table
;
1225 write_lock_bh(&table
->tb6_lock
);
1227 err
= fib6_del(rt
, info
);
1228 dst_release(&rt
->u
.dst
);
1230 write_unlock_bh(&table
->tb6_lock
);
1235 int ip6_del_rt(struct rt6_info
*rt
)
1237 return __ip6_del_rt(rt
, NULL
);
1240 static int ip6_route_del(struct fib6_config
*cfg
)
1242 struct fib6_table
*table
;
1243 struct fib6_node
*fn
;
1244 struct rt6_info
*rt
;
1247 table
= fib6_get_table(cfg
->fc_table
);
1251 read_lock_bh(&table
->tb6_lock
);
1253 fn
= fib6_locate(&table
->tb6_root
,
1254 &cfg
->fc_dst
, cfg
->fc_dst_len
,
1255 &cfg
->fc_src
, cfg
->fc_src_len
);
1258 for (rt
= fn
->leaf
; rt
; rt
= rt
->u
.next
) {
1259 if (cfg
->fc_ifindex
&&
1260 (rt
->rt6i_dev
== NULL
||
1261 rt
->rt6i_dev
->ifindex
!= cfg
->fc_ifindex
))
1263 if (cfg
->fc_flags
& RTF_GATEWAY
&&
1264 !ipv6_addr_equal(&cfg
->fc_gateway
, &rt
->rt6i_gateway
))
1266 if (cfg
->fc_metric
&& cfg
->fc_metric
!= rt
->rt6i_metric
)
1268 dst_hold(&rt
->u
.dst
);
1269 read_unlock_bh(&table
->tb6_lock
);
1271 return __ip6_del_rt(rt
, &cfg
->fc_nlinfo
);
1274 read_unlock_bh(&table
->tb6_lock
);
1282 struct ip6rd_flowi
{
1284 struct in6_addr gateway
;
1287 static struct rt6_info
*__ip6_route_redirect(struct fib6_table
*table
,
1291 struct ip6rd_flowi
*rdfl
= (struct ip6rd_flowi
*)fl
;
1292 struct rt6_info
*rt
;
1293 struct fib6_node
*fn
;
1296 * Get the "current" route for this destination and
1297 * check if the redirect has come from approriate router.
1299 * RFC 2461 specifies that redirects should only be
1300 * accepted if they come from the nexthop to the target.
1301 * Due to the way the routes are chosen, this notion
1302 * is a bit fuzzy and one might need to check all possible
1306 read_lock_bh(&table
->tb6_lock
);
1307 fn
= fib6_lookup(&table
->tb6_root
, &fl
->fl6_dst
, &fl
->fl6_src
);
1309 for (rt
= fn
->leaf
; rt
; rt
= rt
->u
.next
) {
1311 * Current route is on-link; redirect is always invalid.
1313 * Seems, previous statement is not true. It could
1314 * be node, which looks for us as on-link (f.e. proxy ndisc)
1315 * But then router serving it might decide, that we should
1316 * know truth 8)8) --ANK (980726).
1318 if (rt6_check_expired(rt
))
1320 if (!(rt
->rt6i_flags
& RTF_GATEWAY
))
1322 if (fl
->oif
!= rt
->rt6i_dev
->ifindex
)
1324 if (!ipv6_addr_equal(&rdfl
->gateway
, &rt
->rt6i_gateway
))
1330 rt
= &ip6_null_entry
;
1331 BACKTRACK(&fl
->fl6_src
);
1333 dst_hold(&rt
->u
.dst
);
1335 read_unlock_bh(&table
->tb6_lock
);
1340 static struct rt6_info
*ip6_route_redirect(struct in6_addr
*dest
,
1341 struct in6_addr
*src
,
1342 struct in6_addr
*gateway
,
1343 struct net_device
*dev
)
1345 struct ip6rd_flowi rdfl
= {
1347 .oif
= dev
->ifindex
,
1355 .gateway
= *gateway
,
1357 int flags
= rt6_need_strict(dest
) ? RT6_LOOKUP_F_IFACE
: 0;
1359 return (struct rt6_info
*)fib6_rule_lookup((struct flowi
*)&rdfl
, flags
, __ip6_route_redirect
);
1362 void rt6_redirect(struct in6_addr
*dest
, struct in6_addr
*src
,
1363 struct in6_addr
*saddr
,
1364 struct neighbour
*neigh
, u8
*lladdr
, int on_link
)
1366 struct rt6_info
*rt
, *nrt
= NULL
;
1367 struct netevent_redirect netevent
;
1369 rt
= ip6_route_redirect(dest
, src
, saddr
, neigh
->dev
);
1371 if (rt
== &ip6_null_entry
) {
1372 if (net_ratelimit())
1373 printk(KERN_DEBUG
"rt6_redirect: source isn't a valid nexthop "
1374 "for redirect target\n");
1379 * We have finally decided to accept it.
1382 neigh_update(neigh
, lladdr
, NUD_STALE
,
1383 NEIGH_UPDATE_F_WEAK_OVERRIDE
|
1384 NEIGH_UPDATE_F_OVERRIDE
|
1385 (on_link
? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER
|
1386 NEIGH_UPDATE_F_ISROUTER
))
1390 * Redirect received -> path was valid.
1391 * Look, redirects are sent only in response to data packets,
1392 * so that this nexthop apparently is reachable. --ANK
1394 dst_confirm(&rt
->u
.dst
);
1396 /* Duplicate redirect: silently ignore. */
1397 if (neigh
== rt
->u
.dst
.neighbour
)
1400 nrt
= ip6_rt_copy(rt
);
1404 nrt
->rt6i_flags
= RTF_GATEWAY
|RTF_UP
|RTF_DYNAMIC
|RTF_CACHE
;
1406 nrt
->rt6i_flags
&= ~RTF_GATEWAY
;
1408 ipv6_addr_copy(&nrt
->rt6i_dst
.addr
, dest
);
1409 nrt
->rt6i_dst
.plen
= 128;
1410 nrt
->u
.dst
.flags
|= DST_HOST
;
1412 ipv6_addr_copy(&nrt
->rt6i_gateway
, (struct in6_addr
*)neigh
->primary_key
);
1413 nrt
->rt6i_nexthop
= neigh_clone(neigh
);
1414 /* Reset pmtu, it may be better */
1415 nrt
->u
.dst
.metrics
[RTAX_MTU
-1] = ipv6_get_mtu(neigh
->dev
);
1416 nrt
->u
.dst
.metrics
[RTAX_ADVMSS
-1] = ipv6_advmss(dst_mtu(&nrt
->u
.dst
));
1418 if (ip6_ins_rt(nrt
))
1421 netevent
.old
= &rt
->u
.dst
;
1422 netevent
.new = &nrt
->u
.dst
;
1423 call_netevent_notifiers(NETEVENT_REDIRECT
, &netevent
);
1425 if (rt
->rt6i_flags
&RTF_CACHE
) {
1431 dst_release(&rt
->u
.dst
);
1436 * Handle ICMP "packet too big" messages
1437 * i.e. Path MTU discovery
1440 void rt6_pmtu_discovery(struct in6_addr
*daddr
, struct in6_addr
*saddr
,
1441 struct net_device
*dev
, u32 pmtu
)
1443 struct rt6_info
*rt
, *nrt
;
1446 rt
= rt6_lookup(daddr
, saddr
, dev
->ifindex
, 0);
1450 if (pmtu
>= dst_mtu(&rt
->u
.dst
))
1453 if (pmtu
< IPV6_MIN_MTU
) {
1455 * According to RFC2460, PMTU is set to the IPv6 Minimum Link
1456 * MTU (1280) and a fragment header should always be included
1457 * after a node receiving Too Big message reporting PMTU is
1458 * less than the IPv6 Minimum Link MTU.
1460 pmtu
= IPV6_MIN_MTU
;
1464 /* New mtu received -> path was valid.
1465 They are sent only in response to data packets,
1466 so that this nexthop apparently is reachable. --ANK
1468 dst_confirm(&rt
->u
.dst
);
1470 /* Host route. If it is static, it would be better
1471 not to override it, but add new one, so that
1472 when cache entry will expire old pmtu
1473 would return automatically.
1475 if (rt
->rt6i_flags
& RTF_CACHE
) {
1476 rt
->u
.dst
.metrics
[RTAX_MTU
-1] = pmtu
;
1478 rt
->u
.dst
.metrics
[RTAX_FEATURES
-1] |= RTAX_FEATURE_ALLFRAG
;
1479 dst_set_expires(&rt
->u
.dst
, ip6_rt_mtu_expires
);
1480 rt
->rt6i_flags
|= RTF_MODIFIED
|RTF_EXPIRES
;
1485 Two cases are possible:
1486 1. It is connected route. Action: COW
1487 2. It is gatewayed route or NONEXTHOP route. Action: clone it.
1489 if (!rt
->rt6i_nexthop
&& !(rt
->rt6i_flags
& RTF_NONEXTHOP
))
1490 nrt
= rt6_alloc_cow(rt
, daddr
, saddr
);
1492 nrt
= rt6_alloc_clone(rt
, daddr
);
1495 nrt
->u
.dst
.metrics
[RTAX_MTU
-1] = pmtu
;
1497 nrt
->u
.dst
.metrics
[RTAX_FEATURES
-1] |= RTAX_FEATURE_ALLFRAG
;
1499 /* According to RFC 1981, detecting PMTU increase shouldn't be
1500 * happened within 5 mins, the recommended timer is 10 mins.
1501 * Here this route expiration time is set to ip6_rt_mtu_expires
1502 * which is 10 mins. After 10 mins the decreased pmtu is expired
1503 * and detecting PMTU increase will be automatically happened.
1505 dst_set_expires(&nrt
->u
.dst
, ip6_rt_mtu_expires
);
1506 nrt
->rt6i_flags
|= RTF_DYNAMIC
|RTF_EXPIRES
;
1511 dst_release(&rt
->u
.dst
);
1515 * Misc support functions
1518 static struct rt6_info
* ip6_rt_copy(struct rt6_info
*ort
)
1520 struct rt6_info
*rt
= ip6_dst_alloc();
1523 rt
->u
.dst
.input
= ort
->u
.dst
.input
;
1524 rt
->u
.dst
.output
= ort
->u
.dst
.output
;
1526 memcpy(rt
->u
.dst
.metrics
, ort
->u
.dst
.metrics
, RTAX_MAX
*sizeof(u32
));
1527 rt
->u
.dst
.dev
= ort
->u
.dst
.dev
;
1529 dev_hold(rt
->u
.dst
.dev
);
1530 rt
->rt6i_idev
= ort
->rt6i_idev
;
1532 in6_dev_hold(rt
->rt6i_idev
);
1533 rt
->u
.dst
.lastuse
= jiffies
;
1534 rt
->rt6i_expires
= 0;
1536 ipv6_addr_copy(&rt
->rt6i_gateway
, &ort
->rt6i_gateway
);
1537 rt
->rt6i_flags
= ort
->rt6i_flags
& ~RTF_EXPIRES
;
1538 rt
->rt6i_metric
= 0;
1540 memcpy(&rt
->rt6i_dst
, &ort
->rt6i_dst
, sizeof(struct rt6key
));
1541 #ifdef CONFIG_IPV6_SUBTREES
1542 memcpy(&rt
->rt6i_src
, &ort
->rt6i_src
, sizeof(struct rt6key
));
1544 rt
->rt6i_table
= ort
->rt6i_table
;
1549 #ifdef CONFIG_IPV6_ROUTE_INFO
1550 static struct rt6_info
*rt6_get_route_info(struct in6_addr
*prefix
, int prefixlen
,
1551 struct in6_addr
*gwaddr
, int ifindex
)
1553 struct fib6_node
*fn
;
1554 struct rt6_info
*rt
= NULL
;
1555 struct fib6_table
*table
;
1557 table
= fib6_get_table(RT6_TABLE_INFO
);
1561 write_lock_bh(&table
->tb6_lock
);
1562 fn
= fib6_locate(&table
->tb6_root
, prefix
,prefixlen
, NULL
, 0);
1566 for (rt
= fn
->leaf
; rt
; rt
= rt
->u
.next
) {
1567 if (rt
->rt6i_dev
->ifindex
!= ifindex
)
1569 if ((rt
->rt6i_flags
& (RTF_ROUTEINFO
|RTF_GATEWAY
)) != (RTF_ROUTEINFO
|RTF_GATEWAY
))
1571 if (!ipv6_addr_equal(&rt
->rt6i_gateway
, gwaddr
))
1573 dst_hold(&rt
->u
.dst
);
1577 write_unlock_bh(&table
->tb6_lock
);
1581 static struct rt6_info
*rt6_add_route_info(struct in6_addr
*prefix
, int prefixlen
,
1582 struct in6_addr
*gwaddr
, int ifindex
,
1585 struct fib6_config cfg
= {
1586 .fc_table
= RT6_TABLE_INFO
,
1588 .fc_ifindex
= ifindex
,
1589 .fc_dst_len
= prefixlen
,
1590 .fc_flags
= RTF_GATEWAY
| RTF_ADDRCONF
| RTF_ROUTEINFO
|
1591 RTF_UP
| RTF_PREF(pref
),
1594 ipv6_addr_copy(&cfg
.fc_dst
, prefix
);
1595 ipv6_addr_copy(&cfg
.fc_gateway
, gwaddr
);
1597 /* We should treat it as a default route if prefix length is 0. */
1599 cfg
.fc_flags
|= RTF_DEFAULT
;
1601 ip6_route_add(&cfg
);
1603 return rt6_get_route_info(prefix
, prefixlen
, gwaddr
, ifindex
);
1607 struct rt6_info
*rt6_get_dflt_router(struct in6_addr
*addr
, struct net_device
*dev
)
1609 struct rt6_info
*rt
;
1610 struct fib6_table
*table
;
1612 table
= fib6_get_table(RT6_TABLE_DFLT
);
1616 write_lock_bh(&table
->tb6_lock
);
1617 for (rt
= table
->tb6_root
.leaf
; rt
; rt
=rt
->u
.next
) {
1618 if (dev
== rt
->rt6i_dev
&&
1619 ((rt
->rt6i_flags
& (RTF_ADDRCONF
| RTF_DEFAULT
)) == (RTF_ADDRCONF
| RTF_DEFAULT
)) &&
1620 ipv6_addr_equal(&rt
->rt6i_gateway
, addr
))
1624 dst_hold(&rt
->u
.dst
);
1625 write_unlock_bh(&table
->tb6_lock
);
1629 struct rt6_info
*rt6_add_dflt_router(struct in6_addr
*gwaddr
,
1630 struct net_device
*dev
,
1633 struct fib6_config cfg
= {
1634 .fc_table
= RT6_TABLE_DFLT
,
1636 .fc_ifindex
= dev
->ifindex
,
1637 .fc_flags
= RTF_GATEWAY
| RTF_ADDRCONF
| RTF_DEFAULT
|
1638 RTF_UP
| RTF_EXPIRES
| RTF_PREF(pref
),
1641 ipv6_addr_copy(&cfg
.fc_gateway
, gwaddr
);
1643 ip6_route_add(&cfg
);
1645 return rt6_get_dflt_router(gwaddr
, dev
);
1648 void rt6_purge_dflt_routers(void)
1650 struct rt6_info
*rt
;
1651 struct fib6_table
*table
;
1653 /* NOTE: Keep consistent with rt6_get_dflt_router */
1654 table
= fib6_get_table(RT6_TABLE_DFLT
);
1659 read_lock_bh(&table
->tb6_lock
);
1660 for (rt
= table
->tb6_root
.leaf
; rt
; rt
= rt
->u
.next
) {
1661 if (rt
->rt6i_flags
& (RTF_DEFAULT
| RTF_ADDRCONF
)) {
1662 dst_hold(&rt
->u
.dst
);
1663 read_unlock_bh(&table
->tb6_lock
);
1668 read_unlock_bh(&table
->tb6_lock
);
1671 static void rtmsg_to_fib6_config(struct in6_rtmsg
*rtmsg
,
1672 struct fib6_config
*cfg
)
1674 memset(cfg
, 0, sizeof(*cfg
));
1676 cfg
->fc_table
= RT6_TABLE_MAIN
;
1677 cfg
->fc_ifindex
= rtmsg
->rtmsg_ifindex
;
1678 cfg
->fc_metric
= rtmsg
->rtmsg_metric
;
1679 cfg
->fc_expires
= rtmsg
->rtmsg_info
;
1680 cfg
->fc_dst_len
= rtmsg
->rtmsg_dst_len
;
1681 cfg
->fc_src_len
= rtmsg
->rtmsg_src_len
;
1682 cfg
->fc_flags
= rtmsg
->rtmsg_flags
;
1684 ipv6_addr_copy(&cfg
->fc_dst
, &rtmsg
->rtmsg_dst
);
1685 ipv6_addr_copy(&cfg
->fc_src
, &rtmsg
->rtmsg_src
);
1686 ipv6_addr_copy(&cfg
->fc_gateway
, &rtmsg
->rtmsg_gateway
);
1689 int ipv6_route_ioctl(unsigned int cmd
, void __user
*arg
)
1691 struct fib6_config cfg
;
1692 struct in6_rtmsg rtmsg
;
1696 case SIOCADDRT
: /* Add a route */
1697 case SIOCDELRT
: /* Delete a route */
1698 if (!capable(CAP_NET_ADMIN
))
1700 err
= copy_from_user(&rtmsg
, arg
,
1701 sizeof(struct in6_rtmsg
));
1705 rtmsg_to_fib6_config(&rtmsg
, &cfg
);
1710 err
= ip6_route_add(&cfg
);
1713 err
= ip6_route_del(&cfg
);
1727 * Drop the packet on the floor
1730 static int ip6_pkt_discard(struct sk_buff
*skb
)
1732 int type
= ipv6_addr_type(&skb
->nh
.ipv6h
->daddr
);
1733 if (type
== IPV6_ADDR_ANY
|| type
== IPV6_ADDR_RESERVED
)
1734 IP6_INC_STATS(IPSTATS_MIB_INADDRERRORS
);
1736 IP6_INC_STATS(IPSTATS_MIB_OUTNOROUTES
);
1737 icmpv6_send(skb
, ICMPV6_DEST_UNREACH
, ICMPV6_NOROUTE
, 0, skb
->dev
);
1742 static int ip6_pkt_discard_out(struct sk_buff
*skb
)
1744 skb
->dev
= skb
->dst
->dev
;
1745 return ip6_pkt_discard(skb
);
1749 * Allocate a dst for local (unicast / anycast) address.
1752 struct rt6_info
*addrconf_dst_alloc(struct inet6_dev
*idev
,
1753 const struct in6_addr
*addr
,
1756 struct rt6_info
*rt
= ip6_dst_alloc();
1759 return ERR_PTR(-ENOMEM
);
1761 dev_hold(&loopback_dev
);
1764 rt
->u
.dst
.flags
= DST_HOST
;
1765 rt
->u
.dst
.input
= ip6_input
;
1766 rt
->u
.dst
.output
= ip6_output
;
1767 rt
->rt6i_dev
= &loopback_dev
;
1768 rt
->rt6i_idev
= idev
;
1769 rt
->u
.dst
.metrics
[RTAX_MTU
-1] = ipv6_get_mtu(rt
->rt6i_dev
);
1770 rt
->u
.dst
.metrics
[RTAX_ADVMSS
-1] = ipv6_advmss(dst_mtu(&rt
->u
.dst
));
1771 rt
->u
.dst
.metrics
[RTAX_HOPLIMIT
-1] = -1;
1772 rt
->u
.dst
.obsolete
= -1;
1774 rt
->rt6i_flags
= RTF_UP
| RTF_NONEXTHOP
;
1776 rt
->rt6i_flags
|= RTF_ANYCAST
;
1778 rt
->rt6i_flags
|= RTF_LOCAL
;
1779 rt
->rt6i_nexthop
= ndisc_get_neigh(rt
->rt6i_dev
, &rt
->rt6i_gateway
);
1780 if (rt
->rt6i_nexthop
== NULL
) {
1781 dst_free((struct dst_entry
*) rt
);
1782 return ERR_PTR(-ENOMEM
);
1785 ipv6_addr_copy(&rt
->rt6i_dst
.addr
, addr
);
1786 rt
->rt6i_dst
.plen
= 128;
1787 rt
->rt6i_table
= fib6_get_table(RT6_TABLE_LOCAL
);
1789 atomic_set(&rt
->u
.dst
.__refcnt
, 1);
1794 static int fib6_ifdown(struct rt6_info
*rt
, void *arg
)
1796 if (((void*)rt
->rt6i_dev
== arg
|| arg
== NULL
) &&
1797 rt
!= &ip6_null_entry
) {
1798 RT6_TRACE("deleted by ifdown %p\n", rt
);
1804 void rt6_ifdown(struct net_device
*dev
)
1806 fib6_clean_all(fib6_ifdown
, 0, dev
);
1809 struct rt6_mtu_change_arg
1811 struct net_device
*dev
;
1815 static int rt6_mtu_change_route(struct rt6_info
*rt
, void *p_arg
)
1817 struct rt6_mtu_change_arg
*arg
= (struct rt6_mtu_change_arg
*) p_arg
;
1818 struct inet6_dev
*idev
;
1820 /* In IPv6 pmtu discovery is not optional,
1821 so that RTAX_MTU lock cannot disable it.
1822 We still use this lock to block changes
1823 caused by addrconf/ndisc.
1826 idev
= __in6_dev_get(arg
->dev
);
1830 /* For administrative MTU increase, there is no way to discover
1831 IPv6 PMTU increase, so PMTU increase should be updated here.
1832 Since RFC 1981 doesn't include administrative MTU increase
1833 update PMTU increase is a MUST. (i.e. jumbo frame)
1836 If new MTU is less than route PMTU, this new MTU will be the
1837 lowest MTU in the path, update the route PMTU to reflect PMTU
1838 decreases; if new MTU is greater than route PMTU, and the
1839 old MTU is the lowest MTU in the path, update the route PMTU
1840 to reflect the increase. In this case if the other nodes' MTU
1841 also have the lowest MTU, TOO BIG MESSAGE will be lead to
1844 if (rt
->rt6i_dev
== arg
->dev
&&
1845 !dst_metric_locked(&rt
->u
.dst
, RTAX_MTU
) &&
1846 (dst_mtu(&rt
->u
.dst
) > arg
->mtu
||
1847 (dst_mtu(&rt
->u
.dst
) < arg
->mtu
&&
1848 dst_mtu(&rt
->u
.dst
) == idev
->cnf
.mtu6
)))
1849 rt
->u
.dst
.metrics
[RTAX_MTU
-1] = arg
->mtu
;
1850 rt
->u
.dst
.metrics
[RTAX_ADVMSS
-1] = ipv6_advmss(arg
->mtu
);
1854 void rt6_mtu_change(struct net_device
*dev
, unsigned mtu
)
1856 struct rt6_mtu_change_arg arg
= {
1861 fib6_clean_all(rt6_mtu_change_route
, 0, &arg
);
1864 static struct nla_policy rtm_ipv6_policy
[RTA_MAX
+1] __read_mostly
= {
1865 [RTA_GATEWAY
] = { .minlen
= sizeof(struct in6_addr
) },
1866 [RTA_OIF
] = { .type
= NLA_U32
},
1867 [RTA_IIF
] = { .type
= NLA_U32
},
1868 [RTA_PRIORITY
] = { .type
= NLA_U32
},
1869 [RTA_METRICS
] = { .type
= NLA_NESTED
},
1872 static int rtm_to_fib6_config(struct sk_buff
*skb
, struct nlmsghdr
*nlh
,
1873 struct fib6_config
*cfg
)
1876 struct nlattr
*tb
[RTA_MAX
+1];
1879 err
= nlmsg_parse(nlh
, sizeof(*rtm
), tb
, RTA_MAX
, rtm_ipv6_policy
);
1884 rtm
= nlmsg_data(nlh
);
1885 memset(cfg
, 0, sizeof(*cfg
));
1887 cfg
->fc_table
= rtm
->rtm_table
;
1888 cfg
->fc_dst_len
= rtm
->rtm_dst_len
;
1889 cfg
->fc_src_len
= rtm
->rtm_src_len
;
1890 cfg
->fc_flags
= RTF_UP
;
1891 cfg
->fc_protocol
= rtm
->rtm_protocol
;
1893 if (rtm
->rtm_type
== RTN_UNREACHABLE
)
1894 cfg
->fc_flags
|= RTF_REJECT
;
1896 cfg
->fc_nlinfo
.pid
= NETLINK_CB(skb
).pid
;
1897 cfg
->fc_nlinfo
.nlh
= nlh
;
1899 if (tb
[RTA_GATEWAY
]) {
1900 nla_memcpy(&cfg
->fc_gateway
, tb
[RTA_GATEWAY
], 16);
1901 cfg
->fc_flags
|= RTF_GATEWAY
;
1905 int plen
= (rtm
->rtm_dst_len
+ 7) >> 3;
1907 if (nla_len(tb
[RTA_DST
]) < plen
)
1910 nla_memcpy(&cfg
->fc_dst
, tb
[RTA_DST
], plen
);
1914 int plen
= (rtm
->rtm_src_len
+ 7) >> 3;
1916 if (nla_len(tb
[RTA_SRC
]) < plen
)
1919 nla_memcpy(&cfg
->fc_src
, tb
[RTA_SRC
], plen
);
1923 cfg
->fc_ifindex
= nla_get_u32(tb
[RTA_OIF
]);
1925 if (tb
[RTA_PRIORITY
])
1926 cfg
->fc_metric
= nla_get_u32(tb
[RTA_PRIORITY
]);
1928 if (tb
[RTA_METRICS
]) {
1929 cfg
->fc_mx
= nla_data(tb
[RTA_METRICS
]);
1930 cfg
->fc_mx_len
= nla_len(tb
[RTA_METRICS
]);
1934 cfg
->fc_table
= nla_get_u32(tb
[RTA_TABLE
]);
1941 int inet6_rtm_delroute(struct sk_buff
*skb
, struct nlmsghdr
* nlh
, void *arg
)
1943 struct fib6_config cfg
;
1946 err
= rtm_to_fib6_config(skb
, nlh
, &cfg
);
1950 return ip6_route_del(&cfg
);
1953 int inet6_rtm_newroute(struct sk_buff
*skb
, struct nlmsghdr
* nlh
, void *arg
)
1955 struct fib6_config cfg
;
1958 err
= rtm_to_fib6_config(skb
, nlh
, &cfg
);
1962 return ip6_route_add(&cfg
);
1965 static int rt6_fill_node(struct sk_buff
*skb
, struct rt6_info
*rt
,
1966 struct in6_addr
*dst
, struct in6_addr
*src
,
1967 int iif
, int type
, u32 pid
, u32 seq
,
1968 int prefix
, unsigned int flags
)
1971 struct nlmsghdr
*nlh
;
1972 struct rta_cacheinfo ci
;
1975 if (prefix
) { /* user wants prefix routes only */
1976 if (!(rt
->rt6i_flags
& RTF_PREFIX_RT
)) {
1977 /* success since this is not a prefix route */
1982 nlh
= nlmsg_put(skb
, pid
, seq
, type
, sizeof(*rtm
), flags
);
1986 rtm
= nlmsg_data(nlh
);
1987 rtm
->rtm_family
= AF_INET6
;
1988 rtm
->rtm_dst_len
= rt
->rt6i_dst
.plen
;
1989 rtm
->rtm_src_len
= rt
->rt6i_src
.plen
;
1992 table
= rt
->rt6i_table
->tb6_id
;
1994 table
= RT6_TABLE_UNSPEC
;
1995 rtm
->rtm_table
= table
;
1996 NLA_PUT_U32(skb
, RTA_TABLE
, table
);
1997 if (rt
->rt6i_flags
&RTF_REJECT
)
1998 rtm
->rtm_type
= RTN_UNREACHABLE
;
1999 else if (rt
->rt6i_dev
&& (rt
->rt6i_dev
->flags
&IFF_LOOPBACK
))
2000 rtm
->rtm_type
= RTN_LOCAL
;
2002 rtm
->rtm_type
= RTN_UNICAST
;
2004 rtm
->rtm_scope
= RT_SCOPE_UNIVERSE
;
2005 rtm
->rtm_protocol
= rt
->rt6i_protocol
;
2006 if (rt
->rt6i_flags
&RTF_DYNAMIC
)
2007 rtm
->rtm_protocol
= RTPROT_REDIRECT
;
2008 else if (rt
->rt6i_flags
& RTF_ADDRCONF
)
2009 rtm
->rtm_protocol
= RTPROT_KERNEL
;
2010 else if (rt
->rt6i_flags
&RTF_DEFAULT
)
2011 rtm
->rtm_protocol
= RTPROT_RA
;
2013 if (rt
->rt6i_flags
&RTF_CACHE
)
2014 rtm
->rtm_flags
|= RTM_F_CLONED
;
2017 NLA_PUT(skb
, RTA_DST
, 16, dst
);
2018 rtm
->rtm_dst_len
= 128;
2019 } else if (rtm
->rtm_dst_len
)
2020 NLA_PUT(skb
, RTA_DST
, 16, &rt
->rt6i_dst
.addr
);
2021 #ifdef CONFIG_IPV6_SUBTREES
2023 NLA_PUT(skb
, RTA_SRC
, 16, src
);
2024 rtm
->rtm_src_len
= 128;
2025 } else if (rtm
->rtm_src_len
)
2026 NLA_PUT(skb
, RTA_SRC
, 16, &rt
->rt6i_src
.addr
);
2029 NLA_PUT_U32(skb
, RTA_IIF
, iif
);
2031 struct in6_addr saddr_buf
;
2032 if (ipv6_get_saddr(&rt
->u
.dst
, dst
, &saddr_buf
) == 0)
2033 NLA_PUT(skb
, RTA_PREFSRC
, 16, &saddr_buf
);
2036 if (rtnetlink_put_metrics(skb
, rt
->u
.dst
.metrics
) < 0)
2037 goto nla_put_failure
;
2039 if (rt
->u
.dst
.neighbour
)
2040 NLA_PUT(skb
, RTA_GATEWAY
, 16, &rt
->u
.dst
.neighbour
->primary_key
);
2043 NLA_PUT_U32(skb
, RTA_OIF
, rt
->rt6i_dev
->ifindex
);
2045 NLA_PUT_U32(skb
, RTA_PRIORITY
, rt
->rt6i_metric
);
2046 ci
.rta_lastuse
= jiffies_to_clock_t(jiffies
- rt
->u
.dst
.lastuse
);
2047 if (rt
->rt6i_expires
)
2048 ci
.rta_expires
= jiffies_to_clock_t(rt
->rt6i_expires
- jiffies
);
2051 ci
.rta_used
= rt
->u
.dst
.__use
;
2052 ci
.rta_clntref
= atomic_read(&rt
->u
.dst
.__refcnt
);
2053 ci
.rta_error
= rt
->u
.dst
.error
;
2057 NLA_PUT(skb
, RTA_CACHEINFO
, sizeof(ci
), &ci
);
2059 return nlmsg_end(skb
, nlh
);
2062 return nlmsg_cancel(skb
, nlh
);
2065 int rt6_dump_route(struct rt6_info
*rt
, void *p_arg
)
2067 struct rt6_rtnl_dump_arg
*arg
= (struct rt6_rtnl_dump_arg
*) p_arg
;
2070 if (nlmsg_len(arg
->cb
->nlh
) >= sizeof(struct rtmsg
)) {
2071 struct rtmsg
*rtm
= nlmsg_data(arg
->cb
->nlh
);
2072 prefix
= (rtm
->rtm_flags
& RTM_F_PREFIX
) != 0;
2076 return rt6_fill_node(arg
->skb
, rt
, NULL
, NULL
, 0, RTM_NEWROUTE
,
2077 NETLINK_CB(arg
->cb
->skb
).pid
, arg
->cb
->nlh
->nlmsg_seq
,
2078 prefix
, NLM_F_MULTI
);
2081 int inet6_rtm_getroute(struct sk_buff
*in_skb
, struct nlmsghdr
* nlh
, void *arg
)
2083 struct nlattr
*tb
[RTA_MAX
+1];
2084 struct rt6_info
*rt
;
2085 struct sk_buff
*skb
;
2090 err
= nlmsg_parse(nlh
, sizeof(*rtm
), tb
, RTA_MAX
, rtm_ipv6_policy
);
2095 memset(&fl
, 0, sizeof(fl
));
2098 if (nla_len(tb
[RTA_SRC
]) < sizeof(struct in6_addr
))
2101 ipv6_addr_copy(&fl
.fl6_src
, nla_data(tb
[RTA_SRC
]));
2105 if (nla_len(tb
[RTA_DST
]) < sizeof(struct in6_addr
))
2108 ipv6_addr_copy(&fl
.fl6_dst
, nla_data(tb
[RTA_DST
]));
2112 iif
= nla_get_u32(tb
[RTA_IIF
]);
2115 fl
.oif
= nla_get_u32(tb
[RTA_OIF
]);
2118 struct net_device
*dev
;
2119 dev
= __dev_get_by_index(iif
);
2126 skb
= alloc_skb(NLMSG_GOODSIZE
, GFP_KERNEL
);
2132 /* Reserve room for dummy headers, this skb can pass
2133 through good chunk of routing engine.
2135 skb
->mac
.raw
= skb
->data
;
2136 skb_reserve(skb
, MAX_HEADER
+ sizeof(struct ipv6hdr
));
2138 rt
= (struct rt6_info
*) ip6_route_output(NULL
, &fl
);
2139 skb
->dst
= &rt
->u
.dst
;
2141 err
= rt6_fill_node(skb
, rt
, &fl
.fl6_dst
, &fl
.fl6_src
, iif
,
2142 RTM_NEWROUTE
, NETLINK_CB(in_skb
).pid
,
2143 nlh
->nlmsg_seq
, 0, 0);
2149 err
= rtnl_unicast(skb
, NETLINK_CB(in_skb
).pid
);
2154 void inet6_rt_notify(int event
, struct rt6_info
*rt
, struct nl_info
*info
)
2156 struct sk_buff
*skb
;
2157 u32 pid
= 0, seq
= 0;
2158 struct nlmsghdr
*nlh
= NULL
;
2159 int payload
= sizeof(struct rtmsg
) + 256;
2166 seq
= nlh
->nlmsg_seq
;
2169 skb
= nlmsg_new(nlmsg_total_size(payload
), gfp_any());
2173 err
= rt6_fill_node(skb
, rt
, NULL
, NULL
, 0, event
, pid
, seq
, 0, 0);
2179 err
= rtnl_notify(skb
, pid
, RTNLGRP_IPV6_ROUTE
, nlh
, gfp_any());
2182 rtnl_set_sk_err(RTNLGRP_IPV6_ROUTE
, err
);
2189 #ifdef CONFIG_PROC_FS
2191 #define RT6_INFO_LEN (32 + 4 + 32 + 4 + 32 + 40 + 5 + 1)
2202 static int rt6_info_route(struct rt6_info
*rt
, void *p_arg
)
2204 struct rt6_proc_arg
*arg
= (struct rt6_proc_arg
*) p_arg
;
2207 if (arg
->skip
< arg
->offset
/ RT6_INFO_LEN
) {
2212 if (arg
->len
>= arg
->length
)
2215 for (i
=0; i
<16; i
++) {
2216 sprintf(arg
->buffer
+ arg
->len
, "%02x",
2217 rt
->rt6i_dst
.addr
.s6_addr
[i
]);
2220 arg
->len
+= sprintf(arg
->buffer
+ arg
->len
, " %02x ",
2223 #ifdef CONFIG_IPV6_SUBTREES
2224 for (i
=0; i
<16; i
++) {
2225 sprintf(arg
->buffer
+ arg
->len
, "%02x",
2226 rt
->rt6i_src
.addr
.s6_addr
[i
]);
2229 arg
->len
+= sprintf(arg
->buffer
+ arg
->len
, " %02x ",
2232 sprintf(arg
->buffer
+ arg
->len
,
2233 "00000000000000000000000000000000 00 ");
2237 if (rt
->rt6i_nexthop
) {
2238 for (i
=0; i
<16; i
++) {
2239 sprintf(arg
->buffer
+ arg
->len
, "%02x",
2240 rt
->rt6i_nexthop
->primary_key
[i
]);
2244 sprintf(arg
->buffer
+ arg
->len
,
2245 "00000000000000000000000000000000");
2248 arg
->len
+= sprintf(arg
->buffer
+ arg
->len
,
2249 " %08x %08x %08x %08x %8s\n",
2250 rt
->rt6i_metric
, atomic_read(&rt
->u
.dst
.__refcnt
),
2251 rt
->u
.dst
.__use
, rt
->rt6i_flags
,
2252 rt
->rt6i_dev
? rt
->rt6i_dev
->name
: "");
2256 static int rt6_proc_info(char *buffer
, char **start
, off_t offset
, int length
)
2258 struct rt6_proc_arg arg
= {
2264 fib6_clean_all(rt6_info_route
, 0, &arg
);
2268 *start
+= offset
% RT6_INFO_LEN
;
2270 arg
.len
-= offset
% RT6_INFO_LEN
;
2272 if (arg
.len
> length
)
2280 static int rt6_stats_seq_show(struct seq_file
*seq
, void *v
)
2282 seq_printf(seq
, "%04x %04x %04x %04x %04x %04x %04x\n",
2283 rt6_stats
.fib_nodes
, rt6_stats
.fib_route_nodes
,
2284 rt6_stats
.fib_rt_alloc
, rt6_stats
.fib_rt_entries
,
2285 rt6_stats
.fib_rt_cache
,
2286 atomic_read(&ip6_dst_ops
.entries
),
2287 rt6_stats
.fib_discarded_routes
);
2292 static int rt6_stats_seq_open(struct inode
*inode
, struct file
*file
)
2294 return single_open(file
, rt6_stats_seq_show
, NULL
);
2297 static struct file_operations rt6_stats_seq_fops
= {
2298 .owner
= THIS_MODULE
,
2299 .open
= rt6_stats_seq_open
,
2301 .llseek
= seq_lseek
,
2302 .release
= single_release
,
2304 #endif /* CONFIG_PROC_FS */
2306 #ifdef CONFIG_SYSCTL
2308 static int flush_delay
;
2311 int ipv6_sysctl_rtcache_flush(ctl_table
*ctl
, int write
, struct file
* filp
,
2312 void __user
*buffer
, size_t *lenp
, loff_t
*ppos
)
2315 proc_dointvec(ctl
, write
, filp
, buffer
, lenp
, ppos
);
2316 fib6_run_gc(flush_delay
<= 0 ? ~0UL : (unsigned long)flush_delay
);
2322 ctl_table ipv6_route_table
[] = {
2324 .ctl_name
= NET_IPV6_ROUTE_FLUSH
,
2325 .procname
= "flush",
2326 .data
= &flush_delay
,
2327 .maxlen
= sizeof(int),
2329 .proc_handler
= &ipv6_sysctl_rtcache_flush
2332 .ctl_name
= NET_IPV6_ROUTE_GC_THRESH
,
2333 .procname
= "gc_thresh",
2334 .data
= &ip6_dst_ops
.gc_thresh
,
2335 .maxlen
= sizeof(int),
2337 .proc_handler
= &proc_dointvec
,
2340 .ctl_name
= NET_IPV6_ROUTE_MAX_SIZE
,
2341 .procname
= "max_size",
2342 .data
= &ip6_rt_max_size
,
2343 .maxlen
= sizeof(int),
2345 .proc_handler
= &proc_dointvec
,
2348 .ctl_name
= NET_IPV6_ROUTE_GC_MIN_INTERVAL
,
2349 .procname
= "gc_min_interval",
2350 .data
= &ip6_rt_gc_min_interval
,
2351 .maxlen
= sizeof(int),
2353 .proc_handler
= &proc_dointvec_jiffies
,
2354 .strategy
= &sysctl_jiffies
,
2357 .ctl_name
= NET_IPV6_ROUTE_GC_TIMEOUT
,
2358 .procname
= "gc_timeout",
2359 .data
= &ip6_rt_gc_timeout
,
2360 .maxlen
= sizeof(int),
2362 .proc_handler
= &proc_dointvec_jiffies
,
2363 .strategy
= &sysctl_jiffies
,
2366 .ctl_name
= NET_IPV6_ROUTE_GC_INTERVAL
,
2367 .procname
= "gc_interval",
2368 .data
= &ip6_rt_gc_interval
,
2369 .maxlen
= sizeof(int),
2371 .proc_handler
= &proc_dointvec_jiffies
,
2372 .strategy
= &sysctl_jiffies
,
2375 .ctl_name
= NET_IPV6_ROUTE_GC_ELASTICITY
,
2376 .procname
= "gc_elasticity",
2377 .data
= &ip6_rt_gc_elasticity
,
2378 .maxlen
= sizeof(int),
2380 .proc_handler
= &proc_dointvec_jiffies
,
2381 .strategy
= &sysctl_jiffies
,
2384 .ctl_name
= NET_IPV6_ROUTE_MTU_EXPIRES
,
2385 .procname
= "mtu_expires",
2386 .data
= &ip6_rt_mtu_expires
,
2387 .maxlen
= sizeof(int),
2389 .proc_handler
= &proc_dointvec_jiffies
,
2390 .strategy
= &sysctl_jiffies
,
2393 .ctl_name
= NET_IPV6_ROUTE_MIN_ADVMSS
,
2394 .procname
= "min_adv_mss",
2395 .data
= &ip6_rt_min_advmss
,
2396 .maxlen
= sizeof(int),
2398 .proc_handler
= &proc_dointvec_jiffies
,
2399 .strategy
= &sysctl_jiffies
,
2402 .ctl_name
= NET_IPV6_ROUTE_GC_MIN_INTERVAL_MS
,
2403 .procname
= "gc_min_interval_ms",
2404 .data
= &ip6_rt_gc_min_interval
,
2405 .maxlen
= sizeof(int),
2407 .proc_handler
= &proc_dointvec_ms_jiffies
,
2408 .strategy
= &sysctl_ms_jiffies
,
2415 void __init
ip6_route_init(void)
2417 struct proc_dir_entry
*p
;
2419 ip6_dst_ops
.kmem_cachep
= kmem_cache_create("ip6_dst_cache",
2420 sizeof(struct rt6_info
),
2421 0, SLAB_HWCACHE_ALIGN
,
2423 if (!ip6_dst_ops
.kmem_cachep
)
2424 panic("cannot create ip6_dst_cache");
2427 #ifdef CONFIG_PROC_FS
2428 p
= proc_net_create("ipv6_route", 0, rt6_proc_info
);
2430 p
->owner
= THIS_MODULE
;
2432 proc_net_fops_create("rt6_stats", S_IRUGO
, &rt6_stats_seq_fops
);
2437 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
2442 void ip6_route_cleanup(void)
2444 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
2445 fib6_rules_cleanup();
2447 #ifdef CONFIG_PROC_FS
2448 proc_net_remove("ipv6_route");
2449 proc_net_remove("rt6_stats");
2456 kmem_cache_destroy(ip6_dst_ops
.kmem_cachep
);