| 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 |
| @@ -93,6 +93,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; |
| @@ -103,6 +104,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" |
| |
| @@ -1224,6 +1228,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, |
| @@ -1248,6 +1273,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 = { |