]>
git.proxmox.com Git - mirror_frr.git/blob - bgpd/rfapi/vnc_export_table.c
3 * Copyright 2009-2016, LabN Consulting, L.L.C.
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "lib/zebra.h"
23 #include "lib/prefix.h"
24 #include "lib/table.h"
25 #include "lib/memory.h"
28 #include "bgpd/bgpd.h"
29 #include "bgpd/bgp_route.h"
31 #include "bgpd/rfapi/vnc_export_table.h"
32 #include "bgpd/rfapi/rfapi_private.h"
33 #include "bgpd/rfapi/rfapi_import.h"
34 #include "bgpd/rfapi/vnc_debug.h"
37 vnc_etn_get (struct bgp
*bgp
, vnc_export_type_t type
, struct prefix
*p
)
39 struct route_table
*t
= NULL
;
40 struct route_node
*rn
= NULL
;
43 if (!bgp
|| !bgp
->rfapi
)
46 afi
= family2afi (p
->family
);
47 assert (afi
== AFI_IP
|| afi
== AFI_IP6
);
52 if (!bgp
->rfapi
->rt_export_bgp
[afi
])
53 bgp
->rfapi
->rt_export_bgp
[afi
] = route_table_init ();
54 t
= bgp
->rfapi
->rt_export_bgp
[afi
];
57 case EXPORT_TYPE_ZEBRA
:
58 if (!bgp
->rfapi
->rt_export_zebra
[afi
])
59 bgp
->rfapi
->rt_export_zebra
[afi
] = route_table_init ();
60 t
= bgp
->rfapi
->rt_export_zebra
[afi
];
65 rn
= route_node_get (t
, p
);
70 vnc_etn_lookup (struct bgp
*bgp
, vnc_export_type_t type
, struct prefix
*p
)
72 struct route_table
*t
= NULL
;
73 struct route_node
*rn
= NULL
;
76 if (!bgp
|| !bgp
->rfapi
)
79 afi
= family2afi (p
->family
);
80 assert (afi
== AFI_IP
|| afi
== AFI_IP6
);
85 if (!bgp
->rfapi
->rt_export_bgp
[afi
])
86 bgp
->rfapi
->rt_export_bgp
[afi
] = route_table_init ();
87 t
= bgp
->rfapi
->rt_export_bgp
[afi
];
90 case EXPORT_TYPE_ZEBRA
:
91 if (!bgp
->rfapi
->rt_export_zebra
[afi
])
92 bgp
->rfapi
->rt_export_zebra
[afi
] = route_table_init ();
93 t
= bgp
->rfapi
->rt_export_zebra
[afi
];
98 rn
= route_node_lookup (t
, p
);
102 struct vnc_export_info
*
105 vnc_export_type_t etype
,
111 struct route_node
*etn
;
112 struct vnc_export_info
*eti
;
114 etn
= vnc_etn_get (bgp
, etype
, p
);
117 for (eti
= etn
->info
; eti
; eti
= eti
->next
)
119 if (peer
== eti
->peer
&& type
== eti
->type
&& subtype
== eti
->subtype
)
128 route_unlock_node (etn
);
132 eti
= XCALLOC (MTYPE_RFAPI_ETI
, sizeof (struct vnc_export_info
));
138 eti
->subtype
= subtype
;
139 eti
->next
= etn
->info
;
147 vnc_eti_delete (struct vnc_export_info
*goner
)
149 struct route_node
*etn
;
150 struct vnc_export_info
*eti
;
151 struct vnc_export_info
*eti_prev
= NULL
;
155 for (eti
= etn
->info
; eti
; eti_prev
= eti
, eti
= eti
->next
)
163 vnc_zlog_debug_verbose ("%s: COULDN'T FIND ETI", __func__
);
169 eti_prev
->next
= goner
->next
;
173 etn
->info
= goner
->next
;
176 peer_unlock (eti
->peer
);
178 XFREE (MTYPE_RFAPI_ETI
, goner
);
180 route_unlock_node (etn
);
183 struct vnc_export_info
*
186 vnc_export_type_t etype
,
192 struct route_node
*etn
;
193 struct vnc_export_info
*eti
;
195 etn
= vnc_etn_lookup (bgp
, etype
, p
);
199 for (eti
= etn
->info
; eti
; eti
= eti
->next
)
201 if (peer
== eti
->peer
&& type
== eti
->type
&& subtype
== eti
->subtype
)
208 route_unlock_node (etn
);
210 if (eti
&& eti
->timer
)