diff options
Diffstat (limited to 'net/ipv6/mcast.c')
| -rw-r--r-- | net/ipv6/mcast.c | 25 | 
1 files changed, 15 insertions, 10 deletions
| diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index fc6d7d143f2c..844642682b83 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c @@ -1682,16 +1682,16 @@ static int grec_size(struct ifmcaddr6 *pmc, int type, int gdel, int sdel)  }  static struct sk_buff *add_grhead(struct sk_buff *skb, struct ifmcaddr6 *pmc, -	int type, struct mld2_grec **ppgr) +	int type, struct mld2_grec **ppgr, unsigned int mtu)  { -	struct net_device *dev = pmc->idev->dev;  	struct mld2_report *pmr;  	struct mld2_grec *pgr; -	if (!skb) -		skb = mld_newpack(pmc->idev, dev->mtu); -	if (!skb) -		return NULL; +	if (!skb) { +		skb = mld_newpack(pmc->idev, mtu); +		if (!skb) +			return NULL; +	}  	pgr = skb_put(skb, sizeof(struct mld2_grec));  	pgr->grec_type = type;  	pgr->grec_auxwords = 0; @@ -1714,10 +1714,15 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,  	struct mld2_grec *pgr = NULL;  	struct ip6_sf_list *psf, *psf_next, *psf_prev, **psf_list;  	int scount, stotal, first, isquery, truncate; +	unsigned int mtu;  	if (pmc->mca_flags & MAF_NOREPORT)  		return skb; +	mtu = READ_ONCE(dev->mtu); +	if (mtu < IPV6_MIN_MTU) +		return skb; +  	isquery = type == MLD2_MODE_IS_INCLUDE ||  		  type == MLD2_MODE_IS_EXCLUDE;  	truncate = type == MLD2_MODE_IS_EXCLUDE || @@ -1738,7 +1743,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,  		    AVAILABLE(skb) < grec_size(pmc, type, gdeleted, sdeleted)) {  			if (skb)  				mld_sendpack(skb); -			skb = mld_newpack(idev, dev->mtu); +			skb = mld_newpack(idev, mtu);  		}  	}  	first = 1; @@ -1774,12 +1779,12 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,  				pgr->grec_nsrcs = htons(scount);  			if (skb)  				mld_sendpack(skb); -			skb = mld_newpack(idev, dev->mtu); +			skb = mld_newpack(idev, mtu);  			first = 1;  			scount = 0;  		}  		if (first) { -			skb = add_grhead(skb, pmc, type, &pgr); +			skb = add_grhead(skb, pmc, type, &pgr, mtu);  			first = 0;  		}  		if (!skb) @@ -1814,7 +1819,7 @@ empty_source:  				mld_sendpack(skb);  				skb = NULL; /* add_grhead will get a new one */  			} -			skb = add_grhead(skb, pmc, type, &pgr); +			skb = add_grhead(skb, pmc, type, &pgr, mtu);  		}  	}  	if (pgr) |