[v6,3/6] ethdev: implement RTE flex item API
Checks
Commit Message
From: Gregory Etelson <getelson@nvidia.com>
RTE flex item API was introduced in
"ethdev: introduce configurable flexible item" patch.
The API allows DPDK application to define parser for custom
network header in port hardware and offload flows that will match
the custom header elements.
Signed-off-by: Gregory Etelson <getelson@nvidia.com>
Reviewed-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
---
lib/ethdev/rte_flow.c | 40 ++++++++++++++++++++++++++++++++++++
lib/ethdev/rte_flow_driver.h | 8 ++++++++
lib/ethdev/version.map | 2 ++
3 files changed, 50 insertions(+)
Comments
Hi Slava and Gregory,
> -----Original Message-----
> From: Slava Ovsiienko <viacheslavo@nvidia.com>
> Sent: Monday, October 18, 2021 9:03 PM
> To: dev@dpdk.org
> Cc: Raslan Darawsheh <rasland@nvidia.com>; Matan Azrad <matan@nvidia.com>; Shahaf Shuler
> <shahafs@nvidia.com>; Ori Kam <orika@nvidia.com>; Gregory Etelson <getelson@nvidia.com>; NBU-
> Contact-Thomas Monjalon <thomas@monjalon.net>
> Subject: [PATCH v6 3/6] ethdev: implement RTE flex item API
>
> From: Gregory Etelson <getelson@nvidia.com>
>
> RTE flex item API was introduced in
> "ethdev: introduce configurable flexible item" patch.
>
> The API allows DPDK application to define parser for custom network header in port hardware and
> offload flows that will match the custom header elements.
>
> Signed-off-by: Gregory Etelson <getelson@nvidia.com>
> Reviewed-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
> ---
Acked-by: Ori Kam <orika@nvidia.com>
Thanks,
Ori
@@ -1321,3 +1321,43 @@ rte_flow_tunnel_item_release(uint16_t port_id,
RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
NULL, rte_strerror(ENOTSUP));
}
+
+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);
+}
@@ -139,6 +139,14 @@ struct rte_flow_ops {
struct rte_flow_item *pmd_items,
uint32_t num_of_items,
struct rte_flow_error *err);
+ struct rte_flow_item_flex_handle *(*flex_item_create)
+ (struct rte_eth_dev *dev,
+ const struct rte_flow_item_flex_conf *conf,
+ struct rte_flow_error *error);
+ int (*flex_item_release)
+ (struct rte_eth_dev *dev,
+ const struct rte_flow_item_flex_handle *handle,
+ struct rte_flow_error *error);
};
/**
@@ -248,6 +248,8 @@ EXPERIMENTAL {
# added in 21.11
rte_eth_rx_metadata_negotiate;
+ rte_flow_flex_item_create;
+ rte_flow_flex_item_release;
};
INTERNAL {