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