blob: 92bb95753a0555a55c8c8a68fd4925f8d6ab717c [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/* 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"
Donald Sharp04907292016-01-07 10:03:01 -050027#include "filter.h"
paul718e3742002-12-13 20:15:29 +000028
29#include "bgpd/bgpd.h"
30#include "bgpd/bgp_table.h"
31
paul718e3742002-12-13 20:15:29 +000032void
Chris Caputo228da422009-07-18 05:44:03 +000033bgp_table_lock (struct bgp_table *rt)
34{
35 rt->lock++;
36}
37
38void
39bgp_table_unlock (struct bgp_table *rt)
40{
41 assert (rt->lock > 0);
42 rt->lock--;
43
Avneesh Sachdev67174042012-08-17 08:19:49 -070044 if (rt->lock != 0)
45 {
46 return;
47 }
48
49 route_table_finish (rt->route_table);
50 rt->route_table = NULL;
51
52 if (rt->owner)
53 {
54 peer_unlock (rt->owner);
55 rt->owner = NULL;
56 }
57
58 XFREE (MTYPE_BGP_TABLE, rt);
Chris Caputo228da422009-07-18 05:44:03 +000059}
60
61void
Paul Jakmab608d5b2008-07-02 02:12:07 +000062bgp_table_finish (struct bgp_table **rt)
paul718e3742002-12-13 20:15:29 +000063{
Chris Caputo228da422009-07-18 05:44:03 +000064 if (*rt != NULL)
65 {
66 bgp_table_unlock(*rt);
67 *rt = NULL;
68 }
paul718e3742002-12-13 20:15:29 +000069}
70
Avneesh Sachdev67174042012-08-17 08:19:49 -070071/*
72 * bgp_node_create
73 */
74static struct route_node *
75bgp_node_create (route_table_delegate_t *delegate, struct route_table *table)
paul718e3742002-12-13 20:15:29 +000076{
77 struct bgp_node *node;
Avneesh Sachdev67174042012-08-17 08:19:49 -070078 node = XCALLOC (MTYPE_BGP_NODE, sizeof (struct bgp_node));
79 return bgp_node_to_rnode (node);
paul718e3742002-12-13 20:15:29 +000080}
81
Avneesh Sachdev67174042012-08-17 08:19:49 -070082/*
83 * bgp_node_destroy
84 */
paul94f2b392005-06-28 12:44:16 +000085static void
Avneesh Sachdev67174042012-08-17 08:19:49 -070086bgp_node_destroy (route_table_delegate_t *delegate,
87 struct route_table *table, struct route_node *node)
paul718e3742002-12-13 20:15:29 +000088{
Avneesh Sachdev67174042012-08-17 08:19:49 -070089 struct bgp_node *bgp_node;
90 bgp_node = bgp_node_from_rnode (node);
91 XFREE (MTYPE_BGP_NODE, bgp_node);
paul718e3742002-12-13 20:15:29 +000092}
93
Avneesh Sachdev67174042012-08-17 08:19:49 -070094/*
95 * Function vector to customize the behavior of the route table
96 * library for BGP route tables.
97 */
98route_table_delegate_t bgp_table_delegate = {
99 .create_node = bgp_node_create,
100 .destroy_node = bgp_node_destroy
paul718e3742002-12-13 20:15:29 +0000101};
102
Avneesh Sachdev67174042012-08-17 08:19:49 -0700103/*
104 * bgp_table_init
105 */
106struct bgp_table *
107bgp_table_init (afi_t afi, safi_t safi)
paul718e3742002-12-13 20:15:29 +0000108{
Avneesh Sachdev67174042012-08-17 08:19:49 -0700109 struct bgp_table *rt;
paul718e3742002-12-13 20:15:29 +0000110
Avneesh Sachdev67174042012-08-17 08:19:49 -0700111 rt = XCALLOC (MTYPE_BGP_TABLE, sizeof (struct bgp_table));
paul718e3742002-12-13 20:15:29 +0000112
Avneesh Sachdev67174042012-08-17 08:19:49 -0700113 rt->route_table = route_table_init_with_delegate (&bgp_table_delegate);
paul718e3742002-12-13 20:15:29 +0000114
Avneesh Sachdev67174042012-08-17 08:19:49 -0700115 /*
116 * Set up back pointer to bgp_table.
117 */
118 rt->route_table->info = rt;
paul718e3742002-12-13 20:15:29 +0000119
Avneesh Sachdev67174042012-08-17 08:19:49 -0700120 bgp_table_lock (rt);
121 rt->type = BGP_TABLE_MAIN;
122 rt->afi = afi;
123 rt->safi = safi;
paul718e3742002-12-13 20:15:29 +0000124
Avneesh Sachdev67174042012-08-17 08:19:49 -0700125 return rt;
Paul Jakmacbdfbaa2006-03-30 13:20:48 +0000126}