This commit adds TCP data offset, IPv4 total length, IPv4 IHL, IPv6 payload length in modify field operation.
Signed-off-by: Suanming Mou <suanmi...@nvidia.com> --- drivers/common/mlx5/mlx5_prm.h | 4 ++++ drivers/net/mlx5/mlx5_flow_dv.c | 40 +++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h index 9e22dce6da..0d46ba9c40 100644 --- a/drivers/common/mlx5/mlx5_prm.h +++ b/drivers/common/mlx5/mlx5_prm.h @@ -848,6 +848,10 @@ enum mlx5_modification_field { MLX5_MODI_META_REG_C_13 = 0x94, MLX5_MODI_META_REG_C_14 = 0x95, MLX5_MODI_META_REG_C_15 = 0x96, + MLX5_MODI_OUT_IPV4_TOTAL_LEN = 0x11D, + MLX5_MODI_OUT_IPV6_PAYLOAD_LEN = 0x11E, + MLX5_MODI_OUT_IPV4_IHL = 0x11F, + MLX5_MODI_OUT_TCP_DATA_OFFSET = 0x120, MLX5_MODI_INVALID = INT_MAX, }; diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 115d730317..4e2095dcfe 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -1664,6 +1664,16 @@ mlx5_flow_field_id_to_modify_info else info[idx].offset = off_be; break; + case RTE_FLOW_FIELD_IPV4_IHL: + MLX5_ASSERT(data->offset + width <= 4); + off_be = 4 - (data->offset + width); + info[idx] = (struct field_modify_info){1, 0, + MLX5_MODI_OUT_IPV4_IHL}; + if (mask) + mask[idx] = flow_modify_info_mask_8(width, off_be); + else + info[idx].offset = off_be; + break; case RTE_FLOW_FIELD_IPV4_DSCP: MLX5_ASSERT(data->offset + width <= 6); off_be = 6 - (data->offset + width); @@ -1674,6 +1684,16 @@ mlx5_flow_field_id_to_modify_info else info[idx].offset = off_be; break; + case RTE_FLOW_FIELD_IPV4_TOTAL_LEN: + MLX5_ASSERT(data->offset + width <= 16); + off_be = 16 - (data->offset + width); + info[idx] = (struct field_modify_info){2, 0, + MLX5_MODI_OUT_IPV4_TOTAL_LEN}; + if (mask) + mask[idx] = flow_modify_info_mask_16(width, off_be); + else + info[idx].offset = off_be; + break; case RTE_FLOW_FIELD_IPV4_TTL: MLX5_ASSERT(data->offset + width <= 8); off_be = 8 - (data->offset + width); @@ -1714,6 +1734,16 @@ mlx5_flow_field_id_to_modify_info else info[idx].offset = off_be; break; + case RTE_FLOW_FIELD_IPV6_PAYLOAD_LEN: + MLX5_ASSERT(data->offset + width <= 16); + off_be = 16 - (data->offset + width); + info[idx] = (struct field_modify_info){2, 0, + MLX5_MODI_OUT_IPV6_PAYLOAD_LEN}; + if (mask) + mask[idx] = flow_modify_info_mask_16(width, off_be); + else + info[idx].offset = off_be; + break; case RTE_FLOW_FIELD_IPV6_HOPLIMIT: MLX5_ASSERT(data->offset + width <= 8); off_be = 8 - (data->offset + width); @@ -1860,6 +1890,16 @@ mlx5_flow_field_id_to_modify_info else info[idx].offset = off_be; break; + case RTE_FLOW_FIELD_TCP_DATA_OFFSET: + MLX5_ASSERT(data->offset + width <= 4); + off_be = 4 - (data->offset + width); + info[idx] = (struct field_modify_info){1, 0, + MLX5_MODI_OUT_TCP_DATA_OFFSET}; + if (mask) + mask[idx] = flow_modify_info_mask_8(width, off_be); + else + info[idx].offset = off_be; + break; case RTE_FLOW_FIELD_UDP_PORT_SRC: MLX5_ASSERT(data->offset + width <= 16); off_be = 16 - (data->offset + width); -- 2.34.1