br_multicast.c (109865fe12f98509224e29f7c19a11cd9a44110e) br_multicast.c (23550b8313331dca297ffea07c2250e95ccca121)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Bridge multicast support.
4 *
5 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
6 */
7
8#include <linux/err.h>

--- 2180 unchanged lines hidden (view full) ---

2189 max_delay = ih->code * (HZ / IGMP_TIMER_SCALE);
2190
2191 if (!max_delay) {
2192 max_delay = 10 * HZ;
2193 group = 0;
2194 }
2195 } else if (transport_len >= sizeof(*ih3)) {
2196 ih3 = igmpv3_query_hdr(skb);
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Bridge multicast support.
4 *
5 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
6 */
7
8#include <linux/err.h>

--- 2180 unchanged lines hidden (view full) ---

2189 max_delay = ih->code * (HZ / IGMP_TIMER_SCALE);
2190
2191 if (!max_delay) {
2192 max_delay = 10 * HZ;
2193 group = 0;
2194 }
2195 } else if (transport_len >= sizeof(*ih3)) {
2196 ih3 = igmpv3_query_hdr(skb);
2197 if (ih3->nsrcs)
2197 if (ih3->nsrcs ||
2198 (br->multicast_igmp_version == 3 && group && ih3->suppress))
2198 goto out;
2199
2200 max_delay = ih3->code ?
2201 IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE) : 1;
2202 } else {
2203 goto out;
2204 }
2205

--- 18 unchanged lines hidden (view full) ---

2224 try_to_del_timer_sync(&mp->timer) >= 0))
2225 mod_timer(&mp->timer, now + max_delay);
2226
2227 for (pp = &mp->ports;
2228 (p = mlock_dereference(*pp, br)) != NULL;
2229 pp = &p->next) {
2230 if (timer_pending(&p->timer) ?
2231 time_after(p->timer.expires, now + max_delay) :
2199 goto out;
2200
2201 max_delay = ih3->code ?
2202 IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE) : 1;
2203 } else {
2204 goto out;
2205 }
2206

--- 18 unchanged lines hidden (view full) ---

2225 try_to_del_timer_sync(&mp->timer) >= 0))
2226 mod_timer(&mp->timer, now + max_delay);
2227
2228 for (pp = &mp->ports;
2229 (p = mlock_dereference(*pp, br)) != NULL;
2230 pp = &p->next) {
2231 if (timer_pending(&p->timer) ?
2232 time_after(p->timer.expires, now + max_delay) :
2232 try_to_del_timer_sync(&p->timer) >= 0)
2233 try_to_del_timer_sync(&p->timer) >= 0 &&
2234 (br->multicast_igmp_version == 2 ||
2235 p->filter_mode == MCAST_EXCLUDE))
2233 mod_timer(&p->timer, now + max_delay);
2234 }
2235
2236out:
2237 spin_unlock(&br->multicast_lock);
2238}
2239
2240#if IS_ENABLED(CONFIG_IPV6)

--- 33 unchanged lines hidden (view full) ---

2274 } else {
2275 if (!pskb_may_pull(skb, offset + sizeof(*mld2q))) {
2276 err = -EINVAL;
2277 goto out;
2278 }
2279 mld2q = (struct mld2_query *)icmp6_hdr(skb);
2280 if (!mld2q->mld2q_nsrcs)
2281 group = &mld2q->mld2q_mca;
2236 mod_timer(&p->timer, now + max_delay);
2237 }
2238
2239out:
2240 spin_unlock(&br->multicast_lock);
2241}
2242
2243#if IS_ENABLED(CONFIG_IPV6)

--- 33 unchanged lines hidden (view full) ---

2277 } else {
2278 if (!pskb_may_pull(skb, offset + sizeof(*mld2q))) {
2279 err = -EINVAL;
2280 goto out;
2281 }
2282 mld2q = (struct mld2_query *)icmp6_hdr(skb);
2283 if (!mld2q->mld2q_nsrcs)
2284 group = &mld2q->mld2q_mca;
2285 if (br->multicast_mld_version == 2 &&
2286 !ipv6_addr_any(&mld2q->mld2q_mca) &&
2287 mld2q->mld2q_suppress)
2288 goto out;
2282
2283 max_delay = max(msecs_to_jiffies(mldv2_mrc(mld2q)), 1UL);
2284 }
2285
2286 is_general_query = group && ipv6_addr_any(group);
2287
2288 if (is_general_query) {
2289 saddr.proto = htons(ETH_P_IPV6);

--- 17 unchanged lines hidden (view full) ---

2307 try_to_del_timer_sync(&mp->timer) >= 0))
2308 mod_timer(&mp->timer, now + max_delay);
2309
2310 for (pp = &mp->ports;
2311 (p = mlock_dereference(*pp, br)) != NULL;
2312 pp = &p->next) {
2313 if (timer_pending(&p->timer) ?
2314 time_after(p->timer.expires, now + max_delay) :
2289
2290 max_delay = max(msecs_to_jiffies(mldv2_mrc(mld2q)), 1UL);
2291 }
2292
2293 is_general_query = group && ipv6_addr_any(group);
2294
2295 if (is_general_query) {
2296 saddr.proto = htons(ETH_P_IPV6);

--- 17 unchanged lines hidden (view full) ---

2314 try_to_del_timer_sync(&mp->timer) >= 0))
2315 mod_timer(&mp->timer, now + max_delay);
2316
2317 for (pp = &mp->ports;
2318 (p = mlock_dereference(*pp, br)) != NULL;
2319 pp = &p->next) {
2320 if (timer_pending(&p->timer) ?
2321 time_after(p->timer.expires, now + max_delay) :
2315 try_to_del_timer_sync(&p->timer) >= 0)
2322 try_to_del_timer_sync(&p->timer) >= 0 &&
2323 (br->multicast_mld_version == 1 ||
2324 p->filter_mode == MCAST_EXCLUDE))
2316 mod_timer(&p->timer, now + max_delay);
2317 }
2318
2319out:
2320 spin_unlock(&br->multicast_lock);
2321 return err;
2322}
2323#endif

--- 1129 unchanged lines hidden ---
2325 mod_timer(&p->timer, now + max_delay);
2326 }
2327
2328out:
2329 spin_unlock(&br->multicast_lock);
2330 return err;
2331}
2332#endif

--- 1129 unchanged lines hidden ---