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