mirror of
https://github.com/torvalds/linux.git
synced 2024-12-11 21:52:04 +00:00
mlxsw: spectrum_span: Add SPAN probability rate support
Currently, every packet that matches a mirroring trigger (e.g., received packets, buffer dropped packets) is mirrored. Spectrum-2 and later ASICs support mirroring with probability, where every 1 in N matched packets is mirrored. Extend the API that creates the binding between the trigger and the SPAN agent with a probability rate parameter, which is an attribute of the trigger. Set it to '1' to maintain existing behavior. Subsequent patches will use it to perform more sophisticated sampling, by mirroring packets to the CPU with probability. Signed-off-by: Ido Schimmel <idosch@nvidia.com> Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
fa3faeb7ae
commit
2dcbd9207b
@ -51,6 +51,7 @@ mlxsw_sp_mall_port_mirror_add(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
trigger = mall_entry->ingress ? MLXSW_SP_SPAN_TRIGGER_INGRESS :
|
||||
MLXSW_SP_SPAN_TRIGGER_EGRESS;
|
||||
parms.span_id = mall_entry->mirror.span_id;
|
||||
parms.probability_rate = 1;
|
||||
err = mlxsw_sp_span_agent_bind(mlxsw_sp, trigger, mlxsw_sp_port,
|
||||
&parms);
|
||||
if (err)
|
||||
|
@ -1341,6 +1341,7 @@ static int mlxsw_sp_qevent_span_configure(struct mlxsw_sp *mlxsw_sp,
|
||||
goto err_analyzed_port_get;
|
||||
|
||||
trigger_parms.span_id = span_id;
|
||||
trigger_parms.probability_rate = 1;
|
||||
err = mlxsw_sp_span_agent_bind(mlxsw_sp, qevent_binding->span_trigger, mlxsw_sp_port,
|
||||
&trigger_parms);
|
||||
if (err)
|
||||
|
@ -1231,8 +1231,12 @@ __mlxsw_sp_span_trigger_port_bind(struct mlxsw_sp_span *span,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (trigger_entry->parms.probability_rate > MLXSW_REG_MPAR_RATE_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
mlxsw_reg_mpar_pack(mpar_pl, trigger_entry->local_port, i_e, enable,
|
||||
trigger_entry->parms.span_id, 1);
|
||||
trigger_entry->parms.span_id,
|
||||
trigger_entry->parms.probability_rate);
|
||||
return mlxsw_reg_write(span->mlxsw_sp->core, MLXSW_REG(mpar), mpar_pl);
|
||||
}
|
||||
|
||||
@ -1366,8 +1370,11 @@ mlxsw_sp2_span_trigger_global_bind(struct mlxsw_sp_span_trigger_entry *
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (trigger_entry->parms.probability_rate > MLXSW_REG_MPAGR_RATE_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
mlxsw_reg_mpagr_pack(mpagr_pl, trigger, trigger_entry->parms.span_id,
|
||||
1);
|
||||
trigger_entry->parms.probability_rate);
|
||||
return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(mpagr), mpagr_pl);
|
||||
}
|
||||
|
||||
@ -1565,7 +1572,9 @@ int mlxsw_sp_span_agent_bind(struct mlxsw_sp *mlxsw_sp,
|
||||
trigger,
|
||||
mlxsw_sp_port);
|
||||
if (trigger_entry) {
|
||||
if (trigger_entry->parms.span_id != parms->span_id)
|
||||
if (trigger_entry->parms.span_id != parms->span_id ||
|
||||
trigger_entry->parms.probability_rate !=
|
||||
parms->probability_rate)
|
||||
return -EINVAL;
|
||||
refcount_inc(&trigger_entry->ref_count);
|
||||
goto out;
|
||||
|
@ -48,6 +48,7 @@ enum mlxsw_sp_span_trigger {
|
||||
|
||||
struct mlxsw_sp_span_trigger_parms {
|
||||
int span_id;
|
||||
u32 probability_rate;
|
||||
};
|
||||
|
||||
struct mlxsw_sp_span_agent_parms {
|
||||
|
Loading…
Reference in New Issue
Block a user