[PATCH v2 02/25] net/intel/common: add common flow attr validation
Anatoly Burakov
anatoly.burakov at intel.com
Mon Mar 16 11:52:27 CET 2026
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 <anatoly.burakov at intel.com>
---
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 69b1b60ffc..9df7c39a7e 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.
@@ -230,6 +231,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
More information about the dev
mailing list