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 | |