summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pimd/pim_upstream.c19
1 files changed, 17 insertions, 2 deletions
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);
}
}