Root/
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 | |
31 | struct rt6_info; |
32 | |
33 | struct 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 | |
53 | struct 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 | |
79 | struct rt6key { |
80 | struct in6_addr addr; |
81 | int plen; |
82 | }; |
83 | |
84 | struct fib6_table; |
85 | |
86 | struct 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 | |
122 | static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst) |
123 | { |
124 | return ((struct rt6_info *)dst)->rt6i_idev; |
125 | } |
126 | |
127 | struct 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 | |
139 | struct 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 | |
158 | struct 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 | |
181 | typedef struct rt6_info *(*pol_lookup_t)(struct net *, |
182 | struct fib6_table *, |
183 | struct flowi *, int); |
184 | |
185 | /* |
186 | * exported functions |
187 | */ |
188 | |
189 | extern struct fib6_table *fib6_get_table(struct net *net, u32 id); |
190 | extern struct fib6_table *fib6_new_table(struct net *net, u32 id); |
191 | extern struct dst_entry *fib6_rule_lookup(struct net *net, |
192 | struct flowi *fl, int flags, |
193 | pol_lookup_t lookup); |
194 | |
195 | extern struct fib6_node *fib6_lookup(struct fib6_node *root, |
196 | struct in6_addr *daddr, |
197 | struct in6_addr *saddr); |
198 | |
199 | struct 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 | |
203 | extern void fib6_clean_all(struct net *net, |
204 | int (*func)(struct rt6_info *, void *arg), |
205 | int prune, void *arg); |
206 | |
207 | extern int fib6_add(struct fib6_node *root, |
208 | struct rt6_info *rt, |
209 | struct nl_info *info); |
210 | |
211 | extern int fib6_del(struct rt6_info *rt, |
212 | struct nl_info *info); |
213 | |
214 | extern void inet6_rt_notify(int event, struct rt6_info *rt, |
215 | struct nl_info *info); |
216 | |
217 | extern void fib6_run_gc(unsigned long expires, |
218 | struct net *net); |
219 | |
220 | extern void fib6_gc_cleanup(void); |
221 | |
222 | extern int fib6_init(void); |
223 | |
224 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES |
225 | extern int fib6_rules_init(void); |
226 | extern void fib6_rules_cleanup(void); |
227 | #else |
228 | static inline int fib6_rules_init(void) |
229 | { |
230 | return 0; |
231 | } |
232 | static inline void fib6_rules_cleanup(void) |
233 | { |
234 | return ; |
235 | } |
236 | #endif |
237 | #endif |
238 | #endif |
239 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9