Both the pvid and tagged paths now resolve a VLAN entry. Select the entry
first and share the state check and output assignment.

Signed-off-by: Nikolay Aleksandrov <[email protected]>
---
 net/bridge/br_vlan.c | 19 +++++++------------
 1 file changed, 7 insertions(+), 12 deletions(-)

diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c
index 0675f74cf1b9..dcf783e1a440 100644
--- a/net/bridge/br_vlan.c
+++ b/net/bridge/br_vlan.c
@@ -742,21 +742,16 @@ bool br_should_learn(struct net_bridge_port *p, struct 
sk_buff *skb,
        if (!br_vlan_get_tag(skb, &vid) && skb->vlan_proto != br->vlan_proto)
                vid = 0;
 
-       if (!vid) {
+       if (vid)
+               v = br_vlan_find(vg, vid);
+       else
                v = rcu_dereference(vg->pvid);
-               if (!v || !br_vlan_state_allowed(br_vlan_get_state(v), true))
-                       return false;
-               *vlan = v;
-               return true;
-       }
 
-       v = br_vlan_find(vg, vid);
-       if (v && br_vlan_state_allowed(br_vlan_get_state(v), true)) {
-               *vlan = v;
-               return true;
-       }
+       if (!v || !br_vlan_state_allowed(br_vlan_get_state(v), true))
+               return false;
 
-       return false;
+       *vlan = v;
+       return true;
 }
 
 static int br_vlan_add_existing(struct net_bridge *br,
-- 
2.47.3


Reply via email to