lkml.org 
[lkml]   [2019]   [Aug]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 36/74] mlxsw: spectrum_dcb: Configure DSCP map as the last rule is removed
    Date
    [ Upstream commit dedfde2fe1c4ccf27179fcb234e2112d065c39bb ]

    Spectrum systems use DSCP rewrite map to update DSCP field in egressing
    packets to correspond to priority that the packet has. Whether rewriting
    will take place is determined at the point when the packet ingresses the
    switch: if the port is in Trust L3 mode, packet priority is determined from
    the DSCP map at the port, and DSCP rewrite will happen. If the port is in
    Trust L2 mode, 802.1p is used for packet prioritization, and no DSCP
    rewrite will happen.

    The driver determines the port trust mode based on whether any DSCP
    prioritization rules are in effect at given port. If there are any, trust
    level is L3, otherwise it's L2. When the last DSCP rule is removed, the
    port is switched to trust L2. Under that scenario, if DSCP of a packet
    should be rewritten, it should be rewritten to 0.

    However, when switching to Trust L2, the driver neglects to also update the
    DSCP rewrite map. The last DSCP rule thus remains in effect, and packets
    egressing through this port, if they have the right priority, will have
    their DSCP set according to this rule.

    Fix by first configuring the rewrite map, and only then switching to trust
    L2 and bailing out.

    Fixes: b2b1dab6884e ("mlxsw: spectrum: Support ieee_setapp, ieee_delapp")
    Signed-off-by: Petr Machata <petrm@mellanox.com>
    Reported-by: Alex Veber <alexve@mellanox.com>
    Tested-by: Alex Veber <alexve@mellanox.com>
    Signed-off-by: Ido Schimmel <idosch@mellanox.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../net/ethernet/mellanox/mlxsw/spectrum_dcb.c | 16 ++++++++--------
    1 file changed, 8 insertions(+), 8 deletions(-)

    diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c
    index b25048c6c7618..21296fa7f7fbf 100644
    --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c
    +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c
    @@ -408,14 +408,6 @@ static int mlxsw_sp_port_dcb_app_update(struct mlxsw_sp_port *mlxsw_sp_port)
    have_dscp = mlxsw_sp_port_dcb_app_prio_dscp_map(mlxsw_sp_port,
    &prio_map);

    - if (!have_dscp) {
    - err = mlxsw_sp_port_dcb_toggle_trust(mlxsw_sp_port,
    - MLXSW_REG_QPTS_TRUST_STATE_PCP);
    - if (err)
    - netdev_err(mlxsw_sp_port->dev, "Couldn't switch to trust L2\n");
    - return err;
    - }
    -
    mlxsw_sp_port_dcb_app_dscp_prio_map(mlxsw_sp_port, default_prio,
    &dscp_map);
    err = mlxsw_sp_port_dcb_app_update_qpdpm(mlxsw_sp_port,
    @@ -432,6 +424,14 @@ static int mlxsw_sp_port_dcb_app_update(struct mlxsw_sp_port *mlxsw_sp_port)
    return err;
    }

    + if (!have_dscp) {
    + err = mlxsw_sp_port_dcb_toggle_trust(mlxsw_sp_port,
    + MLXSW_REG_QPTS_TRUST_STATE_PCP);
    + if (err)
    + netdev_err(mlxsw_sp_port->dev, "Couldn't switch to trust L2\n");
    + return err;
    + }
    +
    err = mlxsw_sp_port_dcb_toggle_trust(mlxsw_sp_port,
    MLXSW_REG_QPTS_TRUST_STATE_DSCP);
    if (err) {
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-08-05 15:26    [W:4.264 / U:0.104 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site