From bac4da4d09d74702b027846c3e840d85a6569128 Mon Sep 17 00:00:00 2001 From: Eli Britstein Date: Wed, 10 Apr 2019 19:42:20 +0000 Subject: [PATCH] net/mlx5e: Fix no rewrite fields with the same match With commit f67c5e4cb2c4 ("net/mlx5e: Do not rewrite fields with the same match") there are no rewrites if the rewrite value is the same as the matched value. However, if the field is not matched, the rewrite is also wrongly skipped. Fix it. Fixes: f67c5e4cb2c4 ("net/mlx5e: Do not rewrite fields with the same match") Signed-off-by: Eli Britstein Reviewed-by: Roi Dayan Signed-off-by: Saeed Mahameed --- .../net/ethernet/mellanox/mlx5/core/en_tc.c | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index 542354b5eb4df..4722ac70f0a94 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c @@ -1916,6 +1916,19 @@ struct mlx5_fields { offsetof(struct pedit_headers, field) + (off), \ MLX5_BYTE_OFF(fte_match_set_lyr_2_4, match_field)} +/* masked values are the same and there are no rewrites that do not have a + * match. + */ +#define SAME_VAL_MASK(type, valp, maskp, matchvalp, matchmaskp) ({ \ + type matchmaskx = *(type *)(matchmaskp); \ + type matchvalx = *(type *)(matchvalp); \ + type maskx = *(type *)(maskp); \ + type valx = *(type *)(valp); \ + \ + (valx & maskx) == (matchvalx & matchmaskx) && !(maskx & (maskx ^ \ + matchmaskx)); \ +}) + static bool cmp_val_mask(void *valp, void *maskp, void *matchvalp, void *matchmaskp, int size) { @@ -1923,16 +1936,13 @@ static bool cmp_val_mask(void *valp, void *maskp, void *matchvalp, switch (size) { case sizeof(u8): - same = ((*(u8 *)valp) & (*(u8 *)maskp)) == - ((*(u8 *)matchvalp) & (*(u8 *)matchmaskp)); + same = SAME_VAL_MASK(u8, valp, maskp, matchvalp, matchmaskp); break; case sizeof(u16): - same = ((*(u16 *)valp) & (*(u16 *)maskp)) == - ((*(u16 *)matchvalp) & (*(u16 *)matchmaskp)); + same = SAME_VAL_MASK(u16, valp, maskp, matchvalp, matchmaskp); break; case sizeof(u32): - same = ((*(u32 *)valp) & (*(u32 *)maskp)) == - ((*(u32 *)matchvalp) & (*(u32 *)matchmaskp)); + same = SAME_VAL_MASK(u32, valp, maskp, matchvalp, matchmaskp); break; } -- 2.39.5