Hi Slava,
> -----Original Message----- > From: Slava Ovsiienko <viachesl...@nvidia.com> > Sent: Tuesday, October 12, 2021 3:55 PM > Subject: [PATCH v5 3/5] ethdev: implement RTE flex item API > > From: Gregory Etelson <getel...@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 <getel...@nvidia.com> > Reviewed-by: Viacheslav Ovsiienko <viachesl...@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 <or...@nvidia.com> Best, Ori