net/mlx5e: TC, validate action list per attribute
authorOz Shlomo <ozsh@nvidia.com>
Sat, 3 Dec 2022 22:13:27 +0000 (14:13 -0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 8 Dec 2022 21:04:26 +0000 (13:04 -0800)
Currently the entire flow action list is validate for offload limitations.
For example, flow with both forward and drop actions are declared invalid
due to hardware restrictions.
However, a multi-table hardware model changes the limitations from a flow
scope to a single flow attribute scope.

Apply offload limitations to flow attributes instead of the entire flow.

Signed-off-by: Oz Shlomo <ozsh@nvidia.com>
Reviewed-by: Roi Dayan <roid@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Link: https://lore.kernel.org/r/20221203221337.29267-6-saeed@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index 4622254..7eaf6c7 100644 (file)
@@ -1725,6 +1725,30 @@ clean_encap_dests(struct mlx5e_priv *priv,
 }
 
 static int
+verify_attr_actions(u32 actions, struct netlink_ext_ack *extack)
+{
+       if (!(actions &
+             (MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_DROP))) {
+               NL_SET_ERR_MSG_MOD(extack, "Rule must have at least one forward/drop action");
+               return -EOPNOTSUPP;
+       }
+
+       if (!(~actions &
+             (MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_DROP))) {
+               NL_SET_ERR_MSG_MOD(extack, "Rule cannot support forward+drop action");
+               return -EOPNOTSUPP;
+       }
+
+       if (actions & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR &&
+           actions & MLX5_FLOW_CONTEXT_ACTION_DROP) {
+               NL_SET_ERR_MSG_MOD(extack, "Drop with modify header action is not supported");
+               return -EOPNOTSUPP;
+       }
+
+       return 0;
+}
+
+static int
 post_process_attr(struct mlx5e_tc_flow *flow,
                  struct mlx5_flow_attr *attr,
                  bool is_post_act_attr,
@@ -1734,6 +1758,10 @@ post_process_attr(struct mlx5e_tc_flow *flow,
        bool vf_tun;
        int err = 0;
 
+       err = verify_attr_actions(attr->action, extack);
+       if (err)
+               goto err_out;
+
        err = set_encap_dests(flow->priv, flow, attr, extack, &vf_tun);
        if (err)
                goto err_out;
@@ -3532,36 +3560,6 @@ actions_match_supported(struct mlx5e_priv *priv,
        ct_clear = flow->attr->ct_attr.ct_action & TCA_CT_ACT_CLEAR;
        ct_flow = flow_flag_test(flow, CT) && !ct_clear;
 
-       if (!(actions &
-             (MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_DROP))) {
-               NL_SET_ERR_MSG_MOD(extack, "Rule must have at least one forward/drop action");
-               return false;
-       }
-
-       if (!(~actions &
-             (MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_DROP))) {
-               NL_SET_ERR_MSG_MOD(extack, "Rule cannot support forward+drop action");
-               return false;
-       }
-
-       if (actions & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR &&
-           actions & MLX5_FLOW_CONTEXT_ACTION_DROP) {
-               NL_SET_ERR_MSG_MOD(extack, "Drop with modify header action is not supported");
-               return false;
-       }
-
-       if (!(~actions &
-             (MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_DROP))) {
-               NL_SET_ERR_MSG_MOD(extack, "Rule cannot support forward+drop action");
-               return false;
-       }
-
-       if (actions & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR &&
-           actions & MLX5_FLOW_CONTEXT_ACTION_DROP) {
-               NL_SET_ERR_MSG_MOD(extack, "Drop with modify header action is not supported");
-               return false;
-       }
-
        if (actions & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR &&
            !modify_header_match_supported(priv, &parse_attr->spec, flow_action,
                                           actions, ct_flow, ct_clear, extack))
@@ -3957,6 +3955,10 @@ parse_tc_nic_actions(struct mlx5e_priv *priv,
        if (err)
                return err;
 
+       err = verify_attr_actions(attr->action, extack);
+       if (err)
+               return err;
+
        if (!actions_match_supported(priv, flow_action, parse_state->actions,
                                     parse_attr, flow, extack))
                return -EOPNOTSUPP;