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);
|
struct tc_prio_qopt_offload *p);
|
||||||
|
|
||||||
/* spectrum_fid.c */
|
/* 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);
|
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,
|
struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp,
|
||||||
u16 fid_index);
|
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,
|
have_dscp = mlxsw_sp_port_dcb_app_prio_dscp_map(mlxsw_sp_port,
|
||||||
&prio_map);
|
&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,
|
mlxsw_sp_port_dcb_app_dscp_prio_map(mlxsw_sp_port, default_prio,
|
||||||
&dscp_map);
|
&dscp_map);
|
||||||
err = mlxsw_sp_port_dcb_app_update_qpdpm(mlxsw_sp_port,
|
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;
|
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,
|
err = mlxsw_sp_port_dcb_toggle_trust(mlxsw_sp_port,
|
||||||
MLXSW_REG_QPTS_TRUST_STATE_DSCP);
|
MLXSW_REG_QPTS_TRUST_STATE_DSCP);
|
||||||
if (err) {
|
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,
|
[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)
|
bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid)
|
||||||
{
|
{
|
||||||
return fid->fid_family->lag_vid_valid;
|
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;
|
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);
|
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid);
|
||||||
if (!mlxsw_sp_port_vlan) {
|
if (!mlxsw_sp_port_vlan) {
|
||||||
netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
|
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;
|
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);
|
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid);
|
||||||
if (!mlxsw_sp_port_vlan) {
|
if (!mlxsw_sp_port_vlan) {
|
||||||
netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
|
netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user