Annotation of embedaddon/quagga/bgpd/bgp_table.c, revision 1.1.1.2
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: #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:
31: void
32: bgp_table_lock (struct bgp_table *rt)
33: {
34: rt->lock++;
35: }
36:
37: void
38: bgp_table_unlock (struct bgp_table *rt)
39: {
40: assert (rt->lock > 0);
41: rt->lock--;
42:
1.1.1.2 ! misho 43: if (rt->lock != 0)
1.1 misho 44: {
1.1.1.2 ! misho 45: return;
1.1 misho 46: }
47:
1.1.1.2 ! misho 48: route_table_finish (rt->route_table);
! 49: rt->route_table = NULL;
1.1 misho 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:
60: void
1.1.1.2 ! misho 61: bgp_table_finish (struct bgp_table **rt)
1.1 misho 62: {
1.1.1.2 ! misho 63: if (*rt != NULL)
1.1 misho 64: {
1.1.1.2 ! misho 65: bgp_table_unlock(*rt);
! 66: *rt = NULL;
1.1 misho 67: }
68: }
69:
1.1.1.2 ! misho 70: /*
! 71: * bgp_node_create
! 72: */
! 73: static struct route_node *
! 74: bgp_node_create (route_table_delegate_t *delegate, struct route_table *table)
1.1 misho 75: {
76: struct bgp_node *node;
1.1.1.2 ! misho 77: node = XCALLOC (MTYPE_BGP_NODE, sizeof (struct bgp_node));
! 78: return bgp_node_to_rnode (node);
1.1 misho 79: }
80:
1.1.1.2 ! misho 81: /*
! 82: * bgp_node_destroy
! 83: */
1.1 misho 84: static void
1.1.1.2 ! misho 85: bgp_node_destroy (route_table_delegate_t *delegate,
! 86: struct route_table *table, struct route_node *node)
1.1 misho 87: {
1.1.1.2 ! misho 88: struct bgp_node *bgp_node;
! 89: bgp_node = bgp_node_from_rnode (node);
! 90: XFREE (MTYPE_BGP_NODE, bgp_node);
1.1 misho 91: }
92:
1.1.1.2 ! misho 93: /*
! 94: * Function vector to customize the behavior of the route table
! 95: * library for BGP route tables.
! 96: */
! 97: route_table_delegate_t bgp_table_delegate = {
! 98: .create_node = bgp_node_create,
! 99: .destroy_node = bgp_node_destroy
! 100: };
1.1 misho 101:
1.1.1.2 ! misho 102: /*
! 103: * bgp_table_init
! 104: */
! 105: struct bgp_table *
! 106: bgp_table_init (afi_t afi, safi_t safi)
1.1 misho 107: {
1.1.1.2 ! misho 108: struct bgp_table *rt;
1.1 misho 109:
1.1.1.2 ! misho 110: rt = XCALLOC (MTYPE_BGP_TABLE, sizeof (struct bgp_table));
1.1 misho 111:
1.1.1.2 ! misho 112: rt->route_table = route_table_init_with_delegate (&bgp_table_delegate);
1.1 misho 113:
1.1.1.2 ! misho 114: /*
! 115: * Set up back pointer to bgp_table.
! 116: */
! 117: rt->route_table->info = rt;
1.1 misho 118:
1.1.1.2 ! misho 119: bgp_table_lock (rt);
! 120: rt->type = BGP_TABLE_MAIN;
! 121: rt->afi = afi;
! 122: rt->safi = safi;
1.1 misho 123:
1.1.1.2 ! misho 124: return rt;
1.1 misho 125: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>