--- zzzz-none-000/linux-5.4.213/net/dsa/slave.c 2022-09-15 10:04:56.000000000 +0000 +++ miami-7690-761/linux-5.4.213/net/dsa/slave.c 2024-05-29 11:20:02.000000000 +0000 @@ -19,6 +19,10 @@ #include #include #include +#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) +#include +#include +#endif #include "dsa_priv.h" @@ -319,7 +323,7 @@ if (obj->orig_dev != dev) return -EOPNOTSUPP; - if (dp->bridge_dev && !br_vlan_enabled(dp->bridge_dev)) + if (dsa_port_skip_vlan_configuration(dp)) return 0; vlan = *SWITCHDEV_OBJ_PORT_VLAN(obj); @@ -386,7 +390,7 @@ if (obj->orig_dev != dev) return -EOPNOTSUPP; - if (dp->bridge_dev && !br_vlan_enabled(dp->bridge_dev)) + if (dsa_port_skip_vlan_configuration(dp)) return 0; /* Do not deprogram the CPU port as it may be shared with other user @@ -1120,7 +1124,7 @@ * need to emulate the switchdev prepare + commit phase. */ if (dp->bridge_dev) { - if (!br_vlan_enabled(dp->bridge_dev)) + if (dsa_port_skip_vlan_configuration(dp)) return 0; /* br_vlan_get_info() returns -EINVAL or -ENOENT if the @@ -1154,7 +1158,7 @@ * need to emulate the switchdev prepare + commit phase. */ if (dp->bridge_dev) { - if (!br_vlan_enabled(dp->bridge_dev)) + if (dsa_port_skip_vlan_configuration(dp)) return 0; /* br_vlan_get_info() returns -EINVAL or -ENOENT if the @@ -1223,6 +1227,27 @@ 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, @@ -1247,6 +1272,9 @@ .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 = {