1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606  * Copyright(c) 2014-2020 Broadcom
3*2d9fd380Sjfb8856606  * All rights reserved.
4*2d9fd380Sjfb8856606  */
5*2d9fd380Sjfb8856606 
6*2d9fd380Sjfb8856606 #ifndef _ULP_RTE_PARSER_H_
7*2d9fd380Sjfb8856606 #define _ULP_RTE_PARSER_H_
8*2d9fd380Sjfb8856606 
9*2d9fd380Sjfb8856606 #include <rte_log.h>
10*2d9fd380Sjfb8856606 #include <rte_flow.h>
11*2d9fd380Sjfb8856606 #include <rte_flow_driver.h>
12*2d9fd380Sjfb8856606 #include "ulp_template_db_enum.h"
13*2d9fd380Sjfb8856606 #include "ulp_template_struct.h"
14*2d9fd380Sjfb8856606 #include "ulp_mapper.h"
15*2d9fd380Sjfb8856606 #include "bnxt_tf_common.h"
16*2d9fd380Sjfb8856606 
17*2d9fd380Sjfb8856606 /* defines to be used in the tunnel header parsing */
18*2d9fd380Sjfb8856606 #define BNXT_ULP_ENCAP_IPV4_VER_HLEN_TOS	2
19*2d9fd380Sjfb8856606 #define BNXT_ULP_ENCAP_IPV4_ID_PROTO		6
20*2d9fd380Sjfb8856606 #define BNXT_ULP_ENCAP_IPV4_DEST_IP		4
21*2d9fd380Sjfb8856606 #define BNXT_ULP_ENCAP_IPV4_SIZE		12
22*2d9fd380Sjfb8856606 #define BNXT_ULP_ENCAP_IPV6_VTC_FLOW		4
23*2d9fd380Sjfb8856606 #define BNXT_ULP_ENCAP_IPV6_PROTO_TTL		2
24*2d9fd380Sjfb8856606 #define BNXT_ULP_ENCAP_IPV6_DO			2
25*2d9fd380Sjfb8856606 #define BNXT_ULP_ENCAP_IPV6_SIZE		24
26*2d9fd380Sjfb8856606 #define BNXT_ULP_ENCAP_UDP_SIZE			4
27*2d9fd380Sjfb8856606 #define BNXT_ULP_INVALID_SVIF_VAL		-1U
28*2d9fd380Sjfb8856606 
29*2d9fd380Sjfb8856606 #define	BNXT_ULP_GET_IPV6_VER(vtcf)		\
30*2d9fd380Sjfb8856606 			(((vtcf) & BNXT_ULP_PARSER_IPV6_VER_MASK) >> 28)
31*2d9fd380Sjfb8856606 #define	BNXT_ULP_GET_IPV6_TC(vtcf)		\
32*2d9fd380Sjfb8856606 			(((vtcf) & BNXT_ULP_PARSER_IPV6_TC) >> 20)
33*2d9fd380Sjfb8856606 #define	BNXT_ULP_GET_IPV6_FLOWLABEL(vtcf)	\
34*2d9fd380Sjfb8856606 			((vtcf) & BNXT_ULP_PARSER_IPV6_FLOW_LABEL)
35*2d9fd380Sjfb8856606 #define	BNXT_ULP_PARSER_IPV6_VER_MASK		0xf0000000
36*2d9fd380Sjfb8856606 #define	BNXT_ULP_PARSER_IPV6_TC			0x0ff00000
37*2d9fd380Sjfb8856606 #define	BNXT_ULP_PARSER_IPV6_FLOW_LABEL		0x000fffff
38*2d9fd380Sjfb8856606 
39*2d9fd380Sjfb8856606 void
40*2d9fd380Sjfb8856606 bnxt_ulp_init_mapper_params(struct bnxt_ulp_mapper_create_parms *mapper_cparms,
41*2d9fd380Sjfb8856606 			    struct ulp_rte_parser_params *params,
42*2d9fd380Sjfb8856606 			    enum bnxt_ulp_fdb_type flow_type);
43*2d9fd380Sjfb8856606 
44*2d9fd380Sjfb8856606 /* Function to handle the parsing of the RTE port id. */
45*2d9fd380Sjfb8856606 int32_t
46*2d9fd380Sjfb8856606 ulp_rte_parser_implicit_match_port_process(struct ulp_rte_parser_params *param);
47*2d9fd380Sjfb8856606 
48*2d9fd380Sjfb8856606 /* Function to handle the implicit action port id */
49*2d9fd380Sjfb8856606 int32_t
50*2d9fd380Sjfb8856606 ulp_rte_parser_implicit_act_port_process(struct ulp_rte_parser_params *params);
51*2d9fd380Sjfb8856606 
52*2d9fd380Sjfb8856606 /*
53*2d9fd380Sjfb8856606  * Function to handle the parsing of RTE Flows and placing
54*2d9fd380Sjfb8856606  * the RTE flow items into the ulp structures.
55*2d9fd380Sjfb8856606  */
56*2d9fd380Sjfb8856606 int32_t
57*2d9fd380Sjfb8856606 bnxt_ulp_rte_parser_hdr_parse(const struct rte_flow_item pattern[],
58*2d9fd380Sjfb8856606 			      struct ulp_rte_parser_params *params);
59*2d9fd380Sjfb8856606 
60*2d9fd380Sjfb8856606 /*
61*2d9fd380Sjfb8856606  * Function to handle the parsing of RTE Flows and placing
62*2d9fd380Sjfb8856606  * the RTE flow actions into the ulp structures.
63*2d9fd380Sjfb8856606  */
64*2d9fd380Sjfb8856606 int32_t
65*2d9fd380Sjfb8856606 bnxt_ulp_rte_parser_act_parse(const struct rte_flow_action actions[],
66*2d9fd380Sjfb8856606 			      struct ulp_rte_parser_params *params);
67*2d9fd380Sjfb8856606 
68*2d9fd380Sjfb8856606 /*
69*2d9fd380Sjfb8856606  * Function to handle the post processing of the parsing details
70*2d9fd380Sjfb8856606  */
71*2d9fd380Sjfb8856606 int32_t
72*2d9fd380Sjfb8856606 bnxt_ulp_rte_parser_post_process(struct ulp_rte_parser_params *params);
73*2d9fd380Sjfb8856606 
74*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow item PF Header. */
75*2d9fd380Sjfb8856606 int32_t
76*2d9fd380Sjfb8856606 ulp_rte_pf_hdr_handler(const struct rte_flow_item *item,
77*2d9fd380Sjfb8856606 		       struct ulp_rte_parser_params *params);
78*2d9fd380Sjfb8856606 
79*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow item VF Header. */
80*2d9fd380Sjfb8856606 int32_t
81*2d9fd380Sjfb8856606 ulp_rte_vf_hdr_handler(const struct rte_flow_item *item,
82*2d9fd380Sjfb8856606 		       struct ulp_rte_parser_params *params);
83*2d9fd380Sjfb8856606 
84*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow item port id Header. */
85*2d9fd380Sjfb8856606 int32_t
86*2d9fd380Sjfb8856606 ulp_rte_port_id_hdr_handler(const struct rte_flow_item *item,
87*2d9fd380Sjfb8856606 			    struct ulp_rte_parser_params *params);
88*2d9fd380Sjfb8856606 
89*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow item port Header. */
90*2d9fd380Sjfb8856606 int32_t
91*2d9fd380Sjfb8856606 ulp_rte_phy_port_hdr_handler(const struct rte_flow_item *item,
92*2d9fd380Sjfb8856606 			     struct ulp_rte_parser_params *params);
93*2d9fd380Sjfb8856606 
94*2d9fd380Sjfb8856606 /* Function to handle the RTE item Ethernet Header. */
95*2d9fd380Sjfb8856606 int32_t
96*2d9fd380Sjfb8856606 ulp_rte_eth_hdr_handler(const struct rte_flow_item *item,
97*2d9fd380Sjfb8856606 			struct ulp_rte_parser_params *params);
98*2d9fd380Sjfb8856606 
99*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow item Vlan Header. */
100*2d9fd380Sjfb8856606 int32_t
101*2d9fd380Sjfb8856606 ulp_rte_vlan_hdr_handler(const struct rte_flow_item *item,
102*2d9fd380Sjfb8856606 			 struct ulp_rte_parser_params *params);
103*2d9fd380Sjfb8856606 
104*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow item IPV4 Header. */
105*2d9fd380Sjfb8856606 int32_t
106*2d9fd380Sjfb8856606 ulp_rte_ipv4_hdr_handler(const struct rte_flow_item *item,
107*2d9fd380Sjfb8856606 			 struct ulp_rte_parser_params *params);
108*2d9fd380Sjfb8856606 
109*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow item IPV6 Header. */
110*2d9fd380Sjfb8856606 int32_t
111*2d9fd380Sjfb8856606 ulp_rte_ipv6_hdr_handler(const struct rte_flow_item *item,
112*2d9fd380Sjfb8856606 			 struct ulp_rte_parser_params *params);
113*2d9fd380Sjfb8856606 
114*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow item UDP Header. */
115*2d9fd380Sjfb8856606 int32_t
116*2d9fd380Sjfb8856606 ulp_rte_udp_hdr_handler(const struct rte_flow_item *item,
117*2d9fd380Sjfb8856606 			struct ulp_rte_parser_params *params);
118*2d9fd380Sjfb8856606 
119*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow item TCP Header. */
120*2d9fd380Sjfb8856606 int32_t
121*2d9fd380Sjfb8856606 ulp_rte_tcp_hdr_handler(const struct rte_flow_item *item,
122*2d9fd380Sjfb8856606 			struct ulp_rte_parser_params *params);
123*2d9fd380Sjfb8856606 
124*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow item Vxlan Header. */
125*2d9fd380Sjfb8856606 int32_t
126*2d9fd380Sjfb8856606 ulp_rte_vxlan_hdr_handler(const struct rte_flow_item *item,
127*2d9fd380Sjfb8856606 			  struct ulp_rte_parser_params *params);
128*2d9fd380Sjfb8856606 
129*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow item void Header. */
130*2d9fd380Sjfb8856606 int32_t
131*2d9fd380Sjfb8856606 ulp_rte_void_hdr_handler(const struct rte_flow_item *item,
132*2d9fd380Sjfb8856606 			 struct ulp_rte_parser_params *params);
133*2d9fd380Sjfb8856606 
134*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action void Header. */
135*2d9fd380Sjfb8856606 int32_t
136*2d9fd380Sjfb8856606 ulp_rte_void_act_handler(const struct rte_flow_action *action_item,
137*2d9fd380Sjfb8856606 			 struct ulp_rte_parser_params *params);
138*2d9fd380Sjfb8856606 
139*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action RSS Header. */
140*2d9fd380Sjfb8856606 int32_t
141*2d9fd380Sjfb8856606 ulp_rte_rss_act_handler(const struct rte_flow_action *action_item,
142*2d9fd380Sjfb8856606 			struct ulp_rte_parser_params *params);
143*2d9fd380Sjfb8856606 
144*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action Mark Header. */
145*2d9fd380Sjfb8856606 int32_t
146*2d9fd380Sjfb8856606 ulp_rte_mark_act_handler(const struct rte_flow_action *action_item,
147*2d9fd380Sjfb8856606 			 struct ulp_rte_parser_params *params);
148*2d9fd380Sjfb8856606 
149*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action vxlan_encap Header. */
150*2d9fd380Sjfb8856606 int32_t
151*2d9fd380Sjfb8856606 ulp_rte_vxlan_encap_act_handler(const struct rte_flow_action *action_item,
152*2d9fd380Sjfb8856606 				struct ulp_rte_parser_params *params);
153*2d9fd380Sjfb8856606 
154*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action vxlan_encap Header. */
155*2d9fd380Sjfb8856606 int32_t
156*2d9fd380Sjfb8856606 ulp_rte_vxlan_decap_act_handler(const struct rte_flow_action *action_item,
157*2d9fd380Sjfb8856606 				struct ulp_rte_parser_params *params);
158*2d9fd380Sjfb8856606 
159*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action drop Header. */
160*2d9fd380Sjfb8856606 int32_t
161*2d9fd380Sjfb8856606 ulp_rte_drop_act_handler(const struct rte_flow_action *action_item,
162*2d9fd380Sjfb8856606 			 struct ulp_rte_parser_params *params);
163*2d9fd380Sjfb8856606 
164*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action count. */
165*2d9fd380Sjfb8856606 int32_t
166*2d9fd380Sjfb8856606 ulp_rte_count_act_handler(const struct rte_flow_action *action_item,
167*2d9fd380Sjfb8856606 			  struct ulp_rte_parser_params *params);
168*2d9fd380Sjfb8856606 
169*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action PF. */
170*2d9fd380Sjfb8856606 int32_t
171*2d9fd380Sjfb8856606 ulp_rte_pf_act_handler(const struct rte_flow_action *action_item,
172*2d9fd380Sjfb8856606 		       struct ulp_rte_parser_params *params);
173*2d9fd380Sjfb8856606 
174*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action VF. */
175*2d9fd380Sjfb8856606 int32_t
176*2d9fd380Sjfb8856606 ulp_rte_vf_act_handler(const struct rte_flow_action *action_item,
177*2d9fd380Sjfb8856606 		       struct ulp_rte_parser_params *params);
178*2d9fd380Sjfb8856606 
179*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action port_id. */
180*2d9fd380Sjfb8856606 int32_t
181*2d9fd380Sjfb8856606 ulp_rte_port_id_act_handler(const struct rte_flow_action *act_item,
182*2d9fd380Sjfb8856606 			    struct ulp_rte_parser_params *params);
183*2d9fd380Sjfb8856606 
184*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action phy_port. */
185*2d9fd380Sjfb8856606 int32_t
186*2d9fd380Sjfb8856606 ulp_rte_phy_port_act_handler(const struct rte_flow_action *action_item,
187*2d9fd380Sjfb8856606 			     struct ulp_rte_parser_params *params);
188*2d9fd380Sjfb8856606 
189*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action pop vlan. */
190*2d9fd380Sjfb8856606 int32_t
191*2d9fd380Sjfb8856606 ulp_rte_of_pop_vlan_act_handler(const struct rte_flow_action *action_item,
192*2d9fd380Sjfb8856606 				struct ulp_rte_parser_params *params);
193*2d9fd380Sjfb8856606 
194*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action push vlan. */
195*2d9fd380Sjfb8856606 int32_t
196*2d9fd380Sjfb8856606 ulp_rte_of_push_vlan_act_handler(const struct rte_flow_action *action_item,
197*2d9fd380Sjfb8856606 				 struct ulp_rte_parser_params *params);
198*2d9fd380Sjfb8856606 
199*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action set vlan id. */
200*2d9fd380Sjfb8856606 int32_t
201*2d9fd380Sjfb8856606 ulp_rte_of_set_vlan_vid_act_handler(const struct rte_flow_action *action_item,
202*2d9fd380Sjfb8856606 				    struct ulp_rte_parser_params *params);
203*2d9fd380Sjfb8856606 
204*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action set vlan pcp. */
205*2d9fd380Sjfb8856606 int32_t
206*2d9fd380Sjfb8856606 ulp_rte_of_set_vlan_pcp_act_handler(const struct rte_flow_action *action_item,
207*2d9fd380Sjfb8856606 				    struct ulp_rte_parser_params *params);
208*2d9fd380Sjfb8856606 
209*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action set ipv4 src.*/
210*2d9fd380Sjfb8856606 int32_t
211*2d9fd380Sjfb8856606 ulp_rte_set_ipv4_src_act_handler(const struct rte_flow_action *action_item,
212*2d9fd380Sjfb8856606 				 struct ulp_rte_parser_params *params);
213*2d9fd380Sjfb8856606 
214*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action set ipv4 dst.*/
215*2d9fd380Sjfb8856606 int32_t
216*2d9fd380Sjfb8856606 ulp_rte_set_ipv4_dst_act_handler(const struct rte_flow_action *action_item,
217*2d9fd380Sjfb8856606 				 struct ulp_rte_parser_params *params);
218*2d9fd380Sjfb8856606 
219*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action set tp src.*/
220*2d9fd380Sjfb8856606 int32_t
221*2d9fd380Sjfb8856606 ulp_rte_set_tp_src_act_handler(const struct rte_flow_action *action_item,
222*2d9fd380Sjfb8856606 			       struct ulp_rte_parser_params *params);
223*2d9fd380Sjfb8856606 
224*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action set tp dst.*/
225*2d9fd380Sjfb8856606 int32_t
226*2d9fd380Sjfb8856606 ulp_rte_set_tp_dst_act_handler(const struct rte_flow_action *action_item,
227*2d9fd380Sjfb8856606 			       struct ulp_rte_parser_params *params);
228*2d9fd380Sjfb8856606 
229*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action dec ttl.*/
230*2d9fd380Sjfb8856606 int32_t
231*2d9fd380Sjfb8856606 ulp_rte_dec_ttl_act_handler(const struct rte_flow_action *action_item,
232*2d9fd380Sjfb8856606 			    struct ulp_rte_parser_params *params);
233*2d9fd380Sjfb8856606 
234*2d9fd380Sjfb8856606 /* Function to handle the parsing of RTE Flow action JUMP .*/
235*2d9fd380Sjfb8856606 int32_t
236*2d9fd380Sjfb8856606 ulp_rte_jump_act_handler(const struct rte_flow_action *action_item,
237*2d9fd380Sjfb8856606 			 struct ulp_rte_parser_params *params);
238*2d9fd380Sjfb8856606 
239*2d9fd380Sjfb8856606 #endif /* _ULP_RTE_PARSER_H_ */
240