Annotation of embedaddon/quagga/bgpd/bgp_table.h, revision 1.1.1.3

1.1       misho       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: 
1.1.1.2   misho      24: #include "table.h"
                     25: 
1.1       misho      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: 
1.1.1.2   misho      45:   struct route_table *route_table;
1.1       misho      46: };
                     47: 
                     48: struct bgp_node
                     49: {
1.1.1.2   misho      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:    */
1.1.1.3 ! misho      58:   ROUTE_NODE_FIELDS
1.1       misho      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: 
1.1.1.2   misho      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: 
1.1       misho      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 **);
1.1.1.2   misho      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: bgp_node_from_rnode (struct route_node *rnode)
                     94: {
                     95:   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: bgp_node_to_rnode (struct bgp_node *node)
                    105: {
                    106:   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: bgp_node_table (struct bgp_node *node)
                    116: {
                    117:   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: bgp_node_parent_nolock (struct bgp_node *node)
                    165: {
                    166:   return bgp_node_from_rnode (node->parent);
                    167: }
                    168: 
                    169: /*
                    170:  * bgp_unlock_node
                    171:  */
                    172: static inline void
                    173: bgp_unlock_node (struct bgp_node *node)
                    174: {
                    175:   route_unlock_node (bgp_node_to_rnode (node));
                    176: }
                    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: bgp_table_top_nolock (const struct bgp_table *const table)
                    187: {
                    188:   return bgp_node_from_rnode (table->route_table->top);
                    189: }
                    190: 
                    191: /*
                    192:  * bgp_table_top
                    193:  */
                    194: static inline struct bgp_node *
                    195: bgp_table_top (const struct bgp_table *const table)
                    196: {
                    197:   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: bgp_route_next (struct bgp_node *node)
                    205: {
                    206:   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: bgp_route_next_until (struct bgp_node *node, struct bgp_node *limit)
                    214: {
                    215:   struct route_node *rnode;
                    216: 
                    217:   rnode = route_next_until (bgp_node_to_rnode (node),
                    218:                            bgp_node_to_rnode (limit));
                    219:   return bgp_node_from_rnode (rnode);
                    220: }
                    221: 
                    222: /*
                    223:  * bgp_node_get
                    224:  */
                    225: static inline struct bgp_node *
                    226: bgp_node_get (struct bgp_table *const table, struct prefix *p)
                    227: {
                    228:   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: bgp_node_lookup (const struct bgp_table *const table, struct prefix *p)
                    236: {
                    237:   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: bgp_lock_node (struct bgp_node *node)
                    245: {
                    246:   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: bgp_node_match (const struct bgp_table *table, struct prefix *p)
                    254: {
                    255:   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: bgp_node_match_ipv4 (const struct bgp_table *table, struct in_addr *addr)
                    263: {
                    264:   return bgp_node_from_rnode (route_node_match_ipv4 (table->route_table, 
                    265:                                                     addr));
                    266: }
                    267: 
                    268: /*
                    269:  * bgp_node_match_ipv6
                    270:  */
                    271: static inline struct bgp_node *
                    272: bgp_node_match_ipv6 (const struct bgp_table *table, struct in6_addr *addr)
                    273: {
                    274:   return bgp_node_from_rnode (route_node_match_ipv6 (table->route_table,
                    275:                                                     addr));
                    276: }
                    277: 
                    278: static inline unsigned long
                    279: bgp_table_count (const struct bgp_table *const table)
                    280: {
                    281:   return route_table_count (table->route_table);
                    282: }
                    283: 
                    284: /*
                    285:  * bgp_table_get_next
                    286:  */
                    287: static inline struct bgp_node *
                    288: bgp_table_get_next (const struct bgp_table *table, struct prefix *p)
                    289: {
                    290:   return bgp_node_from_rnode (route_table_get_next (table->route_table, p));
                    291: }
                    292: 
                    293: /*
                    294:  * bgp_table_iter_init
                    295:  */
                    296: static inline void
                    297: bgp_table_iter_init (bgp_table_iter_t * iter, struct bgp_table *table)
                    298: {
                    299:   bgp_table_lock (table);
                    300:   iter->table = table;
                    301:   route_table_iter_init (&iter->rt_iter, table->route_table);
                    302: }
                    303: 
                    304: /*
                    305:  * bgp_table_iter_next
                    306:  */
                    307: static inline struct bgp_node *
                    308: bgp_table_iter_next (bgp_table_iter_t * iter)
                    309: {
                    310:   return bgp_node_from_rnode (route_table_iter_next (&iter->rt_iter));
                    311: }
                    312: 
                    313: /*
                    314:  * bgp_table_iter_cleanup
                    315:  */
                    316: static inline void
                    317: bgp_table_iter_cleanup (bgp_table_iter_t * iter)
                    318: {
                    319:   route_table_iter_cleanup (&iter->rt_iter);
                    320:   bgp_table_unlock (iter->table);
                    321:   iter->table = NULL;
                    322: }
                    323: 
                    324: /*
                    325:  * bgp_table_iter_pause
                    326:  */
                    327: static inline void
                    328: bgp_table_iter_pause (bgp_table_iter_t * iter)
                    329: {
                    330:   route_table_iter_pause (&iter->rt_iter);
                    331: }
                    332: 
                    333: /*
                    334:  * bgp_table_iter_is_done
                    335:  */
                    336: static inline int
                    337: bgp_table_iter_is_done (bgp_table_iter_t * iter)
                    338: {
                    339:   return route_table_iter_is_done (&iter->rt_iter);
                    340: }
                    341: 
                    342: /*
                    343:  * bgp_table_iter_started
                    344:  */
                    345: static inline int
                    346: bgp_table_iter_started (bgp_table_iter_t * iter)
                    347: {
                    348:   return route_table_iter_started (&iter->rt_iter);
                    349: }
                    350: 
1.1       misho     351: #endif /* _QUAGGA_BGP_TABLE_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>