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.
27 #include <linux/capability.h>
28 #include <linux/errno.h>
29 #include <linux/types.h>
30 #include <linux/times.h>
31 #include <linux/socket.h>
32 #include <linux/sockios.h>
33 #include <linux/net.h>
34 #include <linux/route.h>
35 #include <linux/netdevice.h>
36 #include <linux/in6.h>
37 #include <linux/init.h>
38 #include <linux/netlink.h>
39 #include <linux/if_arp.h>
42 #include <linux/proc_fs.h>
43 #include <linux/seq_file.h>
48 #include <net/ip6_fib.h>
49 #include <net/ip6_route.h>
50 #include <net/ndisc.h>
51 #include <net/addrconf.h>
53 #include <linux/rtnetlink.h>
56 #include <net/netevent.h>
58 #include <asm/uaccess.h>
61 #include <linux/sysctl.h>
64 /* Set to 3 to get tracing. */
68 #define RDBG(x) printk x
69 #define RT6_TRACE(x...) printk(KERN_DEBUG x)
72 #define RT6_TRACE(x...) do { ; } while (0)
75 #define CLONE_OFFLINK_ROUTE 0
77 #define RT6_SELECT_F_IFACE 0x1
78 #define RT6_SELECT_F_REACHABLE 0x2
80 static int ip6_rt_max_size
= 4096;
81 static int ip6_rt_gc_min_interval
= HZ
/ 2;
82 static int ip6_rt_gc_timeout
= 60*HZ
;
83 int ip6_rt_gc_interval
= 30*HZ
;
84 static int ip6_rt_gc_elasticity
= 9;
85 static int ip6_rt_mtu_expires
= 10*60*HZ
;
86 static int ip6_rt_min_advmss
= IPV6_MIN_MTU
- 20 - 40;
88 static struct rt6_info
* ip6_rt_copy(struct rt6_info
*ort
);
89 static struct dst_entry
*ip6_dst_check(struct dst_entry
*dst
, u32 cookie
);
90 static struct dst_entry
*ip6_negative_advice(struct dst_entry
*);
91 static void ip6_dst_destroy(struct dst_entry
*);
92 static void ip6_dst_ifdown(struct dst_entry
*,
93 struct net_device
*dev
, int how
);
94 static int ip6_dst_gc(void);
96 static int ip6_pkt_discard(struct sk_buff
*skb
);
97 static int ip6_pkt_discard_out(struct sk_buff
*skb
);
98 static void ip6_link_failure(struct sk_buff
*skb
);
99 static void ip6_rt_update_pmtu(struct dst_entry
*dst
, u32 mtu
);
101 #ifdef CONFIG_IPV6_ROUTE_INFO
102 static struct rt6_info
*rt6_add_route_info(struct in6_addr
*prefix
, int prefixlen
,
103 struct in6_addr
*gwaddr
, int ifindex
,
105 static struct rt6_info
*rt6_get_route_info(struct in6_addr
*prefix
, int prefixlen
,
106 struct in6_addr
*gwaddr
, int ifindex
);
109 static struct dst_ops ip6_dst_ops
= {
111 .protocol
= __constant_htons(ETH_P_IPV6
),
114 .check
= ip6_dst_check
,
115 .destroy
= ip6_dst_destroy
,
116 .ifdown
= ip6_dst_ifdown
,
117 .negative_advice
= ip6_negative_advice
,
118 .link_failure
= ip6_link_failure
,
119 .update_pmtu
= ip6_rt_update_pmtu
,
120 .entry_size
= sizeof(struct rt6_info
),
123 struct rt6_info ip6_null_entry
= {
126 .__refcnt
= ATOMIC_INIT(1),
128 .dev
= &loopback_dev
,
130 .error
= -ENETUNREACH
,
131 .metrics
= { [RTAX_HOPLIMIT
- 1] = 255, },
132 .input
= ip6_pkt_discard
,
133 .output
= ip6_pkt_discard_out
,
135 .path
= (struct dst_entry
*)&ip6_null_entry
,
138 .rt6i_flags
= (RTF_REJECT
| RTF_NONEXTHOP
),
139 .rt6i_metric
= ~(u32
) 0,
140 .rt6i_ref
= ATOMIC_INIT(1),
143 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
145 struct rt6_info ip6_prohibit_entry
= {
148 .__refcnt
= ATOMIC_INIT(1),
150 .dev
= &loopback_dev
,
153 .metrics
= { [RTAX_HOPLIMIT
- 1] = 255, },
154 .input
= ip6_pkt_discard
,
155 .output
= ip6_pkt_discard_out
,
157 .path
= (struct dst_entry
*)&ip6_prohibit_entry
,
160 .rt6i_flags
= (RTF_REJECT
| RTF_NONEXTHOP
),
161 .rt6i_metric
= ~(u32
) 0,
162 .rt6i_ref
= ATOMIC_INIT(1),
165 struct rt6_info ip6_blk_hole_entry
= {
168 .__refcnt
= ATOMIC_INIT(1),
170 .dev
= &loopback_dev
,
173 .metrics
= { [RTAX_HOPLIMIT
- 1] = 255, },
174 .input
= ip6_pkt_discard
,
175 .output
= ip6_pkt_discard_out
,
177 .path
= (struct dst_entry
*)&ip6_blk_hole_entry
,
180 .rt6i_flags
= (RTF_REJECT
| RTF_NONEXTHOP
),
181 .rt6i_metric
= ~(u32
) 0,
182 .rt6i_ref
= ATOMIC_INIT(1),
187 /* allocate dst with ip6_dst_ops */
188 static __inline__
struct rt6_info
*ip6_dst_alloc(void)
190 return (struct rt6_info
*)dst_alloc(&ip6_dst_ops
);
193 static void ip6_dst_destroy(struct dst_entry
*dst
)
195 struct rt6_info
*rt
= (struct rt6_info
*)dst
;
196 struct inet6_dev
*idev
= rt
->rt6i_idev
;
199 rt
->rt6i_idev
= NULL
;
204 static void ip6_dst_ifdown(struct dst_entry
*dst
, struct net_device
*dev
,
207 struct rt6_info
*rt
= (struct rt6_info
*)dst
;
208 struct inet6_dev
*idev
= rt
->rt6i_idev
;
210 if (dev
!= &loopback_dev
&& idev
!= NULL
&& idev
->dev
== dev
) {
211 struct inet6_dev
*loopback_idev
= in6_dev_get(&loopback_dev
);
212 if (loopback_idev
!= NULL
) {
213 rt
->rt6i_idev
= loopback_idev
;
219 static __inline__
int rt6_check_expired(const struct rt6_info
*rt
)
221 return (rt
->rt6i_flags
& RTF_EXPIRES
&&
222 time_after(jiffies
, rt
->rt6i_expires
));
225 static inline int rt6_need_strict(struct in6_addr
*daddr
)
227 return (ipv6_addr_type(daddr
) &
228 (IPV6_ADDR_MULTICAST
| IPV6_ADDR_LINKLOCAL
));
232 * Route lookup. Any table->tb6_lock is implied.
235 static __inline__
struct rt6_info
*rt6_device_match(struct rt6_info
*rt
,
239 struct rt6_info
*local
= NULL
;
240 struct rt6_info
*sprt
;
243 for (sprt
= rt
; sprt
; sprt
= sprt
->u
.next
) {
244 struct net_device
*dev
= sprt
->rt6i_dev
;
245 if (dev
->ifindex
== oif
)
247 if (dev
->flags
& IFF_LOOPBACK
) {
248 if (sprt
->rt6i_idev
== NULL
||
249 sprt
->rt6i_idev
->dev
->ifindex
!= oif
) {
252 if (local
&& (!oif
||
253 local
->rt6i_idev
->dev
->ifindex
== oif
))
264 return &ip6_null_entry
;
269 #ifdef CONFIG_IPV6_ROUTER_PREF
270 static void rt6_probe(struct rt6_info
*rt
)
272 struct neighbour
*neigh
= rt
? rt
->rt6i_nexthop
: NULL
;
274 * Okay, this does not seem to be appropriate
275 * for now, however, we need to check if it
276 * is really so; aka Router Reachability Probing.
278 * Router Reachability Probe MUST be rate-limited
279 * to no more than one per minute.
281 if (!neigh
|| (neigh
->nud_state
& NUD_VALID
))
283 read_lock_bh(&neigh
->lock
);
284 if (!(neigh
->nud_state
& NUD_VALID
) &&
285 time_after(jiffies
, neigh
->updated
+ rt
->rt6i_idev
->cnf
.rtr_probe_interval
)) {
286 struct in6_addr mcaddr
;
287 struct in6_addr
*target
;
289 neigh
->updated
= jiffies
;
290 read_unlock_bh(&neigh
->lock
);
292 target
= (struct in6_addr
*)&neigh
->primary_key
;
293 addrconf_addr_solict_mult(target
, &mcaddr
);
294 ndisc_send_ns(rt
->rt6i_dev
, NULL
, target
, &mcaddr
, NULL
);
296 read_unlock_bh(&neigh
->lock
);
299 static inline void rt6_probe(struct rt6_info
*rt
)
306 * Default Router Selection (RFC 2461 6.3.6)
308 static int inline rt6_check_dev(struct rt6_info
*rt
, int oif
)
310 struct net_device
*dev
= rt
->rt6i_dev
;
311 if (!oif
|| dev
->ifindex
== oif
)
313 if ((dev
->flags
& IFF_LOOPBACK
) &&
314 rt
->rt6i_idev
&& rt
->rt6i_idev
->dev
->ifindex
== oif
)
319 static int inline rt6_check_neigh(struct rt6_info
*rt
)
321 struct neighbour
*neigh
= rt
->rt6i_nexthop
;
323 if (rt
->rt6i_flags
& RTF_NONEXTHOP
||
324 !(rt
->rt6i_flags
& RTF_GATEWAY
))
327 read_lock_bh(&neigh
->lock
);
328 if (neigh
->nud_state
& NUD_VALID
)
330 read_unlock_bh(&neigh
->lock
);
335 static int rt6_score_route(struct rt6_info
*rt
, int oif
,
340 m
= rt6_check_dev(rt
, oif
);
341 if (!m
&& (strict
& RT6_SELECT_F_IFACE
))
343 #ifdef CONFIG_IPV6_ROUTER_PREF
344 m
|= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt
->rt6i_flags
)) << 2;
346 n
= rt6_check_neigh(rt
);
349 else if (!n
&& strict
& RT6_SELECT_F_REACHABLE
)
354 static struct rt6_info
*rt6_select(struct rt6_info
**head
, int oif
,
357 struct rt6_info
*match
= NULL
, *last
= NULL
;
358 struct rt6_info
*rt
, *rt0
= *head
;
362 RT6_TRACE("%s(head=%p(*head=%p), oif=%d)\n",
363 __FUNCTION__
, head
, head
? *head
: NULL
, oif
);
365 for (rt
= rt0
, metric
= rt0
->rt6i_metric
;
366 rt
&& rt
->rt6i_metric
== metric
&& (!last
|| rt
!= rt0
);
370 if (rt6_check_expired(rt
))
375 m
= rt6_score_route(rt
, oif
, strict
);
389 (strict
& RT6_SELECT_F_REACHABLE
) &&
390 last
&& last
!= rt0
) {
391 /* no entries matched; do round-robin */
392 static DEFINE_SPINLOCK(lock
);
395 rt0
->u
.next
= last
->u
.next
;
400 RT6_TRACE("%s() => %p, score=%d\n",
401 __FUNCTION__
, match
, mpri
);
403 return (match
? match
: &ip6_null_entry
);
406 #ifdef CONFIG_IPV6_ROUTE_INFO
407 int rt6_route_rcv(struct net_device
*dev
, u8
*opt
, int len
,
408 struct in6_addr
*gwaddr
)
410 struct route_info
*rinfo
= (struct route_info
*) opt
;
411 struct in6_addr prefix_buf
, *prefix
;
416 if (len
< sizeof(struct route_info
)) {
420 /* Sanity check for prefix_len and length */
421 if (rinfo
->length
> 3) {
423 } else if (rinfo
->prefix_len
> 128) {
425 } else if (rinfo
->prefix_len
> 64) {
426 if (rinfo
->length
< 2) {
429 } else if (rinfo
->prefix_len
> 0) {
430 if (rinfo
->length
< 1) {
435 pref
= rinfo
->route_pref
;
436 if (pref
== ICMPV6_ROUTER_PREF_INVALID
)
437 pref
= ICMPV6_ROUTER_PREF_MEDIUM
;
439 lifetime
= htonl(rinfo
->lifetime
);
440 if (lifetime
== 0xffffffff) {
442 } else if (lifetime
> 0x7fffffff/HZ
) {
443 /* Avoid arithmetic overflow */
444 lifetime
= 0x7fffffff/HZ
- 1;
447 if (rinfo
->length
== 3)
448 prefix
= (struct in6_addr
*)rinfo
->prefix
;
450 /* this function is safe */
451 ipv6_addr_prefix(&prefix_buf
,
452 (struct in6_addr
*)rinfo
->prefix
,
454 prefix
= &prefix_buf
;
457 rt
= rt6_get_route_info(prefix
, rinfo
->prefix_len
, gwaddr
, dev
->ifindex
);
459 if (rt
&& !lifetime
) {
460 ip6_del_rt(rt
, NULL
, NULL
, NULL
);
465 rt
= rt6_add_route_info(prefix
, rinfo
->prefix_len
, gwaddr
, dev
->ifindex
,
468 rt
->rt6i_flags
= RTF_ROUTEINFO
|
469 (rt
->rt6i_flags
& ~RTF_PREF_MASK
) | RTF_PREF(pref
);
472 if (lifetime
== 0xffffffff) {
473 rt
->rt6i_flags
&= ~RTF_EXPIRES
;
475 rt
->rt6i_expires
= jiffies
+ HZ
* lifetime
;
476 rt
->rt6i_flags
|= RTF_EXPIRES
;
478 dst_release(&rt
->u
.dst
);
484 #define BACKTRACK() \
485 if (rt == &ip6_null_entry && flags & RT6_F_STRICT) { \
486 while ((fn = fn->parent) != NULL) { \
487 if (fn->fn_flags & RTN_TL_ROOT) { \
488 dst_hold(&rt->u.dst); \
491 if (fn->fn_flags & RTN_RTINFO) \
496 static struct rt6_info
*ip6_pol_route_lookup(struct fib6_table
*table
,
497 struct flowi
*fl
, int flags
)
499 struct fib6_node
*fn
;
502 read_lock_bh(&table
->tb6_lock
);
503 fn
= fib6_lookup(&table
->tb6_root
, &fl
->fl6_dst
, &fl
->fl6_src
);
506 rt
= rt6_device_match(rt
, fl
->oif
, flags
& RT6_F_STRICT
);
508 dst_hold(&rt
->u
.dst
);
510 read_unlock_bh(&table
->tb6_lock
);
512 rt
->u
.dst
.lastuse
= jiffies
;
519 struct rt6_info
*rt6_lookup(struct in6_addr
*daddr
, struct in6_addr
*saddr
,
531 struct dst_entry
*dst
;
532 int flags
= strict
? RT6_F_STRICT
: 0;
534 dst
= fib6_rule_lookup(&fl
, flags
, ip6_pol_route_lookup
);
536 return (struct rt6_info
*) dst
;
543 /* ip6_ins_rt is called with FREE table->tb6_lock.
544 It takes new route entry, the addition fails by any reason the
545 route is freed. In any case, if caller does not hold it, it may
549 int ip6_ins_rt(struct rt6_info
*rt
, struct nlmsghdr
*nlh
,
550 void *_rtattr
, struct netlink_skb_parms
*req
)
553 struct fib6_table
*table
;
555 table
= rt
->rt6i_table
;
556 write_lock_bh(&table
->tb6_lock
);
557 err
= fib6_add(&table
->tb6_root
, rt
, nlh
, _rtattr
, req
);
558 write_unlock_bh(&table
->tb6_lock
);
563 static struct rt6_info
*rt6_alloc_cow(struct rt6_info
*ort
, struct in6_addr
*daddr
,
564 struct in6_addr
*saddr
)
572 rt
= ip6_rt_copy(ort
);
575 if (!(rt
->rt6i_flags
&RTF_GATEWAY
)) {
576 if (rt
->rt6i_dst
.plen
!= 128 &&
577 ipv6_addr_equal(&rt
->rt6i_dst
.addr
, daddr
))
578 rt
->rt6i_flags
|= RTF_ANYCAST
;
579 ipv6_addr_copy(&rt
->rt6i_gateway
, daddr
);
582 ipv6_addr_copy(&rt
->rt6i_dst
.addr
, daddr
);
583 rt
->rt6i_dst
.plen
= 128;
584 rt
->rt6i_flags
|= RTF_CACHE
;
585 rt
->u
.dst
.flags
|= DST_HOST
;
587 #ifdef CONFIG_IPV6_SUBTREES
588 if (rt
->rt6i_src
.plen
&& saddr
) {
589 ipv6_addr_copy(&rt
->rt6i_src
.addr
, saddr
);
590 rt
->rt6i_src
.plen
= 128;
594 rt
->rt6i_nexthop
= ndisc_get_neigh(rt
->rt6i_dev
, &rt
->rt6i_gateway
);
601 static struct rt6_info
*rt6_alloc_clone(struct rt6_info
*ort
, struct in6_addr
*daddr
)
603 struct rt6_info
*rt
= ip6_rt_copy(ort
);
605 ipv6_addr_copy(&rt
->rt6i_dst
.addr
, daddr
);
606 rt
->rt6i_dst
.plen
= 128;
607 rt
->rt6i_flags
|= RTF_CACHE
;
608 if (rt
->rt6i_flags
& RTF_REJECT
)
609 rt
->u
.dst
.error
= ort
->u
.dst
.error
;
610 rt
->u
.dst
.flags
|= DST_HOST
;
611 rt
->rt6i_nexthop
= neigh_clone(ort
->rt6i_nexthop
);
616 struct rt6_info
*ip6_pol_route_input(struct fib6_table
*table
, struct flowi
*fl
,
619 struct fib6_node
*fn
;
620 struct rt6_info
*rt
, *nrt
;
624 int reachable
= RT6_SELECT_F_REACHABLE
;
626 if (flags
& RT6_F_STRICT
)
627 strict
= RT6_SELECT_F_IFACE
;
630 read_lock_bh(&table
->tb6_lock
);
633 fn
= fib6_lookup(&table
->tb6_root
, &fl
->fl6_dst
, &fl
->fl6_src
);
636 rt
= rt6_select(&fn
->leaf
, fl
->iif
, strict
| reachable
);
638 if (rt
== &ip6_null_entry
||
639 rt
->rt6i_flags
& RTF_CACHE
)
642 dst_hold(&rt
->u
.dst
);
643 read_unlock_bh(&table
->tb6_lock
);
645 if (!rt
->rt6i_nexthop
&& !(rt
->rt6i_flags
& RTF_NONEXTHOP
))
646 nrt
= rt6_alloc_cow(rt
, &fl
->fl6_dst
, &fl
->fl6_src
);
648 #if CLONE_OFFLINK_ROUTE
649 nrt
= rt6_alloc_clone(rt
, &fl
->fl6_dst
);
655 dst_release(&rt
->u
.dst
);
656 rt
= nrt
? : &ip6_null_entry
;
658 dst_hold(&rt
->u
.dst
);
660 err
= ip6_ins_rt(nrt
, NULL
, NULL
, NULL
);
669 * Race condition! In the gap, when table->tb6_lock was
670 * released someone could insert this route. Relookup.
672 dst_release(&rt
->u
.dst
);
680 dst_hold(&rt
->u
.dst
);
681 read_unlock_bh(&table
->tb6_lock
);
683 rt
->u
.dst
.lastuse
= jiffies
;
689 void ip6_route_input(struct sk_buff
*skb
)
691 struct ipv6hdr
*iph
= skb
->nh
.ipv6h
;
693 .iif
= skb
->dev
->ifindex
,
698 .flowlabel
= (* (u32
*) iph
)&IPV6_FLOWINFO_MASK
,
701 .proto
= iph
->nexthdr
,
705 if (rt6_need_strict(&iph
->daddr
))
706 flags
|= RT6_F_STRICT
;
708 skb
->dst
= fib6_rule_lookup(&fl
, flags
, ip6_pol_route_input
);
711 static struct rt6_info
*ip6_pol_route_output(struct fib6_table
*table
,
712 struct flowi
*fl
, int flags
)
714 struct fib6_node
*fn
;
715 struct rt6_info
*rt
, *nrt
;
719 int reachable
= RT6_SELECT_F_REACHABLE
;
721 if (flags
& RT6_F_STRICT
)
722 strict
= RT6_SELECT_F_IFACE
;
725 read_lock_bh(&table
->tb6_lock
);
728 fn
= fib6_lookup(&table
->tb6_root
, &fl
->fl6_dst
, &fl
->fl6_src
);
731 rt
= rt6_select(&fn
->leaf
, fl
->oif
, strict
| reachable
);
733 if (rt
== &ip6_null_entry
||
734 rt
->rt6i_flags
& RTF_CACHE
)
737 dst_hold(&rt
->u
.dst
);
738 read_unlock_bh(&table
->tb6_lock
);
740 if (!rt
->rt6i_nexthop
&& !(rt
->rt6i_flags
& RTF_NONEXTHOP
))
741 nrt
= rt6_alloc_cow(rt
, &fl
->fl6_dst
, &fl
->fl6_src
);
743 #if CLONE_OFFLINK_ROUTE
744 nrt
= rt6_alloc_clone(rt
, &fl
->fl6_dst
);
750 dst_release(&rt
->u
.dst
);
751 rt
= nrt
? : &ip6_null_entry
;
753 dst_hold(&rt
->u
.dst
);
755 err
= ip6_ins_rt(nrt
, NULL
, NULL
, NULL
);
764 * Race condition! In the gap, when table->tb6_lock was
765 * released someone could insert this route. Relookup.
767 dst_release(&rt
->u
.dst
);
775 dst_hold(&rt
->u
.dst
);
776 read_unlock_bh(&table
->tb6_lock
);
778 rt
->u
.dst
.lastuse
= jiffies
;
783 struct dst_entry
* ip6_route_output(struct sock
*sk
, struct flowi
*fl
)
787 if (rt6_need_strict(&fl
->fl6_dst
))
788 flags
|= RT6_F_STRICT
;
790 return fib6_rule_lookup(fl
, flags
, ip6_pol_route_output
);
795 * Destination cache support functions
798 static struct dst_entry
*ip6_dst_check(struct dst_entry
*dst
, u32 cookie
)
802 rt
= (struct rt6_info
*) dst
;
804 if (rt
&& rt
->rt6i_node
&& (rt
->rt6i_node
->fn_sernum
== cookie
))
810 static struct dst_entry
*ip6_negative_advice(struct dst_entry
*dst
)
812 struct rt6_info
*rt
= (struct rt6_info
*) dst
;
815 if (rt
->rt6i_flags
& RTF_CACHE
)
816 ip6_del_rt(rt
, NULL
, NULL
, NULL
);
823 static void ip6_link_failure(struct sk_buff
*skb
)
827 icmpv6_send(skb
, ICMPV6_DEST_UNREACH
, ICMPV6_ADDR_UNREACH
, 0, skb
->dev
);
829 rt
= (struct rt6_info
*) skb
->dst
;
831 if (rt
->rt6i_flags
&RTF_CACHE
) {
832 dst_set_expires(&rt
->u
.dst
, 0);
833 rt
->rt6i_flags
|= RTF_EXPIRES
;
834 } else if (rt
->rt6i_node
&& (rt
->rt6i_flags
& RTF_DEFAULT
))
835 rt
->rt6i_node
->fn_sernum
= -1;
839 static void ip6_rt_update_pmtu(struct dst_entry
*dst
, u32 mtu
)
841 struct rt6_info
*rt6
= (struct rt6_info
*)dst
;
843 if (mtu
< dst_mtu(dst
) && rt6
->rt6i_dst
.plen
== 128) {
844 rt6
->rt6i_flags
|= RTF_MODIFIED
;
845 if (mtu
< IPV6_MIN_MTU
) {
847 dst
->metrics
[RTAX_FEATURES
-1] |= RTAX_FEATURE_ALLFRAG
;
849 dst
->metrics
[RTAX_MTU
-1] = mtu
;
850 call_netevent_notifiers(NETEVENT_PMTU_UPDATE
, dst
);
854 static int ipv6_get_mtu(struct net_device
*dev
);
856 static inline unsigned int ipv6_advmss(unsigned int mtu
)
858 mtu
-= sizeof(struct ipv6hdr
) + sizeof(struct tcphdr
);
860 if (mtu
< ip6_rt_min_advmss
)
861 mtu
= ip6_rt_min_advmss
;
864 * Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and
865 * corresponding MSS is IPV6_MAXPLEN - tcp_header_size.
866 * IPV6_MAXPLEN is also valid and means: "any MSS,
867 * rely only on pmtu discovery"
869 if (mtu
> IPV6_MAXPLEN
- sizeof(struct tcphdr
))
874 static struct dst_entry
*ndisc_dst_gc_list
;
875 DEFINE_SPINLOCK(ndisc_lock
);
877 struct dst_entry
*ndisc_dst_alloc(struct net_device
*dev
,
878 struct neighbour
*neigh
,
879 struct in6_addr
*addr
,
880 int (*output
)(struct sk_buff
*))
883 struct inet6_dev
*idev
= in6_dev_get(dev
);
885 if (unlikely(idev
== NULL
))
888 rt
= ip6_dst_alloc();
889 if (unlikely(rt
== NULL
)) {
898 neigh
= ndisc_get_neigh(dev
, addr
);
901 rt
->rt6i_idev
= idev
;
902 rt
->rt6i_nexthop
= neigh
;
903 atomic_set(&rt
->u
.dst
.__refcnt
, 1);
904 rt
->u
.dst
.metrics
[RTAX_HOPLIMIT
-1] = 255;
905 rt
->u
.dst
.metrics
[RTAX_MTU
-1] = ipv6_get_mtu(rt
->rt6i_dev
);
906 rt
->u
.dst
.metrics
[RTAX_ADVMSS
-1] = ipv6_advmss(dst_mtu(&rt
->u
.dst
));
907 rt
->u
.dst
.output
= output
;
909 #if 0 /* there's no chance to use these for ndisc */
910 rt
->u
.dst
.flags
= ipv6_addr_type(addr
) & IPV6_ADDR_UNICAST
913 ipv6_addr_copy(&rt
->rt6i_dst
.addr
, addr
);
914 rt
->rt6i_dst
.plen
= 128;
917 spin_lock_bh(&ndisc_lock
);
918 rt
->u
.dst
.next
= ndisc_dst_gc_list
;
919 ndisc_dst_gc_list
= &rt
->u
.dst
;
920 spin_unlock_bh(&ndisc_lock
);
922 fib6_force_start_gc();
925 return (struct dst_entry
*)rt
;
928 int ndisc_dst_gc(int *more
)
930 struct dst_entry
*dst
, *next
, **pprev
;
936 spin_lock_bh(&ndisc_lock
);
937 pprev
= &ndisc_dst_gc_list
;
939 while ((dst
= *pprev
) != NULL
) {
940 if (!atomic_read(&dst
->__refcnt
)) {
950 spin_unlock_bh(&ndisc_lock
);
955 static int ip6_dst_gc(void)
957 static unsigned expire
= 30*HZ
;
958 static unsigned long last_gc
;
959 unsigned long now
= jiffies
;
961 if (time_after(last_gc
+ ip6_rt_gc_min_interval
, now
) &&
962 atomic_read(&ip6_dst_ops
.entries
) <= ip6_rt_max_size
)
968 if (atomic_read(&ip6_dst_ops
.entries
) < ip6_dst_ops
.gc_thresh
)
969 expire
= ip6_rt_gc_timeout
>>1;
972 expire
-= expire
>>ip6_rt_gc_elasticity
;
973 return (atomic_read(&ip6_dst_ops
.entries
) > ip6_rt_max_size
);
976 /* Clean host part of a prefix. Not necessary in radix tree,
977 but results in cleaner routing tables.
979 Remove it only when all the things will work!
982 static int ipv6_get_mtu(struct net_device
*dev
)
984 int mtu
= IPV6_MIN_MTU
;
985 struct inet6_dev
*idev
;
987 idev
= in6_dev_get(dev
);
989 mtu
= idev
->cnf
.mtu6
;
995 int ipv6_get_hoplimit(struct net_device
*dev
)
997 int hoplimit
= ipv6_devconf
.hop_limit
;
998 struct inet6_dev
*idev
;
1000 idev
= in6_dev_get(dev
);
1002 hoplimit
= idev
->cnf
.hop_limit
;
1012 int ip6_route_add(struct in6_rtmsg
*rtmsg
, struct nlmsghdr
*nlh
,
1013 void *_rtattr
, struct netlink_skb_parms
*req
,
1018 struct rtattr
**rta
;
1019 struct rt6_info
*rt
= NULL
;
1020 struct net_device
*dev
= NULL
;
1021 struct inet6_dev
*idev
= NULL
;
1022 struct fib6_table
*table
;
1025 rta
= (struct rtattr
**) _rtattr
;
1027 if (rtmsg
->rtmsg_dst_len
> 128 || rtmsg
->rtmsg_src_len
> 128)
1029 #ifndef CONFIG_IPV6_SUBTREES
1030 if (rtmsg
->rtmsg_src_len
)
1033 if (rtmsg
->rtmsg_ifindex
) {
1035 dev
= dev_get_by_index(rtmsg
->rtmsg_ifindex
);
1038 idev
= in6_dev_get(dev
);
1043 if (rtmsg
->rtmsg_metric
== 0)
1044 rtmsg
->rtmsg_metric
= IP6_RT_PRIO_USER
;
1046 table
= fib6_new_table(table_id
);
1047 if (table
== NULL
) {
1052 rt
= ip6_dst_alloc();
1059 rt
->u
.dst
.obsolete
= -1;
1060 rt
->rt6i_expires
= jiffies
+ clock_t_to_jiffies(rtmsg
->rtmsg_info
);
1061 if (nlh
&& (r
= NLMSG_DATA(nlh
))) {
1062 rt
->rt6i_protocol
= r
->rtm_protocol
;
1064 rt
->rt6i_protocol
= RTPROT_BOOT
;
1067 addr_type
= ipv6_addr_type(&rtmsg
->rtmsg_dst
);
1069 if (addr_type
& IPV6_ADDR_MULTICAST
)
1070 rt
->u
.dst
.input
= ip6_mc_input
;
1072 rt
->u
.dst
.input
= ip6_forward
;
1074 rt
->u
.dst
.output
= ip6_output
;
1076 ipv6_addr_prefix(&rt
->rt6i_dst
.addr
,
1077 &rtmsg
->rtmsg_dst
, rtmsg
->rtmsg_dst_len
);
1078 rt
->rt6i_dst
.plen
= rtmsg
->rtmsg_dst_len
;
1079 if (rt
->rt6i_dst
.plen
== 128)
1080 rt
->u
.dst
.flags
= DST_HOST
;
1082 #ifdef CONFIG_IPV6_SUBTREES
1083 ipv6_addr_prefix(&rt
->rt6i_src
.addr
,
1084 &rtmsg
->rtmsg_src
, rtmsg
->rtmsg_src_len
);
1085 rt
->rt6i_src
.plen
= rtmsg
->rtmsg_src_len
;
1088 rt
->rt6i_metric
= rtmsg
->rtmsg_metric
;
1090 /* We cannot add true routes via loopback here,
1091 they would result in kernel looping; promote them to reject routes
1093 if ((rtmsg
->rtmsg_flags
&RTF_REJECT
) ||
1094 (dev
&& (dev
->flags
&IFF_LOOPBACK
) && !(addr_type
&IPV6_ADDR_LOOPBACK
))) {
1095 /* hold loopback dev/idev if we haven't done so. */
1096 if (dev
!= &loopback_dev
) {
1101 dev
= &loopback_dev
;
1103 idev
= in6_dev_get(dev
);
1109 rt
->u
.dst
.output
= ip6_pkt_discard_out
;
1110 rt
->u
.dst
.input
= ip6_pkt_discard
;
1111 rt
->u
.dst
.error
= -ENETUNREACH
;
1112 rt
->rt6i_flags
= RTF_REJECT
|RTF_NONEXTHOP
;
1116 if (rtmsg
->rtmsg_flags
& RTF_GATEWAY
) {
1117 struct in6_addr
*gw_addr
;
1120 gw_addr
= &rtmsg
->rtmsg_gateway
;
1121 ipv6_addr_copy(&rt
->rt6i_gateway
, &rtmsg
->rtmsg_gateway
);
1122 gwa_type
= ipv6_addr_type(gw_addr
);
1124 if (gwa_type
!= (IPV6_ADDR_LINKLOCAL
|IPV6_ADDR_UNICAST
)) {
1125 struct rt6_info
*grt
;
1127 /* IPv6 strictly inhibits using not link-local
1128 addresses as nexthop address.
1129 Otherwise, router will not able to send redirects.
1130 It is very good, but in some (rare!) circumstances
1131 (SIT, PtP, NBMA NOARP links) it is handy to allow
1132 some exceptions. --ANK
1135 if (!(gwa_type
&IPV6_ADDR_UNICAST
))
1138 grt
= rt6_lookup(gw_addr
, NULL
, rtmsg
->rtmsg_ifindex
, 1);
1140 err
= -EHOSTUNREACH
;
1144 if (dev
!= grt
->rt6i_dev
) {
1145 dst_release(&grt
->u
.dst
);
1149 dev
= grt
->rt6i_dev
;
1150 idev
= grt
->rt6i_idev
;
1152 in6_dev_hold(grt
->rt6i_idev
);
1154 if (!(grt
->rt6i_flags
&RTF_GATEWAY
))
1156 dst_release(&grt
->u
.dst
);
1162 if (dev
== NULL
|| (dev
->flags
&IFF_LOOPBACK
))
1170 if (rtmsg
->rtmsg_flags
& (RTF_GATEWAY
|RTF_NONEXTHOP
)) {
1171 rt
->rt6i_nexthop
= __neigh_lookup_errno(&nd_tbl
, &rt
->rt6i_gateway
, dev
);
1172 if (IS_ERR(rt
->rt6i_nexthop
)) {
1173 err
= PTR_ERR(rt
->rt6i_nexthop
);
1174 rt
->rt6i_nexthop
= NULL
;
1179 rt
->rt6i_flags
= rtmsg
->rtmsg_flags
;
1182 if (rta
&& rta
[RTA_METRICS
-1]) {
1183 int attrlen
= RTA_PAYLOAD(rta
[RTA_METRICS
-1]);
1184 struct rtattr
*attr
= RTA_DATA(rta
[RTA_METRICS
-1]);
1186 while (RTA_OK(attr
, attrlen
)) {
1187 unsigned flavor
= attr
->rta_type
;
1189 if (flavor
> RTAX_MAX
) {
1193 rt
->u
.dst
.metrics
[flavor
-1] =
1194 *(u32
*)RTA_DATA(attr
);
1196 attr
= RTA_NEXT(attr
, attrlen
);
1200 if (rt
->u
.dst
.metrics
[RTAX_HOPLIMIT
-1] == 0)
1201 rt
->u
.dst
.metrics
[RTAX_HOPLIMIT
-1] = -1;
1202 if (!rt
->u
.dst
.metrics
[RTAX_MTU
-1])
1203 rt
->u
.dst
.metrics
[RTAX_MTU
-1] = ipv6_get_mtu(dev
);
1204 if (!rt
->u
.dst
.metrics
[RTAX_ADVMSS
-1])
1205 rt
->u
.dst
.metrics
[RTAX_ADVMSS
-1] = ipv6_advmss(dst_mtu(&rt
->u
.dst
));
1206 rt
->u
.dst
.dev
= dev
;
1207 rt
->rt6i_idev
= idev
;
1208 rt
->rt6i_table
= table
;
1209 return ip6_ins_rt(rt
, nlh
, _rtattr
, req
);
1217 dst_free((struct dst_entry
*) rt
);
1221 int ip6_del_rt(struct rt6_info
*rt
, struct nlmsghdr
*nlh
, void *_rtattr
, struct netlink_skb_parms
*req
)
1224 struct fib6_table
*table
;
1226 table
= rt
->rt6i_table
;
1227 write_lock_bh(&table
->tb6_lock
);
1229 err
= fib6_del(rt
, nlh
, _rtattr
, req
);
1230 dst_release(&rt
->u
.dst
);
1232 write_unlock_bh(&table
->tb6_lock
);
1237 static int ip6_route_del(struct in6_rtmsg
*rtmsg
, struct nlmsghdr
*nlh
,
1238 void *_rtattr
, struct netlink_skb_parms
*req
,
1241 struct fib6_table
*table
;
1242 struct fib6_node
*fn
;
1243 struct rt6_info
*rt
;
1246 table
= fib6_get_table(table_id
);
1250 read_lock_bh(&table
->tb6_lock
);
1252 fn
= fib6_locate(&table
->tb6_root
,
1253 &rtmsg
->rtmsg_dst
, rtmsg
->rtmsg_dst_len
,
1254 &rtmsg
->rtmsg_src
, rtmsg
->rtmsg_src_len
);
1257 for (rt
= fn
->leaf
; rt
; rt
= rt
->u
.next
) {
1258 if (rtmsg
->rtmsg_ifindex
&&
1259 (rt
->rt6i_dev
== NULL
||
1260 rt
->rt6i_dev
->ifindex
!= rtmsg
->rtmsg_ifindex
))
1262 if (rtmsg
->rtmsg_flags
&RTF_GATEWAY
&&
1263 !ipv6_addr_equal(&rtmsg
->rtmsg_gateway
, &rt
->rt6i_gateway
))
1265 if (rtmsg
->rtmsg_metric
&&
1266 rtmsg
->rtmsg_metric
!= rt
->rt6i_metric
)
1268 dst_hold(&rt
->u
.dst
);
1269 read_unlock_bh(&table
->tb6_lock
);
1271 return ip6_del_rt(rt
, nlh
, _rtattr
, req
);
1274 read_unlock_bh(&table
->tb6_lock
);
1282 void rt6_redirect(struct in6_addr
*dest
, struct in6_addr
*saddr
,
1283 struct neighbour
*neigh
, u8
*lladdr
, int on_link
)
1285 struct rt6_info
*rt
, *nrt
= NULL
;
1286 struct fib6_node
*fn
;
1287 struct fib6_table
*table
;
1288 struct netevent_redirect netevent
;
1290 /* TODO: Very lazy, might need to check all tables */
1291 table
= fib6_get_table(RT6_TABLE_MAIN
);
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
, dest
, NULL
);
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 (neigh
->dev
!= rt
->rt6i_dev
)
1324 if (!ipv6_addr_equal(saddr
, &rt
->rt6i_gateway
))
1329 dst_hold(&rt
->u
.dst
);
1330 else if (rt6_need_strict(dest
)) {
1331 while ((fn
= fn
->parent
) != NULL
) {
1332 if (fn
->fn_flags
& RTN_ROOT
)
1334 if (fn
->fn_flags
& RTN_RTINFO
)
1338 read_unlock_bh(&table
->tb6_lock
);
1341 if (net_ratelimit())
1342 printk(KERN_DEBUG
"rt6_redirect: source isn't a valid nexthop "
1343 "for redirect target\n");
1348 * We have finally decided to accept it.
1351 neigh_update(neigh
, lladdr
, NUD_STALE
,
1352 NEIGH_UPDATE_F_WEAK_OVERRIDE
|
1353 NEIGH_UPDATE_F_OVERRIDE
|
1354 (on_link
? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER
|
1355 NEIGH_UPDATE_F_ISROUTER
))
1359 * Redirect received -> path was valid.
1360 * Look, redirects are sent only in response to data packets,
1361 * so that this nexthop apparently is reachable. --ANK
1363 dst_confirm(&rt
->u
.dst
);
1365 /* Duplicate redirect: silently ignore. */
1366 if (neigh
== rt
->u
.dst
.neighbour
)
1369 nrt
= ip6_rt_copy(rt
);
1373 nrt
->rt6i_flags
= RTF_GATEWAY
|RTF_UP
|RTF_DYNAMIC
|RTF_CACHE
;
1375 nrt
->rt6i_flags
&= ~RTF_GATEWAY
;
1377 ipv6_addr_copy(&nrt
->rt6i_dst
.addr
, dest
);
1378 nrt
->rt6i_dst
.plen
= 128;
1379 nrt
->u
.dst
.flags
|= DST_HOST
;
1381 ipv6_addr_copy(&nrt
->rt6i_gateway
, (struct in6_addr
*)neigh
->primary_key
);
1382 nrt
->rt6i_nexthop
= neigh_clone(neigh
);
1383 /* Reset pmtu, it may be better */
1384 nrt
->u
.dst
.metrics
[RTAX_MTU
-1] = ipv6_get_mtu(neigh
->dev
);
1385 nrt
->u
.dst
.metrics
[RTAX_ADVMSS
-1] = ipv6_advmss(dst_mtu(&nrt
->u
.dst
));
1387 if (ip6_ins_rt(nrt
, NULL
, NULL
, NULL
))
1390 netevent
.old
= &rt
->u
.dst
;
1391 netevent
.new = &nrt
->u
.dst
;
1392 call_netevent_notifiers(NETEVENT_REDIRECT
, &netevent
);
1394 if (rt
->rt6i_flags
&RTF_CACHE
) {
1395 ip6_del_rt(rt
, NULL
, NULL
, NULL
);
1400 dst_release(&rt
->u
.dst
);
1405 * Handle ICMP "packet too big" messages
1406 * i.e. Path MTU discovery
1409 void rt6_pmtu_discovery(struct in6_addr
*daddr
, struct in6_addr
*saddr
,
1410 struct net_device
*dev
, u32 pmtu
)
1412 struct rt6_info
*rt
, *nrt
;
1415 rt
= rt6_lookup(daddr
, saddr
, dev
->ifindex
, 0);
1419 if (pmtu
>= dst_mtu(&rt
->u
.dst
))
1422 if (pmtu
< IPV6_MIN_MTU
) {
1424 * According to RFC2460, PMTU is set to the IPv6 Minimum Link
1425 * MTU (1280) and a fragment header should always be included
1426 * after a node receiving Too Big message reporting PMTU is
1427 * less than the IPv6 Minimum Link MTU.
1429 pmtu
= IPV6_MIN_MTU
;
1433 /* New mtu received -> path was valid.
1434 They are sent only in response to data packets,
1435 so that this nexthop apparently is reachable. --ANK
1437 dst_confirm(&rt
->u
.dst
);
1439 /* Host route. If it is static, it would be better
1440 not to override it, but add new one, so that
1441 when cache entry will expire old pmtu
1442 would return automatically.
1444 if (rt
->rt6i_flags
& RTF_CACHE
) {
1445 rt
->u
.dst
.metrics
[RTAX_MTU
-1] = pmtu
;
1447 rt
->u
.dst
.metrics
[RTAX_FEATURES
-1] |= RTAX_FEATURE_ALLFRAG
;
1448 dst_set_expires(&rt
->u
.dst
, ip6_rt_mtu_expires
);
1449 rt
->rt6i_flags
|= RTF_MODIFIED
|RTF_EXPIRES
;
1454 Two cases are possible:
1455 1. It is connected route. Action: COW
1456 2. It is gatewayed route or NONEXTHOP route. Action: clone it.
1458 if (!rt
->rt6i_nexthop
&& !(rt
->rt6i_flags
& RTF_NONEXTHOP
))
1459 nrt
= rt6_alloc_cow(rt
, daddr
, saddr
);
1461 nrt
= rt6_alloc_clone(rt
, daddr
);
1464 nrt
->u
.dst
.metrics
[RTAX_MTU
-1] = pmtu
;
1466 nrt
->u
.dst
.metrics
[RTAX_FEATURES
-1] |= RTAX_FEATURE_ALLFRAG
;
1468 /* According to RFC 1981, detecting PMTU increase shouldn't be
1469 * happened within 5 mins, the recommended timer is 10 mins.
1470 * Here this route expiration time is set to ip6_rt_mtu_expires
1471 * which is 10 mins. After 10 mins the decreased pmtu is expired
1472 * and detecting PMTU increase will be automatically happened.
1474 dst_set_expires(&nrt
->u
.dst
, ip6_rt_mtu_expires
);
1475 nrt
->rt6i_flags
|= RTF_DYNAMIC
|RTF_EXPIRES
;
1477 ip6_ins_rt(nrt
, NULL
, NULL
, NULL
);
1480 dst_release(&rt
->u
.dst
);
1484 * Misc support functions
1487 static struct rt6_info
* ip6_rt_copy(struct rt6_info
*ort
)
1489 struct rt6_info
*rt
= ip6_dst_alloc();
1492 rt
->u
.dst
.input
= ort
->u
.dst
.input
;
1493 rt
->u
.dst
.output
= ort
->u
.dst
.output
;
1495 memcpy(rt
->u
.dst
.metrics
, ort
->u
.dst
.metrics
, RTAX_MAX
*sizeof(u32
));
1496 rt
->u
.dst
.dev
= ort
->u
.dst
.dev
;
1498 dev_hold(rt
->u
.dst
.dev
);
1499 rt
->rt6i_idev
= ort
->rt6i_idev
;
1501 in6_dev_hold(rt
->rt6i_idev
);
1502 rt
->u
.dst
.lastuse
= jiffies
;
1503 rt
->rt6i_expires
= 0;
1505 ipv6_addr_copy(&rt
->rt6i_gateway
, &ort
->rt6i_gateway
);
1506 rt
->rt6i_flags
= ort
->rt6i_flags
& ~RTF_EXPIRES
;
1507 rt
->rt6i_metric
= 0;
1509 memcpy(&rt
->rt6i_dst
, &ort
->rt6i_dst
, sizeof(struct rt6key
));
1510 #ifdef CONFIG_IPV6_SUBTREES
1511 memcpy(&rt
->rt6i_src
, &ort
->rt6i_src
, sizeof(struct rt6key
));
1513 rt
->rt6i_table
= ort
->rt6i_table
;
1518 #ifdef CONFIG_IPV6_ROUTE_INFO
1519 static struct rt6_info
*rt6_get_route_info(struct in6_addr
*prefix
, int prefixlen
,
1520 struct in6_addr
*gwaddr
, int ifindex
)
1522 struct fib6_node
*fn
;
1523 struct rt6_info
*rt
= NULL
;
1524 struct fib6_table
*table
;
1526 table
= fib6_get_table(RT6_TABLE_INFO
);
1530 write_lock_bh(&table
->tb6_lock
);
1531 fn
= fib6_locate(&table
->tb6_root
, prefix
,prefixlen
, NULL
, 0);
1535 for (rt
= fn
->leaf
; rt
; rt
= rt
->u
.next
) {
1536 if (rt
->rt6i_dev
->ifindex
!= ifindex
)
1538 if ((rt
->rt6i_flags
& (RTF_ROUTEINFO
|RTF_GATEWAY
)) != (RTF_ROUTEINFO
|RTF_GATEWAY
))
1540 if (!ipv6_addr_equal(&rt
->rt6i_gateway
, gwaddr
))
1542 dst_hold(&rt
->u
.dst
);
1546 write_unlock_bh(&table
->tb6_lock
);
1550 static struct rt6_info
*rt6_add_route_info(struct in6_addr
*prefix
, int prefixlen
,
1551 struct in6_addr
*gwaddr
, int ifindex
,
1554 struct in6_rtmsg rtmsg
;
1556 memset(&rtmsg
, 0, sizeof(rtmsg
));
1557 rtmsg
.rtmsg_type
= RTMSG_NEWROUTE
;
1558 ipv6_addr_copy(&rtmsg
.rtmsg_dst
, prefix
);
1559 rtmsg
.rtmsg_dst_len
= prefixlen
;
1560 ipv6_addr_copy(&rtmsg
.rtmsg_gateway
, gwaddr
);
1561 rtmsg
.rtmsg_metric
= 1024;
1562 rtmsg
.rtmsg_flags
= RTF_GATEWAY
| RTF_ADDRCONF
| RTF_ROUTEINFO
| RTF_UP
| RTF_PREF(pref
);
1563 /* We should treat it as a default route if prefix length is 0. */
1565 rtmsg
.rtmsg_flags
|= RTF_DEFAULT
;
1566 rtmsg
.rtmsg_ifindex
= ifindex
;
1568 ip6_route_add(&rtmsg
, NULL
, NULL
, NULL
, RT6_TABLE_INFO
);
1570 return rt6_get_route_info(prefix
, prefixlen
, gwaddr
, ifindex
);
1574 struct rt6_info
*rt6_get_dflt_router(struct in6_addr
*addr
, struct net_device
*dev
)
1576 struct rt6_info
*rt
;
1577 struct fib6_table
*table
;
1579 table
= fib6_get_table(RT6_TABLE_DFLT
);
1583 write_lock_bh(&table
->tb6_lock
);
1584 for (rt
= table
->tb6_root
.leaf
; rt
; rt
=rt
->u
.next
) {
1585 if (dev
== rt
->rt6i_dev
&&
1586 ((rt
->rt6i_flags
& (RTF_ADDRCONF
| RTF_DEFAULT
)) == (RTF_ADDRCONF
| RTF_DEFAULT
)) &&
1587 ipv6_addr_equal(&rt
->rt6i_gateway
, addr
))
1591 dst_hold(&rt
->u
.dst
);
1592 write_unlock_bh(&table
->tb6_lock
);
1596 struct rt6_info
*rt6_add_dflt_router(struct in6_addr
*gwaddr
,
1597 struct net_device
*dev
,
1600 struct in6_rtmsg rtmsg
;
1602 memset(&rtmsg
, 0, sizeof(struct in6_rtmsg
));
1603 rtmsg
.rtmsg_type
= RTMSG_NEWROUTE
;
1604 ipv6_addr_copy(&rtmsg
.rtmsg_gateway
, gwaddr
);
1605 rtmsg
.rtmsg_metric
= 1024;
1606 rtmsg
.rtmsg_flags
= RTF_GATEWAY
| RTF_ADDRCONF
| RTF_DEFAULT
| RTF_UP
| RTF_EXPIRES
|
1609 rtmsg
.rtmsg_ifindex
= dev
->ifindex
;
1611 ip6_route_add(&rtmsg
, NULL
, NULL
, NULL
, RT6_TABLE_DFLT
);
1612 return rt6_get_dflt_router(gwaddr
, dev
);
1615 void rt6_purge_dflt_routers(void)
1617 struct rt6_info
*rt
;
1618 struct fib6_table
*table
;
1620 /* NOTE: Keep consistent with rt6_get_dflt_router */
1621 table
= fib6_get_table(RT6_TABLE_DFLT
);
1626 read_lock_bh(&table
->tb6_lock
);
1627 for (rt
= table
->tb6_root
.leaf
; rt
; rt
= rt
->u
.next
) {
1628 if (rt
->rt6i_flags
& (RTF_DEFAULT
| RTF_ADDRCONF
)) {
1629 dst_hold(&rt
->u
.dst
);
1630 read_unlock_bh(&table
->tb6_lock
);
1631 ip6_del_rt(rt
, NULL
, NULL
, NULL
);
1635 read_unlock_bh(&table
->tb6_lock
);
1638 int ipv6_route_ioctl(unsigned int cmd
, void __user
*arg
)
1640 struct in6_rtmsg rtmsg
;
1644 case SIOCADDRT
: /* Add a route */
1645 case SIOCDELRT
: /* Delete a route */
1646 if (!capable(CAP_NET_ADMIN
))
1648 err
= copy_from_user(&rtmsg
, arg
,
1649 sizeof(struct in6_rtmsg
));
1656 err
= ip6_route_add(&rtmsg
, NULL
, NULL
, NULL
,
1660 err
= ip6_route_del(&rtmsg
, NULL
, NULL
, NULL
,
1675 * Drop the packet on the floor
1678 static int ip6_pkt_discard(struct sk_buff
*skb
)
1680 int type
= ipv6_addr_type(&skb
->nh
.ipv6h
->daddr
);
1681 if (type
== IPV6_ADDR_ANY
|| type
== IPV6_ADDR_RESERVED
)
1682 IP6_INC_STATS(IPSTATS_MIB_INADDRERRORS
);
1684 IP6_INC_STATS(IPSTATS_MIB_OUTNOROUTES
);
1685 icmpv6_send(skb
, ICMPV6_DEST_UNREACH
, ICMPV6_NOROUTE
, 0, skb
->dev
);
1690 static int ip6_pkt_discard_out(struct sk_buff
*skb
)
1692 skb
->dev
= skb
->dst
->dev
;
1693 return ip6_pkt_discard(skb
);
1697 * Allocate a dst for local (unicast / anycast) address.
1700 struct rt6_info
*addrconf_dst_alloc(struct inet6_dev
*idev
,
1701 const struct in6_addr
*addr
,
1704 struct rt6_info
*rt
= ip6_dst_alloc();
1707 return ERR_PTR(-ENOMEM
);
1709 dev_hold(&loopback_dev
);
1712 rt
->u
.dst
.flags
= DST_HOST
;
1713 rt
->u
.dst
.input
= ip6_input
;
1714 rt
->u
.dst
.output
= ip6_output
;
1715 rt
->rt6i_dev
= &loopback_dev
;
1716 rt
->rt6i_idev
= idev
;
1717 rt
->u
.dst
.metrics
[RTAX_MTU
-1] = ipv6_get_mtu(rt
->rt6i_dev
);
1718 rt
->u
.dst
.metrics
[RTAX_ADVMSS
-1] = ipv6_advmss(dst_mtu(&rt
->u
.dst
));
1719 rt
->u
.dst
.metrics
[RTAX_HOPLIMIT
-1] = -1;
1720 rt
->u
.dst
.obsolete
= -1;
1722 rt
->rt6i_flags
= RTF_UP
| RTF_NONEXTHOP
;
1724 rt
->rt6i_flags
|= RTF_ANYCAST
;
1726 rt
->rt6i_flags
|= RTF_LOCAL
;
1727 rt
->rt6i_nexthop
= ndisc_get_neigh(rt
->rt6i_dev
, &rt
->rt6i_gateway
);
1728 if (rt
->rt6i_nexthop
== NULL
) {
1729 dst_free((struct dst_entry
*) rt
);
1730 return ERR_PTR(-ENOMEM
);
1733 ipv6_addr_copy(&rt
->rt6i_dst
.addr
, addr
);
1734 rt
->rt6i_dst
.plen
= 128;
1735 rt
->rt6i_table
= fib6_get_table(RT6_TABLE_LOCAL
);
1737 atomic_set(&rt
->u
.dst
.__refcnt
, 1);
1742 static int fib6_ifdown(struct rt6_info
*rt
, void *arg
)
1744 if (((void*)rt
->rt6i_dev
== arg
|| arg
== NULL
) &&
1745 rt
!= &ip6_null_entry
) {
1746 RT6_TRACE("deleted by ifdown %p\n", rt
);
1752 void rt6_ifdown(struct net_device
*dev
)
1754 fib6_clean_all(fib6_ifdown
, 0, dev
);
1757 struct rt6_mtu_change_arg
1759 struct net_device
*dev
;
1763 static int rt6_mtu_change_route(struct rt6_info
*rt
, void *p_arg
)
1765 struct rt6_mtu_change_arg
*arg
= (struct rt6_mtu_change_arg
*) p_arg
;
1766 struct inet6_dev
*idev
;
1768 /* In IPv6 pmtu discovery is not optional,
1769 so that RTAX_MTU lock cannot disable it.
1770 We still use this lock to block changes
1771 caused by addrconf/ndisc.
1774 idev
= __in6_dev_get(arg
->dev
);
1778 /* For administrative MTU increase, there is no way to discover
1779 IPv6 PMTU increase, so PMTU increase should be updated here.
1780 Since RFC 1981 doesn't include administrative MTU increase
1781 update PMTU increase is a MUST. (i.e. jumbo frame)
1784 If new MTU is less than route PMTU, this new MTU will be the
1785 lowest MTU in the path, update the route PMTU to reflect PMTU
1786 decreases; if new MTU is greater than route PMTU, and the
1787 old MTU is the lowest MTU in the path, update the route PMTU
1788 to reflect the increase. In this case if the other nodes' MTU
1789 also have the lowest MTU, TOO BIG MESSAGE will be lead to
1792 if (rt
->rt6i_dev
== arg
->dev
&&
1793 !dst_metric_locked(&rt
->u
.dst
, RTAX_MTU
) &&
1794 (dst_mtu(&rt
->u
.dst
) > arg
->mtu
||
1795 (dst_mtu(&rt
->u
.dst
) < arg
->mtu
&&
1796 dst_mtu(&rt
->u
.dst
) == idev
->cnf
.mtu6
)))
1797 rt
->u
.dst
.metrics
[RTAX_MTU
-1] = arg
->mtu
;
1798 rt
->u
.dst
.metrics
[RTAX_ADVMSS
-1] = ipv6_advmss(arg
->mtu
);
1802 void rt6_mtu_change(struct net_device
*dev
, unsigned mtu
)
1804 struct rt6_mtu_change_arg arg
= {
1809 fib6_clean_all(rt6_mtu_change_route
, 0, &arg
);
1812 static int inet6_rtm_to_rtmsg(struct rtmsg
*r
, struct rtattr
**rta
,
1813 struct in6_rtmsg
*rtmsg
)
1815 memset(rtmsg
, 0, sizeof(*rtmsg
));
1817 rtmsg
->rtmsg_dst_len
= r
->rtm_dst_len
;
1818 rtmsg
->rtmsg_src_len
= r
->rtm_src_len
;
1819 rtmsg
->rtmsg_flags
= RTF_UP
;
1820 if (r
->rtm_type
== RTN_UNREACHABLE
)
1821 rtmsg
->rtmsg_flags
|= RTF_REJECT
;
1823 if (rta
[RTA_GATEWAY
-1]) {
1824 if (rta
[RTA_GATEWAY
-1]->rta_len
!= RTA_LENGTH(16))
1826 memcpy(&rtmsg
->rtmsg_gateway
, RTA_DATA(rta
[RTA_GATEWAY
-1]), 16);
1827 rtmsg
->rtmsg_flags
|= RTF_GATEWAY
;
1829 if (rta
[RTA_DST
-1]) {
1830 if (RTA_PAYLOAD(rta
[RTA_DST
-1]) < ((r
->rtm_dst_len
+7)>>3))
1832 memcpy(&rtmsg
->rtmsg_dst
, RTA_DATA(rta
[RTA_DST
-1]), ((r
->rtm_dst_len
+7)>>3));
1834 if (rta
[RTA_SRC
-1]) {
1835 if (RTA_PAYLOAD(rta
[RTA_SRC
-1]) < ((r
->rtm_src_len
+7)>>3))
1837 memcpy(&rtmsg
->rtmsg_src
, RTA_DATA(rta
[RTA_SRC
-1]), ((r
->rtm_src_len
+7)>>3));
1839 if (rta
[RTA_OIF
-1]) {
1840 if (rta
[RTA_OIF
-1]->rta_len
!= RTA_LENGTH(sizeof(int)))
1842 memcpy(&rtmsg
->rtmsg_ifindex
, RTA_DATA(rta
[RTA_OIF
-1]), sizeof(int));
1844 if (rta
[RTA_PRIORITY
-1]) {
1845 if (rta
[RTA_PRIORITY
-1]->rta_len
!= RTA_LENGTH(4))
1847 memcpy(&rtmsg
->rtmsg_metric
, RTA_DATA(rta
[RTA_PRIORITY
-1]), 4);
1852 int inet6_rtm_delroute(struct sk_buff
*skb
, struct nlmsghdr
* nlh
, void *arg
)
1854 struct rtmsg
*r
= NLMSG_DATA(nlh
);
1855 struct in6_rtmsg rtmsg
;
1857 if (inet6_rtm_to_rtmsg(r
, arg
, &rtmsg
))
1859 return ip6_route_del(&rtmsg
, nlh
, arg
, &NETLINK_CB(skb
), r
->rtm_table
);
1862 int inet6_rtm_newroute(struct sk_buff
*skb
, struct nlmsghdr
* nlh
, void *arg
)
1864 struct rtmsg
*r
= NLMSG_DATA(nlh
);
1865 struct in6_rtmsg rtmsg
;
1867 if (inet6_rtm_to_rtmsg(r
, arg
, &rtmsg
))
1869 return ip6_route_add(&rtmsg
, nlh
, arg
, &NETLINK_CB(skb
), r
->rtm_table
);
1872 struct rt6_rtnl_dump_arg
1874 struct sk_buff
*skb
;
1875 struct netlink_callback
*cb
;
1878 static int rt6_fill_node(struct sk_buff
*skb
, struct rt6_info
*rt
,
1879 struct in6_addr
*dst
, struct in6_addr
*src
,
1880 int iif
, int type
, u32 pid
, u32 seq
,
1881 int prefix
, unsigned int flags
)
1884 struct nlmsghdr
*nlh
;
1885 unsigned char *b
= skb
->tail
;
1886 struct rta_cacheinfo ci
;
1888 if (prefix
) { /* user wants prefix routes only */
1889 if (!(rt
->rt6i_flags
& RTF_PREFIX_RT
)) {
1890 /* success since this is not a prefix route */
1895 nlh
= NLMSG_NEW(skb
, pid
, seq
, type
, sizeof(*rtm
), flags
);
1896 rtm
= NLMSG_DATA(nlh
);
1897 rtm
->rtm_family
= AF_INET6
;
1898 rtm
->rtm_dst_len
= rt
->rt6i_dst
.plen
;
1899 rtm
->rtm_src_len
= rt
->rt6i_src
.plen
;
1902 rtm
->rtm_table
= rt
->rt6i_table
->tb6_id
;
1904 rtm
->rtm_table
= RT6_TABLE_UNSPEC
;
1905 if (rt
->rt6i_flags
&RTF_REJECT
)
1906 rtm
->rtm_type
= RTN_UNREACHABLE
;
1907 else if (rt
->rt6i_dev
&& (rt
->rt6i_dev
->flags
&IFF_LOOPBACK
))
1908 rtm
->rtm_type
= RTN_LOCAL
;
1910 rtm
->rtm_type
= RTN_UNICAST
;
1912 rtm
->rtm_scope
= RT_SCOPE_UNIVERSE
;
1913 rtm
->rtm_protocol
= rt
->rt6i_protocol
;
1914 if (rt
->rt6i_flags
&RTF_DYNAMIC
)
1915 rtm
->rtm_protocol
= RTPROT_REDIRECT
;
1916 else if (rt
->rt6i_flags
& RTF_ADDRCONF
)
1917 rtm
->rtm_protocol
= RTPROT_KERNEL
;
1918 else if (rt
->rt6i_flags
&RTF_DEFAULT
)
1919 rtm
->rtm_protocol
= RTPROT_RA
;
1921 if (rt
->rt6i_flags
&RTF_CACHE
)
1922 rtm
->rtm_flags
|= RTM_F_CLONED
;
1925 RTA_PUT(skb
, RTA_DST
, 16, dst
);
1926 rtm
->rtm_dst_len
= 128;
1927 } else if (rtm
->rtm_dst_len
)
1928 RTA_PUT(skb
, RTA_DST
, 16, &rt
->rt6i_dst
.addr
);
1929 #ifdef CONFIG_IPV6_SUBTREES
1931 RTA_PUT(skb
, RTA_SRC
, 16, src
);
1932 rtm
->rtm_src_len
= 128;
1933 } else if (rtm
->rtm_src_len
)
1934 RTA_PUT(skb
, RTA_SRC
, 16, &rt
->rt6i_src
.addr
);
1937 RTA_PUT(skb
, RTA_IIF
, 4, &iif
);
1939 struct in6_addr saddr_buf
;
1940 if (ipv6_get_saddr(&rt
->u
.dst
, dst
, &saddr_buf
) == 0)
1941 RTA_PUT(skb
, RTA_PREFSRC
, 16, &saddr_buf
);
1943 if (rtnetlink_put_metrics(skb
, rt
->u
.dst
.metrics
) < 0)
1944 goto rtattr_failure
;
1945 if (rt
->u
.dst
.neighbour
)
1946 RTA_PUT(skb
, RTA_GATEWAY
, 16, &rt
->u
.dst
.neighbour
->primary_key
);
1948 RTA_PUT(skb
, RTA_OIF
, sizeof(int), &rt
->rt6i_dev
->ifindex
);
1949 RTA_PUT(skb
, RTA_PRIORITY
, 4, &rt
->rt6i_metric
);
1950 ci
.rta_lastuse
= jiffies_to_clock_t(jiffies
- rt
->u
.dst
.lastuse
);
1951 if (rt
->rt6i_expires
)
1952 ci
.rta_expires
= jiffies_to_clock_t(rt
->rt6i_expires
- jiffies
);
1955 ci
.rta_used
= rt
->u
.dst
.__use
;
1956 ci
.rta_clntref
= atomic_read(&rt
->u
.dst
.__refcnt
);
1957 ci
.rta_error
= rt
->u
.dst
.error
;
1961 RTA_PUT(skb
, RTA_CACHEINFO
, sizeof(ci
), &ci
);
1962 nlh
->nlmsg_len
= skb
->tail
- b
;
1967 skb_trim(skb
, b
- skb
->data
);
1971 static int rt6_dump_route(struct rt6_info
*rt
, void *p_arg
)
1973 struct rt6_rtnl_dump_arg
*arg
= (struct rt6_rtnl_dump_arg
*) p_arg
;
1976 if (arg
->cb
->nlh
->nlmsg_len
>= NLMSG_LENGTH(sizeof(struct rtmsg
))) {
1977 struct rtmsg
*rtm
= NLMSG_DATA(arg
->cb
->nlh
);
1978 prefix
= (rtm
->rtm_flags
& RTM_F_PREFIX
) != 0;
1982 return rt6_fill_node(arg
->skb
, rt
, NULL
, NULL
, 0, RTM_NEWROUTE
,
1983 NETLINK_CB(arg
->cb
->skb
).pid
, arg
->cb
->nlh
->nlmsg_seq
,
1984 prefix
, NLM_F_MULTI
);
1987 static int fib6_dump_node(struct fib6_walker_t
*w
)
1990 struct rt6_info
*rt
;
1992 for (rt
= w
->leaf
; rt
; rt
= rt
->u
.next
) {
1993 res
= rt6_dump_route(rt
, w
->args
);
1995 /* Frame is full, suspend walking */
2005 static void fib6_dump_end(struct netlink_callback
*cb
)
2007 struct fib6_walker_t
*w
= (void*)cb
->args
[0];
2013 cb
->done
= (void*)cb
->args
[1];
2017 static int fib6_dump_done(struct netlink_callback
*cb
)
2020 return cb
->done
? cb
->done(cb
) : 0;
2023 int inet6_dump_fib(struct sk_buff
*skb
, struct netlink_callback
*cb
)
2025 struct fib6_table
*table
;
2026 struct rt6_rtnl_dump_arg arg
;
2027 struct fib6_walker_t
*w
;
2034 * cb->args[0] = pointer to walker structure
2035 * cb->args[1] = saved cb->done() pointer
2036 * cb->args[2] = current table being dumped
2039 w
= (void*)cb
->args
[0];
2043 * 1. hook callback destructor.
2045 cb
->args
[1] = (long)cb
->done
;
2046 cb
->done
= fib6_dump_done
;
2049 * 2. allocate and initialize walker.
2051 w
= kzalloc(sizeof(*w
), GFP_ATOMIC
);
2054 w
->func
= fib6_dump_node
;
2056 cb
->args
[0] = (long)w
;
2057 cb
->args
[2] = FIB6_TABLE_MIN
;
2061 if (i
> FIB6_TABLE_MAX
)
2064 table
= fib6_get_table(i
);
2065 if (table
!= NULL
) {
2066 read_lock_bh(&table
->tb6_lock
);
2067 w
->root
= &table
->tb6_root
;
2068 res
= fib6_walk_continue(w
);
2069 read_unlock_bh(&table
->tb6_lock
);
2072 fib6_walker_unlink(w
);
2077 fib6_walker_unlink(w
);
2081 for (i
= cb
->args
[2]; i
<= FIB6_TABLE_MAX
; i
++) {
2082 table
= fib6_get_table(i
);
2086 read_lock_bh(&table
->tb6_lock
);
2087 w
->root
= &table
->tb6_root
;
2089 read_unlock_bh(&table
->tb6_lock
);
2096 res
= res
< 0 ? res
: skb
->len
;
2097 /* res < 0 is an error. (really, impossible)
2098 res == 0 means that dump is complete, but skb still can contain data.
2099 res > 0 dump is not complete, but frame is full.
2101 /* Destroy walker, if dump of this table is complete. */
2107 int inet6_rtm_getroute(struct sk_buff
*in_skb
, struct nlmsghdr
* nlh
, void *arg
)
2109 struct rtattr
**rta
= arg
;
2112 struct sk_buff
*skb
;
2114 struct rt6_info
*rt
;
2116 skb
= alloc_skb(NLMSG_GOODSIZE
, GFP_KERNEL
);
2120 /* Reserve room for dummy headers, this skb can pass
2121 through good chunk of routing engine.
2123 skb
->mac
.raw
= skb
->data
;
2124 skb_reserve(skb
, MAX_HEADER
+ sizeof(struct ipv6hdr
));
2126 memset(&fl
, 0, sizeof(fl
));
2128 ipv6_addr_copy(&fl
.fl6_src
,
2129 (struct in6_addr
*)RTA_DATA(rta
[RTA_SRC
-1]));
2131 ipv6_addr_copy(&fl
.fl6_dst
,
2132 (struct in6_addr
*)RTA_DATA(rta
[RTA_DST
-1]));
2135 memcpy(&iif
, RTA_DATA(rta
[RTA_IIF
-1]), sizeof(int));
2138 struct net_device
*dev
;
2139 dev
= __dev_get_by_index(iif
);
2148 memcpy(&fl
.oif
, RTA_DATA(rta
[RTA_OIF
-1]), sizeof(int));
2150 rt
= (struct rt6_info
*)ip6_route_output(NULL
, &fl
);
2152 skb
->dst
= &rt
->u
.dst
;
2154 NETLINK_CB(skb
).dst_pid
= NETLINK_CB(in_skb
).pid
;
2155 err
= rt6_fill_node(skb
, rt
,
2156 &fl
.fl6_dst
, &fl
.fl6_src
,
2158 RTM_NEWROUTE
, NETLINK_CB(in_skb
).pid
,
2159 nlh
->nlmsg_seq
, 0, 0);
2165 err
= netlink_unicast(rtnl
, skb
, NETLINK_CB(in_skb
).pid
, MSG_DONTWAIT
);
2175 void inet6_rt_notify(int event
, struct rt6_info
*rt
, struct nlmsghdr
*nlh
,
2176 struct netlink_skb_parms
*req
)
2178 struct sk_buff
*skb
;
2179 int size
= NLMSG_SPACE(sizeof(struct rtmsg
)+256);
2180 u32 pid
= current
->pid
;
2186 seq
= nlh
->nlmsg_seq
;
2188 skb
= alloc_skb(size
, gfp_any());
2190 netlink_set_err(rtnl
, 0, RTNLGRP_IPV6_ROUTE
, ENOBUFS
);
2193 if (rt6_fill_node(skb
, rt
, NULL
, NULL
, 0, event
, pid
, seq
, 0, 0) < 0) {
2195 netlink_set_err(rtnl
, 0, RTNLGRP_IPV6_ROUTE
, EINVAL
);
2198 NETLINK_CB(skb
).dst_group
= RTNLGRP_IPV6_ROUTE
;
2199 netlink_broadcast(rtnl
, skb
, 0, RTNLGRP_IPV6_ROUTE
, gfp_any());
2206 #ifdef CONFIG_PROC_FS
2208 #define RT6_INFO_LEN (32 + 4 + 32 + 4 + 32 + 40 + 5 + 1)
2219 static int rt6_info_route(struct rt6_info
*rt
, void *p_arg
)
2221 struct rt6_proc_arg
*arg
= (struct rt6_proc_arg
*) p_arg
;
2224 if (arg
->skip
< arg
->offset
/ RT6_INFO_LEN
) {
2229 if (arg
->len
>= arg
->length
)
2232 for (i
=0; i
<16; i
++) {
2233 sprintf(arg
->buffer
+ arg
->len
, "%02x",
2234 rt
->rt6i_dst
.addr
.s6_addr
[i
]);
2237 arg
->len
+= sprintf(arg
->buffer
+ arg
->len
, " %02x ",
2240 #ifdef CONFIG_IPV6_SUBTREES
2241 for (i
=0; i
<16; i
++) {
2242 sprintf(arg
->buffer
+ arg
->len
, "%02x",
2243 rt
->rt6i_src
.addr
.s6_addr
[i
]);
2246 arg
->len
+= sprintf(arg
->buffer
+ arg
->len
, " %02x ",
2249 sprintf(arg
->buffer
+ arg
->len
,
2250 "00000000000000000000000000000000 00 ");
2254 if (rt
->rt6i_nexthop
) {
2255 for (i
=0; i
<16; i
++) {
2256 sprintf(arg
->buffer
+ arg
->len
, "%02x",
2257 rt
->rt6i_nexthop
->primary_key
[i
]);
2261 sprintf(arg
->buffer
+ arg
->len
,
2262 "00000000000000000000000000000000");
2265 arg
->len
+= sprintf(arg
->buffer
+ arg
->len
,
2266 " %08x %08x %08x %08x %8s\n",
2267 rt
->rt6i_metric
, atomic_read(&rt
->u
.dst
.__refcnt
),
2268 rt
->u
.dst
.__use
, rt
->rt6i_flags
,
2269 rt
->rt6i_dev
? rt
->rt6i_dev
->name
: "");
2273 static int rt6_proc_info(char *buffer
, char **start
, off_t offset
, int length
)
2275 struct rt6_proc_arg arg
= {
2281 fib6_clean_all(rt6_info_route
, 0, &arg
);
2285 *start
+= offset
% RT6_INFO_LEN
;
2287 arg
.len
-= offset
% RT6_INFO_LEN
;
2289 if (arg
.len
> length
)
2297 static int rt6_stats_seq_show(struct seq_file
*seq
, void *v
)
2299 seq_printf(seq
, "%04x %04x %04x %04x %04x %04x %04x\n",
2300 rt6_stats
.fib_nodes
, rt6_stats
.fib_route_nodes
,
2301 rt6_stats
.fib_rt_alloc
, rt6_stats
.fib_rt_entries
,
2302 rt6_stats
.fib_rt_cache
,
2303 atomic_read(&ip6_dst_ops
.entries
),
2304 rt6_stats
.fib_discarded_routes
);
2309 static int rt6_stats_seq_open(struct inode
*inode
, struct file
*file
)
2311 return single_open(file
, rt6_stats_seq_show
, NULL
);
2314 static struct file_operations rt6_stats_seq_fops
= {
2315 .owner
= THIS_MODULE
,
2316 .open
= rt6_stats_seq_open
,
2318 .llseek
= seq_lseek
,
2319 .release
= single_release
,
2321 #endif /* CONFIG_PROC_FS */
2323 #ifdef CONFIG_SYSCTL
2325 static int flush_delay
;
2328 int ipv6_sysctl_rtcache_flush(ctl_table
*ctl
, int write
, struct file
* filp
,
2329 void __user
*buffer
, size_t *lenp
, loff_t
*ppos
)
2332 proc_dointvec(ctl
, write
, filp
, buffer
, lenp
, ppos
);
2333 fib6_run_gc(flush_delay
<= 0 ? ~0UL : (unsigned long)flush_delay
);
2339 ctl_table ipv6_route_table
[] = {
2341 .ctl_name
= NET_IPV6_ROUTE_FLUSH
,
2342 .procname
= "flush",
2343 .data
= &flush_delay
,
2344 .maxlen
= sizeof(int),
2346 .proc_handler
= &ipv6_sysctl_rtcache_flush
2349 .ctl_name
= NET_IPV6_ROUTE_GC_THRESH
,
2350 .procname
= "gc_thresh",
2351 .data
= &ip6_dst_ops
.gc_thresh
,
2352 .maxlen
= sizeof(int),
2354 .proc_handler
= &proc_dointvec
,
2357 .ctl_name
= NET_IPV6_ROUTE_MAX_SIZE
,
2358 .procname
= "max_size",
2359 .data
= &ip6_rt_max_size
,
2360 .maxlen
= sizeof(int),
2362 .proc_handler
= &proc_dointvec
,
2365 .ctl_name
= NET_IPV6_ROUTE_GC_MIN_INTERVAL
,
2366 .procname
= "gc_min_interval",
2367 .data
= &ip6_rt_gc_min_interval
,
2368 .maxlen
= sizeof(int),
2370 .proc_handler
= &proc_dointvec_jiffies
,
2371 .strategy
= &sysctl_jiffies
,
2374 .ctl_name
= NET_IPV6_ROUTE_GC_TIMEOUT
,
2375 .procname
= "gc_timeout",
2376 .data
= &ip6_rt_gc_timeout
,
2377 .maxlen
= sizeof(int),
2379 .proc_handler
= &proc_dointvec_jiffies
,
2380 .strategy
= &sysctl_jiffies
,
2383 .ctl_name
= NET_IPV6_ROUTE_GC_INTERVAL
,
2384 .procname
= "gc_interval",
2385 .data
= &ip6_rt_gc_interval
,
2386 .maxlen
= sizeof(int),
2388 .proc_handler
= &proc_dointvec_jiffies
,
2389 .strategy
= &sysctl_jiffies
,
2392 .ctl_name
= NET_IPV6_ROUTE_GC_ELASTICITY
,
2393 .procname
= "gc_elasticity",
2394 .data
= &ip6_rt_gc_elasticity
,
2395 .maxlen
= sizeof(int),
2397 .proc_handler
= &proc_dointvec_jiffies
,
2398 .strategy
= &sysctl_jiffies
,
2401 .ctl_name
= NET_IPV6_ROUTE_MTU_EXPIRES
,
2402 .procname
= "mtu_expires",
2403 .data
= &ip6_rt_mtu_expires
,
2404 .maxlen
= sizeof(int),
2406 .proc_handler
= &proc_dointvec_jiffies
,
2407 .strategy
= &sysctl_jiffies
,
2410 .ctl_name
= NET_IPV6_ROUTE_MIN_ADVMSS
,
2411 .procname
= "min_adv_mss",
2412 .data
= &ip6_rt_min_advmss
,
2413 .maxlen
= sizeof(int),
2415 .proc_handler
= &proc_dointvec_jiffies
,
2416 .strategy
= &sysctl_jiffies
,
2419 .ctl_name
= NET_IPV6_ROUTE_GC_MIN_INTERVAL_MS
,
2420 .procname
= "gc_min_interval_ms",
2421 .data
= &ip6_rt_gc_min_interval
,
2422 .maxlen
= sizeof(int),
2424 .proc_handler
= &proc_dointvec_ms_jiffies
,
2425 .strategy
= &sysctl_ms_jiffies
,
2432 void __init
ip6_route_init(void)
2434 struct proc_dir_entry
*p
;
2436 ip6_dst_ops
.kmem_cachep
= kmem_cache_create("ip6_dst_cache",
2437 sizeof(struct rt6_info
),
2438 0, SLAB_HWCACHE_ALIGN
,
2440 if (!ip6_dst_ops
.kmem_cachep
)
2441 panic("cannot create ip6_dst_cache");
2444 #ifdef CONFIG_PROC_FS
2445 p
= proc_net_create("ipv6_route", 0, rt6_proc_info
);
2447 p
->owner
= THIS_MODULE
;
2449 proc_net_fops_create("rt6_stats", S_IRUGO
, &rt6_stats_seq_fops
);
2454 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
2459 void ip6_route_cleanup(void)
2461 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
2462 fib6_rules_cleanup();
2464 #ifdef CONFIG_PROC_FS
2465 proc_net_remove("ipv6_route");
2466 proc_net_remove("rt6_stats");
2473 kmem_cache_destroy(ip6_dst_ops
.kmem_cachep
);