• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/include/net/
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
16#ifdef __KERNEL__
17
18#include <linux/ipv6_route.h>
19#include <linux/rtnetlink.h>
20#include <linux/spinlock.h>
21#include <net/dst.h>
22#include <net/flow.h>
23#include <net/netlink.h>
24
25#ifdef CONFIG_IPV6_MULTIPLE_TABLES
26#define FIB6_TABLE_HASHSZ 256
27#else
28#define FIB6_TABLE_HASHSZ 1
29#endif
30
31struct rt6_info;
32
33struct fib6_config {
34	u32		fc_table;
35	u32		fc_metric;
36	int		fc_dst_len;
37	int		fc_src_len;
38	int		fc_ifindex;
39	u32		fc_flags;
40	u32		fc_protocol;
41
42	struct in6_addr	fc_dst;
43	struct in6_addr	fc_src;
44	struct in6_addr	fc_gateway;
45
46	unsigned long	fc_expires;
47	struct nlattr	*fc_mx;
48	int		fc_mx_len;
49
50	struct nl_info	fc_nlinfo;
51};
52
53struct fib6_node {
54	struct fib6_node	*parent;
55	struct fib6_node	*left;
56	struct fib6_node	*right;
57#ifdef CONFIG_IPV6_SUBTREES
58	struct fib6_node	*subtree;
59#endif
60	struct rt6_info		*leaf;
61
62	__u16			fn_bit;		/* bit key */
63	__u16			fn_flags;
64	__u32			fn_sernum;
65	struct rt6_info		*rr_ptr;
66};
67
68#ifndef CONFIG_IPV6_SUBTREES
69#define FIB6_SUBTREE(fn)	NULL
70#else
71#define FIB6_SUBTREE(fn)	((fn)->subtree)
72#endif
73
74/*
75 *	routing information
76 *
77 */
78
79struct rt6key {
80	struct in6_addr	addr;
81	int		plen;
82};
83
84struct fib6_table;
85
86struct rt6_info {
87	struct dst_entry		dst;
88
89#define rt6i_dev			dst.dev
90#define rt6i_nexthop			dst.neighbour
91#define rt6i_expires			dst.expires
92
93	/*
94	 * Tail elements of dst_entry (__refcnt etc.)
95	 * and these elements (rarely used in hot path) are in
96	 * the same cache line.
97	 */
98	struct fib6_table		*rt6i_table;
99	struct fib6_node		*rt6i_node;
100
101	struct in6_addr			rt6i_gateway;
102
103	atomic_t			rt6i_ref;
104
105	/* These are in a separate cache line. */
106	struct rt6key			rt6i_dst ____cacheline_aligned_in_smp;
107	u32				rt6i_flags;
108	struct rt6key			rt6i_src;
109	u32				rt6i_metric;
110
111	struct inet6_dev		*rt6i_idev;
112
113#ifdef CONFIG_XFRM
114	u32				rt6i_flow_cache_genid;
115#endif
116	/* more non-fragment space at head required */
117	unsigned short			rt6i_nfheader_len;
118
119	u8				rt6i_protocol;
120};
121
122static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)
123{
124	return ((struct rt6_info *)dst)->rt6i_idev;
125}
126
127struct fib6_walker_t {
128	struct list_head lh;
129	struct fib6_node *root, *node;
130	struct rt6_info *leaf;
131	unsigned char state;
132	unsigned char prune;
133	unsigned int skip;
134	unsigned int count;
135	int (*func)(struct fib6_walker_t *);
136	void *args;
137};
138
139struct rt6_statistics {
140	__u32		fib_nodes;
141	__u32		fib_route_nodes;
142	__u32		fib_rt_alloc;		/* permanent routes	*/
143	__u32		fib_rt_entries;		/* rt entries in table	*/
144	__u32		fib_rt_cache;		/* cache routes		*/
145	__u32		fib_discarded_routes;
146};
147
148#define RTN_TL_ROOT	0x0001
149#define RTN_ROOT	0x0002		/* tree root node		*/
150#define RTN_RTINFO	0x0004		/* node with valid routing info	*/
151
152/*
153 *	priority levels (or metrics)
154 *
155 */
156
157
158struct fib6_table {
159	struct hlist_node	tb6_hlist;
160	u32			tb6_id;
161	rwlock_t		tb6_lock;
162	struct fib6_node	tb6_root;
163};
164
165#define RT6_TABLE_UNSPEC	RT_TABLE_UNSPEC
166#define RT6_TABLE_MAIN		RT_TABLE_MAIN
167#define RT6_TABLE_DFLT		RT6_TABLE_MAIN
168#define RT6_TABLE_INFO		RT6_TABLE_MAIN
169#define RT6_TABLE_PREFIX	RT6_TABLE_MAIN
170
171#ifdef CONFIG_IPV6_MULTIPLE_TABLES
172#define FIB6_TABLE_MIN		1
173#define FIB6_TABLE_MAX		RT_TABLE_MAX
174#define RT6_TABLE_LOCAL		RT_TABLE_LOCAL
175#else
176#define FIB6_TABLE_MIN		RT_TABLE_MAIN
177#define FIB6_TABLE_MAX		FIB6_TABLE_MIN
178#define RT6_TABLE_LOCAL		RT6_TABLE_MAIN
179#endif
180
181typedef struct rt6_info *(*pol_lookup_t)(struct net *,
182					 struct fib6_table *,
183					 struct flowi *, int);
184
185/*
186 *	exported functions
187 */
188
189extern struct fib6_table        *fib6_get_table(struct net *net, u32 id);
190extern struct fib6_table        *fib6_new_table(struct net *net, u32 id);
191extern struct dst_entry         *fib6_rule_lookup(struct net *net,
192						  struct flowi *fl, int flags,
193						  pol_lookup_t lookup);
194
195extern struct fib6_node		*fib6_lookup(struct fib6_node *root,
196					     struct in6_addr *daddr,
197					     struct in6_addr *saddr);
198
199struct fib6_node		*fib6_locate(struct fib6_node *root,
200					     struct in6_addr *daddr, int dst_len,
201					     struct in6_addr *saddr, int src_len);
202
203extern void			fib6_clean_all(struct net *net,
204					       int (*func)(struct rt6_info *, void *arg),
205					       int prune, void *arg);
206
207extern int			fib6_add(struct fib6_node *root,
208					 struct rt6_info *rt,
209					 struct nl_info *info);
210
211extern int			fib6_del(struct rt6_info *rt,
212					 struct nl_info *info);
213
214extern void			inet6_rt_notify(int event, struct rt6_info *rt,
215						struct nl_info *info);
216
217extern void			fib6_run_gc(unsigned long expires,
218					    struct net *net);
219
220extern void			fib6_gc_cleanup(void);
221
222extern int			fib6_init(void);
223
224#ifdef CONFIG_IPV6_MULTIPLE_TABLES
225extern int			fib6_rules_init(void);
226extern void			fib6_rules_cleanup(void);
227#else
228static inline int               fib6_rules_init(void)
229{
230	return 0;
231}
232static inline void              fib6_rules_cleanup(void)
233{
234	return ;
235}
236#endif
237#endif
238#endif
239