RPS not work for DSA devices since the 'skb_get_hash'
will always get the invalid hash for dsa tagged packets.

"[PATCH] tag_mtk: add flow_dissect callback to the ops struct"
introduced the flow_dissect callback to get the right hash for
MTK tagged packet. Tag_dsa and tag_edsa  also need to implement
the callback.

Signed-off-by: Rundong Ge <rdong...@gmail.com>
---
 net/dsa/tag_dsa.c  | 9 +++++++++
 net/dsa/tag_edsa.c | 9 +++++++++
 2 files changed, 18 insertions(+)

diff --git a/net/dsa/tag_dsa.c b/net/dsa/tag_dsa.c
index 8b2f92e..67ff3fa 100644
--- a/net/dsa/tag_dsa.c
+++ b/net/dsa/tag_dsa.c
@@ -146,8 +146,17 @@ static struct sk_buff *dsa_rcv(struct sk_buff *skb, struct 
net_device *dev,
        return skb;
 }
 
+static int dsa_tag_flow_dissect(const struct sk_buff *skb, __be16 *proto,
+                               int *offset)
+{
+       *offset = 4;
+       *proto = ((__be16 *)skb->data)[1];
+       return 0;
+}
+
 const struct dsa_device_ops dsa_netdev_ops = {
        .xmit   = dsa_xmit,
        .rcv    = dsa_rcv,
+       .flow_dissect   = dsa_tag_flow_dissect,
        .overhead = DSA_HLEN,
 };
diff --git a/net/dsa/tag_edsa.c b/net/dsa/tag_edsa.c
index f5b87ee..234585e 100644
--- a/net/dsa/tag_edsa.c
+++ b/net/dsa/tag_edsa.c
@@ -165,8 +165,17 @@ static struct sk_buff *edsa_rcv(struct sk_buff *skb, 
struct net_device *dev,
        return skb;
 }
 
+static int edsa_tag_flow_dissect(const struct sk_buff *skb, __be16 *proto,
+                                int *offset)
+{
+       *offset = 8;
+       *proto = ((__be16 *)skb->data)[3];
+       return 0;
+}
+
 const struct dsa_device_ops edsa_netdev_ops = {
        .xmit   = edsa_xmit,
        .rcv    = edsa_rcv,
+       .flow_dissect   = edsa_tag_flow_dissect,
        .overhead = EDSA_HLEN,
 };
-- 
1.8.3.1

Reply via email to