From 50d06d9e561affb999a1a7c893e260f50d4fe1c6 Mon Sep 17 00:00:00 2001 From: saravanank Date: Mon, 20 May 2019 10:01:34 -0700 Subject: [PATCH] pimd: fix DR at LHR scenario where non DR is connected to RP In Scenario where receiver is present in a subnet where 2 or more pim mrouters. When IGMP query received on a DR interface and RP is reachable through non DR. Currently we are blocking to create upstream where iif == oif. So pim join not generated towards RP. We have to allow the DR router in the network to create an upstream. Signed-off-by: Saravanan K --- pimd/pim_oil.c | 8 +++++--- pimd/pim_zebra.c | 8 +++++--- 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) { -- 2.39.5