net: dsa: tag_sja1105: refactor skb->dev assignment to dsa_tag_8021q_find_user()
authorVladimir Oltean <vladimir.oltean@nxp.com>
Sat, 13 Jul 2024 21:16:12 +0000 (23:16 +0200)
committerJakub Kicinski <kuba@kernel.org>
Mon, 15 Jul 2024 13:55:15 +0000 (06:55 -0700)
A new tagging protocol implementation based on tag_8021q is on the
horizon, and it appears that it also has to open-code the complicated
logic of finding a source port based on a VLAN header.

Create a single dsa_tag_8021q_find_user() and make sja1105 call it.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Link: https://patch.msgid.link/20240713211620.1125910-7-paweldembicki@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/dsa/tag_8021q.c
net/dsa/tag_8021q.h
net/dsa/tag_sja1105.c

index 2d1c554a63ff138f260fb711330c13e4370230e4..c0eee113a2b9213c3445542d10cd0add2a8ff3e5 100644 (file)
@@ -468,8 +468,8 @@ struct sk_buff *dsa_8021q_xmit(struct sk_buff *skb, struct net_device *netdev,
 }
 EXPORT_SYMBOL_GPL(dsa_8021q_xmit);
 
-struct net_device *dsa_tag_8021q_find_port_by_vbid(struct net_device *conduit,
-                                                  int vbid)
+static struct net_device *
+dsa_tag_8021q_find_port_by_vbid(struct net_device *conduit, int vbid)
 {
        struct dsa_port *cpu_dp = conduit->dsa_ptr;
        struct dsa_switch_tree *dst = cpu_dp->dst;
@@ -495,7 +495,20 @@ struct net_device *dsa_tag_8021q_find_port_by_vbid(struct net_device *conduit,
 
        return NULL;
 }
-EXPORT_SYMBOL_GPL(dsa_tag_8021q_find_port_by_vbid);
+
+struct net_device *dsa_tag_8021q_find_user(struct net_device *conduit,
+                                          int source_port, int switch_id,
+                                          int vid, int vbid)
+{
+       /* Always prefer precise source port information, if available */
+       if (source_port != -1 && switch_id != -1)
+               return dsa_conduit_find_user(conduit, switch_id, source_port);
+       else if (vbid >= 1)
+               return dsa_tag_8021q_find_port_by_vbid(conduit, vbid);
+
+       return dsa_find_designated_bridge_port_by_vid(conduit, vid);
+}
+EXPORT_SYMBOL_GPL(dsa_tag_8021q_find_user);
 
 /**
  * dsa_8021q_rcv - Decode source information from tag_8021q header
index 0c6671d7c1c23408e9fc162a1d994804dd5612b5..27b8906f99ecc04d146d0980dde09298d5d4cccc 100644 (file)
@@ -16,8 +16,9 @@ struct sk_buff *dsa_8021q_xmit(struct sk_buff *skb, struct net_device *netdev,
 void dsa_8021q_rcv(struct sk_buff *skb, int *source_port, int *switch_id,
                   int *vbid, int *vid);
 
-struct net_device *dsa_tag_8021q_find_port_by_vbid(struct net_device *conduit,
-                                                  int vbid);
+struct net_device *dsa_tag_8021q_find_user(struct net_device *conduit,
+                                          int source_port, int switch_id,
+                                          int vid, int vbid);
 
 int dsa_switch_tag_8021q_vlan_add(struct dsa_switch *ds,
                                  struct dsa_notifier_tag_8021q_vlan_info *info);
index 35a6346549f231a1f37d0fe9bc0e140bf6de5728..3e902af7eea645c4992b11957c95930690bd915a 100644 (file)
@@ -509,12 +509,8 @@ static struct sk_buff *sja1105_rcv(struct sk_buff *skb,
                 */
                return NULL;
 
-       if (source_port != -1 && switch_id != -1)
-               skb->dev = dsa_conduit_find_user(netdev, switch_id, source_port);
-       else if (vbid >= 1)
-               skb->dev = dsa_tag_8021q_find_port_by_vbid(netdev, vbid);
-       else
-               skb->dev = dsa_find_designated_bridge_port_by_vid(netdev, vid);
+       skb->dev = dsa_tag_8021q_find_user(netdev, source_port, switch_id,
+                                          vid, vbid);
        if (!skb->dev) {
                netdev_warn(netdev, "Couldn't decode source port\n");
                return NULL;
@@ -652,12 +648,9 @@ static struct sk_buff *sja1110_rcv(struct sk_buff *skb,
        if (likely(sja1105_skb_has_tag_8021q(skb)))
                dsa_8021q_rcv(skb, &source_port, &switch_id, &vbid, &vid);
 
-       if (source_port != -1 && switch_id != -1)
-               skb->dev = dsa_conduit_find_user(netdev, switch_id, source_port);
-       else if (vbid >= 1)
-               skb->dev = dsa_tag_8021q_find_port_by_vbid(netdev, vbid);
-       else
-               skb->dev = dsa_find_designated_bridge_port_by_vid(netdev, vid);
+       skb->dev = dsa_tag_8021q_find_user(netdev, source_port, switch_id,
+                                          vid, vbid);
+
        if (!skb->dev) {
                netdev_warn(netdev, "Couldn't decode source port\n");
                return NULL;