Extend rte_flow_conv() to support working only on item's mask.
This allows drivers to get only the mask's size when working on pattern
templates and duplicate items having only the mask in a generic way.

Signed-off-by: Dariusz Sosnowski <dsosnow...@nvidia.com>
Acked-by: Ori Kam <or...@nvidia.com>
---
 lib/ethdev/rte_flow.c | 15 +++++++++++++--
 lib/ethdev/rte_flow.h | 12 ++++++++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c
index 7ab1100ea0..ca2f85c3fa 100644
--- a/lib/ethdev/rte_flow.c
+++ b/lib/ethdev/rte_flow.c
@@ -60,9 +60,10 @@ rte_flow_conv_copy(void *buf, const void *data, const size_t 
size,
        bool rte_type = type >= 0;
 
        size_t sz = rte_type ? desc[type].size : sizeof(void *);
-       if (buf == NULL || data == NULL)
+       if (data == NULL)
                return 0;
-       rte_memcpy(buf, data, (size > sz ? sz : size));
+       if (buf != NULL)
+               rte_memcpy(buf, data, (size > sz ? sz : size));
        if (rte_type && desc[type].desc_fn)
                sz += desc[type].desc_fn(size > 0 ? buf : NULL, data);
        return sz;
@@ -1090,6 +1091,7 @@ rte_flow_conv(enum rte_flow_conv_op op,
 
        switch (op) {
                const struct rte_flow_attr *attr;
+               const struct rte_flow_item *item;
 
        case RTE_FLOW_CONV_OP_NONE:
                ret = 0;
@@ -1104,6 +1106,15 @@ rte_flow_conv(enum rte_flow_conv_op op,
        case RTE_FLOW_CONV_OP_ITEM:
                ret = rte_flow_conv_pattern(dst, size, src, 1, error);
                break;
+       case RTE_FLOW_CONV_OP_ITEM_MASK:
+               item = src;
+               if (item->mask == NULL) {
+                       ret = rte_flow_error_set(error, EINVAL, 
RTE_FLOW_ERROR_TYPE_ITEM_MASK,
+                                                item, "Mask not provided");
+                       break;
+               }
+               ret = rte_flow_conv_item_spec(dst, size, src, 
RTE_FLOW_CONV_ITEM_MASK);
+               break;
        case RTE_FLOW_CONV_OP_ACTION:
                ret = rte_flow_conv_actions(dst, size, src, 1, error);
                break;
diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
index 6e8ab1d4c7..35f180e735 100644
--- a/lib/ethdev/rte_flow.h
+++ b/lib/ethdev/rte_flow.h
@@ -4409,6 +4409,18 @@ enum rte_flow_conv_op {
         */
        RTE_FLOW_CONV_OP_ITEM,
 
+       /**
+        * Convert a single item mask.
+        *
+        * Duplicates only @p mask.
+        *
+        * - @p src type:
+        *   @code const struct rte_flow_item * @endcode
+        * - @p dst type:
+        *   @code struct rte_flow_item * @endcode
+        */
+       RTE_FLOW_CONV_OP_ITEM_MASK,
+
        /**
         * Convert a single action.
         *
-- 
2.39.2

Reply via email to