Add support for GENEVE VNI field modification. The support is only using HW steering.
Signed-off-by: Michael Baum <michae...@nvidia.com> Acked-by: Suanming Mou <suanmi...@nvidia.com> --- doc/guides/nics/mlx5.rst | 6 +++++- doc/guides/rel_notes/release_24_03.rst | 1 + drivers/net/mlx5/mlx5_flow_dv.c | 4 +--- drivers/net/mlx5/mlx5_flow_hw.c | 12 ++++++++++-- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst index a6d00ecd2b..0e3d0bc099 100644 --- a/doc/guides/nics/mlx5.rst +++ b/doc/guides/nics/mlx5.rst @@ -585,8 +585,12 @@ Limitations - Modification of an arbitrary place in a packet via the special ``RTE_FLOW_FIELD_START`` Field ID is not supported. - Modification of the MPLS header is supported only in HWS and only to copy from, the encapsulation level is always 0. - - Modification of the 802.1Q Tag, VXLAN Network or GENEVE Network ID's is not supported. - Modify field action using ``RTE_FLOW_FIELD_RANDOM`` is not supported. + - Modification of the 802.1Q Tag is not supported. + - Modification of VXLAN Network or GENEVE Network ID's is supported only for HW steering. + - Modification of GENEVE Network ID's is not supported when configured + ``FLEX_PARSER_PROFILE_ENABLE`` supports Geneve TLV options. + See :ref:`mlx5_firmware_config` for more flex parser information. - Encapsulation levels are not supported, can modify outermost header fields only. - Offsets cannot skip past the boundary of a field. - If the field type is ``RTE_FLOW_FIELD_MAC_TYPE`` diff --git a/doc/guides/rel_notes/release_24_03.rst b/doc/guides/rel_notes/release_24_03.rst index 0c8491ce37..8b14ab8986 100644 --- a/doc/guides/rel_notes/release_24_03.rst +++ b/doc/guides/rel_notes/release_24_03.rst @@ -80,6 +80,7 @@ New Features * Added HW steering support for ``RTE_FLOW_ITEM_TYPE_GENEVE`` flow item. * Added HW steering support for ``RTE_FLOW_ITEM_TYPE_GENEVE_OPT`` flow item. + * Added HW steering support for modify field ``RTE_FLOW_FIELD_GENEVE_VNI`` flow action. Removed Items diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 857813368b..5d5e2cadf6 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -1957,6 +1957,7 @@ mlx5_flow_field_id_to_modify_info info[idx].offset = off_be; break; case RTE_FLOW_FIELD_VXLAN_VNI: + case RTE_FLOW_FIELD_GENEVE_VNI: MLX5_ASSERT(data->offset + width <= 24); /* VNI is on bits 31-8 of TUNNEL_HDR_DW_1. */ off_be = 24 - (data->offset + width) + 8; @@ -1967,9 +1968,6 @@ mlx5_flow_field_id_to_modify_info else info[idx].offset = off_be; break; - case RTE_FLOW_FIELD_GENEVE_VNI: - /* not supported yet*/ - break; case RTE_FLOW_FIELD_GTP_TEID: MLX5_ASSERT(data->offset + width <= 32); off_be = 32 - (data->offset + width); diff --git a/drivers/net/mlx5/mlx5_flow_hw.c b/drivers/net/mlx5/mlx5_flow_hw.c index 00dc9bc890..687d809b1b 100644 --- a/drivers/net/mlx5/mlx5_flow_hw.c +++ b/drivers/net/mlx5/mlx5_flow_hw.c @@ -4990,6 +4990,8 @@ flow_hw_validate_action_modify_field(struct rte_eth_dev *dev, { const struct rte_flow_action_modify_field *action_conf = action->conf; const struct rte_flow_action_modify_field *mask_conf = mask->conf; + struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_hca_attr *attr = &priv->sh->cdev->config.hca_attr; int ret; if (!mask_conf) @@ -5089,10 +5091,16 @@ flow_hw_validate_action_modify_field(struct rte_eth_dev *dev, return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, action, "modifying random value is not supported"); - if (flow_hw_modify_field_is_used(action_conf, RTE_FLOW_FIELD_GENEVE_VNI)) + /** + * Geneve VNI modification is supported only when Geneve header is + * parsed natively. When GENEVE options are supported, they both Geneve + * and options headers are parsed as a flex parser. + */ + if (flow_hw_modify_field_is_used(action_conf, RTE_FLOW_FIELD_GENEVE_VNI) && + attr->geneve_tlv_opt) return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, action, - "modifying Geneve VNI is not supported"); + "modifying Geneve VNI is not supported when GENEVE opt is supported"); /* Due to HW bug, tunnel MPLS header is read only. */ if (action_conf->dst.field == RTE_FLOW_FIELD_MPLS) return rte_flow_error_set(error, EINVAL, -- 2.25.1