@@ -26,3 +26,4 @@ libmlx5.so.1 ibverbs-providers #MINVER#
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
+ mlx5dv_create_flow_action_packet_reformat@MLX5_1.7 21
@@ -44,4 +44,5 @@ MLX5_1.6 {
MLX5_1.7 {
global:
mlx5dv_create_flow_action_modify_header;
+ mlx5dv_create_flow_action_packet_reformat;
} MLX5_1.6;
@@ -1,5 +1,6 @@
rdma_man_pages(
mlx5dv_flow_action_esp.3.md
+ mlx5dv_flow_action_packet_reformat.3.md
mlx5dv_get_clock_info.3
mlx5dv_init_obj.3
mlx5dv_query_device.3
new file mode 100644
@@ -0,0 +1,63 @@
+
+---
+layout: page
+title: mlx5dv_flow_action_packet_reformat
+section: 3
+tagline: Verbs
+---
+
+# NAME
+
+mlx5dv_flow_action_packet_reformat - Flow action reformat packet for mlx5 provider
+
+# SYNOPSIS
+
+```c
+#include <infiniband/mlx5dv.h>
+
+struct ibv_flow_action *
+mlx5dv_create_flow_action_packet_reformat(struct ibv_context *ctx,
+ size_t data_sz,
+ void *data,
+ enum mlx5dv_flow_action_packet_reformat_type reformat_type,
+ enum mlx5dv_flow_table_type ft_type)
+```
+
+# DESCRIPTION
+
+Create a packet reformat flow steering action.
+It allows to add/remove packet headers.
+
+# ARGUMENTS
+*ctx*
+: RDMA device context to create the action on.
+
+*data_sz*
+: The size of *data* buffer.
+
+*data*
+: A buffer which contains headers in case the actions requires them.
+
+*reformat_type*
+: The reformat type to be create. Use enum mlx5dv_flow_action_packet_reformat_type.
+ MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TUNNEL_TO_L2: Decap a generic L2
+ tunneled packet upto inner L2.
+
+ MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L2_TUNNEL: Generic encap, *data*
+ should contain the encapsulating headers.
+
+ MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L3_TUNNEL_TO_L2: Will do decap where
+ the inner packet starts from L3. *data* should be MAC or MAC + vlan (14 or 18 bytes) to be
+ appended to the packet after the decap action.
+
+ MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L3_TUNNEL: Will do encap where is
+ L2 of the original packet will not be included. *data* should be the encapsulating header.
+
+*ft_type*
+: It defines the flow table type to which the packet reformat action
+ will be attached.
+
+# SEE ALSO
+
+*ibv_create_flow(3)* *ibv_create_flow_action(3)*
+
@@ -40,5 +40,10 @@
#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
+#define mlx5dv_flow_action_packet_reformat_type mlx5_ib_uapi_flow_action_packet_reformat_type
+#define MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TUNNEL_TO_L2 MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TUNNEL_TO_L2
+#define MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L2_TUNNEL MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L2_TUNNEL
+#define MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L3_TUNNEL_TO_L2 MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L3_TUNNEL_TO_L2
+#define MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L3_TUNNEL MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L3_TUNNEL
#endif
@@ -265,6 +265,16 @@ mlx5dv_create_flow_action_modify_header(struct ibv_context *ctx,
enum mlx5dv_flow_table_type ft_type);
/*
+ * mlx5dv_create_flow_action_packet_reformat - Create flow action which can
+ * encap/decap packets.
+ */
+struct ibv_flow_action *
+mlx5dv_create_flow_action_packet_reformat(struct ibv_context *ctx,
+ size_t data_sz,
+ void *data,
+ enum mlx5dv_flow_action_packet_reformat_type reformat_type,
+ 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.
@@ -3355,6 +3355,56 @@ struct ibv_flow_action *mlx5dv_create_flow_action_modify_header(struct ibv_conte
return &action->action;
}
+struct ibv_flow_action *
+mlx5dv_create_flow_action_packet_reformat(struct ibv_context *ctx,
+ size_t data_sz,
+ void *data,
+ enum mlx5dv_flow_action_packet_reformat_type reformat_type,
+ enum mlx5dv_flow_table_type ft_type)
+{
+ DECLARE_COMMAND_BUFFER(cmd, UVERBS_OBJECT_FLOW_ACTION,
+ MLX5_IB_METHOD_FLOW_ACTION_CREATE_PACKET_REFORMAT, 4);
+ struct ib_uverbs_attr *handle = fill_attr_out_obj(cmd,
+ MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_HANDLE);
+ struct verbs_flow_action *action;
+ int ret;
+
+ if ((!data && data_sz) || (data && !data_sz)) {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ if (data && data_sz)
+ fill_attr_in(cmd,
+ MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_DATA_BUF,
+ data, data_sz);
+
+ fill_attr_const_in(cmd, MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_TYPE,
+ reformat_type);
+
+ fill_attr_const_in(cmd, MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_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_PACKET_REFORMAT_HANDLE,
+ handle);
+
+ return &action->action;
+}
+
int mlx5_destroy_flow_action(struct ibv_flow_action *action)
{
struct verbs_flow_action *vaction =