Merge tag 'for-linus-20161008' of git://git.infradead.org/linux-mtd
[cascardo/linux.git] / net / ipv6 / mcast.c
index d64ee7e..75c1fc5 100644 (file)
@@ -1739,6 +1739,15 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
                        continue;
                }
 
+               /* Based on RFC3810 6.1. Should not send source-list change
+                * records when there is a filter mode change.
+                */
+               if (((gdeleted && pmc->mca_sfmode == MCAST_EXCLUDE) ||
+                    (!gdeleted && pmc->mca_crcount)) &&
+                   (type == MLD2_ALLOW_NEW_SOURCES ||
+                    type == MLD2_BLOCK_OLD_SOURCES) && psf->sf_crcount)
+                       goto decrease_sf_crcount;
+
                /* clear marks on query responses */
                if (isquery)
                        psf->sf_gsresp = 0;
@@ -1766,6 +1775,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
                scount++; stotal++;
                if ((type == MLD2_ALLOW_NEW_SOURCES ||
                     type == MLD2_BLOCK_OLD_SOURCES) && psf->sf_crcount) {
+decrease_sf_crcount:
                        psf->sf_crcount--;
                        if ((sdeleted || gdeleted) && psf->sf_crcount == 0) {
                                if (psf_prev)