@@ -855,20 +855,19 @@ __br_mdb_choose_context(struct net_bridge *br,
static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port,
struct br_mdb_entry *entry,
- struct nlattr **mdb_attrs,
+ const struct br_mdb_config *cfg,
struct netlink_ext_ack *extack)
{
struct net_bridge_mdb_entry *mp, *star_mp;
struct net_bridge_port_group __rcu **pp;
struct net_bridge_port_group *p;
struct net_bridge_mcast *brmctx;
- struct br_ip group, star_group;
+ struct br_ip group = cfg->group;
unsigned long now = jiffies;
unsigned char flags = 0;
+ struct br_ip star_group;
u8 filter_mode;
- __mdb_entry_to_br_ip(entry, &group, mdb_attrs);
-
brmctx = __br_mdb_choose_context(br, entry, extack);
if (!brmctx)
return -EINVAL;
@@ -966,7 +965,7 @@ static int __br_mdb_add(const struct br_mdb_config *cfg,
int ret;
spin_lock_bh(&cfg->br->multicast_lock);
- ret = br_mdb_add_group(cfg->br, cfg->p, cfg->entry, mdb_attrs, extack);
+ ret = br_mdb_add_group(cfg->br, cfg->p, cfg->entry, cfg, extack);
spin_unlock_bh(&cfg->br->multicast_lock);
return ret;
@@ -1118,6 +1117,7 @@ static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
if (br_vlan_enabled(cfg.br->dev) && vg && cfg.entry->vid == 0) {
list_for_each_entry(v, &vg->vlan_list, vlist) {
cfg.entry->vid = v->vid;
+ cfg.group.vid = v->vid;
err = __br_mdb_add(&cfg, mdb_attrs, extack);
if (err)
break;
@@ -1137,11 +1137,9 @@ static int __br_mdb_del(const struct br_mdb_config *cfg,
struct net_bridge_mdb_entry *mp;
struct net_bridge_port_group *p;
struct net_bridge_port_group __rcu **pp;
- struct br_ip ip;
+ struct br_ip ip = cfg->group;
int err = -EINVAL;
- __mdb_entry_to_br_ip(entry, &ip, mdb_attrs);
-
spin_lock_bh(&br->multicast_lock);
mp = br_mdb_ip_get(br, &ip);
if (!mp)
@@ -1204,6 +1202,7 @@ static int br_mdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
if (br_vlan_enabled(cfg.br->dev) && vg && cfg.entry->vid == 0) {
list_for_each_entry(v, &vg->vlan_list, vlist) {
cfg.entry->vid = v->vid;
+ cfg.group.vid = v->vid;
err = __br_mdb_del(&cfg, mdb_attrs);
}
} else {