xref: /dpdk/drivers/net/ice/base/ice_fdir.c (revision e253c33d)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2001-2020 Intel Corporation
3  */
4 
5 #include "ice_common.h"
6 #include "ice_fdir.h"
7 
8 /* These are training packet headers used to program flow director filters. */
9 static const u8 ice_fdir_tcpv4_pkt[] = {
10 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
12 	0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
13 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
15 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00,
16 	0x20, 0x00, 0x00, 0x00, 0x00, 0x00
17 };
18 
19 static const u8 ice_fdir_udpv4_pkt[] = {
20 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
22 	0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
23 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
24 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
25 	0x00, 0x00,
26 };
27 
28 static const u8 ice_fdir_sctpv4_pkt[] = {
29 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
30 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
31 	0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84,
32 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
34 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
35 };
36 
37 static const u8 ice_fdir_ipv4_pkt[] = {
38 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
39 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
40 	0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10,
41 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
42 	0x00, 0x00
43 };
44 
45 static const u8 ice_fdir_udp4_vxlan_pkt[] = {
46 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
48 	0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
49 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
51 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
52 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
54 	0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
55 	0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57 	0x00, 0x00, 0x00, 0x00,
58 };
59 
60 static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
61 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
63 	0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
64 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65 	0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
66 	0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
67 	0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
68 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
69 	0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
70 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72 	0x00, 0x00,
73 };
74 
75 static const u8 ice_fdir_tcp4_gtpu4_pkt[] = {
76 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
77 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
78 	0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
79 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
80 	0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
81 	0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
82 	0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
83 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
84 	0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06,
85 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89 };
90 
91 static const u8 ice_fdir_icmp4_gtpu4_pkt[] = {
92 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
94 	0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
95 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96 	0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
97 	0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
98 	0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
99 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
100 	0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01,
101 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103 	0x00, 0x00,
104 };
105 
106 static const u8 ice_fdir_ipv4_gtpu4_pkt[] = {
107 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
109 	0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
110 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 	0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
112 	0x00, 0x00, 0x33, 0xff, 0x00, 0x20, 0x00, 0x00,
113 	0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x45, 0x00,
114 	0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
115 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 	0x00, 0x00,
117 };
118 
119 static const u8 ice_fdir_ipv6_gtpu6_pkt[] = {
120 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 	0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
122 	0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00,
123 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124 	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
125 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126 	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x68,
127 	0x08, 0x68, 0x00, 0x44, 0x7f, 0xed, 0x33, 0xff,
128 	0x00, 0x34, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00,
129 	0x00, 0x85, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
130 	0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
131 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
133 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
134 	0x00, 0x00,
135 };
136 
137 static const u8 ice_fdir_ipv4_gtpu4_eh_pkt[] = {
138 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
139 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
140 	0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
141 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142 	0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
143 	0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
144 	0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
145 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
146 	0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
147 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148 	0x00, 0x00,
149 };
150 
151 static const u8 ice_fdir_ipv6_gtpu6_eh_pkt[] = {
152 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153 	0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
154 	0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00,
155 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156 	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
157 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158 	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x68,
159 	0x08, 0x68, 0x00, 0x44, 0x7f, 0xed, 0x34, 0xff,
160 	0x00, 0x34, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00,
161 	0x00, 0x85, 0x02, 0x00, 0x33, 0x00, 0x00, 0x00,
162 	0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
163 	0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
167 	0x00, 0x00,
168 };
169 
170 static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
171 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
172 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
173 	0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
174 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
176 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
177 };
178 
179 static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
180 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
182 	0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00,
183 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
185 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
186 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
187 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
188 	0x00, 0x00,
189 };
190 
191 static const u8 ice_fdir_ipv4_esp_pkt[] = {
192 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
194 	0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
195 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197 	0x00, 0x00
198 };
199 
200 static const u8 ice_fdir_ipv6_esp_pkt[] = {
201 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
203 	0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00,
204 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209 };
210 
211 static const u8 ice_fdir_ipv4_ah_pkt[] = {
212 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
214 	0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
215 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218 	0x00, 0x00
219 };
220 
221 static const u8 ice_fdir_ipv6_ah_pkt[] = {
222 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
224 	0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00,
225 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 };
232 
233 static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
234 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
236 	0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
237 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238 	0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
239 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240 	0x00, 0x00,
241 };
242 
243 static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
244 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
246 	0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
247 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251 	0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
252 };
253 
254 static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
255 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
256 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
257 	0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
258 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259 	0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
260 	0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
261 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262 	0x00, 0x00,
263 };
264 
265 static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
266 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
268 	0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
269 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270 	0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
271 	0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
272 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 	0x00, 0x00,
274 };
275 
276 static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
277 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
278 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
279 	0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
280 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
283 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
284 	0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
285 	0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287 };
288 
289 static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
290 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
292 	0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
293 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
296 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
297 	0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
298 	0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 };
301 
302 static const u8 ice_fdir_non_ip_l2_pkt[] = {
303 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
306 };
307 
308 static const u8 ice_fdir_ecpri_tp0_pkt[] = {
309 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 	0x00, 0x00, 0x00, 0x00, 0xAE, 0xFE, 0x10, 0x00,
311 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 };
314 
315 static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = {
316 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
318 	0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
319 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 	0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
322 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 };
324 
325 static const u8 ice_fdir_tcpv6_pkt[] = {
326 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
327 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
328 	0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
329 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
333 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334 	0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
335 	0x00, 0x00,
336 };
337 
338 static const u8 ice_fdir_udpv6_pkt[] = {
339 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
341 	0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
342 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 	0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
347 };
348 
349 static const u8 ice_fdir_sctpv6_pkt[] = {
350 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
352 	0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
353 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 	0x00, 0x00,
359 };
360 
361 static const u8 ice_fdir_ipv6_pkt[] = {
362 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
364 	0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
365 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369 };
370 
371 static const u8 ice_fdir_tcp4_tun_pkt[] = {
372 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
374 	0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
375 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
378 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
380 	0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
381 	0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
383 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
384 	0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
385 };
386 
387 static const u8 ice_fdir_udp4_tun_pkt[] = {
388 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
390 	0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
391 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
392 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
394 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
396 	0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
397 	0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
399 	0x00, 0x00, 0x00, 0x00,
400 };
401 
402 static const u8 ice_fdir_sctp4_tun_pkt[] = {
403 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
405 	0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
406 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
409 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
411 	0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
412 	0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415 };
416 
417 static const u8 ice_fdir_ip4_tun_pkt[] = {
418 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
420 	0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
421 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
422 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
423 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
424 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
425 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
426 	0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
427 	0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
428 	0x00, 0x00, 0x00, 0x00,
429 };
430 
431 static const u8 ice_fdir_tcp6_tun_pkt[] = {
432 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
433 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
434 	0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
435 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
436 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
437 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
438 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
439 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
440 	0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
441 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
442 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
443 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
444 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
445 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
446 	0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
447 	0x00, 0x00, 0x00, 0x00,
448 };
449 
450 static const u8 ice_fdir_udp6_tun_pkt[] = {
451 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
452 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
453 	0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
454 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
455 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
456 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
457 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
458 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
459 	0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
460 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
461 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
462 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
463 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
464 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
465 };
466 
467 static const u8 ice_fdir_sctp6_tun_pkt[] = {
468 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
470 	0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
471 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
473 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
474 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
475 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
476 	0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
477 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
478 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
479 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
480 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
481 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
482 	0x00, 0x00, 0x00, 0x00,
483 };
484 
485 static const u8 ice_fdir_ip6_tun_pkt[] = {
486 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
487 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
488 	0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
489 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
491 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
492 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
493 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
494 	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
495 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
496 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
497 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
498 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
499 };
500 
501 /* Flow Director no-op training packet table */
502 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
503 	{
504 		ICE_FLTR_PTYPE_NONF_IPV4_TCP,
505 		sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
506 		sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
507 	},
508 	{
509 		ICE_FLTR_PTYPE_NONF_IPV4_UDP,
510 		sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
511 		sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
512 	},
513 	{
514 		ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
515 		sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
516 		sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
517 	},
518 	{
519 		ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
520 		sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
521 		sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
522 	},
523 	{
524 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
525 		sizeof(ice_fdir_udp4_gtpu4_pkt),
526 		ice_fdir_udp4_gtpu4_pkt,
527 		sizeof(ice_fdir_udp4_gtpu4_pkt),
528 		ice_fdir_udp4_gtpu4_pkt,
529 	},
530 	{
531 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
532 		sizeof(ice_fdir_tcp4_gtpu4_pkt),
533 		ice_fdir_tcp4_gtpu4_pkt,
534 		sizeof(ice_fdir_tcp4_gtpu4_pkt),
535 		ice_fdir_tcp4_gtpu4_pkt,
536 	},
537 	{
538 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
539 		sizeof(ice_fdir_icmp4_gtpu4_pkt),
540 		ice_fdir_icmp4_gtpu4_pkt,
541 		sizeof(ice_fdir_icmp4_gtpu4_pkt),
542 		ice_fdir_icmp4_gtpu4_pkt,
543 	},
544 	{
545 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
546 		sizeof(ice_fdir_ipv4_gtpu4_pkt),
547 		ice_fdir_ipv4_gtpu4_pkt,
548 		sizeof(ice_fdir_ipv4_gtpu4_pkt),
549 		ice_fdir_ipv4_gtpu4_pkt,
550 	},
551 	{
552 		ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER,
553 		sizeof(ice_fdir_ipv6_gtpu6_pkt),
554 		ice_fdir_ipv6_gtpu6_pkt,
555 		sizeof(ice_fdir_ipv6_gtpu6_pkt),
556 		ice_fdir_ipv6_gtpu6_pkt,
557 	},
558 	{
559 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER,
560 		sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
561 		ice_fdir_ipv4_gtpu4_eh_pkt,
562 		sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
563 		ice_fdir_ipv4_gtpu4_eh_pkt,
564 	},
565 	{
566 		ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER,
567 		sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
568 		ice_fdir_ipv6_gtpu6_eh_pkt,
569 		sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
570 		ice_fdir_ipv6_gtpu6_eh_pkt,
571 	},
572 	{
573 		ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
574 		sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
575 		sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
576 	},
577 	{
578 		ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
579 		sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
580 		sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
581 	},
582 	{
583 		ICE_FLTR_PTYPE_NONF_IPV4_ESP,
584 		sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
585 		sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
586 	},
587 	{
588 		ICE_FLTR_PTYPE_NONF_IPV6_ESP,
589 		sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
590 		sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
591 	},
592 	{
593 		ICE_FLTR_PTYPE_NONF_IPV4_AH,
594 		sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
595 		sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
596 	},
597 	{
598 		ICE_FLTR_PTYPE_NONF_IPV6_AH,
599 		sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
600 		sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
601 	},
602 	{
603 		ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
604 		sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
605 		ice_fdir_ipv4_nat_t_esp_pkt,
606 		sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
607 		ice_fdir_ipv4_nat_t_esp_pkt,
608 	},
609 	{
610 		ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
611 		sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
612 		ice_fdir_ipv6_nat_t_esp_pkt,
613 		sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
614 		ice_fdir_ipv6_nat_t_esp_pkt,
615 	},
616 	{
617 		ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
618 		sizeof(ice_fdir_ipv4_pfcp_node_pkt),
619 		ice_fdir_ipv4_pfcp_node_pkt,
620 		sizeof(ice_fdir_ipv4_pfcp_node_pkt),
621 		ice_fdir_ipv4_pfcp_node_pkt,
622 	},
623 	{
624 		ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
625 		sizeof(ice_fdir_ipv4_pfcp_session_pkt),
626 		ice_fdir_ipv4_pfcp_session_pkt,
627 		sizeof(ice_fdir_ipv4_pfcp_session_pkt),
628 		ice_fdir_ipv4_pfcp_session_pkt,
629 	},
630 	{
631 		ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
632 		sizeof(ice_fdir_ipv6_pfcp_node_pkt),
633 		ice_fdir_ipv6_pfcp_node_pkt,
634 		sizeof(ice_fdir_ipv6_pfcp_node_pkt),
635 		ice_fdir_ipv6_pfcp_node_pkt,
636 	},
637 	{
638 		ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
639 		sizeof(ice_fdir_ipv6_pfcp_session_pkt),
640 		ice_fdir_ipv6_pfcp_session_pkt,
641 		sizeof(ice_fdir_ipv6_pfcp_session_pkt),
642 		ice_fdir_ipv6_pfcp_session_pkt,
643 	},
644 	{
645 		ICE_FLTR_PTYPE_NON_IP_L2,
646 		sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
647 		sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
648 	},
649 	{
650 		ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN,
651 		sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
652 		sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
653 	},
654 	{
655 		ICE_FLTR_PTYPE_NONF_ECPRI_TP0,
656 		sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
657 		sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
658 	},
659 	{
660 		ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0,
661 		sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
662 		ice_fdir_ipv4_udp_ecpri_tp0_pkt,
663 		sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
664 		ice_fdir_ipv4_udp_ecpri_tp0_pkt,
665 	},
666 	{
667 		ICE_FLTR_PTYPE_NONF_IPV6_TCP,
668 		sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
669 		sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
670 	},
671 	{
672 		ICE_FLTR_PTYPE_NONF_IPV6_UDP,
673 		sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
674 		sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
675 	},
676 	{
677 		ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
678 		sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
679 		sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
680 	},
681 	{
682 		ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
683 		sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
684 		sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
685 	},
686 };
687 
688 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
689 
690 /**
691  * ice_set_dflt_val_fd_desc
692  * @fd_fltr_ctx: pointer to fd filter descriptor
693  */
694 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
695 {
696 	fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
697 	fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
698 	fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
699 	fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
700 	fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
701 	fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
702 	fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
703 	fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
704 	fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
705 	fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
706 	fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
707 	fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
708 	fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
709 	fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
710 	fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
711 	fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
712 	fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
713 	fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
714 	fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
715 }
716 
717 /**
718  * ice_set_fd_desc_val
719  * @ctx: pointer to fd filter descriptor context
720  * @fdir_desc: populated with fd filter descriptor values
721  */
722 static void
723 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
724 		    struct ice_fltr_desc *fdir_desc)
725 {
726 	u64 qword;
727 
728 	/* prep QW0 of FD filter programming desc */
729 	qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
730 		ICE_FXD_FLTR_QW0_QINDEX_M;
731 	qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
732 		 ICE_FXD_FLTR_QW0_COMP_Q_M;
733 	qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
734 		 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
735 	qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
736 		 ICE_FXD_FLTR_QW0_FD_SPACE_M;
737 	qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
738 		 ICE_FXD_FLTR_QW0_STAT_CNT_M;
739 	qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
740 		 ICE_FXD_FLTR_QW0_STAT_ENA_M;
741 	qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
742 		 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
743 	qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
744 		 ICE_FXD_FLTR_QW0_TO_Q_M;
745 	qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
746 		 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
747 	qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
748 		 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
749 	qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
750 		 ICE_FXD_FLTR_QW0_DROP_M;
751 	qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
752 		 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
753 	qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
754 		 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
755 	qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
756 		 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
757 	fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
758 
759 	/* prep QW1 of FD filter programming desc */
760 	qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
761 		ICE_FXD_FLTR_QW1_DTYPE_M;
762 	qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
763 		 ICE_FXD_FLTR_QW1_PCMD_M;
764 	qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
765 		 ICE_FXD_FLTR_QW1_PROF_PRI_M;
766 	qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
767 		 ICE_FXD_FLTR_QW1_PROF_M;
768 	qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
769 		 ICE_FXD_FLTR_QW1_FD_VSI_M;
770 	qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
771 		 ICE_FXD_FLTR_QW1_SWAP_M;
772 	qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
773 		 ICE_FXD_FLTR_QW1_FDID_PRI_M;
774 	qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
775 		 ICE_FXD_FLTR_QW1_FDID_MDID_M;
776 	qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
777 		 ICE_FXD_FLTR_QW1_FDID_M;
778 	fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
779 }
780 
781 /**
782  * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
783  * @hw: pointer to the hardware structure
784  * @input: filter
785  * @fdesc: filter descriptor
786  * @add: if add is true, this is an add operation, false implies delete
787  */
788 void
789 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
790 		       struct ice_fltr_desc *fdesc, bool add)
791 {
792 	struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
793 
794 	/* set default context info */
795 	ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
796 
797 	/* change sideband filtering values */
798 	fdir_fltr_ctx.fdid = input->fltr_id;
799 	if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
800 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
801 		fdir_fltr_ctx.qindex = 0;
802 	} else if (input->dest_ctl ==
803 		   ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
804 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
805 		fdir_fltr_ctx.qindex = 0;
806 	} else {
807 		if (input->dest_ctl ==
808 		    ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
809 			fdir_fltr_ctx.toq = input->q_region;
810 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
811 		fdir_fltr_ctx.qindex = input->q_index;
812 	}
813 	fdir_fltr_ctx.cnt_ena = input->cnt_ena;
814 	fdir_fltr_ctx.cnt_index = input->cnt_index;
815 	fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
816 	fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
817 	if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
818 		fdir_fltr_ctx.toq_prio = 0;
819 	else
820 		fdir_fltr_ctx.toq_prio = 3;
821 	fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
822 		ICE_FXD_FLTR_QW1_PCMD_REMOVE;
823 	fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
824 	fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
825 	fdir_fltr_ctx.comp_report = input->comp_report;
826 	fdir_fltr_ctx.fdid_prio = input->fdid_prio;
827 	fdir_fltr_ctx.desc_prof = 1;
828 	fdir_fltr_ctx.desc_prof_prio = 3;
829 	ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
830 }
831 
832 /**
833  * ice_alloc_fd_res_cntr - obtain counter resource for FD type
834  * @hw: pointer to the hardware structure
835  * @cntr_id: returns counter index
836  */
837 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
838 {
839 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
840 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
841 }
842 
843 /**
844  * ice_free_fd_res_cntr - Free counter resource for FD type
845  * @hw: pointer to the hardware structure
846  * @cntr_id: counter index to be freed
847  */
848 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
849 {
850 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
851 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
852 }
853 
854 /**
855  * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
856  * @hw: pointer to the hardware structure
857  * @cntr_id: returns counter index
858  * @num_fltr: number of filter entries to be allocated
859  */
860 enum ice_status
861 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
862 {
863 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
864 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
865 				  cntr_id);
866 }
867 
868 /**
869  * ice_free_fd_guar_item - Free flow director guaranteed entries
870  * @hw: pointer to the hardware structure
871  * @cntr_id: counter index that needs to be freed
872  * @num_fltr: number of filters to be freed
873  */
874 enum ice_status
875 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
876 {
877 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
878 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
879 				 cntr_id);
880 }
881 
882 /**
883  * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
884  * @hw: pointer to the hardware structure
885  * @cntr_id: returns counter index
886  * @num_fltr: number of filter entries to be allocated
887  */
888 enum ice_status
889 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
890 {
891 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
892 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
893 				  cntr_id);
894 }
895 
896 /**
897  * ice_free_fd_shrd_item - Free flow director shared entries
898  * @hw: pointer to the hardware structure
899  * @cntr_id: counter index that needs to be freed
900  * @num_fltr: number of filters to be freed
901  */
902 enum ice_status
903 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
904 {
905 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
906 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
907 				 cntr_id);
908 }
909 
910 /**
911  * ice_get_fdir_cnt_all - get the number of Flow Director filters
912  * @hw: hardware data structure
913  *
914  * Returns the number of filters available on device
915  */
916 int ice_get_fdir_cnt_all(struct ice_hw *hw)
917 {
918 	return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
919 }
920 
921 /**
922  * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
923  * @pkt: packet buffer
924  * @offset: offset into buffer
925  * @addr: IPv6 address to convert and insert into pkt at offset
926  */
927 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
928 {
929 	int idx;
930 
931 	for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
932 		ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
933 			   sizeof(*addr), ICE_NONDMA_TO_NONDMA);
934 }
935 
936 /**
937  * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
938  * @pkt: packet buffer
939  * @offset: offset into buffer
940  * @data: 8 bit value to convert and insert into pkt at offset
941  *
942  * This function is designed for inserting qfi (6 bits) for gtpu.
943  */
944 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
945 {
946 	u8 ret;
947 
948 	ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
949 	ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
950 }
951 
952 /**
953  * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
954  * @pkt: packet buffer
955  * @offset: offset into buffer
956  * @data: 8 bit value to convert and insert into pkt at offset
957  */
958 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
959 {
960 	ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
961 }
962 
963 /**
964  * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
965  * @pkt: packet buffer
966  * @offset: offset into buffer
967  * @data: 8 bit value to convert and insert into pkt at offset
968  *
969  * This function is designed for inserting Traffic Class (TC) for IPv6,
970  * since that TC is not aligned in number of bytes. Here we split it out
971  * into two part and fill each byte with data copy from pkt, then insert
972  * the two bytes data one by one.
973  */
974 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
975 {
976 	u8 high, low;
977 
978 	high = (data >> 4) + (*(pkt + offset) & 0xF0);
979 	ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
980 
981 	low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
982 	ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
983 }
984 
985 /**
986  * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
987  * @pkt: packet buffer
988  * @offset: offset into buffer
989  * @data: 16 bit value to convert and insert into pkt at offset
990  */
991 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
992 {
993 	ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
994 }
995 
996 /**
997  * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
998  * @pkt: packet buffer
999  * @offset: offset into buffer
1000  * @data: 32 bit value to convert and insert into pkt at offset
1001  */
1002 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
1003 {
1004 	ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1005 }
1006 
1007 /**
1008  * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
1009  * @pkt: packet buffer
1010  * @addr: MAC address to convert and insert into pkt at offset
1011  */
1012 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
1013 {
1014 	ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
1015 }
1016 
1017 /**
1018  * ice_fdir_get_open_tunnel_port
1019  * @hw: pointer to the hardware structure
1020  * @flow: flow ptype
1021  * @port: returns open port
1022  *
1023  * returns an open tunnel port specified for this flow type
1024  */
1025 static enum ice_status
1026 ice_fdir_get_open_tunnel_port(struct ice_hw *hw, enum ice_fltr_ptype flow,
1027 			      u16 *port)
1028 {
1029 	switch (flow) {
1030 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1031 		/* eCPRI tunnel */
1032 		if (!ice_get_open_tunnel_port(hw, TNL_ECPRI, port))
1033 			return ICE_ERR_DOES_NOT_EXIST;
1034 		break;
1035 	default:
1036 		if (!ice_get_open_tunnel_port(hw, TNL_VXLAN, port) &&
1037 		    !ice_get_open_tunnel_port(hw, TNL_GENEVE, port))
1038 			return ICE_ERR_DOES_NOT_EXIST;
1039 	}
1040 
1041 	return ICE_SUCCESS;
1042 }
1043 
1044 /**
1045  * ice_fdir_get_gen_prgm_pkt - generate a training packet
1046  * @hw: pointer to the hardware structure
1047  * @input: flow director filter data structure
1048  * @pkt: pointer to return filter packet
1049  * @frag: generate a fragment packet
1050  * @tun: true implies generate a tunnel packet
1051  */
1052 enum ice_status
1053 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
1054 			  u8 *pkt, bool frag, bool tun)
1055 {
1056 	enum ice_fltr_ptype flow;
1057 	u16 tnl_port;
1058 	u8 *loc;
1059 	u16 idx;
1060 
1061 	if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1062 		switch (input->ip.v4.proto) {
1063 		case ICE_IP_PROTO_TCP:
1064 			flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
1065 			break;
1066 		case ICE_IP_PROTO_UDP:
1067 			flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
1068 			break;
1069 		case ICE_IP_PROTO_SCTP:
1070 			flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
1071 			break;
1072 		default:
1073 			flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
1074 			break;
1075 		}
1076 	} else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1077 		switch (input->ip.v6.proto) {
1078 		case ICE_IP_PROTO_TCP:
1079 			flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
1080 			break;
1081 		case ICE_IP_PROTO_UDP:
1082 			flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
1083 			break;
1084 		case ICE_IP_PROTO_SCTP:
1085 			flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
1086 			break;
1087 		default:
1088 			flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
1089 			break;
1090 		}
1091 	} else {
1092 		flow = input->flow_type;
1093 	}
1094 
1095 	for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
1096 		if (ice_fdir_pkt[idx].flow == flow)
1097 			break;
1098 	if (idx == ICE_FDIR_NUM_PKT)
1099 		return ICE_ERR_PARAM;
1100 	if (!tun) {
1101 		ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
1102 			   ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
1103 		loc = pkt;
1104 	} else {
1105 		enum ice_status ret;
1106 
1107 		ret = ice_fdir_get_open_tunnel_port(hw, flow, &tnl_port);
1108 		if (ret)
1109 			return ret;
1110 
1111 		if (!ice_fdir_pkt[idx].tun_pkt)
1112 			return ICE_ERR_PARAM;
1113 		ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1114 			   ice_fdir_pkt[idx].tun_pkt_len, ICE_NONDMA_TO_NONDMA);
1115 		ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
1116 				   HTONS(tnl_port));
1117 		loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
1118 	}
1119 
1120 	/* Reverse the src and dst, since the HW expects them to be from Tx
1121 	 * perspective. The input from user is from Rx filter perspective.
1122 	 */
1123 	switch (flow) {
1124 	case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
1125 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1126 				   input->ip.v4.src_ip);
1127 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1128 				   input->ip.v4.src_port);
1129 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1130 				   input->ip.v4.dst_ip);
1131 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1132 				   input->ip.v4.dst_port);
1133 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1134 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1135 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1136 		if (frag)
1137 			loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
1138 		break;
1139 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
1140 		ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1141 		ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1142 					input->ext_data_outer.src_mac);
1143 		ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1144 				   input->ip_outer.v4.dst_ip);
1145 		ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1146 				   input->ip_outer.v4.src_ip);
1147 		ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1148 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1149 				   input->ip.v4.src_ip);
1150 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1151 				   input->ip.v4.src_port);
1152 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1153 				   input->ip.v4.dst_ip);
1154 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1155 				   input->ip.v4.dst_port);
1156 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1157 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1158 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1159 		ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1160 		break;
1161 	case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1162 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1163 				   input->ip.v4.src_ip);
1164 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1165 				   input->ip.v4.src_port);
1166 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1167 				   input->ip.v4.dst_ip);
1168 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1169 				   input->ip.v4.dst_port);
1170 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1171 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1172 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1173 		break;
1174 	case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1175 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1176 				   input->ip.v4.src_ip);
1177 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1178 				   input->ip.v4.dst_ip);
1179 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1180 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1181 		ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1182 				  input->ip.v4.proto);
1183 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1184 		break;
1185 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
1186 		ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1187 		ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac);
1188 		ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1189 				   input->ip_outer.v4.dst_ip);
1190 		ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1191 				   input->ip_outer.v4.src_ip);
1192 		ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1193 		ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1194 				   input->vxlan_data.vni);
1195 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1196 				   input->ip.v4.src_ip);
1197 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1198 				   input->ip.v4.src_port);
1199 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1200 				   input->ip.v4.dst_ip);
1201 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1202 				   input->ip.v4.dst_port);
1203 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1204 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1205 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1206 		ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1207 		break;
1208 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
1209 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1210 				   input->ip.v4.src_ip);
1211 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1212 				   input->ip.v4.dst_ip);
1213 		ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1214 				   input->gtpu_data.teid);
1215 		break;
1216 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1217 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1218 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
1219 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER:
1220 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1221 				   input->ip.v4.src_ip);
1222 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1223 				   input->ip.v4.dst_ip);
1224 		ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1225 				   input->gtpu_data.teid);
1226 		ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1227 				      input->gtpu_data.qfi);
1228 		break;
1229 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER:
1230 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1231 					 input->ip.v6.src_ip);
1232 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1233 					 input->ip.v6.dst_ip);
1234 		ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1235 				   input->gtpu_data.teid);
1236 		break;
1237 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
1238 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1239 					 input->ip.v6.src_ip);
1240 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1241 					 input->ip.v6.dst_ip);
1242 		ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1243 				   input->gtpu_data.teid);
1244 		ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
1245 				      input->gtpu_data.qfi);
1246 		break;
1247 	case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1248 		ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1249 				   input->l2tpv3_data.session_id);
1250 		break;
1251 	case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1252 		ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1253 				   input->l2tpv3_data.session_id);
1254 		break;
1255 	case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1256 		ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1257 				   input->ip.v4.sec_parm_idx);
1258 		break;
1259 	case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1260 		ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1261 				   input->ip.v6.sec_parm_idx);
1262 		break;
1263 	case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1264 		ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1265 				   input->ip.v4.sec_parm_idx);
1266 		break;
1267 	case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1268 		ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1269 				   input->ip.v6.sec_parm_idx);
1270 		break;
1271 	case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1272 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1273 				   input->ip.v4.src_ip);
1274 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1275 				   input->ip.v4.dst_ip);
1276 		ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1277 				   input->ip.v4.sec_parm_idx);
1278 		break;
1279 	case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1280 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1281 					 input->ip.v6.src_ip);
1282 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1283 					 input->ip.v6.dst_ip);
1284 		ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1285 				   input->ip.v6.sec_parm_idx);
1286 		break;
1287 	case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1288 	case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1289 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1290 				   input->ip.v4.dst_port);
1291 		break;
1292 	case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1293 	case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1294 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1295 				   input->ip.v6.dst_port);
1296 		break;
1297 	case ICE_FLTR_PTYPE_NON_IP_L2:
1298 		ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1299 				   input->ext_data.ether_type);
1300 		break;
1301 	case ICE_FLTR_PTYPE_NONF_ECPRI_TP0:
1302 		ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET,
1303 				   input->ecpri_data.pc_id);
1304 		break;
1305 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1306 		/* Use pkt instead of loc, since PC_ID is in outer part */
1307 		ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET,
1308 				   input->ecpri_data.pc_id);
1309 		break;
1310 	case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1311 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1312 					 input->ip.v6.src_ip);
1313 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1314 					 input->ip.v6.dst_ip);
1315 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1316 				   input->ip.v6.src_port);
1317 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1318 				   input->ip.v6.dst_port);
1319 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1320 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1321 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1322 		break;
1323 	case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1324 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1325 					 input->ip.v6.src_ip);
1326 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1327 					 input->ip.v6.dst_ip);
1328 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1329 				   input->ip.v6.src_port);
1330 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1331 				   input->ip.v6.dst_port);
1332 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1333 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1334 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1335 		break;
1336 	case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1337 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1338 					 input->ip.v6.src_ip);
1339 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1340 					 input->ip.v6.dst_ip);
1341 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1342 				   input->ip.v6.src_port);
1343 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1344 				   input->ip.v6.dst_port);
1345 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1346 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1347 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1348 		break;
1349 	case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1350 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1351 					 input->ip.v6.src_ip);
1352 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1353 					 input->ip.v6.dst_ip);
1354 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1355 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1356 		ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1357 				  input->ip.v6.proto);
1358 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1359 		break;
1360 	default:
1361 		return ICE_ERR_PARAM;
1362 	}
1363 
1364 	if (input->flex_fltr)
1365 		ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1366 
1367 	return ICE_SUCCESS;
1368 }
1369 
1370 /**
1371  * ice_fdir_get_prgm_pkt - generate a training packet
1372  * @input: flow director filter data structure
1373  * @pkt: pointer to return filter packet
1374  * @frag: generate a fragment packet
1375  */
1376 enum ice_status
1377 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1378 {
1379 	return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1380 }
1381 
1382 /**
1383  * ice_fdir_has_frag - does flow type have 2 ptypes
1384  * @flow: flow ptype
1385  *
1386  * returns true is there is a fragment packet for this ptype
1387  */
1388 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1389 {
1390 	if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1391 		return true;
1392 	else
1393 		return false;
1394 }
1395 
1396 /**
1397  * ice_fdir_find_by_idx - find filter with idx
1398  * @hw: pointer to hardware structure
1399  * @fltr_idx: index to find.
1400  *
1401  * Returns pointer to filter if found or null
1402  */
1403 struct ice_fdir_fltr *
1404 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1405 {
1406 	struct ice_fdir_fltr *rule;
1407 
1408 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1409 			    fltr_node) {
1410 		/* rule ID found in the list */
1411 		if (fltr_idx == rule->fltr_id)
1412 			return rule;
1413 		if (fltr_idx < rule->fltr_id)
1414 			break;
1415 	}
1416 	return NULL;
1417 }
1418 
1419 /**
1420  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1421  * @hw: hardware structure
1422  * @fltr: filter node to add to structure
1423  */
1424 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1425 {
1426 	struct ice_fdir_fltr *rule, *parent = NULL;
1427 
1428 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1429 			    fltr_node) {
1430 		/* rule ID found or pass its spot in the list */
1431 		if (rule->fltr_id >= fltr->fltr_id)
1432 			break;
1433 		parent = rule;
1434 	}
1435 
1436 	if (parent)
1437 		LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1438 	else
1439 		LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1440 }
1441 
1442 /**
1443  * ice_fdir_update_cntrs - increment / decrement filter counter
1444  * @hw: pointer to hardware structure
1445  * @flow: filter flow type
1446  * @acl_fltr: true indicates an ACL filter
1447  * @add: true implies filters added
1448  */
1449 void
1450 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1451 		      bool acl_fltr, bool add)
1452 {
1453 	int incr;
1454 
1455 	incr = add ? 1 : -1;
1456 	hw->fdir_active_fltr += incr;
1457 	if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1458 		ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1459 	} else {
1460 		if (acl_fltr)
1461 			hw->acl_fltr_cnt[flow] += incr;
1462 		else
1463 			hw->fdir_fltr_cnt[flow] += incr;
1464 	}
1465 }
1466 
1467 /**
1468  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1469  * @a: IP v6 address
1470  * @b: IP v6 address
1471  *
1472  * Returns 0 on equal, returns non-0 if different
1473  */
1474 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1475 {
1476 	return memcmp(a, b, 4 * sizeof(__be32));
1477 }
1478 
1479 /**
1480  * ice_fdir_comp_rules - compare 2 filters
1481  * @a: a Flow Director filter data structure
1482  * @b: a Flow Director filter data structure
1483  * @v6: bool true if v6 filter
1484  *
1485  * Returns true if the filters match
1486  */
1487 static bool
1488 ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
1489 {
1490 	enum ice_fltr_ptype flow_type = a->flow_type;
1491 
1492 	/* The calling function already checks that the two filters have the
1493 	 * same flow_type.
1494 	 */
1495 	if (!v6) {
1496 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1497 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1498 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1499 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1500 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
1501 			    a->ip.v4.dst_port == b->ip.v4.dst_port &&
1502 			    a->ip.v4.src_port == b->ip.v4.src_port)
1503 				return true;
1504 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1505 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1506 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
1507 			    a->ip.v4.l4_header == b->ip.v4.l4_header &&
1508 			    a->ip.v4.proto == b->ip.v4.proto &&
1509 			    a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1510 			    a->ip.v4.tos == b->ip.v4.tos)
1511 				return true;
1512 		}
1513 	} else {
1514 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1515 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1516 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1517 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1518 			    a->ip.v6.src_port == b->ip.v6.src_port &&
1519 			    !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1520 					       b->ip.v6.dst_ip) &&
1521 			    !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1522 					       b->ip.v6.src_ip))
1523 				return true;
1524 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1525 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1526 			    a->ip.v6.src_port == b->ip.v6.src_port)
1527 				return true;
1528 		}
1529 	}
1530 
1531 	return false;
1532 }
1533 
1534 /**
1535  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1536  * @hw: hardware data structure
1537  * @input: Flow Director filter data structure
1538  *
1539  * Returns true if the filter is found in the list
1540  */
1541 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1542 {
1543 	struct ice_fdir_fltr *rule;
1544 	bool ret = false;
1545 
1546 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1547 			    fltr_node) {
1548 		enum ice_fltr_ptype flow_type;
1549 
1550 		if (rule->flow_type != input->flow_type)
1551 			continue;
1552 
1553 		flow_type = input->flow_type;
1554 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1555 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1556 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1557 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1558 			ret = ice_fdir_comp_rules(rule, input, false);
1559 		else
1560 			ret = ice_fdir_comp_rules(rule, input, true);
1561 		if (ret) {
1562 			if (rule->fltr_id == input->fltr_id &&
1563 			    rule->q_index != input->q_index)
1564 				ret = false;
1565 			else
1566 				break;
1567 		}
1568 	}
1569 
1570 	return ret;
1571 }
1572 
1573 /**
1574  * ice_clear_pf_fd_table - admin command to clear FD table for PF
1575  * @hw: hardware data structure
1576  *
1577  * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
1578  */
1579 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
1580 {
1581 	struct ice_aqc_clear_fd_table *cmd;
1582 	struct ice_aq_desc desc;
1583 
1584 	cmd = &desc.params.clear_fd_table;
1585 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
1586 	cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
1587 	/* vsi_index must be 0 to clear FD table for a PF */
1588 	cmd->vsi_index = CPU_TO_LE16(0);
1589 
1590 	return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
1591 }
1592