From ff44839929d0bea529be581ba784a48d085ab893 Mon Sep 17 00:00:00 2001 From: Dekel Peled Date: Wed, 5 Feb 2020 08:42:02 +0200 Subject: [PATCH] net/mlx5: fix dirty array of actions Previous patch changed the format of struct mlx5_flow_dv_modify_hdr_resource, to use a flexible array for modification actions. In __flow_dv_translate() a union was defined with item of this struct, and an array of maximal possible size. Array elements are filled in several functions. In function flow_dv_convert_action_set_reg(), array element is filled partially, while the other fields of this array element are left uninitialized. This may cause failure of flow_dv_modify_hdr_resource_register() when calling driver function with the 'dirty' array. This patch updates flow_dv_convert_action_set_reg(), setting the selected array element fields while clearing the other fields. Other functions that fill the same array elements are also updated for clarity and proofing future use. Fixes: 024e95759c16 ("net/mlx5: fix modify actions support limitation") Cc: stable@dpdk.org Signed-off-by: Dekel Peled Acked-by: Matan Azrad Acked-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5_flow_dv.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 2878393b17..3daabd3e68 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -385,10 +385,12 @@ flow_dv_convert_modify_action(struct rte_flow_item *item, off_b - __builtin_clz(mask); MLX5_ASSERT(size_b); size_b = size_b == sizeof(uint32_t) * CHAR_BIT ? 0 : size_b; - actions[i].action_type = type; - actions[i].field = field->id; - actions[i].offset = off_b; - actions[i].length = size_b; + actions[i] = (struct mlx5_modification_cmd) { + .action_type = type, + .field = field->id, + .offset = off_b, + .length = size_b, + }; /* Convert entire record to expected big-endian format. */ actions[i].data0 = rte_cpu_to_be_32(actions[i].data0); if (type == MLX5_MODIFICATION_TYPE_COPY) { @@ -578,10 +580,12 @@ flow_dv_convert_action_modify_vlan_vid return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, NULL, "too many items to modify"); - actions[i].action_type = MLX5_MODIFICATION_TYPE_SET; - actions[i].field = field->id; - actions[i].length = field->size; - actions[i].offset = field->offset; + actions[i] = (struct mlx5_modification_cmd) { + .action_type = MLX5_MODIFICATION_TYPE_SET, + .field = field->id, + .length = field->size, + .offset = field->offset, + }; actions[i].data0 = rte_cpu_to_be_32(actions[i].data0); actions[i].data1 = conf->vlan_vid; actions[i].data1 = actions[i].data1 << 16; @@ -913,8 +917,10 @@ flow_dv_convert_action_set_reg "too many items to modify"); MLX5_ASSERT(conf->id != REG_NONE); MLX5_ASSERT(conf->id < RTE_DIM(reg_to_field)); - actions[i].action_type = MLX5_MODIFICATION_TYPE_SET; - actions[i].field = reg_to_field[conf->id]; + actions[i] = (struct mlx5_modification_cmd) { + .action_type = MLX5_MODIFICATION_TYPE_SET, + .field = reg_to_field[conf->id], + }; actions[i].data0 = rte_cpu_to_be_32(actions[i].data0); actions[i].data1 = rte_cpu_to_be_32(conf->data); ++i; -- 2.20.1