From: Donald Sharp Date: Mon, 10 Jul 2017 13:45:04 +0000 (-0400) Subject: pimd: Allow installation of NULL mroute in some situations X-Git-Tag: frr-4.0-dev~468^2~21 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=aabb9a2f07bbcd1b3325e892ac6d204d123c654a;p=mirror%2Ffrr.git pimd: Allow installation of NULL mroute in some situations When we receive a S,G,RPT prune as part of a *,G tree, install the NULL oil S,G mroute. This will cause the traffic to stop flowing for this particular S,G as we expect. Ticket: CM-16978 Signed-off-by: Donald Sharp --- diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c index afd9aa4779..0ee887f840 100644 --- a/pimd/pim_ifchannel.c +++ b/pimd/pim_ifchannel.c @@ -613,7 +613,7 @@ struct pim_ifchannel *pim_ifchannel_add(struct interface *ifp, static void ifjoin_to_noinfo(struct pim_ifchannel *ch, bool ch_del) { - pim_forward_stop(ch); + pim_forward_stop(ch, !ch_del); pim_ifchannel_ifjoin_switch(__PRETTY_FUNCTION__, ch, PIM_IFJOIN_NOINFO); if (ch_del) delete_on_noinfo(ch); diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 9151d9ecf3..433ba5ee95 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -443,7 +443,7 @@ static void forward_off(struct pim_upstream *up) /* scan per-interface (S,G) state */ for (ALL_LIST_ELEMENTS(up->ifchannels, chnode, chnextnode, ch)) { - pim_forward_stop(ch); + pim_forward_stop(ch, false); } /* scan iface channel list */ } diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index 9fbca9cb21..7b060aef4b 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -1284,17 +1284,21 @@ void pim_forward_start(struct pim_ifchannel *ch) pim_channel_add_oif(up->channel_oil, ch->interface, mask); } -void pim_forward_stop(struct pim_ifchannel *ch) +void pim_forward_stop(struct pim_ifchannel *ch, bool install_it) { struct pim_upstream *up = ch->upstream; if (PIM_DEBUG_PIM_TRACE) { - zlog_debug("%s: (S,G)=%s oif=%s", __PRETTY_FUNCTION__, - ch->sg_str, ch->interface->name); + zlog_debug("%s: (S,G)=%s oif=%s install_it: %d installed: %d", + __PRETTY_FUNCTION__, ch->sg_str, ch->interface->name, + install_it, up->channel_oil->installed); } pim_channel_del_oif(up->channel_oil, ch->interface, PIM_OIF_FLAG_PROTO_PIM); + + if (install_it && !up->channel_oil->installed) + pim_mroute_add(up->channel_oil, __PRETTY_FUNCTION__); } void pim_zebra_zclient_update(struct vty *vty) diff --git a/pimd/pim_zebra.h b/pimd/pim_zebra.h index e8b6e1000e..d9b17cb82d 100644 --- a/pimd/pim_zebra.h +++ b/pimd/pim_zebra.h @@ -42,7 +42,7 @@ void igmp_source_forward_stop(struct igmp_source *source); void igmp_source_forward_reevaluate_all(void); void pim_forward_start(struct pim_ifchannel *ch); -void pim_forward_stop(struct pim_ifchannel *ch); +void pim_forward_stop(struct pim_ifchannel *ch, bool install_it); void sched_rpf_cache_refresh(void); struct zclient *pim_zebra_zclient_get(void);