Commit 6be144f6 authored by Nikolay Aleksandrov's avatar Nikolay Aleksandrov Committed by David S. Miller

bridge: vlan: use br_vlan_should_use to simplify __vlan_add/del

The checks that lead to num_vlans change are always what
br_vlan_should_use checks for, namely if the vlan is only a context or
not and depending on that it's either not counted or counted
as a real/used vlan respectively.
Also give better explanation in br_vlan_should_use's comment.
Signed-off-by: default avatarNikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2ffdf508
...@@ -400,7 +400,7 @@ static inline bool br_vlan_is_brentry(const struct net_bridge_vlan *v) ...@@ -400,7 +400,7 @@ static inline bool br_vlan_is_brentry(const struct net_bridge_vlan *v)
return v->flags & BRIDGE_VLAN_INFO_BRENTRY; return v->flags & BRIDGE_VLAN_INFO_BRENTRY;
} }
/* check if we should use the vlan entry is usable */ /* check if we should use the vlan entry, returns false if it's only context */
static inline bool br_vlan_should_use(const struct net_bridge_vlan *v) static inline bool br_vlan_should_use(const struct net_bridge_vlan *v)
{ {
if (br_vlan_is_master(v)) { if (br_vlan_is_master(v)) {
......
...@@ -195,7 +195,7 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags) ...@@ -195,7 +195,7 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags)
{ {
struct net_bridge_vlan *masterv = NULL; struct net_bridge_vlan *masterv = NULL;
struct net_bridge_port *p = NULL; struct net_bridge_port *p = NULL;
struct rhashtable *tbl; struct net_bridge_vlan_group *vg;
struct net_device *dev; struct net_device *dev;
struct net_bridge *br; struct net_bridge *br;
int err; int err;
...@@ -203,12 +203,12 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags) ...@@ -203,12 +203,12 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags)
if (br_vlan_is_master(v)) { if (br_vlan_is_master(v)) {
br = v->br; br = v->br;
dev = br->dev; dev = br->dev;
tbl = &br->vlgrp->vlan_hash; vg = br->vlgrp;
} else { } else {
p = v->port; p = v->port;
br = p->br; br = p->br;
dev = p->dev; dev = p->dev;
tbl = &p->vlgrp->vlan_hash; vg = p->vlgrp;
} }
if (p) { if (p) {
...@@ -234,32 +234,31 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags) ...@@ -234,32 +234,31 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags)
v->brvlan = masterv; v->brvlan = masterv;
} }
/* Add the dev mac only if it's a usable vlan */ /* Add the dev mac and count the vlan only if it's usable */
if (br_vlan_should_use(v)) { if (br_vlan_should_use(v)) {
err = br_fdb_insert(br, p, dev->dev_addr, v->vid); err = br_fdb_insert(br, p, dev->dev_addr, v->vid);
if (err) { if (err) {
br_err(br, "failed insert local address into bridge forwarding table\n"); br_err(br, "failed insert local address into bridge forwarding table\n");
goto out_filt; goto out_filt;
} }
vg->num_vlans++;
} }
err = rhashtable_lookup_insert_fast(tbl, &v->vnode, br_vlan_rht_params); err = rhashtable_lookup_insert_fast(&vg->vlan_hash, &v->vnode,
br_vlan_rht_params);
if (err) if (err)
goto out_fdb_insert; goto out_fdb_insert;
__vlan_add_list(v); __vlan_add_list(v);
__vlan_add_flags(v, flags); __vlan_add_flags(v, flags);
if (br_vlan_is_master(v)) {
if (br_vlan_is_brentry(v))
br->vlgrp->num_vlans++;
} else {
p->vlgrp->num_vlans++;
}
out: out:
return err; return err;
out_fdb_insert: out_fdb_insert:
br_fdb_find_delete_local(br, p, br->dev->dev_addr, v->vid); if (br_vlan_should_use(v)) {
br_fdb_find_delete_local(br, p, dev->dev_addr, v->vid);
vg->num_vlans--;
}
out_filt: out_filt:
if (p) { if (p) {
...@@ -278,15 +277,12 @@ static int __vlan_del(struct net_bridge_vlan *v) ...@@ -278,15 +277,12 @@ static int __vlan_del(struct net_bridge_vlan *v)
struct net_bridge_vlan *masterv = v; struct net_bridge_vlan *masterv = v;
struct net_bridge_vlan_group *vg; struct net_bridge_vlan_group *vg;
struct net_bridge_port *p = NULL; struct net_bridge_port *p = NULL;
struct net_bridge *br;
int err = 0; int err = 0;
if (br_vlan_is_master(v)) { if (br_vlan_is_master(v)) {
br = v->br;
vg = v->br->vlgrp; vg = v->br->vlgrp;
} else { } else {
p = v->port; p = v->port;
br = p->br;
vg = v->port->vlgrp; vg = v->port->vlgrp;
masterv = v->brvlan; masterv = v->brvlan;
} }
...@@ -298,13 +294,9 @@ static int __vlan_del(struct net_bridge_vlan *v) ...@@ -298,13 +294,9 @@ static int __vlan_del(struct net_bridge_vlan *v)
goto out; goto out;
} }
if (br_vlan_is_master(v)) { if (br_vlan_should_use(v)) {
if (br_vlan_is_brentry(v)) {
v->flags &= ~BRIDGE_VLAN_INFO_BRENTRY; v->flags &= ~BRIDGE_VLAN_INFO_BRENTRY;
br->vlgrp->num_vlans--; vg->num_vlans--;
}
} else {
p->vlgrp->num_vlans--;
} }
if (masterv != v) { if (masterv != v) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment