From: Felix Fietkau 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 --- --- 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 #include #include +#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) +#include +#include +#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 = {