--- zzzz-none-000/linux-4.1.52/net/ipv6/mcast.c 2018-05-28 02:26:45.000000000 +0000 +++ bcm63-7530ax-731/linux-4.1.52/net/ipv6/mcast.c 2022-03-02 11:37:13.000000000 +0000 @@ -888,6 +888,9 @@ return -ENOMEM; } +#if defined(CONFIG_BCM_KF_MCAST_GR_SUPPRESSION) + mc->mca_osfmode = MCAST_INCLUDE; +#endif mc->next = idev->mc_list; idev->mc_list = mc; @@ -1905,6 +1908,9 @@ /* change recs */ for (pmc = idev->mc_list; pmc; pmc = pmc->next) { spin_lock_bh(&pmc->mca_lock); +#if defined(CONFIG_BCM_KF_MCAST_GR_SUPPRESSION) + if ( pmc->mca_osfmode == pmc->mca_sfmode ) { +#endif if (pmc->mca_sfcount[MCAST_EXCLUDE]) { type = MLD2_BLOCK_OLD_SOURCES; dtype = MLD2_ALLOW_NEW_SOURCES; @@ -1914,15 +1920,29 @@ } skb = add_grec(skb, pmc, type, 0, 0, 0); skb = add_grec(skb, pmc, dtype, 0, 1, 0); /* deleted sources */ +#if defined(CONFIG_BCM_KF_MCAST_GR_SUPPRESSION) + } +#endif /* filter mode changes */ if (pmc->mca_crcount) { +#if defined(CONFIG_BCM_KF_MCAST_GR_SUPPRESSION) + if ( pmc->mca_osfmode != pmc->mca_sfmode ) { +#endif if (pmc->mca_sfmode == MCAST_EXCLUDE) type = MLD2_CHANGE_TO_EXCLUDE; else type = MLD2_CHANGE_TO_INCLUDE; skb = add_grec(skb, pmc, type, 0, 0, 0); +#if defined(CONFIG_BCM_KF_MCAST_GR_SUPPRESSION) + } +#endif pmc->mca_crcount--; +#if defined(CONFIG_BCM_KF_MCAST_GR_SUPPRESSION) + if ( pmc->mca_crcount == 0 ) { + pmc->mca_osfmode = pmc->mca_sfmode; + } +#endif } spin_unlock_bh(&pmc->mca_lock); }