LCOV - code coverage report
Current view: top level - bgpd - bgp_table.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 8 34 23.5 %
Date: 2015-11-19 Functions: 4 16 25.0 %

          Line data    Source code
       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             : 
      21             : #ifndef _QUAGGA_BGP_TABLE_H
      22             : #define _QUAGGA_BGP_TABLE_H
      23             : 
      24             : #include "table.h"
      25             : 
      26             : typedef enum
      27             : {
      28             :   BGP_TABLE_MAIN,
      29             :   BGP_TABLE_RSCLIENT,
      30             : } bgp_table_t;
      31             : 
      32             : struct bgp_table
      33             : {
      34             :   bgp_table_t type;
      35             :   
      36             :   /* afi/safi of this table */
      37             :   afi_t afi;
      38             :   safi_t safi;
      39             :   
      40             :   int lock;
      41             : 
      42             :   /* The owner of this 'bgp_table' structure. */
      43             :   struct peer *owner;
      44             : 
      45             :   struct route_table *route_table;
      46             : };
      47             : 
      48             : struct bgp_node
      49             : {
      50             :   /*
      51             :    * CAUTION
      52             :    *
      53             :    * These fields must be the very first fields in this structure.
      54             :    *
      55             :    * @see bgp_node_to_rnode
      56             :    * @see bgp_node_from_rnode
      57             :    */
      58             :   ROUTE_NODE_FIELDS;
      59             : 
      60             :   struct bgp_adj_out *adj_out;
      61             : 
      62             :   struct bgp_adj_in *adj_in;
      63             : 
      64             :   struct bgp_node *prn;
      65             : 
      66             :   u_char flags;
      67             : #define BGP_NODE_PROCESS_SCHEDULED      (1 << 0)
      68             : };
      69             : 
      70             : /*
      71             :  * bgp_table_iter_t
      72             :  * 
      73             :  * Structure that holds state for iterating over a bgp table.
      74             :  */
      75             : typedef struct bgp_table_iter_t_
      76             : {
      77             :   struct bgp_table *table;
      78             :   route_table_iter_t rt_iter;
      79             : } bgp_table_iter_t;
      80             : 
      81             : extern struct bgp_table *bgp_table_init (afi_t, safi_t);
      82             : extern void bgp_table_lock (struct bgp_table *);
      83             : extern void bgp_table_unlock (struct bgp_table *);
      84             : extern void bgp_table_finish (struct bgp_table **);
      85             : 
      86             : 
      87             : /*
      88             :  * bgp_node_from_rnode
      89             :  *
      90             :  * Returns the bgp_node structure corresponding to a route_node.
      91             :  */
      92             : static inline struct bgp_node *
      93          17 : bgp_node_from_rnode (struct route_node *rnode)
      94             : {
      95          17 :   return (struct bgp_node *) rnode;
      96             : }
      97             : 
      98             : /*
      99             :  * bgp_node_to_rnode
     100             :  *
     101             :  * Returns the route_node structure corresponding to a bgp_node.
     102             :  */
     103             : static inline struct route_node *
     104           5 : bgp_node_to_rnode (struct bgp_node *node)
     105             : {
     106           5 :   return (struct route_node *) node;
     107             : }
     108             : 
     109             : /*
     110             :  * bgp_node_table
     111             :  *
     112             :  * Returns the bgp_table that the given node is in.
     113             :  */
     114             : static inline struct bgp_table *
     115           0 : bgp_node_table (struct bgp_node *node)
     116             : {
     117           0 :   return bgp_node_to_rnode (node)->table->info;
     118             : }
     119             : 
     120             : /*
     121             :  * bgp_node_info
     122             :  *
     123             :  * Returns the 'info' pointer corresponding to a bgp node.
     124             :  */
     125             : static inline void *
     126             : bgp_node_info (const struct bgp_node *node)
     127             : {
     128             :   return node->info;
     129             : }
     130             : 
     131             : /*
     132             :  * bgp_node_set_info
     133             :  */
     134             : static inline void
     135             : bgp_node_set_info (struct bgp_node *node, void *info)
     136             : {
     137             :   node->info = info;
     138             : }
     139             : 
     140             : /*
     141             :  * bgp_node_prefix
     142             :  */
     143             : static inline struct prefix *
     144             : bgp_node_prefix (struct bgp_node *node)
     145             : {
     146             :   return &node->p;
     147             : }
     148             : 
     149             : /*
     150             :  * bgp_node_prefixlen
     151             :  */
     152             : static inline u_char
     153             : bgp_node_prefixlen (struct bgp_node *node)
     154             : {
     155             :   return bgp_node_prefix (node)->prefixlen;
     156             : }
     157             : 
     158             : /*
     159             :  * bgp_node_parent_nolock
     160             :  *
     161             :  * Gets the parent node of the given node without locking it.
     162             :  */
     163             : static inline struct bgp_node *
     164           0 : bgp_node_parent_nolock (struct bgp_node *node)
     165             : {
     166           0 :   return bgp_node_from_rnode (node->parent);
     167             : }
     168             : 
     169             : /*
     170             :  * bgp_unlock_node
     171             :  */
     172             : static inline void
     173           0 : bgp_unlock_node (struct bgp_node *node)
     174             : {
     175           0 :   route_unlock_node (bgp_node_to_rnode (node));
     176           0 : }
     177             : 
     178             : /*
     179             :  * bgp_table_top_nolock
     180             :  *
     181             :  * Gets the top node in the table without locking it.
     182             :  *
     183             :  * @see bgp_table_top
     184             :  */
     185             : static inline struct bgp_node *
     186           0 : bgp_table_top_nolock (const struct bgp_table *const table)
     187             : {
     188           0 :   return bgp_node_from_rnode (table->route_table->top);
     189             : }
     190             : 
     191             : /*
     192             :  * bgp_table_top
     193             :  */
     194             : static inline struct bgp_node *
     195          12 : bgp_table_top (const struct bgp_table *const table)
     196             : {
     197          12 :   return bgp_node_from_rnode (route_top (table->route_table));
     198             : }
     199             : 
     200             : /*
     201             :  * bgp_route_next
     202             :  */
     203             : static inline struct bgp_node *
     204           0 : bgp_route_next (struct bgp_node *node)
     205             : {
     206           0 :   return bgp_node_from_rnode (route_next (bgp_node_to_rnode (node)));
     207             : }
     208             : 
     209             : /*
     210             :  * bgp_route_next_until
     211             :  */
     212             : static inline struct bgp_node *
     213           0 : bgp_route_next_until (struct bgp_node *node, struct bgp_node *limit)
     214             : {
     215             :   struct route_node *rnode;
     216             : 
     217           0 :   rnode = route_next_until (bgp_node_to_rnode (node),
     218             :                             bgp_node_to_rnode (limit));
     219           0 :   return bgp_node_from_rnode (rnode);
     220             : }
     221             : 
     222             : /*
     223             :  * bgp_node_get
     224             :  */
     225             : static inline struct bgp_node *
     226           0 : bgp_node_get (struct bgp_table *const table, struct prefix *p)
     227             : {
     228           0 :   return bgp_node_from_rnode (route_node_get (table->route_table, p));
     229             : }
     230             : 
     231             : /*
     232             :  * bgp_node_lookup
     233             :  */
     234             : static inline struct bgp_node *
     235           0 : bgp_node_lookup (const struct bgp_table *const table, struct prefix *p)
     236             : {
     237           0 :   return bgp_node_from_rnode (route_node_lookup (table->route_table, p));
     238             : }
     239             : 
     240             : /*
     241             :  * bgp_lock_node
     242             :  */
     243             : static inline struct bgp_node *
     244           5 : bgp_lock_node (struct bgp_node *node)
     245             : {
     246           5 :   return bgp_node_from_rnode (route_lock_node (bgp_node_to_rnode (node)));
     247             : }
     248             : 
     249             : /*
     250             :  * bgp_node_match
     251             :  */
     252             : static inline struct bgp_node *
     253           0 : bgp_node_match (const struct bgp_table *table, struct prefix *p)
     254             : {
     255           0 :   return bgp_node_from_rnode (route_node_match (table->route_table, p));
     256             : }
     257             : 
     258             : /*
     259             :  * bgp_node_match_ipv4
     260             :  */
     261             : static inline struct bgp_node *
     262           0 : bgp_node_match_ipv4 (const struct bgp_table *table, struct in_addr *addr)
     263             : {
     264           0 :   return bgp_node_from_rnode (route_node_match_ipv4 (table->route_table, 
     265             :                                                      addr));
     266             : }
     267             : 
     268             : #ifdef HAVE_IPV6
     269             : 
     270             : /*
     271             :  * bgp_node_match_ipv6
     272             :  */
     273             : static inline struct bgp_node *
     274           0 : bgp_node_match_ipv6 (const struct bgp_table *table, struct in6_addr *addr)
     275             : {
     276           0 :   return bgp_node_from_rnode (route_node_match_ipv6 (table->route_table,
     277             :                                                      addr));
     278             : }
     279             : 
     280             : #endif /* HAVE_IPV6 */
     281             : 
     282             : static inline unsigned long
     283           0 : bgp_table_count (const struct bgp_table *const table)
     284             : {
     285           0 :   return route_table_count (table->route_table);
     286             : }
     287             : 
     288             : /*
     289             :  * bgp_table_get_next
     290             :  */
     291             : static inline struct bgp_node *
     292             : bgp_table_get_next (const struct bgp_table *table, struct prefix *p)
     293             : {
     294             :   return bgp_node_from_rnode (route_table_get_next (table->route_table, p));
     295             : }
     296             : 
     297             : /*
     298             :  * bgp_table_iter_init
     299             :  */
     300             : static inline void
     301             : bgp_table_iter_init (bgp_table_iter_t * iter, struct bgp_table *table)
     302             : {
     303             :   bgp_table_lock (table);
     304             :   iter->table = table;
     305             :   route_table_iter_init (&iter->rt_iter, table->route_table);
     306             : }
     307             : 
     308             : /*
     309             :  * bgp_table_iter_next
     310             :  */
     311             : static inline struct bgp_node *
     312             : bgp_table_iter_next (bgp_table_iter_t * iter)
     313             : {
     314             :   return bgp_node_from_rnode (route_table_iter_next (&iter->rt_iter));
     315             : }
     316             : 
     317             : /*
     318             :  * bgp_table_iter_cleanup
     319             :  */
     320             : static inline void
     321             : bgp_table_iter_cleanup (bgp_table_iter_t * iter)
     322             : {
     323             :   route_table_iter_cleanup (&iter->rt_iter);
     324             :   bgp_table_unlock (iter->table);
     325             :   iter->table = NULL;
     326             : }
     327             : 
     328             : /*
     329             :  * bgp_table_iter_pause
     330             :  */
     331             : static inline void
     332             : bgp_table_iter_pause (bgp_table_iter_t * iter)
     333             : {
     334             :   route_table_iter_pause (&iter->rt_iter);
     335             : }
     336             : 
     337             : /*
     338             :  * bgp_table_iter_is_done
     339             :  */
     340             : static inline int
     341             : bgp_table_iter_is_done (bgp_table_iter_t * iter)
     342             : {
     343             :   return route_table_iter_is_done (&iter->rt_iter);
     344             : }
     345             : 
     346             : /*
     347             :  * bgp_table_iter_started
     348             :  */
     349             : static inline int
     350             : bgp_table_iter_started (bgp_table_iter_t * iter)
     351             : {
     352             :   return route_table_iter_started (&iter->rt_iter);
     353             : }
     354             : 
     355             : #endif /* _QUAGGA_BGP_TABLE_H */

Generated by: LCOV version 1.10