}
        } else if (transport_len >= sizeof(*ih3)) {
                ih3 = igmpv3_query_hdr(skb);
-               if (ih3->nsrcs)
+               if (ih3->nsrcs ||
+                   (br->multicast_igmp_version == 3 && group && ih3->suppress))
                        goto out;
 
                max_delay = ih3->code ?
             pp = &p->next) {
                if (timer_pending(&p->timer) ?
                    time_after(p->timer.expires, now + max_delay) :
-                   try_to_del_timer_sync(&p->timer) >= 0)
+                   try_to_del_timer_sync(&p->timer) >= 0 &&
+                   (br->multicast_igmp_version == 2 ||
+                    p->filter_mode == MCAST_EXCLUDE))
                        mod_timer(&p->timer, now + max_delay);
        }
 
                mld2q = (struct mld2_query *)icmp6_hdr(skb);
                if (!mld2q->mld2q_nsrcs)
                        group = &mld2q->mld2q_mca;
+               if (br->multicast_mld_version == 2 &&
+                   !ipv6_addr_any(&mld2q->mld2q_mca) &&
+                   mld2q->mld2q_suppress)
+                       goto out;
 
                max_delay = max(msecs_to_jiffies(mldv2_mrc(mld2q)), 1UL);
        }
             pp = &p->next) {
                if (timer_pending(&p->timer) ?
                    time_after(p->timer.expires, now + max_delay) :
-                   try_to_del_timer_sync(&p->timer) >= 0)
+                   try_to_del_timer_sync(&p->timer) >= 0 &&
+                   (br->multicast_mld_version == 1 ||
+                    p->filter_mode == MCAST_EXCLUDE))
                        mod_timer(&p->timer, now + max_delay);
        }