xref: /dpdk/drivers/net/ice/base/ice_fdir.c (revision b19f366c)
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_ESP_SPI_OFFSET,
1737 				   input->ip.v4.sec_parm_idx);
1738 		break;
1739 	case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1740 		ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1741 				   input->ip.v6.sec_parm_idx);
1742 		break;
1743 	case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1744 		ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1745 				   input->ip.v4.sec_parm_idx);
1746 		break;
1747 	case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1748 		ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1749 				   input->ip.v6.sec_parm_idx);
1750 		break;
1751 	case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1752 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1753 				   input->ip.v4.src_ip);
1754 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1755 				   input->ip.v4.dst_ip);
1756 		ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1757 				   input->ip.v4.sec_parm_idx);
1758 		break;
1759 	case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1760 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1761 					 input->ip.v6.src_ip);
1762 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1763 					 input->ip.v6.dst_ip);
1764 		ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1765 				   input->ip.v6.sec_parm_idx);
1766 		break;
1767 	case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1768 	case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1769 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1770 				   input->ip.v4.dst_port);
1771 		break;
1772 	case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1773 	case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1774 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1775 				   input->ip.v6.dst_port);
1776 		break;
1777 	case ICE_FLTR_PTYPE_NON_IP_L2:
1778 		ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1779 				   input->ext_data.ether_type);
1780 		break;
1781 	case ICE_FLTR_PTYPE_NONF_ECPRI_TP0:
1782 		ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET,
1783 				   input->ecpri_data.pc_id);
1784 		break;
1785 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1786 		/* Use pkt instead of loc, since PC_ID is in outer part */
1787 		ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET,
1788 				   input->ecpri_data.pc_id);
1789 		break;
1790 	case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1791 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1792 					 input->ip.v6.src_ip);
1793 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1794 					 input->ip.v6.dst_ip);
1795 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1796 				   input->ip.v6.src_port);
1797 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1798 				   input->ip.v6.dst_port);
1799 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1800 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1801 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1802 		break;
1803 	case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1804 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1805 					 input->ip.v6.src_ip);
1806 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1807 					 input->ip.v6.dst_ip);
1808 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1809 				   input->ip.v6.src_port);
1810 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1811 				   input->ip.v6.dst_port);
1812 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1813 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1814 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1815 		break;
1816 	case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1817 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1818 					 input->ip.v6.src_ip);
1819 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1820 					 input->ip.v6.dst_ip);
1821 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1822 				   input->ip.v6.src_port);
1823 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1824 				   input->ip.v6.dst_port);
1825 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1826 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1827 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1828 		break;
1829 	case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1830 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1831 					 input->ip.v6.src_ip);
1832 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1833 					 input->ip.v6.dst_ip);
1834 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1835 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1836 		ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1837 				  input->ip.v6.proto);
1838 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1839 		break;
1840 	case ICE_FLTR_PTYPE_FRAG_IPV4:
1841 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1842 				   input->ip.v4.src_ip);
1843 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1844 				   input->ip.v4.dst_ip);
1845 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1846 		ice_pkt_insert_u16(loc, ICE_IPV4_ID_OFFSET,
1847 				   input->ip.v4.packet_id);
1848 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1849 		ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1850 				  input->ip.v4.proto);
1851 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1852 		break;
1853 	case ICE_FLTR_PTYPE_FRAG_IPV6:
1854 		ice_pkt_insert_u32(loc, ICE_IPV6_ID_OFFSET,
1855 				   input->ip.v6.packet_id);
1856 		break;
1857 	default:
1858 		return ICE_ERR_PARAM;
1859 	}
1860 
1861 	if (input->flex_fltr)
1862 		ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1863 
1864 	return ICE_SUCCESS;
1865 }
1866 
1867 /**
1868  * ice_fdir_get_prgm_pkt - generate a training packet
1869  * @input: flow director filter data structure
1870  * @pkt: pointer to return filter packet
1871  * @frag: generate a fragment packet
1872  */
1873 enum ice_status
1874 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1875 {
1876 	return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1877 }
1878 
1879 /**
1880  * ice_fdir_has_frag - does flow type have 2 ptypes
1881  * @flow: flow ptype
1882  *
1883  * returns true is there is a fragment packet for this ptype
1884  */
1885 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1886 {
1887 	if (flow == ICE_FLTR_PTYPE_FRAG_IPV4 ||
1888 	    flow == ICE_FLTR_PTYPE_FRAG_IPV6)
1889 		return true;
1890 	else
1891 		return false;
1892 }
1893 
1894 /**
1895  * ice_fdir_find_fltr_by_idx - find filter with idx
1896  * @hw: pointer to hardware structure
1897  * @fltr_idx: index to find.
1898  *
1899  * Returns pointer to filter if found or null
1900  */
1901 struct ice_fdir_fltr *
1902 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1903 {
1904 	struct ice_fdir_fltr *rule;
1905 
1906 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1907 			    fltr_node) {
1908 		/* rule ID found in the list */
1909 		if (fltr_idx == rule->fltr_id)
1910 			return rule;
1911 		if (fltr_idx < rule->fltr_id)
1912 			break;
1913 	}
1914 	return NULL;
1915 }
1916 
1917 /**
1918  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1919  * @hw: hardware structure
1920  * @fltr: filter node to add to structure
1921  */
1922 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1923 {
1924 	struct ice_fdir_fltr *rule, *parent = NULL;
1925 
1926 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1927 			    fltr_node) {
1928 		/* rule ID found or pass its spot in the list */
1929 		if (rule->fltr_id >= fltr->fltr_id)
1930 			break;
1931 		parent = rule;
1932 	}
1933 
1934 	if (parent)
1935 		LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1936 	else
1937 		LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1938 }
1939 
1940 /**
1941  * ice_fdir_update_cntrs - increment / decrement filter counter
1942  * @hw: pointer to hardware structure
1943  * @flow: filter flow type
1944  * @acl_fltr: true indicates an ACL filter
1945  * @add: true implies filters added
1946  */
1947 void
1948 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1949 		      bool acl_fltr, bool add)
1950 {
1951 	int incr;
1952 
1953 	incr = add ? 1 : -1;
1954 	hw->fdir_active_fltr += incr;
1955 	if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1956 		ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1957 	} else {
1958 		if (acl_fltr)
1959 			hw->acl_fltr_cnt[flow] += incr;
1960 		else
1961 			hw->fdir_fltr_cnt[flow] += incr;
1962 	}
1963 }
1964 
1965 /**
1966  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1967  * @a: IP v6 address
1968  * @b: IP v6 address
1969  *
1970  * Returns 0 on equal, returns non-0 if different
1971  */
1972 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1973 {
1974 	return memcmp(a, b, 4 * sizeof(__be32));
1975 }
1976 
1977 /**
1978  * ice_fdir_comp_rules - compare 2 filters
1979  * @a: a Flow Director filter data structure
1980  * @b: a Flow Director filter data structure
1981  * @v6: bool true if v6 filter
1982  *
1983  * Returns true if the filters match
1984  */
1985 static bool
1986 ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
1987 {
1988 	enum ice_fltr_ptype flow_type = a->flow_type;
1989 
1990 	/* The calling function already checks that the two filters have the
1991 	 * same flow_type.
1992 	 */
1993 	if (!v6) {
1994 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1995 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1996 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1997 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1998 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
1999 			    a->ip.v4.dst_port == b->ip.v4.dst_port &&
2000 			    a->ip.v4.src_port == b->ip.v4.src_port)
2001 				return true;
2002 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
2003 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
2004 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
2005 			    a->ip.v4.l4_header == b->ip.v4.l4_header &&
2006 			    a->ip.v4.proto == b->ip.v4.proto &&
2007 			    a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
2008 			    a->ip.v4.tos == b->ip.v4.tos)
2009 				return true;
2010 		}
2011 	} else {
2012 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
2013 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
2014 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
2015 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
2016 			    a->ip.v6.src_port == b->ip.v6.src_port &&
2017 			    !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
2018 					       b->ip.v6.dst_ip) &&
2019 			    !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
2020 					       b->ip.v6.src_ip))
2021 				return true;
2022 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
2023 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
2024 			    a->ip.v6.src_port == b->ip.v6.src_port)
2025 				return true;
2026 		}
2027 	}
2028 
2029 	return false;
2030 }
2031 
2032 /**
2033  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
2034  * @hw: hardware data structure
2035  * @input: Flow Director filter data structure
2036  *
2037  * Returns true if the filter is found in the list
2038  */
2039 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
2040 {
2041 	struct ice_fdir_fltr *rule;
2042 	bool ret = false;
2043 
2044 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
2045 			    fltr_node) {
2046 		enum ice_fltr_ptype flow_type;
2047 
2048 		if (rule->flow_type != input->flow_type)
2049 			continue;
2050 
2051 		flow_type = input->flow_type;
2052 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
2053 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
2054 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
2055 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
2056 			ret = ice_fdir_comp_rules(rule, input, false);
2057 		else
2058 			ret = ice_fdir_comp_rules(rule, input, true);
2059 		if (ret) {
2060 			if (rule->fltr_id == input->fltr_id &&
2061 			    rule->q_index != input->q_index)
2062 				ret = false;
2063 			else
2064 				break;
2065 		}
2066 	}
2067 
2068 	return ret;
2069 }
2070 
2071 /**
2072  * ice_clear_pf_fd_table - admin command to clear FD table for PF
2073  * @hw: hardware data structure
2074  *
2075  * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
2076  */
2077 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
2078 {
2079 	struct ice_aqc_clear_fd_table *cmd;
2080 	struct ice_aq_desc desc;
2081 
2082 	cmd = &desc.params.clear_fd_table;
2083 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
2084 	cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
2085 	/* vsi_index must be 0 to clear FD table for a PF */
2086 	cmd->vsi_index = CPU_TO_LE16(0);
2087 
2088 	return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
2089 }
2090