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 | }; |
136 | |
137 | struct mlx5_flow_context { |
138 | u32 flags; |
139 | u32 flow_tag; |
140 | u32 flow_source; |
141 | }; |
142 | |
143 | struct mlx5_flow_spec { |
144 | u8 match_criteria_enable; |
145 | u32 match_criteria[MLX5_ST_SZ_DW(fte_match_param)]; |
146 | u32 match_value[MLX5_ST_SZ_DW(fte_match_param)]; |
147 | struct mlx5_flow_context flow_context; |
148 | }; |
149 | |
150 | enum { |
151 | MLX5_FLOW_DEST_VPORT_VHCA_ID = BIT(0), |
152 | MLX5_FLOW_DEST_VPORT_REFORMAT_ID = BIT(1), |
153 | }; |
154 | |
155 | enum mlx5_flow_dest_range_field { |
156 | MLX5_FLOW_DEST_RANGE_FIELD_PKT_LEN = 0, |
157 | }; |
158 | |
159 | struct mlx5_flow_destination { |
160 | enum mlx5_flow_destination_type type; |
161 | union { |
162 | u32 tir_num; |
163 | u32 ft_num; |
164 | struct mlx5_flow_table *ft; |
165 | u32 counter_id; |
166 | struct { |
167 | u16 num; |
168 | u16 vhca_id; |
169 | struct mlx5_pkt_reformat *pkt_reformat; |
170 | u8 flags; |
171 | } vport; |
172 | struct { |
173 | struct mlx5_flow_table *hit_ft; |
174 | struct mlx5_flow_table *miss_ft; |
175 | enum mlx5_flow_dest_range_field field; |
176 | u32 min; |
177 | u32 max; |
178 | } range; |
179 | u32 sampler_id; |
180 | }; |
181 | }; |
182 | |
183 | struct mod_hdr_tbl { |
184 | struct mutex lock; /* protects hlist */ |
185 | DECLARE_HASHTABLE(hlist, 8); |
186 | }; |
187 | |
188 | struct mlx5_flow_namespace * |
189 | mlx5_get_fdb_sub_ns(struct mlx5_core_dev *dev, int n); |
190 | struct mlx5_flow_namespace * |
191 | mlx5_get_flow_namespace(struct mlx5_core_dev *dev, |
192 | enum mlx5_flow_namespace_type type); |
193 | struct mlx5_flow_namespace * |
194 | mlx5_get_flow_vport_acl_namespace(struct mlx5_core_dev *dev, |
195 | enum mlx5_flow_namespace_type type, |
196 | int vport); |
197 | |
198 | struct mlx5_flow_table_attr { |
199 | int prio; |
200 | int max_fte; |
201 | u32 level; |
202 | u32 flags; |
203 | u16 uid; |
204 | struct mlx5_flow_table *next_ft; |
205 | |
206 | struct { |
207 | int max_num_groups; |
208 | int num_reserved_entries; |
209 | } autogroup; |
210 | }; |
211 | |
212 | struct mlx5_flow_table * |
213 | mlx5_create_flow_table(struct mlx5_flow_namespace *ns, |
214 | struct mlx5_flow_table_attr *ft_attr); |
215 | |
216 | struct mlx5_flow_table * |
217 | mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns, |
218 | struct mlx5_flow_table_attr *ft_attr); |
219 | |
220 | struct mlx5_flow_table * |
221 | mlx5_create_vport_flow_table(struct mlx5_flow_namespace *ns, |
222 | struct mlx5_flow_table_attr *ft_attr, u16 vport); |
223 | struct mlx5_flow_table *mlx5_create_lag_demux_flow_table( |
224 | struct mlx5_flow_namespace *ns, |
225 | int prio, u32 level); |
226 | int mlx5_destroy_flow_table(struct mlx5_flow_table *ft); |
227 | |
228 | /* inbox should be set with the following values: |
229 | * start_flow_index |
230 | * end_flow_index |
231 | * match_criteria_enable |
232 | * match_criteria |
233 | */ |
234 | struct mlx5_flow_group * |
235 | mlx5_create_flow_group(struct mlx5_flow_table *ft, u32 *in); |
236 | void mlx5_destroy_flow_group(struct mlx5_flow_group *fg); |
237 | |
238 | struct mlx5_exe_aso { |
239 | u32 object_id; |
240 | u8 type; |
241 | u8 return_reg_id; |
242 | union { |
243 | u32 ctrl_data; |
244 | struct { |
245 | u8 meter_idx; |
246 | u8 init_color; |
247 | } flow_meter; |
248 | }; |
249 | }; |
250 | |
251 | struct mlx5_fs_vlan { |
252 | u16 ethtype; |
253 | u16 vid; |
254 | u8 prio; |
255 | }; |
256 | |
257 | #define MLX5_FS_VLAN_DEPTH 2 |
258 | |
259 | enum { |
260 | FLOW_ACT_NO_APPEND = BIT(0), |
261 | FLOW_ACT_IGNORE_FLOW_LEVEL = BIT(1), |
262 | }; |
263 | |
264 | struct mlx5_flow_act { |
265 | u32 action; |
266 | struct mlx5_modify_hdr *modify_hdr; |
267 | struct mlx5_pkt_reformat *pkt_reformat; |
268 | struct mlx5_flow_act_crypto_params { |
269 | u8 type; |
270 | u32 obj_id; |
271 | } crypto; |
272 | u32 flags; |
273 | struct mlx5_fs_vlan vlan[MLX5_FS_VLAN_DEPTH]; |
274 | struct ib_counters *counters; |
275 | struct mlx5_flow_group *fg; |
276 | struct mlx5_exe_aso exe_aso; |
277 | }; |
278 | |
279 | #define MLX5_DECLARE_FLOW_ACT(name) \ |
280 | struct mlx5_flow_act name = { .action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST,\ |
281 | .flags = 0, } |
282 | |
283 | /* Single destination per rule. |
284 | * Group ID is implied by the match criteria. |
285 | */ |
286 | struct mlx5_flow_handle * |
287 | mlx5_add_flow_rules(struct mlx5_flow_table *ft, |
288 | const struct mlx5_flow_spec *spec, |
289 | struct mlx5_flow_act *flow_act, |
290 | struct mlx5_flow_destination *dest, |
291 | int num_dest); |
292 | void mlx5_del_flow_rules(struct mlx5_flow_handle *fr); |
293 | |
294 | int mlx5_modify_rule_destination(struct mlx5_flow_handle *handler, |
295 | struct mlx5_flow_destination *new_dest, |
296 | struct mlx5_flow_destination *old_dest); |
297 | |
298 | struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging); |
299 | |
300 | /* As mlx5_fc_create() but doesn't queue stats refresh thread. */ |
301 | struct mlx5_fc *mlx5_fc_create_ex(struct mlx5_core_dev *dev, bool aging); |
302 | |
303 | void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter); |
304 | u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter); |
305 | void mlx5_fc_query_cached(struct mlx5_fc *counter, |
306 | u64 *bytes, u64 *packets, u64 *lastuse); |
307 | void mlx5_fc_query_cached_raw(struct mlx5_fc *counter, |
308 | u64 *bytes, u64 *packets, u64 *lastuse); |
309 | int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter, |
310 | u64 *packets, u64 *bytes); |
311 | u32 mlx5_fc_id(struct mlx5_fc *counter); |
312 | |
313 | int mlx5_fs_add_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn); |
314 | int mlx5_fs_remove_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn); |
315 | |
316 | struct mlx5_modify_hdr *(struct mlx5_core_dev *dev, |
317 | u8 ns_type, u8 num_actions, |
318 | void *modify_actions); |
319 | void (struct mlx5_core_dev *dev, |
320 | struct mlx5_modify_hdr *modify_hdr); |
321 | struct mlx5_flow_definer * |
322 | mlx5_create_match_definer(struct mlx5_core_dev *dev, |
323 | enum mlx5_flow_namespace_type ns_type, u16 format_id, |
324 | u32 *match_mask); |
325 | void mlx5_destroy_match_definer(struct mlx5_core_dev *dev, |
326 | struct mlx5_flow_definer *definer); |
327 | int mlx5_get_match_definer_id(struct mlx5_flow_definer *definer); |
328 | |
329 | struct mlx5_pkt_reformat_params { |
330 | int type; |
331 | u8 param_0; |
332 | u8 param_1; |
333 | size_t size; |
334 | void *data; |
335 | }; |
336 | |
337 | struct mlx5_pkt_reformat *mlx5_packet_reformat_alloc(struct mlx5_core_dev *dev, |
338 | struct mlx5_pkt_reformat_params *params, |
339 | enum mlx5_flow_namespace_type ns_type); |
340 | void mlx5_packet_reformat_dealloc(struct mlx5_core_dev *dev, |
341 | struct mlx5_pkt_reformat *reformat); |
342 | |
343 | u32 mlx5_flow_table_id(struct mlx5_flow_table *ft); |
344 | #endif |
345 | |