]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/bgp_table.c
If the .conf file for a process is missing have /etc/init.d/quagga touch it so we...
[mirror_frr.git] / bgpd / bgp_table.c
CommitLineData
718e3744 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
228da428
CC
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
67174041 43 if (rt->lock != 0)
228da428 44 {
67174041 45 return;
228da428 46 }
718e3744 47
67174041
AS
48 route_table_finish (rt->route_table);
49 rt->route_table = NULL;
228da428
CC
50
51 if (rt->owner)
52 {
53 peer_unlock (rt->owner);
54 rt->owner = NULL;
55 }
56
718e3744 57 XFREE (MTYPE_BGP_TABLE, rt);
718e3744 58}
59
718e3744 60void
67174041 61bgp_table_finish (struct bgp_table **rt)
718e3744 62{
67174041 63 if (*rt != NULL)
718e3744 64 {
67174041
AS
65 bgp_table_unlock(*rt);
66 *rt = NULL;
718e3744 67 }
718e3744 68}
69
67174041
AS
70/*
71 * bgp_node_create
72 */
73static struct route_node *
74bgp_node_create (route_table_delegate_t *delegate, struct route_table *table)
718e3744 75{
718e3744 76 struct bgp_node *node;
67174041
AS
77 node = XCALLOC (MTYPE_BGP_NODE, sizeof (struct bgp_node));
78 return bgp_node_to_rnode (node);
718e3744 79}
80
67174041
AS
81/*
82 * bgp_node_destroy
83 */
b608d5b5 84static void
67174041
AS
85bgp_node_destroy (route_table_delegate_t *delegate,
86 struct route_table *table, struct route_node *node)
718e3744 87{
67174041
AS
88 struct bgp_node *bgp_node;
89 bgp_node = bgp_node_from_rnode (node);
90 XFREE (MTYPE_BGP_NODE, bgp_node);
718e3744 91}
92
67174041
AS
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};
718e3744 101
67174041
AS
102/*
103 * bgp_table_init
104 */
105struct bgp_table *
106bgp_table_init (afi_t afi, safi_t safi)
718e3744 107{
67174041 108 struct bgp_table *rt;
718e3744 109
67174041 110 rt = XCALLOC (MTYPE_BGP_TABLE, sizeof (struct bgp_table));
718e3744 111
67174041 112 rt->route_table = route_table_init_with_delegate (&bgp_table_delegate);
718e3744 113
67174041
AS
114 /*
115 * Set up back pointer to bgp_table.
116 */
117 rt->route_table->info = rt;
718e3744 118
67174041
AS
119 bgp_table_lock (rt);
120 rt->type = BGP_TABLE_MAIN;
121 rt->afi = afi;
122 rt->safi = safi;
cbdfbaa5 123
67174041 124 return rt;
cbdfbaa5 125}