* This just frees appropriate memory, caller should have taken other
* needed actions.
*/
-static void bgp_evpn_es_free(struct bgp_evpn_es *es)
+static void bgp_evpn_es_free(struct bgp_evpn_es *es, const char *caller)
{
if (es->flags & (BGP_EVPNES_LOCAL | BGP_EVPNES_REMOTE))
return;
+ if (BGP_DEBUG(evpn_mh, EVPN_MH_ES))
+ zlog_debug("%s: es %s free", caller, es->esi_str);
+
/* cleanup resources maintained against the ES */
list_delete(&es->es_evi_list);
list_delete(&es->es_vtep_list);
bf_release_index(bm->rd_idspace, es->rd_id);
- bgp_evpn_es_free(es);
+ bgp_evpn_es_free(es, __func__);
}
/* eval remote info associated with the ES */
} else {
if (CHECK_FLAG(es->flags, BGP_EVPNES_REMOTE)) {
UNSET_FLAG(es->flags, BGP_EVPNES_REMOTE);
- bgp_evpn_es_free(es);
+ bgp_evpn_es_free(es, __func__);
}
}
}
if (!es_evi) {
es_evi = bgp_evpn_es_evi_new(es, vpn);
if (!es_evi) {
- bgp_evpn_es_free(es);
+ bgp_evpn_es_free(es, __func__);
return -1;
}
}
{
struct bgp_evpn_es *es;
struct bgp_evpn_es *es_next;
- struct bgp *bgp;
- bgp = bgp_get_evpn();
- if (bgp) {
- RB_FOREACH_SAFE(es, bgp_es_rb_head,
- &bgp_mh_info->es_rb_tree, es_next) {
- /* XXX - need to force free remote ESs here */
- bgp_evpn_local_es_do_del(bgp, es);
- }
+ if (BGP_DEBUG(evpn_mh, EVPN_MH_RT))
+ zlog_debug("evpn mh finish");
+
+ RB_FOREACH_SAFE (es, bgp_es_rb_head, &bgp_mh_info->es_rb_tree,
+ es_next) {
+ bgp_evpn_es_local_info_clear(es);
}
thread_cancel(bgp_mh_info->t_cons_check);
list_delete(&bgp_mh_info->local_es_list);