1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2014-2021 Broadcom
3  * All rights reserved.
4  */
5 
6 #include "ulp_template_db_enum.h"
7 #include "ulp_template_struct.h"
8 #include "ulp_rte_parser.h"
9 
10 /*
11  * This structure has to be indexed based on the rte_flow_action_type that is
12  * part of DPDK. The below array is list of parsing functions for each of the
13  * flow actions that are supported.
14  */
15 struct bnxt_ulp_rte_act_info ulp_act_info[] = {
16 	[RTE_FLOW_ACTION_TYPE_END] = {
17 	.act_type                = BNXT_ULP_ACT_TYPE_END,
18 	.proto_act_func          = NULL
19 	},
20 	[RTE_FLOW_ACTION_TYPE_VOID] = {
21 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
22 	.proto_act_func          = ulp_rte_void_act_handler
23 	},
24 	[RTE_FLOW_ACTION_TYPE_PASSTHRU] = {
25 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
26 	.proto_act_func          = NULL
27 	},
28 	[RTE_FLOW_ACTION_TYPE_JUMP] = {
29 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
30 	.proto_act_func          = ulp_rte_jump_act_handler
31 	},
32 	[RTE_FLOW_ACTION_TYPE_MARK] = {
33 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
34 	.proto_act_func          = ulp_rte_mark_act_handler
35 	},
36 	[RTE_FLOW_ACTION_TYPE_FLAG] = {
37 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
38 	.proto_act_func          = NULL
39 	},
40 	[RTE_FLOW_ACTION_TYPE_QUEUE] = {
41 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
42 	.proto_act_func          = NULL
43 	},
44 	[RTE_FLOW_ACTION_TYPE_DROP] = {
45 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
46 	.proto_act_func          = ulp_rte_drop_act_handler
47 	},
48 	[RTE_FLOW_ACTION_TYPE_COUNT] = {
49 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
50 	.proto_act_func          = ulp_rte_count_act_handler
51 	},
52 	[RTE_FLOW_ACTION_TYPE_RSS] = {
53 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
54 	.proto_act_func          = ulp_rte_rss_act_handler
55 	},
56 	[RTE_FLOW_ACTION_TYPE_PF] = {
57 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
58 	.proto_act_func          = ulp_rte_pf_act_handler
59 	},
60 	[RTE_FLOW_ACTION_TYPE_VF] = {
61 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
62 	.proto_act_func          = ulp_rte_vf_act_handler
63 	},
64 	[RTE_FLOW_ACTION_TYPE_PHY_PORT] = {
65 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
66 	.proto_act_func          = ulp_rte_phy_port_act_handler
67 	},
68 	[RTE_FLOW_ACTION_TYPE_PORT_ID] = {
69 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
70 	.proto_act_func          = ulp_rte_port_id_act_handler
71 	},
72 	[RTE_FLOW_ACTION_TYPE_METER] = {
73 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
74 	.proto_act_func          = NULL
75 	},
76 	[RTE_FLOW_ACTION_TYPE_SECURITY] = {
77 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
78 	.proto_act_func          = NULL
79 	},
80 	[RTE_FLOW_ACTION_TYPE_OF_SET_MPLS_TTL] = {
81 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
82 	.proto_act_func          = NULL
83 	},
84 	[RTE_FLOW_ACTION_TYPE_OF_DEC_MPLS_TTL] = {
85 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
86 	.proto_act_func          = NULL
87 	},
88 	[RTE_FLOW_ACTION_TYPE_OF_SET_NW_TTL] = {
89 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
90 	.proto_act_func          = NULL
91 	},
92 	[RTE_FLOW_ACTION_TYPE_OF_DEC_NW_TTL] = {
93 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
94 	.proto_act_func          = NULL
95 	},
96 	[RTE_FLOW_ACTION_TYPE_OF_COPY_TTL_OUT] = {
97 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
98 	.proto_act_func          = NULL
99 	},
100 	[RTE_FLOW_ACTION_TYPE_OF_COPY_TTL_IN] = {
101 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
102 	.proto_act_func          = NULL
103 	},
104 	[RTE_FLOW_ACTION_TYPE_OF_POP_VLAN] = {
105 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
106 	.proto_act_func          = ulp_rte_of_pop_vlan_act_handler
107 	},
108 	[RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN] = {
109 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
110 	.proto_act_func          = ulp_rte_of_push_vlan_act_handler
111 	},
112 	[RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID] = {
113 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
114 	.proto_act_func          = ulp_rte_of_set_vlan_vid_act_handler
115 	},
116 	[RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP] = {
117 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
118 	.proto_act_func          = ulp_rte_of_set_vlan_pcp_act_handler
119 	},
120 	[RTE_FLOW_ACTION_TYPE_OF_POP_MPLS] = {
121 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
122 	.proto_act_func          = NULL
123 	},
124 	[RTE_FLOW_ACTION_TYPE_OF_PUSH_MPLS] = {
125 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
126 	.proto_act_func          = NULL
127 	},
128 	[RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP] = {
129 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
130 	.proto_act_func          = ulp_rte_vxlan_encap_act_handler
131 	},
132 	[RTE_FLOW_ACTION_TYPE_VXLAN_DECAP] = {
133 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
134 	.proto_act_func          = ulp_rte_vxlan_decap_act_handler
135 	},
136 	[RTE_FLOW_ACTION_TYPE_NVGRE_ENCAP] = {
137 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
138 	.proto_act_func          = NULL
139 	},
140 	[RTE_FLOW_ACTION_TYPE_NVGRE_DECAP] = {
141 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
142 	.proto_act_func          = NULL
143 	},
144 	[RTE_FLOW_ACTION_TYPE_RAW_ENCAP] = {
145 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
146 	.proto_act_func          = NULL
147 	},
148 	[RTE_FLOW_ACTION_TYPE_RAW_DECAP] = {
149 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
150 	.proto_act_func          = NULL
151 	},
152 	[RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC] = {
153 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
154 	.proto_act_func          = ulp_rte_set_ipv4_src_act_handler
155 	},
156 	[RTE_FLOW_ACTION_TYPE_SET_IPV4_DST] = {
157 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
158 	.proto_act_func          = ulp_rte_set_ipv4_dst_act_handler
159 	},
160 	[RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC] = {
161 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
162 	.proto_act_func          = NULL
163 	},
164 	[RTE_FLOW_ACTION_TYPE_SET_IPV6_DST] = {
165 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
166 	.proto_act_func          = NULL
167 	},
168 	[RTE_FLOW_ACTION_TYPE_SET_TP_SRC] = {
169 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
170 	.proto_act_func          = ulp_rte_set_tp_src_act_handler
171 	},
172 	[RTE_FLOW_ACTION_TYPE_SET_TP_DST] = {
173 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
174 	.proto_act_func          = ulp_rte_set_tp_dst_act_handler
175 	},
176 	[RTE_FLOW_ACTION_TYPE_MAC_SWAP] = {
177 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
178 	.proto_act_func          = NULL
179 	},
180 	[RTE_FLOW_ACTION_TYPE_DEC_TTL] = {
181 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
182 	.proto_act_func          = ulp_rte_dec_ttl_act_handler
183 	},
184 	[RTE_FLOW_ACTION_TYPE_SET_TTL] = {
185 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
186 	.proto_act_func          = NULL
187 	},
188 	[RTE_FLOW_ACTION_TYPE_SET_MAC_SRC] = {
189 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
190 	.proto_act_func          = NULL
191 	},
192 	[RTE_FLOW_ACTION_TYPE_SET_MAC_DST] = {
193 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
194 	.proto_act_func          = NULL
195 	},
196 	[RTE_FLOW_ACTION_TYPE_INC_TCP_SEQ] = {
197 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
198 	.proto_act_func          = NULL
199 	},
200 	[RTE_FLOW_ACTION_TYPE_DEC_TCP_SEQ] = {
201 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
202 	.proto_act_func          = NULL
203 	},
204 	[RTE_FLOW_ACTION_TYPE_INC_TCP_ACK] = {
205 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
206 	.proto_act_func          = NULL
207 	},
208 	[RTE_FLOW_ACTION_TYPE_DEC_TCP_ACK] = {
209 	.act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
210 	.proto_act_func          = NULL
211 	},
212 	[RTE_FLOW_ACTION_TYPE_SAMPLE] = {
213 	.act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
214 	.proto_act_func          = ulp_rte_sample_act_handler
215 	}
216 };
217 
218 /*
219  * This table has to be indexed based on the rte_flow_item_type that is part of
220  * DPDK. The below array is list of parsing functions for each of the flow items
221  * that are supported.
222  */
223 struct bnxt_ulp_rte_hdr_info ulp_hdr_info[] = {
224 	[RTE_FLOW_ITEM_TYPE_END] = {
225 	.hdr_type                = BNXT_ULP_HDR_TYPE_END,
226 	.proto_hdr_func          = NULL
227 	},
228 	[RTE_FLOW_ITEM_TYPE_VOID] = {
229 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
230 	.proto_hdr_func          = ulp_rte_void_hdr_handler
231 	},
232 	[RTE_FLOW_ITEM_TYPE_INVERT] = {
233 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
234 	.proto_hdr_func          = NULL
235 	},
236 	[RTE_FLOW_ITEM_TYPE_ANY] = {
237 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
238 	.proto_hdr_func          = ulp_rte_item_any_handler
239 	},
240 	[RTE_FLOW_ITEM_TYPE_PF] = {
241 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
242 	.proto_hdr_func          = ulp_rte_pf_hdr_handler
243 	},
244 	[RTE_FLOW_ITEM_TYPE_VF] = {
245 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
246 	.proto_hdr_func          = ulp_rte_vf_hdr_handler
247 	},
248 	[RTE_FLOW_ITEM_TYPE_PHY_PORT] = {
249 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
250 	.proto_hdr_func          = ulp_rte_phy_port_hdr_handler
251 	},
252 	[RTE_FLOW_ITEM_TYPE_PORT_ID] = {
253 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
254 	.proto_hdr_func          = ulp_rte_port_id_hdr_handler
255 	},
256 	[RTE_FLOW_ITEM_TYPE_RAW] = {
257 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
258 	.proto_hdr_func          = NULL
259 	},
260 	[RTE_FLOW_ITEM_TYPE_ETH] = {
261 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
262 	.proto_hdr_func          = ulp_rte_eth_hdr_handler
263 	},
264 	[RTE_FLOW_ITEM_TYPE_VLAN] = {
265 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
266 	.proto_hdr_func          = ulp_rte_vlan_hdr_handler
267 	},
268 	[RTE_FLOW_ITEM_TYPE_IPV4] = {
269 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
270 	.proto_hdr_func          = ulp_rte_ipv4_hdr_handler
271 	},
272 	[RTE_FLOW_ITEM_TYPE_IPV6] = {
273 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
274 	.proto_hdr_func          = ulp_rte_ipv6_hdr_handler
275 	},
276 	[RTE_FLOW_ITEM_TYPE_ICMP] = {
277 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
278 	.proto_hdr_func          = ulp_rte_icmp_hdr_handler
279 	},
280 	[RTE_FLOW_ITEM_TYPE_UDP] = {
281 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
282 	.proto_hdr_func          = ulp_rte_udp_hdr_handler
283 	},
284 	[RTE_FLOW_ITEM_TYPE_TCP] = {
285 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
286 	.proto_hdr_func          = ulp_rte_tcp_hdr_handler
287 	},
288 	[RTE_FLOW_ITEM_TYPE_SCTP] = {
289 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
290 	.proto_hdr_func          = NULL
291 	},
292 	[RTE_FLOW_ITEM_TYPE_VXLAN] = {
293 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
294 	.proto_hdr_func          = ulp_rte_vxlan_hdr_handler
295 	},
296 	[RTE_FLOW_ITEM_TYPE_E_TAG] = {
297 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
298 	.proto_hdr_func          = NULL
299 	},
300 	[RTE_FLOW_ITEM_TYPE_NVGRE] = {
301 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
302 	.proto_hdr_func          = NULL
303 	},
304 	[RTE_FLOW_ITEM_TYPE_MPLS] = {
305 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
306 	.proto_hdr_func          = NULL
307 	},
308 	[RTE_FLOW_ITEM_TYPE_GRE] = {
309 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
310 	.proto_hdr_func          = ulp_rte_gre_hdr_handler
311 	},
312 	[RTE_FLOW_ITEM_TYPE_FUZZY] = {
313 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
314 	.proto_hdr_func          = NULL
315 	},
316 	[RTE_FLOW_ITEM_TYPE_GTP] = {
317 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
318 	.proto_hdr_func          = NULL
319 	},
320 	[RTE_FLOW_ITEM_TYPE_GTPC] = {
321 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
322 	.proto_hdr_func          = NULL
323 	},
324 	[RTE_FLOW_ITEM_TYPE_GTPU] = {
325 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
326 	.proto_hdr_func          = NULL
327 	},
328 	[RTE_FLOW_ITEM_TYPE_ESP] = {
329 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
330 	.proto_hdr_func          = NULL
331 	},
332 	[RTE_FLOW_ITEM_TYPE_GENEVE] = {
333 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
334 	.proto_hdr_func          = NULL
335 	},
336 	[RTE_FLOW_ITEM_TYPE_VXLAN_GPE] = {
337 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
338 	.proto_hdr_func          = NULL
339 	},
340 	[RTE_FLOW_ITEM_TYPE_ARP_ETH_IPV4] = {
341 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
342 	.proto_hdr_func          = NULL
343 	},
344 	[RTE_FLOW_ITEM_TYPE_IPV6_EXT] = {
345 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
346 	.proto_hdr_func          = NULL
347 	},
348 	[RTE_FLOW_ITEM_TYPE_ICMP6] = {
349 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
350 	.proto_hdr_func          = ulp_rte_icmp6_hdr_handler
351 	},
352 	[RTE_FLOW_ITEM_TYPE_ICMP6_ND_NS] = {
353 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
354 	.proto_hdr_func          = NULL
355 	},
356 	[RTE_FLOW_ITEM_TYPE_ICMP6_ND_NA] = {
357 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
358 	.proto_hdr_func          = NULL
359 	},
360 	[RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT] = {
361 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
362 	.proto_hdr_func          = NULL
363 	},
364 	[RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_SLA_ETH] = {
365 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
366 	.proto_hdr_func          = NULL
367 	},
368 	[RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_TLA_ETH] = {
369 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
370 	.proto_hdr_func          = NULL
371 	},
372 	[RTE_FLOW_ITEM_TYPE_MARK] = {
373 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
374 	.proto_hdr_func          = NULL
375 	},
376 	[RTE_FLOW_ITEM_TYPE_META] = {
377 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
378 	.proto_hdr_func          = NULL
379 	},
380 	[RTE_FLOW_ITEM_TYPE_GRE_KEY] = {
381 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
382 	.proto_hdr_func          = NULL
383 	},
384 	[RTE_FLOW_ITEM_TYPE_GTP_PSC] = {
385 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
386 	.proto_hdr_func          = NULL
387 	},
388 	[RTE_FLOW_ITEM_TYPE_PPPOES] = {
389 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
390 	.proto_hdr_func          = NULL
391 	},
392 	[RTE_FLOW_ITEM_TYPE_PPPOED] = {
393 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
394 	.proto_hdr_func          = NULL
395 	},
396 	[RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID] = {
397 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
398 	.proto_hdr_func          = NULL
399 	},
400 	[RTE_FLOW_ITEM_TYPE_NSH] = {
401 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
402 	.proto_hdr_func          = NULL
403 	},
404 	[RTE_FLOW_ITEM_TYPE_IGMP] = {
405 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
406 	.proto_hdr_func          = NULL
407 	},
408 	[RTE_FLOW_ITEM_TYPE_AH] = {
409 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
410 	.proto_hdr_func          = NULL
411 	},
412 	[RTE_FLOW_ITEM_TYPE_HIGIG2] = {
413 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
414 	.proto_hdr_func          = NULL
415 	}
416 };
417