diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index cf5ea2fa53..8d462b1698 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -414,7 +414,8 @@ void pim_upstream_join_suppress(struct pim_upstream *up, struct in_addr rpf_addr, int holdtime) { long t_joinsuppress_msec; - long join_timer_remain_msec; + long join_timer_remain_msec = 0; + struct pim_neighbor *nbr = NULL; if (!up->rpf.source_nexthop.interface) { if (PIM_DEBUG_PIM_TRACE) @@ -427,7 +428,18 @@ void pim_upstream_join_suppress(struct pim_upstream *up, MIN(pim_if_t_suppressed_msec(up->rpf.source_nexthop.interface), 1000 * holdtime); - join_timer_remain_msec = pim_time_timer_remain_msec(up->t_join_timer); + if (up->t_join_timer) + join_timer_remain_msec = + pim_time_timer_remain_msec(up->t_join_timer); + else { + /* Remove it from jp agg from the nbr for suppression */ + nbr = pim_neighbor_find(up->rpf.source_nexthop.interface, + up->rpf.rpf_addr.u.prefix4); + if (nbr) { + join_timer_remain_msec = + pim_time_timer_remain_msec(nbr->jp_timer); + } + } if (PIM_DEBUG_PIM_TRACE) { char rpf_str[INET_ADDRSTRLEN]; @@ -446,6 +458,9 @@ void pim_upstream_join_suppress(struct pim_upstream *up, t_joinsuppress_msec); } + if (nbr) + pim_jp_agg_remove_group(nbr->upstream_jp_agg, up, nbr); + pim_upstream_join_timer_restart_msec(up, t_joinsuppress_msec); } }