| From: Felix Fietkau <nbd@nbd.name> |
| Date: Thu, 15 Mar 2018 20:49:58 +0100 |
| Subject: [PATCH] net: 8021q: support hardware flow table offload |
| |
| Add the VLAN ID and protocol information |
| |
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |
| --- |
| |
| --- a/net/8021q/vlan_dev.c |
| +++ b/net/8021q/vlan_dev.c |
| @@ -27,6 +27,11 @@ |
| #include <linux/phy.h> |
| #include <net/arp.h> |
| |
| +#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) |
| +#include <linux/netfilter.h> |
| +#include <net/netfilter/nf_flow_table.h> |
| +#endif |
| + |
| #include "vlan.h" |
| #include "vlanproc.h" |
| #include <linux/if_vlan.h> |
| @@ -747,6 +752,27 @@ static int vlan_dev_get_iflink(const str |
| return real_dev->ifindex; |
| } |
| |
| +#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) |
| +static int vlan_dev_flow_offload_check(struct flow_offload_hw_path *path) |
| +{ |
| + struct net_device *dev = path->dev; |
| + struct vlan_dev_priv *vlan = vlan_dev_priv(dev); |
| + |
| + if (path->flags & FLOW_OFFLOAD_PATH_VLAN) |
| + return -EEXIST; |
| + |
| + path->flags |= FLOW_OFFLOAD_PATH_VLAN; |
| + path->vlan_proto = vlan->vlan_proto; |
| + path->vlan_id = vlan->vlan_id; |
| + path->dev = vlan->real_dev; |
| + |
| + if (vlan->real_dev->netdev_ops->ndo_flow_offload_check) |
| + return vlan->real_dev->netdev_ops->ndo_flow_offload_check(path); |
| + |
| + return 0; |
| +} |
| +#endif /* CONFIG_NF_FLOW_TABLE */ |
| + |
| static const struct ethtool_ops vlan_ethtool_ops = { |
| .get_link_ksettings = vlan_ethtool_get_link_ksettings, |
| .get_drvinfo = vlan_ethtool_get_drvinfo, |
| @@ -785,6 +811,9 @@ static const struct net_device_ops vlan_ |
| #endif |
| .ndo_fix_features = vlan_dev_fix_features, |
| .ndo_get_iflink = vlan_dev_get_iflink, |
| +#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) |
| + .ndo_flow_offload_check = vlan_dev_flow_offload_check, |
| +#endif |
| }; |
| |
| static void vlan_dev_free(struct net_device *dev) |