From: vdhingra Date: Wed, 28 Oct 2020 14:32:00 +0000 (-0700) Subject: pimd: (*,G) Prune processing doesn't remove SGRpt ifchannel X-Git-Tag: base_7.6~191^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=99f9518b4a82b710902900c52dc1363cf9ef7da2;p=mirror%2Ffrr.git 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 Signed-off-by: vishaldhingra --- 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); } }