summaryrefslogtreecommitdiffstats
path: root/pimd
diff options
context:
space:
mode:
Diffstat (limited to 'pimd')
-rw-r--r--pimd/pim_ifchannel.c2
-rw-r--r--pimd/pim_upstream.c2
-rw-r--r--pimd/pim_zebra.c10
-rw-r--r--pimd/pim_zebra.h2
4 files changed, 10 insertions, 6 deletions
diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c
index afd9aa477..0ee887f84 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 9151d9ecf..433ba5ee9 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 9fbca9cb2..7b060aef4 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 e8b6e1000..d9b17cb82 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);