1*d65e841dSYevgeny Kliteynik // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
2*d65e841dSYevgeny Kliteynik /* Copyright (c) 2020 NVIDIA CORPORATION. All rights reserved. */
3*d65e841dSYevgeny Kliteynik 
4*d65e841dSYevgeny Kliteynik #include <linux/types.h>
5*d65e841dSYevgeny Kliteynik #include <linux/crc32.h>
6*d65e841dSYevgeny Kliteynik #include "dr_ste.h"
7*d65e841dSYevgeny Kliteynik 
8*d65e841dSYevgeny Kliteynik #define DR_STE_CALC_LU_TYPE(lookup_type, rx, inner) \
9*d65e841dSYevgeny Kliteynik 	((inner) ? MLX5DR_STE_LU_TYPE_##lookup_type##_I : \
10*d65e841dSYevgeny Kliteynik 		   (rx) ? MLX5DR_STE_LU_TYPE_##lookup_type##_D : \
11*d65e841dSYevgeny Kliteynik 			  MLX5DR_STE_LU_TYPE_##lookup_type##_O)
12*d65e841dSYevgeny Kliteynik 
13*d65e841dSYevgeny Kliteynik static void
14*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_dst_bit_mask(struct mlx5dr_match_param *value,
15*d65e841dSYevgeny Kliteynik 					bool inner, u8 *bit_mask)
16*d65e841dSYevgeny Kliteynik {
17*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer;
18*d65e841dSYevgeny Kliteynik 
19*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_src_dst, bit_mask, dmac_47_16, mask, dmac_47_16);
20*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_src_dst, bit_mask, dmac_15_0, mask, dmac_15_0);
21*d65e841dSYevgeny Kliteynik 
22*d65e841dSYevgeny Kliteynik 	if (mask->smac_47_16 || mask->smac_15_0) {
23*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_src_dst, bit_mask, smac_47_32,
24*d65e841dSYevgeny Kliteynik 			 mask->smac_47_16 >> 16);
25*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_src_dst, bit_mask, smac_31_0,
26*d65e841dSYevgeny Kliteynik 			 mask->smac_47_16 << 16 | mask->smac_15_0);
27*d65e841dSYevgeny Kliteynik 		mask->smac_47_16 = 0;
28*d65e841dSYevgeny Kliteynik 		mask->smac_15_0 = 0;
29*d65e841dSYevgeny Kliteynik 	}
30*d65e841dSYevgeny Kliteynik 
31*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_src_dst, bit_mask, first_vlan_id, mask, first_vid);
32*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_src_dst, bit_mask, first_cfi, mask, first_cfi);
33*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_src_dst, bit_mask, first_priority, mask, first_prio);
34*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK(eth_l2_src_dst, bit_mask, l3_type, mask, ip_version);
35*d65e841dSYevgeny Kliteynik 
36*d65e841dSYevgeny Kliteynik 	if (mask->cvlan_tag) {
37*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_src_dst, bit_mask, first_vlan_qualifier, -1);
38*d65e841dSYevgeny Kliteynik 		mask->cvlan_tag = 0;
39*d65e841dSYevgeny Kliteynik 	} else if (mask->svlan_tag) {
40*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_src_dst, bit_mask, first_vlan_qualifier, -1);
41*d65e841dSYevgeny Kliteynik 		mask->svlan_tag = 0;
42*d65e841dSYevgeny Kliteynik 	}
43*d65e841dSYevgeny Kliteynik }
44*d65e841dSYevgeny Kliteynik 
45*d65e841dSYevgeny Kliteynik static int
46*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_dst_tag(struct mlx5dr_match_param *value,
47*d65e841dSYevgeny Kliteynik 				   struct mlx5dr_ste_build *sb,
48*d65e841dSYevgeny Kliteynik 				   u8 *tag)
49*d65e841dSYevgeny Kliteynik {
50*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer;
51*d65e841dSYevgeny Kliteynik 
52*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_src_dst, tag, dmac_47_16, spec, dmac_47_16);
53*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_src_dst, tag, dmac_15_0, spec, dmac_15_0);
54*d65e841dSYevgeny Kliteynik 
55*d65e841dSYevgeny Kliteynik 	if (spec->smac_47_16 || spec->smac_15_0) {
56*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_src_dst, tag, smac_47_32,
57*d65e841dSYevgeny Kliteynik 			 spec->smac_47_16 >> 16);
58*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_src_dst, tag, smac_31_0,
59*d65e841dSYevgeny Kliteynik 			 spec->smac_47_16 << 16 | spec->smac_15_0);
60*d65e841dSYevgeny Kliteynik 		spec->smac_47_16 = 0;
61*d65e841dSYevgeny Kliteynik 		spec->smac_15_0 = 0;
62*d65e841dSYevgeny Kliteynik 	}
63*d65e841dSYevgeny Kliteynik 
64*d65e841dSYevgeny Kliteynik 	if (spec->ip_version) {
65*d65e841dSYevgeny Kliteynik 		if (spec->ip_version == IP_VERSION_IPV4) {
66*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_eth_l2_src_dst, tag, l3_type, STE_IPV4);
67*d65e841dSYevgeny Kliteynik 			spec->ip_version = 0;
68*d65e841dSYevgeny Kliteynik 		} else if (spec->ip_version == IP_VERSION_IPV6) {
69*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_eth_l2_src_dst, tag, l3_type, STE_IPV6);
70*d65e841dSYevgeny Kliteynik 			spec->ip_version = 0;
71*d65e841dSYevgeny Kliteynik 		} else {
72*d65e841dSYevgeny Kliteynik 			return -EINVAL;
73*d65e841dSYevgeny Kliteynik 		}
74*d65e841dSYevgeny Kliteynik 	}
75*d65e841dSYevgeny Kliteynik 
76*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_src_dst, tag, first_vlan_id, spec, first_vid);
77*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_src_dst, tag, first_cfi, spec, first_cfi);
78*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_src_dst, tag, first_priority, spec, first_prio);
79*d65e841dSYevgeny Kliteynik 
80*d65e841dSYevgeny Kliteynik 	if (spec->cvlan_tag) {
81*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_src_dst, tag, first_vlan_qualifier, DR_STE_CVLAN);
82*d65e841dSYevgeny Kliteynik 		spec->cvlan_tag = 0;
83*d65e841dSYevgeny Kliteynik 	} else if (spec->svlan_tag) {
84*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_src_dst, tag, first_vlan_qualifier, DR_STE_SVLAN);
85*d65e841dSYevgeny Kliteynik 		spec->svlan_tag = 0;
86*d65e841dSYevgeny Kliteynik 	}
87*d65e841dSYevgeny Kliteynik 	return 0;
88*d65e841dSYevgeny Kliteynik }
89*d65e841dSYevgeny Kliteynik 
90*d65e841dSYevgeny Kliteynik static void
91*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_dst_init(struct mlx5dr_ste_build *sb,
92*d65e841dSYevgeny Kliteynik 				    struct mlx5dr_match_param *mask)
93*d65e841dSYevgeny Kliteynik {
94*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_eth_l2_src_dst_bit_mask(mask, sb->inner, sb->bit_mask);
95*d65e841dSYevgeny Kliteynik 
96*d65e841dSYevgeny Kliteynik 	sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL2_SRC_DST, sb->rx, sb->inner);
97*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
98*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_eth_l2_src_dst_tag;
99*d65e841dSYevgeny Kliteynik }
100*d65e841dSYevgeny Kliteynik 
101*d65e841dSYevgeny Kliteynik static void
102*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_dst_bit_mask(struct mlx5dr_match_param *value,
103*d65e841dSYevgeny Kliteynik 					 bool inner, u8 *bit_mask)
104*d65e841dSYevgeny Kliteynik {
105*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer;
106*d65e841dSYevgeny Kliteynik 
107*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv6_dst, bit_mask, dst_ip_127_96, mask, dst_ip_127_96);
108*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv6_dst, bit_mask, dst_ip_95_64, mask, dst_ip_95_64);
109*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv6_dst, bit_mask, dst_ip_63_32, mask, dst_ip_63_32);
110*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv6_dst, bit_mask, dst_ip_31_0, mask, dst_ip_31_0);
111*d65e841dSYevgeny Kliteynik }
112*d65e841dSYevgeny Kliteynik 
113*d65e841dSYevgeny Kliteynik static int
114*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_dst_tag(struct mlx5dr_match_param *value,
115*d65e841dSYevgeny Kliteynik 				    struct mlx5dr_ste_build *sb,
116*d65e841dSYevgeny Kliteynik 				    u8 *tag)
117*d65e841dSYevgeny Kliteynik {
118*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer;
119*d65e841dSYevgeny Kliteynik 
120*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_127_96, spec, dst_ip_127_96);
121*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_95_64, spec, dst_ip_95_64);
122*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_63_32, spec, dst_ip_63_32);
123*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_31_0, spec, dst_ip_31_0);
124*d65e841dSYevgeny Kliteynik 
125*d65e841dSYevgeny Kliteynik 	return 0;
126*d65e841dSYevgeny Kliteynik }
127*d65e841dSYevgeny Kliteynik 
128*d65e841dSYevgeny Kliteynik static void
129*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_dst_init(struct mlx5dr_ste_build *sb,
130*d65e841dSYevgeny Kliteynik 				     struct mlx5dr_match_param *mask)
131*d65e841dSYevgeny Kliteynik {
132*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_eth_l3_ipv6_dst_bit_mask(mask, sb->inner, sb->bit_mask);
133*d65e841dSYevgeny Kliteynik 
134*d65e841dSYevgeny Kliteynik 	sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL3_IPV6_DST, sb->rx, sb->inner);
135*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
136*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_eth_l3_ipv6_dst_tag;
137*d65e841dSYevgeny Kliteynik }
138*d65e841dSYevgeny Kliteynik 
139*d65e841dSYevgeny Kliteynik static void
140*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_src_bit_mask(struct mlx5dr_match_param *value,
141*d65e841dSYevgeny Kliteynik 					 bool inner, u8 *bit_mask)
142*d65e841dSYevgeny Kliteynik {
143*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer;
144*d65e841dSYevgeny Kliteynik 
145*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv6_src, bit_mask, src_ip_127_96, mask, src_ip_127_96);
146*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv6_src, bit_mask, src_ip_95_64, mask, src_ip_95_64);
147*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv6_src, bit_mask, src_ip_63_32, mask, src_ip_63_32);
148*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv6_src, bit_mask, src_ip_31_0, mask, src_ip_31_0);
149*d65e841dSYevgeny Kliteynik }
150*d65e841dSYevgeny Kliteynik 
151*d65e841dSYevgeny Kliteynik static int
152*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_src_tag(struct mlx5dr_match_param *value,
153*d65e841dSYevgeny Kliteynik 				    struct mlx5dr_ste_build *sb,
154*d65e841dSYevgeny Kliteynik 				    u8 *tag)
155*d65e841dSYevgeny Kliteynik {
156*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer;
157*d65e841dSYevgeny Kliteynik 
158*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_127_96, spec, src_ip_127_96);
159*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_95_64, spec, src_ip_95_64);
160*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_63_32, spec, src_ip_63_32);
161*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_31_0, spec, src_ip_31_0);
162*d65e841dSYevgeny Kliteynik 
163*d65e841dSYevgeny Kliteynik 	return 0;
164*d65e841dSYevgeny Kliteynik }
165*d65e841dSYevgeny Kliteynik 
166*d65e841dSYevgeny Kliteynik static void
167*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_src_init(struct mlx5dr_ste_build *sb,
168*d65e841dSYevgeny Kliteynik 				     struct mlx5dr_match_param *mask)
169*d65e841dSYevgeny Kliteynik {
170*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_eth_l3_ipv6_src_bit_mask(mask, sb->inner, sb->bit_mask);
171*d65e841dSYevgeny Kliteynik 
172*d65e841dSYevgeny Kliteynik 	sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL3_IPV6_SRC, sb->rx, sb->inner);
173*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
174*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_eth_l3_ipv6_src_tag;
175*d65e841dSYevgeny Kliteynik }
176*d65e841dSYevgeny Kliteynik 
177*d65e841dSYevgeny Kliteynik static void
178*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_5_tuple_bit_mask(struct mlx5dr_match_param *value,
179*d65e841dSYevgeny Kliteynik 					     bool inner,
180*d65e841dSYevgeny Kliteynik 					     u8 *bit_mask)
181*d65e841dSYevgeny Kliteynik {
182*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer;
183*d65e841dSYevgeny Kliteynik 
184*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask,
185*d65e841dSYevgeny Kliteynik 			  destination_address, mask, dst_ip_31_0);
186*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask,
187*d65e841dSYevgeny Kliteynik 			  source_address, mask, src_ip_31_0);
188*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask,
189*d65e841dSYevgeny Kliteynik 			  destination_port, mask, tcp_dport);
190*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask,
191*d65e841dSYevgeny Kliteynik 			  destination_port, mask, udp_dport);
192*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask,
193*d65e841dSYevgeny Kliteynik 			  source_port, mask, tcp_sport);
194*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask,
195*d65e841dSYevgeny Kliteynik 			  source_port, mask, udp_sport);
196*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask,
197*d65e841dSYevgeny Kliteynik 			  protocol, mask, ip_protocol);
198*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask,
199*d65e841dSYevgeny Kliteynik 			  fragmented, mask, frag);
200*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask,
201*d65e841dSYevgeny Kliteynik 			  dscp, mask, ip_dscp);
202*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask,
203*d65e841dSYevgeny Kliteynik 			  ecn, mask, ip_ecn);
204*d65e841dSYevgeny Kliteynik 
205*d65e841dSYevgeny Kliteynik 	if (mask->tcp_flags) {
206*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TCP_FLAGS(eth_l3_ipv4_5_tuple, bit_mask, mask);
207*d65e841dSYevgeny Kliteynik 		mask->tcp_flags = 0;
208*d65e841dSYevgeny Kliteynik 	}
209*d65e841dSYevgeny Kliteynik }
210*d65e841dSYevgeny Kliteynik 
211*d65e841dSYevgeny Kliteynik static int
212*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_5_tuple_tag(struct mlx5dr_match_param *value,
213*d65e841dSYevgeny Kliteynik 					struct mlx5dr_ste_build *sb,
214*d65e841dSYevgeny Kliteynik 					u8 *tag)
215*d65e841dSYevgeny Kliteynik {
216*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer;
217*d65e841dSYevgeny Kliteynik 
218*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, destination_address, spec, dst_ip_31_0);
219*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, source_address, spec, src_ip_31_0);
220*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, destination_port, spec, tcp_dport);
221*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, destination_port, spec, udp_dport);
222*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, source_port, spec, tcp_sport);
223*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, source_port, spec, udp_sport);
224*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, protocol, spec, ip_protocol);
225*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, fragmented, spec, frag);
226*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, dscp, spec, ip_dscp);
227*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, ecn, spec, ip_ecn);
228*d65e841dSYevgeny Kliteynik 
229*d65e841dSYevgeny Kliteynik 	if (spec->tcp_flags) {
230*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TCP_FLAGS(eth_l3_ipv4_5_tuple, tag, spec);
231*d65e841dSYevgeny Kliteynik 		spec->tcp_flags = 0;
232*d65e841dSYevgeny Kliteynik 	}
233*d65e841dSYevgeny Kliteynik 
234*d65e841dSYevgeny Kliteynik 	return 0;
235*d65e841dSYevgeny Kliteynik }
236*d65e841dSYevgeny Kliteynik 
237*d65e841dSYevgeny Kliteynik static void
238*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_5_tuple_init(struct mlx5dr_ste_build *sb,
239*d65e841dSYevgeny Kliteynik 					 struct mlx5dr_match_param *mask)
240*d65e841dSYevgeny Kliteynik {
241*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_eth_l3_ipv4_5_tuple_bit_mask(mask, sb->inner, sb->bit_mask);
242*d65e841dSYevgeny Kliteynik 
243*d65e841dSYevgeny Kliteynik 	sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL3_IPV4_5_TUPLE, sb->rx, sb->inner);
244*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
245*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_eth_l3_ipv4_5_tuple_tag;
246*d65e841dSYevgeny Kliteynik }
247*d65e841dSYevgeny Kliteynik 
248*d65e841dSYevgeny Kliteynik static void
249*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_or_dst_bit_mask(struct mlx5dr_match_param *value,
250*d65e841dSYevgeny Kliteynik 					   bool inner, u8 *bit_mask)
251*d65e841dSYevgeny Kliteynik {
252*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer;
253*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc *misc_mask = &value->misc;
254*d65e841dSYevgeny Kliteynik 
255*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_src, bit_mask, first_vlan_id, mask, first_vid);
256*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_src, bit_mask, first_cfi, mask, first_cfi);
257*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_src, bit_mask, first_priority, mask, first_prio);
258*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_src, bit_mask, ip_fragmented, mask, frag);
259*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_src, bit_mask, l3_ethertype, mask, ethertype);
260*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK(eth_l2_src, bit_mask, l3_type, mask, ip_version);
261*d65e841dSYevgeny Kliteynik 
262*d65e841dSYevgeny Kliteynik 	if (mask->svlan_tag || mask->cvlan_tag) {
263*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_src, bit_mask, first_vlan_qualifier, -1);
264*d65e841dSYevgeny Kliteynik 		mask->cvlan_tag = 0;
265*d65e841dSYevgeny Kliteynik 		mask->svlan_tag = 0;
266*d65e841dSYevgeny Kliteynik 	}
267*d65e841dSYevgeny Kliteynik 
268*d65e841dSYevgeny Kliteynik 	if (inner) {
269*d65e841dSYevgeny Kliteynik 		if (misc_mask->inner_second_cvlan_tag ||
270*d65e841dSYevgeny Kliteynik 		    misc_mask->inner_second_svlan_tag) {
271*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_eth_l2_src, bit_mask, second_vlan_qualifier, -1);
272*d65e841dSYevgeny Kliteynik 			misc_mask->inner_second_cvlan_tag = 0;
273*d65e841dSYevgeny Kliteynik 			misc_mask->inner_second_svlan_tag = 0;
274*d65e841dSYevgeny Kliteynik 		}
275*d65e841dSYevgeny Kliteynik 
276*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(eth_l2_src, bit_mask,
277*d65e841dSYevgeny Kliteynik 				  second_vlan_id, misc_mask, inner_second_vid);
278*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(eth_l2_src, bit_mask,
279*d65e841dSYevgeny Kliteynik 				  second_cfi, misc_mask, inner_second_cfi);
280*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(eth_l2_src, bit_mask,
281*d65e841dSYevgeny Kliteynik 				  second_priority, misc_mask, inner_second_prio);
282*d65e841dSYevgeny Kliteynik 	} else {
283*d65e841dSYevgeny Kliteynik 		if (misc_mask->outer_second_cvlan_tag ||
284*d65e841dSYevgeny Kliteynik 		    misc_mask->outer_second_svlan_tag) {
285*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_eth_l2_src, bit_mask, second_vlan_qualifier, -1);
286*d65e841dSYevgeny Kliteynik 			misc_mask->outer_second_cvlan_tag = 0;
287*d65e841dSYevgeny Kliteynik 			misc_mask->outer_second_svlan_tag = 0;
288*d65e841dSYevgeny Kliteynik 		}
289*d65e841dSYevgeny Kliteynik 
290*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(eth_l2_src, bit_mask,
291*d65e841dSYevgeny Kliteynik 				  second_vlan_id, misc_mask, outer_second_vid);
292*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(eth_l2_src, bit_mask,
293*d65e841dSYevgeny Kliteynik 				  second_cfi, misc_mask, outer_second_cfi);
294*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(eth_l2_src, bit_mask,
295*d65e841dSYevgeny Kliteynik 				  second_priority, misc_mask, outer_second_prio);
296*d65e841dSYevgeny Kliteynik 	}
297*d65e841dSYevgeny Kliteynik }
298*d65e841dSYevgeny Kliteynik 
299*d65e841dSYevgeny Kliteynik static int
300*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_or_dst_tag(struct mlx5dr_match_param *value,
301*d65e841dSYevgeny Kliteynik 				      bool inner, u8 *tag)
302*d65e841dSYevgeny Kliteynik {
303*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *spec = inner ? &value->inner : &value->outer;
304*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc *misc_spec = &value->misc;
305*d65e841dSYevgeny Kliteynik 
306*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_src, tag, first_vlan_id, spec, first_vid);
307*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_src, tag, first_cfi, spec, first_cfi);
308*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_src, tag, first_priority, spec, first_prio);
309*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_src, tag, ip_fragmented, spec, frag);
310*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_src, tag, l3_ethertype, spec, ethertype);
311*d65e841dSYevgeny Kliteynik 
312*d65e841dSYevgeny Kliteynik 	if (spec->ip_version) {
313*d65e841dSYevgeny Kliteynik 		if (spec->ip_version == IP_VERSION_IPV4) {
314*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_eth_l2_src, tag, l3_type, STE_IPV4);
315*d65e841dSYevgeny Kliteynik 			spec->ip_version = 0;
316*d65e841dSYevgeny Kliteynik 		} else if (spec->ip_version == IP_VERSION_IPV6) {
317*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_eth_l2_src, tag, l3_type, STE_IPV6);
318*d65e841dSYevgeny Kliteynik 			spec->ip_version = 0;
319*d65e841dSYevgeny Kliteynik 		} else {
320*d65e841dSYevgeny Kliteynik 			return -EINVAL;
321*d65e841dSYevgeny Kliteynik 		}
322*d65e841dSYevgeny Kliteynik 	}
323*d65e841dSYevgeny Kliteynik 
324*d65e841dSYevgeny Kliteynik 	if (spec->cvlan_tag) {
325*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_src, tag, first_vlan_qualifier, DR_STE_CVLAN);
326*d65e841dSYevgeny Kliteynik 		spec->cvlan_tag = 0;
327*d65e841dSYevgeny Kliteynik 	} else if (spec->svlan_tag) {
328*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_src, tag, first_vlan_qualifier, DR_STE_SVLAN);
329*d65e841dSYevgeny Kliteynik 		spec->svlan_tag = 0;
330*d65e841dSYevgeny Kliteynik 	}
331*d65e841dSYevgeny Kliteynik 
332*d65e841dSYevgeny Kliteynik 	if (inner) {
333*d65e841dSYevgeny Kliteynik 		if (misc_spec->inner_second_cvlan_tag) {
334*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_eth_l2_src, tag, second_vlan_qualifier, DR_STE_CVLAN);
335*d65e841dSYevgeny Kliteynik 			misc_spec->inner_second_cvlan_tag = 0;
336*d65e841dSYevgeny Kliteynik 		} else if (misc_spec->inner_second_svlan_tag) {
337*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_eth_l2_src, tag, second_vlan_qualifier, DR_STE_SVLAN);
338*d65e841dSYevgeny Kliteynik 			misc_spec->inner_second_svlan_tag = 0;
339*d65e841dSYevgeny Kliteynik 		}
340*d65e841dSYevgeny Kliteynik 
341*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(eth_l2_src, tag, second_vlan_id, misc_spec, inner_second_vid);
342*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(eth_l2_src, tag, second_cfi, misc_spec, inner_second_cfi);
343*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(eth_l2_src, tag, second_priority, misc_spec, inner_second_prio);
344*d65e841dSYevgeny Kliteynik 	} else {
345*d65e841dSYevgeny Kliteynik 		if (misc_spec->outer_second_cvlan_tag) {
346*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_eth_l2_src, tag, second_vlan_qualifier, DR_STE_CVLAN);
347*d65e841dSYevgeny Kliteynik 			misc_spec->outer_second_cvlan_tag = 0;
348*d65e841dSYevgeny Kliteynik 		} else if (misc_spec->outer_second_svlan_tag) {
349*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_eth_l2_src, tag, second_vlan_qualifier, DR_STE_SVLAN);
350*d65e841dSYevgeny Kliteynik 			misc_spec->outer_second_svlan_tag = 0;
351*d65e841dSYevgeny Kliteynik 		}
352*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(eth_l2_src, tag, second_vlan_id, misc_spec, outer_second_vid);
353*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(eth_l2_src, tag, second_cfi, misc_spec, outer_second_cfi);
354*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(eth_l2_src, tag, second_priority, misc_spec, outer_second_prio);
355*d65e841dSYevgeny Kliteynik 	}
356*d65e841dSYevgeny Kliteynik 
357*d65e841dSYevgeny Kliteynik 	return 0;
358*d65e841dSYevgeny Kliteynik }
359*d65e841dSYevgeny Kliteynik 
360*d65e841dSYevgeny Kliteynik static void
361*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_bit_mask(struct mlx5dr_match_param *value,
362*d65e841dSYevgeny Kliteynik 				    bool inner, u8 *bit_mask)
363*d65e841dSYevgeny Kliteynik {
364*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer;
365*d65e841dSYevgeny Kliteynik 
366*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_src, bit_mask, smac_47_16, mask, smac_47_16);
367*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_src, bit_mask, smac_15_0, mask, smac_15_0);
368*d65e841dSYevgeny Kliteynik 
369*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask);
370*d65e841dSYevgeny Kliteynik }
371*d65e841dSYevgeny Kliteynik 
372*d65e841dSYevgeny Kliteynik static int
373*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_tag(struct mlx5dr_match_param *value,
374*d65e841dSYevgeny Kliteynik 			       struct mlx5dr_ste_build *sb,
375*d65e841dSYevgeny Kliteynik 			       u8 *tag)
376*d65e841dSYevgeny Kliteynik {
377*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer;
378*d65e841dSYevgeny Kliteynik 
379*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_src, tag, smac_47_16, spec, smac_47_16);
380*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_src, tag, smac_15_0, spec, smac_15_0);
381*d65e841dSYevgeny Kliteynik 
382*d65e841dSYevgeny Kliteynik 	return dr_ste_v0_build_eth_l2_src_or_dst_tag(value, sb->inner, tag);
383*d65e841dSYevgeny Kliteynik }
384*d65e841dSYevgeny Kliteynik 
385*d65e841dSYevgeny Kliteynik static void
386*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_init(struct mlx5dr_ste_build *sb,
387*d65e841dSYevgeny Kliteynik 				struct mlx5dr_match_param *mask)
388*d65e841dSYevgeny Kliteynik {
389*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_eth_l2_src_bit_mask(mask, sb->inner, sb->bit_mask);
390*d65e841dSYevgeny Kliteynik 	sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL2_SRC, sb->rx, sb->inner);
391*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
392*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_eth_l2_src_tag;
393*d65e841dSYevgeny Kliteynik }
394*d65e841dSYevgeny Kliteynik 
395*d65e841dSYevgeny Kliteynik static void
396*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_dst_bit_mask(struct mlx5dr_match_param *value,
397*d65e841dSYevgeny Kliteynik 				    bool inner, u8 *bit_mask)
398*d65e841dSYevgeny Kliteynik {
399*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer;
400*d65e841dSYevgeny Kliteynik 
401*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_dst, bit_mask, dmac_47_16, mask, dmac_47_16);
402*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_dst, bit_mask, dmac_15_0, mask, dmac_15_0);
403*d65e841dSYevgeny Kliteynik 
404*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask);
405*d65e841dSYevgeny Kliteynik }
406*d65e841dSYevgeny Kliteynik 
407*d65e841dSYevgeny Kliteynik static int
408*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_dst_tag(struct mlx5dr_match_param *value,
409*d65e841dSYevgeny Kliteynik 			       struct mlx5dr_ste_build *sb,
410*d65e841dSYevgeny Kliteynik 			       u8 *tag)
411*d65e841dSYevgeny Kliteynik {
412*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer;
413*d65e841dSYevgeny Kliteynik 
414*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_dst, tag, dmac_47_16, spec, dmac_47_16);
415*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_dst, tag, dmac_15_0, spec, dmac_15_0);
416*d65e841dSYevgeny Kliteynik 
417*d65e841dSYevgeny Kliteynik 	return dr_ste_v0_build_eth_l2_src_or_dst_tag(value, sb->inner, tag);
418*d65e841dSYevgeny Kliteynik }
419*d65e841dSYevgeny Kliteynik 
420*d65e841dSYevgeny Kliteynik static void
421*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_dst_init(struct mlx5dr_ste_build *sb,
422*d65e841dSYevgeny Kliteynik 				struct mlx5dr_match_param *mask)
423*d65e841dSYevgeny Kliteynik {
424*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_eth_l2_dst_bit_mask(mask, sb->inner, sb->bit_mask);
425*d65e841dSYevgeny Kliteynik 
426*d65e841dSYevgeny Kliteynik 	sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL2_DST, sb->rx, sb->inner);
427*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
428*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_eth_l2_dst_tag;
429*d65e841dSYevgeny Kliteynik }
430*d65e841dSYevgeny Kliteynik 
431*d65e841dSYevgeny Kliteynik static void
432*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_tnl_bit_mask(struct mlx5dr_match_param *value,
433*d65e841dSYevgeny Kliteynik 				    bool inner, u8 *bit_mask)
434*d65e841dSYevgeny Kliteynik {
435*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer;
436*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc *misc = &value->misc;
437*d65e841dSYevgeny Kliteynik 
438*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, dmac_47_16, mask, dmac_47_16);
439*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, dmac_15_0, mask, dmac_15_0);
440*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, first_vlan_id, mask, first_vid);
441*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, first_cfi, mask, first_cfi);
442*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, first_priority, mask, first_prio);
443*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, ip_fragmented, mask, frag);
444*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, l3_ethertype, mask, ethertype);
445*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK(eth_l2_tnl, bit_mask, l3_type, mask, ip_version);
446*d65e841dSYevgeny Kliteynik 
447*d65e841dSYevgeny Kliteynik 	if (misc->vxlan_vni) {
448*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_tnl, bit_mask,
449*d65e841dSYevgeny Kliteynik 			 l2_tunneling_network_id, (misc->vxlan_vni << 8));
450*d65e841dSYevgeny Kliteynik 		misc->vxlan_vni = 0;
451*d65e841dSYevgeny Kliteynik 	}
452*d65e841dSYevgeny Kliteynik 
453*d65e841dSYevgeny Kliteynik 	if (mask->svlan_tag || mask->cvlan_tag) {
454*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_tnl, bit_mask, first_vlan_qualifier, -1);
455*d65e841dSYevgeny Kliteynik 		mask->cvlan_tag = 0;
456*d65e841dSYevgeny Kliteynik 		mask->svlan_tag = 0;
457*d65e841dSYevgeny Kliteynik 	}
458*d65e841dSYevgeny Kliteynik }
459*d65e841dSYevgeny Kliteynik 
460*d65e841dSYevgeny Kliteynik static int
461*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_tnl_tag(struct mlx5dr_match_param *value,
462*d65e841dSYevgeny Kliteynik 			       struct mlx5dr_ste_build *sb,
463*d65e841dSYevgeny Kliteynik 			       u8 *tag)
464*d65e841dSYevgeny Kliteynik {
465*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer;
466*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc *misc = &value->misc;
467*d65e841dSYevgeny Kliteynik 
468*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_tnl, tag, dmac_47_16, spec, dmac_47_16);
469*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_tnl, tag, dmac_15_0, spec, dmac_15_0);
470*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_tnl, tag, first_vlan_id, spec, first_vid);
471*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_tnl, tag, first_cfi, spec, first_cfi);
472*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_tnl, tag, ip_fragmented, spec, frag);
473*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_tnl, tag, first_priority, spec, first_prio);
474*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l2_tnl, tag, l3_ethertype, spec, ethertype);
475*d65e841dSYevgeny Kliteynik 
476*d65e841dSYevgeny Kliteynik 	if (misc->vxlan_vni) {
477*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_tnl, tag, l2_tunneling_network_id,
478*d65e841dSYevgeny Kliteynik 			 (misc->vxlan_vni << 8));
479*d65e841dSYevgeny Kliteynik 		misc->vxlan_vni = 0;
480*d65e841dSYevgeny Kliteynik 	}
481*d65e841dSYevgeny Kliteynik 
482*d65e841dSYevgeny Kliteynik 	if (spec->cvlan_tag) {
483*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_tnl, tag, first_vlan_qualifier, DR_STE_CVLAN);
484*d65e841dSYevgeny Kliteynik 		spec->cvlan_tag = 0;
485*d65e841dSYevgeny Kliteynik 	} else if (spec->svlan_tag) {
486*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_eth_l2_tnl, tag, first_vlan_qualifier, DR_STE_SVLAN);
487*d65e841dSYevgeny Kliteynik 		spec->svlan_tag = 0;
488*d65e841dSYevgeny Kliteynik 	}
489*d65e841dSYevgeny Kliteynik 
490*d65e841dSYevgeny Kliteynik 	if (spec->ip_version) {
491*d65e841dSYevgeny Kliteynik 		if (spec->ip_version == IP_VERSION_IPV4) {
492*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_eth_l2_tnl, tag, l3_type, STE_IPV4);
493*d65e841dSYevgeny Kliteynik 			spec->ip_version = 0;
494*d65e841dSYevgeny Kliteynik 		} else if (spec->ip_version == IP_VERSION_IPV6) {
495*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_eth_l2_tnl, tag, l3_type, STE_IPV6);
496*d65e841dSYevgeny Kliteynik 			spec->ip_version = 0;
497*d65e841dSYevgeny Kliteynik 		} else {
498*d65e841dSYevgeny Kliteynik 			return -EINVAL;
499*d65e841dSYevgeny Kliteynik 		}
500*d65e841dSYevgeny Kliteynik 	}
501*d65e841dSYevgeny Kliteynik 
502*d65e841dSYevgeny Kliteynik 	return 0;
503*d65e841dSYevgeny Kliteynik }
504*d65e841dSYevgeny Kliteynik 
505*d65e841dSYevgeny Kliteynik static void
506*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_tnl_init(struct mlx5dr_ste_build *sb,
507*d65e841dSYevgeny Kliteynik 				struct mlx5dr_match_param *mask)
508*d65e841dSYevgeny Kliteynik {
509*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_eth_l2_tnl_bit_mask(mask, sb->inner, sb->bit_mask);
510*d65e841dSYevgeny Kliteynik 
511*d65e841dSYevgeny Kliteynik 	sb->lu_type = MLX5DR_STE_LU_TYPE_ETHL2_TUNNELING_I;
512*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
513*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_eth_l2_tnl_tag;
514*d65e841dSYevgeny Kliteynik }
515*d65e841dSYevgeny Kliteynik 
516*d65e841dSYevgeny Kliteynik static void
517*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_misc_bit_mask(struct mlx5dr_match_param *value,
518*d65e841dSYevgeny Kliteynik 					  bool inner, u8 *bit_mask)
519*d65e841dSYevgeny Kliteynik {
520*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer;
521*d65e841dSYevgeny Kliteynik 
522*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l3_ipv4_misc, bit_mask, time_to_live, mask, ttl_hoplimit);
523*d65e841dSYevgeny Kliteynik }
524*d65e841dSYevgeny Kliteynik 
525*d65e841dSYevgeny Kliteynik static int
526*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_misc_tag(struct mlx5dr_match_param *value,
527*d65e841dSYevgeny Kliteynik 				     struct mlx5dr_ste_build *sb,
528*d65e841dSYevgeny Kliteynik 				     u8 *tag)
529*d65e841dSYevgeny Kliteynik {
530*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer;
531*d65e841dSYevgeny Kliteynik 
532*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l3_ipv4_misc, tag, time_to_live, spec, ttl_hoplimit);
533*d65e841dSYevgeny Kliteynik 
534*d65e841dSYevgeny Kliteynik 	return 0;
535*d65e841dSYevgeny Kliteynik }
536*d65e841dSYevgeny Kliteynik 
537*d65e841dSYevgeny Kliteynik static void
538*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_misc_init(struct mlx5dr_ste_build *sb,
539*d65e841dSYevgeny Kliteynik 				      struct mlx5dr_match_param *mask)
540*d65e841dSYevgeny Kliteynik {
541*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_eth_l3_ipv4_misc_bit_mask(mask, sb->inner, sb->bit_mask);
542*d65e841dSYevgeny Kliteynik 
543*d65e841dSYevgeny Kliteynik 	sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL3_IPV4_MISC, sb->rx, sb->inner);
544*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
545*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_eth_l3_ipv4_misc_tag;
546*d65e841dSYevgeny Kliteynik }
547*d65e841dSYevgeny Kliteynik 
548*d65e841dSYevgeny Kliteynik static void
549*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_ipv6_l3_l4_bit_mask(struct mlx5dr_match_param *value,
550*d65e841dSYevgeny Kliteynik 					bool inner, u8 *bit_mask)
551*d65e841dSYevgeny Kliteynik {
552*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer;
553*d65e841dSYevgeny Kliteynik 
554*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l4, bit_mask, dst_port, mask, tcp_dport);
555*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l4, bit_mask, src_port, mask, tcp_sport);
556*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l4, bit_mask, dst_port, mask, udp_dport);
557*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l4, bit_mask, src_port, mask, udp_sport);
558*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l4, bit_mask, protocol, mask, ip_protocol);
559*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l4, bit_mask, fragmented, mask, frag);
560*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l4, bit_mask, dscp, mask, ip_dscp);
561*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l4, bit_mask, ecn, mask, ip_ecn);
562*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(eth_l4, bit_mask, ipv6_hop_limit, mask, ttl_hoplimit);
563*d65e841dSYevgeny Kliteynik 
564*d65e841dSYevgeny Kliteynik 	if (mask->tcp_flags) {
565*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TCP_FLAGS(eth_l4, bit_mask, mask);
566*d65e841dSYevgeny Kliteynik 		mask->tcp_flags = 0;
567*d65e841dSYevgeny Kliteynik 	}
568*d65e841dSYevgeny Kliteynik }
569*d65e841dSYevgeny Kliteynik 
570*d65e841dSYevgeny Kliteynik static int
571*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_ipv6_l3_l4_tag(struct mlx5dr_match_param *value,
572*d65e841dSYevgeny Kliteynik 				   struct mlx5dr_ste_build *sb,
573*d65e841dSYevgeny Kliteynik 				   u8 *tag)
574*d65e841dSYevgeny Kliteynik {
575*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer;
576*d65e841dSYevgeny Kliteynik 
577*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l4, tag, dst_port, spec, tcp_dport);
578*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l4, tag, src_port, spec, tcp_sport);
579*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l4, tag, dst_port, spec, udp_dport);
580*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l4, tag, src_port, spec, udp_sport);
581*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l4, tag, protocol, spec, ip_protocol);
582*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l4, tag, fragmented, spec, frag);
583*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l4, tag, dscp, spec, ip_dscp);
584*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l4, tag, ecn, spec, ip_ecn);
585*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(eth_l4, tag, ipv6_hop_limit, spec, ttl_hoplimit);
586*d65e841dSYevgeny Kliteynik 
587*d65e841dSYevgeny Kliteynik 	if (spec->tcp_flags) {
588*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TCP_FLAGS(eth_l4, tag, spec);
589*d65e841dSYevgeny Kliteynik 		spec->tcp_flags = 0;
590*d65e841dSYevgeny Kliteynik 	}
591*d65e841dSYevgeny Kliteynik 
592*d65e841dSYevgeny Kliteynik 	return 0;
593*d65e841dSYevgeny Kliteynik }
594*d65e841dSYevgeny Kliteynik 
595*d65e841dSYevgeny Kliteynik static void
596*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_ipv6_l3_l4_init(struct mlx5dr_ste_build *sb,
597*d65e841dSYevgeny Kliteynik 				    struct mlx5dr_match_param *mask)
598*d65e841dSYevgeny Kliteynik {
599*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_eth_ipv6_l3_l4_bit_mask(mask, sb->inner, sb->bit_mask);
600*d65e841dSYevgeny Kliteynik 
601*d65e841dSYevgeny Kliteynik 	sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL4, sb->rx, sb->inner);
602*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
603*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_eth_ipv6_l3_l4_tag;
604*d65e841dSYevgeny Kliteynik }
605*d65e841dSYevgeny Kliteynik 
606*d65e841dSYevgeny Kliteynik static void
607*d65e841dSYevgeny Kliteynik dr_ste_v0_build_mpls_bit_mask(struct mlx5dr_match_param *value,
608*d65e841dSYevgeny Kliteynik 			      bool inner, u8 *bit_mask)
609*d65e841dSYevgeny Kliteynik {
610*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc2 *misc2_mask = &value->misc2;
611*d65e841dSYevgeny Kliteynik 
612*d65e841dSYevgeny Kliteynik 	if (inner)
613*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MPLS_MASK(mpls, misc2_mask, inner, bit_mask);
614*d65e841dSYevgeny Kliteynik 	else
615*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MPLS_MASK(mpls, misc2_mask, outer, bit_mask);
616*d65e841dSYevgeny Kliteynik }
617*d65e841dSYevgeny Kliteynik 
618*d65e841dSYevgeny Kliteynik static int
619*d65e841dSYevgeny Kliteynik dr_ste_v0_build_mpls_tag(struct mlx5dr_match_param *value,
620*d65e841dSYevgeny Kliteynik 			 struct mlx5dr_ste_build *sb,
621*d65e841dSYevgeny Kliteynik 			 u8 *tag)
622*d65e841dSYevgeny Kliteynik {
623*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc2 *misc2_mask = &value->misc2;
624*d65e841dSYevgeny Kliteynik 
625*d65e841dSYevgeny Kliteynik 	if (sb->inner)
626*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MPLS_TAG(mpls, misc2_mask, inner, tag);
627*d65e841dSYevgeny Kliteynik 	else
628*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MPLS_TAG(mpls, misc2_mask, outer, tag);
629*d65e841dSYevgeny Kliteynik 
630*d65e841dSYevgeny Kliteynik 	return 0;
631*d65e841dSYevgeny Kliteynik }
632*d65e841dSYevgeny Kliteynik 
633*d65e841dSYevgeny Kliteynik static void
634*d65e841dSYevgeny Kliteynik dr_ste_v0_build_mpls_init(struct mlx5dr_ste_build *sb,
635*d65e841dSYevgeny Kliteynik 			  struct mlx5dr_match_param *mask)
636*d65e841dSYevgeny Kliteynik {
637*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_mpls_bit_mask(mask, sb->inner, sb->bit_mask);
638*d65e841dSYevgeny Kliteynik 
639*d65e841dSYevgeny Kliteynik 	sb->lu_type = DR_STE_CALC_LU_TYPE(MPLS_FIRST, sb->rx, sb->inner);
640*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
641*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_mpls_tag;
642*d65e841dSYevgeny Kliteynik }
643*d65e841dSYevgeny Kliteynik 
644*d65e841dSYevgeny Kliteynik static void
645*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_gre_bit_mask(struct mlx5dr_match_param *value,
646*d65e841dSYevgeny Kliteynik 				 bool inner, u8 *bit_mask)
647*d65e841dSYevgeny Kliteynik {
648*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc *misc_mask = &value->misc;
649*d65e841dSYevgeny Kliteynik 
650*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(gre, bit_mask, gre_protocol, misc_mask, gre_protocol);
651*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(gre, bit_mask, gre_k_present, misc_mask, gre_k_present);
652*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(gre, bit_mask, gre_key_h, misc_mask, gre_key_h);
653*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(gre, bit_mask, gre_key_l, misc_mask, gre_key_l);
654*d65e841dSYevgeny Kliteynik 
655*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(gre, bit_mask, gre_c_present, misc_mask, gre_c_present);
656*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(gre, bit_mask, gre_s_present, misc_mask, gre_s_present);
657*d65e841dSYevgeny Kliteynik }
658*d65e841dSYevgeny Kliteynik 
659*d65e841dSYevgeny Kliteynik static int
660*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_gre_tag(struct mlx5dr_match_param *value,
661*d65e841dSYevgeny Kliteynik 			    struct mlx5dr_ste_build *sb,
662*d65e841dSYevgeny Kliteynik 			    u8 *tag)
663*d65e841dSYevgeny Kliteynik {
664*d65e841dSYevgeny Kliteynik 	struct  mlx5dr_match_misc *misc = &value->misc;
665*d65e841dSYevgeny Kliteynik 
666*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(gre, tag, gre_protocol, misc, gre_protocol);
667*d65e841dSYevgeny Kliteynik 
668*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(gre, tag, gre_k_present, misc, gre_k_present);
669*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(gre, tag, gre_key_h, misc, gre_key_h);
670*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(gre, tag, gre_key_l, misc, gre_key_l);
671*d65e841dSYevgeny Kliteynik 
672*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(gre, tag, gre_c_present, misc, gre_c_present);
673*d65e841dSYevgeny Kliteynik 
674*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(gre, tag, gre_s_present, misc, gre_s_present);
675*d65e841dSYevgeny Kliteynik 
676*d65e841dSYevgeny Kliteynik 	return 0;
677*d65e841dSYevgeny Kliteynik }
678*d65e841dSYevgeny Kliteynik 
679*d65e841dSYevgeny Kliteynik static void
680*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_gre_init(struct mlx5dr_ste_build *sb,
681*d65e841dSYevgeny Kliteynik 			     struct mlx5dr_match_param *mask)
682*d65e841dSYevgeny Kliteynik {
683*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_tnl_gre_bit_mask(mask, sb->inner, sb->bit_mask);
684*d65e841dSYevgeny Kliteynik 
685*d65e841dSYevgeny Kliteynik 	sb->lu_type = MLX5DR_STE_LU_TYPE_GRE;
686*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
687*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_tnl_gre_tag;
688*d65e841dSYevgeny Kliteynik }
689*d65e841dSYevgeny Kliteynik 
690*d65e841dSYevgeny Kliteynik static void
691*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_mpls_bit_mask(struct mlx5dr_match_param *value,
692*d65e841dSYevgeny Kliteynik 				  bool inner, u8 *bit_mask)
693*d65e841dSYevgeny Kliteynik {
694*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc2 *misc_2_mask = &value->misc2;
695*d65e841dSYevgeny Kliteynik 
696*d65e841dSYevgeny Kliteynik 	if (DR_STE_IS_OUTER_MPLS_OVER_GRE_SET(misc_2_mask)) {
697*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_label,
698*d65e841dSYevgeny Kliteynik 				  misc_2_mask, outer_first_mpls_over_gre_label);
699*d65e841dSYevgeny Kliteynik 
700*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_exp,
701*d65e841dSYevgeny Kliteynik 				  misc_2_mask, outer_first_mpls_over_gre_exp);
702*d65e841dSYevgeny Kliteynik 
703*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_s_bos,
704*d65e841dSYevgeny Kliteynik 				  misc_2_mask, outer_first_mpls_over_gre_s_bos);
705*d65e841dSYevgeny Kliteynik 
706*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_ttl,
707*d65e841dSYevgeny Kliteynik 				  misc_2_mask, outer_first_mpls_over_gre_ttl);
708*d65e841dSYevgeny Kliteynik 	} else {
709*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_label,
710*d65e841dSYevgeny Kliteynik 				  misc_2_mask, outer_first_mpls_over_udp_label);
711*d65e841dSYevgeny Kliteynik 
712*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_exp,
713*d65e841dSYevgeny Kliteynik 				  misc_2_mask, outer_first_mpls_over_udp_exp);
714*d65e841dSYevgeny Kliteynik 
715*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_s_bos,
716*d65e841dSYevgeny Kliteynik 				  misc_2_mask, outer_first_mpls_over_udp_s_bos);
717*d65e841dSYevgeny Kliteynik 
718*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_ttl,
719*d65e841dSYevgeny Kliteynik 				  misc_2_mask, outer_first_mpls_over_udp_ttl);
720*d65e841dSYevgeny Kliteynik 	}
721*d65e841dSYevgeny Kliteynik }
722*d65e841dSYevgeny Kliteynik 
723*d65e841dSYevgeny Kliteynik static int
724*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_mpls_tag(struct mlx5dr_match_param *value,
725*d65e841dSYevgeny Kliteynik 			     struct mlx5dr_ste_build *sb,
726*d65e841dSYevgeny Kliteynik 			     u8 *tag)
727*d65e841dSYevgeny Kliteynik {
728*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc2 *misc_2_mask = &value->misc2;
729*d65e841dSYevgeny Kliteynik 
730*d65e841dSYevgeny Kliteynik 	if (DR_STE_IS_OUTER_MPLS_OVER_GRE_SET(misc_2_mask)) {
731*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(flex_parser_0, tag, parser_3_label,
732*d65e841dSYevgeny Kliteynik 			       misc_2_mask, outer_first_mpls_over_gre_label);
733*d65e841dSYevgeny Kliteynik 
734*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(flex_parser_0, tag, parser_3_exp,
735*d65e841dSYevgeny Kliteynik 			       misc_2_mask, outer_first_mpls_over_gre_exp);
736*d65e841dSYevgeny Kliteynik 
737*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(flex_parser_0, tag, parser_3_s_bos,
738*d65e841dSYevgeny Kliteynik 			       misc_2_mask, outer_first_mpls_over_gre_s_bos);
739*d65e841dSYevgeny Kliteynik 
740*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(flex_parser_0, tag, parser_3_ttl,
741*d65e841dSYevgeny Kliteynik 			       misc_2_mask, outer_first_mpls_over_gre_ttl);
742*d65e841dSYevgeny Kliteynik 	} else {
743*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(flex_parser_0, tag, parser_3_label,
744*d65e841dSYevgeny Kliteynik 			       misc_2_mask, outer_first_mpls_over_udp_label);
745*d65e841dSYevgeny Kliteynik 
746*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(flex_parser_0, tag, parser_3_exp,
747*d65e841dSYevgeny Kliteynik 			       misc_2_mask, outer_first_mpls_over_udp_exp);
748*d65e841dSYevgeny Kliteynik 
749*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(flex_parser_0, tag, parser_3_s_bos,
750*d65e841dSYevgeny Kliteynik 			       misc_2_mask, outer_first_mpls_over_udp_s_bos);
751*d65e841dSYevgeny Kliteynik 
752*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(flex_parser_0, tag, parser_3_ttl,
753*d65e841dSYevgeny Kliteynik 			       misc_2_mask, outer_first_mpls_over_udp_ttl);
754*d65e841dSYevgeny Kliteynik 	}
755*d65e841dSYevgeny Kliteynik 	return 0;
756*d65e841dSYevgeny Kliteynik }
757*d65e841dSYevgeny Kliteynik 
758*d65e841dSYevgeny Kliteynik static void
759*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_mpls_init(struct mlx5dr_ste_build *sb,
760*d65e841dSYevgeny Kliteynik 			      struct mlx5dr_match_param *mask)
761*d65e841dSYevgeny Kliteynik {
762*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_tnl_mpls_bit_mask(mask, sb->inner, sb->bit_mask);
763*d65e841dSYevgeny Kliteynik 
764*d65e841dSYevgeny Kliteynik 	sb->lu_type = MLX5DR_STE_LU_TYPE_FLEX_PARSER_0;
765*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
766*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_tnl_mpls_tag;
767*d65e841dSYevgeny Kliteynik }
768*d65e841dSYevgeny Kliteynik 
769*d65e841dSYevgeny Kliteynik #define ICMP_TYPE_OFFSET_FIRST_DW		24
770*d65e841dSYevgeny Kliteynik #define ICMP_CODE_OFFSET_FIRST_DW		16
771*d65e841dSYevgeny Kliteynik #define ICMP_HEADER_DATA_OFFSET_SECOND_DW	0
772*d65e841dSYevgeny Kliteynik 
773*d65e841dSYevgeny Kliteynik static int
774*d65e841dSYevgeny Kliteynik dr_ste_v0_build_icmp_bit_mask(struct mlx5dr_match_param *mask,
775*d65e841dSYevgeny Kliteynik 			      struct mlx5dr_cmd_caps *caps,
776*d65e841dSYevgeny Kliteynik 			      u8 *bit_mask)
777*d65e841dSYevgeny Kliteynik {
778*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc3 *misc_3_mask = &mask->misc3;
779*d65e841dSYevgeny Kliteynik 	bool is_ipv4_mask = DR_MASK_IS_ICMPV4_SET(misc_3_mask);
780*d65e841dSYevgeny Kliteynik 	u32 icmp_header_data_mask;
781*d65e841dSYevgeny Kliteynik 	u32 icmp_type_mask;
782*d65e841dSYevgeny Kliteynik 	u32 icmp_code_mask;
783*d65e841dSYevgeny Kliteynik 	int dw0_location;
784*d65e841dSYevgeny Kliteynik 	int dw1_location;
785*d65e841dSYevgeny Kliteynik 
786*d65e841dSYevgeny Kliteynik 	if (is_ipv4_mask) {
787*d65e841dSYevgeny Kliteynik 		icmp_header_data_mask	= misc_3_mask->icmpv4_header_data;
788*d65e841dSYevgeny Kliteynik 		icmp_type_mask		= misc_3_mask->icmpv4_type;
789*d65e841dSYevgeny Kliteynik 		icmp_code_mask		= misc_3_mask->icmpv4_code;
790*d65e841dSYevgeny Kliteynik 		dw0_location		= caps->flex_parser_id_icmp_dw0;
791*d65e841dSYevgeny Kliteynik 		dw1_location		= caps->flex_parser_id_icmp_dw1;
792*d65e841dSYevgeny Kliteynik 	} else {
793*d65e841dSYevgeny Kliteynik 		icmp_header_data_mask	= misc_3_mask->icmpv6_header_data;
794*d65e841dSYevgeny Kliteynik 		icmp_type_mask		= misc_3_mask->icmpv6_type;
795*d65e841dSYevgeny Kliteynik 		icmp_code_mask		= misc_3_mask->icmpv6_code;
796*d65e841dSYevgeny Kliteynik 		dw0_location		= caps->flex_parser_id_icmpv6_dw0;
797*d65e841dSYevgeny Kliteynik 		dw1_location		= caps->flex_parser_id_icmpv6_dw1;
798*d65e841dSYevgeny Kliteynik 	}
799*d65e841dSYevgeny Kliteynik 
800*d65e841dSYevgeny Kliteynik 	switch (dw0_location) {
801*d65e841dSYevgeny Kliteynik 	case 4:
802*d65e841dSYevgeny Kliteynik 		if (icmp_type_mask) {
803*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_flex_parser_1, bit_mask, flex_parser_4,
804*d65e841dSYevgeny Kliteynik 				 (icmp_type_mask << ICMP_TYPE_OFFSET_FIRST_DW));
805*d65e841dSYevgeny Kliteynik 			if (is_ipv4_mask)
806*d65e841dSYevgeny Kliteynik 				misc_3_mask->icmpv4_type = 0;
807*d65e841dSYevgeny Kliteynik 			else
808*d65e841dSYevgeny Kliteynik 				misc_3_mask->icmpv6_type = 0;
809*d65e841dSYevgeny Kliteynik 		}
810*d65e841dSYevgeny Kliteynik 		if (icmp_code_mask) {
811*d65e841dSYevgeny Kliteynik 			u32 cur_val = MLX5_GET(ste_flex_parser_1, bit_mask,
812*d65e841dSYevgeny Kliteynik 					       flex_parser_4);
813*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_flex_parser_1, bit_mask, flex_parser_4,
814*d65e841dSYevgeny Kliteynik 				 cur_val | (icmp_code_mask << ICMP_CODE_OFFSET_FIRST_DW));
815*d65e841dSYevgeny Kliteynik 			if (is_ipv4_mask)
816*d65e841dSYevgeny Kliteynik 				misc_3_mask->icmpv4_code = 0;
817*d65e841dSYevgeny Kliteynik 			else
818*d65e841dSYevgeny Kliteynik 				misc_3_mask->icmpv6_code = 0;
819*d65e841dSYevgeny Kliteynik 		}
820*d65e841dSYevgeny Kliteynik 		break;
821*d65e841dSYevgeny Kliteynik 	default:
822*d65e841dSYevgeny Kliteynik 		return -EINVAL;
823*d65e841dSYevgeny Kliteynik 	}
824*d65e841dSYevgeny Kliteynik 
825*d65e841dSYevgeny Kliteynik 	switch (dw1_location) {
826*d65e841dSYevgeny Kliteynik 	case 5:
827*d65e841dSYevgeny Kliteynik 		if (icmp_header_data_mask) {
828*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_flex_parser_1, bit_mask, flex_parser_5,
829*d65e841dSYevgeny Kliteynik 				 (icmp_header_data_mask << ICMP_HEADER_DATA_OFFSET_SECOND_DW));
830*d65e841dSYevgeny Kliteynik 			if (is_ipv4_mask)
831*d65e841dSYevgeny Kliteynik 				misc_3_mask->icmpv4_header_data = 0;
832*d65e841dSYevgeny Kliteynik 			else
833*d65e841dSYevgeny Kliteynik 				misc_3_mask->icmpv6_header_data = 0;
834*d65e841dSYevgeny Kliteynik 		}
835*d65e841dSYevgeny Kliteynik 		break;
836*d65e841dSYevgeny Kliteynik 	default:
837*d65e841dSYevgeny Kliteynik 		return -EINVAL;
838*d65e841dSYevgeny Kliteynik 	}
839*d65e841dSYevgeny Kliteynik 
840*d65e841dSYevgeny Kliteynik 	return 0;
841*d65e841dSYevgeny Kliteynik }
842*d65e841dSYevgeny Kliteynik 
843*d65e841dSYevgeny Kliteynik static int
844*d65e841dSYevgeny Kliteynik dr_ste_v0_build_icmp_tag(struct mlx5dr_match_param *value,
845*d65e841dSYevgeny Kliteynik 			 struct mlx5dr_ste_build *sb,
846*d65e841dSYevgeny Kliteynik 			 u8 *tag)
847*d65e841dSYevgeny Kliteynik {
848*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc3 *misc_3 = &value->misc3;
849*d65e841dSYevgeny Kliteynik 	u32 icmp_header_data;
850*d65e841dSYevgeny Kliteynik 	int dw0_location;
851*d65e841dSYevgeny Kliteynik 	int dw1_location;
852*d65e841dSYevgeny Kliteynik 	u32 icmp_type;
853*d65e841dSYevgeny Kliteynik 	u32 icmp_code;
854*d65e841dSYevgeny Kliteynik 	bool is_ipv4;
855*d65e841dSYevgeny Kliteynik 
856*d65e841dSYevgeny Kliteynik 	is_ipv4 = DR_MASK_IS_ICMPV4_SET(misc_3);
857*d65e841dSYevgeny Kliteynik 	if (is_ipv4) {
858*d65e841dSYevgeny Kliteynik 		icmp_header_data	= misc_3->icmpv4_header_data;
859*d65e841dSYevgeny Kliteynik 		icmp_type		= misc_3->icmpv4_type;
860*d65e841dSYevgeny Kliteynik 		icmp_code		= misc_3->icmpv4_code;
861*d65e841dSYevgeny Kliteynik 		dw0_location		= sb->caps->flex_parser_id_icmp_dw0;
862*d65e841dSYevgeny Kliteynik 		dw1_location		= sb->caps->flex_parser_id_icmp_dw1;
863*d65e841dSYevgeny Kliteynik 	} else {
864*d65e841dSYevgeny Kliteynik 		icmp_header_data	= misc_3->icmpv6_header_data;
865*d65e841dSYevgeny Kliteynik 		icmp_type		= misc_3->icmpv6_type;
866*d65e841dSYevgeny Kliteynik 		icmp_code		= misc_3->icmpv6_code;
867*d65e841dSYevgeny Kliteynik 		dw0_location		= sb->caps->flex_parser_id_icmpv6_dw0;
868*d65e841dSYevgeny Kliteynik 		dw1_location		= sb->caps->flex_parser_id_icmpv6_dw1;
869*d65e841dSYevgeny Kliteynik 	}
870*d65e841dSYevgeny Kliteynik 
871*d65e841dSYevgeny Kliteynik 	switch (dw0_location) {
872*d65e841dSYevgeny Kliteynik 	case 4:
873*d65e841dSYevgeny Kliteynik 		if (icmp_type) {
874*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_flex_parser_1, tag, flex_parser_4,
875*d65e841dSYevgeny Kliteynik 				 (icmp_type << ICMP_TYPE_OFFSET_FIRST_DW));
876*d65e841dSYevgeny Kliteynik 			if (is_ipv4)
877*d65e841dSYevgeny Kliteynik 				misc_3->icmpv4_type = 0;
878*d65e841dSYevgeny Kliteynik 			else
879*d65e841dSYevgeny Kliteynik 				misc_3->icmpv6_type = 0;
880*d65e841dSYevgeny Kliteynik 		}
881*d65e841dSYevgeny Kliteynik 
882*d65e841dSYevgeny Kliteynik 		if (icmp_code) {
883*d65e841dSYevgeny Kliteynik 			u32 cur_val = MLX5_GET(ste_flex_parser_1, tag,
884*d65e841dSYevgeny Kliteynik 					       flex_parser_4);
885*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_flex_parser_1, tag, flex_parser_4,
886*d65e841dSYevgeny Kliteynik 				 cur_val | (icmp_code << ICMP_CODE_OFFSET_FIRST_DW));
887*d65e841dSYevgeny Kliteynik 			if (is_ipv4)
888*d65e841dSYevgeny Kliteynik 				misc_3->icmpv4_code = 0;
889*d65e841dSYevgeny Kliteynik 			else
890*d65e841dSYevgeny Kliteynik 				misc_3->icmpv6_code = 0;
891*d65e841dSYevgeny Kliteynik 		}
892*d65e841dSYevgeny Kliteynik 		break;
893*d65e841dSYevgeny Kliteynik 	default:
894*d65e841dSYevgeny Kliteynik 		return -EINVAL;
895*d65e841dSYevgeny Kliteynik 	}
896*d65e841dSYevgeny Kliteynik 
897*d65e841dSYevgeny Kliteynik 	switch (dw1_location) {
898*d65e841dSYevgeny Kliteynik 	case 5:
899*d65e841dSYevgeny Kliteynik 		if (icmp_header_data) {
900*d65e841dSYevgeny Kliteynik 			MLX5_SET(ste_flex_parser_1, tag, flex_parser_5,
901*d65e841dSYevgeny Kliteynik 				 (icmp_header_data << ICMP_HEADER_DATA_OFFSET_SECOND_DW));
902*d65e841dSYevgeny Kliteynik 			if (is_ipv4)
903*d65e841dSYevgeny Kliteynik 				misc_3->icmpv4_header_data = 0;
904*d65e841dSYevgeny Kliteynik 			else
905*d65e841dSYevgeny Kliteynik 				misc_3->icmpv6_header_data = 0;
906*d65e841dSYevgeny Kliteynik 		}
907*d65e841dSYevgeny Kliteynik 		break;
908*d65e841dSYevgeny Kliteynik 	default:
909*d65e841dSYevgeny Kliteynik 		return -EINVAL;
910*d65e841dSYevgeny Kliteynik 	}
911*d65e841dSYevgeny Kliteynik 
912*d65e841dSYevgeny Kliteynik 	return 0;
913*d65e841dSYevgeny Kliteynik }
914*d65e841dSYevgeny Kliteynik 
915*d65e841dSYevgeny Kliteynik static int
916*d65e841dSYevgeny Kliteynik dr_ste_v0_build_icmp_init(struct mlx5dr_ste_build *sb,
917*d65e841dSYevgeny Kliteynik 			  struct mlx5dr_match_param *mask)
918*d65e841dSYevgeny Kliteynik {
919*d65e841dSYevgeny Kliteynik 	int ret;
920*d65e841dSYevgeny Kliteynik 
921*d65e841dSYevgeny Kliteynik 	ret = dr_ste_v0_build_icmp_bit_mask(mask, sb->caps, sb->bit_mask);
922*d65e841dSYevgeny Kliteynik 	if (ret)
923*d65e841dSYevgeny Kliteynik 		return ret;
924*d65e841dSYevgeny Kliteynik 
925*d65e841dSYevgeny Kliteynik 	sb->lu_type = MLX5DR_STE_LU_TYPE_FLEX_PARSER_1;
926*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
927*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_icmp_tag;
928*d65e841dSYevgeny Kliteynik 
929*d65e841dSYevgeny Kliteynik 	return 0;
930*d65e841dSYevgeny Kliteynik }
931*d65e841dSYevgeny Kliteynik 
932*d65e841dSYevgeny Kliteynik static void
933*d65e841dSYevgeny Kliteynik dr_ste_v0_build_general_purpose_bit_mask(struct mlx5dr_match_param *value,
934*d65e841dSYevgeny Kliteynik 					 bool inner, u8 *bit_mask)
935*d65e841dSYevgeny Kliteynik {
936*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc2 *misc_2_mask = &value->misc2;
937*d65e841dSYevgeny Kliteynik 
938*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(general_purpose, bit_mask,
939*d65e841dSYevgeny Kliteynik 			  general_purpose_lookup_field, misc_2_mask,
940*d65e841dSYevgeny Kliteynik 			  metadata_reg_a);
941*d65e841dSYevgeny Kliteynik }
942*d65e841dSYevgeny Kliteynik 
943*d65e841dSYevgeny Kliteynik static int
944*d65e841dSYevgeny Kliteynik dr_ste_v0_build_general_purpose_tag(struct mlx5dr_match_param *value,
945*d65e841dSYevgeny Kliteynik 				    struct mlx5dr_ste_build *sb,
946*d65e841dSYevgeny Kliteynik 				    u8 *tag)
947*d65e841dSYevgeny Kliteynik {
948*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc2 *misc_2_mask = &value->misc2;
949*d65e841dSYevgeny Kliteynik 
950*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(general_purpose, tag, general_purpose_lookup_field,
951*d65e841dSYevgeny Kliteynik 		       misc_2_mask, metadata_reg_a);
952*d65e841dSYevgeny Kliteynik 
953*d65e841dSYevgeny Kliteynik 	return 0;
954*d65e841dSYevgeny Kliteynik }
955*d65e841dSYevgeny Kliteynik 
956*d65e841dSYevgeny Kliteynik static void
957*d65e841dSYevgeny Kliteynik dr_ste_v0_build_general_purpose_init(struct mlx5dr_ste_build *sb,
958*d65e841dSYevgeny Kliteynik 				     struct mlx5dr_match_param *mask)
959*d65e841dSYevgeny Kliteynik {
960*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_general_purpose_bit_mask(mask, sb->inner, sb->bit_mask);
961*d65e841dSYevgeny Kliteynik 
962*d65e841dSYevgeny Kliteynik 	sb->lu_type = MLX5DR_STE_LU_TYPE_GENERAL_PURPOSE;
963*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
964*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_general_purpose_tag;
965*d65e841dSYevgeny Kliteynik }
966*d65e841dSYevgeny Kliteynik 
967*d65e841dSYevgeny Kliteynik static void
968*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l4_misc_bit_mask(struct mlx5dr_match_param *value,
969*d65e841dSYevgeny Kliteynik 				     bool inner, u8 *bit_mask)
970*d65e841dSYevgeny Kliteynik {
971*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc3 *misc_3_mask = &value->misc3;
972*d65e841dSYevgeny Kliteynik 
973*d65e841dSYevgeny Kliteynik 	if (inner) {
974*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(eth_l4_misc, bit_mask, seq_num, misc_3_mask,
975*d65e841dSYevgeny Kliteynik 				  inner_tcp_seq_num);
976*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(eth_l4_misc, bit_mask, ack_num, misc_3_mask,
977*d65e841dSYevgeny Kliteynik 				  inner_tcp_ack_num);
978*d65e841dSYevgeny Kliteynik 	} else {
979*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(eth_l4_misc, bit_mask, seq_num, misc_3_mask,
980*d65e841dSYevgeny Kliteynik 				  outer_tcp_seq_num);
981*d65e841dSYevgeny Kliteynik 		DR_STE_SET_MASK_V(eth_l4_misc, bit_mask, ack_num, misc_3_mask,
982*d65e841dSYevgeny Kliteynik 				  outer_tcp_ack_num);
983*d65e841dSYevgeny Kliteynik 	}
984*d65e841dSYevgeny Kliteynik }
985*d65e841dSYevgeny Kliteynik 
986*d65e841dSYevgeny Kliteynik static int
987*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l4_misc_tag(struct mlx5dr_match_param *value,
988*d65e841dSYevgeny Kliteynik 				struct mlx5dr_ste_build *sb,
989*d65e841dSYevgeny Kliteynik 				u8 *tag)
990*d65e841dSYevgeny Kliteynik {
991*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc3 *misc3 = &value->misc3;
992*d65e841dSYevgeny Kliteynik 
993*d65e841dSYevgeny Kliteynik 	if (sb->inner) {
994*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(eth_l4_misc, tag, seq_num, misc3, inner_tcp_seq_num);
995*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(eth_l4_misc, tag, ack_num, misc3, inner_tcp_ack_num);
996*d65e841dSYevgeny Kliteynik 	} else {
997*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(eth_l4_misc, tag, seq_num, misc3, outer_tcp_seq_num);
998*d65e841dSYevgeny Kliteynik 		DR_STE_SET_TAG(eth_l4_misc, tag, ack_num, misc3, outer_tcp_ack_num);
999*d65e841dSYevgeny Kliteynik 	}
1000*d65e841dSYevgeny Kliteynik 
1001*d65e841dSYevgeny Kliteynik 	return 0;
1002*d65e841dSYevgeny Kliteynik }
1003*d65e841dSYevgeny Kliteynik 
1004*d65e841dSYevgeny Kliteynik static void
1005*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l4_misc_init(struct mlx5dr_ste_build *sb,
1006*d65e841dSYevgeny Kliteynik 				 struct mlx5dr_match_param *mask)
1007*d65e841dSYevgeny Kliteynik {
1008*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_eth_l4_misc_bit_mask(mask, sb->inner, sb->bit_mask);
1009*d65e841dSYevgeny Kliteynik 
1010*d65e841dSYevgeny Kliteynik 	sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL4_MISC, sb->rx, sb->inner);
1011*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
1012*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_eth_l4_misc_tag;
1013*d65e841dSYevgeny Kliteynik }
1014*d65e841dSYevgeny Kliteynik 
1015*d65e841dSYevgeny Kliteynik static void
1016*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_vxlan_gpe_bit_mask(struct mlx5dr_match_param *value,
1017*d65e841dSYevgeny Kliteynik 						   bool inner, u8 *bit_mask)
1018*d65e841dSYevgeny Kliteynik {
1019*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc3 *misc_3_mask = &value->misc3;
1020*d65e841dSYevgeny Kliteynik 
1021*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(flex_parser_tnl_vxlan_gpe, bit_mask,
1022*d65e841dSYevgeny Kliteynik 			  outer_vxlan_gpe_flags,
1023*d65e841dSYevgeny Kliteynik 			  misc_3_mask, outer_vxlan_gpe_flags);
1024*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(flex_parser_tnl_vxlan_gpe, bit_mask,
1025*d65e841dSYevgeny Kliteynik 			  outer_vxlan_gpe_next_protocol,
1026*d65e841dSYevgeny Kliteynik 			  misc_3_mask, outer_vxlan_gpe_next_protocol);
1027*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(flex_parser_tnl_vxlan_gpe, bit_mask,
1028*d65e841dSYevgeny Kliteynik 			  outer_vxlan_gpe_vni,
1029*d65e841dSYevgeny Kliteynik 			  misc_3_mask, outer_vxlan_gpe_vni);
1030*d65e841dSYevgeny Kliteynik }
1031*d65e841dSYevgeny Kliteynik 
1032*d65e841dSYevgeny Kliteynik static int
1033*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_vxlan_gpe_tag(struct mlx5dr_match_param *value,
1034*d65e841dSYevgeny Kliteynik 					      struct mlx5dr_ste_build *sb,
1035*d65e841dSYevgeny Kliteynik 					      u8 *tag)
1036*d65e841dSYevgeny Kliteynik {
1037*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc3 *misc3 = &value->misc3;
1038*d65e841dSYevgeny Kliteynik 
1039*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag,
1040*d65e841dSYevgeny Kliteynik 		       outer_vxlan_gpe_flags, misc3,
1041*d65e841dSYevgeny Kliteynik 		       outer_vxlan_gpe_flags);
1042*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag,
1043*d65e841dSYevgeny Kliteynik 		       outer_vxlan_gpe_next_protocol, misc3,
1044*d65e841dSYevgeny Kliteynik 		       outer_vxlan_gpe_next_protocol);
1045*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag,
1046*d65e841dSYevgeny Kliteynik 		       outer_vxlan_gpe_vni, misc3,
1047*d65e841dSYevgeny Kliteynik 		       outer_vxlan_gpe_vni);
1048*d65e841dSYevgeny Kliteynik 
1049*d65e841dSYevgeny Kliteynik 	return 0;
1050*d65e841dSYevgeny Kliteynik }
1051*d65e841dSYevgeny Kliteynik 
1052*d65e841dSYevgeny Kliteynik static void
1053*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_vxlan_gpe_init(struct mlx5dr_ste_build *sb,
1054*d65e841dSYevgeny Kliteynik 					       struct mlx5dr_match_param *mask)
1055*d65e841dSYevgeny Kliteynik {
1056*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_flex_parser_tnl_vxlan_gpe_bit_mask(mask, sb->inner,
1057*d65e841dSYevgeny Kliteynik 							   sb->bit_mask);
1058*d65e841dSYevgeny Kliteynik 	sb->lu_type = MLX5DR_STE_LU_TYPE_FLEX_PARSER_TNL_HEADER;
1059*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
1060*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_flex_parser_tnl_vxlan_gpe_tag;
1061*d65e841dSYevgeny Kliteynik }
1062*d65e841dSYevgeny Kliteynik 
1063*d65e841dSYevgeny Kliteynik static void
1064*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_geneve_bit_mask(struct mlx5dr_match_param *value,
1065*d65e841dSYevgeny Kliteynik 						u8 *bit_mask)
1066*d65e841dSYevgeny Kliteynik {
1067*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc *misc_mask = &value->misc;
1068*d65e841dSYevgeny Kliteynik 
1069*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask,
1070*d65e841dSYevgeny Kliteynik 			  geneve_protocol_type,
1071*d65e841dSYevgeny Kliteynik 			  misc_mask, geneve_protocol_type);
1072*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask,
1073*d65e841dSYevgeny Kliteynik 			  geneve_oam,
1074*d65e841dSYevgeny Kliteynik 			  misc_mask, geneve_oam);
1075*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask,
1076*d65e841dSYevgeny Kliteynik 			  geneve_opt_len,
1077*d65e841dSYevgeny Kliteynik 			  misc_mask, geneve_opt_len);
1078*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask,
1079*d65e841dSYevgeny Kliteynik 			  geneve_vni,
1080*d65e841dSYevgeny Kliteynik 			  misc_mask, geneve_vni);
1081*d65e841dSYevgeny Kliteynik }
1082*d65e841dSYevgeny Kliteynik 
1083*d65e841dSYevgeny Kliteynik static int
1084*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_geneve_tag(struct mlx5dr_match_param *value,
1085*d65e841dSYevgeny Kliteynik 					   struct mlx5dr_ste_build *sb,
1086*d65e841dSYevgeny Kliteynik 					   u8 *tag)
1087*d65e841dSYevgeny Kliteynik {
1088*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc *misc = &value->misc;
1089*d65e841dSYevgeny Kliteynik 
1090*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(flex_parser_tnl_geneve, tag,
1091*d65e841dSYevgeny Kliteynik 		       geneve_protocol_type, misc, geneve_protocol_type);
1092*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(flex_parser_tnl_geneve, tag,
1093*d65e841dSYevgeny Kliteynik 		       geneve_oam, misc, geneve_oam);
1094*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(flex_parser_tnl_geneve, tag,
1095*d65e841dSYevgeny Kliteynik 		       geneve_opt_len, misc, geneve_opt_len);
1096*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(flex_parser_tnl_geneve, tag,
1097*d65e841dSYevgeny Kliteynik 		       geneve_vni, misc, geneve_vni);
1098*d65e841dSYevgeny Kliteynik 
1099*d65e841dSYevgeny Kliteynik 	return 0;
1100*d65e841dSYevgeny Kliteynik }
1101*d65e841dSYevgeny Kliteynik 
1102*d65e841dSYevgeny Kliteynik static void
1103*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_geneve_init(struct mlx5dr_ste_build *sb,
1104*d65e841dSYevgeny Kliteynik 					    struct mlx5dr_match_param *mask)
1105*d65e841dSYevgeny Kliteynik {
1106*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_flex_parser_tnl_geneve_bit_mask(mask, sb->bit_mask);
1107*d65e841dSYevgeny Kliteynik 	sb->lu_type = MLX5DR_STE_LU_TYPE_FLEX_PARSER_TNL_HEADER;
1108*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
1109*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_flex_parser_tnl_geneve_tag;
1110*d65e841dSYevgeny Kliteynik }
1111*d65e841dSYevgeny Kliteynik 
1112*d65e841dSYevgeny Kliteynik static void
1113*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_0_bit_mask(struct mlx5dr_match_param *value,
1114*d65e841dSYevgeny Kliteynik 				    u8 *bit_mask)
1115*d65e841dSYevgeny Kliteynik {
1116*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc2 *misc_2_mask = &value->misc2;
1117*d65e841dSYevgeny Kliteynik 
1118*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(register_0, bit_mask, register_0_h,
1119*d65e841dSYevgeny Kliteynik 			  misc_2_mask, metadata_reg_c_0);
1120*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(register_0, bit_mask, register_0_l,
1121*d65e841dSYevgeny Kliteynik 			  misc_2_mask, metadata_reg_c_1);
1122*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(register_0, bit_mask, register_1_h,
1123*d65e841dSYevgeny Kliteynik 			  misc_2_mask, metadata_reg_c_2);
1124*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(register_0, bit_mask, register_1_l,
1125*d65e841dSYevgeny Kliteynik 			  misc_2_mask, metadata_reg_c_3);
1126*d65e841dSYevgeny Kliteynik }
1127*d65e841dSYevgeny Kliteynik 
1128*d65e841dSYevgeny Kliteynik static int
1129*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_0_tag(struct mlx5dr_match_param *value,
1130*d65e841dSYevgeny Kliteynik 			       struct mlx5dr_ste_build *sb,
1131*d65e841dSYevgeny Kliteynik 			       u8 *tag)
1132*d65e841dSYevgeny Kliteynik {
1133*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc2 *misc2 = &value->misc2;
1134*d65e841dSYevgeny Kliteynik 
1135*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(register_0, tag, register_0_h, misc2, metadata_reg_c_0);
1136*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(register_0, tag, register_0_l, misc2, metadata_reg_c_1);
1137*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(register_0, tag, register_1_h, misc2, metadata_reg_c_2);
1138*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(register_0, tag, register_1_l, misc2, metadata_reg_c_3);
1139*d65e841dSYevgeny Kliteynik 
1140*d65e841dSYevgeny Kliteynik 	return 0;
1141*d65e841dSYevgeny Kliteynik }
1142*d65e841dSYevgeny Kliteynik 
1143*d65e841dSYevgeny Kliteynik static void
1144*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_0_init(struct mlx5dr_ste_build *sb,
1145*d65e841dSYevgeny Kliteynik 				struct mlx5dr_match_param *mask)
1146*d65e841dSYevgeny Kliteynik {
1147*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_register_0_bit_mask(mask, sb->bit_mask);
1148*d65e841dSYevgeny Kliteynik 
1149*d65e841dSYevgeny Kliteynik 	sb->lu_type = MLX5DR_STE_LU_TYPE_STEERING_REGISTERS_0;
1150*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
1151*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_register_0_tag;
1152*d65e841dSYevgeny Kliteynik }
1153*d65e841dSYevgeny Kliteynik 
1154*d65e841dSYevgeny Kliteynik static void
1155*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_1_bit_mask(struct mlx5dr_match_param *value,
1156*d65e841dSYevgeny Kliteynik 				    u8 *bit_mask)
1157*d65e841dSYevgeny Kliteynik {
1158*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc2 *misc_2_mask = &value->misc2;
1159*d65e841dSYevgeny Kliteynik 
1160*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(register_1, bit_mask, register_2_h,
1161*d65e841dSYevgeny Kliteynik 			  misc_2_mask, metadata_reg_c_4);
1162*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(register_1, bit_mask, register_2_l,
1163*d65e841dSYevgeny Kliteynik 			  misc_2_mask, metadata_reg_c_5);
1164*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(register_1, bit_mask, register_3_h,
1165*d65e841dSYevgeny Kliteynik 			  misc_2_mask, metadata_reg_c_6);
1166*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK_V(register_1, bit_mask, register_3_l,
1167*d65e841dSYevgeny Kliteynik 			  misc_2_mask, metadata_reg_c_7);
1168*d65e841dSYevgeny Kliteynik }
1169*d65e841dSYevgeny Kliteynik 
1170*d65e841dSYevgeny Kliteynik static int
1171*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_1_tag(struct mlx5dr_match_param *value,
1172*d65e841dSYevgeny Kliteynik 			       struct mlx5dr_ste_build *sb,
1173*d65e841dSYevgeny Kliteynik 			       u8 *tag)
1174*d65e841dSYevgeny Kliteynik {
1175*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc2 *misc2 = &value->misc2;
1176*d65e841dSYevgeny Kliteynik 
1177*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(register_1, tag, register_2_h, misc2, metadata_reg_c_4);
1178*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(register_1, tag, register_2_l, misc2, metadata_reg_c_5);
1179*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(register_1, tag, register_3_h, misc2, metadata_reg_c_6);
1180*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(register_1, tag, register_3_l, misc2, metadata_reg_c_7);
1181*d65e841dSYevgeny Kliteynik 
1182*d65e841dSYevgeny Kliteynik 	return 0;
1183*d65e841dSYevgeny Kliteynik }
1184*d65e841dSYevgeny Kliteynik 
1185*d65e841dSYevgeny Kliteynik static void
1186*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_1_init(struct mlx5dr_ste_build *sb,
1187*d65e841dSYevgeny Kliteynik 				struct mlx5dr_match_param *mask)
1188*d65e841dSYevgeny Kliteynik {
1189*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_register_1_bit_mask(mask, sb->bit_mask);
1190*d65e841dSYevgeny Kliteynik 
1191*d65e841dSYevgeny Kliteynik 	sb->lu_type = MLX5DR_STE_LU_TYPE_STEERING_REGISTERS_1;
1192*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
1193*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_register_1_tag;
1194*d65e841dSYevgeny Kliteynik }
1195*d65e841dSYevgeny Kliteynik 
1196*d65e841dSYevgeny Kliteynik static void
1197*d65e841dSYevgeny Kliteynik dr_ste_v0_build_src_gvmi_qpn_bit_mask(struct mlx5dr_match_param *value,
1198*d65e841dSYevgeny Kliteynik 				      u8 *bit_mask)
1199*d65e841dSYevgeny Kliteynik {
1200*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc *misc_mask = &value->misc;
1201*d65e841dSYevgeny Kliteynik 
1202*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK(src_gvmi_qp, bit_mask, source_gvmi, misc_mask, source_port);
1203*d65e841dSYevgeny Kliteynik 	DR_STE_SET_MASK(src_gvmi_qp, bit_mask, source_qp, misc_mask, source_sqn);
1204*d65e841dSYevgeny Kliteynik 	misc_mask->source_eswitch_owner_vhca_id = 0;
1205*d65e841dSYevgeny Kliteynik }
1206*d65e841dSYevgeny Kliteynik 
1207*d65e841dSYevgeny Kliteynik static int
1208*d65e841dSYevgeny Kliteynik dr_ste_v0_build_src_gvmi_qpn_tag(struct mlx5dr_match_param *value,
1209*d65e841dSYevgeny Kliteynik 				 struct mlx5dr_ste_build *sb,
1210*d65e841dSYevgeny Kliteynik 				 u8 *tag)
1211*d65e841dSYevgeny Kliteynik {
1212*d65e841dSYevgeny Kliteynik 	struct mlx5dr_match_misc *misc = &value->misc;
1213*d65e841dSYevgeny Kliteynik 	struct mlx5dr_cmd_vport_cap *vport_cap;
1214*d65e841dSYevgeny Kliteynik 	struct mlx5dr_domain *dmn = sb->dmn;
1215*d65e841dSYevgeny Kliteynik 	struct mlx5dr_cmd_caps *caps;
1216*d65e841dSYevgeny Kliteynik 	u8 *bit_mask = sb->bit_mask;
1217*d65e841dSYevgeny Kliteynik 	bool source_gvmi_set;
1218*d65e841dSYevgeny Kliteynik 
1219*d65e841dSYevgeny Kliteynik 	DR_STE_SET_TAG(src_gvmi_qp, tag, source_qp, misc, source_sqn);
1220*d65e841dSYevgeny Kliteynik 
1221*d65e841dSYevgeny Kliteynik 	if (sb->vhca_id_valid) {
1222*d65e841dSYevgeny Kliteynik 		/* Find port GVMI based on the eswitch_owner_vhca_id */
1223*d65e841dSYevgeny Kliteynik 		if (misc->source_eswitch_owner_vhca_id == dmn->info.caps.gvmi)
1224*d65e841dSYevgeny Kliteynik 			caps = &dmn->info.caps;
1225*d65e841dSYevgeny Kliteynik 		else if (dmn->peer_dmn && (misc->source_eswitch_owner_vhca_id ==
1226*d65e841dSYevgeny Kliteynik 					   dmn->peer_dmn->info.caps.gvmi))
1227*d65e841dSYevgeny Kliteynik 			caps = &dmn->peer_dmn->info.caps;
1228*d65e841dSYevgeny Kliteynik 		else
1229*d65e841dSYevgeny Kliteynik 			return -EINVAL;
1230*d65e841dSYevgeny Kliteynik 	} else {
1231*d65e841dSYevgeny Kliteynik 		caps = &dmn->info.caps;
1232*d65e841dSYevgeny Kliteynik 	}
1233*d65e841dSYevgeny Kliteynik 
1234*d65e841dSYevgeny Kliteynik 	vport_cap = mlx5dr_get_vport_cap(caps, misc->source_port);
1235*d65e841dSYevgeny Kliteynik 	if (!vport_cap) {
1236*d65e841dSYevgeny Kliteynik 		mlx5dr_err(dmn, "Vport 0x%x is invalid\n",
1237*d65e841dSYevgeny Kliteynik 			   misc->source_port);
1238*d65e841dSYevgeny Kliteynik 		return -EINVAL;
1239*d65e841dSYevgeny Kliteynik 	}
1240*d65e841dSYevgeny Kliteynik 
1241*d65e841dSYevgeny Kliteynik 	source_gvmi_set = MLX5_GET(ste_src_gvmi_qp, bit_mask, source_gvmi);
1242*d65e841dSYevgeny Kliteynik 	if (vport_cap->vport_gvmi && source_gvmi_set)
1243*d65e841dSYevgeny Kliteynik 		MLX5_SET(ste_src_gvmi_qp, tag, source_gvmi, vport_cap->vport_gvmi);
1244*d65e841dSYevgeny Kliteynik 
1245*d65e841dSYevgeny Kliteynik 	misc->source_eswitch_owner_vhca_id = 0;
1246*d65e841dSYevgeny Kliteynik 	misc->source_port = 0;
1247*d65e841dSYevgeny Kliteynik 
1248*d65e841dSYevgeny Kliteynik 	return 0;
1249*d65e841dSYevgeny Kliteynik }
1250*d65e841dSYevgeny Kliteynik 
1251*d65e841dSYevgeny Kliteynik static void
1252*d65e841dSYevgeny Kliteynik dr_ste_v0_build_src_gvmi_qpn_init(struct mlx5dr_ste_build *sb,
1253*d65e841dSYevgeny Kliteynik 				  struct mlx5dr_match_param *mask)
1254*d65e841dSYevgeny Kliteynik {
1255*d65e841dSYevgeny Kliteynik 	dr_ste_v0_build_src_gvmi_qpn_bit_mask(mask, sb->bit_mask);
1256*d65e841dSYevgeny Kliteynik 
1257*d65e841dSYevgeny Kliteynik 	sb->lu_type = MLX5DR_STE_LU_TYPE_SRC_GVMI_AND_QP;
1258*d65e841dSYevgeny Kliteynik 	sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
1259*d65e841dSYevgeny Kliteynik 	sb->ste_build_tag_func = &dr_ste_v0_build_src_gvmi_qpn_tag;
1260*d65e841dSYevgeny Kliteynik }
1261*d65e841dSYevgeny Kliteynik 
1262*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_ctx ste_ctx_v0 = {
1263*d65e841dSYevgeny Kliteynik 	.build_eth_l2_src_dst_init	= &dr_ste_v0_build_eth_l2_src_dst_init,
1264*d65e841dSYevgeny Kliteynik 	.build_eth_l3_ipv6_src_init	= &dr_ste_v0_build_eth_l3_ipv6_src_init,
1265*d65e841dSYevgeny Kliteynik 	.build_eth_l3_ipv6_dst_init	= &dr_ste_v0_build_eth_l3_ipv6_dst_init,
1266*d65e841dSYevgeny Kliteynik 	.build_eth_l3_ipv4_5_tuple_init	= &dr_ste_v0_build_eth_l3_ipv4_5_tuple_init,
1267*d65e841dSYevgeny Kliteynik 	.build_eth_l2_src_init		= &dr_ste_v0_build_eth_l2_src_init,
1268*d65e841dSYevgeny Kliteynik 	.build_eth_l2_dst_init		= &dr_ste_v0_build_eth_l2_dst_init,
1269*d65e841dSYevgeny Kliteynik 	.build_eth_l2_tnl_init		= &dr_ste_v0_build_eth_l2_tnl_init,
1270*d65e841dSYevgeny Kliteynik 	.build_eth_l3_ipv4_misc_init	= &dr_ste_v0_build_eth_l3_ipv4_misc_init,
1271*d65e841dSYevgeny Kliteynik 	.build_eth_ipv6_l3_l4_init	= &dr_ste_v0_build_eth_ipv6_l3_l4_init,
1272*d65e841dSYevgeny Kliteynik 	.build_mpls_init		= &dr_ste_v0_build_mpls_init,
1273*d65e841dSYevgeny Kliteynik 	.build_tnl_gre_init		= &dr_ste_v0_build_tnl_gre_init,
1274*d65e841dSYevgeny Kliteynik 	.build_tnl_mpls_init		= &dr_ste_v0_build_tnl_mpls_init,
1275*d65e841dSYevgeny Kliteynik 	.build_icmp_init		= &dr_ste_v0_build_icmp_init,
1276*d65e841dSYevgeny Kliteynik 	.build_general_purpose_init	= &dr_ste_v0_build_general_purpose_init,
1277*d65e841dSYevgeny Kliteynik 	.build_eth_l4_misc_init		= &dr_ste_v0_build_eth_l4_misc_init,
1278*d65e841dSYevgeny Kliteynik 	.build_tnl_vxlan_gpe_init	= &dr_ste_v0_build_flex_parser_tnl_vxlan_gpe_init,
1279*d65e841dSYevgeny Kliteynik 	.build_tnl_geneve_init		= &dr_ste_v0_build_flex_parser_tnl_geneve_init,
1280*d65e841dSYevgeny Kliteynik 	.build_register_0_init		= &dr_ste_v0_build_register_0_init,
1281*d65e841dSYevgeny Kliteynik 	.build_register_1_init		= &dr_ste_v0_build_register_1_init,
1282*d65e841dSYevgeny Kliteynik 	.build_src_gvmi_qpn_init	= &dr_ste_v0_build_src_gvmi_qpn_init,
1283*d65e841dSYevgeny Kliteynik };
1284