Add a new function to query information about GENEVE TLV option parser.

Signed-off-by: Michael Baum <michae...@nvidia.com>
---
 drivers/common/mlx5/mlx5_devx_cmds.c | 50 ++++++++++++++++++++++++++++
 drivers/common/mlx5/mlx5_devx_cmds.h |  6 ++++
 drivers/common/mlx5/mlx5_prm.h       |  5 +++
 drivers/common/mlx5/version.map      |  1 +
 4 files changed, 62 insertions(+)

diff --git a/drivers/common/mlx5/mlx5_devx_cmds.c 
b/drivers/common/mlx5/mlx5_devx_cmds.c
index 332aebbe57..1fa75cd964 100644
--- a/drivers/common/mlx5/mlx5_devx_cmds.c
+++ b/drivers/common/mlx5/mlx5_devx_cmds.c
@@ -2915,6 +2915,56 @@ mlx5_devx_cmd_create_geneve_tlv_option(void *ctx,
        return geneve_tlv_opt_obj;
 }
 
+/**
+ * Query GENEVE TLV option using DevX API.
+ *
+ * @param[in] ctx
+ *   Context used to create GENEVE TLV option object.
+ * @param[in] geneve_tlv_opt_obj
+ *   DevX object of the GENEVE TLV option.
+ * @param[out] attr
+ *   Pointer to match sample info attributes structure.
+ *
+ * @return
+ *   0 on success, a negative errno otherwise and rte_errno is set.
+ */
+int
+mlx5_devx_cmd_query_geneve_tlv_option(void *ctx,
+                                     struct mlx5_devx_obj *geneve_tlv_opt_obj,
+                                     struct 
mlx5_devx_match_sample_info_query_attr *attr)
+{
+       uint32_t in[MLX5_ST_SZ_DW(general_obj_in_cmd_hdr)] = {0};
+       uint32_t out[MLX5_ST_SZ_DW(query_geneve_tlv_option_out)] = {0};
+       void *hdr = MLX5_ADDR_OF(query_geneve_tlv_option_out, in, hdr);
+       void *opt = MLX5_ADDR_OF(query_geneve_tlv_option_out, out,
+                                geneve_tlv_opt);
+       int ret;
+
+       MLX5_SET(general_obj_in_cmd_hdr, hdr, opcode,
+                MLX5_CMD_OP_QUERY_GENERAL_OBJECT);
+       MLX5_SET(general_obj_in_cmd_hdr, hdr, obj_type,
+                MLX5_GENERAL_OBJ_TYPE_GENEVE_TLV_OPT);
+       MLX5_SET(general_obj_in_cmd_hdr, hdr, obj_id, geneve_tlv_opt_obj->id);
+       /* Call first query to get sample handle. */
+       ret = mlx5_glue->devx_obj_query(geneve_tlv_opt_obj->obj, in, sizeof(in),
+                                       out, sizeof(out));
+       if (ret) {
+               DRV_LOG(ERR, "Failed to query GENEVE TLV option using DevX.");
+               rte_errno = errno;
+               return -errno;
+       }
+       /* Call second query to get sample information. */
+       if (MLX5_GET(geneve_tlv_option, opt, sample_id_valid)) {
+               uint32_t sample_id = MLX5_GET(geneve_tlv_option, opt,
+                                             geneve_sample_field_id);
+
+               return mlx5_devx_cmd_match_sample_info_query(ctx, sample_id,
+                                                            attr);
+       }
+       DRV_LOG(DEBUG, "GENEVE TLV option sample isn't valid.");
+       return 0;
+}
+
 int
 mlx5_devx_cmd_wq_query(void *wq, uint32_t *counter_set_id)
 {
diff --git a/drivers/common/mlx5/mlx5_devx_cmds.h 
b/drivers/common/mlx5/mlx5_devx_cmds.h
index 1daf2fcca4..6161c275da 100644
--- a/drivers/common/mlx5/mlx5_devx_cmds.h
+++ b/drivers/common/mlx5/mlx5_devx_cmds.h
@@ -794,6 +794,12 @@ struct mlx5_devx_obj *
 mlx5_devx_cmd_create_geneve_tlv_option(void *ctx,
                                 struct mlx5_devx_geneve_tlv_option_attr *attr);
 
+__rte_internal
+int
+mlx5_devx_cmd_query_geneve_tlv_option(void *ctx,
+                                     struct mlx5_devx_obj *geneve_tlv_opt_obj,
+                                     struct 
mlx5_devx_match_sample_info_query_attr *attr);
+
 /**
  * Create virtio queue counters object DevX API.
  *
diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h
index 59643a8788..7c36961564 100644
--- a/drivers/common/mlx5/mlx5_prm.h
+++ b/drivers/common/mlx5/mlx5_prm.h
@@ -3721,6 +3721,11 @@ struct mlx5_ifc_create_geneve_tlv_option_in_bits {
        struct mlx5_ifc_geneve_tlv_option_bits geneve_tlv_opt;
 };
 
+struct mlx5_ifc_query_geneve_tlv_option_out_bits {
+       struct mlx5_ifc_general_obj_in_cmd_hdr_bits hdr;
+       struct mlx5_ifc_geneve_tlv_option_bits geneve_tlv_opt;
+};
+
 struct mlx5_ifc_create_rtc_in_bits {
        struct mlx5_ifc_general_obj_in_cmd_hdr_bits hdr;
        struct mlx5_ifc_rtc_bits rtc;
diff --git a/drivers/common/mlx5/version.map b/drivers/common/mlx5/version.map
index 074eed46fd..589a450145 100644
--- a/drivers/common/mlx5/version.map
+++ b/drivers/common/mlx5/version.map
@@ -54,6 +54,7 @@ INTERNAL {
        mlx5_devx_cmd_modify_tir;
        mlx5_devx_cmd_modify_virtq;
        mlx5_devx_cmd_qp_query_tis_td;
+       mlx5_devx_cmd_query_geneve_tlv_option;
        mlx5_devx_cmd_query_hca_attr;
        mlx5_devx_cmd_query_lag;
        mlx5_devx_cmd_query_parse_samples;
-- 
2.25.1

Reply via email to