/* 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. */ #include #include "prefix.h" #include "memory.h" #include "sockunion.h" #include "vty.h" #include "bgpd/bgpd.h" #include "bgpd/bgp_table.h" void bgp_table_lock (struct bgp_table *rt) { rt->lock++; } void bgp_table_unlock (struct bgp_table *rt) { assert (rt->lock > 0); rt->lock--; if (rt->lock != 0) { return; } route_table_finish (rt->route_table); rt->route_table = NULL; if (rt->owner) { peer_unlock (rt->owner); rt->owner = NULL; } XFREE (MTYPE_BGP_TABLE, rt); } void bgp_table_finish (struct bgp_table **rt) { if (*rt != NULL) { bgp_table_unlock(*rt); *rt = NULL; } } /* * bgp_node_create */ static struct route_node * bgp_node_create (route_table_delegate_t *delegate, struct route_table *table) { struct bgp_node *node; node = XCALLOC (MTYPE_BGP_NODE, sizeof (struct bgp_node)); return bgp_node_to_rnode (node); } /* * bgp_node_destroy */ static void bgp_node_destroy (route_table_delegate_t *delegate, struct route_table *table, struct route_node *node) { struct bgp_node *bgp_node; bgp_node = bgp_node_from_rnode (node); XFREE (MTYPE_BGP_NODE, bgp_node); } /* * Function vector to customize the behavior of the route table * library for BGP route tables. */ route_table_delegate_t bgp_table_delegate = { .create_node = bgp_node_create, .destroy_node = bgp_node_destroy }; /* * bgp_table_init */ struct bgp_table * bgp_table_init (afi_t afi, safi_t safi) { struct bgp_table *rt; rt = XCALLOC (MTYPE_BGP_TABLE, sizeof (struct bgp_table)); rt->route_table = route_table_init_with_delegate (&bgp_table_delegate); /* * Set up back pointer to bgp_table. */ rt->route_table->info = rt; bgp_table_lock (rt); rt->type = BGP_TABLE_MAIN; rt->afi = afi; rt->safi = safi; return rt; }