Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
0002 /* Copyright (c) 2018 Mellanox Technologies. All rights reserved */
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 /* SPAN session identifiers that correspond to MLXSW_TRAP_ID_MIRROR_SESSION<i>
0017  * trap identifiers. The session identifier is an attribute of the SPAN agent,
0018  * which determines the trap identifier of packets that are mirrored to the
0019  * CPU. Packets that are trapped to the CPU for the same logical reason (e.g.,
0020  * buffer drops) should use the same session identifier.
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; /* NULL for unoffloaded SPAN. */
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