validate actions in HWS table
cover validate actions in HWS table
Validate flow actions before creation of HWS template table.
Gregory Etelson (2):
net/mlx5: fix access to PMD template API net/mlx5: validate flow actions in table creation
drivers/net/mlx5/mlx5.h | 13 + drivers/net/mlx5/mlx5_flow.c | 15 +- drivers/net/mlx5/mlx5_flow.h | 33 ++- drivers/net/mlx5/mlx5_flow_dv.c | 20 +- drivers/net/mlx5/mlx5_flow_hw.c | 453 +++++++++++++++++++++++++---- drivers/net/mlx5/mlx5_flow_verbs.c | 2 +- 6 files changed, 467 insertions(+), 69 deletions(-)
Signature · 1 line
2.43.0
PATCH 1/2 net/mlx5: fix access to PMD template API
PMD activates HWS template API context during port configuration.
There was no validation that the HWS context was activated before the PMD tried to process other template function calls.
The patch adds HWS context validation.
--- drivers/net/mlx5/mlx5_flow_hw.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
drivers/net/mlx5/mlx5_flow_hw.c +22 -0
@@ -206,6 +206,20 @@ mlx5_destroy_multi_pattern_segment(struct mlx5_multi_pattern_segment *segment); static __rte_always_inline enum mlx5_indirect_list_typeflow_hw_inlist_type_get (const struct rte_flow_action *actions); +static bool +mlx5_hw_ctx_validate (const struct rte_eth_dev *dev,struct rte_flow_error *error) +{ +const struct mlx5_priv *priv = dev->data->dev_private; + +if (!priv->dr_ctx) { +rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_UNSPECIFIED ,NULL , +"non-template flow engine was not configured" ); +return false; + } +return true; +} + static __rte_always_inline intmlx5_multi_pattern_reformat_to_index (enum mlx5dr_action_type type) {
@@ -6384,6 +6398,8 @@ mlx5_flow_hw_actions_validate(struct rte_eth_dev *dev,int ret;const struct rte_flow_action_ipv6_ext_remove *remove_data; +if (!mlx5_hw_ctx_validate (dev, error)) +return -rte_errno;/* FDB actions are only valid to proxy port. */ if (attr->transfer && (!priv->sh->config.dv_esw_en || !priv->master)) return rte_flow_error_set(error, EINVAL,
@@ -7508,6 +7524,8 @@ flow_hw_pattern_validate(struct rte_eth_dev *dev,uint32_t tag_bitmap =0 ;int ret; +if (!mlx5_hw_ctx_validate (dev, error)) +return -rte_errno;if (!attr->ingress && !attr->egress && !attr->transfer)return rte_flow_error_set (error,EINVAL ,RTE_FLOW_ERROR_TYPE_ATTR ,NULL , "at least one of the direction attributes"
@@ -11229,6 +11247,8 @@ flow_hw_action_handle_create(struct rte_eth_dev *dev, uint32_t queue,bool aso = false;bool force_job = action->type ==RTE_FLOW_ACTION_TYPE_METER_MARK ; +if (!mlx5_hw_ctx_validate (dev, error)) +return NULL ;if (attr || force_job) { job = flow_hw_action_job_init(priv, queue, NULL, user_data, NULL, MLX5_HW_Q_JOB_TYPE_CREATE,
@@ -12511,6 +12531,8 @@ flow_hw_async_action_list_handle_create(struct rte_eth_dev *dev, uint32_t queue, } }; +if (!mlx5_hw_ctx_validate (dev, error)) +return NULL ;if (!actions) {rte_flow_error_set (error,EINVAL ,RTE_FLOW_ERROR_TYPE_ACTION ,NULL ,"No action list" );
Signature · 1 line
2.43.0
PATCH 2/2 net/mlx5: validate flow actions in table creation
In reply to Gregory EtelsonAdd basic actions validation before creating flow table.
--- drivers/net/mlx5/mlx5.h | 13 + drivers/net/mlx5/mlx5_flow.c | 15 +- drivers/net/mlx5/mlx5_flow.h | 33 ++- drivers/net/mlx5/mlx5_flow_dv.c | 20 +- drivers/net/mlx5/mlx5_flow_hw.c | 431 +++++++++++++++++++++++++---- drivers/net/mlx5/mlx5_flow_verbs.c | 2 +- 6 files changed, 445 insertions(+), 69 deletions(-)
drivers/net/mlx5/mlx5.h +13 -0
@@ -2010,6 +2010,19 @@ struct mlx5_priv {RTE_ATOMIC (uint16_t ) shared_refcnt;/* HW steering host reference counter. */ }; +static __rte_always_inline bool +mlx5_hws_active (const struct rte_eth_dev *dev) +{ +#if defined(HAVE_MLX5_HWS_SUPPORT ) +const struct mlx5_priv *priv = dev->data->dev_private; + +return priv->sh->config.dv_flow_en ==2 ; +#else +RTE_SET_USED (dev); +return false; +#endif +} +#define PORT_ID (priv) ((priv)->dev_data->port_id)#define ETH_DEV (priv) (&rte_eth_devices[PORT_ID(priv)])#define CTRL_QUEUE_ID (priv) ((priv)->nb_queue - 1)
drivers/net/mlx5/mlx5_flow.c +14 -1
@@ -1939,7 +1939,8 @@ mlx5_flow_validate_action_flag(uint64_t action_flags,* 0 on success, a negative errno value otherwise and rte_errno is set. */ int -mlx5_flow_validate_action_mark (const struct rte_flow_action *action, +mlx5_flow_validate_action_mark (struct rte_eth_dev *dev, +const struct rte_flow_action *action,uint64_t action_flags,const struct rte_flow_attr *attr,struct rte_flow_error *error)
@@ -1971,6 +1972,10 @@ mlx5_flow_validate_action_mark(const struct rte_flow_action *action,RTE_FLOW_ERROR_TYPE_ATTR_EGRESS ,NULL ,"mark action not supported for " "egress"); +if (attr->transfer &&mlx5_hws_active (dev)) +return rte_flow_error_set (error,ENOTSUP , +RTE_FLOW_ERROR_TYPE_ATTR_EGRESS ,NULL , +"non-template mark action not supported for transfer" );return 0 ; }
@@ -2039,6 +2044,10 @@ mlx5_flow_validate_action_queue(const struct rte_flow_action *action,struct mlx5_priv *priv = dev->data->dev_private;const struct rte_flow_action_queue *queue = action->conf; +if (!queue) +return rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_ACTION , action, +"no QUEUE action configuration" );if (action_flags &MLX5_FLOW_FATE_ACTIONS ) return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, NULL,
@@ -2152,6 +2161,10 @@ mlx5_validate_action_rss(struct rte_eth_dev *dev,const char *message;uint32_t queue_idx; +if (!rss) +return rte_flow_error_set + (error,EINVAL ,RTE_FLOW_ERROR_TYPE_ACTION , + action,"no RSS action configuration" );if (rss->func ==RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ ) {DRV_LOG (WARNING ,"port %u symmetric RSS supported with SORT" , dev->data->port_id);
drivers/net/mlx5/mlx5_flow.h +32 -1
@@ -2874,7 +2874,8 @@ int mlx5_flow_validate_action_drop(struct rte_eth_dev *dev,int mlx5_flow_validate_action_flag (uint64_t action_flags,const struct rte_flow_attr *attr,struct rte_flow_error *error); -int mlx5_flow_validate_action_mark (const struct rte_flow_action *action, +int mlx5_flow_validate_action_mark (struct rte_eth_dev *dev, +const struct rte_flow_action *action,uint64_t action_flags,const struct rte_flow_attr *attr,struct rte_flow_error *error);
@@ -2895,6 +2896,33 @@ int mlx5_flow_validate_action_default_miss(uint64_t action_flags,int flow_validate_modify_field_level (const struct rte_flow_field_data *data,struct rte_flow_error *error); +int +flow_dv_validate_action_l2_encap (struct rte_eth_dev *dev, +uint64_t action_flags, +const struct rte_flow_action *action, +const struct rte_flow_attr *attr, +struct rte_flow_error *error); +int +flow_dv_validate_action_decap (struct rte_eth_dev *dev, +uint64_t action_flags, +const struct rte_flow_action *action, +const uint64_t item_flags, +const struct rte_flow_attr *attr, +struct rte_flow_error *error); +int +flow_dv_validate_action_aso_ct (struct rte_eth_dev *dev, +uint64_t action_flags, +uint64_t item_flags, +bool root, +struct rte_flow_error *error); +int +flow_dv_validate_action_raw_encap_decap + (struct rte_eth_dev *dev, +const struct rte_flow_action_raw_decap *decap, +const struct rte_flow_action_raw_encap *encap, +const struct rte_flow_attr *attr,uint64_t *action_flags, +int *actions_n,const struct rte_flow_action *action, +uint64_t item_flags,struct rte_flow_error *error); int mlx5_flow_item_acceptable(const struct rte_flow_item *item, const uint8_t *mask, const uint8_t *nic_mask,
@@ -3348,5 +3376,8 @@ mlx5_destroy_legacy_indirect(struct rte_eth_dev *dev,void mlx5_hw_decap_encap_destroy (struct rte_eth_dev *dev,struct mlx5_indirect_list *reformat); + +extern const struct rte_flow_action_raw_decap empty_decap; +#endif #endif /* RTE_PMD_MLX5_FLOW_H_ */
drivers/net/mlx5/mlx5_flow_dv.c +11 -9
@@ -3659,7 +3659,7 @@ flow_dv_validate_action_mark(struct rte_eth_dev *dev, "if tunnel offload active");/* Fall back if no extended metadata register support. */ if (config->dv_xmeta_en ==MLX5_XMETA_MODE_LEGACY ) -return mlx5_flow_validate_action_mark (action, action_flags, +return mlx5_flow_validate_action_mark (dev, action, action_flags, attr, error);/* Extensive metadata mode requires registers. */ if (!mlx5_flow_ext_mreg_supported (dev))
@@ -3898,7 +3898,7 @@ flow_dv_validate_action_count(struct rte_eth_dev *dev, bool shared,* @return * 0 on success, a negative errno value otherwise and rte_errno is set. */ -static int +int flow_dv_validate_action_l2_encap(struct rte_eth_dev *dev, uint64_t action_flags, const struct rte_flow_action *action,
@@ -3943,7 +3943,7 @@ flow_dv_validate_action_l2_encap(struct rte_eth_dev *dev,* @return * 0 on success, a negative errno value otherwise and rte_errno is set. */ -static int +int flow_dv_validate_action_decap(struct rte_eth_dev *dev, uint64_t action_flags, const struct rte_flow_action *action,
@@ -4016,7 +4016,7 @@ const struct rte_flow_action_raw_decap empty_decap = {.data = NULL, .size = 0,};* @return * 0 on success, a negative errno value otherwise and rte_errno is set. */ -static int +int flow_dv_validate_action_raw_encap_decap (struct rte_eth_dev *dev, const struct rte_flow_action_raw_decap *decap,
@@ -4105,7 +4105,7 @@ flow_dv_validate_action_raw_encap_decap* @return * 0 on success, a negative errno value otherwise and rte_errno is set. */ -static int +int flow_dv_validate_action_aso_ct(struct rte_eth_dev *dev, uint64_t action_flags, uint64_t item_flags,
@@ -4124,10 +4124,12 @@ flow_dv_validate_action_aso_ct(struct rte_eth_dev *dev,RTE_FLOW_ERROR_TYPE_ACTION ,NULL , "CT cannot follow a fate action");if ((action_flags &MLX5_FLOW_ACTION_METER ) || - (action_flags &MLX5_FLOW_ACTION_AGE )) -return rte_flow_error_set (error,EINVAL , -RTE_FLOW_ERROR_TYPE_ACTION ,NULL , -"Only one ASO action is supported" ); + (action_flags &MLX5_FLOW_ACTION_AGE )) { +if (!mlx5_hws_active (dev)) +return rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_ACTION , +NULL ,"Only one ASO action is supported" ); + }if (action_flags &MLX5_FLOW_ACTION_ENCAP ) return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, NULL,
drivers/net/mlx5/mlx5_flow_hw.c +374 -57
494 lines not on this page · raw message
drivers/net/mlx5/mlx5_flow_verbs.c +1 -1
@@ -1522,7 +1522,7 @@ flow_verbs_validate(struct rte_eth_dev *dev, action_flags |=MLX5_FLOW_ACTION_FLAG ;break ;case RTE_FLOW_ACTION_TYPE_MARK : - ret =mlx5_flow_validate_action_mark (actions, + ret =mlx5_flow_validate_action_mark (dev, actions, action_flags, attr, error);
Signature · 1 line
2.43.0
Hi,
From: Gregory Etelson <[email protected]>
Sent: Sunday, June 2, 2024 9:00 AM
To: [email protected]
Cc: Gregory Etelson; Maayan Kashani; Raslan Darawsheh; Dariusz Sosnowski
Subject: [PATCH 0/2] validate actions in HWS table
Validate flow actions before creation of HWS template table.
Gregory Etelson (2):
net/mlx5: fix access to PMD template API net/mlx5: validate flow actions in table creation
drivers/net/mlx5/mlx5.h | 13 + drivers/net/mlx5/mlx5_flow.c | 15 +- drivers/net/mlx5/mlx5_flow.h | 33 ++- drivers/net/mlx5/mlx5_flow_dv.c | 20 +- drivers/net/mlx5/mlx5_flow_hw.c | 453 +++++++++++++++++++++++++---- drivers/net/mlx5/mlx5_flow_verbs.c | 2 +- 6 files changed, 467 insertions(+), 69 deletions(-)
Series applied to next-net-mlx,
Kindest regards,
Raslan Darawsheh