mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-28 16:06:20 +00:00
Merge pull request #7353 from AnuradhaKaruppiah/mh-cleanup-fix-1
bgpd: fix crash in the MH cleanup handling
This commit is contained in:
commit
719e0a6a6c
@ -1316,11 +1316,14 @@ static struct bgp_evpn_es *bgp_evpn_es_new(struct bgp *bgp, const esi_t *esi)
|
||||
* 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);
|
||||
@ -1367,7 +1370,7 @@ static void bgp_evpn_es_local_info_clear(struct bgp_evpn_es *es)
|
||||
|
||||
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 */
|
||||
@ -1378,7 +1381,7 @@ static void bgp_evpn_es_remote_info_re_eval(struct bgp_evpn_es *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__);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2320,7 +2323,7 @@ int bgp_evpn_remote_es_evi_add(struct bgp *bgp, struct bgpevpn *vpn,
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -2903,15 +2906,13 @@ void bgp_evpn_mh_finish(void)
|
||||
{
|
||||
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);
|
||||
|
@ -62,6 +62,7 @@
|
||||
#include "bgpd/bgp_errors.h"
|
||||
#include "lib/routing_nb.h"
|
||||
#include "bgpd/bgp_nb.h"
|
||||
#include "bgpd/bgp_evpn_mh.h"
|
||||
|
||||
#ifdef ENABLE_BGP_VNC
|
||||
#include "bgpd/rfapi/rfapi_backend.h"
|
||||
@ -207,6 +208,8 @@ static __attribute__((__noreturn__)) void bgp_exit(int status)
|
||||
if (bgp_default)
|
||||
bgp_delete(bgp_default);
|
||||
|
||||
bgp_evpn_mh_finish();
|
||||
|
||||
/* reverse bgp_dump_init */
|
||||
bgp_dump_finish();
|
||||
|
||||
|
@ -7298,7 +7298,6 @@ void bgp_terminate(void)
|
||||
BGP_TIMER_OFF(bm->t_rmap_update);
|
||||
|
||||
bgp_mac_finish();
|
||||
bgp_evpn_mh_finish();
|
||||
}
|
||||
|
||||
struct peer *peer_lookup_in_view(struct vty *vty, struct bgp *bgp,
|
||||
|
Loading…
Reference in New Issue
Block a user