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