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

Reply via email to