aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/pending-5.4/647-net-dsa-support-hardware-flow-table-offload.patch
blob: 91aae5b65c730d38d2b34949e7ea1e645c294b5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
From: Felix Fietkau <nbd@nbd.name>
Date: Thu, 17 Sep 2020 18:41:23 +0200
Subject: [PATCH] net: dsa: support hardware flow table offload

Look up the master device and the port id

Signed-off-by: Felix Fietkau <nbd@nbd.name>
---

--- a/include/net/netfilter/nf_flow_table.h
+++ b/include/net/netfilter/nf_flow_table.h
@@ -90,6 +90,7 @@ struct flow_offload {
 #define FLOW_OFFLOAD_PATH_ETHERNET	BIT(0)
 #define FLOW_OFFLOAD_PATH_VLAN		BIT(1)
 #define FLOW_OFFLOAD_PATH_PPPOE		BIT(2)
+#define FLOW_OFFLOAD_PATH_DSA		BIT(3)
 
 struct flow_offload_hw_path {
 	struct net_device *dev;
@@ -100,6 +101,7 @@ struct flow_offload_hw_path {
 	u16 vlan_proto;
 	u16 vlan_id;
 	u16 pppoe_sid;
+	u16 dsa_port;
 };
 
 #define NF_FLOW_TIMEOUT (30 * HZ)
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -19,6 +19,10 @@
 #include <linux/if_bridge.h>
 #include <linux/netpoll.h>
 #include <linux/ptp_classify.h>
+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
+#include <linux/netfilter.h>
+#include <net/netfilter/nf_flow_table.h>
+#endif
 
 #include "dsa_priv.h"
 
@@ -1226,6 +1230,27 @@ static struct devlink_port *dsa_slave_ge
 	return dp->ds->devlink ? &dp->devlink_port : NULL;
 }
 
+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
+static int dsa_flow_offload_check(struct flow_offload_hw_path *path)
+{
+	struct net_device *dev = path->dev;
+	struct dsa_port *dp;
+
+	if (!(path->flags & FLOW_OFFLOAD_PATH_ETHERNET))
+		return -EINVAL;
+
+	dp = dsa_slave_to_port(dev);
+	path->dsa_port = dp->index;
+	path->dev = dsa_slave_to_master(dev);
+	path->flags |= FLOW_OFFLOAD_PATH_DSA;
+
+	if (path->dev->netdev_ops->ndo_flow_offload_check)
+		return path->dev->netdev_ops->ndo_flow_offload_check(path);
+
+	return 0;
+}
+#endif /* CONFIG_NF_FLOW_TABLE */
+
 static const struct net_device_ops dsa_slave_netdev_ops = {
 	.ndo_open	 	= dsa_slave_open,
 	.ndo_stop		= dsa_slave_close,
@@ -1250,6 +1275,9 @@ static const struct net_device_ops dsa_s
 	.ndo_vlan_rx_add_vid	= dsa_slave_vlan_rx_add_vid,
 	.ndo_vlan_rx_kill_vid	= dsa_slave_vlan_rx_kill_vid,
 	.ndo_get_devlink_port	= dsa_slave_get_devlink_port,
+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
+	.ndo_flow_offload_check	 = dsa_flow_offload_check,
+#endif
 };
 
 static struct device_type dsa_type = {