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: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
6545916ed9
commit
e77b0c84e3
@@ -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;
|
||||||
|
Reference in New Issue
Block a user