Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 09cf0211 authored by Nikolay Aleksandrov's avatar Nikolay Aleksandrov Committed by David S. Miller
Browse files

bridge: mdb: fill state in br_mdb_notify



Fill also the port group state when sending notifications.

Signed-off-by: default avatarSatish Ashok <sashok@cumulusnetworks.com>
Signed-off-by: default avatarNikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cb1c6168
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -230,7 +230,7 @@ errout:
}
}


void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
		   struct br_ip *group, int type)
		   struct br_ip *group, int type, u8 state)
{
{
	struct br_mdb_entry entry;
	struct br_mdb_entry entry;


@@ -241,6 +241,7 @@ void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
#if IS_ENABLED(CONFIG_IPV6)
#if IS_ENABLED(CONFIG_IPV6)
	entry.addr.u.ip6 = group->u.ip6;
	entry.addr.u.ip6 = group->u.ip6;
#endif
#endif
	entry.state = state;
	__br_mdb_notify(dev, &entry, type);
	__br_mdb_notify(dev, &entry, type);
}
}


@@ -348,7 +349,7 @@ static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port,
		return -ENOMEM;
		return -ENOMEM;
	rcu_assign_pointer(*pp, p);
	rcu_assign_pointer(*pp, p);


	br_mdb_notify(br->dev, port, group, RTM_NEWMDB);
	br_mdb_notify(br->dev, port, group, RTM_NEWMDB, state);
	return 0;
	return 0;
}
}


+3 −2
Original line number Original line Diff line number Diff line
@@ -694,7 +694,7 @@ static int br_multicast_add_group(struct net_bridge *br,
	if (unlikely(!p))
	if (unlikely(!p))
		goto err;
		goto err;
	rcu_assign_pointer(*pp, p);
	rcu_assign_pointer(*pp, p);
	br_mdb_notify(br->dev, port, group, RTM_NEWMDB);
	br_mdb_notify(br->dev, port, group, RTM_NEWMDB, MDB_TEMPORARY);


found:
found:
	mod_timer(&p->timer, now + br->multicast_membership_interval);
	mod_timer(&p->timer, now + br->multicast_membership_interval);
@@ -1439,8 +1439,9 @@ br_multicast_leave_group(struct net_bridge *br,
			rcu_assign_pointer(*pp, p->next);
			rcu_assign_pointer(*pp, p->next);
			hlist_del_init(&p->mglist);
			hlist_del_init(&p->mglist);
			del_timer(&p->timer);
			del_timer(&p->timer);
			br_mdb_notify(br->dev, port, group, RTM_DELMDB,
				      p->state);
			call_rcu_bh(&p->rcu, br_multicast_free_pg);
			call_rcu_bh(&p->rcu, br_multicast_free_pg);
			br_mdb_notify(br->dev, port, group, RTM_DELMDB);


			if (!mp->ports && !mp->mglist &&
			if (!mp->ports && !mp->mglist &&
			    netif_running(br->dev))
			    netif_running(br->dev))
+1 −1
Original line number Original line Diff line number Diff line
@@ -488,7 +488,7 @@ br_multicast_new_port_group(struct net_bridge_port *port, struct br_ip *group,
void br_mdb_init(void);
void br_mdb_init(void);
void br_mdb_uninit(void);
void br_mdb_uninit(void);
void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
		   struct br_ip *group, int type);
		   struct br_ip *group, int type, u8 state);


#define mlock_dereference(X, br) \
#define mlock_dereference(X, br) \
	rcu_dereference_protected(X, lockdep_is_held(&br->multicast_lock))
	rcu_dereference_protected(X, lockdep_is_held(&br->multicast_lock))