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 21#include <zebra.h> 22 23#include "prefix.h" 24#include "memory.h" 25#include "sockunion.h" 26#include "vty.h" 27 28#include "bgpd/bgpd.h" 29#include "bgpd/bgp_table.h" 30 31void 32bgp_table_lock (struct bgp_table *rt) 33{ 34 rt->lock++; 35} 36 37void 38bgp_table_unlock (struct bgp_table *rt) 39{ 40 assert (rt->lock > 0); 41 rt->lock--; 42 43 if (rt->lock != 0) 44 { 45 return; 46 } 47 48 route_table_finish (rt->route_table); 49 rt->route_table = NULL; 50 51 if (rt->owner) 52 { 53 peer_unlock (rt->owner); 54 rt->owner = NULL; 55 } 56 57 XFREE (MTYPE_BGP_TABLE, rt); 58} 59 60void 61bgp_table_finish (struct bgp_table **rt) 62{ 63 if (*rt != NULL) 64 { 65 bgp_table_unlock(*rt); 66 *rt = NULL; 67 } 68} 69 70/* 71 * bgp_node_create 72 */ 73static struct route_node * 74bgp_node_create (route_table_delegate_t *delegate, struct route_table *table) 75{ 76 struct bgp_node *node; 77 node = XCALLOC (MTYPE_BGP_NODE, sizeof (struct bgp_node)); 78 return bgp_node_to_rnode (node); 79} 80 81/* 82 * bgp_node_destroy 83 */ 84static void 85bgp_node_destroy (route_table_delegate_t *delegate, 86 struct route_table *table, struct route_node *node) 87{ 88 struct bgp_node *bgp_node; 89 bgp_node = bgp_node_from_rnode (node); 90 XFREE (MTYPE_BGP_NODE, bgp_node); 91} 92 93/* 94 * Function vector to customize the behavior of the route table 95 * library for BGP route tables. 96 */ 97route_table_delegate_t bgp_table_delegate = { 98 .create_node = bgp_node_create, 99 .destroy_node = bgp_node_destroy 100}; 101 102/* 103 * bgp_table_init 104 */ 105struct bgp_table * 106bgp_table_init (afi_t afi, safi_t safi) 107{ 108 struct bgp_table *rt; 109 110 rt = XCALLOC (MTYPE_BGP_TABLE, sizeof (struct bgp_table)); 111 112 rt->route_table = route_table_init_with_delegate (&bgp_table_delegate); 113 114 /* 115 * Set up back pointer to bgp_table. 116 */ 117 rt->route_table->info = rt; 118 119 bgp_table_lock (rt); 120 rt->type = BGP_TABLE_MAIN; 121 rt->afi = afi; 122 rt->safi = safi; 123 124 return rt; 125} 126