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,

Reply via email to