79 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 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"
 | |
|  
 | |
| @@ -1221,6 +1225,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,
 | |
| @@ -1245,6 +1270,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 = {
 | 
