Add RTE_FLOW_CONV_OP_ITEM_SIZE to retrieve the fixed specification structure size for a flow item type using the existing descriptor table.
Signed-off-by: Anatoly Burakov <[email protected]> --- lib/ethdev/rte_flow.c | 16 ++++++++++++++++ lib/ethdev/rte_flow.h | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c index 0ebf59165d4..1b2d263331a 100644 --- a/lib/ethdev/rte_flow.c +++ b/lib/ethdev/rte_flow.c @@ -1266,6 +1266,22 @@ rte_flow_conv(enum rte_flow_conv_op op, case RTE_FLOW_CONV_OP_ITEM_DEFAULT_MASK_PTR: ret = rte_flow_conv_item_default_mask(dst, size, src, error); break; + case RTE_FLOW_CONV_OP_ITEM_SIZE: + { + uintptr_t type = (uintptr_t)src; + + if (type >= RTE_DIM(rte_flow_desc_item) || + rte_flow_desc_item[type].name == NULL) { + ret = rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, + "unknown item type to retrieve the size of"); + break; + } + if (size >= sizeof(size_t)) + *(size_t *)dst = rte_flow_desc_item[type].size; + ret = sizeof(size_t); + break; + } default: ret = rte_flow_error_set (error, ENOTSUP, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index df8101e4395..3d6a56f51e3 100644 --- a/lib/ethdev/rte_flow.h +++ b/lib/ethdev/rte_flow.h @@ -4426,6 +4426,24 @@ enum rte_flow_conv_op { * @code const void ** @endcode */ RTE_FLOW_CONV_OP_ITEM_DEFAULT_MASK_PTR, + + /** + * Retrieve the fixed size of an item specification structure. + * + * Writes the size of rte_flow_item_{name} to @p dst, or zero for + * known item types without a specification structure. Does not include + * variable-length or externally referenced data (for example, RAW + * pattern bytes). Unknown and PMD-private item types return an error. + * + * No output is written if @p size is smaller than sizeof(size_t). + * The return value is sizeof(size_t), not the item structure size. + * + * - @p src type: + * @code (const void *)(uintptr_t)enum rte_flow_item_type @endcode + * - @p dst type: + * @code size_t * @endcode + */ + RTE_FLOW_CONV_OP_ITEM_SIZE, }; /** -- 2.52.0

