diff options
Diffstat (limited to 'include/net/ip6_fib.h')
-rw-r--r-- | include/net/ip6_fib.h | 113 |
1 files changed, 73 insertions, 40 deletions
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index a66e9de16a6c..e4438de3bd6b 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h | |||
@@ -16,14 +16,35 @@ | |||
16 | #ifdef __KERNEL__ | 16 | #ifdef __KERNEL__ |
17 | 17 | ||
18 | #include <linux/ipv6_route.h> | 18 | #include <linux/ipv6_route.h> |
19 | |||
20 | #include <net/dst.h> | ||
21 | #include <net/flow.h> | ||
22 | #include <linux/rtnetlink.h> | 19 | #include <linux/rtnetlink.h> |
23 | #include <linux/spinlock.h> | 20 | #include <linux/spinlock.h> |
21 | #include <net/dst.h> | ||
22 | #include <net/flow.h> | ||
23 | #include <net/netlink.h> | ||
24 | 24 | ||
25 | struct rt6_info; | 25 | struct rt6_info; |
26 | 26 | ||
27 | struct fib6_config | ||
28 | { | ||
29 | u32 fc_table; | ||
30 | u32 fc_metric; | ||
31 | int fc_dst_len; | ||
32 | int fc_src_len; | ||
33 | int fc_ifindex; | ||
34 | u32 fc_flags; | ||
35 | u32 fc_protocol; | ||
36 | |||
37 | struct in6_addr fc_dst; | ||
38 | struct in6_addr fc_src; | ||
39 | struct in6_addr fc_gateway; | ||
40 | |||
41 | unsigned long fc_expires; | ||
42 | struct nlattr *fc_mx; | ||
43 | int fc_mx_len; | ||
44 | |||
45 | struct nl_info fc_nlinfo; | ||
46 | }; | ||
47 | |||
27 | struct fib6_node | 48 | struct fib6_node |
28 | { | 49 | { |
29 | struct fib6_node *parent; | 50 | struct fib6_node *parent; |
@@ -39,6 +60,11 @@ struct fib6_node | |||
39 | __u32 fn_sernum; | 60 | __u32 fn_sernum; |
40 | }; | 61 | }; |
41 | 62 | ||
63 | #ifndef CONFIG_IPV6_SUBTREES | ||
64 | #define FIB6_SUBTREE(fn) NULL | ||
65 | #else | ||
66 | #define FIB6_SUBTREE(fn) ((fn)->subtree) | ||
67 | #endif | ||
42 | 68 | ||
43 | /* | 69 | /* |
44 | * routing information | 70 | * routing information |
@@ -51,6 +77,8 @@ struct rt6key | |||
51 | int plen; | 77 | int plen; |
52 | }; | 78 | }; |
53 | 79 | ||
80 | struct fib6_table; | ||
81 | |||
54 | struct rt6_info | 82 | struct rt6_info |
55 | { | 83 | { |
56 | union { | 84 | union { |
@@ -71,6 +99,7 @@ struct rt6_info | |||
71 | u32 rt6i_flags; | 99 | u32 rt6i_flags; |
72 | u32 rt6i_metric; | 100 | u32 rt6i_metric; |
73 | atomic_t rt6i_ref; | 101 | atomic_t rt6i_ref; |
102 | struct fib6_table *rt6i_table; | ||
74 | 103 | ||
75 | struct rt6key rt6i_dst; | 104 | struct rt6key rt6i_dst; |
76 | struct rt6key rt6i_src; | 105 | struct rt6key rt6i_src; |
@@ -89,28 +118,6 @@ struct fib6_walker_t | |||
89 | void *args; | 118 | void *args; |
90 | }; | 119 | }; |
91 | 120 | ||
92 | extern struct fib6_walker_t fib6_walker_list; | ||
93 | extern rwlock_t fib6_walker_lock; | ||
94 | |||
95 | static inline void fib6_walker_link(struct fib6_walker_t *w) | ||
96 | { | ||
97 | write_lock_bh(&fib6_walker_lock); | ||
98 | w->next = fib6_walker_list.next; | ||
99 | w->prev = &fib6_walker_list; | ||
100 | w->next->prev = w; | ||
101 | w->prev->next = w; | ||
102 | write_unlock_bh(&fib6_walker_lock); | ||
103 | } | ||
104 | |||
105 | static inline void fib6_walker_unlink(struct fib6_walker_t *w) | ||
106 | { | ||
107 | write_lock_bh(&fib6_walker_lock); | ||
108 | w->next->prev = w->prev; | ||
109 | w->prev->next = w->next; | ||
110 | w->prev = w->next = w; | ||
111 | write_unlock_bh(&fib6_walker_lock); | ||
112 | } | ||
113 | |||
114 | struct rt6_statistics { | 121 | struct rt6_statistics { |
115 | __u32 fib_nodes; | 122 | __u32 fib_nodes; |
116 | __u32 fib_route_nodes; | 123 | __u32 fib_route_nodes; |
@@ -143,12 +150,41 @@ struct rt6_statistics { | |||
143 | 150 | ||
144 | typedef void (*f_pnode)(struct fib6_node *fn, void *); | 151 | typedef void (*f_pnode)(struct fib6_node *fn, void *); |
145 | 152 | ||
146 | extern struct fib6_node ip6_routing_table; | 153 | struct fib6_table { |
154 | struct hlist_node tb6_hlist; | ||
155 | u32 tb6_id; | ||
156 | rwlock_t tb6_lock; | ||
157 | struct fib6_node tb6_root; | ||
158 | }; | ||
159 | |||
160 | #define RT6_TABLE_UNSPEC RT_TABLE_UNSPEC | ||
161 | #define RT6_TABLE_MAIN RT_TABLE_MAIN | ||
162 | #define RT6_TABLE_DFLT RT6_TABLE_MAIN | ||
163 | #define RT6_TABLE_INFO RT6_TABLE_MAIN | ||
164 | #define RT6_TABLE_PREFIX RT6_TABLE_MAIN | ||
165 | |||
166 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | ||
167 | #define FIB6_TABLE_MIN 1 | ||
168 | #define FIB6_TABLE_MAX RT_TABLE_MAX | ||
169 | #define RT6_TABLE_LOCAL RT_TABLE_LOCAL | ||
170 | #else | ||
171 | #define FIB6_TABLE_MIN RT_TABLE_MAIN | ||
172 | #define FIB6_TABLE_MAX FIB6_TABLE_MIN | ||
173 | #define RT6_TABLE_LOCAL RT6_TABLE_MAIN | ||
174 | #endif | ||
175 | |||
176 | typedef struct rt6_info *(*pol_lookup_t)(struct fib6_table *, | ||
177 | struct flowi *, int); | ||
147 | 178 | ||
148 | /* | 179 | /* |
149 | * exported functions | 180 | * exported functions |
150 | */ | 181 | */ |
151 | 182 | ||
183 | extern struct fib6_table * fib6_get_table(u32 id); | ||
184 | extern struct fib6_table * fib6_new_table(u32 id); | ||
185 | extern struct dst_entry * fib6_rule_lookup(struct flowi *fl, int flags, | ||
186 | pol_lookup_t lookup); | ||
187 | |||
152 | extern struct fib6_node *fib6_lookup(struct fib6_node *root, | 188 | extern struct fib6_node *fib6_lookup(struct fib6_node *root, |
153 | struct in6_addr *daddr, | 189 | struct in6_addr *daddr, |
154 | struct in6_addr *saddr); | 190 | struct in6_addr *saddr); |
@@ -157,32 +193,29 @@ struct fib6_node *fib6_locate(struct fib6_node *root, | |||
157 | struct in6_addr *daddr, int dst_len, | 193 | struct in6_addr *daddr, int dst_len, |
158 | struct in6_addr *saddr, int src_len); | 194 | struct in6_addr *saddr, int src_len); |
159 | 195 | ||
160 | extern void fib6_clean_tree(struct fib6_node *root, | 196 | extern void fib6_clean_all(int (*func)(struct rt6_info *, void *arg), |
161 | int (*func)(struct rt6_info *, void *arg), | 197 | int prune, void *arg); |
162 | int prune, void *arg); | ||
163 | |||
164 | extern int fib6_walk(struct fib6_walker_t *w); | ||
165 | extern int fib6_walk_continue(struct fib6_walker_t *w); | ||
166 | 198 | ||
167 | extern int fib6_add(struct fib6_node *root, | 199 | extern int fib6_add(struct fib6_node *root, |
168 | struct rt6_info *rt, | 200 | struct rt6_info *rt, |
169 | struct nlmsghdr *nlh, | 201 | struct nl_info *info); |
170 | void *rtattr, | ||
171 | struct netlink_skb_parms *req); | ||
172 | 202 | ||
173 | extern int fib6_del(struct rt6_info *rt, | 203 | extern int fib6_del(struct rt6_info *rt, |
174 | struct nlmsghdr *nlh, | 204 | struct nl_info *info); |
175 | void *rtattr, | ||
176 | struct netlink_skb_parms *req); | ||
177 | 205 | ||
178 | extern void inet6_rt_notify(int event, struct rt6_info *rt, | 206 | extern void inet6_rt_notify(int event, struct rt6_info *rt, |
179 | struct nlmsghdr *nlh, | 207 | struct nl_info *info); |
180 | struct netlink_skb_parms *req); | ||
181 | 208 | ||
182 | extern void fib6_run_gc(unsigned long dummy); | 209 | extern void fib6_run_gc(unsigned long dummy); |
183 | 210 | ||
184 | extern void fib6_gc_cleanup(void); | 211 | extern void fib6_gc_cleanup(void); |
185 | 212 | ||
186 | extern void fib6_init(void); | 213 | extern void fib6_init(void); |
214 | |||
215 | extern void fib6_rules_init(void); | ||
216 | extern void fib6_rules_cleanup(void); | ||
217 | extern int fib6_rules_dump(struct sk_buff *, | ||
218 | struct netlink_callback *); | ||
219 | |||
187 | #endif | 220 | #endif |
188 | #endif | 221 | #endif |