br_multicast.c (54cb43199e14c1181ddcd4a3782f1f7eb56bdab8) br_multicast.c (58d913a32664fae5ac2ccd9a9c23b8e7037df740)
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>

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

1307 if (src)
1308 memcpy(p->eth_addr, src, ETH_ALEN);
1309 else
1310 eth_broadcast_addr(p->eth_addr);
1311
1312 return p;
1313}
1314
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>

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

1307 if (src)
1308 memcpy(p->eth_addr, src, ETH_ALEN);
1309 else
1310 eth_broadcast_addr(p->eth_addr);
1311
1312 return p;
1313}
1314
1315void br_multicast_host_join(struct net_bridge_mdb_entry *mp, bool notify)
1315void br_multicast_host_join(const struct net_bridge_mcast *brmctx,
1316 struct net_bridge_mdb_entry *mp, bool notify)
1316{
1317 if (!mp->host_joined) {
1318 mp->host_joined = true;
1319 if (br_multicast_is_star_g(&mp->addr))
1320 br_multicast_star_g_host_state(mp);
1321 if (notify)
1322 br_mdb_notify(mp->br->dev, mp, NULL, RTM_NEWMDB);
1323 }
1324
1325 if (br_group_is_l2(&mp->addr))
1326 return;
1327
1317{
1318 if (!mp->host_joined) {
1319 mp->host_joined = true;
1320 if (br_multicast_is_star_g(&mp->addr))
1321 br_multicast_star_g_host_state(mp);
1322 if (notify)
1323 br_mdb_notify(mp->br->dev, mp, NULL, RTM_NEWMDB);
1324 }
1325
1326 if (br_group_is_l2(&mp->addr))
1327 return;
1328
1328 mod_timer(&mp->timer,
1329 jiffies + mp->br->multicast_ctx.multicast_membership_interval);
1329 mod_timer(&mp->timer, jiffies + brmctx->multicast_membership_interval);
1330}
1331
1332void br_multicast_host_leave(struct net_bridge_mdb_entry *mp, bool notify)
1333{
1334 if (!mp->host_joined)
1335 return;
1336
1337 mp->host_joined = false;

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

1358 if (!br_multicast_ctx_should_use(brmctx, pmctx))
1359 goto out;
1360
1361 mp = br_multicast_new_group(brmctx->br, group);
1362 if (IS_ERR(mp))
1363 return ERR_CAST(mp);
1364
1365 if (!pmctx) {
1330}
1331
1332void br_multicast_host_leave(struct net_bridge_mdb_entry *mp, bool notify)
1333{
1334 if (!mp->host_joined)
1335 return;
1336
1337 mp->host_joined = false;

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

1358 if (!br_multicast_ctx_should_use(brmctx, pmctx))
1359 goto out;
1360
1361 mp = br_multicast_new_group(brmctx->br, group);
1362 if (IS_ERR(mp))
1363 return ERR_CAST(mp);
1364
1365 if (!pmctx) {
1366 br_multicast_host_join(mp, true);
1366 br_multicast_host_join(brmctx, mp, true);
1367 goto out;
1368 }
1369
1370 for (pp = &mp->ports;
1371 (p = mlock_dereference(*pp, brmctx->br)) != NULL;
1372 pp = &p->next) {
1373 if (br_port_group_equal(p, pmctx->port, src))
1374 goto found;

--- 3376 unchanged lines hidden ---
1367 goto out;
1368 }
1369
1370 for (pp = &mp->ports;
1371 (p = mlock_dereference(*pp, brmctx->br)) != NULL;
1372 pp = &p->next) {
1373 if (br_port_group_equal(p, pmctx->port, src))
1374 goto found;

--- 3376 unchanged lines hidden ---