mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-20 04:37:11 +07:00
mlxsw: spectrum: Convert matchall-based mirroring to new SPAN API
In matchall-based mirroring, mirroring is not done with ACLs, but a SPAN agent is bound to the ingress / egress of a port and all incoming / outgoing traffic is mirrored. Convert this type of mirroring to use the new API. First the SPAN agent is resolved, then the port is marked as analyzed and its egress mirror buffer is potentially allocated. Lastly, the binding is performed. Signed-off-by: Ido Schimmel <idosch@mellanox.com> Reviewed-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c056618c53
commit
c1d7845dfb
@ -48,31 +48,57 @@ static int
|
||||
mlxsw_sp_mall_port_mirror_add(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
struct mlxsw_sp_mall_entry *mall_entry)
|
||||
{
|
||||
enum mlxsw_sp_span_type span_type;
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
struct mlxsw_sp_span_trigger_parms parms;
|
||||
enum mlxsw_sp_span_trigger trigger;
|
||||
int err;
|
||||
|
||||
if (!mall_entry->mirror.to_dev) {
|
||||
netdev_err(mlxsw_sp_port->dev, "Could not find requested device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
span_type = mall_entry->ingress ? MLXSW_SP_SPAN_INGRESS :
|
||||
MLXSW_SP_SPAN_EGRESS;
|
||||
return mlxsw_sp_span_mirror_add(mlxsw_sp_port,
|
||||
mall_entry->mirror.to_dev,
|
||||
span_type, true,
|
||||
&mall_entry->mirror.span_id);
|
||||
err = mlxsw_sp_span_agent_get(mlxsw_sp, mall_entry->mirror.to_dev,
|
||||
&mall_entry->mirror.span_id);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mlxsw_sp_span_analyzed_port_get(mlxsw_sp_port,
|
||||
mall_entry->ingress);
|
||||
if (err)
|
||||
goto err_analyzed_port_get;
|
||||
|
||||
trigger = mall_entry->ingress ? MLXSW_SP_SPAN_TRIGGER_INGRESS :
|
||||
MLXSW_SP_SPAN_TRIGGER_EGRESS;
|
||||
parms.span_id = mall_entry->mirror.span_id;
|
||||
err = mlxsw_sp_span_agent_bind(mlxsw_sp, trigger, mlxsw_sp_port,
|
||||
&parms);
|
||||
if (err)
|
||||
goto err_agent_bind;
|
||||
|
||||
return 0;
|
||||
|
||||
err_agent_bind:
|
||||
mlxsw_sp_span_analyzed_port_put(mlxsw_sp_port, mall_entry->ingress);
|
||||
err_analyzed_port_get:
|
||||
mlxsw_sp_span_agent_put(mlxsw_sp, mall_entry->mirror.span_id);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void
|
||||
mlxsw_sp_mall_port_mirror_del(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
struct mlxsw_sp_mall_entry *mall_entry)
|
||||
{
|
||||
enum mlxsw_sp_span_type span_type;
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
struct mlxsw_sp_span_trigger_parms parms;
|
||||
enum mlxsw_sp_span_trigger trigger;
|
||||
|
||||
span_type = mall_entry->ingress ? MLXSW_SP_SPAN_INGRESS :
|
||||
MLXSW_SP_SPAN_EGRESS;
|
||||
mlxsw_sp_span_mirror_del(mlxsw_sp_port, mall_entry->mirror.span_id,
|
||||
span_type, true);
|
||||
trigger = mall_entry->ingress ? MLXSW_SP_SPAN_TRIGGER_INGRESS :
|
||||
MLXSW_SP_SPAN_TRIGGER_EGRESS;
|
||||
parms.span_id = mall_entry->mirror.span_id;
|
||||
mlxsw_sp_span_agent_unbind(mlxsw_sp, trigger, mlxsw_sp_port, &parms);
|
||||
mlxsw_sp_span_analyzed_port_put(mlxsw_sp_port, mall_entry->ingress);
|
||||
mlxsw_sp_span_agent_put(mlxsw_sp, mall_entry->mirror.span_id);
|
||||
}
|
||||
|
||||
static int mlxsw_sp_mall_port_sample_set(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
|
Loading…
Reference in New Issue
Block a user