]> git.droids-corp.org - dpdk.git/commitdiff
common/mlx5: create GENEVE TLV option object with DevX
authorShiri Kuzin <shirik@nvidia.com>
Sun, 17 Jan 2021 10:21:19 +0000 (12:21 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 19 Jan 2021 02:30:15 +0000 (03:30 +0100)
TLV object is a special firmware maintained entity used
to support match on GENEVE header extension option.

The TLV object is created with DevX API and accepts
the option class, type and lehgth fields.

The class type and length fields are set using MLX5_SET
and the Devx object is created using mlx5 glue function.

Signed-off-by: Shiri Kuzin <shirik@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
drivers/common/mlx5/mlx5_devx_cmds.c
drivers/common/mlx5/mlx5_devx_cmds.h
drivers/common/mlx5/rte_common_mlx5_exports.def
drivers/common/mlx5/version.map

index 861f75e47dc36ea6fb080056ee69364771d62843..d5859c2a264053257fd258af298951951ec92061 100644 (file)
@@ -2093,3 +2093,58 @@ mlx5_devx_cmd_alloc_pd(void *ctx)
        ppd->id = MLX5_GET(alloc_pd_out, out, pd);
        return ppd;
 }
+
+/**
+ * Create general object of type GENEVE TLV option using DevX API.
+ *
+ * @param[in] ctx
+ *   Context returned from mlx5 open_device() glue function.
+ * @param [in] class
+ *   TLV option variable value of class
+ * @param [in] type
+ *   TLV option variable value of type
+ * @param [in] len
+ *   TLV option variable value of len
+ *
+ * @return
+ *   The DevX object created, NULL otherwise and rte_errno is set.
+ */
+struct mlx5_devx_obj *
+mlx5_devx_cmd_create_geneve_tlv_option(void *ctx,
+               uint16_t class, uint8_t type, uint8_t len)
+{
+       uint32_t in[MLX5_ST_SZ_DW(create_geneve_tlv_option_in)] = {0};
+       uint32_t out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {0};
+       struct mlx5_devx_obj *geneve_tlv_opt_obj = mlx5_malloc(MLX5_MEM_ZERO,
+                                                  sizeof(*geneve_tlv_opt_obj),
+                                                  0, SOCKET_ID_ANY);
+
+       if (!geneve_tlv_opt_obj) {
+               DRV_LOG(ERR, "Failed to allocate geneve tlv option object.");
+               rte_errno = ENOMEM;
+               return NULL;
+       }
+       void *hdr = MLX5_ADDR_OF(create_geneve_tlv_option_in, in, hdr);
+       void *opt = MLX5_ADDR_OF(create_geneve_tlv_option_in, in,
+                       geneve_tlv_opt);
+       MLX5_SET(general_obj_in_cmd_hdr, hdr, opcode,
+                       MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
+       MLX5_SET(general_obj_in_cmd_hdr, hdr, obj_type,
+                       MLX5_OBJ_TYPE_GENEVE_TLV_OPT);
+       MLX5_SET(geneve_tlv_option, opt, option_class,
+                       rte_be_to_cpu_16(class));
+       MLX5_SET(geneve_tlv_option, opt, option_type, type);
+       MLX5_SET(geneve_tlv_option, opt, option_data_length, len);
+       geneve_tlv_opt_obj->obj = mlx5_glue->devx_obj_create(ctx, in,
+                                       sizeof(in), out, sizeof(out));
+       if (!geneve_tlv_opt_obj->obj) {
+               rte_errno = errno;
+               DRV_LOG(ERR, "Failed to create Geneve tlv option "
+                               "Obj using DevX.");
+               mlx5_free(geneve_tlv_opt_obj);
+               return NULL;
+       }
+       geneve_tlv_opt_obj->id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
+       return geneve_tlv_opt_obj;
+}
+
index 1e0a48d8102240032d941002eee576b00c721c61..bf83a903b1c27782dfc1fc2263628a0cd9ca163a 100644 (file)
@@ -485,6 +485,11 @@ __rte_internal
 int mlx5_devx_cmd_register_read(void *ctx, uint16_t reg_id,
                                uint32_t arg, uint32_t *data, uint32_t dw_cnt);
 
+__rte_internal
+struct mlx5_devx_obj *
+mlx5_devx_cmd_create_geneve_tlv_option(void *ctx,
+               uint16_t class, uint8_t type, uint8_t len);
+
 /**
  * Create virtio queue counters object DevX API.
  *
index b385d38d1a5756fa44623991d4ee6533eb19e8a4..fd62b806cac066b6f083c5b192cf8a99997f9c06 100644 (file)
@@ -34,6 +34,7 @@ EXPORTS
        mlx5_devx_cmd_register_read
        mlx5_devx_get_out_command_status
        mlx5_devx_cmd_create_flow_hit_aso_obj
+       mlx5_devx_cmd_create_geneve_tlv_option
 
        mlx5_devx_cq_create
        mlx5_devx_cq_destroy
index 00760abece33581b8fdb3c7e492601213fdbdf92..244b9c73394a59213316746869bba646efb8dd8d 100644 (file)
@@ -23,6 +23,7 @@ INTERNAL {
        mlx5_devx_cmd_create_virtio_q_counters;
        mlx5_devx_cmd_create_virtq;
         mlx5_devx_cmd_create_flow_hit_aso_obj;
+       mlx5_devx_cmd_create_geneve_tlv_option;
        mlx5_devx_cmd_destroy;
        mlx5_devx_cmd_flow_counter_alloc;
        mlx5_devx_cmd_flow_counter_query;