There are a lot of commonalities between what kinds of flow attr each Intel driver supports. Add a helper function that will validate attr based on common requirements and (optional) parameter checks.
Things we check for: - Rejecting NULL attr (obviously) - Default to ingress flows - Transfer, group, priority, and egress are not allowed unless requested Signed-off-by: Anatoly Burakov <[email protected]> --- drivers/net/intel/common/flow_check.h | 70 +++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/drivers/net/intel/common/flow_check.h b/drivers/net/intel/common/flow_check.h index 1916ac169c..b7c73fcf7c 100644 --- a/drivers/net/intel/common/flow_check.h +++ b/drivers/net/intel/common/flow_check.h @@ -53,6 +53,7 @@ ci_flow_action_type_in_list(const enum rte_flow_action_type type, /* Forward declarations */ struct ci_flow_actions; struct ci_flow_actions_check_param; +struct ci_flow_attr_check_param; /** * Driver-specific action list validation callback. @@ -231,6 +232,75 @@ ci_flow_check_actions(const struct rte_flow_action *actions, return parsed_actions->count == 0 ? -EINVAL : 0; } +/** + * Parameter structure for attr check. + */ +struct ci_flow_attr_check_param { + bool allow_priority; /**< True if priority attribute is allowed. */ + bool allow_transfer; /**< True if transfer attribute is allowed. */ + bool allow_group; /**< True if group attribute is allowed. */ + bool expect_egress; /**< True if egress attribute is expected. */ +}; + +/** + * Validate rte_flow_attr structure against specified constraints. + * + * @param attr Pointer to rte_flow_attr structure to validate. + * @param attr_param Pointer to ci_flow_attr_check_param structure specifying constraints. + * @param error Pointer to rte_flow_error structure for error reporting. + * + * @return 0 on success, negative errno on failure. + */ +__rte_internal +static inline int +ci_flow_check_attr(const struct rte_flow_attr *attr, + const struct ci_flow_attr_check_param *attr_param, + struct rte_flow_error *error) +{ + if (attr == NULL) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ATTR, attr, + "NULL attribute"); + } + + /* Direction must be either ingress or egress */ + if (attr->ingress == attr->egress) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ATTR, attr, + "Either ingress or egress must be set"); + } + + /* Expect ingress by default */ + if (attr->egress && (attr_param == NULL || !attr_param->expect_egress)) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, attr, + "Egress not supported"); + } + + /* May not be supported */ + if (attr->transfer && (attr_param == NULL || !attr_param->allow_transfer)) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ATTR_TRANSFER, attr, + "Transfer not supported"); + } + + /* May not be supported */ + if (attr->group && (attr_param == NULL || !attr_param->allow_group)) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ATTR_GROUP, attr, + "Group not supported"); + } + + /* May not be supported */ + if (attr->priority && (attr_param == NULL || !attr_param->allow_priority)) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, attr, + "Priority not supported"); + } + + return 0; +} + #ifdef __cplusplus } #endif -- 2.47.3

