Commit 4ff725e1 authored by Yevgeny Kliteynik's avatar Yevgeny Kliteynik Committed by Saeed Mahameed

net/mlx5: DR, Ignore modify TTL if device doesn't support it

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: default avatarYevgeny Kliteynik <kliteyn@nvidia.com>
parent cc2295cd
...@@ -1560,6 +1560,12 @@ dr_action_modify_check_is_ttl_modify(const void *sw_action) ...@@ -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; 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, static int dr_actions_convert_modify_header(struct mlx5dr_action *action,
u32 max_hw_actions, u32 max_hw_actions,
u32 num_sw_actions, u32 num_sw_actions,
...@@ -1591,8 +1597,13 @@ static int dr_actions_convert_modify_header(struct mlx5dr_action *action, ...@@ -1591,8 +1597,13 @@ static int dr_actions_convert_modify_header(struct mlx5dr_action *action,
if (ret) if (ret)
return ret; return ret;
if (!(*modify_ttl)) if (!(*modify_ttl) &&
*modify_ttl = dr_action_modify_check_is_ttl_modify(sw_action); 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 */ /* Convert SW action to HW action */
ret = dr_action_modify_sw_to_hw(dmn, ret = dr_action_modify_sw_to_hw(dmn,
...@@ -1631,7 +1642,7 @@ static int dr_actions_convert_modify_header(struct mlx5dr_action *action, ...@@ -1631,7 +1642,7 @@ static int dr_actions_convert_modify_header(struct mlx5dr_action *action,
* modify actions doesn't exceeds the limit * modify actions doesn't exceeds the limit
*/ */
hw_idx++; 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"); mlx5dr_dbg(dmn, "Modify header action number exceeds HW limit\n");
return -EINVAL; return -EINVAL;
} }
...@@ -1642,6 +1653,10 @@ static int dr_actions_convert_modify_header(struct mlx5dr_action *action, ...@@ -1642,6 +1653,10 @@ static int dr_actions_convert_modify_header(struct mlx5dr_action *action,
hw_idx++; hw_idx++;
} }
/* if the resulting HW actions list is empty, add NOP action */
if (!hw_idx)
hw_idx++;
*num_hw_actions = hw_idx; *num_hw_actions = hw_idx;
return 0; return 0;
......
...@@ -833,7 +833,7 @@ struct mlx5_ifc_flow_table_eswitch_cap_bits { ...@@ -833,7 +833,7 @@ struct mlx5_ifc_flow_table_eswitch_cap_bits {
u8 fdb_to_vport_reg_c_id[0x8]; u8 fdb_to_vport_reg_c_id[0x8];
u8 reserved_at_8[0xd]; u8 reserved_at_8[0xd];
u8 fdb_modify_header_fwd_to_table[0x1]; u8 fdb_modify_header_fwd_to_table[0x1];
u8 reserved_at_16[0x1]; u8 fdb_ipv4_ttl_modify[0x1];
u8 flow_source[0x1]; u8 flow_source[0x1];
u8 reserved_at_18[0x2]; u8 reserved_at_18[0x2];
u8 multi_fdb_encap[0x1]; u8 multi_fdb_encap[0x1];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment