mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-12 21:44:06 +08:00
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
@ -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;
|
||||
|
@ -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];
|
||||
|
Loading…
Reference in New Issue
Block a user