xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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