Add support for GENEVE VNI field modification.
The support is only using HW steering.
Signed-off-by: Michael Baum <michaelba@nvidia.com>
Acked-by: Suanming Mou <suanmingm@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(-)
@@ -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``
@@ -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
@@ -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);
@@ -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,