xref: /dpdk/drivers/net/ice/base/ice_fdir.c (revision f96a8ebb)
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_tcpv6_pkt[] = {
522 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
523 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
524 	0x00, 0x00, 0x00, 0x14, 0x06, 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, 0x00, 0x00,
529 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
530 	0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
531 	0x00, 0x00,
532 };
533 
534 static const u8 ice_fdir_udpv6_pkt[] = {
535 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
536 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
537 	0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
538 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
539 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
540 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
541 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
542 	0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
543 };
544 
545 static const u8 ice_fdir_sctpv6_pkt[] = {
546 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
547 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
548 	0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
549 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
550 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
551 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
552 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
553 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
554 	0x00, 0x00,
555 };
556 
557 static const u8 ice_fdir_ipv6_pkt[] = {
558 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
559 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
560 	0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
561 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
562 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
563 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
564 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
565 };
566 
567 static const u8 ice_fdir_tcp4_tun_pkt[] = {
568 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
569 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
570 	0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
571 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
572 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
573 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
574 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
575 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
576 	0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
577 	0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
578 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
579 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580 	0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
581 };
582 
583 static const u8 ice_fdir_udp4_tun_pkt[] = {
584 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
585 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
586 	0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
587 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
588 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
589 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
590 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
591 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
592 	0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
593 	0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
594 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
595 	0x00, 0x00, 0x00, 0x00,
596 };
597 
598 static const u8 ice_fdir_sctp4_tun_pkt[] = {
599 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
600 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
601 	0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
602 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
603 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
605 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
606 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
607 	0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
608 	0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
609 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
610 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
611 };
612 
613 static const u8 ice_fdir_ip4_tun_pkt[] = {
614 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
615 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
616 	0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
617 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
618 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
619 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
620 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
621 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
622 	0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
623 	0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
624 	0x00, 0x00, 0x00, 0x00,
625 };
626 
627 static const u8 ice_fdir_tcp6_tun_pkt[] = {
628 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
629 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
630 	0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
631 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
632 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
633 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
634 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
635 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
636 	0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
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, 0x00, 0x00, 0x00, 0x00,
642 	0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
643 	0x00, 0x00, 0x00, 0x00,
644 };
645 
646 static const u8 ice_fdir_udp6_tun_pkt[] = {
647 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
648 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
649 	0x00, 0x62, 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, 0x08, 0x11, 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 };
662 
663 static const u8 ice_fdir_sctp6_tun_pkt[] = {
664 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
665 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
666 	0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
667 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
668 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
669 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
670 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
671 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
672 	0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
673 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
674 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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,
679 };
680 
681 static const u8 ice_fdir_ip6_tun_pkt[] = {
682 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
683 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
684 	0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
685 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
686 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
687 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
688 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
689 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
690 	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
691 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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 };
696 
697 /* Flow Director no-op training packet table */
698 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
699 	{
700 		ICE_FLTR_PTYPE_NONF_IPV4_TCP,
701 		sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
702 		sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
703 	},
704 	{
705 		ICE_FLTR_PTYPE_NONF_IPV4_UDP,
706 		sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
707 		sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
708 	},
709 	{
710 		ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
711 		sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
712 		sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
713 	},
714 	{
715 		ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
716 		sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
717 		sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
718 	},
719 	{
720 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
721 		sizeof(ice_fdir_ipv4_gtpu4_pkt),
722 		ice_fdir_ipv4_gtpu4_pkt,
723 		sizeof(ice_fdir_ipv4_gtpu4_pkt),
724 		ice_fdir_ipv4_gtpu4_pkt,
725 	},
726 	{
727 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH,
728 		sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
729 		ice_fdir_ipv4_gtpu4_eh_pkt,
730 		sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
731 		ice_fdir_ipv4_gtpu4_eh_pkt,
732 	},
733 	{
734 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW,
735 		sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
736 		ice_fdir_ipv4_gtpu4_eh_dw_pkt,
737 		sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
738 		ice_fdir_ipv4_gtpu4_eh_dw_pkt,
739 	},
740 	{
741 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP,
742 		sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
743 		ice_fdir_ipv4_gtpu4_eh_up_pkt,
744 		sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
745 		ice_fdir_ipv4_gtpu4_eh_up_pkt,
746 	},
747 	{
748 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4,
749 		sizeof(ice_fdir_ipv4_gtpu4_pkt),
750 		ice_fdir_ipv4_gtpu4_pkt,
751 		sizeof(ice_fdir_ipv4_gtpu4_pkt),
752 		ice_fdir_ipv4_gtpu4_pkt,
753 	},
754 	{
755 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
756 		sizeof(ice_fdir_udp4_gtpu4_pkt),
757 		ice_fdir_udp4_gtpu4_pkt,
758 		sizeof(ice_fdir_udp4_gtpu4_pkt),
759 		ice_fdir_udp4_gtpu4_pkt,
760 	},
761 	{
762 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
763 		sizeof(ice_fdir_tcp4_gtpu4_pkt),
764 		ice_fdir_tcp4_gtpu4_pkt,
765 		sizeof(ice_fdir_tcp4_gtpu4_pkt),
766 		ice_fdir_tcp4_gtpu4_pkt,
767 	},
768 	{
769 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4,
770 		sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
771 		ice_fdir_ipv4_gtpu4_eh_pkt,
772 		sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
773 		ice_fdir_ipv4_gtpu4_eh_pkt,
774 	},
775 	{
776 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP,
777 		sizeof(ice_fdir_udp4_gtpu4_eh_pkt),
778 		ice_fdir_udp4_gtpu4_eh_pkt,
779 		sizeof(ice_fdir_udp4_gtpu4_eh_pkt),
780 		ice_fdir_udp4_gtpu4_eh_pkt,
781 	},
782 	{
783 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP,
784 		sizeof(ice_fdir_tcp4_gtpu4_eh_pkt),
785 		ice_fdir_tcp4_gtpu4_eh_pkt,
786 		sizeof(ice_fdir_tcp4_gtpu4_eh_pkt),
787 		ice_fdir_tcp4_gtpu4_eh_pkt,
788 	},
789 	{
790 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4,
791 		sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
792 		ice_fdir_ipv4_gtpu4_eh_dw_pkt,
793 		sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
794 		ice_fdir_ipv4_gtpu4_eh_dw_pkt,
795 	},
796 	{
797 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP,
798 		sizeof(ice_fdir_udp4_gtpu4_eh_dw_pkt),
799 		ice_fdir_udp4_gtpu4_eh_dw_pkt,
800 		sizeof(ice_fdir_udp4_gtpu4_eh_dw_pkt),
801 		ice_fdir_udp4_gtpu4_eh_dw_pkt,
802 	},
803 	{
804 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP,
805 		sizeof(ice_fdir_tcp4_gtpu4_eh_dw_pkt),
806 		ice_fdir_tcp4_gtpu4_eh_dw_pkt,
807 		sizeof(ice_fdir_tcp4_gtpu4_eh_dw_pkt),
808 		ice_fdir_tcp4_gtpu4_eh_dw_pkt,
809 	},
810 	{
811 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4,
812 		sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
813 		ice_fdir_ipv4_gtpu4_eh_up_pkt,
814 		sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
815 		ice_fdir_ipv4_gtpu4_eh_up_pkt,
816 	},
817 	{
818 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP,
819 		sizeof(ice_fdir_udp4_gtpu4_eh_up_pkt),
820 		ice_fdir_udp4_gtpu4_eh_up_pkt,
821 		sizeof(ice_fdir_udp4_gtpu4_eh_up_pkt),
822 		ice_fdir_udp4_gtpu4_eh_up_pkt,
823 	},
824 	{
825 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP,
826 		sizeof(ice_fdir_tcp4_gtpu4_eh_up_pkt),
827 		ice_fdir_tcp4_gtpu4_eh_up_pkt,
828 		sizeof(ice_fdir_tcp4_gtpu4_eh_up_pkt),
829 		ice_fdir_tcp4_gtpu4_eh_up_pkt,
830 	},
831 	{
832 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
833 		sizeof(ice_fdir_icmp4_gtpu4_pkt),
834 		ice_fdir_icmp4_gtpu4_pkt,
835 		sizeof(ice_fdir_icmp4_gtpu4_pkt),
836 		ice_fdir_icmp4_gtpu4_pkt,
837 	},
838 	{
839 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
840 		sizeof(ice_fdir_ipv4_gtpu4_pkt),
841 		ice_fdir_ipv4_gtpu4_pkt,
842 		sizeof(ice_fdir_ipv4_gtpu4_pkt),
843 		ice_fdir_ipv4_gtpu4_pkt,
844 	},
845 	{
846 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6,
847 		sizeof(ice_fdir_ipv6_gtpu4_pkt),
848 		ice_fdir_ipv6_gtpu4_pkt,
849 		sizeof(ice_fdir_ipv6_gtpu4_pkt),
850 		ice_fdir_ipv6_gtpu4_pkt,
851 	},
852 	{
853 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP,
854 		sizeof(ice_fdir_udp6_gtpu4_pkt),
855 		ice_fdir_udp6_gtpu4_pkt,
856 		sizeof(ice_fdir_udp6_gtpu4_pkt),
857 		ice_fdir_udp6_gtpu4_pkt,
858 	},
859 	{
860 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP,
861 		sizeof(ice_fdir_tcp6_gtpu4_pkt),
862 		ice_fdir_tcp6_gtpu4_pkt,
863 		sizeof(ice_fdir_tcp6_gtpu4_pkt),
864 		ice_fdir_tcp6_gtpu4_pkt,
865 	},
866 	{
867 		ICE_FLTR_PTYPE_NONF_IPV6_GTPU,
868 		sizeof(ice_fdir_ipv6_gtpu6_pkt),
869 		ice_fdir_ipv6_gtpu6_pkt,
870 		sizeof(ice_fdir_ipv6_gtpu6_pkt),
871 		ice_fdir_ipv6_gtpu6_pkt,
872 	},
873 	{
874 		ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH,
875 		sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
876 		ice_fdir_ipv6_gtpu6_eh_pkt,
877 		sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
878 		ice_fdir_ipv6_gtpu6_eh_pkt,
879 	},
880 	{
881 		ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW,
882 		sizeof(ice_fdir_ipv6_gtpu6_eh_dw_pkt),
883 		ice_fdir_ipv6_gtpu6_eh_dw_pkt,
884 		sizeof(ice_fdir_ipv6_gtpu6_eh_dw_pkt),
885 		ice_fdir_ipv6_gtpu6_eh_dw_pkt,
886 	},
887 	{
888 		ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP,
889 		sizeof(ice_fdir_ipv6_gtpu6_eh_up_pkt),
890 		ice_fdir_ipv6_gtpu6_eh_up_pkt,
891 		sizeof(ice_fdir_ipv6_gtpu6_eh_up_pkt),
892 		ice_fdir_ipv6_gtpu6_eh_up_pkt,
893 	},
894 	{
895 		ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER,
896 		sizeof(ice_fdir_ipv6_gtpu6_pkt),
897 		ice_fdir_ipv6_gtpu6_pkt,
898 		sizeof(ice_fdir_ipv6_gtpu6_pkt),
899 		ice_fdir_ipv6_gtpu6_pkt,
900 	},
901 	{
902 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER,
903 		sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
904 		ice_fdir_ipv4_gtpu4_eh_pkt,
905 		sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
906 		ice_fdir_ipv4_gtpu4_eh_pkt,
907 	},
908 	{
909 		ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER,
910 		sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
911 		ice_fdir_ipv6_gtpu6_eh_pkt,
912 		sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
913 		ice_fdir_ipv6_gtpu6_eh_pkt,
914 	},
915 	{
916 		ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
917 		sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
918 		sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
919 	},
920 	{
921 		ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
922 		sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
923 		sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
924 	},
925 	{
926 		ICE_FLTR_PTYPE_NONF_IPV4_ESP,
927 		sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
928 		sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
929 	},
930 	{
931 		ICE_FLTR_PTYPE_NONF_IPV6_ESP,
932 		sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
933 		sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
934 	},
935 	{
936 		ICE_FLTR_PTYPE_NONF_IPV4_AH,
937 		sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
938 		sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
939 	},
940 	{
941 		ICE_FLTR_PTYPE_NONF_IPV6_AH,
942 		sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
943 		sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
944 	},
945 	{
946 		ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
947 		sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
948 		ice_fdir_ipv4_nat_t_esp_pkt,
949 		sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
950 		ice_fdir_ipv4_nat_t_esp_pkt,
951 	},
952 	{
953 		ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
954 		sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
955 		ice_fdir_ipv6_nat_t_esp_pkt,
956 		sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
957 		ice_fdir_ipv6_nat_t_esp_pkt,
958 	},
959 	{
960 		ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
961 		sizeof(ice_fdir_ipv4_pfcp_node_pkt),
962 		ice_fdir_ipv4_pfcp_node_pkt,
963 		sizeof(ice_fdir_ipv4_pfcp_node_pkt),
964 		ice_fdir_ipv4_pfcp_node_pkt,
965 	},
966 	{
967 		ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
968 		sizeof(ice_fdir_ipv4_pfcp_session_pkt),
969 		ice_fdir_ipv4_pfcp_session_pkt,
970 		sizeof(ice_fdir_ipv4_pfcp_session_pkt),
971 		ice_fdir_ipv4_pfcp_session_pkt,
972 	},
973 	{
974 		ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
975 		sizeof(ice_fdir_ipv6_pfcp_node_pkt),
976 		ice_fdir_ipv6_pfcp_node_pkt,
977 		sizeof(ice_fdir_ipv6_pfcp_node_pkt),
978 		ice_fdir_ipv6_pfcp_node_pkt,
979 	},
980 	{
981 		ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
982 		sizeof(ice_fdir_ipv6_pfcp_session_pkt),
983 		ice_fdir_ipv6_pfcp_session_pkt,
984 		sizeof(ice_fdir_ipv6_pfcp_session_pkt),
985 		ice_fdir_ipv6_pfcp_session_pkt,
986 	},
987 	{
988 		ICE_FLTR_PTYPE_NON_IP_L2,
989 		sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
990 		sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
991 	},
992 	{
993 		ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN,
994 		sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
995 		sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
996 	},
997 	{
998 		ICE_FLTR_PTYPE_NONF_ECPRI_TP0,
999 		sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
1000 		sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
1001 	},
1002 	{
1003 		ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0,
1004 		sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
1005 		ice_fdir_ipv4_udp_ecpri_tp0_pkt,
1006 		sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
1007 		ice_fdir_ipv4_udp_ecpri_tp0_pkt,
1008 	},
1009 	{
1010 		ICE_FLTR_PTYPE_NONF_IPV6_TCP,
1011 		sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
1012 		sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
1013 	},
1014 	{
1015 		ICE_FLTR_PTYPE_NONF_IPV6_UDP,
1016 		sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
1017 		sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
1018 	},
1019 	{
1020 		ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
1021 		sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
1022 		sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
1023 	},
1024 	{
1025 		ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
1026 		sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
1027 		sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
1028 	},
1029 };
1030 
1031 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
1032 
1033 /**
1034  * ice_set_dflt_val_fd_desc
1035  * @fd_fltr_ctx: pointer to fd filter descriptor
1036  */
1037 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
1038 {
1039 	fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
1040 	fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
1041 	fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
1042 	fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
1043 	fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
1044 	fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
1045 	fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
1046 	fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
1047 	fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
1048 	fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
1049 	fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
1050 	fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
1051 	fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
1052 	fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
1053 	fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
1054 	fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
1055 	fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
1056 	fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
1057 	fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
1058 }
1059 
1060 /**
1061  * ice_set_fd_desc_val
1062  * @ctx: pointer to fd filter descriptor context
1063  * @fdir_desc: populated with fd filter descriptor values
1064  */
1065 static void
1066 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
1067 		    struct ice_fltr_desc *fdir_desc)
1068 {
1069 	u64 qword;
1070 
1071 	/* prep QW0 of FD filter programming desc */
1072 	qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
1073 		ICE_FXD_FLTR_QW0_QINDEX_M;
1074 	qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
1075 		 ICE_FXD_FLTR_QW0_COMP_Q_M;
1076 	qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
1077 		 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
1078 	qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
1079 		 ICE_FXD_FLTR_QW0_FD_SPACE_M;
1080 	qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
1081 		 ICE_FXD_FLTR_QW0_STAT_CNT_M;
1082 	qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
1083 		 ICE_FXD_FLTR_QW0_STAT_ENA_M;
1084 	qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
1085 		 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
1086 	qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
1087 		 ICE_FXD_FLTR_QW0_TO_Q_M;
1088 	qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
1089 		 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
1090 	qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
1091 		 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
1092 	qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
1093 		 ICE_FXD_FLTR_QW0_DROP_M;
1094 	qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
1095 		 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
1096 	qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
1097 		 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
1098 	qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
1099 		 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
1100 	fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
1101 
1102 	/* prep QW1 of FD filter programming desc */
1103 	qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
1104 		ICE_FXD_FLTR_QW1_DTYPE_M;
1105 	qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
1106 		 ICE_FXD_FLTR_QW1_PCMD_M;
1107 	qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
1108 		 ICE_FXD_FLTR_QW1_PROF_PRI_M;
1109 	qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
1110 		 ICE_FXD_FLTR_QW1_PROF_M;
1111 	qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
1112 		 ICE_FXD_FLTR_QW1_FD_VSI_M;
1113 	qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
1114 		 ICE_FXD_FLTR_QW1_SWAP_M;
1115 	qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
1116 		 ICE_FXD_FLTR_QW1_FDID_PRI_M;
1117 	qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
1118 		 ICE_FXD_FLTR_QW1_FDID_MDID_M;
1119 	qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
1120 		 ICE_FXD_FLTR_QW1_FDID_M;
1121 	fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
1122 }
1123 
1124 /**
1125  * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
1126  * @hw: pointer to the hardware structure
1127  * @input: filter
1128  * @fdesc: filter descriptor
1129  * @add: if add is true, this is an add operation, false implies delete
1130  */
1131 void
1132 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
1133 		       struct ice_fltr_desc *fdesc, bool add)
1134 {
1135 	struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
1136 
1137 	/* set default context info */
1138 	ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
1139 
1140 	/* change sideband filtering values */
1141 	fdir_fltr_ctx.fdid = input->fltr_id;
1142 	if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
1143 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
1144 		fdir_fltr_ctx.qindex = 0;
1145 	} else if (input->dest_ctl ==
1146 		   ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
1147 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
1148 		fdir_fltr_ctx.qindex = 0;
1149 	} else {
1150 		if (input->dest_ctl ==
1151 		    ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
1152 			fdir_fltr_ctx.toq = input->q_region;
1153 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
1154 		fdir_fltr_ctx.qindex = input->q_index;
1155 	}
1156 	fdir_fltr_ctx.cnt_ena = input->cnt_ena;
1157 	fdir_fltr_ctx.cnt_index = input->cnt_index;
1158 	fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
1159 	fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
1160 	if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
1161 		fdir_fltr_ctx.toq_prio = 0;
1162 	else
1163 		fdir_fltr_ctx.toq_prio = 3;
1164 	fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
1165 		ICE_FXD_FLTR_QW1_PCMD_REMOVE;
1166 	fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
1167 	fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
1168 	fdir_fltr_ctx.comp_report = input->comp_report;
1169 	fdir_fltr_ctx.fdid_prio = input->fdid_prio;
1170 	fdir_fltr_ctx.desc_prof = 1;
1171 	fdir_fltr_ctx.desc_prof_prio = 3;
1172 	ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
1173 }
1174 
1175 /**
1176  * ice_alloc_fd_res_cntr - obtain counter resource for FD type
1177  * @hw: pointer to the hardware structure
1178  * @cntr_id: returns counter index
1179  */
1180 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
1181 {
1182 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
1183 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
1184 }
1185 
1186 /**
1187  * ice_free_fd_res_cntr - Free counter resource for FD type
1188  * @hw: pointer to the hardware structure
1189  * @cntr_id: counter index to be freed
1190  */
1191 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
1192 {
1193 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
1194 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
1195 }
1196 
1197 /**
1198  * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
1199  * @hw: pointer to the hardware structure
1200  * @cntr_id: returns counter index
1201  * @num_fltr: number of filter entries to be allocated
1202  */
1203 enum ice_status
1204 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
1205 {
1206 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
1207 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1208 				  cntr_id);
1209 }
1210 
1211 /**
1212  * ice_free_fd_guar_item - Free flow director guaranteed entries
1213  * @hw: pointer to the hardware structure
1214  * @cntr_id: counter index that needs to be freed
1215  * @num_fltr: number of filters to be freed
1216  */
1217 enum ice_status
1218 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
1219 {
1220 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
1221 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1222 				 cntr_id);
1223 }
1224 
1225 /**
1226  * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
1227  * @hw: pointer to the hardware structure
1228  * @cntr_id: returns counter index
1229  * @num_fltr: number of filter entries to be allocated
1230  */
1231 enum ice_status
1232 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
1233 {
1234 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
1235 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1236 				  cntr_id);
1237 }
1238 
1239 /**
1240  * ice_free_fd_shrd_item - Free flow director shared entries
1241  * @hw: pointer to the hardware structure
1242  * @cntr_id: counter index that needs to be freed
1243  * @num_fltr: number of filters to be freed
1244  */
1245 enum ice_status
1246 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
1247 {
1248 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
1249 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1250 				 cntr_id);
1251 }
1252 
1253 /**
1254  * ice_get_fdir_cnt_all - get the number of Flow Director filters
1255  * @hw: hardware data structure
1256  *
1257  * Returns the number of filters available on device
1258  */
1259 int ice_get_fdir_cnt_all(struct ice_hw *hw)
1260 {
1261 	return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
1262 }
1263 
1264 /**
1265  * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
1266  * @pkt: packet buffer
1267  * @offset: offset into buffer
1268  * @addr: IPv6 address to convert and insert into pkt at offset
1269  */
1270 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
1271 {
1272 	int idx;
1273 
1274 	for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
1275 		ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
1276 			   sizeof(*addr), ICE_NONDMA_TO_NONDMA);
1277 }
1278 
1279 /**
1280  * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
1281  * @pkt: packet buffer
1282  * @offset: offset into buffer
1283  * @data: 8 bit value to convert and insert into pkt at offset
1284  *
1285  * This function is designed for inserting qfi (6 bits) for gtpu.
1286  */
1287 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
1288 {
1289 	u8 ret;
1290 
1291 	ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
1292 	ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
1293 }
1294 
1295 /**
1296  * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
1297  * @pkt: packet buffer
1298  * @offset: offset into buffer
1299  * @data: 8 bit value to convert and insert into pkt at offset
1300  */
1301 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
1302 {
1303 	ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1304 }
1305 
1306 /**
1307  * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
1308  * @pkt: packet buffer
1309  * @offset: offset into buffer
1310  * @data: 8 bit value to convert and insert into pkt at offset
1311  *
1312  * This function is designed for inserting Traffic Class (TC) for IPv6,
1313  * since that TC is not aligned in number of bytes. Here we split it out
1314  * into two part and fill each byte with data copy from pkt, then insert
1315  * the two bytes data one by one.
1316  */
1317 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
1318 {
1319 	u8 high, low;
1320 
1321 	high = (data >> 4) + (*(pkt + offset) & 0xF0);
1322 	ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
1323 
1324 	low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
1325 	ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
1326 }
1327 
1328 /**
1329  * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
1330  * @pkt: packet buffer
1331  * @offset: offset into buffer
1332  * @data: 16 bit value to convert and insert into pkt at offset
1333  */
1334 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
1335 {
1336 	ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1337 }
1338 
1339 /**
1340  * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
1341  * @pkt: packet buffer
1342  * @offset: offset into buffer
1343  * @data: 32 bit value to convert and insert into pkt at offset
1344  */
1345 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
1346 {
1347 	ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1348 }
1349 
1350 /**
1351  * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
1352  * @pkt: packet buffer
1353  * @addr: MAC address to convert and insert into pkt at offset
1354  */
1355 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
1356 {
1357 	ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
1358 }
1359 
1360 /**
1361  * ice_fdir_get_open_tunnel_port
1362  * @hw: pointer to the hardware structure
1363  * @flow: flow ptype
1364  * @port: returns open port
1365  *
1366  * returns an open tunnel port specified for this flow type
1367  */
1368 static enum ice_status
1369 ice_fdir_get_open_tunnel_port(struct ice_hw *hw, enum ice_fltr_ptype flow,
1370 			      u16 *port)
1371 {
1372 	switch (flow) {
1373 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1374 		/* eCPRI tunnel */
1375 		if (!ice_get_open_tunnel_port(hw, TNL_ECPRI, port))
1376 			return ICE_ERR_DOES_NOT_EXIST;
1377 		break;
1378 	default:
1379 		if (!ice_get_open_tunnel_port(hw, TNL_VXLAN, port) &&
1380 		    !ice_get_open_tunnel_port(hw, TNL_GENEVE, port))
1381 			return ICE_ERR_DOES_NOT_EXIST;
1382 	}
1383 
1384 	return ICE_SUCCESS;
1385 }
1386 
1387 /**
1388  * ice_fdir_get_gen_prgm_pkt - generate a training packet
1389  * @hw: pointer to the hardware structure
1390  * @input: flow director filter data structure
1391  * @pkt: pointer to return filter packet
1392  * @frag: generate a fragment packet
1393  * @tun: true implies generate a tunnel packet
1394  */
1395 enum ice_status
1396 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
1397 			  u8 *pkt, bool frag, bool tun)
1398 {
1399 	enum ice_fltr_ptype flow;
1400 	u16 tnl_port;
1401 	u8 *loc;
1402 	u16 idx;
1403 
1404 	if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1405 		switch (input->ip.v4.proto) {
1406 		case ICE_IP_PROTO_TCP:
1407 			flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
1408 			break;
1409 		case ICE_IP_PROTO_UDP:
1410 			flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
1411 			break;
1412 		case ICE_IP_PROTO_SCTP:
1413 			flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
1414 			break;
1415 		default:
1416 			flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
1417 			break;
1418 		}
1419 	} else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1420 		switch (input->ip.v6.proto) {
1421 		case ICE_IP_PROTO_TCP:
1422 			flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
1423 			break;
1424 		case ICE_IP_PROTO_UDP:
1425 			flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
1426 			break;
1427 		case ICE_IP_PROTO_SCTP:
1428 			flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
1429 			break;
1430 		default:
1431 			flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
1432 			break;
1433 		}
1434 	} else {
1435 		flow = input->flow_type;
1436 	}
1437 
1438 	for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
1439 		if (ice_fdir_pkt[idx].flow == flow)
1440 			break;
1441 	if (idx == ICE_FDIR_NUM_PKT)
1442 		return ICE_ERR_PARAM;
1443 	if (!tun) {
1444 		ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
1445 			   ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
1446 		loc = pkt;
1447 	} else {
1448 		if (!ice_fdir_pkt[idx].tun_pkt)
1449 			return ICE_ERR_PARAM;
1450 
1451 		switch (flow) {
1452 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4:
1453 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1454 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1455 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6:
1456 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP:
1457 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP:
1458 			ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1459 				   ice_fdir_pkt[idx].tun_pkt_len,
1460 				   ICE_NONDMA_TO_NONDMA);
1461 			loc = &pkt[ICE_FDIR_GTPU_IP_INNER_PKT_OFF];
1462 			break;
1463 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4:
1464 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP:
1465 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP:
1466 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4:
1467 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP:
1468 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP:
1469 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4:
1470 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP:
1471 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP:
1472 			ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1473 				   ice_fdir_pkt[idx].tun_pkt_len,
1474 				   ICE_NONDMA_TO_NONDMA);
1475 			loc = &pkt[ICE_FDIR_GTPU_EH_INNER_PKT_OFF];
1476 			break;
1477 		default:
1478 			if (ice_fdir_get_open_tunnel_port(hw, flow, &tnl_port))
1479 				return ICE_ERR_DOES_NOT_EXIST;
1480 
1481 			ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1482 				   ice_fdir_pkt[idx].tun_pkt_len,
1483 				   ICE_NONDMA_TO_NONDMA);
1484 			ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
1485 					   HTONS(tnl_port));
1486 			loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
1487 			break;
1488 		}
1489 	}
1490 
1491 	/* Reverse the src and dst, since the HW expects them to be from Tx
1492 	 * perspective. The input from user is from Rx filter perspective.
1493 	 */
1494 	switch (flow) {
1495 	case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
1496 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1497 				   input->ip.v4.src_ip);
1498 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1499 				   input->ip.v4.src_port);
1500 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1501 				   input->ip.v4.dst_ip);
1502 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1503 				   input->ip.v4.dst_port);
1504 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1505 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1506 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1507 		if (frag)
1508 			loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
1509 		break;
1510 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
1511 		ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1512 		ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1513 					input->ext_data_outer.src_mac);
1514 		ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1515 				   input->ip_outer.v4.dst_ip);
1516 		ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1517 				   input->ip_outer.v4.src_ip);
1518 		ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1519 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1520 				   input->ip.v4.src_ip);
1521 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1522 				   input->ip.v4.src_port);
1523 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1524 				   input->ip.v4.dst_ip);
1525 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1526 				   input->ip.v4.dst_port);
1527 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1528 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1529 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1530 		ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1531 		break;
1532 	case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1533 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1534 				   input->ip.v4.src_ip);
1535 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1536 				   input->ip.v4.src_port);
1537 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1538 				   input->ip.v4.dst_ip);
1539 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1540 				   input->ip.v4.dst_port);
1541 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1542 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1543 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1544 		break;
1545 	case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1546 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1547 				   input->ip.v4.src_ip);
1548 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1549 				   input->ip.v4.dst_ip);
1550 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1551 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1552 		ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1553 				  input->ip.v4.proto);
1554 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1555 		break;
1556 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
1557 		ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1558 		ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac);
1559 		ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1560 				   input->ip_outer.v4.dst_ip);
1561 		ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1562 				   input->ip_outer.v4.src_ip);
1563 		ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1564 		ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1565 				   input->vxlan_data.vni);
1566 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1567 				   input->ip.v4.src_ip);
1568 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1569 				   input->ip.v4.src_port);
1570 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1571 				   input->ip.v4.dst_ip);
1572 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1573 				   input->ip.v4.dst_port);
1574 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1575 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1576 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1577 		ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1578 		break;
1579 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU:
1580 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1581 				   input->ip.v4.src_ip);
1582 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1583 				   input->ip.v4.dst_ip);
1584 		ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1585 				   input->gtpu_data.teid);
1586 		break;
1587 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4:
1588 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4:
1589 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4:
1590 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4:
1591 		ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
1592 				   input->ip.v4.src_ip);
1593 		ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
1594 				   input->ip.v4.dst_ip);
1595 		ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
1596 		ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
1597 		ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_PROTO_OFFSET,
1598 				  input->ip.v4.proto);
1599 		break;
1600 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH:
1601 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW:
1602 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP:
1603 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1604 				   input->ip.v4.src_ip);
1605 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1606 				   input->ip.v4.dst_ip);
1607 		ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1608 				   input->gtpu_data.teid);
1609 		ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1610 				      input->gtpu_data.qfi);
1611 		break;
1612 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1613 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP:
1614 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP:
1615 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP:
1616 		ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
1617 				   input->ip.v4.src_ip);
1618 		ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_DST_PORT_OFFSET,
1619 				   input->ip.v4.src_port);
1620 		ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
1621 				   input->ip.v4.dst_ip);
1622 		ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_SRC_PORT_OFFSET,
1623 				   input->ip.v4.dst_port);
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 		break;
1627 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1628 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP:
1629 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP:
1630 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP:
1631 		ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
1632 				   input->ip.v4.src_ip);
1633 		ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_DST_PORT_OFFSET,
1634 				   input->ip.v4.src_port);
1635 		ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
1636 				   input->ip.v4.dst_ip);
1637 		ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_SRC_PORT_OFFSET,
1638 				   input->ip.v4.dst_port);
1639 		ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
1640 		ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
1641 		break;
1642 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6:
1643 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
1644 					 input->ip.v6.src_ip);
1645 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
1646 					 input->ip.v6.dst_ip);
1647 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
1648 		ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
1649 		ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_PROTO_OFFSET,
1650 				  input->ip.v6.proto);
1651 		break;
1652 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP:
1653 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
1654 					 input->ip.v6.src_ip);
1655 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
1656 					 input->ip.v6.dst_ip);
1657 		ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_DST_PORT_OFFSET,
1658 				   input->ip.v6.src_port);
1659 		ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_SRC_PORT_OFFSET,
1660 				   input->ip.v6.dst_port);
1661 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
1662 		ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
1663 		break;
1664 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP:
1665 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
1666 					 input->ip.v6.src_ip);
1667 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
1668 					 input->ip.v6.dst_ip);
1669 		ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_DST_PORT_OFFSET,
1670 				   input->ip.v6.src_port);
1671 		ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_SRC_PORT_OFFSET,
1672 				   input->ip.v6.dst_port);
1673 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
1674 		ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
1675 		break;
1676 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU:
1677 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER:
1678 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1679 					 input->ip.v6.src_ip);
1680 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1681 					 input->ip.v6.dst_ip);
1682 		ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1683 				   input->gtpu_data.teid);
1684 		break;
1685 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH:
1686 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW:
1687 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP:
1688 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
1689 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1690 					 input->ip.v6.src_ip);
1691 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1692 					 input->ip.v6.dst_ip);
1693 		ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1694 				   input->gtpu_data.teid);
1695 		ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
1696 				      input->gtpu_data.qfi);
1697 		break;
1698 	case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1699 		ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1700 				   input->l2tpv3_data.session_id);
1701 		break;
1702 	case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1703 		ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1704 				   input->l2tpv3_data.session_id);
1705 		break;
1706 	case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1707 		ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1708 				   input->ip.v4.sec_parm_idx);
1709 		break;
1710 	case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1711 		ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1712 				   input->ip.v6.sec_parm_idx);
1713 		break;
1714 	case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1715 		ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1716 				   input->ip.v4.sec_parm_idx);
1717 		break;
1718 	case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1719 		ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1720 				   input->ip.v6.sec_parm_idx);
1721 		break;
1722 	case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1723 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1724 				   input->ip.v4.src_ip);
1725 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1726 				   input->ip.v4.dst_ip);
1727 		ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1728 				   input->ip.v4.sec_parm_idx);
1729 		break;
1730 	case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1731 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1732 					 input->ip.v6.src_ip);
1733 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1734 					 input->ip.v6.dst_ip);
1735 		ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1736 				   input->ip.v6.sec_parm_idx);
1737 		break;
1738 	case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1739 	case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1740 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1741 				   input->ip.v4.dst_port);
1742 		break;
1743 	case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1744 	case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1745 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1746 				   input->ip.v6.dst_port);
1747 		break;
1748 	case ICE_FLTR_PTYPE_NON_IP_L2:
1749 		ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1750 				   input->ext_data.ether_type);
1751 		break;
1752 	case ICE_FLTR_PTYPE_NONF_ECPRI_TP0:
1753 		ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET,
1754 				   input->ecpri_data.pc_id);
1755 		break;
1756 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1757 		/* Use pkt instead of loc, since PC_ID is in outer part */
1758 		ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET,
1759 				   input->ecpri_data.pc_id);
1760 		break;
1761 	case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1762 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1763 					 input->ip.v6.src_ip);
1764 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1765 					 input->ip.v6.dst_ip);
1766 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1767 				   input->ip.v6.src_port);
1768 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1769 				   input->ip.v6.dst_port);
1770 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1771 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1772 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1773 		break;
1774 	case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1775 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1776 					 input->ip.v6.src_ip);
1777 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1778 					 input->ip.v6.dst_ip);
1779 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1780 				   input->ip.v6.src_port);
1781 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1782 				   input->ip.v6.dst_port);
1783 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1784 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1785 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1786 		break;
1787 	case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1788 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1789 					 input->ip.v6.src_ip);
1790 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1791 					 input->ip.v6.dst_ip);
1792 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1793 				   input->ip.v6.src_port);
1794 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1795 				   input->ip.v6.dst_port);
1796 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1797 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1798 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1799 		break;
1800 	case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1801 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1802 					 input->ip.v6.src_ip);
1803 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1804 					 input->ip.v6.dst_ip);
1805 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1806 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1807 		ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1808 				  input->ip.v6.proto);
1809 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1810 		break;
1811 	default:
1812 		return ICE_ERR_PARAM;
1813 	}
1814 
1815 	if (input->flex_fltr)
1816 		ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1817 
1818 	return ICE_SUCCESS;
1819 }
1820 
1821 /**
1822  * ice_fdir_get_prgm_pkt - generate a training packet
1823  * @input: flow director filter data structure
1824  * @pkt: pointer to return filter packet
1825  * @frag: generate a fragment packet
1826  */
1827 enum ice_status
1828 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1829 {
1830 	return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1831 }
1832 
1833 /**
1834  * ice_fdir_has_frag - does flow type have 2 ptypes
1835  * @flow: flow ptype
1836  *
1837  * returns true is there is a fragment packet for this ptype
1838  */
1839 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1840 {
1841 	if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1842 		return true;
1843 	else
1844 		return false;
1845 }
1846 
1847 /**
1848  * ice_fdir_find_fltr_by_idx - find filter with idx
1849  * @hw: pointer to hardware structure
1850  * @fltr_idx: index to find.
1851  *
1852  * Returns pointer to filter if found or null
1853  */
1854 struct ice_fdir_fltr *
1855 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1856 {
1857 	struct ice_fdir_fltr *rule;
1858 
1859 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1860 			    fltr_node) {
1861 		/* rule ID found in the list */
1862 		if (fltr_idx == rule->fltr_id)
1863 			return rule;
1864 		if (fltr_idx < rule->fltr_id)
1865 			break;
1866 	}
1867 	return NULL;
1868 }
1869 
1870 /**
1871  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1872  * @hw: hardware structure
1873  * @fltr: filter node to add to structure
1874  */
1875 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1876 {
1877 	struct ice_fdir_fltr *rule, *parent = NULL;
1878 
1879 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1880 			    fltr_node) {
1881 		/* rule ID found or pass its spot in the list */
1882 		if (rule->fltr_id >= fltr->fltr_id)
1883 			break;
1884 		parent = rule;
1885 	}
1886 
1887 	if (parent)
1888 		LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1889 	else
1890 		LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1891 }
1892 
1893 /**
1894  * ice_fdir_update_cntrs - increment / decrement filter counter
1895  * @hw: pointer to hardware structure
1896  * @flow: filter flow type
1897  * @acl_fltr: true indicates an ACL filter
1898  * @add: true implies filters added
1899  */
1900 void
1901 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1902 		      bool acl_fltr, bool add)
1903 {
1904 	int incr;
1905 
1906 	incr = add ? 1 : -1;
1907 	hw->fdir_active_fltr += incr;
1908 	if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1909 		ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1910 	} else {
1911 		if (acl_fltr)
1912 			hw->acl_fltr_cnt[flow] += incr;
1913 		else
1914 			hw->fdir_fltr_cnt[flow] += incr;
1915 	}
1916 }
1917 
1918 /**
1919  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1920  * @a: IP v6 address
1921  * @b: IP v6 address
1922  *
1923  * Returns 0 on equal, returns non-0 if different
1924  */
1925 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1926 {
1927 	return memcmp(a, b, 4 * sizeof(__be32));
1928 }
1929 
1930 /**
1931  * ice_fdir_comp_rules - compare 2 filters
1932  * @a: a Flow Director filter data structure
1933  * @b: a Flow Director filter data structure
1934  * @v6: bool true if v6 filter
1935  *
1936  * Returns true if the filters match
1937  */
1938 static bool
1939 ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
1940 {
1941 	enum ice_fltr_ptype flow_type = a->flow_type;
1942 
1943 	/* The calling function already checks that the two filters have the
1944 	 * same flow_type.
1945 	 */
1946 	if (!v6) {
1947 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1948 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1949 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1950 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1951 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
1952 			    a->ip.v4.dst_port == b->ip.v4.dst_port &&
1953 			    a->ip.v4.src_port == b->ip.v4.src_port)
1954 				return true;
1955 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1956 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1957 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
1958 			    a->ip.v4.l4_header == b->ip.v4.l4_header &&
1959 			    a->ip.v4.proto == b->ip.v4.proto &&
1960 			    a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1961 			    a->ip.v4.tos == b->ip.v4.tos)
1962 				return true;
1963 		}
1964 	} else {
1965 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1966 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1967 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1968 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1969 			    a->ip.v6.src_port == b->ip.v6.src_port &&
1970 			    !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1971 					       b->ip.v6.dst_ip) &&
1972 			    !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1973 					       b->ip.v6.src_ip))
1974 				return true;
1975 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1976 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1977 			    a->ip.v6.src_port == b->ip.v6.src_port)
1978 				return true;
1979 		}
1980 	}
1981 
1982 	return false;
1983 }
1984 
1985 /**
1986  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1987  * @hw: hardware data structure
1988  * @input: Flow Director filter data structure
1989  *
1990  * Returns true if the filter is found in the list
1991  */
1992 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1993 {
1994 	struct ice_fdir_fltr *rule;
1995 	bool ret = false;
1996 
1997 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1998 			    fltr_node) {
1999 		enum ice_fltr_ptype flow_type;
2000 
2001 		if (rule->flow_type != input->flow_type)
2002 			continue;
2003 
2004 		flow_type = input->flow_type;
2005 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
2006 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
2007 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
2008 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
2009 			ret = ice_fdir_comp_rules(rule, input, false);
2010 		else
2011 			ret = ice_fdir_comp_rules(rule, input, true);
2012 		if (ret) {
2013 			if (rule->fltr_id == input->fltr_id &&
2014 			    rule->q_index != input->q_index)
2015 				ret = false;
2016 			else
2017 				break;
2018 		}
2019 	}
2020 
2021 	return ret;
2022 }
2023 
2024 /**
2025  * ice_clear_pf_fd_table - admin command to clear FD table for PF
2026  * @hw: hardware data structure
2027  *
2028  * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
2029  */
2030 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
2031 {
2032 	struct ice_aqc_clear_fd_table *cmd;
2033 	struct ice_aq_desc desc;
2034 
2035 	cmd = &desc.params.clear_fd_table;
2036 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
2037 	cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
2038 	/* vsi_index must be 0 to clear FD table for a PF */
2039 	cmd->vsi_index = CPU_TO_LE16(0);
2040 
2041 	return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
2042 }
2043