lkml.org 
[lkml]   [2024]   [Mar]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.7 18/61] net/mlx5: E-switch, Change flow rule destination checking
    Date
    From: Jianbo Liu <jianbol@nvidia.com>

    [ Upstream commit 85ea2c5c5ef5f24fe6e6e7028ddd90be1cb5d27e ]

    The checking in the cited commit is not accurate. In the common case,
    VF destination is internal, and uplink destination is external.
    However, uplink destination with packet reformat is considered as
    internal because firmware uses LB+hairpin to support it. Update the
    checking so header rewrite rules with both internal and external
    destinations are not allowed.

    Fixes: e0e22d59b47a ("net/mlx5: E-switch, Add checking for flow rule destinations")
    Signed-off-by: Jianbo Liu <jianbol@nvidia.com>
    Reviewed-by: Rahul Rameshbabu <rrameshbabu@nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../mellanox/mlx5/core/eswitch_offloads.c | 23 +++++++++++--------
    1 file changed, 14 insertions(+), 9 deletions(-)

    diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
    index 14b3bd3c5e2f7..baaae628b0a0f 100644
    --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
    +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
    @@ -535,21 +535,26 @@ esw_src_port_rewrite_supported(struct mlx5_eswitch *esw)
    }

    static bool
    -esw_dests_to_vf_pf_vports(struct mlx5_flow_destination *dests, int max_dest)
    +esw_dests_to_int_external(struct mlx5_flow_destination *dests, int max_dest)
    {
    - bool vf_dest = false, pf_dest = false;
    + bool internal_dest = false, external_dest = false;
    int i;

    for (i = 0; i < max_dest; i++) {
    - if (dests[i].type != MLX5_FLOW_DESTINATION_TYPE_VPORT)
    + if (dests[i].type != MLX5_FLOW_DESTINATION_TYPE_VPORT &&
    + dests[i].type != MLX5_FLOW_DESTINATION_TYPE_UPLINK)
    continue;

    - if (dests[i].vport.num == MLX5_VPORT_UPLINK)
    - pf_dest = true;
    + /* Uplink dest is external, but considered as internal
    + * if there is reformat because firmware uses LB+hairpin to support it.
    + */
    + if (dests[i].vport.num == MLX5_VPORT_UPLINK &&
    + !(dests[i].vport.flags & MLX5_FLOW_DEST_VPORT_REFORMAT_ID))
    + external_dest = true;
    else
    - vf_dest = true;
    + internal_dest = true;

    - if (vf_dest && pf_dest)
    + if (internal_dest && external_dest)
    return true;
    }

    @@ -695,9 +700,9 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,

    /* Header rewrite with combined wire+loopback in FDB is not allowed */
    if ((flow_act.action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) &&
    - esw_dests_to_vf_pf_vports(dest, i)) {
    + esw_dests_to_int_external(dest, i)) {
    esw_warn(esw->dev,
    - "FDB: Header rewrite with forwarding to both PF and VF is not allowed\n");
    + "FDB: Header rewrite with forwarding to both internal and external dests is not allowed\n");
    rule = ERR_PTR(-EINVAL);
    goto err_esw_get;
    }
    --
    2.43.0

    \
     
     \ /
      Last update: 2024-03-13 17:37    [W:4.140 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site