Add support for GENEVE VNI field modification. The support is only using HW steering.
Signed-off-by: Michael Baum <michae...@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 b946ce00c2..fceb5bd58b 100644 --- a/doc/guides/nics/mlx5.rst +++ b/doc/guides/nics/mlx5.rst @@ -577,7 +577,11 @@ 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. + - 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 bedef2a4c0..8a99d6bfa4 100644 --- a/doc/guides/rel_notes/release_24_03.rst +++ b/doc/guides/rel_notes/release_24_03.rst @@ -59,6 +59,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 72e0d82e7b..bb3d7ddc3c 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -1881,6 +1881,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; @@ -1891,9 +1892,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 7c786c432f..22ac4e0a7c 100644 --- a/drivers/net/mlx5/mlx5_flow_hw.c +++ b/drivers/net/mlx5/mlx5_flow_hw.c @@ -4952,6 +4952,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) @@ -5047,10 +5049,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 vlan_type 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