]> git.itanic.dy.fi Git - linux-stable/commitdiff
net/mlx5: DR, Ignore modify TTL if device doesn't support it
authorYevgeny Kliteynik <kliteyn@nvidia.com>
Tue, 23 Nov 2021 00:11:12 +0000 (02:11 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 31 Dec 2021 08:17:41 +0000 (00:17 -0800)
When modifying TTL, packet's csum has to be recalculated.
Due to HW issue in ConnectX-5, csum recalculation for modify TTL
is supported through a work-around that is specifically enabled
by configuration.
If the work-around isn't enabled, ignore the modify TTL action
rather than adding an unsupported action.

Signed-off-by: Yevgeny Kliteynik <kliteyn@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c
include/linux/mlx5/mlx5_ifc.h

index f0faf04536d3a4c8a6eded74ceb09efddcd66f53..c61a5e83c78c42844c7559f906c1b5c37ed29a53 100644 (file)
@@ -1560,6 +1560,12 @@ dr_action_modify_check_is_ttl_modify(const void *sw_action)
        return sw_field == MLX5_ACTION_IN_FIELD_OUT_IP_TTL;
 }
 
+static bool dr_action_modify_ttl_ignore(struct mlx5dr_domain *dmn)
+{
+       return !mlx5dr_ste_supp_ttl_cs_recalc(&dmn->info.caps) &&
+              !MLX5_CAP_ESW_FLOWTABLE(dmn->mdev, fdb_ipv4_ttl_modify);
+}
+
 static int dr_actions_convert_modify_header(struct mlx5dr_action *action,
                                            u32 max_hw_actions,
                                            u32 num_sw_actions,
@@ -1591,8 +1597,13 @@ static int dr_actions_convert_modify_header(struct mlx5dr_action *action,
                if (ret)
                        return ret;
 
-               if (!(*modify_ttl))
-                       *modify_ttl = dr_action_modify_check_is_ttl_modify(sw_action);
+               if (!(*modify_ttl) &&
+                   dr_action_modify_check_is_ttl_modify(sw_action)) {
+                       if (dr_action_modify_ttl_ignore(dmn))
+                               continue;
+
+                       *modify_ttl = true;
+               }
 
                /* Convert SW action to HW action */
                ret = dr_action_modify_sw_to_hw(dmn,
@@ -1631,7 +1642,7 @@ static int dr_actions_convert_modify_header(struct mlx5dr_action *action,
                         * modify actions doesn't exceeds the limit
                         */
                        hw_idx++;
-                       if ((num_sw_actions + hw_idx - i) >= max_hw_actions) {
+                       if (hw_idx >= max_hw_actions) {
                                mlx5dr_dbg(dmn, "Modify header action number exceeds HW limit\n");
                                return -EINVAL;
                        }
@@ -1642,6 +1653,10 @@ static int dr_actions_convert_modify_header(struct mlx5dr_action *action,
                hw_idx++;
        }
 
+       /* if the resulting HW actions list is empty, add NOP action */
+       if (!hw_idx)
+               hw_idx++;
+
        *num_hw_actions = hw_idx;
 
        return 0;
index deaa0f71213fc78cd71a99419f47e611966c72c8..598ac3bcc901ff4cffbfbb29b614c02c48e84337 100644 (file)
@@ -833,7 +833,7 @@ struct mlx5_ifc_flow_table_eswitch_cap_bits {
        u8      fdb_to_vport_reg_c_id[0x8];
        u8      reserved_at_8[0xd];
        u8      fdb_modify_header_fwd_to_table[0x1];
-       u8      reserved_at_16[0x1];
+       u8      fdb_ipv4_ttl_modify[0x1];
        u8      flow_source[0x1];
        u8      reserved_at_18[0x2];
        u8      multi_fdb_encap[0x1];