Merge branch 'mlxsw-Two-fixes'
Ido Schimmel says: ==================== mlxsw: Two fixes This patchset contains two fixes for mlxsw. Patch #1 from Petr fixes an issue in which DSCP rewrite can occur even if the egress port was switched to Trust L2 mode where priority mapping is based on PCP. Patch #2 fixes a problem where packets can be learned on a non-existing FID if a tc filter with a redirect action is configured on a bridged port. The problem and fix are explained in detail in the commit message. Please consider both patches for 5.2.y ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
f1bf3e2ab4
|
@ -830,6 +830,7 @@ int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port,
|
|||
struct tc_prio_qopt_offload *p);
|
||||
|
||||
/* spectrum_fid.c */
|
||||
bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index);
|
||||
bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid);
|
||||
struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp,
|
||||
u16 fid_index);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -126,6 +126,16 @@ static const int *mlxsw_sp_packet_type_sfgc_types[] = {
|
|||
[MLXSW_SP_FLOOD_TYPE_MC] = mlxsw_sp_sfgc_mc_packet_types,
|
||||
};
|
||||
|
||||
bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index)
|
||||
{
|
||||
enum mlxsw_sp_fid_type fid_type = MLXSW_SP_FID_TYPE_DUMMY;
|
||||
struct mlxsw_sp_fid_family *fid_family;
|
||||
|
||||
fid_family = mlxsw_sp->fid_core->fid_family_arr[fid_type];
|
||||
|
||||
return fid_family->start_index == fid_index;
|
||||
}
|
||||
|
||||
bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid)
|
||||
{
|
||||
return fid->fid_family->lag_vid_valid;
|
||||
|
|
|
@ -2468,6 +2468,9 @@ static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp,
|
|||
goto just_remove;
|
||||
}
|
||||
|
||||
if (mlxsw_sp_fid_is_dummy(mlxsw_sp, fid))
|
||||
goto just_remove;
|
||||
|
||||
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid);
|
||||
if (!mlxsw_sp_port_vlan) {
|
||||
netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
|
||||
|
@ -2527,6 +2530,9 @@ static void mlxsw_sp_fdb_notify_mac_lag_process(struct mlxsw_sp *mlxsw_sp,
|
|||
goto just_remove;
|
||||
}
|
||||
|
||||
if (mlxsw_sp_fid_is_dummy(mlxsw_sp, fid))
|
||||
goto just_remove;
|
||||
|
||||
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid);
|
||||
if (!mlxsw_sp_port_vlan) {
|
||||
netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
|
||||
|
|
Loading…
Reference in a new issue