1*4882a593Smuzhiyun /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2*4882a593Smuzhiyun /* Copyright (c) 2018 Mellanox Technologies. All rights reserved */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef _MLXSW_SPECTRUM_SPAN_H 5*4882a593Smuzhiyun #define _MLXSW_SPECTRUM_SPAN_H 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <linux/types.h> 8*4882a593Smuzhiyun #include <linux/if_ether.h> 9*4882a593Smuzhiyun #include <linux/refcount.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include "spectrum_router.h" 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun struct mlxsw_sp; 14*4882a593Smuzhiyun struct mlxsw_sp_port; 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun struct mlxsw_sp_span_parms { 17*4882a593Smuzhiyun struct mlxsw_sp_port *dest_port; /* NULL for unoffloaded SPAN. */ 18*4882a593Smuzhiyun unsigned int ttl; 19*4882a593Smuzhiyun unsigned char dmac[ETH_ALEN]; 20*4882a593Smuzhiyun unsigned char smac[ETH_ALEN]; 21*4882a593Smuzhiyun union mlxsw_sp_l3addr daddr; 22*4882a593Smuzhiyun union mlxsw_sp_l3addr saddr; 23*4882a593Smuzhiyun u16 vid; 24*4882a593Smuzhiyun u16 policer_id; 25*4882a593Smuzhiyun bool policer_enable; 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun enum mlxsw_sp_span_trigger { 29*4882a593Smuzhiyun MLXSW_SP_SPAN_TRIGGER_INGRESS, 30*4882a593Smuzhiyun MLXSW_SP_SPAN_TRIGGER_EGRESS, 31*4882a593Smuzhiyun MLXSW_SP_SPAN_TRIGGER_TAIL_DROP, 32*4882a593Smuzhiyun MLXSW_SP_SPAN_TRIGGER_EARLY_DROP, 33*4882a593Smuzhiyun MLXSW_SP_SPAN_TRIGGER_ECN, 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun struct mlxsw_sp_span_trigger_parms { 37*4882a593Smuzhiyun int span_id; 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct mlxsw_sp_span_agent_parms { 41*4882a593Smuzhiyun const struct net_device *to_dev; 42*4882a593Smuzhiyun u16 policer_id; 43*4882a593Smuzhiyun bool policer_enable; 44*4882a593Smuzhiyun }; 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun struct mlxsw_sp_span_entry_ops; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun struct mlxsw_sp_span_ops { 49*4882a593Smuzhiyun int (*init)(struct mlxsw_sp *mlxsw_sp); 50*4882a593Smuzhiyun int (*policer_id_base_set)(struct mlxsw_sp *mlxsw_sp, 51*4882a593Smuzhiyun u16 policer_id_base); 52*4882a593Smuzhiyun }; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun struct mlxsw_sp_span_entry { 55*4882a593Smuzhiyun const struct net_device *to_dev; 56*4882a593Smuzhiyun const struct mlxsw_sp_span_entry_ops *ops; 57*4882a593Smuzhiyun struct mlxsw_sp_span_parms parms; 58*4882a593Smuzhiyun refcount_t ref_count; 59*4882a593Smuzhiyun int id; 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun struct mlxsw_sp_span_entry_ops { 63*4882a593Smuzhiyun bool is_static; 64*4882a593Smuzhiyun bool (*can_handle)(const struct net_device *to_dev); 65*4882a593Smuzhiyun int (*parms_set)(struct mlxsw_sp *mlxsw_sp, 66*4882a593Smuzhiyun const struct net_device *to_dev, 67*4882a593Smuzhiyun struct mlxsw_sp_span_parms *sparmsp); 68*4882a593Smuzhiyun int (*configure)(struct mlxsw_sp_span_entry *span_entry, 69*4882a593Smuzhiyun struct mlxsw_sp_span_parms sparms); 70*4882a593Smuzhiyun void (*deconfigure)(struct mlxsw_sp_span_entry *span_entry); 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun int mlxsw_sp_span_init(struct mlxsw_sp *mlxsw_sp); 74*4882a593Smuzhiyun void mlxsw_sp_span_fini(struct mlxsw_sp *mlxsw_sp); 75*4882a593Smuzhiyun void mlxsw_sp_span_respin(struct mlxsw_sp *mlxsw_sp); 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun struct mlxsw_sp_span_entry * 78*4882a593Smuzhiyun mlxsw_sp_span_entry_find_by_port(struct mlxsw_sp *mlxsw_sp, 79*4882a593Smuzhiyun const struct net_device *to_dev); 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun void mlxsw_sp_span_entry_invalidate(struct mlxsw_sp *mlxsw_sp, 82*4882a593Smuzhiyun struct mlxsw_sp_span_entry *span_entry); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun int mlxsw_sp_span_port_mtu_update(struct mlxsw_sp_port *port, u16 mtu); 85*4882a593Smuzhiyun void mlxsw_sp_span_speed_update_work(struct work_struct *work); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun int mlxsw_sp_span_agent_get(struct mlxsw_sp *mlxsw_sp, int *p_span_id, 88*4882a593Smuzhiyun const struct mlxsw_sp_span_agent_parms *parms); 89*4882a593Smuzhiyun void mlxsw_sp_span_agent_put(struct mlxsw_sp *mlxsw_sp, int span_id); 90*4882a593Smuzhiyun int mlxsw_sp_span_analyzed_port_get(struct mlxsw_sp_port *mlxsw_sp_port, 91*4882a593Smuzhiyun bool ingress); 92*4882a593Smuzhiyun void mlxsw_sp_span_analyzed_port_put(struct mlxsw_sp_port *mlxsw_sp_port, 93*4882a593Smuzhiyun bool ingress); 94*4882a593Smuzhiyun int mlxsw_sp_span_agent_bind(struct mlxsw_sp *mlxsw_sp, 95*4882a593Smuzhiyun enum mlxsw_sp_span_trigger trigger, 96*4882a593Smuzhiyun struct mlxsw_sp_port *mlxsw_sp_port, 97*4882a593Smuzhiyun const struct mlxsw_sp_span_trigger_parms *parms); 98*4882a593Smuzhiyun void 99*4882a593Smuzhiyun mlxsw_sp_span_agent_unbind(struct mlxsw_sp *mlxsw_sp, 100*4882a593Smuzhiyun enum mlxsw_sp_span_trigger trigger, 101*4882a593Smuzhiyun struct mlxsw_sp_port *mlxsw_sp_port, 102*4882a593Smuzhiyun const struct mlxsw_sp_span_trigger_parms *parms); 103*4882a593Smuzhiyun int mlxsw_sp_span_trigger_enable(struct mlxsw_sp_port *mlxsw_sp_port, 104*4882a593Smuzhiyun enum mlxsw_sp_span_trigger trigger, u8 tc); 105*4882a593Smuzhiyun void mlxsw_sp_span_trigger_disable(struct mlxsw_sp_port *mlxsw_sp_port, 106*4882a593Smuzhiyun enum mlxsw_sp_span_trigger trigger, u8 tc); 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun extern const struct mlxsw_sp_span_ops mlxsw_sp1_span_ops; 109*4882a593Smuzhiyun extern const struct mlxsw_sp_span_ops mlxsw_sp2_span_ops; 110*4882a593Smuzhiyun extern const struct mlxsw_sp_span_ops mlxsw_sp3_span_ops; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #endif 113