/* BGP routing table Copyright (C) 1998, 2001 Kunihiro Ishiguro This file is part of GNU Zebra. GNU Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Zebra is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Zebra; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _QUAGGA_BGP_TABLE_H #define _QUAGGA_BGP_TABLE_H #include "table.h" typedef enum { BGP_TABLE_MAIN, BGP_TABLE_RSCLIENT, } bgp_table_t; struct bgp_table { bgp_table_t type; /* afi/safi of this table */ afi_t afi; safi_t safi; int lock; /* The owner of this 'bgp_table' structure. */ struct peer *owner; struct route_table *route_table; }; struct bgp_node { /* * CAUTION * * These fields must be the very first fields in this structure. * * @see bgp_node_to_rnode * @see bgp_node_from_rnode */ ROUTE_NODE_FIELDS; struct bgp_adj_out *adj_out; struct bgp_adj_in *adj_in; struct bgp_node *prn; u_char flags; #define BGP_NODE_PROCESS_SCHEDULED (1 << 0) }; /* * bgp_table_iter_t * * Structure that holds state for iterating over a bgp table. */ typedef struct bgp_table_iter_t_ { struct bgp_table *table; route_table_iter_t rt_iter; } bgp_table_iter_t; extern struct bgp_table *bgp_table_init (afi_t, safi_t); extern void bgp_table_lock (struct bgp_table *); extern void bgp_table_unlock (struct bgp_table *); extern void bgp_table_finish (struct bgp_table **); /* * bgp_node_from_rnode * * Returns the bgp_node structure corresponding to a route_node. */ static inline struct bgp_node * bgp_node_from_rnode (struct route_node *rnode) { return (struct bgp_node *) rnode; } /* * bgp_node_to_rnode * * Returns the route_node structure corresponding to a bgp_node. */ static inline struct route_node * bgp_node_to_rnode (struct bgp_node *node) { return (struct route_node *) node; } /* * bgp_node_table * * Returns the bgp_table that the given node is in. */ static inline struct bgp_table * bgp_node_table (struct bgp_node *node) { return bgp_node_to_rnode (node)->table->info; } /* * bgp_node_info * * Returns the 'info' pointer corresponding to a bgp node. */ static inline void * bgp_node_info (const struct bgp_node *node) { return node->info; } /* * bgp_node_set_info */ static inline void bgp_node_set_info (struct bgp_node *node, void *info) { node->info = info; } /* * bgp_node_prefix */ static inline struct prefix * bgp_node_prefix (struct bgp_node *node) { return &node->p; } /* * bgp_node_prefixlen */ static inline u_char bgp_node_prefixlen (struct bgp_node *node) { return bgp_node_prefix (node)->prefixlen; } /* * bgp_node_parent_nolock * * Gets the parent node of the given node without locking it. */ static inline struct bgp_node * bgp_node_parent_nolock (struct bgp_node *node) { return bgp_node_from_rnode (node->parent); } /* * bgp_unlock_node */ static inline void bgp_unlock_node (struct bgp_node *node) { route_unlock_node (bgp_node_to_rnode (node)); } /* * bgp_table_top_nolock * * Gets the top node in the table without locking it. * * @see bgp_table_top */ static inline struct bgp_node * bgp_table_top_nolock (const struct bgp_table *const table) { return bgp_node_from_rnode (table->route_table->top); } /* * bgp_table_top */ static inline struct bgp_node * bgp_table_top (const struct bgp_table *const table) { return bgp_node_from_rnode (route_top (table->route_table)); } /* * bgp_route_next */ static inline struct bgp_node * bgp_route_next (struct bgp_node *node) { return bgp_node_from_rnode (route_next (bgp_node_to_rnode (node))); } /* * bgp_route_next_until */ static inline struct bgp_node * bgp_route_next_until (struct bgp_node *node, struct bgp_node *limit) { struct route_node *rnode; rnode = route_next_until (bgp_node_to_rnode (node), bgp_node_to_rnode (limit)); return bgp_node_from_rnode (rnode); } /* * bgp_node_get */ static inline struct bgp_node * bgp_node_get (struct bgp_table *const table, struct prefix *p) { return bgp_node_from_rnode (route_node_get (table->route_table, p)); } /* * bgp_node_lookup */ static inline struct bgp_node * bgp_node_lookup (const struct bgp_table *const table, struct prefix *p) { return bgp_node_from_rnode (route_node_lookup (table->route_table, p)); } /* * bgp_lock_node */ static inline struct bgp_node * bgp_lock_node (struct bgp_node *node) { return bgp_node_from_rnode (route_lock_node (bgp_node_to_rnode (node))); } /* * bgp_node_match */ static inline struct bgp_node * bgp_node_match (const struct bgp_table *table, struct prefix *p) { return bgp_node_from_rnode (route_node_match (table->route_table, p)); } /* * bgp_node_match_ipv4 */ static inline struct bgp_node * bgp_node_match_ipv4 (const struct bgp_table *table, struct in_addr *addr) { return bgp_node_from_rnode (route_node_match_ipv4 (table->route_table, addr)); } #ifdef HAVE_IPV6 /* * bgp_node_match_ipv6 */ static inline struct bgp_node * bgp_node_match_ipv6 (const struct bgp_table *table, struct in6_addr *addr) { return bgp_node_from_rnode (route_node_match_ipv6 (table->route_table, addr)); } #endif /* HAVE_IPV6 */ static inline unsigned long bgp_table_count (const struct bgp_table *const table) { return route_table_count (table->route_table); } /* * bgp_table_get_next */ static inline struct bgp_node * bgp_table_get_next (const struct bgp_table *table, struct prefix *p) { return bgp_node_from_rnode (route_table_get_next (table->route_table, p)); } /* * bgp_table_iter_init */ static inline void bgp_table_iter_init (bgp_table_iter_t * iter, struct bgp_table *table) { bgp_table_lock (table); iter->table = table; route_table_iter_init (&iter->rt_iter, table->route_table); } /* * bgp_table_iter_next */ static inline struct bgp_node * bgp_table_iter_next (bgp_table_iter_t * iter) { return bgp_node_from_rnode (route_table_iter_next (&iter->rt_iter)); } /* * bgp_table_iter_cleanup */ static inline void bgp_table_iter_cleanup (bgp_table_iter_t * iter) { route_table_iter_cleanup (&iter->rt_iter); bgp_table_unlock (iter->table); iter->table = NULL; } /* * bgp_table_iter_pause */ static inline void bgp_table_iter_pause (bgp_table_iter_t * iter) { route_table_iter_pause (&iter->rt_iter); } /* * bgp_table_iter_is_done */ static inline int bgp_table_iter_is_done (bgp_table_iter_t * iter) { return route_table_iter_is_done (&iter->rt_iter); } /* * bgp_table_iter_started */ static inline int bgp_table_iter_started (bgp_table_iter_t * iter) { return route_table_iter_started (&iter->rt_iter); } #endif /* _QUAGGA_BGP_TABLE_H */