]> Git Repo - linux.git/blobdiff - net/dsa/tag_dsa.c
net: mscc: ocelot: use common tag parsing code with DSA
[linux.git] / net / dsa / tag_dsa.c
index 112c7c6dd5686d1d8d8334c758eb0e2042df1181..7e7b7decdf397152fb88209f4b81a25194151f48 100644 (file)
@@ -163,6 +163,7 @@ static struct sk_buff *dsa_rcv_ll(struct sk_buff *skb, struct net_device *dev,
                                  u8 extra)
 {
        int source_device, source_port;
+       bool trunk = false;
        enum dsa_code code;
        enum dsa_cmd cmd;
        u8 *dsa_header;
@@ -174,6 +175,8 @@ static struct sk_buff *dsa_rcv_ll(struct sk_buff *skb, struct net_device *dev,
        switch (cmd) {
        case DSA_CMD_FORWARD:
                skb->offload_fwd_mark = 1;
+
+               trunk = !!(dsa_header[1] & 7);
                break;
 
        case DSA_CMD_TO_CPU:
@@ -216,7 +219,19 @@ static struct sk_buff *dsa_rcv_ll(struct sk_buff *skb, struct net_device *dev,
        source_device = dsa_header[0] & 0x1f;
        source_port = (dsa_header[1] >> 3) & 0x1f;
 
-       skb->dev = dsa_master_find_slave(dev, source_device, source_port);
+       if (trunk) {
+               struct dsa_port *cpu_dp = dev->dsa_ptr;
+
+               /* The exact source port is not available in the tag,
+                * so we inject the frame directly on the upper
+                * team/bond.
+                */
+               skb->dev = dsa_lag_dev(cpu_dp->dst, source_port);
+       } else {
+               skb->dev = dsa_master_find_slave(dev, source_device,
+                                                source_port);
+       }
+
        if (!skb->dev)
                return NULL;
 
This page took 0.032539 seconds and 4 git commands to generate.