]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5e: TC, Reject forwarding from internal port to internal port
authorAriel Levkovich <lariel@nvidia.com>
Wed, 26 Oct 2022 13:51:46 +0000 (14:51 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 3 Nov 2022 15:00:34 +0000 (00:00 +0900)
[ Upstream commit f382a2413dae8c855226a72600812a4b37432c48 ]

Reject TC rules that forward from internal port to internal port
as it is not supported.

This include rules that are explicitly have internal port as
the filter device as well as rules that apply on tunnel interfaces
as the route device for the tunnel interface can be an internal
port.

Fixes: 27484f7170ed ("net/mlx5e: Offload tc rules that redirect to ovs internal port")
Signed-off-by: Ariel Levkovich <lariel@nvidia.com>
Reviewed-by: Maor Dickman <maord@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Link: https://lore.kernel.org/r/20221026135153.154807-9-saeed@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index 6a0df046064f7db04ab98f15060319c20075aa98..a687f047e3aeb1ef43f69459b120882c013d6f8f 100644 (file)
@@ -4052,6 +4052,7 @@ parse_tc_fdb_actions(struct mlx5e_priv *priv,
        struct mlx5e_tc_flow_parse_attr *parse_attr;
        struct mlx5_flow_attr *attr = flow->attr;
        struct mlx5_esw_flow_attr *esw_attr;
+       struct net_device *filter_dev;
        int err;
 
        err = flow_action_supported(flow_action, extack);
@@ -4060,6 +4061,7 @@ parse_tc_fdb_actions(struct mlx5e_priv *priv,
 
        esw_attr = attr->esw_attr;
        parse_attr = attr->parse_attr;
+       filter_dev = parse_attr->filter_dev;
        parse_state = &parse_attr->parse_state;
        mlx5e_tc_act_init_parse_state(parse_state, flow, flow_action, extack);
        parse_state->ct_priv = get_ct_priv(priv);
@@ -4069,13 +4071,21 @@ parse_tc_fdb_actions(struct mlx5e_priv *priv,
                return err;
 
        /* Forward to/from internal port can only have 1 dest */
-       if ((netif_is_ovs_master(parse_attr->filter_dev) || esw_attr->dest_int_port) &&
+       if ((netif_is_ovs_master(filter_dev) || esw_attr->dest_int_port) &&
            esw_attr->out_count > 1) {
                NL_SET_ERR_MSG_MOD(extack,
                                   "Rules with internal port can have only one destination");
                return -EOPNOTSUPP;
        }
 
+       /* Forward from tunnel/internal port to internal port is not supported */
+       if ((mlx5e_get_tc_tun(filter_dev) || netif_is_ovs_master(filter_dev)) &&
+           esw_attr->dest_int_port) {
+               NL_SET_ERR_MSG_MOD(extack,
+                                  "Forwarding from tunnel/internal port to internal port is not supported");
+               return -EOPNOTSUPP;
+       }
+
        err = actions_prepare_mod_hdr_actions(priv, flow, attr, extack);
        if (err)
                return err;