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: Yevgeny Kliteynik <kliteyn@nvidia.com>
This commit is contained in:
parent
cc2295cd54
commit
4ff725e1d4
2 changed files with 19 additions and 4 deletions
|
@ -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,
|
||||||
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,
|
||||||
* 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,
|
||||||
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 {
|
||||||
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];
|
||||||
|
|
Loading…
Add table
Reference in a new issue