[dpdk-dev] [PATCH v5 3/5] ethdev: implement RTE flex item API
Ori Kam
orika at nvidia.com
Tue Oct 12 16:39:27 CEST 2021
Hi Slava,
> -----Original Message-----
> From: Slava Ovsiienko <viacheslavo at nvidia.com>
> Sent: Tuesday, October 12, 2021 3:55 PM
> Subject: [PATCH v5 3/5] ethdev: implement RTE flex item API
>
> From: Gregory Etelson <getelson at 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 at nvidia.com>
> Reviewed-by: Viacheslav Ovsiienko <viacheslavo at nvidia.com>
> ---
> lib/ethdev/rte_flow.c | 40 ++++++++++++++++++++++++++++++++++++
> lib/ethdev/rte_flow_driver.h | 8 ++++++++
> lib/ethdev/version.map | 4 ++++
> 3 files changed, 52 insertions(+)
>
> diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c index 051781b440..8257ed8c97 100644
> --- a/lib/ethdev/rte_flow.c
> +++ b/lib/ethdev/rte_flow.c
> @@ -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);
> +}
> diff --git a/lib/ethdev/rte_flow_driver.h b/lib/ethdev/rte_flow_driver.h index 46f62c2ec2..34a5a5bcd0
> 100644
> --- a/lib/ethdev/rte_flow_driver.h
> +++ b/lib/ethdev/rte_flow_driver.h
> @@ -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);
> };
>
> /**
> diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map index 904bce6ea1..ec3b66d7a1 100644
> --- a/lib/ethdev/version.map
> +++ b/lib/ethdev/version.map
> @@ -247,6 +247,10 @@ EXPERIMENTAL {
> rte_mtr_meter_policy_delete;
> rte_mtr_meter_policy_update;
> rte_mtr_meter_policy_validate;
> +
> + # added in 21.11
> + rte_flow_flex_item_create;
> + rte_flow_flex_item_release;
> };
>
> INTERNAL {
> --
> 2.18.1
Acked-by: Ori Kam <orika at nvidia.com>
Best,
Ori
More information about the dev
mailing list