diff options
Diffstat (limited to 'pimd/pim_zebra.c')
| -rw-r--r-- | pimd/pim_zebra.c | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index a58dfcdd5f..b947ca0625 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -561,7 +561,7 @@ void pim_scan_individual_oil(struct channel_oil *c_oil, int in_vif_index) __PRETTY_FUNCTION__, source_str, group_str); } input_iface_vif_index = pim_ecmp_fib_lookup_if_vif_index( - c_oil->pim, vif_source, &src, &grp); + c_oil->pim, &src, &grp); } if (input_iface_vif_index < 1) { @@ -868,6 +868,7 @@ void igmp_source_forward_reevaluate_all(struct pim_instance *pim) void igmp_source_forward_start(struct pim_instance *pim, struct igmp_source *source) { + struct pim_interface *pim_oif; struct igmp_group *group; struct prefix_sg sg; int result; @@ -893,10 +894,20 @@ void igmp_source_forward_start(struct pim_instance *pim, } group = source->source_group; + pim_oif = group->group_igmp_sock->interface->info; + if (!pim_oif) { + if (PIM_DEBUG_IGMP_TRACE) { + zlog_debug( + "%s: multicast not enabled on oif=%s ?", + __PRETTY_FUNCTION__, + source->source_group->group_igmp_sock + ->interface->name); + } + return; + } if (!source->source_channel_oil) { struct in_addr vif_source; - struct pim_interface *pim_oif; struct prefix nht_p, src, grp; struct pim_nexthop_cache out_pnc; struct pim_nexthop nexthop; @@ -953,8 +964,8 @@ void igmp_source_forward_start(struct pim_instance *pim, } } else input_iface_vif_index = - pim_ecmp_fib_lookup_if_vif_index( - pim, vif_source, &src, &grp); + pim_ecmp_fib_lookup_if_vif_index(pim, &src, + &grp); if (PIM_DEBUG_ZEBRA) { char buf2[INET_ADDRSTRLEN]; @@ -983,19 +994,6 @@ void igmp_source_forward_start(struct pim_instance *pim, source and receiver attached to the same interface. See TODO T22. */ - pim_oif = - source->source_group->group_igmp_sock->interface->info; - if (!pim_oif) { - if (PIM_DEBUG_IGMP_TRACE) { - zlog_debug( - "%s: multicast not enabled on oif=%s ?", - __PRETTY_FUNCTION__, - source->source_group->group_igmp_sock - ->interface->name); - } - return; - } - if (input_iface_vif_index == pim_oif->mroute_vif_index) { /* ignore request for looped MFC entry */ if (PIM_DEBUG_IGMP_TRACE) { @@ -1036,12 +1034,15 @@ void igmp_source_forward_start(struct pim_instance *pim, return; } + if (!(PIM_I_am_DR(pim_oif))) + return; + /* Feed IGMPv3-gathered local membership information into PIM per-interface (S,G) state. */ if (!pim_ifchannel_local_membership_add( - group->group_igmp_sock->interface, &sg)) { + group->group_igmp_sock->interface, &sg)) { if (PIM_DEBUG_MROUTE) zlog_warn("%s: Failure to add local membership for %s", __PRETTY_FUNCTION__, pim_str_sg_dump(&sg)); @@ -1153,7 +1154,7 @@ void pim_forward_start(struct pim_ifchannel *ch) /* Register addr with Zebra NHT */ nht_p.family = AF_INET; nht_p.prefixlen = IPV4_MAX_BITLEN; - nht_p.u.prefix4.s_addr = up->upstream_addr.s_addr; + nht_p.u.prefix4 = up->upstream_addr; grp.family = AF_INET; grp.prefixlen = IPV4_MAX_BITLEN; grp.u.prefix4 = up->sg.grp; @@ -1204,8 +1205,8 @@ void pim_forward_start(struct pim_ifchannel *ch) } } else input_iface_vif_index = - pim_ecmp_fib_lookup_if_vif_index( - pim, up->upstream_addr, &src, &grp); + pim_ecmp_fib_lookup_if_vif_index(pim, &src, + &grp); if (input_iface_vif_index < 1) { if (PIM_DEBUG_PIM_TRACE) { |
