1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2 /* Copyright (c) 2018 Mellanox Technologies. All rights reserved */ 3 4 #ifndef _MLXSW_SPECTRUM_SPAN_H 5 #define _MLXSW_SPECTRUM_SPAN_H 6 7 #include <linux/types.h> 8 #include <linux/if_ether.h> 9 #include <linux/refcount.h> 10 11 #include "spectrum_router.h" 12 13 struct mlxsw_sp; 14 struct mlxsw_sp_port; 15 16 /* SPAN session identifiers that correspond to MLXSW_TRAP_ID_MIRROR_SESSION<i> 17 * trap identifiers. The session identifier is an attribute of the SPAN agent, 18 * which determines the trap identifier of packets that are mirrored to the 19 * CPU. Packets that are trapped to the CPU for the same logical reason (e.g., 20 * buffer drops) should use the same session identifier. 21 */ 22 enum mlxsw_sp_span_session_id { 23 MLXSW_SP_SPAN_SESSION_ID_BUFFER, 24 MLXSW_SP_SPAN_SESSION_ID_SAMPLING, 25 26 __MLXSW_SP_SPAN_SESSION_ID_MAX = 8, 27 }; 28 29 struct mlxsw_sp_span_parms { 30 struct mlxsw_sp_port *dest_port; /* NULL for unoffloaded SPAN. */ 31 unsigned int ttl; 32 unsigned char dmac[ETH_ALEN]; 33 unsigned char smac[ETH_ALEN]; 34 union mlxsw_sp_l3addr daddr; 35 union mlxsw_sp_l3addr saddr; 36 u16 vid; 37 u16 policer_id; 38 bool policer_enable; 39 enum mlxsw_sp_span_session_id session_id; 40 }; 41 42 enum mlxsw_sp_span_trigger { 43 MLXSW_SP_SPAN_TRIGGER_INGRESS, 44 MLXSW_SP_SPAN_TRIGGER_EGRESS, 45 MLXSW_SP_SPAN_TRIGGER_TAIL_DROP, 46 MLXSW_SP_SPAN_TRIGGER_EARLY_DROP, 47 MLXSW_SP_SPAN_TRIGGER_ECN, 48 }; 49 50 struct mlxsw_sp_span_trigger_parms { 51 int span_id; 52 u32 probability_rate; 53 }; 54 55 struct mlxsw_sp_span_agent_parms { 56 const struct net_device *to_dev; 57 u16 policer_id; 58 bool policer_enable; 59 enum mlxsw_sp_span_session_id session_id; 60 }; 61 62 struct mlxsw_sp_span_entry_ops; 63 64 struct mlxsw_sp_span_ops { 65 int (*init)(struct mlxsw_sp *mlxsw_sp); 66 int (*policer_id_base_set)(struct mlxsw_sp *mlxsw_sp, 67 u16 policer_id_base); 68 }; 69 70 struct mlxsw_sp_span_entry { 71 const struct net_device *to_dev; 72 const struct mlxsw_sp_span_entry_ops *ops; 73 struct mlxsw_sp_span_parms parms; 74 refcount_t ref_count; 75 int id; 76 }; 77 78 struct mlxsw_sp_span_entry_ops { 79 bool is_static; 80 bool (*can_handle)(const struct net_device *to_dev); 81 int (*parms_set)(struct mlxsw_sp *mlxsw_sp, 82 const struct net_device *to_dev, 83 struct mlxsw_sp_span_parms *sparmsp); 84 int (*configure)(struct mlxsw_sp_span_entry *span_entry, 85 struct mlxsw_sp_span_parms sparms); 86 void (*deconfigure)(struct mlxsw_sp_span_entry *span_entry); 87 }; 88 89 int mlxsw_sp_span_init(struct mlxsw_sp *mlxsw_sp); 90 void mlxsw_sp_span_fini(struct mlxsw_sp *mlxsw_sp); 91 void mlxsw_sp_span_respin(struct mlxsw_sp *mlxsw_sp); 92 93 struct mlxsw_sp_span_entry * 94 mlxsw_sp_span_entry_find_by_port(struct mlxsw_sp *mlxsw_sp, 95 const struct net_device *to_dev); 96 void mlxsw_sp_span_entry_invalidate(struct mlxsw_sp *mlxsw_sp, 97 struct mlxsw_sp_span_entry *span_entry); 98 int mlxsw_sp_span_agent_get(struct mlxsw_sp *mlxsw_sp, int *p_span_id, 99 const struct mlxsw_sp_span_agent_parms *parms); 100 void mlxsw_sp_span_agent_put(struct mlxsw_sp *mlxsw_sp, int span_id); 101 int mlxsw_sp_span_analyzed_port_get(struct mlxsw_sp_port *mlxsw_sp_port, 102 bool ingress); 103 void mlxsw_sp_span_analyzed_port_put(struct mlxsw_sp_port *mlxsw_sp_port, 104 bool ingress); 105 int mlxsw_sp_span_agent_bind(struct mlxsw_sp *mlxsw_sp, 106 enum mlxsw_sp_span_trigger trigger, 107 struct mlxsw_sp_port *mlxsw_sp_port, 108 const struct mlxsw_sp_span_trigger_parms *parms); 109 void 110 mlxsw_sp_span_agent_unbind(struct mlxsw_sp *mlxsw_sp, 111 enum mlxsw_sp_span_trigger trigger, 112 struct mlxsw_sp_port *mlxsw_sp_port, 113 const struct mlxsw_sp_span_trigger_parms *parms); 114 int mlxsw_sp_span_trigger_enable(struct mlxsw_sp_port *mlxsw_sp_port, 115 enum mlxsw_sp_span_trigger trigger, u8 tc); 116 void mlxsw_sp_span_trigger_disable(struct mlxsw_sp_port *mlxsw_sp_port, 117 enum mlxsw_sp_span_trigger trigger, u8 tc); 118 bool mlxsw_sp_span_trigger_is_ingress(enum mlxsw_sp_span_trigger trigger); 119 120 extern const struct mlxsw_sp_span_ops mlxsw_sp1_span_ops; 121 extern const struct mlxsw_sp_span_ops mlxsw_sp2_span_ops; 122 extern const struct mlxsw_sp_span_ops mlxsw_sp3_span_ops; 123 124 #endif 125