Add function for converting HWS table type to corresponding HWS action flag for both root and non-root tables.
Signed-off-by: Dariusz Sosnowski <[email protected]> Acked-by: Ori Kam <[email protected]> --- drivers/net/mlx5/hws/mlx5dr.h | 16 ++++++ drivers/net/mlx5/hws/mlx5dr_table.c | 75 +++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/drivers/net/mlx5/hws/mlx5dr.h b/drivers/net/mlx5/hws/mlx5dr.h index d358178e5b..078740a530 100644 --- a/drivers/net/mlx5/hws/mlx5dr.h +++ b/drivers/net/mlx5/hws/mlx5dr.h @@ -369,6 +369,22 @@ mlx5dr_context_open(struct ibv_context *ibv_ctx, */ int mlx5dr_context_close(struct mlx5dr_context *ctx); +/** + * Convert given table type to corresponding action type. + * + * @param[in] table_type + * Table type. + * @param[in] is_root + * Whether table should be considered root or not. + * @param[out] action_flags + * Corresponding action flags will be written here. + * @return + * 0 on success. Negative errno and rte_errno is set otherwise. + */ +int mlx5dr_table_type_to_action_flags(const enum mlx5dr_table_type table_type, + const bool is_root, + enum mlx5dr_action_flags *action_flags); + /* Create a new direct rule table. Each table can contain multiple matchers. * * @param[in] ctx diff --git a/drivers/net/mlx5/hws/mlx5dr_table.c b/drivers/net/mlx5/hws/mlx5dr_table.c index c1c60b4e52..41ffaa19e3 100644 --- a/drivers/net/mlx5/hws/mlx5dr_table.c +++ b/drivers/net/mlx5/hws/mlx5dr_table.c @@ -4,6 +4,81 @@ #include "mlx5dr_internal.h" +static int +table_type_to_root_action_flags(enum mlx5dr_table_type table_type, + enum mlx5dr_action_flags *out) +{ + switch (table_type) { + case MLX5DR_TABLE_TYPE_NIC_RX: + *out = MLX5DR_ACTION_FLAG_ROOT_RX; + break; + case MLX5DR_TABLE_TYPE_NIC_TX: + *out = MLX5DR_ACTION_FLAG_ROOT_TX; + break; + case MLX5DR_TABLE_TYPE_FDB: + *out = MLX5DR_ACTION_FLAG_ROOT_FDB; + break; + default: + rte_errno = EINVAL; + return -rte_errno; + } + + return 0; +} + +static int +table_type_to_nonroot_action_flags(enum mlx5dr_table_type table_type, + enum mlx5dr_action_flags *out) +{ + switch (table_type) { + case MLX5DR_TABLE_TYPE_NIC_RX: + *out = MLX5DR_ACTION_FLAG_HWS_RX; + break; + case MLX5DR_TABLE_TYPE_NIC_TX: + *out = MLX5DR_ACTION_FLAG_HWS_TX; + break; + case MLX5DR_TABLE_TYPE_FDB: + *out = MLX5DR_ACTION_FLAG_HWS_FDB; + break; + case MLX5DR_TABLE_TYPE_FDB_RX: + *out = MLX5DR_ACTION_FLAG_HWS_FDB_RX; + break; + case MLX5DR_TABLE_TYPE_FDB_TX: + *out = MLX5DR_ACTION_FLAG_HWS_FDB_TX; + break; + case MLX5DR_TABLE_TYPE_FDB_UNIFIED: + *out = MLX5DR_ACTION_FLAG_HWS_FDB_UNIFIED; + break; + default: + rte_errno = EINVAL; + return -rte_errno; + } + + return 0; +} + +int +mlx5dr_table_type_to_action_flags(const enum mlx5dr_table_type table_type, + const bool is_root, + enum mlx5dr_action_flags *action_flags) +{ + int ret = 0; + + if (is_root) { + ret = table_type_to_root_action_flags(table_type, action_flags); + if (ret < 0) + DR_LOG(ERR, "Cannot convert table type %d to action flags for root table", + table_type); + } else { + ret = table_type_to_nonroot_action_flags(table_type, action_flags); + if (ret < 0) + DR_LOG(ERR, "Cannot convert table type %d to action flags for HWS table", + table_type); + } + + return ret; +} + static void mlx5dr_table_init_next_ft_attr(struct mlx5dr_table *tbl, struct mlx5dr_cmd_ft_create_attr *ft_attr) { -- 2.47.3

