]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx5: fix metadata endianness in modify field action
authorViacheslav Ovsiienko <viacheslavo@nvidia.com>
Thu, 3 Feb 2022 08:46:51 +0000 (10:46 +0200)
committerRaslan Darawsheh <rasland@nvidia.com>
Thu, 10 Feb 2022 08:44:28 +0000 (09:44 +0100)
As modify field action immediate source parameter the metadata
should follow the CPU endianness (according to SET_META action
structure format), and mlx5 PMD wrongly handled the immediate
parameter metadata buffer as big-endian, resulting in wrong
metadata set action with incorrect endianness.

Fixes: 40c8fb1fd3b3 ("net/mlx5: update modify field action")
Cc: stable@dpdk.org
Signed-off-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
drivers/net/mlx5/mlx5_flow_dv.c

index af90a7fd0ae07b4ad5d5e4027a65c5eee6920c8c..10ef2af06a290f968bb1bbbcf316ae53fa4688b6 100644 (file)
@@ -1867,7 +1867,7 @@ flow_dv_convert_action_modify_field
        struct field_modify_info dcopy[MLX5_ACT_MAX_MOD_FIELDS] = {
                                                                {0, 0, 0} };
        uint32_t mask[MLX5_ACT_MAX_MOD_FIELDS] = {0, 0, 0, 0, 0};
-       uint32_t type;
+       uint32_t type, meta = 0;
        uint32_t shift = 0;
 
        if (conf->src.field == RTE_FLOW_FIELD_POINTER ||
@@ -1880,6 +1880,11 @@ flow_dv_convert_action_modify_field
                item.spec = conf->src.field == RTE_FLOW_FIELD_POINTER ?
                                        (void *)(uintptr_t)conf->src.pvalue :
                                        (void *)(uintptr_t)&conf->src.value;
+               if (conf->dst.field == RTE_FLOW_FIELD_META) {
+                       meta = *(const unaligned_uint32_t *)item.spec;
+                       meta = rte_cpu_to_be_32(meta);
+                       item.spec = &meta;
+               }
        } else {
                type = MLX5_MODIFICATION_TYPE_COPY;
                /** For COPY fill the destination field (dcopy) without mask. */