net/mlx5: add MPLS modify field support
RFC 1/1 net/mlx5: add MPLS modify field support
Add support for modify field in tunnel MPLS header. For now it is supported only to copy from.
Signed-off-by Michael Baum <[email protected]>
--- drivers/common/mlx5/mlx5_prm.h | 5 +++++ drivers/net/mlx5/mlx5_flow_dv.c | 23 +++++++++++++++++++++++ drivers/net/mlx5/mlx5_flow_hw.c | 16 +++++++++------- 3 files changed, 37 insertions(+), 7 deletions(-)
drivers/common/mlx5/mlx5_prm.h +5 -0
@@ -787,6 +787,11 @@ enum mlx5_modification_field {MLX5_MODI_TUNNEL_HDR_DW_1 =0x75 ,MLX5_MODI_GTPU_FIRST_EXT_DW_0 =0x76 ,MLX5_MODI_HASH_RESULT =0x81 , +MLX5_MODI_IN_MPLS_LABEL_0 =0x8a , +MLX5_MODI_IN_MPLS_LABEL_1 , +MLX5_MODI_IN_MPLS_LABEL_2 , +MLX5_MODI_IN_MPLS_LABEL_3 , +MLX5_MODI_IN_MPLS_LABEL_4 ,MLX5_MODI_OUT_IPV6_NEXT_HDR =0x4A , MLX5_MODI_INVALID = INT_MAX, };
drivers/net/mlx5/mlx5_flow_dv.c +23 -0
@@ -1388,6 +1388,7 @@ mlx5_flow_item_field_width(struct rte_eth_dev *dev,case RTE_FLOW_FIELD_GENEVE_VNI :return 24 ;case RTE_FLOW_FIELD_GTP_TEID : +case RTE_FLOW_FIELD_MPLS :case RTE_FLOW_FIELD_TAG :return 32 ;case RTE_FLOW_FIELD_MARK :
@@ -1435,6 +1436,12 @@ flow_modify_info_mask_32_masked(uint32_t length, uint32_t off, uint32_t post_masreturn rte_cpu_to_be_32 (mask & post_mask); } +static __rte_always_inline enum mlx5_modification_field +mlx5_mpls_modi_field_get (const struct rte_flow_action_modify_data *data) +{ +return MLX5_MODI_IN_MPLS_LABEL_0 + data->sub_level; +} + static void mlx5_modify_flex_item(const struct rte_eth_dev *dev, const struct mlx5_flex_item *flex,
@@ -1893,6 +1900,16 @@ mlx5_flow_field_id_to_modify_infoelse info[idx].offset = off_be;break ; +case RTE_FLOW_FIELD_MPLS : +MLX5_ASSERT (data->offset + width <=32 ); + off_be =32 - (data->offset + width); + info[idx] = (struct field_modify_info ){4 ,0 , +mlx5_mpls_modi_field_get (data)}; +if (mask) + mask[idx] =flow_modify_info_mask_32 (width, off_be); +else + info[idx].offset = off_be; +break ;case RTE_FLOW_FIELD_TAG : {MLX5_ASSERT (data->offset + width <=32 );
@@ -5344,6 +5361,12 @@ flow_dv_validate_action_modify_field(struct rte_eth_dev *dev,RTE_FLOW_ERROR_TYPE_ACTION , action,"modifications of the GENEVE Network" " Identifier is not supported"); +if (action_modify_field->dst.field ==RTE_FLOW_FIELD_MPLS || + action_modify_field->src.field ==RTE_FLOW_FIELD_MPLS ) +return rte_flow_error_set (error,ENOTSUP , +RTE_FLOW_ERROR_TYPE_ACTION , action, +"modifications of the MPLS header " +"is not supported" );if (action_modify_field->dst.field ==RTE_FLOW_FIELD_MARK || action_modify_field->src.field ==RTE_FLOW_FIELD_MARK ) if (config->dv_xmeta_en == MLX5_XMETA_MODE_LEGACY ||
drivers/net/mlx5/mlx5_flow_hw.c +9 -7
@@ -3546,10 +3546,8 @@ flow_hw_validate_action_modify_field(const struct rte_flow_action *action,const struct rte_flow_action *mask, struct rte_flow_error *error) { - const struct rte_flow_action_modify_field *action_conf = - action->conf; -const struct rte_flow_action_modify_field *mask_conf = - mask->conf; + const struct rte_flow_action_modify_field *action_conf = action->conf; +const struct rte_flow_action_modify_field *mask_conf = mask->conf; if (action_conf->operation != mask_conf->operation) return rte_flow_error_set(error, EINVAL,
@@ -3604,6 +3602,11 @@ flow_hw_validate_action_modify_field(const struct rte_flow_action *action,return rte_flow_error_set (error,EINVAL ,RTE_FLOW_ERROR_TYPE_ACTION , action,"modifying Geneve VNI is not 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 , +RTE_FLOW_ERROR_TYPE_ACTION , action, +"MPLS cannot be used as destination" );return 0 ; }
@@ -4134,9 +4137,8 @@ mlx5_flow_hw_actions_validate(struct rte_eth_dev *dev, action_flags |=MLX5_FLOW_ACTION_METER ;break ;case RTE_FLOW_ACTION_TYPE_MODIFY_FIELD : - ret =flow_hw_validate_action_modify_field (action, - mask, - error); + ret =flow_hw_validate_action_modify_field (action, mask, + error);if (ret <0 )return ret; action_flags |=MLX5_FLOW_ACTION_MODIFY_FIELD ;
Signature · 1 line
2.25.1