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

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

net: bridge: mdb: dump host-joined entries as well



Currently we dump only the port mdb entries but we can have host-joined
entries on the bridge itself and they should be treated as normal temp
mdbs, they're already notified:
$ bridge monitor all
[MDB]dev br0 port br0 grp ff02::8 temp

The group will not be shown in the bridge mdb output, but it takes 1 slot
and it's timing out. If it's only host-joined then the mdb show output
can even be empty.

After this patch we show the host-joined groups:
$ bridge mdb show
dev br0 port br0 grp ff02::8 temp

Signed-off-by: default avatarNikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6545916e
Loading
Loading
Loading
Loading
+31 −10
Original line number Original line Diff line number Diff line
@@ -78,22 +78,35 @@ static void __mdb_entry_to_br_ip(struct br_mdb_entry *entry, struct br_ip *ip)
}
}


static int __mdb_fill_info(struct sk_buff *skb,
static int __mdb_fill_info(struct sk_buff *skb,
			   struct net_bridge_mdb_entry *mp,
			   struct net_bridge_port_group *p)
			   struct net_bridge_port_group *p)
{
{
	struct timer_list *mtimer;
	struct nlattr *nest_ent;
	struct nlattr *nest_ent;
	struct br_mdb_entry e;
	struct br_mdb_entry e;
	u8 flags = 0;
	int ifindex;


	memset(&e, 0, sizeof(e));
	memset(&e, 0, sizeof(e));
	__mdb_entry_fill_flags(&e, p->flags);
	if (p) {
	e.ifindex = p->port->dev->ifindex;
		ifindex = p->port->dev->ifindex;
	e.vid = p->addr.vid;
		mtimer = &p->timer;
	if (p->addr.proto == htons(ETH_P_IP))
		flags = p->flags;
		e.addr.u.ip4 = p->addr.u.ip4;
	} else {
		ifindex = mp->br->dev->ifindex;
		mtimer = &mp->timer;
	}

	__mdb_entry_fill_flags(&e, flags);
	e.ifindex = ifindex;
	e.vid = mp->addr.vid;
	if (mp->addr.proto == htons(ETH_P_IP))
		e.addr.u.ip4 = mp->addr.u.ip4;
#if IS_ENABLED(CONFIG_IPV6)
#if IS_ENABLED(CONFIG_IPV6)
	if (p->addr.proto == htons(ETH_P_IPV6))
	if (mp->addr.proto == htons(ETH_P_IPV6))
		e.addr.u.ip6 = p->addr.u.ip6;
		e.addr.u.ip6 = mp->addr.u.ip6;
#endif
#endif
	e.addr.proto = p->addr.proto;
	e.addr.proto = mp->addr.proto;
	nest_ent = nla_nest_start_noflag(skb,
	nest_ent = nla_nest_start_noflag(skb,
					 MDBA_MDB_ENTRY_INFO);
					 MDBA_MDB_ENTRY_INFO);
	if (!nest_ent)
	if (!nest_ent)
@@ -102,7 +115,7 @@ static int __mdb_fill_info(struct sk_buff *skb,
	if (nla_put_nohdr(skb, sizeof(e), &e) ||
	if (nla_put_nohdr(skb, sizeof(e), &e) ||
	    nla_put_u32(skb,
	    nla_put_u32(skb,
			MDBA_MDB_EATTR_TIMER,
			MDBA_MDB_EATTR_TIMER,
			br_timer_value(&p->timer))) {
			br_timer_value(mtimer))) {
		nla_nest_cancel(skb, nest_ent);
		nla_nest_cancel(skb, nest_ent);
		return -EMSGSIZE;
		return -EMSGSIZE;
	}
	}
@@ -139,12 +152,20 @@ static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
			break;
			break;
		}
		}


		if (mp->host_joined) {
			err = __mdb_fill_info(skb, mp, NULL);
			if (err) {
				nla_nest_cancel(skb, nest2);
				break;
			}
		}

		for (pp = &mp->ports; (p = rcu_dereference(*pp)) != NULL;
		for (pp = &mp->ports; (p = rcu_dereference(*pp)) != NULL;
		      pp = &p->next) {
		      pp = &p->next) {
			if (!p->port)
			if (!p->port)
				continue;
				continue;


			err = __mdb_fill_info(skb, p);
			err = __mdb_fill_info(skb, mp, p);
			if (err) {
			if (err) {
				nla_nest_cancel(skb, nest2);
				nla_nest_cancel(skb, nest2);
				goto out;
				goto out;