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