]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: modification in mroute 9900/head
authorSai Gomathi <nsaigomathi@vmware.com>
Tue, 26 Oct 2021 14:03:58 +0000 (07:03 -0700)
committerSai Gomathi <nsaigomathi@vmware.com>
Tue, 26 Oct 2021 14:36:24 +0000 (07:36 -0700)
Problem:
-------
(*,G) created on transit node where same groups are defined as SSM
At present FRR has SSM checks for IGMP report, but SSM check is missing for PIM join.

Fix:
----
Whenever there is a modification in prefix list for SSM range, then we need to browse the ifchannels (PIM joins)
and groups coming in SSM range with (and *,G) should be removed from ifchannel database and also withdraw those routes
from upstream routers.

Signed-off-by: Sai Gomathi <nsaigomathi@vmware.com>
pimd/pim_zebra.c

index aa041df85736ed99e19561837e7ac2f67e103876..219f41015d55603fe615bfec7d2c1641f6fbcc0c 100644 (file)
@@ -542,6 +542,7 @@ void igmp_source_forward_reevaluate_all(struct pim_instance *pim)
                struct pim_interface *pim_ifp = ifp->info;
                struct listnode *grpnode;
                struct igmp_group *grp;
+               struct pim_ifchannel *ch, *ch_temp;
 
                if (!pim_ifp)
                        continue;
@@ -556,9 +557,17 @@ void igmp_source_forward_reevaluate_all(struct pim_instance *pim)
                        for (ALL_LIST_ELEMENTS_RO(grp->group_source_list,
                                                  srcnode, src)) {
                                igmp_source_forward_reevaluate_one(pim, src);
-                       }         /* scan group sources */
-               }                 /* scan igmp groups */
-       }                         /* scan interfaces */
+                       } /* scan group sources */
+               }        /* scan igmp groups */
+
+               RB_FOREACH_SAFE (ch, pim_ifchannel_rb, &pim_ifp->ifchannel_rb,
+                                ch_temp) {
+                       if (pim_is_grp_ssm(pim, ch->sg.grp)) {
+                               if (ch->sg.src.s_addr == INADDR_ANY)
+                                       pim_ifchannel_delete(ch);
+                       }
+               }
+       } /* scan interfaces */
 }
 
 void igmp_source_forward_start(struct pim_instance *pim,