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

Reply via email to