From cb809c0d6c006e570cd9052f4be7dbdce7337661 Mon Sep 17 00:00:00 2001 From: Sarita Patra Date: Thu, 7 Jul 2022 08:12:10 -0700 Subject: [PATCH] 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 --- pimd/pim_igmpv3.c | 3 +-- pimd/pim_tib.c | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pimd/pim_igmpv3.c b/pimd/pim_igmpv3.c index 15078dd1ec..96f97f1d12 100644 --- a/pimd/pim_igmpv3.c +++ b/pimd/pim_igmpv3.c @@ -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 diff --git a/pimd/pim_tib.c b/pimd/pim_tib.c index 6ffea868d8..4081786c1e 100644 --- a/pimd/pim_tib.c +++ b/pimd/pim_tib.c @@ -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__); }