]>
git.proxmox.com Git - mirror_frr.git/blob - bgpd/rfapi/vnc_export_table.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright 2009-2016, LabN Consulting, L.L.C.
10 #include "lib/prefix.h"
11 #include "lib/agg_table.h"
12 #include "lib/memory.h"
15 #include "bgpd/bgpd.h"
16 #include "bgpd/bgp_route.h"
18 #include "bgpd/rfapi/vnc_export_table.h"
19 #include "bgpd/rfapi/rfapi_private.h"
20 #include "bgpd/rfapi/rfapi_import.h"
21 #include "bgpd/rfapi/vnc_debug.h"
23 struct agg_node
*vnc_etn_get(struct bgp
*bgp
, vnc_export_type_t type
,
24 const struct prefix
*p
)
26 struct agg_table
*t
= NULL
;
27 struct agg_node
*rn
= NULL
;
30 if (!bgp
|| !bgp
->rfapi
)
33 afi
= family2afi(p
->family
);
34 assert(afi
== AFI_IP
|| afi
== AFI_IP6
);
38 if (!bgp
->rfapi
->rt_export_bgp
[afi
])
39 bgp
->rfapi
->rt_export_bgp
[afi
] = agg_table_init();
40 t
= bgp
->rfapi
->rt_export_bgp
[afi
];
43 case EXPORT_TYPE_ZEBRA
:
44 if (!bgp
->rfapi
->rt_export_zebra
[afi
])
45 bgp
->rfapi
->rt_export_zebra
[afi
] = agg_table_init();
46 t
= bgp
->rfapi
->rt_export_zebra
[afi
];
51 rn
= agg_node_get(t
, p
);
55 struct agg_node
*vnc_etn_lookup(struct bgp
*bgp
, vnc_export_type_t type
,
56 const struct prefix
*p
)
58 struct agg_table
*t
= NULL
;
59 struct agg_node
*rn
= NULL
;
62 if (!bgp
|| !bgp
->rfapi
)
65 afi
= family2afi(p
->family
);
66 assert(afi
== AFI_IP
|| afi
== AFI_IP6
);
70 if (!bgp
->rfapi
->rt_export_bgp
[afi
])
71 bgp
->rfapi
->rt_export_bgp
[afi
] = agg_table_init();
72 t
= bgp
->rfapi
->rt_export_bgp
[afi
];
75 case EXPORT_TYPE_ZEBRA
:
76 if (!bgp
->rfapi
->rt_export_zebra
[afi
])
77 bgp
->rfapi
->rt_export_zebra
[afi
] = agg_table_init();
78 t
= bgp
->rfapi
->rt_export_zebra
[afi
];
83 rn
= agg_node_lookup(t
, p
);
87 struct vnc_export_info
*vnc_eti_get(struct bgp
*bgp
, vnc_export_type_t etype
,
88 const struct prefix
*p
, struct peer
*peer
,
89 uint8_t type
, uint8_t subtype
)
92 struct vnc_export_info
*eti
;
94 etn
= vnc_etn_get(bgp
, etype
, p
);
97 for (eti
= etn
->info
; eti
; eti
= eti
->next
) {
98 if (peer
== eti
->peer
&& type
== eti
->type
99 && subtype
== eti
->subtype
) {
106 agg_unlock_node(etn
);
108 eti
= XCALLOC(MTYPE_RFAPI_ETI
, sizeof(struct vnc_export_info
));
113 eti
->subtype
= subtype
;
114 eti
->next
= etn
->info
;
121 void vnc_eti_delete(struct vnc_export_info
*goner
)
123 struct agg_node
*etn
;
124 struct vnc_export_info
*eti
;
125 struct vnc_export_info
*eti_prev
= NULL
;
129 for (eti
= etn
->info
; eti
; eti_prev
= eti
, eti
= eti
->next
) {
135 vnc_zlog_debug_verbose("%s: COULDN'T FIND ETI", __func__
);
140 eti_prev
->next
= goner
->next
;
142 etn
->info
= goner
->next
;
145 peer_unlock(eti
->peer
);
147 XFREE(MTYPE_RFAPI_ETI
, goner
);
149 agg_unlock_node(etn
);
152 struct vnc_export_info
*vnc_eti_checktimer(struct bgp
*bgp
,
153 vnc_export_type_t etype
,
154 const struct prefix
*p
,
155 struct peer
*peer
, uint8_t type
,
158 struct agg_node
*etn
;
159 struct vnc_export_info
*eti
;
161 etn
= vnc_etn_lookup(bgp
, etype
, p
);
165 for (eti
= etn
->info
; eti
; eti
= eti
->next
) {
166 if (peer
== eti
->peer
&& type
== eti
->type
167 && subtype
== eti
->subtype
) {
173 agg_unlock_node(etn
);
175 if (eti
&& eti
->timer
)