0001
0002
0003
0004 #ifndef _MLXSW_SPECTRUM_SPAN_H
0005 #define _MLXSW_SPECTRUM_SPAN_H
0006
0007 #include <linux/types.h>
0008 #include <linux/if_ether.h>
0009 #include <linux/refcount.h>
0010
0011 #include "spectrum_router.h"
0012
0013 struct mlxsw_sp;
0014 struct mlxsw_sp_port;
0015
0016
0017
0018
0019
0020
0021
0022 enum mlxsw_sp_span_session_id {
0023 MLXSW_SP_SPAN_SESSION_ID_BUFFER,
0024 MLXSW_SP_SPAN_SESSION_ID_SAMPLING,
0025
0026 __MLXSW_SP_SPAN_SESSION_ID_MAX = 8,
0027 };
0028
0029 struct mlxsw_sp_span_parms {
0030 struct mlxsw_sp_port *dest_port;
0031 unsigned int ttl;
0032 unsigned char dmac[ETH_ALEN];
0033 unsigned char smac[ETH_ALEN];
0034 union mlxsw_sp_l3addr daddr;
0035 union mlxsw_sp_l3addr saddr;
0036 u16 vid;
0037 u16 policer_id;
0038 bool policer_enable;
0039 enum mlxsw_sp_span_session_id session_id;
0040 };
0041
0042 enum mlxsw_sp_span_trigger {
0043 MLXSW_SP_SPAN_TRIGGER_INGRESS,
0044 MLXSW_SP_SPAN_TRIGGER_EGRESS,
0045 MLXSW_SP_SPAN_TRIGGER_TAIL_DROP,
0046 MLXSW_SP_SPAN_TRIGGER_EARLY_DROP,
0047 MLXSW_SP_SPAN_TRIGGER_ECN,
0048 };
0049
0050 struct mlxsw_sp_span_trigger_parms {
0051 int span_id;
0052 u32 probability_rate;
0053 };
0054
0055 struct mlxsw_sp_span_agent_parms {
0056 const struct net_device *to_dev;
0057 u16 policer_id;
0058 bool policer_enable;
0059 enum mlxsw_sp_span_session_id session_id;
0060 };
0061
0062 struct mlxsw_sp_span_entry_ops;
0063
0064 struct mlxsw_sp_span_ops {
0065 int (*init)(struct mlxsw_sp *mlxsw_sp);
0066 int (*policer_id_base_set)(struct mlxsw_sp *mlxsw_sp,
0067 u16 policer_id_base);
0068 };
0069
0070 struct mlxsw_sp_span_entry {
0071 const struct net_device *to_dev;
0072 const struct mlxsw_sp_span_entry_ops *ops;
0073 struct mlxsw_sp_span_parms parms;
0074 refcount_t ref_count;
0075 int id;
0076 };
0077
0078 struct mlxsw_sp_span_entry_ops {
0079 bool is_static;
0080 bool (*can_handle)(const struct net_device *to_dev);
0081 int (*parms_set)(struct mlxsw_sp *mlxsw_sp,
0082 const struct net_device *to_dev,
0083 struct mlxsw_sp_span_parms *sparmsp);
0084 int (*configure)(struct mlxsw_sp_span_entry *span_entry,
0085 struct mlxsw_sp_span_parms sparms);
0086 void (*deconfigure)(struct mlxsw_sp_span_entry *span_entry);
0087 };
0088
0089 int mlxsw_sp_span_init(struct mlxsw_sp *mlxsw_sp);
0090 void mlxsw_sp_span_fini(struct mlxsw_sp *mlxsw_sp);
0091 void mlxsw_sp_span_respin(struct mlxsw_sp *mlxsw_sp);
0092
0093 struct mlxsw_sp_span_entry *
0094 mlxsw_sp_span_entry_find_by_port(struct mlxsw_sp *mlxsw_sp,
0095 const struct net_device *to_dev);
0096
0097 void mlxsw_sp_span_entry_invalidate(struct mlxsw_sp *mlxsw_sp,
0098 struct mlxsw_sp_span_entry *span_entry);
0099
0100 int mlxsw_sp_span_port_mtu_update(struct mlxsw_sp_port *port, u16 mtu);
0101 void mlxsw_sp_span_speed_update_work(struct work_struct *work);
0102
0103 int mlxsw_sp_span_agent_get(struct mlxsw_sp *mlxsw_sp, int *p_span_id,
0104 const struct mlxsw_sp_span_agent_parms *parms);
0105 void mlxsw_sp_span_agent_put(struct mlxsw_sp *mlxsw_sp, int span_id);
0106 int mlxsw_sp_span_analyzed_port_get(struct mlxsw_sp_port *mlxsw_sp_port,
0107 bool ingress);
0108 void mlxsw_sp_span_analyzed_port_put(struct mlxsw_sp_port *mlxsw_sp_port,
0109 bool ingress);
0110 int mlxsw_sp_span_agent_bind(struct mlxsw_sp *mlxsw_sp,
0111 enum mlxsw_sp_span_trigger trigger,
0112 struct mlxsw_sp_port *mlxsw_sp_port,
0113 const struct mlxsw_sp_span_trigger_parms *parms);
0114 void
0115 mlxsw_sp_span_agent_unbind(struct mlxsw_sp *mlxsw_sp,
0116 enum mlxsw_sp_span_trigger trigger,
0117 struct mlxsw_sp_port *mlxsw_sp_port,
0118 const struct mlxsw_sp_span_trigger_parms *parms);
0119 int mlxsw_sp_span_trigger_enable(struct mlxsw_sp_port *mlxsw_sp_port,
0120 enum mlxsw_sp_span_trigger trigger, u8 tc);
0121 void mlxsw_sp_span_trigger_disable(struct mlxsw_sp_port *mlxsw_sp_port,
0122 enum mlxsw_sp_span_trigger trigger, u8 tc);
0123 bool mlxsw_sp_span_trigger_is_ingress(enum mlxsw_sp_span_trigger trigger);
0124
0125 extern const struct mlxsw_sp_span_ops mlxsw_sp1_span_ops;
0126 extern const struct mlxsw_sp_span_ops mlxsw_sp2_span_ops;
0127 extern const struct mlxsw_sp_span_ops mlxsw_sp3_span_ops;
0128
0129 #endif