]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/bgp_table.h
*: reindent
[mirror_frr.git] / bgpd / bgp_table.h
CommitLineData
718e3744 1/* BGP routing table
2 Copyright (C) 1998, 2001 Kunihiro Ishiguro
3
4This file is part of GNU Zebra.
5
6GNU Zebra is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 2, or (at your option) any
9later version.
10
11GNU Zebra is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Zebra; see the file COPYING. If not, write to the Free
18Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1902111-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 26struct 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 40struct 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 68typedef 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 73extern struct bgp_table *bgp_table_init(afi_t, safi_t);
74extern void bgp_table_lock(struct bgp_table *);
75extern void bgp_table_unlock(struct bgp_table *);
76extern 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 84static 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 94static 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 104static 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 114static 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 122static 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 */
134static inline struct bgp_node *
ac4d0be5 135bgp_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 */
143static inline struct bgp_node *
ac4d0be5 144bgp_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 152static 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 160static 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 173static 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 */
182static inline struct bgp_node *
ac4d0be5 183bgp_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 191static 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 199static 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 */
208static inline struct bgp_node *
ac4d0be5 209bgp_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 */
218static inline struct bgp_node *
ac4d0be5 219bgp_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 225static 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 233static 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 242static 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 253static 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 261static 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 271static 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 279static 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 287static 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 294static inline uint64_t bgp_table_next_version(struct bgp_table *table)
3f9c7369 295{
ac4d0be5 296 return ++table->version;
3f9c7369
DS
297}
298
ac4d0be5 299static 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 */