summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvdhingra <vdhingra@vmware.com>2020-10-28 07:32:00 -0700
committervdhingra <vdhingra@vmware.com>2020-11-02 01:06:59 -0800
commit99f9518b4a82b710902900c52dc1363cf9ef7da2 (patch)
treee430ff4f327683bd76b46929822d2024816339eb
parent1af7c1af0621b770218c8ec84fb36d8c480a1091 (diff)
pimd: (*,G) Prune processing doesn't remove SGRpt ifchannel
problem : ========= When (*,G) prune received where we have SGRpt state, ifchannel goes to NO_INFO state and doesn't get removed. Root cause : ============ During the processing of (*,G) prune, we are not removing the ifchannel on PruneTmp or PrunePendingTmp state. Fix : ===== In that scenario, stop joinExpiry timer and delete the ifchannel. issue #7347 Co-authored-by: Saravanan K <saravanank@vmware.com> Signed-off-by: vishaldhingra <vdhingra@vmware.com>
-rw-r--r--pimd/pim_ifchannel.c2
-rw-r--r--pimd/pim_ifchannel.h1
-rw-r--r--pimd/pim_join.c3
3 files changed, 5 insertions, 1 deletions
diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c
index b2971e5f1f..e7ff434f4b 100644
--- a/pimd/pim_ifchannel.c
+++ b/pimd/pim_ifchannel.c
@@ -258,7 +258,7 @@ void pim_ifchannel_delete_all(struct interface *ifp)
}
}
-static void delete_on_noinfo(struct pim_ifchannel *ch)
+void delete_on_noinfo(struct pim_ifchannel *ch)
{
if (ch->local_ifmembership == PIM_IFMEMBERSHIP_NOINFO
&& ch->ifjoin_state == PIM_IFJOIN_NOINFO
diff --git a/pimd/pim_ifchannel.h b/pimd/pim_ifchannel.h
index 425622b79e..7ec8191e56 100644
--- a/pimd/pim_ifchannel.h
+++ b/pimd/pim_ifchannel.h
@@ -173,4 +173,5 @@ int pim_ifchannel_compare(const struct pim_ifchannel *ch1,
const struct pim_ifchannel *ch2);
unsigned int pim_ifchannel_hash_key(const void *arg);
+void delete_on_noinfo(struct pim_ifchannel *ch);
#endif /* PIM_IFCHANNEL_H */
diff --git a/pimd/pim_join.c b/pimd/pim_join.c
index f54d5bf9bf..2766a6d2b5 100644
--- a/pimd/pim_join.c
+++ b/pimd/pim_join.c
@@ -350,8 +350,11 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
== PIM_IFJOIN_PRUNE_PENDING_TMP)
THREAD_OFF(
child->t_ifjoin_prune_pending_timer);
+ THREAD_OFF(
+ child->t_ifjoin_expiry_timer);
PIM_IF_FLAG_UNSET_S_G_RPT(child->flags);
child->ifjoin_state = PIM_IFJOIN_NOINFO;
+ delete_on_noinfo(child);
}
}