]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: fix DR at LHR scenario where non DR is connected to RP
authorsaravanank <saravanank@vmware.com>
Mon, 20 May 2019 17:01:34 +0000 (10:01 -0700)
committersaravanank <saravanank@vmware.com>
Thu, 13 Jun 2019 02:07:13 +0000 (19:07 -0700)
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 <saravanank@vmware.com>
pimd/pim_oil.c
pimd/pim_zebra.c

index 22045c2d337c99ac27aa2b60fa2a768e43959018..1f8c2379ae56da150d4d1512a8d5a30f8ab320a9 100644 (file)
@@ -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;
        }
 
index 25ac307ac43defc1b51e27ba89d169df7da729db..653916dead51d4dd230b9d99f9efbfd6de51a9a7 100644 (file)
@@ -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) {