On 10/29/2024 4:41 PM, Serhii Iliushyk wrote: > The flow profile implements a all flow related operations >
Can you please give some more details about the profiles, and "inline profile" mentioned? > Signed-off-by: Serhii Iliushyk <sil-...@napatech.com> > --- > drivers/net/ntnic/include/flow_api.h | 15 +++++ > drivers/net/ntnic/meson.build | 1 + > drivers/net/ntnic/nthw/flow_api/flow_api.c | 28 +++++++- > .../profile_inline/flow_api_profile_inline.c | 65 +++++++++++++++++++ > .../profile_inline/flow_api_profile_inline.h | 33 ++++++++++ > drivers/net/ntnic/ntnic_mod_reg.c | 12 +++- > drivers/net/ntnic/ntnic_mod_reg.h | 23 +++++++ > 7 files changed, 174 insertions(+), 3 deletions(-) > create mode 100644 > drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c > create mode 100644 > drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.h > > diff --git a/drivers/net/ntnic/include/flow_api.h > b/drivers/net/ntnic/include/flow_api.h > index c80906ec50..3bdfdd4f94 100644 > --- a/drivers/net/ntnic/include/flow_api.h > +++ b/drivers/net/ntnic/include/flow_api.h > @@ -74,6 +74,21 @@ struct flow_nic_dev { > struct flow_nic_dev *next; > }; > > +enum flow_nic_err_msg_e { > + ERR_SUCCESS = 0, > + ERR_FAILED = 1, > + ERR_OUTPUT_TOO_MANY = 3, > + ERR_MATCH_INVALID_OR_UNSUPPORTED_ELEM = 12, > + ERR_MATCH_RESOURCE_EXHAUSTION = 14, > + ERR_ACTION_UNSUPPORTED = 28, > + ERR_REMOVE_FLOW_FAILED = 29, > + ERR_OUTPUT_INVALID = 33, > + ERR_ACTION_MULTIPLE_PORT_ID_UNSUPPORTED = 40, > + ERR_MSG_NO_MSG > +}; > + > +void flow_nic_set_error(enum flow_nic_err_msg_e msg, struct rte_flow_error > *error); > + > /* > * Resources > */ > diff --git a/drivers/net/ntnic/meson.build b/drivers/net/ntnic/meson.build > index d272c73c62..f5605e81cb 100644 > --- a/drivers/net/ntnic/meson.build > +++ b/drivers/net/ntnic/meson.build > @@ -47,6 +47,7 @@ sources = files( > 'nthw/core/nthw_sdc.c', > 'nthw/core/nthw_si5340.c', > 'nthw/flow_api/flow_api.c', > + 'nthw/flow_api/profile_inline/flow_api_profile_inline.c', > 'nthw/flow_api/flow_backend/flow_backend.c', > 'nthw/flow_api/flow_filter.c', > 'nthw/flow_api/flow_kcc.c', > diff --git a/drivers/net/ntnic/nthw/flow_api/flow_api.c > b/drivers/net/ntnic/nthw/flow_api/flow_api.c > index d779dc481f..d0dad8e8f8 100644 > --- a/drivers/net/ntnic/nthw/flow_api/flow_api.c > +++ b/drivers/net/ntnic/nthw/flow_api/flow_api.c > @@ -36,6 +36,29 @@ const char *dbg_res_descr[] = { > static struct flow_nic_dev *dev_base; > static pthread_mutex_t base_mtx = PTHREAD_MUTEX_INITIALIZER; > > +/* > + * Error handling > + */ > + > +static const struct { > + const char *message; > +} err_msg[] = { > + /* 00 */ { "Operation successfully completed" }, > + /* 01 */ { "Operation failed" }, > + /* 29 */ { "Removing flow failed" }, > +}; > + > +void flow_nic_set_error(enum flow_nic_err_msg_e msg, struct rte_flow_error > *error) > +{ > + assert(msg < ERR_MSG_NO_MSG); > + > + if (error) { > + error->message = err_msg[msg].message; > + error->type = (msg == ERR_SUCCESS) ? RTE_FLOW_ERROR_TYPE_NONE : > + RTE_FLOW_ERROR_TYPE_UNSPECIFIED; > + } > +} > + > /* > * Resources > */ > @@ -136,7 +159,8 @@ static struct flow_handle *flow_create(struct > flow_eth_dev *dev __rte_unused, > return NULL; > } > > - return NULL; > + return profile_inline_ops->flow_create_profile_inline(dev, attr, > + forced_vlan_vid, caller_id, item, action, error); > } > > static int flow_destroy(struct flow_eth_dev *dev __rte_unused, > @@ -149,7 +173,7 @@ static int flow_destroy(struct flow_eth_dev *dev > __rte_unused, > return -1; > } > > - return -1; > + return profile_inline_ops->flow_destroy_profile_inline(dev, flow, > error); > } > > /* > diff --git > a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c > b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c > new file mode 100644 > index 0000000000..a6293f5f82 > --- /dev/null > +++ b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.c > @@ -0,0 +1,65 @@ > +/* > + * SPDX-License-Identifier: BSD-3-Clause > + * Copyright(c) 2023 Napatech A/S > + */ > + > +#include "ntlog.h" > + > +#include "flow_api_profile_inline.h" > +#include "ntnic_mod_reg.h" > + > +struct flow_handle *flow_create_profile_inline(struct flow_eth_dev *dev, > + const struct rte_flow_attr *attr, > + uint16_t forced_vlan_vid, > + uint16_t caller_id, > + const struct rte_flow_item elem[], > + const struct rte_flow_action action[], > + struct rte_flow_error *error) > +{ > + return NULL; > +} > + > +int flow_destroy_locked_profile_inline(struct flow_eth_dev *dev, > + struct flow_handle *fh, > + struct rte_flow_error *error) > +{ > + assert(dev); > + assert(fh); > + > + int err = 0; > + > + flow_nic_set_error(ERR_SUCCESS, error); > + > + return err; > +} > + > +int flow_destroy_profile_inline(struct flow_eth_dev *dev, struct flow_handle > *flow, > + struct rte_flow_error *error) > +{ > + int err = 0; > + > + flow_nic_set_error(ERR_SUCCESS, error); > + > + if (flow) { > + /* Delete this flow */ > + pthread_mutex_lock(&dev->ndev->mtx); > + err = flow_destroy_locked_profile_inline(dev, flow, error); > + pthread_mutex_unlock(&dev->ndev->mtx); > + } > + > + return err; > +} > + > +static const struct profile_inline_ops ops = { > + /* > + * Flow functionality > + */ > + .flow_destroy_locked_profile_inline = > flow_destroy_locked_profile_inline, > + .flow_create_profile_inline = flow_create_profile_inline, > + .flow_destroy_profile_inline = flow_destroy_profile_inline, > +}; > + > +void profile_inline_init(void) > +{ > + register_profile_inline_ops(&ops); > +} > diff --git > a/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.h > b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.h > new file mode 100644 > index 0000000000..a83cc299b4 > --- /dev/null > +++ b/drivers/net/ntnic/nthw/flow_api/profile_inline/flow_api_profile_inline.h > @@ -0,0 +1,33 @@ > +/* > + * SPDX-License-Identifier: BSD-3-Clause > + * Copyright(c) 2023 Napatech A/S > + */ > + > +#ifndef _FLOW_API_PROFILE_INLINE_H_ > +#define _FLOW_API_PROFILE_INLINE_H_ > + > +#include <stdint.h> > + > +#include "flow_api.h" > +#include "stream_binary_flow_api.h" > + > +/* > + * Flow functionality > + */ > +int flow_destroy_locked_profile_inline(struct flow_eth_dev *dev, > + struct flow_handle *fh, > + struct rte_flow_error *error); > + > +struct flow_handle *flow_create_profile_inline(struct flow_eth_dev *dev, > + const struct rte_flow_attr *attr, > + uint16_t forced_vlan_vid, > + uint16_t caller_id, > + const struct rte_flow_item elem[], > + const struct rte_flow_action action[], > + struct rte_flow_error *error); > + > +int flow_destroy_profile_inline(struct flow_eth_dev *dev, > + struct flow_handle *flow, > + struct rte_flow_error *error); > + > +#endif /* _FLOW_API_PROFILE_INLINE_H_ */ > diff --git a/drivers/net/ntnic/ntnic_mod_reg.c > b/drivers/net/ntnic/ntnic_mod_reg.c > index ad2266116f..593b56bf5b 100644 > --- a/drivers/net/ntnic/ntnic_mod_reg.c > +++ b/drivers/net/ntnic/ntnic_mod_reg.c > @@ -118,9 +118,19 @@ const struct flow_backend_ops *get_flow_backend_ops(void) > return flow_backend_ops; > } > > +static const struct profile_inline_ops *profile_inline_ops; > + > +void register_profile_inline_ops(const struct profile_inline_ops *ops) > +{ > + profile_inline_ops = ops; > +} > + > const struct profile_inline_ops *get_profile_inline_ops(void) > { > - return NULL; > + if (profile_inline_ops == NULL) > + profile_inline_init(); > + > + return profile_inline_ops; > } > > static const struct flow_filter_ops *flow_filter_ops; > diff --git a/drivers/net/ntnic/ntnic_mod_reg.h > b/drivers/net/ntnic/ntnic_mod_reg.h > index ec8c1612d1..d133336fad 100644 > --- a/drivers/net/ntnic/ntnic_mod_reg.h > +++ b/drivers/net/ntnic/ntnic_mod_reg.h > @@ -225,7 +225,30 @@ void register_flow_backend_ops(const struct > flow_backend_ops *ops); > const struct flow_backend_ops *get_flow_backend_ops(void); > void flow_backend_init(void); > > +struct profile_inline_ops { > + /* > + * Flow functionality > + */ > + int (*flow_destroy_locked_profile_inline)(struct flow_eth_dev *dev, > + struct flow_handle *fh, > + struct rte_flow_error *error); > + > + struct flow_handle *(*flow_create_profile_inline)(struct flow_eth_dev > *dev, > + const struct rte_flow_attr *attr, > + uint16_t forced_vlan_vid, > + uint16_t caller_id, > + const struct rte_flow_item elem[], > + const struct rte_flow_action action[], > + struct rte_flow_error *error); > + > + int (*flow_destroy_profile_inline)(struct flow_eth_dev *dev, > + struct flow_handle *flow, > + struct rte_flow_error *error); > +}; > + > +void register_profile_inline_ops(const struct profile_inline_ops *ops); > const struct profile_inline_ops *get_profile_inline_ops(void); > +void profile_inline_init(void); > > struct flow_filter_ops { > int (*flow_filter_init)(nthw_fpga_t *p_fpga, struct flow_nic_dev > **p_flow_device,