From 810cbaf7c1240f32331781a69c3137a9b4cb86e9 Mon Sep 17 00:00:00 2001 From: saravanank Date: Thu, 19 Mar 2020 03:13:19 -0700 Subject: [PATCH] pimd: In join suppression period, join is being sent RCA: Either JP timer is used to send join or join timer. We are not removing the group from jp aggregate during suppression. So even if join timer is restarted, jp aggregate expiry during suppression is sending join for the group. Fix: Remove the group from jp aggregate on the neighbor during jp suppression. Signed-off-by: Saravanan K --- pimd/pim_upstream.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index efa58c1b1f..b0563634ac 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -413,7 +413,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) @@ -426,7 +427,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]; @@ -445,6 +457,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); } }