pim6d: Clear channel_oil on prune

Receiver---LHR---RP

Problem:
In LHR, ipv6 pim state remains after MLD prune received.

Root Cause:
When LHR receives join, it creates (*,G) channel oil with
oil_ref_count = 2. The channel_oil is used by gm_sg sg->oil
and upstream->channel_oil.

When LHR receives prune, currently upstream->channel_oil is
deleted and gm_sg sg->oil still present. Due to this channel_oil
is still present with oil_ref_count = 1

Fix:
When LHR receives prune, upstream->channel_oil and pim_sg sg->oil
needs to be deleted.

Issue: #11249

Signed-off-by: Sarita Patra <saritap@vmware.com>
This commit is contained in:
Sarita Patra 2022-07-07 08:12:10 -07:00
parent 1bafbcb24a
commit cb809c0d6c
2 changed files with 3 additions and 2 deletions

View File

@ -355,6 +355,7 @@ void igmp_source_delete(struct gm_source *source)
source_timer_off(group, source);
igmp_source_forward_stop(source);
source->source_channel_oil = NULL;
/* sanity check that forwarding has been disabled */
if (IGMP_SOURCE_TEST_FORWARDING(source->source_flags)) {
@ -371,8 +372,6 @@ void igmp_source_delete(struct gm_source *source)
/* warning only */
}
source_channel_oil_detach(source);
/*
notice that listnode_delete() can't be moved
into igmp_source_free() because the later is

View File

@ -163,4 +163,6 @@ void tib_sg_gm_prune(struct pim_instance *pim, pim_sgaddr sg,
per-interface (S,G) state.
*/
pim_ifchannel_local_membership_del(oif, &sg);
pim_channel_oil_del(*oilp, __func__);
}