|
@@ -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)
|