diff options
Diffstat (limited to 'net/ipv4/igmp.c')
| -rw-r--r-- | net/ipv4/igmp.c | 10 | 
1 files changed, 10 insertions, 0 deletions
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index 9b4ca87f70ba..606cc3e85d2b 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c @@ -472,6 +472,15 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,  			continue;  		} +		/* Based on RFC3376 5.1. Should not send source-list change +		 * records when there is a filter mode change. +		 */ +		if (((gdeleted && pmc->sfmode == MCAST_EXCLUDE) || +		     (!gdeleted && pmc->crcount)) && +		    (type == IGMPV3_ALLOW_NEW_SOURCES || +		     type == IGMPV3_BLOCK_OLD_SOURCES) && psf->sf_crcount) +			goto decrease_sf_crcount; +  		/* clear marks on query responses */  		if (isquery)  			psf->sf_gsresp = 0; @@ -499,6 +508,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,  		scount++; stotal++;  		if ((type == IGMPV3_ALLOW_NEW_SOURCES ||  		     type == IGMPV3_BLOCK_OLD_SOURCES) && psf->sf_crcount) { +decrease_sf_crcount:  			psf->sf_crcount--;  			if ((sdeleted || gdeleted) && psf->sf_crcount == 0) {  				if (psf_prev)  |