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 <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2017-07-10 09:45:04 -04:00
parent 5c3aac90d9
commit aabb9a2f07
4 changed files with 10 additions and 6 deletions

View File

@ -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);

View File

@ -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 */
}

View File

@ -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)

View File

@ -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);