summaryrefslogtreecommitdiff
path: root/pimd/pim_zebra.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_zebra.c')
-rw-r--r--pimd/pim_zebra.c43
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) {