pimd: Cleanup msdp.mg on shutdown

When shutting down PIM, ensure that hte pim->msdp.mg is cleaned up.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2018-08-02 23:07:08 -04:00
parent 662ba9e6f0
commit 822d3c858c

View File

@ -1242,8 +1242,10 @@ static int pim_msdp_peer_comp(const void *p1, const void *p2)
} }
/************************** Mesh group management **************************/ /************************** Mesh group management **************************/
static void pim_msdp_mg_free(struct pim_instance *pim, struct pim_msdp_mg *mg) static void pim_msdp_mg_free(struct pim_instance *pim)
{ {
struct pim_msdp_mg *mg = pim->msdp.mg;
/* If the mesh-group has valid member or src_ip don't delete it */ /* If the mesh-group has valid member or src_ip don't delete it */
if (!mg || mg->mbr_cnt || (mg->src_ip.s_addr != INADDR_ANY)) { if (!mg || mg->mbr_cnt || (mg->src_ip.s_addr != INADDR_ANY)) {
return; return;
@ -1258,8 +1260,7 @@ static void pim_msdp_mg_free(struct pim_instance *pim, struct pim_msdp_mg *mg)
if (mg->mbr_list) if (mg->mbr_list)
list_delete_and_null(&mg->mbr_list); list_delete_and_null(&mg->mbr_list);
XFREE(MTYPE_PIM_MSDP_MG, mg); XFREE(MTYPE_PIM_MSDP_MG, pim->msdp.mg);
pim->msdp.mg = NULL;
} }
static struct pim_msdp_mg *pim_msdp_mg_new(const char *mesh_group_name) static struct pim_msdp_mg *pim_msdp_mg_new(const char *mesh_group_name)
@ -1299,7 +1300,7 @@ enum pim_msdp_err pim_msdp_mg_del(struct pim_instance *pim,
mg->src_ip.s_addr = INADDR_ANY; mg->src_ip.s_addr = INADDR_ANY;
/* free up the mesh-group */ /* free up the mesh-group */
pim_msdp_mg_free(pim, mg); pim_msdp_mg_free(pim);
return PIM_MSDP_ERR_NONE; return PIM_MSDP_ERR_NONE;
} }
@ -1438,7 +1439,7 @@ enum pim_msdp_err pim_msdp_mg_mbr_del(struct pim_instance *pim,
pim_msdp_mg_mbr_do_del(mg, mbr); pim_msdp_mg_mbr_do_del(mg, mbr);
/* if there are no references to the mg free it */ /* if there are no references to the mg free it */
pim_msdp_mg_free(pim, mg); pim_msdp_mg_free(pim);
return PIM_MSDP_ERR_NONE; return PIM_MSDP_ERR_NONE;
} }
@ -1475,7 +1476,7 @@ enum pim_msdp_err pim_msdp_mg_src_del(struct pim_instance *pim,
mg->src_ip.s_addr = INADDR_ANY; mg->src_ip.s_addr = INADDR_ANY;
pim_msdp_mg_src_do_del(pim); pim_msdp_mg_src_do_del(pim);
/* if there are no references to the mg free it */ /* if there are no references to the mg free it */
pim_msdp_mg_free(pim, mg); pim_msdp_mg_free(pim);
} }
return PIM_MSDP_ERR_NONE; return PIM_MSDP_ERR_NONE;
} }
@ -1598,6 +1599,8 @@ void pim_msdp_exit(struct pim_instance *pim)
/* XXX: stop listener and delete all peer sessions */ /* XXX: stop listener and delete all peer sessions */
pim_msdp_mg_free(pim);
if (pim->msdp.peer_hash) { if (pim->msdp.peer_hash) {
hash_clean(pim->msdp.peer_hash, NULL); hash_clean(pim->msdp.peer_hash, NULL);
hash_free(pim->msdp.peer_hash); hash_free(pim->msdp.peer_hash);