| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
- /* Copyright (c) 2018 Mellanox Technologies. All rights reserved */
- #ifndef _MLXSW_SPECTRUM_SPAN_H
- #define _MLXSW_SPECTRUM_SPAN_H
- #include <linux/types.h>
- #include <linux/if_ether.h>
- #include <linux/refcount.h>
- #include "spectrum_router.h"
- struct mlxsw_sp;
- struct mlxsw_sp_port;
- /* SPAN session identifiers that correspond to MLXSW_TRAP_ID_MIRROR_SESSION<i>
- * trap identifiers. The session identifier is an attribute of the SPAN agent,
- * which determines the trap identifier of packets that are mirrored to the
- * CPU. Packets that are trapped to the CPU for the same logical reason (e.g.,
- * buffer drops) should use the same session identifier.
- */
- enum mlxsw_sp_span_session_id {
- MLXSW_SP_SPAN_SESSION_ID_BUFFER,
- MLXSW_SP_SPAN_SESSION_ID_SAMPLING,
- __MLXSW_SP_SPAN_SESSION_ID_MAX = 8,
- };
- struct mlxsw_sp_span_parms {
- struct mlxsw_sp_port *dest_port; /* NULL for unoffloaded SPAN. */
- unsigned int ttl;
- unsigned char dmac[ETH_ALEN];
- unsigned char smac[ETH_ALEN];
- union mlxsw_sp_l3addr daddr;
- union mlxsw_sp_l3addr saddr;
- u16 vid;
- u16 policer_id;
- bool policer_enable;
- enum mlxsw_sp_span_session_id session_id;
- };
- enum mlxsw_sp_span_trigger {
- MLXSW_SP_SPAN_TRIGGER_INGRESS,
- MLXSW_SP_SPAN_TRIGGER_EGRESS,
- MLXSW_SP_SPAN_TRIGGER_TAIL_DROP,
- MLXSW_SP_SPAN_TRIGGER_EARLY_DROP,
- MLXSW_SP_SPAN_TRIGGER_ECN,
- };
- struct mlxsw_sp_span_trigger_parms {
- int span_id;
- u32 probability_rate;
- };
- struct mlxsw_sp_span_agent_parms {
- const struct net_device *to_dev;
- u16 policer_id;
- bool policer_enable;
- enum mlxsw_sp_span_session_id session_id;
- };
- struct mlxsw_sp_span_entry_ops;
- struct mlxsw_sp_span_ops {
- int (*init)(struct mlxsw_sp *mlxsw_sp);
- int (*policer_id_base_set)(struct mlxsw_sp *mlxsw_sp,
- u16 policer_id_base);
- };
- struct mlxsw_sp_span_entry {
- const struct net_device *to_dev;
- const struct mlxsw_sp_span_entry_ops *ops;
- struct mlxsw_sp_span_parms parms;
- refcount_t ref_count;
- int id;
- };
- struct mlxsw_sp_span_entry_ops {
- bool is_static;
- bool (*can_handle)(const struct net_device *to_dev);
- int (*parms_set)(struct mlxsw_sp *mlxsw_sp,
- const struct net_device *to_dev,
- struct mlxsw_sp_span_parms *sparmsp);
- int (*configure)(struct mlxsw_sp_span_entry *span_entry,
- struct mlxsw_sp_span_parms sparms);
- void (*deconfigure)(struct mlxsw_sp_span_entry *span_entry);
- };
- int mlxsw_sp_span_init(struct mlxsw_sp *mlxsw_sp);
- void mlxsw_sp_span_fini(struct mlxsw_sp *mlxsw_sp);
- void mlxsw_sp_span_respin(struct mlxsw_sp *mlxsw_sp);
- struct mlxsw_sp_span_entry *
- mlxsw_sp_span_entry_find_by_port(struct mlxsw_sp *mlxsw_sp,
- const struct net_device *to_dev);
- void mlxsw_sp_span_entry_invalidate(struct mlxsw_sp *mlxsw_sp,
- struct mlxsw_sp_span_entry *span_entry);
- int mlxsw_sp_span_agent_get(struct mlxsw_sp *mlxsw_sp, int *p_span_id,
- const struct mlxsw_sp_span_agent_parms *parms);
- void mlxsw_sp_span_agent_put(struct mlxsw_sp *mlxsw_sp, int span_id);
- int mlxsw_sp_span_analyzed_port_get(struct mlxsw_sp_port *mlxsw_sp_port,
- bool ingress);
- void mlxsw_sp_span_analyzed_port_put(struct mlxsw_sp_port *mlxsw_sp_port,
- bool ingress);
- int mlxsw_sp_span_agent_bind(struct mlxsw_sp *mlxsw_sp,
- enum mlxsw_sp_span_trigger trigger,
- struct mlxsw_sp_port *mlxsw_sp_port,
- const struct mlxsw_sp_span_trigger_parms *parms);
- void
- mlxsw_sp_span_agent_unbind(struct mlxsw_sp *mlxsw_sp,
- enum mlxsw_sp_span_trigger trigger,
- struct mlxsw_sp_port *mlxsw_sp_port,
- const struct mlxsw_sp_span_trigger_parms *parms);
- int mlxsw_sp_span_trigger_enable(struct mlxsw_sp_port *mlxsw_sp_port,
- enum mlxsw_sp_span_trigger trigger, u8 tc);
- void mlxsw_sp_span_trigger_disable(struct mlxsw_sp_port *mlxsw_sp_port,
- enum mlxsw_sp_span_trigger trigger, u8 tc);
- bool mlxsw_sp_span_trigger_is_ingress(enum mlxsw_sp_span_trigger trigger);
- extern const struct mlxsw_sp_span_ops mlxsw_sp1_span_ops;
- extern const struct mlxsw_sp_span_ops mlxsw_sp2_span_ops;
- extern const struct mlxsw_sp_span_ops mlxsw_sp3_span_ops;
- #endif
|