Skip to content

Commit 82198d8

Browse files
dickmanmaorSaeed Mahameed
authored andcommitted
net/mlx5e: Fix endianness when calculating pedit mask first bit
The field mask value is provided in network byte order and has to be converted to host byte order before calculating pedit mask first bit. Fixes: 88f30bb ("net/mlx5e: Bit sized fields rewrite support") Signed-off-by: Maor Dickman <[email protected]> Reviewed-by: Roi Dayan <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 6cec022 commit 82198d8

File tree

1 file changed

+21
-13
lines changed
  • drivers/net/ethernet/mellanox/mlx5/core

1 file changed

+21
-13
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2624,6 +2624,22 @@ static struct mlx5_fields fields[] = {
26242624
OFFLOAD(UDP_DPORT, 16, U16_MAX, udp.dest, 0, udp_dport),
26252625
};
26262626

2627+
static unsigned long mask_to_le(unsigned long mask, int size)
2628+
{
2629+
__be32 mask_be32;
2630+
__be16 mask_be16;
2631+
2632+
if (size == 32) {
2633+
mask_be32 = (__force __be32)(mask);
2634+
mask = (__force unsigned long)cpu_to_le32(be32_to_cpu(mask_be32));
2635+
} else if (size == 16) {
2636+
mask_be32 = (__force __be32)(mask);
2637+
mask_be16 = *(__be16 *)&mask_be32;
2638+
mask = (__force unsigned long)cpu_to_le16(be16_to_cpu(mask_be16));
2639+
}
2640+
2641+
return mask;
2642+
}
26272643
static int offload_pedit_fields(struct mlx5e_priv *priv,
26282644
int namespace,
26292645
struct pedit_headers_action *hdrs,
@@ -2637,9 +2653,7 @@ static int offload_pedit_fields(struct mlx5e_priv *priv,
26372653
u32 *s_masks_p, *a_masks_p, s_mask, a_mask;
26382654
struct mlx5e_tc_mod_hdr_acts *mod_acts;
26392655
struct mlx5_fields *f;
2640-
unsigned long mask;
2641-
__be32 mask_be32;
2642-
__be16 mask_be16;
2656+
unsigned long mask, field_mask;
26432657
int err;
26442658
u8 cmd;
26452659

@@ -2705,14 +2719,7 @@ static int offload_pedit_fields(struct mlx5e_priv *priv,
27052719
if (skip)
27062720
continue;
27072721

2708-
if (f->field_bsize == 32) {
2709-
mask_be32 = (__force __be32)(mask);
2710-
mask = (__force unsigned long)cpu_to_le32(be32_to_cpu(mask_be32));
2711-
} else if (f->field_bsize == 16) {
2712-
mask_be32 = (__force __be32)(mask);
2713-
mask_be16 = *(__be16 *)&mask_be32;
2714-
mask = (__force unsigned long)cpu_to_le16(be16_to_cpu(mask_be16));
2715-
}
2722+
mask = mask_to_le(mask, f->field_bsize);
27162723

27172724
first = find_first_bit(&mask, f->field_bsize);
27182725
next_z = find_next_zero_bit(&mask, f->field_bsize, first);
@@ -2743,9 +2750,10 @@ static int offload_pedit_fields(struct mlx5e_priv *priv,
27432750
if (cmd == MLX5_ACTION_TYPE_SET) {
27442751
int start;
27452752

2753+
field_mask = mask_to_le(f->field_mask, f->field_bsize);
2754+
27462755
/* if field is bit sized it can start not from first bit */
2747-
start = find_first_bit((unsigned long *)&f->field_mask,
2748-
f->field_bsize);
2756+
start = find_first_bit(&field_mask, f->field_bsize);
27492757

27502758
MLX5_SET(set_action_in, action, offset, first - start);
27512759
/* length is num of bits to be written, zero means length of 32 */

0 commit comments

Comments
 (0)