summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pimd/pim_oil.c8
-rw-r--r--pimd/pim_zebra.c8
2 files changed, 10 insertions, 6 deletions
diff --git a/pimd/pim_oil.c b/pimd/pim_oil.c
index 22045c2d3..1f8c2379a 100644
--- a/pimd/pim_oil.c
+++ b/pimd/pim_oil.c
@@ -344,10 +344,12 @@ int pim_channel_add_oif(struct channel_oil *channel_oil, struct interface *oif,
IGMP must be protected against adding looped MFC entries created
by both source and receiver attached to the same interface. See
TODO T22.
+ We shall allow igmp to create upstream when it is DR for the intf.
+ Assume RP reachable via non DR.
*/
- if (channel_oil->up &&
- PIM_UPSTREAM_FLAG_TEST_ALLOW_IIF_IN_OIL(
- channel_oil->up->flags)) {
+ if ((channel_oil->up &&
+ PIM_UPSTREAM_FLAG_TEST_ALLOW_IIF_IN_OIL(channel_oil->up->flags)) ||
+ ((proto_mask == PIM_OIF_FLAG_PROTO_IGMP) && PIM_I_am_DR(pim_ifp))) {
allow_iif_in_oil = true;
}
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index 25ac307ac..653916dea 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -1043,10 +1043,12 @@ void igmp_source_forward_start(struct pim_instance *pim,
* Protect IGMP against adding looped MFC
* entries created by both source and receiver
* attached to the same interface. See TODO
- * T22.
+ * T22. Block only when the intf is non DR
+ * DR must create upstream.
*/
- if (input_iface_vif_index ==
- pim_oif->mroute_vif_index) {
+ if ((input_iface_vif_index ==
+ pim_oif->mroute_vif_index) &&
+ !(PIM_I_am_DR(pim_oif))) {
/* ignore request for looped MFC entry
*/
if (PIM_DEBUG_IGMP_TRACE) {