diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c index d267ee9fb2..f3c3e282c6 100644 --- a/pimd/pim_ifchannel.c +++ b/pimd/pim_ifchannel.c @@ -790,6 +790,16 @@ void pim_ifchannel_join_add(struct interface *ifp, pim_upstream_inherited_olist (ch->upstream); pim_forward_start(ch); } + /* + * If we are going to be a LHR, we need to note it + */ + if (ch->upstream->parent && + (ch->upstream->parent->flags & PIM_UPSTREAM_FLAG_MASK_SRC_IGMP) && + !(ch->upstream->flags & PIM_UPSTREAM_FLAG_MASK_SRC_LHR)) + { + pim_upstream_ref (ch->upstream, PIM_UPSTREAM_FLAG_MASK_SRC_LHR); + pim_upstream_keep_alive_timer_start (ch->upstream, qpim_keep_alive_time); + } break; case PIM_IFJOIN_JOIN: zassert(!ch->t_ifjoin_prune_pending_timer); diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 1e31a3aba1..5a407f9f9e 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -1217,7 +1217,7 @@ pim_upstream_is_sg_rpt (struct pim_upstream *up) void pim_upstream_set_sptbit (struct pim_upstream *up, struct interface *incoming) { - struct pim_rpf *grpf = NULL; + struct pim_upstream *starup = up->parent; // iif == RPF_interfvace(S) if (up->rpf.source_nexthop.interface != incoming) @@ -1242,8 +1242,7 @@ pim_upstream_set_sptbit (struct pim_upstream *up, struct interface *incoming) } // OR RPF_interface(S) != RPF_interface(RP(G)) - grpf = RP(up->sg.grp); - if (!grpf || up->rpf.source_nexthop.interface != grpf->source_nexthop.interface) + if (!starup || up->rpf.source_nexthop.interface != starup->rpf.source_nexthop.interface) { if (PIM_DEBUG_TRACE) zlog_debug ("%s: %s RPF_interface(S) != RPF_interface(RP(G))",