]>
Commit | Line | Data |
---|---|---|
718e3744 | 1 | /* BGP routing table |
2 | Copyright (C) 1998, 2001 Kunihiro Ishiguro | |
3 | ||
4 | This file is part of GNU Zebra. | |
5 | ||
6 | GNU Zebra is free software; you can redistribute it and/or modify it | |
7 | under the terms of the GNU General Public License as published by the | |
8 | Free Software Foundation; either version 2, or (at your option) any | |
9 | later version. | |
10 | ||
11 | GNU Zebra is distributed in the hope that it will be useful, but | |
12 | WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
17 | along with GNU Zebra; see the file COPYING. If not, write to the Free | |
18 | Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
19 | 02111-1307, USA. */ | |
20 | ||
00d252cb | 21 | #ifndef _QUAGGA_BGP_TABLE_H |
22 | #define _QUAGGA_BGP_TABLE_H | |
23 | ||
67174041 AS |
24 | #include "table.h" |
25 | ||
ac4d0be5 | 26 | struct bgp_table { |
27 | /* afi/safi of this table */ | |
28 | afi_t afi; | |
29 | safi_t safi; | |
30 | ||
31 | int lock; | |
228da428 | 32 | |
ac4d0be5 | 33 | /* The owner of this 'bgp_table' structure. */ |
34 | struct peer *owner; | |
fee0f4c6 | 35 | |
ac4d0be5 | 36 | struct route_table *route_table; |
37 | uint64_t version; | |
718e3744 | 38 | }; |
39 | ||
ac4d0be5 | 40 | struct bgp_node { |
41 | /* | |
42 | * CAUTION | |
43 | * | |
44 | * These fields must be the very first fields in this structure. | |
45 | * | |
46 | * @see bgp_node_to_rnode | |
47 | * @see bgp_node_from_rnode | |
48 | */ | |
49 | ROUTE_NODE_FIELDS | |
718e3744 | 50 | |
ac4d0be5 | 51 | struct bgp_adj_out *adj_out; |
718e3744 | 52 | |
ac4d0be5 | 53 | struct bgp_adj_in *adj_in; |
718e3744 | 54 | |
ac4d0be5 | 55 | struct bgp_node *prn; |
200df115 | 56 | |
ac4d0be5 | 57 | uint64_t version; |
58 | u_char flags; | |
200df115 | 59 | #define BGP_NODE_PROCESS_SCHEDULED (1 << 0) |
8ad7271d | 60 | #define BGP_NODE_USER_CLEAR (1 << 1) |
718e3744 | 61 | }; |
62 | ||
28971c8c AS |
63 | /* |
64 | * bgp_table_iter_t | |
ac4d0be5 | 65 | * |
28971c8c AS |
66 | * Structure that holds state for iterating over a bgp table. |
67 | */ | |
ac4d0be5 | 68 | typedef struct bgp_table_iter_t_ { |
69 | struct bgp_table *table; | |
70 | route_table_iter_t rt_iter; | |
28971c8c AS |
71 | } bgp_table_iter_t; |
72 | ||
ac4d0be5 | 73 | extern struct bgp_table *bgp_table_init(afi_t, safi_t); |
74 | extern void bgp_table_lock(struct bgp_table *); | |
75 | extern void bgp_table_unlock(struct bgp_table *); | |
76 | extern void bgp_table_finish(struct bgp_table **); | |
67174041 AS |
77 | |
78 | ||
79 | /* | |
80 | * bgp_node_from_rnode | |
81 | * | |
82 | * Returns the bgp_node structure corresponding to a route_node. | |
83 | */ | |
ac4d0be5 | 84 | static inline struct bgp_node *bgp_node_from_rnode(struct route_node *rnode) |
67174041 | 85 | { |
ac4d0be5 | 86 | return (struct bgp_node *)rnode; |
67174041 AS |
87 | } |
88 | ||
89 | /* | |
90 | * bgp_node_to_rnode | |
91 | * | |
92 | * Returns the route_node structure corresponding to a bgp_node. | |
93 | */ | |
ac4d0be5 | 94 | static inline struct route_node *bgp_node_to_rnode(struct bgp_node *node) |
67174041 | 95 | { |
ac4d0be5 | 96 | return (struct route_node *)node; |
67174041 AS |
97 | } |
98 | ||
99 | /* | |
100 | * bgp_node_table | |
101 | * | |
102 | * Returns the bgp_table that the given node is in. | |
103 | */ | |
ac4d0be5 | 104 | static inline struct bgp_table *bgp_node_table(struct bgp_node *node) |
67174041 | 105 | { |
ac4d0be5 | 106 | return bgp_node_to_rnode(node)->table->info; |
67174041 AS |
107 | } |
108 | ||
67174041 AS |
109 | /* |
110 | * bgp_node_parent_nolock | |
111 | * | |
112 | * Gets the parent node of the given node without locking it. | |
113 | */ | |
ac4d0be5 | 114 | static inline struct bgp_node *bgp_node_parent_nolock(struct bgp_node *node) |
67174041 | 115 | { |
ac4d0be5 | 116 | return bgp_node_from_rnode(node->parent); |
67174041 AS |
117 | } |
118 | ||
119 | /* | |
120 | * bgp_unlock_node | |
121 | */ | |
ac4d0be5 | 122 | static inline void bgp_unlock_node(struct bgp_node *node) |
67174041 | 123 | { |
ac4d0be5 | 124 | route_unlock_node(bgp_node_to_rnode(node)); |
67174041 AS |
125 | } |
126 | ||
127 | /* | |
128 | * bgp_table_top_nolock | |
129 | * | |
130 | * Gets the top node in the table without locking it. | |
131 | * | |
132 | * @see bgp_table_top | |
133 | */ | |
134 | static inline struct bgp_node * | |
ac4d0be5 | 135 | bgp_table_top_nolock(const struct bgp_table *const table) |
67174041 | 136 | { |
ac4d0be5 | 137 | return bgp_node_from_rnode(table->route_table->top); |
67174041 AS |
138 | } |
139 | ||
140 | /* | |
141 | * bgp_table_top | |
142 | */ | |
143 | static inline struct bgp_node * | |
ac4d0be5 | 144 | bgp_table_top(const struct bgp_table *const table) |
67174041 | 145 | { |
ac4d0be5 | 146 | return bgp_node_from_rnode(route_top(table->route_table)); |
67174041 AS |
147 | } |
148 | ||
149 | /* | |
150 | * bgp_route_next | |
151 | */ | |
ac4d0be5 | 152 | static inline struct bgp_node *bgp_route_next(struct bgp_node *node) |
67174041 | 153 | { |
ac4d0be5 | 154 | return bgp_node_from_rnode(route_next(bgp_node_to_rnode(node))); |
67174041 AS |
155 | } |
156 | ||
157 | /* | |
158 | * bgp_route_next_until | |
159 | */ | |
ac4d0be5 | 160 | static inline struct bgp_node *bgp_route_next_until(struct bgp_node *node, |
161 | struct bgp_node *limit) | |
67174041 | 162 | { |
ac4d0be5 | 163 | struct route_node *rnode; |
67174041 | 164 | |
ac4d0be5 | 165 | rnode = route_next_until(bgp_node_to_rnode(node), |
166 | bgp_node_to_rnode(limit)); | |
167 | return bgp_node_from_rnode(rnode); | |
67174041 AS |
168 | } |
169 | ||
170 | /* | |
171 | * bgp_node_get | |
172 | */ | |
ac4d0be5 | 173 | static inline struct bgp_node *bgp_node_get(struct bgp_table *const table, |
174 | struct prefix *p) | |
67174041 | 175 | { |
ac4d0be5 | 176 | return bgp_node_from_rnode(route_node_get(table->route_table, p)); |
67174041 AS |
177 | } |
178 | ||
179 | /* | |
180 | * bgp_node_lookup | |
181 | */ | |
182 | static inline struct bgp_node * | |
ac4d0be5 | 183 | bgp_node_lookup(const struct bgp_table *const table, struct prefix *p) |
67174041 | 184 | { |
ac4d0be5 | 185 | return bgp_node_from_rnode(route_node_lookup(table->route_table, p)); |
67174041 AS |
186 | } |
187 | ||
188 | /* | |
189 | * bgp_lock_node | |
190 | */ | |
ac4d0be5 | 191 | static inline struct bgp_node *bgp_lock_node(struct bgp_node *node) |
67174041 | 192 | { |
ac4d0be5 | 193 | return bgp_node_from_rnode(route_lock_node(bgp_node_to_rnode(node))); |
67174041 AS |
194 | } |
195 | ||
196 | /* | |
197 | * bgp_node_match | |
198 | */ | |
ac4d0be5 | 199 | static inline struct bgp_node *bgp_node_match(const struct bgp_table *table, |
200 | struct prefix *p) | |
67174041 | 201 | { |
ac4d0be5 | 202 | return bgp_node_from_rnode(route_node_match(table->route_table, p)); |
67174041 AS |
203 | } |
204 | ||
205 | /* | |
206 | * bgp_node_match_ipv4 | |
207 | */ | |
208 | static inline struct bgp_node * | |
ac4d0be5 | 209 | bgp_node_match_ipv4(const struct bgp_table *table, struct in_addr *addr) |
67174041 | 210 | { |
ac4d0be5 | 211 | return bgp_node_from_rnode( |
212 | route_node_match_ipv4(table->route_table, addr)); | |
67174041 AS |
213 | } |
214 | ||
67174041 AS |
215 | /* |
216 | * bgp_node_match_ipv6 | |
217 | */ | |
218 | static inline struct bgp_node * | |
ac4d0be5 | 219 | bgp_node_match_ipv6(const struct bgp_table *table, struct in6_addr *addr) |
67174041 | 220 | { |
ac4d0be5 | 221 | return bgp_node_from_rnode( |
222 | route_node_match_ipv6(table->route_table, addr)); | |
67174041 AS |
223 | } |
224 | ||
ac4d0be5 | 225 | static inline unsigned long bgp_table_count(const struct bgp_table *const table) |
67174041 | 226 | { |
ac4d0be5 | 227 | return route_table_count(table->route_table); |
67174041 AS |
228 | } |
229 | ||
28971c8c AS |
230 | /* |
231 | * bgp_table_get_next | |
232 | */ | |
ac4d0be5 | 233 | static inline struct bgp_node *bgp_table_get_next(const struct bgp_table *table, |
234 | struct prefix *p) | |
28971c8c | 235 | { |
ac4d0be5 | 236 | return bgp_node_from_rnode(route_table_get_next(table->route_table, p)); |
28971c8c AS |
237 | } |
238 | ||
239 | /* | |
240 | * bgp_table_iter_init | |
241 | */ | |
ac4d0be5 | 242 | static inline void bgp_table_iter_init(bgp_table_iter_t *iter, |
243 | struct bgp_table *table) | |
28971c8c | 244 | { |
ac4d0be5 | 245 | bgp_table_lock(table); |
246 | iter->table = table; | |
247 | route_table_iter_init(&iter->rt_iter, table->route_table); | |
28971c8c AS |
248 | } |
249 | ||
250 | /* | |
251 | * bgp_table_iter_next | |
252 | */ | |
ac4d0be5 | 253 | static inline struct bgp_node *bgp_table_iter_next(bgp_table_iter_t *iter) |
28971c8c | 254 | { |
ac4d0be5 | 255 | return bgp_node_from_rnode(route_table_iter_next(&iter->rt_iter)); |
28971c8c AS |
256 | } |
257 | ||
258 | /* | |
259 | * bgp_table_iter_cleanup | |
260 | */ | |
ac4d0be5 | 261 | static inline void bgp_table_iter_cleanup(bgp_table_iter_t *iter) |
28971c8c | 262 | { |
ac4d0be5 | 263 | route_table_iter_cleanup(&iter->rt_iter); |
264 | bgp_table_unlock(iter->table); | |
265 | iter->table = NULL; | |
28971c8c AS |
266 | } |
267 | ||
268 | /* | |
269 | * bgp_table_iter_pause | |
270 | */ | |
ac4d0be5 | 271 | static inline void bgp_table_iter_pause(bgp_table_iter_t *iter) |
28971c8c | 272 | { |
ac4d0be5 | 273 | route_table_iter_pause(&iter->rt_iter); |
28971c8c AS |
274 | } |
275 | ||
276 | /* | |
277 | * bgp_table_iter_is_done | |
278 | */ | |
ac4d0be5 | 279 | static inline int bgp_table_iter_is_done(bgp_table_iter_t *iter) |
28971c8c | 280 | { |
ac4d0be5 | 281 | return route_table_iter_is_done(&iter->rt_iter); |
28971c8c AS |
282 | } |
283 | ||
284 | /* | |
285 | * bgp_table_iter_started | |
286 | */ | |
ac4d0be5 | 287 | static inline int bgp_table_iter_started(bgp_table_iter_t *iter) |
28971c8c | 288 | { |
ac4d0be5 | 289 | return route_table_iter_started(&iter->rt_iter); |
28971c8c AS |
290 | } |
291 | ||
3f9c7369 DS |
292 | /* This would benefit from a real atomic operation... |
293 | * until then. */ | |
ac4d0be5 | 294 | static inline uint64_t bgp_table_next_version(struct bgp_table *table) |
3f9c7369 | 295 | { |
ac4d0be5 | 296 | return ++table->version; |
3f9c7369 DS |
297 | } |
298 | ||
ac4d0be5 | 299 | static inline uint64_t bgp_table_version(struct bgp_table *table) |
3f9c7369 | 300 | { |
ac4d0be5 | 301 | return table->version; |
3f9c7369 DS |
302 | } |
303 | ||
00d252cb | 304 | #endif /* _QUAGGA_BGP_TABLE_H */ |