@@ -1682,16 +1682,16 @@ static int grec_size(struct ifmcaddr6 *pmc, int type, int gdel, int sdel)
16821682}
16831683
16841684static struct sk_buff * add_grhead (struct sk_buff * skb , struct ifmcaddr6 * pmc ,
1685- int type , struct mld2_grec * * ppgr )
1685+ int type , struct mld2_grec * * ppgr , unsigned int mtu )
16861686{
1687- struct net_device * dev = pmc -> idev -> dev ;
16881687 struct mld2_report * pmr ;
16891688 struct mld2_grec * pgr ;
16901689
1691- if (!skb )
1692- skb = mld_newpack (pmc -> idev , dev -> mtu );
1693- if (!skb )
1694- return NULL ;
1690+ if (!skb ) {
1691+ skb = mld_newpack (pmc -> idev , mtu );
1692+ if (!skb )
1693+ return NULL ;
1694+ }
16951695 pgr = skb_put (skb , sizeof (struct mld2_grec ));
16961696 pgr -> grec_type = type ;
16971697 pgr -> grec_auxwords = 0 ;
@@ -1714,10 +1714,15 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
17141714 struct mld2_grec * pgr = NULL ;
17151715 struct ip6_sf_list * psf , * psf_next , * psf_prev , * * psf_list ;
17161716 int scount , stotal , first , isquery , truncate ;
1717+ unsigned int mtu ;
17171718
17181719 if (pmc -> mca_flags & MAF_NOREPORT )
17191720 return skb ;
17201721
1722+ mtu = READ_ONCE (dev -> mtu );
1723+ if (mtu < IPV6_MIN_MTU )
1724+ return skb ;
1725+
17211726 isquery = type == MLD2_MODE_IS_INCLUDE ||
17221727 type == MLD2_MODE_IS_EXCLUDE ;
17231728 truncate = type == MLD2_MODE_IS_EXCLUDE ||
@@ -1738,7 +1743,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
17381743 AVAILABLE (skb ) < grec_size (pmc , type , gdeleted , sdeleted )) {
17391744 if (skb )
17401745 mld_sendpack (skb );
1741- skb = mld_newpack (idev , dev -> mtu );
1746+ skb = mld_newpack (idev , mtu );
17421747 }
17431748 }
17441749 first = 1 ;
@@ -1774,12 +1779,12 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
17741779 pgr -> grec_nsrcs = htons (scount );
17751780 if (skb )
17761781 mld_sendpack (skb );
1777- skb = mld_newpack (idev , dev -> mtu );
1782+ skb = mld_newpack (idev , mtu );
17781783 first = 1 ;
17791784 scount = 0 ;
17801785 }
17811786 if (first ) {
1782- skb = add_grhead (skb , pmc , type , & pgr );
1787+ skb = add_grhead (skb , pmc , type , & pgr , mtu );
17831788 first = 0 ;
17841789 }
17851790 if (!skb )
@@ -1814,7 +1819,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
18141819 mld_sendpack (skb );
18151820 skb = NULL ; /* add_grhead will get a new one */
18161821 }
1817- skb = add_grhead (skb , pmc , type , & pgr );
1822+ skb = add_grhead (skb , pmc , type , & pgr , mtu );
18181823 }
18191824 }
18201825 if (pgr )
0 commit comments