summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pimd/pim_ifchannel.c7
-rw-r--r--pimd/pim_ifchannel.h1
-rw-r--r--pimd/pim_upstream.c12
3 files changed, 9 insertions, 11 deletions
diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c
index bb56379c14..5e6b0f10cf 100644
--- a/pimd/pim_ifchannel.c
+++ b/pimd/pim_ifchannel.c
@@ -124,11 +124,6 @@ static void pim_ifchannel_find_new_children(struct pim_ifchannel *ch)
}
}
-void pim_ifchannel_free(struct pim_ifchannel *ch)
-{
- XFREE(MTYPE_PIM_IFCHANNEL, ch);
-}
-
void pim_ifchannel_delete(struct pim_ifchannel *ch)
{
struct pim_interface *pim_ifp;
@@ -198,7 +193,7 @@ void pim_ifchannel_delete(struct pim_ifchannel *ch)
zlog_debug("%s: ifchannel entry %s is deleted ",
__PRETTY_FUNCTION__, ch->sg_str);
- pim_ifchannel_free(ch);
+ XFREE(MTYPE_PIM_IFCHANNEL, ch);
}
void pim_ifchannel_delete_all(struct interface *ifp)
diff --git a/pimd/pim_ifchannel.h b/pimd/pim_ifchannel.h
index 0af9ebf0be..b9d4d291d8 100644
--- a/pimd/pim_ifchannel.h
+++ b/pimd/pim_ifchannel.h
@@ -114,7 +114,6 @@ RB_HEAD(pim_ifchannel_rb, pim_ifchannel);
RB_PROTOTYPE(pim_ifchannel_rb, pim_ifchannel, pim_ifp_rb,
pim_ifchannel_compare);
-void pim_ifchannel_free(struct pim_ifchannel *ch);
void pim_ifchannel_delete(struct pim_ifchannel *ch);
void pim_ifchannel_delete_all(struct interface *ifp);
void pim_ifchannel_membership_clear(struct interface *ifp);
diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c
index 37dff2d058..9329d72ce0 100644
--- a/pimd/pim_upstream.c
+++ b/pimd/pim_upstream.c
@@ -155,6 +155,8 @@ static void upstream_channel_oil_detach(struct pim_upstream *up)
struct pim_upstream *pim_upstream_del(struct pim_instance *pim,
struct pim_upstream *up, const char *name)
{
+ struct listnode *node, *nnode;
+ struct pim_ifchannel *ch;
bool notify_msdp = false;
struct prefix nht_p;
@@ -194,15 +196,17 @@ struct pim_upstream *pim_upstream_del(struct pim_instance *pim,
notify_msdp = true;
}
- pim_upstream_remove_children(pim, up);
- if (up->sources)
- list_delete_and_null(&up->sources);
-
pim_mroute_del(up->channel_oil, __PRETTY_FUNCTION__);
upstream_channel_oil_detach(up);
+ for (ALL_LIST_ELEMENTS(up->ifchannels, node, nnode, ch))
+ pim_ifchannel_delete(ch);
list_delete_and_null(&up->ifchannels);
+ pim_upstream_remove_children(pim, up);
+ if (up->sources)
+ list_delete_and_null(&up->sources);
+
if (up->parent && up->parent->sources)
listnode_delete(up->parent->sources, up);
up->parent = NULL;