--- zzzz-none-000/linux-5.4.213/net/8021q/vlan_dev.c 2022-09-15 10:04:56.000000000 +0000 +++ miami-7690-761/linux-5.4.213/net/8021q/vlan_dev.c 2024-05-29 11:20:02.000000000 +0000 @@ -27,6 +27,11 @@ #include #include +#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) +#include +#include +#endif + #include "vlan.h" #include "vlanproc.h" #include @@ -747,6 +752,27 @@ 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 @@ #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)