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

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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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)) {
+14 −22
Original line number Original line Diff line number Diff line
@@ -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)
	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)
		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)
	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)
			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) {