|
@@ -83,6 +83,7 @@ static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
|
|
|
if (port) {
|
|
|
struct br_mdb_entry e;
|
|
|
e.ifindex = port->dev->ifindex;
|
|
|
+ e.state = p->state;
|
|
|
e.addr.u.ip4 = p->addr.u.ip4;
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
|
e.addr.u.ip6 = p->addr.u.ip6;
|
|
@@ -253,6 +254,8 @@ static bool is_valid_mdb_entry(struct br_mdb_entry *entry)
|
|
|
#endif
|
|
|
} else
|
|
|
return false;
|
|
|
+ if (entry->state != MDB_PERMANENT && entry->state != MDB_TEMPORARY)
|
|
|
+ return false;
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -310,7 +313,7 @@ static int br_mdb_parse(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|
|
}
|
|
|
|
|
|
static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port,
|
|
|
- struct br_ip *group)
|
|
|
+ struct br_ip *group, unsigned char state)
|
|
|
{
|
|
|
struct net_bridge_mdb_entry *mp;
|
|
|
struct net_bridge_port_group *p;
|
|
@@ -336,7 +339,7 @@ static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port,
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- p = br_multicast_new_port_group(port, group, *pp);
|
|
|
+ p = br_multicast_new_port_group(port, group, *pp, state);
|
|
|
if (unlikely(!p))
|
|
|
return -ENOMEM;
|
|
|
rcu_assign_pointer(*pp, p);
|
|
@@ -373,7 +376,7 @@ static int __br_mdb_add(struct net *net, struct net_bridge *br,
|
|
|
#endif
|
|
|
|
|
|
spin_lock_bh(&br->multicast_lock);
|
|
|
- ret = br_mdb_add_group(br, p, &ip);
|
|
|
+ ret = br_mdb_add_group(br, p, &ip, entry->state);
|
|
|
spin_unlock_bh(&br->multicast_lock);
|
|
|
return ret;
|
|
|
}
|