1 | /* |
2 | * Copyright (c) 2015, Mellanox Technologies. All rights reserved. |
3 | * |
4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU |
6 | * General Public License (GPL) Version 2, available from the file |
7 | * COPYING in the main directory of this source tree, or the |
8 | * OpenIB.org BSD license below: |
9 | * |
10 | * Redistribution and use in source and binary forms, with or |
11 | * without modification, are permitted provided that the following |
12 | * conditions are met: |
13 | * |
14 | * - Redistributions of source code must retain the above |
15 | * copyright notice, this list of conditions and the following |
16 | * disclaimer. |
17 | * |
18 | * - Redistributions in binary form must reproduce the above |
19 | * copyright notice, this list of conditions and the following |
20 | * disclaimer in the documentation and/or other materials |
21 | * provided with the distribution. |
22 | * |
23 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
24 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
25 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
26 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
27 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
28 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
29 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
30 | * SOFTWARE. |
31 | */ |
32 | |
33 | #ifndef _MLX5_FS_ |
34 | #define _MLX5_FS_ |
35 | |
36 | #include <linux/mlx5/driver.h> |
37 | #include <linux/mlx5/mlx5_ifc.h> |
38 | |
39 | #define MLX5_FS_DEFAULT_FLOW_TAG 0x0 |
40 | |
41 | #define MLX5_SET_CFG(p, f, v) MLX5_SET(create_flow_group_in, p, f, v) |
42 | |
43 | enum mlx5_flow_destination_type { |
44 | MLX5_FLOW_DESTINATION_TYPE_NONE, |
45 | MLX5_FLOW_DESTINATION_TYPE_VPORT, |
46 | MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE, |
47 | MLX5_FLOW_DESTINATION_TYPE_TIR, |
48 | MLX5_FLOW_DESTINATION_TYPE_FLOW_SAMPLER, |
49 | MLX5_FLOW_DESTINATION_TYPE_UPLINK, |
50 | MLX5_FLOW_DESTINATION_TYPE_PORT, |
51 | MLX5_FLOW_DESTINATION_TYPE_COUNTER, |
52 | MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM, |
53 | MLX5_FLOW_DESTINATION_TYPE_RANGE, |
54 | MLX5_FLOW_DESTINATION_TYPE_TABLE_TYPE, |
55 | }; |
56 | |
57 | enum { |
58 | MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO = 1 << 16, |
59 | MLX5_FLOW_CONTEXT_ACTION_ENCRYPT = 1 << 17, |
60 | MLX5_FLOW_CONTEXT_ACTION_DECRYPT = 1 << 18, |
61 | MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_NS = 1 << 19, |
62 | }; |
63 | |
64 | enum { |
65 | MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT = BIT(0), |
66 | MLX5_FLOW_TABLE_TUNNEL_EN_DECAP = BIT(1), |
67 | MLX5_FLOW_TABLE_TERMINATION = BIT(2), |
68 | MLX5_FLOW_TABLE_UNMANAGED = BIT(3), |
69 | MLX5_FLOW_TABLE_OTHER_VPORT = BIT(4), |
70 | MLX5_FLOW_TABLE_UPLINK_VPORT = BIT(5), |
71 | }; |
72 | |
73 | #define LEFTOVERS_RULE_NUM 2 |
74 | static inline void build_leftovers_ft_param(int *priority, |
75 | int *n_ent, |
76 | int *n_grp) |
77 | { |
78 | *priority = 0; /* Priority of leftovers_prio-0 */ |
79 | *n_ent = LEFTOVERS_RULE_NUM; |
80 | *n_grp = LEFTOVERS_RULE_NUM; |
81 | } |
82 | |
83 | enum mlx5_flow_namespace_type { |
84 | MLX5_FLOW_NAMESPACE_BYPASS, |
85 | MLX5_FLOW_NAMESPACE_KERNEL_RX_MACSEC, |
86 | MLX5_FLOW_NAMESPACE_LAG, |
87 | MLX5_FLOW_NAMESPACE_OFFLOADS, |
88 | MLX5_FLOW_NAMESPACE_ETHTOOL, |
89 | MLX5_FLOW_NAMESPACE_KERNEL, |
90 | MLX5_FLOW_NAMESPACE_LEFTOVERS, |
91 | MLX5_FLOW_NAMESPACE_ANCHOR, |
92 | MLX5_FLOW_NAMESPACE_FDB_BYPASS, |
93 | MLX5_FLOW_NAMESPACE_FDB, |
94 | MLX5_FLOW_NAMESPACE_ESW_EGRESS, |
95 | MLX5_FLOW_NAMESPACE_ESW_INGRESS, |
96 | MLX5_FLOW_NAMESPACE_SNIFFER_RX, |
97 | MLX5_FLOW_NAMESPACE_SNIFFER_TX, |
98 | MLX5_FLOW_NAMESPACE_EGRESS, |
99 | MLX5_FLOW_NAMESPACE_EGRESS_IPSEC, |
100 | MLX5_FLOW_NAMESPACE_EGRESS_MACSEC, |
101 | MLX5_FLOW_NAMESPACE_RDMA_RX, |
102 | MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL, |
103 | MLX5_FLOW_NAMESPACE_RDMA_TX, |
104 | MLX5_FLOW_NAMESPACE_PORT_SEL, |
105 | MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS, |
106 | MLX5_FLOW_NAMESPACE_RDMA_TX_COUNTERS, |
107 | MLX5_FLOW_NAMESPACE_RDMA_RX_IPSEC, |
108 | MLX5_FLOW_NAMESPACE_RDMA_TX_IPSEC, |
109 | MLX5_FLOW_NAMESPACE_RDMA_RX_MACSEC, |
110 | MLX5_FLOW_NAMESPACE_RDMA_TX_MACSEC, |
111 | }; |
112 | |
113 | enum { |
114 | FDB_BYPASS_PATH, |
115 | FDB_CRYPTO_INGRESS, |
116 | FDB_TC_OFFLOAD, |
117 | FDB_FT_OFFLOAD, |
118 | FDB_TC_MISS, |
119 | FDB_BR_OFFLOAD, |
120 | FDB_SLOW_PATH, |
121 | FDB_CRYPTO_EGRESS, |
122 | FDB_PER_VPORT, |
123 | }; |
124 | |
125 | struct mlx5_pkt_reformat; |
126 | struct mlx5_modify_hdr; |
127 | struct mlx5_flow_definer; |
128 | struct mlx5_flow_table; |
129 | struct mlx5_flow_group; |
130 | struct mlx5_flow_namespace; |
131 | struct mlx5_flow_handle; |
132 | |
133 | enum { |
134 | FLOW_CONTEXT_HAS_TAG = BIT(0), |
135 | FLOW_CONTEXT_UPLINK_HAIRPIN_EN = BIT(1), |
136 | }; |
137 | |
138 | struct mlx5_flow_context { |
139 | u32 flags; |
140 | u32 flow_tag; |
141 | u32 flow_source; |
142 | }; |
143 | |
144 | struct mlx5_flow_spec { |
145 | u8 match_criteria_enable; |
146 | u32 match_criteria[MLX5_ST_SZ_DW(fte_match_param)]; |
147 | u32 match_value[MLX5_ST_SZ_DW(fte_match_param)]; |
148 | struct mlx5_flow_context flow_context; |
149 | }; |
150 | |
151 | enum { |
152 | MLX5_FLOW_DEST_VPORT_VHCA_ID = BIT(0), |
153 | MLX5_FLOW_DEST_VPORT_REFORMAT_ID = BIT(1), |
154 | }; |
155 | |
156 | enum mlx5_flow_dest_range_field { |
157 | MLX5_FLOW_DEST_RANGE_FIELD_PKT_LEN = 0, |
158 | }; |
159 | |
160 | struct mlx5_flow_destination { |
161 | enum mlx5_flow_destination_type type; |
162 | union { |
163 | u32 tir_num; |
164 | u32 ft_num; |
165 | struct mlx5_flow_table *ft; |
166 | u32 counter_id; |
167 | struct { |
168 | u16 num; |
169 | u16 vhca_id; |
170 | struct mlx5_pkt_reformat *pkt_reformat; |
171 | u8 flags; |
172 | } vport; |
173 | struct { |
174 | struct mlx5_flow_table *hit_ft; |
175 | struct mlx5_flow_table *miss_ft; |
176 | enum mlx5_flow_dest_range_field field; |
177 | u32 min; |
178 | u32 max; |
179 | } range; |
180 | u32 sampler_id; |
181 | }; |
182 | }; |
183 | |
184 | struct mod_hdr_tbl { |
185 | struct mutex lock; /* protects hlist */ |
186 | DECLARE_HASHTABLE(hlist, 8); |
187 | }; |
188 | |
189 | struct mlx5_flow_namespace * |
190 | mlx5_get_fdb_sub_ns(struct mlx5_core_dev *dev, int n); |
191 | struct mlx5_flow_namespace * |
192 | mlx5_get_flow_namespace(struct mlx5_core_dev *dev, |
193 | enum mlx5_flow_namespace_type type); |
194 | struct mlx5_flow_namespace * |
195 | mlx5_get_flow_vport_acl_namespace(struct mlx5_core_dev *dev, |
196 | enum mlx5_flow_namespace_type type, |
197 | int vport); |
198 | |
199 | struct mlx5_flow_table_attr { |
200 | int prio; |
201 | int max_fte; |
202 | u32 level; |
203 | u32 flags; |
204 | u16 uid; |
205 | struct mlx5_flow_table *next_ft; |
206 | |
207 | struct { |
208 | int max_num_groups; |
209 | int num_reserved_entries; |
210 | } autogroup; |
211 | }; |
212 | |
213 | struct mlx5_flow_table * |
214 | mlx5_create_flow_table(struct mlx5_flow_namespace *ns, |
215 | struct mlx5_flow_table_attr *ft_attr); |
216 | |
217 | struct mlx5_flow_table * |
218 | mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns, |
219 | struct mlx5_flow_table_attr *ft_attr); |
220 | |
221 | struct mlx5_flow_table * |
222 | mlx5_create_vport_flow_table(struct mlx5_flow_namespace *ns, |
223 | struct mlx5_flow_table_attr *ft_attr, u16 vport); |
224 | struct mlx5_flow_table *mlx5_create_lag_demux_flow_table( |
225 | struct mlx5_flow_namespace *ns, |
226 | int prio, u32 level); |
227 | int mlx5_destroy_flow_table(struct mlx5_flow_table *ft); |
228 | |
229 | /* inbox should be set with the following values: |
230 | * start_flow_index |
231 | * end_flow_index |
232 | * match_criteria_enable |
233 | * match_criteria |
234 | */ |
235 | struct mlx5_flow_group * |
236 | mlx5_create_flow_group(struct mlx5_flow_table *ft, u32 *in); |
237 | void mlx5_destroy_flow_group(struct mlx5_flow_group *fg); |
238 | |
239 | struct mlx5_exe_aso { |
240 | u32 object_id; |
241 | u8 type; |
242 | u8 return_reg_id; |
243 | union { |
244 | u32 ctrl_data; |
245 | struct { |
246 | u8 meter_idx; |
247 | u8 init_color; |
248 | } flow_meter; |
249 | }; |
250 | }; |
251 | |
252 | struct mlx5_fs_vlan { |
253 | u16 ethtype; |
254 | u16 vid; |
255 | u8 prio; |
256 | }; |
257 | |
258 | #define MLX5_FS_VLAN_DEPTH 2 |
259 | |
260 | enum { |
261 | FLOW_ACT_NO_APPEND = BIT(0), |
262 | FLOW_ACT_IGNORE_FLOW_LEVEL = BIT(1), |
263 | }; |
264 | |
265 | struct mlx5_flow_act { |
266 | u32 action; |
267 | struct mlx5_modify_hdr *modify_hdr; |
268 | struct mlx5_pkt_reformat *pkt_reformat; |
269 | struct mlx5_flow_act_crypto_params { |
270 | u8 type; |
271 | u32 obj_id; |
272 | } crypto; |
273 | u32 flags; |
274 | struct mlx5_fs_vlan vlan[MLX5_FS_VLAN_DEPTH]; |
275 | struct ib_counters *counters; |
276 | struct mlx5_flow_group *fg; |
277 | struct mlx5_exe_aso exe_aso; |
278 | }; |
279 | |
280 | #define MLX5_DECLARE_FLOW_ACT(name) \ |
281 | struct mlx5_flow_act name = { .action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST,\ |
282 | .flags = 0, } |
283 | |
284 | /* Single destination per rule. |
285 | * Group ID is implied by the match criteria. |
286 | */ |
287 | struct mlx5_flow_handle * |
288 | mlx5_add_flow_rules(struct mlx5_flow_table *ft, |
289 | const struct mlx5_flow_spec *spec, |
290 | struct mlx5_flow_act *flow_act, |
291 | struct mlx5_flow_destination *dest, |
292 | int num_dest); |
293 | void mlx5_del_flow_rules(struct mlx5_flow_handle *fr); |
294 | |
295 | int mlx5_modify_rule_destination(struct mlx5_flow_handle *handler, |
296 | struct mlx5_flow_destination *new_dest, |
297 | struct mlx5_flow_destination *old_dest); |
298 | |
299 | struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging); |
300 | |
301 | /* As mlx5_fc_create() but doesn't queue stats refresh thread. */ |
302 | struct mlx5_fc *mlx5_fc_create_ex(struct mlx5_core_dev *dev, bool aging); |
303 | |
304 | void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter); |
305 | u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter); |
306 | void mlx5_fc_query_cached(struct mlx5_fc *counter, |
307 | u64 *bytes, u64 *packets, u64 *lastuse); |
308 | void mlx5_fc_query_cached_raw(struct mlx5_fc *counter, |
309 | u64 *bytes, u64 *packets, u64 *lastuse); |
310 | int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter, |
311 | u64 *packets, u64 *bytes); |
312 | u32 mlx5_fc_id(struct mlx5_fc *counter); |
313 | |
314 | int mlx5_fs_add_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn); |
315 | int mlx5_fs_remove_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn); |
316 | |
317 | struct mlx5_modify_hdr *(struct mlx5_core_dev *dev, |
318 | u8 ns_type, u8 num_actions, |
319 | void *modify_actions); |
320 | void (struct mlx5_core_dev *dev, |
321 | struct mlx5_modify_hdr *modify_hdr); |
322 | struct mlx5_flow_definer * |
323 | mlx5_create_match_definer(struct mlx5_core_dev *dev, |
324 | enum mlx5_flow_namespace_type ns_type, u16 format_id, |
325 | u32 *match_mask); |
326 | void mlx5_destroy_match_definer(struct mlx5_core_dev *dev, |
327 | struct mlx5_flow_definer *definer); |
328 | int mlx5_get_match_definer_id(struct mlx5_flow_definer *definer); |
329 | |
330 | struct mlx5_pkt_reformat_params { |
331 | int type; |
332 | u8 param_0; |
333 | u8 param_1; |
334 | size_t size; |
335 | void *data; |
336 | }; |
337 | |
338 | struct mlx5_pkt_reformat *mlx5_packet_reformat_alloc(struct mlx5_core_dev *dev, |
339 | struct mlx5_pkt_reformat_params *params, |
340 | enum mlx5_flow_namespace_type ns_type); |
341 | void mlx5_packet_reformat_dealloc(struct mlx5_core_dev *dev, |
342 | struct mlx5_pkt_reformat *reformat); |
343 | |
344 | u32 mlx5_flow_table_id(struct mlx5_flow_table *ft); |
345 | #endif |
346 | |