@@ -12,6 +12,7 @@ libmlx5.so.1 ibverbs-providers #MINVER#
MLX5_1.4@MLX5_1.4 17
MLX5_1.5@MLX5_1.5 18
MLX5_1.6@MLX5_1.6 20
+ MLX5_1.7@MLX5_1.7 21
mlx5dv_init_obj@MLX5_1.0 13
mlx5dv_init_obj@MLX5_1.2 15
mlx5dv_query_device@MLX5_1.0 13
@@ -24,3 +25,4 @@ libmlx5.so.1 ibverbs-providers #MINVER#
mlx5dv_create_flow_matcher@MLX5_1.6 20
mlx5dv_destroy_flow_matcher@MLX5_1.6 20
mlx5dv_create_flow@MLX5_1.6 20
+ mlx5dv_create_flow_action_modify_header@MLX5_1.7 21
@@ -11,7 +11,7 @@ if (MLX5_MW_DEBUG)
endif()
rdma_shared_provider(mlx5 libmlx5.map
- 1 1.6.${PACKAGE_VERSION}
+ 1 1.7.${PACKAGE_VERSION}
buf.c
cq.c
dbrec.c
@@ -40,3 +40,8 @@ MLX5_1.6 {
mlx5dv_destroy_flow_matcher;
mlx5dv_create_flow;
} MLX5_1.5;
+
+MLX5_1.7 {
+ global:
+ mlx5dv_create_flow_action_modify_header;
+} MLX5_1.6;
@@ -37,5 +37,8 @@
#define mlx5dv_flow_action_flags mlx5_ib_uapi_flow_action_flags
#define MLX5DV_FLOW_ACTION_FLAGS_REQUIRE_METADATA MLX5_IB_UAPI_FLOW_ACTION_FLAGS_REQUIRE_METADATA
+#define mlx5dv_flow_table_type mlx5_ib_uapi_flow_table_type
+#define MLX5DV_FLOW_TABLE_TYPE_NIC_RX MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_RX
+#define MLX5DV_FLOW_TABLE_TYPE_NIC_TX MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX
#endif
@@ -245,6 +245,26 @@ struct ibv_flow_action *mlx5dv_create_flow_action_esp(struct ibv_context *ctx,
struct mlx5dv_flow_action_esp *mlx5_attr);
/*
+ * mlx5dv_create_flow_action_modify_header - Create a flow action which mutates
+ * a packet. The flow action can be attached to steering rules via
+ * ibv_create_flow().
+ *
+ * @ctx: RDMA device context to create the action on.
+ * @actions_sz: The size of *actions* buffer in bytes.
+ * @actions: A buffer which contains modify actions provided in device spec
+ * format.
+ * @ft_type: Defines the flow table type to which the modify
+ * header action will be attached.
+ *
+ * Return a valid ibv_flow_action if successful, NULL otherwise.
+ */
+struct ibv_flow_action *
+mlx5dv_create_flow_action_modify_header(struct ibv_context *ctx,
+ size_t actions_sz,
+ uint64_t actions[],
+ enum mlx5dv_flow_table_type ft_type);
+
+/*
* Most device capabilities are exported by ibv_query_device(...),
* but there is HW device-specific information which is important
* for data-path, but isn't provided.
@@ -3317,6 +3317,44 @@ int mlx5_modify_flow_action_esp(struct ibv_flow_action *action,
return ibv_cmd_modify_flow_action_esp(vaction, attr, NULL);
}
+struct ibv_flow_action *mlx5dv_create_flow_action_modify_header(struct ibv_context *ctx,
+ size_t actions_sz,
+ uint64_t actions[],
+ enum mlx5dv_flow_table_type ft_type)
+{
+ DECLARE_COMMAND_BUFFER(cmd, UVERBS_OBJECT_FLOW_ACTION,
+ MLX5_IB_METHOD_FLOW_ACTION_CREATE_MODIFY_HEADER,
+ 3);
+ struct ib_uverbs_attr *handle = fill_attr_out_obj(cmd,
+ MLX5_IB_ATTR_CREATE_MODIFY_HEADER_HANDLE);
+ struct verbs_flow_action *action;
+ int ret;
+
+ fill_attr_in(cmd, MLX5_IB_ATTR_CREATE_MODIFY_HEADER_ACTIONS_PRM,
+ actions, actions_sz);
+ fill_attr_const_in(cmd, MLX5_IB_ATTR_CREATE_MODIFY_HEADER_FT_TYPE,
+ ft_type);
+
+ action = calloc(1, sizeof(*action));
+ if (!action) {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ ret = execute_ioctl(ctx, cmd);
+ if (ret) {
+ free(action);
+ return NULL;
+ }
+
+ action->action.context = ctx;
+ action->type = IBV_FLOW_ACTION_UNSPECIFIED;
+ action->handle = read_attr_obj(MLX5_IB_ATTR_CREATE_MODIFY_HEADER_HANDLE,
+ handle);
+
+ return &action->action;
+}
+
int mlx5_destroy_flow_action(struct ibv_flow_action *action)
{
struct verbs_flow_action *vaction =