dma/ioat: add start and stop
[dpdk.git] / lib / ethdev / rte_flow.c
index c8e1240..bcf0513 100644 (file)
@@ -63,6 +63,19 @@ rte_flow_conv_copy(void *buf, const void *data, const size_t size,
        return sz;
 }
 
+static size_t
+rte_flow_item_flex_conv(void *buf, const void *data)
+{
+       struct rte_flow_item_flex *dst = buf;
+       const struct rte_flow_item_flex *src = data;
+       if (buf) {
+               dst->pattern = rte_memcpy
+                       ((void *)((uintptr_t)(dst + 1)), src->pattern,
+                        src->length);
+       }
+       return src->length;
+}
+
 /** Generate flow_item[] entry. */
 #define MK_FLOW_ITEM(t, s) \
        [RTE_FLOW_ITEM_TYPE_ ## t] = { \
@@ -141,6 +154,8 @@ static const struct rte_flow_desc_data rte_flow_desc_item[] = {
        MK_FLOW_ITEM(CONNTRACK, sizeof(uint32_t)),
        MK_FLOW_ITEM(PORT_REPRESENTOR, sizeof(struct rte_flow_item_ethdev)),
        MK_FLOW_ITEM(REPRESENTED_PORT, sizeof(struct rte_flow_item_ethdev)),
+       MK_FLOW_ITEM_FN(FLEX, sizeof(struct rte_flow_item_flex),
+                       rte_flow_item_flex_conv),
 };
 
 /** Generate flow_action[] entry. */
@@ -265,12 +280,12 @@ rte_flow_dynf_metadata_register(void)
        if (flag < 0)
                goto error;
        rte_flow_dynf_metadata_offs = offset;
-       rte_flow_dynf_metadata_mask = (1ULL << flag);
+       rte_flow_dynf_metadata_mask = RTE_BIT64(flag);
        return 0;
 
 error:
        rte_flow_dynf_metadata_offs = -1;
-       rte_flow_dynf_metadata_mask = 0ULL;
+       rte_flow_dynf_metadata_mask = UINT64_C(0);
        return -rte_errno;
 }
 
@@ -1332,3 +1347,43 @@ rte_flow_pick_transfer_proxy(uint16_t port_id, uint16_t *proxy_port_id,
                        ops->pick_transfer_proxy(dev, proxy_port_id, error),
                        error);
 }
+
+struct rte_flow_item_flex_handle *
+rte_flow_flex_item_create(uint16_t port_id,
+                         const struct rte_flow_item_flex_conf *conf,
+                         struct rte_flow_error *error)
+{
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+       struct rte_flow_item_flex_handle *handle;
+
+       if (unlikely(!ops))
+               return NULL;
+       if (unlikely(!ops->flex_item_create)) {
+               rte_flow_error_set(error, ENOTSUP,
+                                  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+                                  NULL, rte_strerror(ENOTSUP));
+               return NULL;
+       }
+       handle = ops->flex_item_create(dev, conf, error);
+       if (handle == NULL)
+               flow_err(port_id, -rte_errno, error);
+       return handle;
+}
+
+int
+rte_flow_flex_item_release(uint16_t port_id,
+                          const struct rte_flow_item_flex_handle *handle,
+                          struct rte_flow_error *error)
+{
+       int ret;
+       struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+       const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+
+       if (unlikely(!ops || !ops->flex_item_release))
+               return rte_flow_error_set(error, ENOTSUP,
+                                         RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+                                         NULL, rte_strerror(ENOTSUP));
+       ret = ops->flex_item_release(dev, handle, error);
+       return flow_err(port_id, ret, error);
+}