blob: 04a1d379e55f9681ca2205c299be328304a601ca [file] [log] [blame]
/* 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 */