|
@@ -404,16 +404,17 @@ static int grec_size(struct ip_mc_list *pmc, int type, int gdel, int sdel)
|
|
|
}
|
|
|
|
|
|
static struct sk_buff *add_grhead(struct sk_buff *skb, struct ip_mc_list *pmc,
|
|
|
- int type, struct igmpv3_grec **ppgr)
|
|
|
+ int type, struct igmpv3_grec **ppgr, unsigned int mtu)
|
|
|
{
|
|
|
struct net_device *dev = pmc->interface->dev;
|
|
|
struct igmpv3_report *pih;
|
|
|
struct igmpv3_grec *pgr;
|
|
|
|
|
|
- if (!skb)
|
|
|
- skb = igmpv3_newpack(dev, dev->mtu);
|
|
|
- if (!skb)
|
|
|
- return NULL;
|
|
|
+ if (!skb) {
|
|
|
+ skb = igmpv3_newpack(dev, mtu);
|
|
|
+ if (!skb)
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
pgr = skb_put(skb, sizeof(struct igmpv3_grec));
|
|
|
pgr->grec_type = type;
|
|
|
pgr->grec_auxwords = 0;
|
|
@@ -436,12 +437,17 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,
|
|
|
struct igmpv3_grec *pgr = NULL;
|
|
|
struct ip_sf_list *psf, *psf_next, *psf_prev, **psf_list;
|
|
|
int scount, stotal, first, isquery, truncate;
|
|
|
+ unsigned int mtu;
|
|
|
|
|
|
if (pmc->multiaddr == IGMP_ALL_HOSTS)
|
|
|
return skb;
|
|
|
if (ipv4_is_local_multicast(pmc->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports)
|
|
|
return skb;
|
|
|
|
|
|
+ mtu = READ_ONCE(dev->mtu);
|
|
|
+ if (mtu < IPV4_MIN_MTU)
|
|
|
+ return skb;
|
|
|
+
|
|
|
isquery = type == IGMPV3_MODE_IS_INCLUDE ||
|
|
|
type == IGMPV3_MODE_IS_EXCLUDE;
|
|
|
truncate = type == IGMPV3_MODE_IS_EXCLUDE ||
|
|
@@ -462,7 +468,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,
|
|
|
AVAILABLE(skb) < grec_size(pmc, type, gdeleted, sdeleted)) {
|
|
|
if (skb)
|
|
|
igmpv3_sendpack(skb);
|
|
|
- skb = igmpv3_newpack(dev, dev->mtu);
|
|
|
+ skb = igmpv3_newpack(dev, mtu);
|
|
|
}
|
|
|
}
|
|
|
first = 1;
|
|
@@ -498,12 +504,12 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,
|
|
|
pgr->grec_nsrcs = htons(scount);
|
|
|
if (skb)
|
|
|
igmpv3_sendpack(skb);
|
|
|
- skb = igmpv3_newpack(dev, dev->mtu);
|
|
|
+ skb = igmpv3_newpack(dev, 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)
|
|
@@ -538,7 +544,7 @@ empty_source:
|
|
|
igmpv3_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)
|