| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  *	Linux INET6 implementation  | 
 | 3 |  * | 
 | 4 |  *	Authors: | 
 | 5 |  *	Pedro Roque		<roque@di.fc.ul.pt>	 | 
 | 6 |  * | 
 | 7 |  *	This program is free software; you can redistribute it and/or | 
 | 8 |  *      modify it under the terms of the GNU General Public License | 
 | 9 |  *      as published by the Free Software Foundation; either version | 
 | 10 |  *      2 of the License, or (at your option) any later version. | 
 | 11 |  */ | 
 | 12 |  | 
 | 13 | #ifndef _IP6_FIB_H | 
 | 14 | #define _IP6_FIB_H | 
 | 15 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 16 | #include <linux/ipv6_route.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 17 | #include <linux/rtnetlink.h> | 
 | 18 | #include <linux/spinlock.h> | 
| Thomas Graf | 86872cb | 2006-08-22 00:01:08 -0700 | [diff] [blame] | 19 | #include <net/dst.h> | 
 | 20 | #include <net/flow.h> | 
 | 21 | #include <net/netlink.h> | 
| David S. Miller | b341936 | 2010-11-30 12:27:11 -0800 | [diff] [blame] | 22 | #include <net/inetpeer.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 23 |  | 
| Neil Horman | a33bc5c | 2009-07-30 18:52:15 -0700 | [diff] [blame] | 24 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 
 | 25 | #define FIB6_TABLE_HASHSZ 256 | 
 | 26 | #else | 
 | 27 | #define FIB6_TABLE_HASHSZ 1 | 
 | 28 | #endif | 
 | 29 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 30 | struct rt6_info; | 
 | 31 |  | 
| Eric Dumazet | fd2c3ef | 2009-11-03 03:26:03 +0000 | [diff] [blame] | 32 | struct fib6_config { | 
| Thomas Graf | 86872cb | 2006-08-22 00:01:08 -0700 | [diff] [blame] | 33 | 	u32		fc_table; | 
 | 34 | 	u32		fc_metric; | 
 | 35 | 	int		fc_dst_len; | 
 | 36 | 	int		fc_src_len; | 
 | 37 | 	int		fc_ifindex; | 
 | 38 | 	u32		fc_flags; | 
 | 39 | 	u32		fc_protocol; | 
| Nicolas Dichtel | ef2c7d7 | 2012-09-05 02:12:42 +0000 | [diff] [blame] | 40 | 	u32		fc_type;	/* only 8 bits are used */ | 
| Thomas Graf | 86872cb | 2006-08-22 00:01:08 -0700 | [diff] [blame] | 41 |  | 
 | 42 | 	struct in6_addr	fc_dst; | 
 | 43 | 	struct in6_addr	fc_src; | 
| Daniel Walter | c3968a8 | 2011-04-13 21:10:57 +0000 | [diff] [blame] | 44 | 	struct in6_addr	fc_prefsrc; | 
| Thomas Graf | 86872cb | 2006-08-22 00:01:08 -0700 | [diff] [blame] | 45 | 	struct in6_addr	fc_gateway; | 
 | 46 |  | 
 | 47 | 	unsigned long	fc_expires; | 
 | 48 | 	struct nlattr	*fc_mx; | 
 | 49 | 	int		fc_mx_len; | 
| Nicolas Dichtel | 51ebd31 | 2012-10-22 03:42:09 +0000 | [diff] [blame] | 50 | 	int		fc_mp_len; | 
 | 51 | 	struct nlattr	*fc_mp; | 
| Thomas Graf | 86872cb | 2006-08-22 00:01:08 -0700 | [diff] [blame] | 52 |  | 
 | 53 | 	struct nl_info	fc_nlinfo; | 
 | 54 | }; | 
 | 55 |  | 
| Eric Dumazet | fd2c3ef | 2009-11-03 03:26:03 +0000 | [diff] [blame] | 56 | struct fib6_node { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 57 | 	struct fib6_node	*parent; | 
 | 58 | 	struct fib6_node	*left; | 
 | 59 | 	struct fib6_node	*right; | 
| Kim Nordlund | 8bce65b | 2006-12-13 16:38:29 -0800 | [diff] [blame] | 60 | #ifdef CONFIG_IPV6_SUBTREES | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 61 | 	struct fib6_node	*subtree; | 
| Kim Nordlund | 8bce65b | 2006-12-13 16:38:29 -0800 | [diff] [blame] | 62 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 63 | 	struct rt6_info		*leaf; | 
 | 64 |  | 
 | 65 | 	__u16			fn_bit;		/* bit key */ | 
 | 66 | 	__u16			fn_flags; | 
 | 67 | 	__u32			fn_sernum; | 
| David S. Miller | f11e665 | 2007-03-24 20:36:25 -0700 | [diff] [blame] | 68 | 	struct rt6_info		*rr_ptr; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 69 | }; | 
 | 70 |  | 
| YOSHIFUJI Hideaki | 7fc3316 | 2006-08-23 17:22:24 -0700 | [diff] [blame] | 71 | #ifndef CONFIG_IPV6_SUBTREES | 
 | 72 | #define FIB6_SUBTREE(fn)	NULL | 
 | 73 | #else | 
 | 74 | #define FIB6_SUBTREE(fn)	((fn)->subtree) | 
 | 75 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 76 |  | 
 | 77 | /* | 
 | 78 |  *	routing information | 
 | 79 |  * | 
 | 80 |  */ | 
 | 81 |  | 
| Eric Dumazet | fd2c3ef | 2009-11-03 03:26:03 +0000 | [diff] [blame] | 82 | struct rt6key { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 83 | 	struct in6_addr	addr; | 
 | 84 | 	int		plen; | 
 | 85 | }; | 
 | 86 |  | 
| Thomas Graf | c71099a | 2006-08-04 23:20:06 -0700 | [diff] [blame] | 87 | struct fib6_table; | 
 | 88 |  | 
| Eric Dumazet | fd2c3ef | 2009-11-03 03:26:03 +0000 | [diff] [blame] | 89 | struct rt6_info { | 
| Changli Gao | d8d1f30 | 2010-06-10 23:31:35 -0700 | [diff] [blame] | 90 | 	struct dst_entry		dst; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 91 |  | 
| YOSHIFUJI Hideaki / 吉藤英明 | bd2c77a | 2010-03-31 22:24:22 +0000 | [diff] [blame] | 92 | 	/* | 
 | 93 | 	 * Tail elements of dst_entry (__refcnt etc.) | 
 | 94 | 	 * and these elements (rarely used in hot path) are in | 
 | 95 | 	 * the same cache line. | 
 | 96 | 	 */ | 
 | 97 | 	struct fib6_table		*rt6i_table; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 98 | 	struct fib6_node		*rt6i_node; | 
 | 99 |  | 
 | 100 | 	struct in6_addr			rt6i_gateway; | 
| YOSHIFUJI Hideaki / 吉藤英明 | bd2c77a | 2010-03-31 22:24:22 +0000 | [diff] [blame] | 101 |  | 
| Nicolas Dichtel | 51ebd31 | 2012-10-22 03:42:09 +0000 | [diff] [blame] | 102 | 	/* Multipath routes: | 
 | 103 | 	 * siblings is a list of rt6_info that have the the same metric/weight, | 
 | 104 | 	 * destination, but not the same gateway. nsiblings is just a cache | 
 | 105 | 	 * to speed up lookup. | 
 | 106 | 	 */ | 
 | 107 | 	struct list_head		rt6i_siblings; | 
 | 108 | 	unsigned int			rt6i_nsiblings; | 
 | 109 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 110 | 	atomic_t			rt6i_ref; | 
| Herbert Xu | b4ce927 | 2007-11-13 21:33:32 -0800 | [diff] [blame] | 111 |  | 
| YOSHIFUJI Hideaki / 吉藤英明 | bd2c77a | 2010-03-31 22:24:22 +0000 | [diff] [blame] | 112 | 	/* These are in a separate cache line. */ | 
 | 113 | 	struct rt6key			rt6i_dst ____cacheline_aligned_in_smp; | 
 | 114 | 	u32				rt6i_flags; | 
 | 115 | 	struct rt6key			rt6i_src; | 
| Daniel Walter | c3968a8 | 2011-04-13 21:10:57 +0000 | [diff] [blame] | 116 | 	struct rt6key			rt6i_prefsrc; | 
| YOSHIFUJI Hideaki / 吉藤英明 | bd2c77a | 2010-03-31 22:24:22 +0000 | [diff] [blame] | 117 | 	u32				rt6i_metric; | 
| Herbert Xu | b4ce927 | 2007-11-13 21:33:32 -0800 | [diff] [blame] | 118 |  | 
| YOSHIFUJI Hideaki / 吉藤英明 | bd2c77a | 2010-03-31 22:24:22 +0000 | [diff] [blame] | 119 | 	struct inet6_dev		*rt6i_idev; | 
| David S. Miller | 97bab73 | 2012-06-09 22:36:36 -0700 | [diff] [blame] | 120 | 	unsigned long			_rt6i_peer; | 
| Noriaki TAKAMIYA | a47ed4c | 2007-09-06 03:31:25 -0700 | [diff] [blame] | 121 |  | 
| Nicolas Dichtel | 6f3118b | 2012-09-10 22:09:46 +0000 | [diff] [blame] | 122 | 	u32				rt6i_genid; | 
 | 123 |  | 
| YOSHIFUJI Hideaki / 吉藤英明 | bd2c77a | 2010-03-31 22:24:22 +0000 | [diff] [blame] | 124 | 	/* more non-fragment space at head required */ | 
 | 125 | 	unsigned short			rt6i_nfheader_len; | 
| Herbert Xu | b4ce927 | 2007-11-13 21:33:32 -0800 | [diff] [blame] | 126 |  | 
| YOSHIFUJI Hideaki / 吉藤英明 | bd2c77a | 2010-03-31 22:24:22 +0000 | [diff] [blame] | 127 | 	u8				rt6i_protocol; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 128 | }; | 
 | 129 |  | 
| David S. Miller | 97bab73 | 2012-06-09 22:36:36 -0700 | [diff] [blame] | 130 | static inline struct inet_peer *rt6_peer_ptr(struct rt6_info *rt) | 
 | 131 | { | 
 | 132 | 	return inetpeer_ptr(rt->_rt6i_peer); | 
 | 133 | } | 
 | 134 |  | 
 | 135 | static inline bool rt6_has_peer(struct rt6_info *rt) | 
 | 136 | { | 
 | 137 | 	return inetpeer_ptr_is_peer(rt->_rt6i_peer); | 
 | 138 | } | 
 | 139 |  | 
 | 140 | static inline void __rt6_set_peer(struct rt6_info *rt, struct inet_peer *peer) | 
 | 141 | { | 
 | 142 | 	__inetpeer_ptr_set_peer(&rt->_rt6i_peer, peer); | 
 | 143 | } | 
 | 144 |  | 
 | 145 | static inline bool rt6_set_peer(struct rt6_info *rt, struct inet_peer *peer) | 
 | 146 | { | 
 | 147 | 	return inetpeer_ptr_set_peer(&rt->_rt6i_peer, peer); | 
 | 148 | } | 
 | 149 |  | 
 | 150 | static inline void rt6_init_peer(struct rt6_info *rt, struct inet_peer_base *base) | 
 | 151 | { | 
 | 152 | 	inetpeer_init_ptr(&rt->_rt6i_peer, base); | 
 | 153 | } | 
 | 154 |  | 
 | 155 | static inline void rt6_transfer_peer(struct rt6_info *rt, struct rt6_info *ort) | 
 | 156 | { | 
 | 157 | 	inetpeer_transfer_peer(&rt->_rt6i_peer, &ort->_rt6i_peer); | 
 | 158 | } | 
 | 159 |  | 
| YOSHIFUJI Hideaki | 7a3025b | 2006-10-13 16:17:25 +0900 | [diff] [blame] | 160 | static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst) | 
 | 161 | { | 
 | 162 | 	return ((struct rt6_info *)dst)->rt6i_idev; | 
 | 163 | } | 
 | 164 |  | 
| Gao feng | 1716a96 | 2012-04-06 00:13:10 +0000 | [diff] [blame] | 165 | static inline void rt6_clean_expires(struct rt6_info *rt) | 
 | 166 | { | 
| Gao feng | 1716a96 | 2012-04-06 00:13:10 +0000 | [diff] [blame] | 167 | 	rt->rt6i_flags &= ~RTF_EXPIRES; | 
| Gao feng | 1716a96 | 2012-04-06 00:13:10 +0000 | [diff] [blame] | 168 | } | 
 | 169 |  | 
 | 170 | static inline void rt6_set_expires(struct rt6_info *rt, unsigned long expires) | 
 | 171 | { | 
| Gao feng | 1716a96 | 2012-04-06 00:13:10 +0000 | [diff] [blame] | 172 | 	rt->dst.expires = expires; | 
| YOSHIFUJI Hideaki / 吉藤英明 | ecd9883 | 2013-02-20 00:29:08 +0000 | [diff] [blame] | 173 | 	rt->rt6i_flags |= RTF_EXPIRES; | 
| Gao feng | 1716a96 | 2012-04-06 00:13:10 +0000 | [diff] [blame] | 174 | } | 
 | 175 |  | 
| YOSHIFUJI Hideaki / 吉藤英明 | ecd9883 | 2013-02-20 00:29:08 +0000 | [diff] [blame] | 176 | static inline void rt6_update_expires(struct rt6_info *rt0, int timeout) | 
| Gao feng | 1716a96 | 2012-04-06 00:13:10 +0000 | [diff] [blame] | 177 | { | 
| YOSHIFUJI Hideaki / 吉藤英明 | ecd9883 | 2013-02-20 00:29:08 +0000 | [diff] [blame] | 178 | 	struct rt6_info *rt; | 
| Gao feng | 1716a96 | 2012-04-06 00:13:10 +0000 | [diff] [blame] | 179 |  | 
| YOSHIFUJI Hideaki / 吉藤英明 | ecd9883 | 2013-02-20 00:29:08 +0000 | [diff] [blame] | 180 | 	for (rt = rt0; rt && !(rt->rt6i_flags & RTF_EXPIRES); | 
 | 181 | 	     rt = (struct rt6_info *)rt->dst.from); | 
 | 182 | 	if (rt && rt != rt0) | 
 | 183 | 		rt0->dst.expires = rt->dst.expires; | 
 | 184 |  | 
 | 185 | 	dst_set_expires(&rt0->dst, timeout); | 
 | 186 | 	rt0->rt6i_flags |= RTF_EXPIRES; | 
| Gao feng | 1716a96 | 2012-04-06 00:13:10 +0000 | [diff] [blame] | 187 | } | 
 | 188 |  | 
 | 189 | static inline void rt6_set_from(struct rt6_info *rt, struct rt6_info *from) | 
 | 190 | { | 
 | 191 | 	struct dst_entry *new = (struct dst_entry *) from; | 
 | 192 |  | 
| Gao feng | 1716a96 | 2012-04-06 00:13:10 +0000 | [diff] [blame] | 193 | 	rt->rt6i_flags &= ~RTF_EXPIRES; | 
| Gao feng | 1716a96 | 2012-04-06 00:13:10 +0000 | [diff] [blame] | 194 | 	dst_hold(new); | 
| YOSHIFUJI Hideaki / 吉藤英明 | ecd9883 | 2013-02-20 00:29:08 +0000 | [diff] [blame] | 195 | 	rt->dst.from = new; | 
| Gao feng | 1716a96 | 2012-04-06 00:13:10 +0000 | [diff] [blame] | 196 | } | 
 | 197 |  | 
| Amerigo Wang | 94e187c | 2012-10-29 00:13:19 +0000 | [diff] [blame] | 198 | static inline void ip6_rt_put(struct rt6_info *rt) | 
 | 199 | { | 
 | 200 | 	/* dst_release() accepts a NULL parameter. | 
 | 201 | 	 * We rely on dst being first structure in struct rt6_info | 
 | 202 | 	 */ | 
 | 203 | 	BUILD_BUG_ON(offsetof(struct rt6_info, dst) != 0); | 
 | 204 | 	dst_release(&rt->dst); | 
 | 205 | } | 
 | 206 |  | 
| Eric Dumazet | fd2c3ef | 2009-11-03 03:26:03 +0000 | [diff] [blame] | 207 | struct fib6_walker_t { | 
| Alexey Dobriyan | bbef49d | 2010-02-18 08:13:30 +0000 | [diff] [blame] | 208 | 	struct list_head lh; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 209 | 	struct fib6_node *root, *node; | 
 | 210 | 	struct rt6_info *leaf; | 
 | 211 | 	unsigned char state; | 
 | 212 | 	unsigned char prune; | 
| Patrick McHardy | 2bec5a3 | 2010-02-08 05:19:03 +0000 | [diff] [blame] | 213 | 	unsigned int skip; | 
 | 214 | 	unsigned int count; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 215 | 	int (*func)(struct fib6_walker_t *); | 
 | 216 | 	void *args; | 
 | 217 | }; | 
 | 218 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 219 | struct rt6_statistics { | 
 | 220 | 	__u32		fib_nodes; | 
 | 221 | 	__u32		fib_route_nodes; | 
 | 222 | 	__u32		fib_rt_alloc;		/* permanent routes	*/ | 
 | 223 | 	__u32		fib_rt_entries;		/* rt entries in table	*/ | 
 | 224 | 	__u32		fib_rt_cache;		/* cache routes		*/ | 
 | 225 | 	__u32		fib_discarded_routes; | 
 | 226 | }; | 
 | 227 |  | 
 | 228 | #define RTN_TL_ROOT	0x0001 | 
 | 229 | #define RTN_ROOT	0x0002		/* tree root node		*/ | 
 | 230 | #define RTN_RTINFO	0x0004		/* node with valid routing info	*/ | 
 | 231 |  | 
 | 232 | /* | 
 | 233 |  *	priority levels (or metrics) | 
 | 234 |  * | 
 | 235 |  */ | 
 | 236 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 237 |  | 
| Thomas Graf | c71099a | 2006-08-04 23:20:06 -0700 | [diff] [blame] | 238 | struct fib6_table { | 
 | 239 | 	struct hlist_node	tb6_hlist; | 
 | 240 | 	u32			tb6_id; | 
 | 241 | 	rwlock_t		tb6_lock; | 
 | 242 | 	struct fib6_node	tb6_root; | 
| David S. Miller | 8e77327 | 2012-06-11 00:01:52 -0700 | [diff] [blame] | 243 | 	struct inet_peer_base	tb6_peers; | 
| Thomas Graf | c71099a | 2006-08-04 23:20:06 -0700 | [diff] [blame] | 244 | }; | 
 | 245 |  | 
 | 246 | #define RT6_TABLE_UNSPEC	RT_TABLE_UNSPEC | 
 | 247 | #define RT6_TABLE_MAIN		RT_TABLE_MAIN | 
| Thomas Graf | c71099a | 2006-08-04 23:20:06 -0700 | [diff] [blame] | 248 | #define RT6_TABLE_DFLT		RT6_TABLE_MAIN | 
 | 249 | #define RT6_TABLE_INFO		RT6_TABLE_MAIN | 
 | 250 | #define RT6_TABLE_PREFIX	RT6_TABLE_MAIN | 
 | 251 |  | 
 | 252 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 
 | 253 | #define FIB6_TABLE_MIN		1 | 
 | 254 | #define FIB6_TABLE_MAX		RT_TABLE_MAX | 
| Thomas Graf | 101367c | 2006-08-04 03:39:02 -0700 | [diff] [blame] | 255 | #define RT6_TABLE_LOCAL		RT_TABLE_LOCAL | 
| Thomas Graf | c71099a | 2006-08-04 23:20:06 -0700 | [diff] [blame] | 256 | #else | 
 | 257 | #define FIB6_TABLE_MIN		RT_TABLE_MAIN | 
 | 258 | #define FIB6_TABLE_MAX		FIB6_TABLE_MIN | 
| Thomas Graf | 101367c | 2006-08-04 03:39:02 -0700 | [diff] [blame] | 259 | #define RT6_TABLE_LOCAL		RT6_TABLE_MAIN | 
| Thomas Graf | c71099a | 2006-08-04 23:20:06 -0700 | [diff] [blame] | 260 | #endif | 
 | 261 |  | 
| Daniel Lezcano | 8ed6778 | 2008-03-04 13:48:30 -0800 | [diff] [blame] | 262 | typedef struct rt6_info *(*pol_lookup_t)(struct net *, | 
 | 263 | 					 struct fib6_table *, | 
| David S. Miller | 4c9483b | 2011-03-12 16:22:43 -0500 | [diff] [blame] | 264 | 					 struct flowi6 *, int); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 265 |  | 
 | 266 | /* | 
 | 267 |  *	exported functions | 
 | 268 |  */ | 
 | 269 |  | 
| Daniel Lezcano | 58f09b7 | 2008-03-03 23:25:27 -0800 | [diff] [blame] | 270 | extern struct fib6_table        *fib6_get_table(struct net *net, u32 id); | 
 | 271 | extern struct fib6_table        *fib6_new_table(struct net *net, u32 id); | 
 | 272 | extern struct dst_entry         *fib6_rule_lookup(struct net *net, | 
| David S. Miller | 4c9483b | 2011-03-12 16:22:43 -0500 | [diff] [blame] | 273 | 						  struct flowi6 *fl6, int flags, | 
| Daniel Lezcano | 58f09b7 | 2008-03-03 23:25:27 -0800 | [diff] [blame] | 274 | 						  pol_lookup_t lookup); | 
| Thomas Graf | c71099a | 2006-08-04 23:20:06 -0700 | [diff] [blame] | 275 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 276 | extern struct fib6_node		*fib6_lookup(struct fib6_node *root, | 
| Eric Dumazet | b71d1d4 | 2011-04-22 04:53:02 +0000 | [diff] [blame] | 277 | 					     const struct in6_addr *daddr, | 
 | 278 | 					     const struct in6_addr *saddr); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 279 |  | 
 | 280 | struct fib6_node		*fib6_locate(struct fib6_node *root, | 
| Eric Dumazet | b71d1d4 | 2011-04-22 04:53:02 +0000 | [diff] [blame] | 281 | 					     const struct in6_addr *daddr, int dst_len, | 
 | 282 | 					     const struct in6_addr *saddr, int src_len); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 283 |  | 
| Josh Hunt | 32b293a | 2011-12-28 13:23:07 +0000 | [diff] [blame] | 284 | extern void			fib6_clean_all_ro(struct net *net, | 
 | 285 | 					       int (*func)(struct rt6_info *, void *arg), | 
 | 286 | 					       int prune, void *arg); | 
 | 287 |  | 
| Daniel Lezcano | f3db485 | 2008-03-03 23:27:06 -0800 | [diff] [blame] | 288 | extern void			fib6_clean_all(struct net *net, | 
 | 289 | 					       int (*func)(struct rt6_info *, void *arg), | 
| Thomas Graf | c71099a | 2006-08-04 23:20:06 -0700 | [diff] [blame] | 290 | 					       int prune, void *arg); | 
 | 291 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 292 | extern int			fib6_add(struct fib6_node *root, | 
 | 293 | 					 struct rt6_info *rt, | 
| Thomas Graf | 86872cb | 2006-08-22 00:01:08 -0700 | [diff] [blame] | 294 | 					 struct nl_info *info); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 295 |  | 
 | 296 | extern int			fib6_del(struct rt6_info *rt, | 
| Thomas Graf | 86872cb | 2006-08-22 00:01:08 -0700 | [diff] [blame] | 297 | 					 struct nl_info *info); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 298 |  | 
 | 299 | extern void			inet6_rt_notify(int event, struct rt6_info *rt, | 
| Thomas Graf | 86872cb | 2006-08-22 00:01:08 -0700 | [diff] [blame] | 300 | 						struct nl_info *info); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 301 |  | 
| Daniel Lezcano | 5b7c931 | 2008-03-03 23:28:58 -0800 | [diff] [blame] | 302 | extern void			fib6_run_gc(unsigned long expires, | 
 | 303 | 					    struct net *net); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 304 |  | 
 | 305 | extern void			fib6_gc_cleanup(void); | 
 | 306 |  | 
| Daniel Lezcano | d63bddb | 2007-12-07 00:40:34 -0800 | [diff] [blame] | 307 | extern int			fib6_init(void); | 
| Thomas Graf | 101367c | 2006-08-04 03:39:02 -0700 | [diff] [blame] | 308 |  | 
| Daniel Lezcano | 7e5449c | 2007-12-08 00:14:54 -0800 | [diff] [blame] | 309 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 
| Daniel Lezcano | 9eb87f3 | 2007-12-07 00:42:52 -0800 | [diff] [blame] | 310 | extern int			fib6_rules_init(void); | 
| Thomas Graf | 101367c | 2006-08-04 03:39:02 -0700 | [diff] [blame] | 311 | extern void			fib6_rules_cleanup(void); | 
| Daniel Lezcano | 7e5449c | 2007-12-08 00:14:54 -0800 | [diff] [blame] | 312 | #else | 
 | 313 | static inline int               fib6_rules_init(void) | 
 | 314 | { | 
 | 315 | 	return 0; | 
 | 316 | } | 
 | 317 | static inline void              fib6_rules_cleanup(void) | 
 | 318 | { | 
 | 319 | 	return ; | 
 | 320 | } | 
 | 321 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 322 | #endif |