xref: /dpdk/drivers/net/ice/base/ice_fdir.c (revision 10eaf41d)
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_IPV4_UDP_VXLAN_IPV4_UDP,
1028 		sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
1029 		sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
1030 	},
1031 	{
1032 		ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_TCP,
1033 		sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
1034 		sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
1035 	},
1036 	{
1037 		ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_SCTP,
1038 		sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
1039 		sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
1040 	},
1041 	{
1042 		ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_OTHER,
1043 		sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
1044 		sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
1045 	},
1046 	{
1047 		ICE_FLTR_PTYPE_NONF_ECPRI_TP0,
1048 		sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
1049 		sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
1050 	},
1051 	{
1052 		ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0,
1053 		sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
1054 		ice_fdir_ipv4_udp_ecpri_tp0_pkt,
1055 		sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
1056 		ice_fdir_ipv4_udp_ecpri_tp0_pkt,
1057 	},
1058 	{
1059 		ICE_FLTR_PTYPE_NONF_IPV6_TCP,
1060 		sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
1061 		sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
1062 	},
1063 	{
1064 		ICE_FLTR_PTYPE_NONF_IPV6_UDP,
1065 		sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
1066 		sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
1067 	},
1068 	{
1069 		ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
1070 		sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
1071 		sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
1072 	},
1073 	{
1074 		ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
1075 		sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
1076 		sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
1077 	},
1078 };
1079 
1080 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
1081 
1082 /**
1083  * ice_set_dflt_val_fd_desc
1084  * @fd_fltr_ctx: pointer to fd filter descriptor
1085  */
1086 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
1087 {
1088 	fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
1089 	fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
1090 	fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
1091 	fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
1092 	fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
1093 	fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
1094 	fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
1095 	fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
1096 	fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
1097 	fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
1098 	fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
1099 	fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
1100 	fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
1101 	fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
1102 	fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
1103 	fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
1104 	fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
1105 	fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
1106 	fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
1107 }
1108 
1109 /**
1110  * ice_set_fd_desc_val
1111  * @ctx: pointer to fd filter descriptor context
1112  * @fdir_desc: populated with fd filter descriptor values
1113  */
1114 static void
1115 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
1116 		    struct ice_fltr_desc *fdir_desc)
1117 {
1118 	u64 qword;
1119 
1120 	/* prep QW0 of FD filter programming desc */
1121 	qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
1122 		ICE_FXD_FLTR_QW0_QINDEX_M;
1123 	qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
1124 		 ICE_FXD_FLTR_QW0_COMP_Q_M;
1125 	qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
1126 		 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
1127 	qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
1128 		 ICE_FXD_FLTR_QW0_FD_SPACE_M;
1129 	qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
1130 		 ICE_FXD_FLTR_QW0_STAT_CNT_M;
1131 	qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
1132 		 ICE_FXD_FLTR_QW0_STAT_ENA_M;
1133 	qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
1134 		 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
1135 	qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
1136 		 ICE_FXD_FLTR_QW0_TO_Q_M;
1137 	qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
1138 		 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
1139 	qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
1140 		 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
1141 	qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
1142 		 ICE_FXD_FLTR_QW0_DROP_M;
1143 	qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
1144 		 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
1145 	qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
1146 		 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
1147 	qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
1148 		 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
1149 	fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
1150 
1151 	/* prep QW1 of FD filter programming desc */
1152 	qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
1153 		ICE_FXD_FLTR_QW1_DTYPE_M;
1154 	qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
1155 		 ICE_FXD_FLTR_QW1_PCMD_M;
1156 	qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
1157 		 ICE_FXD_FLTR_QW1_PROF_PRI_M;
1158 	qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
1159 		 ICE_FXD_FLTR_QW1_PROF_M;
1160 	qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
1161 		 ICE_FXD_FLTR_QW1_FD_VSI_M;
1162 	qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
1163 		 ICE_FXD_FLTR_QW1_SWAP_M;
1164 	qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
1165 		 ICE_FXD_FLTR_QW1_FDID_PRI_M;
1166 	qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
1167 		 ICE_FXD_FLTR_QW1_FDID_MDID_M;
1168 	qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
1169 		 ICE_FXD_FLTR_QW1_FDID_M;
1170 	fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
1171 }
1172 
1173 /**
1174  * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
1175  * @hw: pointer to the hardware structure
1176  * @input: filter
1177  * @fdesc: filter descriptor
1178  * @add: if add is true, this is an add operation, false implies delete
1179  */
1180 void
1181 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
1182 		       struct ice_fltr_desc *fdesc, bool add)
1183 {
1184 	struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
1185 
1186 	/* set default context info */
1187 	ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
1188 
1189 	/* change sideband filtering values */
1190 	fdir_fltr_ctx.fdid = input->fltr_id;
1191 	if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
1192 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
1193 		fdir_fltr_ctx.qindex = 0;
1194 	} else if (input->dest_ctl ==
1195 		   ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
1196 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
1197 		fdir_fltr_ctx.qindex = 0;
1198 	} else {
1199 		if (input->dest_ctl ==
1200 		    ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
1201 			fdir_fltr_ctx.toq = input->q_region;
1202 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
1203 		fdir_fltr_ctx.qindex = input->q_index;
1204 	}
1205 	fdir_fltr_ctx.cnt_ena = input->cnt_ena;
1206 	fdir_fltr_ctx.cnt_index = input->cnt_index;
1207 	fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
1208 	fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
1209 	if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
1210 		fdir_fltr_ctx.toq_prio = 0;
1211 	else
1212 		fdir_fltr_ctx.toq_prio = 3;
1213 	fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
1214 		ICE_FXD_FLTR_QW1_PCMD_REMOVE;
1215 	fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
1216 	fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
1217 	fdir_fltr_ctx.comp_report = input->comp_report;
1218 	fdir_fltr_ctx.fdid_prio = input->fdid_prio;
1219 	fdir_fltr_ctx.desc_prof = 1;
1220 	fdir_fltr_ctx.desc_prof_prio = 3;
1221 	ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
1222 }
1223 
1224 /**
1225  * ice_alloc_fd_res_cntr - obtain counter resource for FD type
1226  * @hw: pointer to the hardware structure
1227  * @cntr_id: returns counter index
1228  */
1229 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
1230 {
1231 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
1232 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
1233 }
1234 
1235 /**
1236  * ice_free_fd_res_cntr - Free counter resource for FD type
1237  * @hw: pointer to the hardware structure
1238  * @cntr_id: counter index to be freed
1239  */
1240 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
1241 {
1242 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
1243 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
1244 }
1245 
1246 /**
1247  * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
1248  * @hw: pointer to the hardware structure
1249  * @cntr_id: returns counter index
1250  * @num_fltr: number of filter entries to be allocated
1251  */
1252 enum ice_status
1253 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
1254 {
1255 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
1256 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1257 				  cntr_id);
1258 }
1259 
1260 /**
1261  * ice_free_fd_guar_item - Free flow director guaranteed entries
1262  * @hw: pointer to the hardware structure
1263  * @cntr_id: counter index that needs to be freed
1264  * @num_fltr: number of filters to be freed
1265  */
1266 enum ice_status
1267 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
1268 {
1269 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
1270 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1271 				 cntr_id);
1272 }
1273 
1274 /**
1275  * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
1276  * @hw: pointer to the hardware structure
1277  * @cntr_id: returns counter index
1278  * @num_fltr: number of filter entries to be allocated
1279  */
1280 enum ice_status
1281 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
1282 {
1283 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
1284 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1285 				  cntr_id);
1286 }
1287 
1288 /**
1289  * ice_free_fd_shrd_item - Free flow director shared entries
1290  * @hw: pointer to the hardware structure
1291  * @cntr_id: counter index that needs to be freed
1292  * @num_fltr: number of filters to be freed
1293  */
1294 enum ice_status
1295 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
1296 {
1297 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
1298 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1299 				 cntr_id);
1300 }
1301 
1302 /**
1303  * ice_get_fdir_cnt_all - get the number of Flow Director filters
1304  * @hw: hardware data structure
1305  *
1306  * Returns the number of filters available on device
1307  */
1308 int ice_get_fdir_cnt_all(struct ice_hw *hw)
1309 {
1310 	return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
1311 }
1312 
1313 /**
1314  * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
1315  * @pkt: packet buffer
1316  * @offset: offset into buffer
1317  * @addr: IPv6 address to convert and insert into pkt at offset
1318  */
1319 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
1320 {
1321 	int idx;
1322 
1323 	for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
1324 		ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
1325 			   sizeof(*addr), ICE_NONDMA_TO_NONDMA);
1326 }
1327 
1328 /**
1329  * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
1330  * @pkt: packet buffer
1331  * @offset: offset into buffer
1332  * @data: 8 bit value to convert and insert into pkt at offset
1333  *
1334  * This function is designed for inserting qfi (6 bits) for gtpu.
1335  */
1336 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
1337 {
1338 	u8 ret;
1339 
1340 	ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
1341 	ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
1342 }
1343 
1344 /**
1345  * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
1346  * @pkt: packet buffer
1347  * @offset: offset into buffer
1348  * @data: 8 bit value to convert and insert into pkt at offset
1349  */
1350 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
1351 {
1352 	ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1353 }
1354 
1355 /**
1356  * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
1357  * @pkt: packet buffer
1358  * @offset: offset into buffer
1359  * @data: 8 bit value to convert and insert into pkt at offset
1360  *
1361  * This function is designed for inserting Traffic Class (TC) for IPv6,
1362  * since that TC is not aligned in number of bytes. Here we split it out
1363  * into two part and fill each byte with data copy from pkt, then insert
1364  * the two bytes data one by one.
1365  */
1366 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
1367 {
1368 	u8 high, low;
1369 
1370 	high = (data >> 4) + (*(pkt + offset) & 0xF0);
1371 	ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
1372 
1373 	low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
1374 	ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
1375 }
1376 
1377 /**
1378  * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
1379  * @pkt: packet buffer
1380  * @offset: offset into buffer
1381  * @data: 16 bit value to convert and insert into pkt at offset
1382  */
1383 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
1384 {
1385 	ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1386 }
1387 
1388 /**
1389  * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
1390  * @pkt: packet buffer
1391  * @offset: offset into buffer
1392  * @data: 32 bit value to convert and insert into pkt at offset
1393  */
1394 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
1395 {
1396 	ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1397 }
1398 
1399 /**
1400  * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
1401  * @pkt: packet buffer
1402  * @addr: MAC address to convert and insert into pkt at offset
1403  */
1404 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
1405 {
1406 	ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
1407 }
1408 
1409 /**
1410  * ice_fdir_get_open_tunnel_port
1411  * @hw: pointer to the hardware structure
1412  * @flow: flow ptype
1413  * @port: returns open port
1414  *
1415  * returns an open tunnel port specified for this flow type
1416  */
1417 static enum ice_status
1418 ice_fdir_get_open_tunnel_port(struct ice_hw *hw, enum ice_fltr_ptype flow,
1419 			      u16 *port)
1420 {
1421 	switch (flow) {
1422 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1423 		/* eCPRI tunnel */
1424 		if (!ice_get_open_tunnel_port(hw, TNL_ECPRI, port))
1425 			return ICE_ERR_DOES_NOT_EXIST;
1426 		break;
1427 	default:
1428 		if (!ice_get_open_tunnel_port(hw, TNL_VXLAN, port) &&
1429 		    !ice_get_open_tunnel_port(hw, TNL_GENEVE, port))
1430 			return ICE_ERR_DOES_NOT_EXIST;
1431 	}
1432 
1433 	return ICE_SUCCESS;
1434 }
1435 
1436 /**
1437  * ice_fdir_get_gen_prgm_pkt - generate a training packet
1438  * @hw: pointer to the hardware structure
1439  * @input: flow director filter data structure
1440  * @pkt: pointer to return filter packet
1441  * @frag: generate a fragment packet
1442  * @tun: true implies generate a tunnel packet
1443  */
1444 enum ice_status
1445 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
1446 			  u8 *pkt, bool frag, bool tun)
1447 {
1448 	enum ice_fltr_ptype flow;
1449 	u16 tnl_port;
1450 	u8 *loc;
1451 	u16 idx;
1452 
1453 	if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1454 		switch (input->ip.v4.proto) {
1455 		case ICE_IP_PROTO_TCP:
1456 			flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
1457 			break;
1458 		case ICE_IP_PROTO_UDP:
1459 			flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
1460 			break;
1461 		case ICE_IP_PROTO_SCTP:
1462 			flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
1463 			break;
1464 		default:
1465 			flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
1466 			break;
1467 		}
1468 	} else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1469 		switch (input->ip.v6.proto) {
1470 		case ICE_IP_PROTO_TCP:
1471 			flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
1472 			break;
1473 		case ICE_IP_PROTO_UDP:
1474 			flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
1475 			break;
1476 		case ICE_IP_PROTO_SCTP:
1477 			flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
1478 			break;
1479 		default:
1480 			flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
1481 			break;
1482 		}
1483 	} else {
1484 		flow = input->flow_type;
1485 	}
1486 
1487 	for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
1488 		if (ice_fdir_pkt[idx].flow == flow)
1489 			break;
1490 	if (idx == ICE_FDIR_NUM_PKT)
1491 		return ICE_ERR_PARAM;
1492 	if (!tun) {
1493 		ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
1494 			   ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
1495 		loc = pkt;
1496 	} else {
1497 		if (!ice_fdir_pkt[idx].tun_pkt)
1498 			return ICE_ERR_PARAM;
1499 
1500 		switch (flow) {
1501 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4:
1502 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1503 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1504 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6:
1505 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP:
1506 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP:
1507 			ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1508 				   ice_fdir_pkt[idx].tun_pkt_len,
1509 				   ICE_NONDMA_TO_NONDMA);
1510 			loc = &pkt[ICE_FDIR_GTPU_IP_INNER_PKT_OFF];
1511 			break;
1512 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4:
1513 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP:
1514 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP:
1515 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4:
1516 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP:
1517 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP:
1518 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4:
1519 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP:
1520 		case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP:
1521 			ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1522 				   ice_fdir_pkt[idx].tun_pkt_len,
1523 				   ICE_NONDMA_TO_NONDMA);
1524 			loc = &pkt[ICE_FDIR_GTPU_EH_INNER_PKT_OFF];
1525 			break;
1526 		default:
1527 			if (ice_fdir_get_open_tunnel_port(hw, flow, &tnl_port))
1528 				return ICE_ERR_DOES_NOT_EXIST;
1529 
1530 			ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1531 				   ice_fdir_pkt[idx].tun_pkt_len,
1532 				   ICE_NONDMA_TO_NONDMA);
1533 			ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
1534 					   HTONS(tnl_port));
1535 			loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
1536 			break;
1537 		}
1538 	}
1539 
1540 	/* Reverse the src and dst, since the HW expects them to be from Tx
1541 	 * perspective. The input from user is from Rx filter perspective.
1542 	 */
1543 	switch (flow) {
1544 	case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
1545 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1546 				   input->ip.v4.src_ip);
1547 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1548 				   input->ip.v4.src_port);
1549 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1550 				   input->ip.v4.dst_ip);
1551 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1552 				   input->ip.v4.dst_port);
1553 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1554 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1555 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1556 		if (frag)
1557 			loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
1558 		break;
1559 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
1560 		ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1561 		ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1562 					input->ext_data_outer.src_mac);
1563 		ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1564 				   input->ip_outer.v4.dst_ip);
1565 		ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1566 				   input->ip_outer.v4.src_ip);
1567 		ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1568 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1569 				   input->ip.v4.src_ip);
1570 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1571 				   input->ip.v4.src_port);
1572 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1573 				   input->ip.v4.dst_ip);
1574 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1575 				   input->ip.v4.dst_port);
1576 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1577 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1578 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1579 		ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1580 		break;
1581 	case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1582 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1583 				   input->ip.v4.src_ip);
1584 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1585 				   input->ip.v4.src_port);
1586 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1587 				   input->ip.v4.dst_ip);
1588 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1589 				   input->ip.v4.dst_port);
1590 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1591 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1592 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1593 		break;
1594 	case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1595 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1596 				   input->ip.v4.src_ip);
1597 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1598 				   input->ip.v4.dst_ip);
1599 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1600 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1601 		ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1602 				  input->ip.v4.proto);
1603 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1604 		break;
1605 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
1606 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_UDP:
1607 		ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1608 		ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac);
1609 		ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1610 				   input->ip_outer.v4.dst_ip);
1611 		ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1612 				   input->ip_outer.v4.src_ip);
1613 		ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1614 		ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1615 				   input->vxlan_data.vni);
1616 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1617 				   input->ip.v4.src_ip);
1618 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1619 				   input->ip.v4.src_port);
1620 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1621 				   input->ip.v4.dst_ip);
1622 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1623 				   input->ip.v4.dst_port);
1624 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1625 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1626 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1627 		ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1628 		break;
1629 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_TCP:
1630 		ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1631 		ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1632 					input->ext_data_outer.src_mac);
1633 		ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1634 				   input->ip_outer.v4.dst_ip);
1635 		ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1636 				   input->ip_outer.v4.src_ip);
1637 		ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET,
1638 				  input->ip_outer.v4.tos);
1639 		ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1640 				   input->vxlan_data.vni);
1641 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1642 				   input->ip.v4.src_ip);
1643 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1644 				   input->ip.v4.src_port);
1645 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1646 				   input->ip.v4.dst_ip);
1647 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1648 				   input->ip.v4.dst_port);
1649 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1650 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1651 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1652 		ice_pkt_insert_mac_addr(loc + ETH_ALEN,
1653 					input->ext_data.src_mac);
1654 		if (frag)
1655 			loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
1656 		break;
1657 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_SCTP:
1658 		ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1659 		ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1660 					input->ext_data_outer.src_mac);
1661 		ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1662 				   input->ip_outer.v4.dst_ip);
1663 		ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1664 				   input->ip_outer.v4.src_ip);
1665 		ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET,
1666 				  input->ip_outer.v4.tos);
1667 		ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1668 				   input->vxlan_data.vni);
1669 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1670 				   input->ip.v4.src_ip);
1671 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1672 				   input->ip.v4.src_port);
1673 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1674 				   input->ip.v4.dst_ip);
1675 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1676 				   input->ip.v4.dst_port);
1677 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1678 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1679 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1680 		ice_pkt_insert_mac_addr(loc + ETH_ALEN,
1681 					input->ext_data.src_mac);
1682 		break;
1683 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_OTHER:
1684 		ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1685 		ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1686 					input->ext_data_outer.src_mac);
1687 		ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1688 				   input->ip_outer.v4.dst_ip);
1689 		ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1690 				   input->ip_outer.v4.src_ip);
1691 		ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET,
1692 				  input->ip_outer.v4.tos);
1693 		ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1694 				   input->vxlan_data.vni);
1695 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1696 				   input->ip.v4.src_ip);
1697 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1698 				   input->ip.v4.dst_ip);
1699 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1700 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1701 		ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1702 				  input->ip.v4.proto);
1703 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1704 		ice_pkt_insert_mac_addr(loc + ETH_ALEN,
1705 					input->ext_data.src_mac);
1706 		break;
1707 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU:
1708 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1709 				   input->ip.v4.src_ip);
1710 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1711 				   input->ip.v4.dst_ip);
1712 		ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1713 				   input->gtpu_data.teid);
1714 		break;
1715 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4:
1716 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4:
1717 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4:
1718 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4:
1719 		ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
1720 				   input->ip.v4.src_ip);
1721 		ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
1722 				   input->ip.v4.dst_ip);
1723 		ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
1724 		ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
1725 		ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_PROTO_OFFSET,
1726 				  input->ip.v4.proto);
1727 		break;
1728 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH:
1729 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW:
1730 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP:
1731 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1732 				   input->ip.v4.src_ip);
1733 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1734 				   input->ip.v4.dst_ip);
1735 		ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1736 				   input->gtpu_data.teid);
1737 		ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1738 				      input->gtpu_data.qfi);
1739 		break;
1740 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1741 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP:
1742 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP:
1743 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP:
1744 		ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
1745 				   input->ip.v4.src_ip);
1746 		ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_DST_PORT_OFFSET,
1747 				   input->ip.v4.src_port);
1748 		ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
1749 				   input->ip.v4.dst_ip);
1750 		ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_SRC_PORT_OFFSET,
1751 				   input->ip.v4.dst_port);
1752 		ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
1753 		ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
1754 		break;
1755 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1756 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP:
1757 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP:
1758 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP:
1759 		ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
1760 				   input->ip.v4.src_ip);
1761 		ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_DST_PORT_OFFSET,
1762 				   input->ip.v4.src_port);
1763 		ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
1764 				   input->ip.v4.dst_ip);
1765 		ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_SRC_PORT_OFFSET,
1766 				   input->ip.v4.dst_port);
1767 		ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
1768 		ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
1769 		break;
1770 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6:
1771 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
1772 					 input->ip.v6.src_ip);
1773 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
1774 					 input->ip.v6.dst_ip);
1775 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
1776 		ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
1777 		ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_PROTO_OFFSET,
1778 				  input->ip.v6.proto);
1779 		break;
1780 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP:
1781 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
1782 					 input->ip.v6.src_ip);
1783 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
1784 					 input->ip.v6.dst_ip);
1785 		ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_DST_PORT_OFFSET,
1786 				   input->ip.v6.src_port);
1787 		ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_SRC_PORT_OFFSET,
1788 				   input->ip.v6.dst_port);
1789 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
1790 		ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
1791 		break;
1792 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP:
1793 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
1794 					 input->ip.v6.src_ip);
1795 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
1796 					 input->ip.v6.dst_ip);
1797 		ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_DST_PORT_OFFSET,
1798 				   input->ip.v6.src_port);
1799 		ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_SRC_PORT_OFFSET,
1800 				   input->ip.v6.dst_port);
1801 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
1802 		ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
1803 		break;
1804 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU:
1805 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER:
1806 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1807 					 input->ip.v6.src_ip);
1808 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1809 					 input->ip.v6.dst_ip);
1810 		ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1811 				   input->gtpu_data.teid);
1812 		break;
1813 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH:
1814 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW:
1815 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP:
1816 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
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_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1822 				   input->gtpu_data.teid);
1823 		ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
1824 				      input->gtpu_data.qfi);
1825 		break;
1826 	case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1827 		ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1828 				   input->l2tpv3_data.session_id);
1829 		break;
1830 	case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1831 		ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1832 				   input->l2tpv3_data.session_id);
1833 		break;
1834 	case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1835 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1836 				   input->ip.v4.src_ip);
1837 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1838 				   input->ip.v4.dst_ip);
1839 		ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1840 				   input->ip.v4.sec_parm_idx);
1841 		break;
1842 	case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1843 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1844 					 input->ip.v6.src_ip);
1845 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1846 					 input->ip.v6.dst_ip);
1847 		ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1848 				   input->ip.v6.sec_parm_idx);
1849 		break;
1850 	case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1851 		ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1852 				   input->ip.v4.sec_parm_idx);
1853 		break;
1854 	case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1855 		ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1856 				   input->ip.v6.sec_parm_idx);
1857 		break;
1858 	case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1859 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1860 				   input->ip.v4.src_ip);
1861 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1862 				   input->ip.v4.dst_ip);
1863 		ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1864 				   input->ip.v4.sec_parm_idx);
1865 		break;
1866 	case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1867 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1868 					 input->ip.v6.src_ip);
1869 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1870 					 input->ip.v6.dst_ip);
1871 		ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1872 				   input->ip.v6.sec_parm_idx);
1873 		break;
1874 	case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1875 	case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1876 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1877 				   input->ip.v4.dst_port);
1878 		break;
1879 	case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1880 	case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1881 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1882 				   input->ip.v6.dst_port);
1883 		break;
1884 	case ICE_FLTR_PTYPE_NON_IP_L2:
1885 		ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1886 				   input->ext_data.ether_type);
1887 		break;
1888 	case ICE_FLTR_PTYPE_NONF_ECPRI_TP0:
1889 		ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET,
1890 				   input->ecpri_data.pc_id);
1891 		break;
1892 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1893 		/* Use pkt instead of loc, since PC_ID is in outer part */
1894 		ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET,
1895 				   input->ecpri_data.pc_id);
1896 		break;
1897 	case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1898 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1899 					 input->ip.v6.src_ip);
1900 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1901 					 input->ip.v6.dst_ip);
1902 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1903 				   input->ip.v6.src_port);
1904 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1905 				   input->ip.v6.dst_port);
1906 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1907 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1908 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1909 		break;
1910 	case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1911 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1912 					 input->ip.v6.src_ip);
1913 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1914 					 input->ip.v6.dst_ip);
1915 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1916 				   input->ip.v6.src_port);
1917 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1918 				   input->ip.v6.dst_port);
1919 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1920 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1921 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1922 		break;
1923 	case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1924 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1925 					 input->ip.v6.src_ip);
1926 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1927 					 input->ip.v6.dst_ip);
1928 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1929 				   input->ip.v6.src_port);
1930 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1931 				   input->ip.v6.dst_port);
1932 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1933 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1934 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1935 		break;
1936 	case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1937 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1938 					 input->ip.v6.src_ip);
1939 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1940 					 input->ip.v6.dst_ip);
1941 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1942 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1943 		ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1944 				  input->ip.v6.proto);
1945 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1946 		break;
1947 	case ICE_FLTR_PTYPE_FRAG_IPV4:
1948 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1949 				   input->ip.v4.src_ip);
1950 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1951 				   input->ip.v4.dst_ip);
1952 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1953 		ice_pkt_insert_u16(loc, ICE_IPV4_ID_OFFSET,
1954 				   input->ip.v4.packet_id);
1955 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1956 		ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1957 				  input->ip.v4.proto);
1958 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1959 		break;
1960 	case ICE_FLTR_PTYPE_FRAG_IPV6:
1961 		ice_pkt_insert_u32(loc, ICE_IPV6_ID_OFFSET,
1962 				   input->ip.v6.packet_id);
1963 		break;
1964 	default:
1965 		return ICE_ERR_PARAM;
1966 	}
1967 
1968 	if (input->flex_fltr)
1969 		ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1970 
1971 	return ICE_SUCCESS;
1972 }
1973 
1974 /**
1975  * ice_fdir_get_prgm_pkt - generate a training packet
1976  * @input: flow director filter data structure
1977  * @pkt: pointer to return filter packet
1978  * @frag: generate a fragment packet
1979  */
1980 enum ice_status
1981 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1982 {
1983 	return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1984 }
1985 
1986 /**
1987  * ice_fdir_has_frag - does flow type have 2 ptypes
1988  * @flow: flow ptype
1989  *
1990  * returns true is there is a fragment packet for this ptype
1991  */
1992 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1993 {
1994 	if (flow == ICE_FLTR_PTYPE_FRAG_IPV4 ||
1995 	    flow == ICE_FLTR_PTYPE_FRAG_IPV6)
1996 		return true;
1997 	else
1998 		return false;
1999 }
2000 
2001 /**
2002  * ice_fdir_find_fltr_by_idx - find filter with idx
2003  * @hw: pointer to hardware structure
2004  * @fltr_idx: index to find.
2005  *
2006  * Returns pointer to filter if found or null
2007  */
2008 struct ice_fdir_fltr *
2009 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
2010 {
2011 	struct ice_fdir_fltr *rule;
2012 
2013 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
2014 			    fltr_node) {
2015 		/* rule ID found in the list */
2016 		if (fltr_idx == rule->fltr_id)
2017 			return rule;
2018 		if (fltr_idx < rule->fltr_id)
2019 			break;
2020 	}
2021 	return NULL;
2022 }
2023 
2024 /**
2025  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
2026  * @hw: hardware structure
2027  * @fltr: filter node to add to structure
2028  */
2029 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
2030 {
2031 	struct ice_fdir_fltr *rule, *parent = NULL;
2032 
2033 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
2034 			    fltr_node) {
2035 		/* rule ID found or pass its spot in the list */
2036 		if (rule->fltr_id >= fltr->fltr_id)
2037 			break;
2038 		parent = rule;
2039 	}
2040 
2041 	if (parent)
2042 		LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
2043 	else
2044 		LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
2045 }
2046 
2047 /**
2048  * ice_fdir_update_cntrs - increment / decrement filter counter
2049  * @hw: pointer to hardware structure
2050  * @flow: filter flow type
2051  * @acl_fltr: true indicates an ACL filter
2052  * @add: true implies filters added
2053  */
2054 void
2055 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
2056 		      bool acl_fltr, bool add)
2057 {
2058 	int incr;
2059 
2060 	incr = add ? 1 : -1;
2061 	hw->fdir_active_fltr += incr;
2062 	if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
2063 		ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
2064 	} else {
2065 		if (acl_fltr)
2066 			hw->acl_fltr_cnt[flow] += incr;
2067 		else
2068 			hw->fdir_fltr_cnt[flow] += incr;
2069 	}
2070 }
2071 
2072 /**
2073  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
2074  * @a: IP v6 address
2075  * @b: IP v6 address
2076  *
2077  * Returns 0 on equal, returns non-0 if different
2078  */
2079 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
2080 {
2081 	return memcmp(a, b, 4 * sizeof(__be32));
2082 }
2083 
2084 /**
2085  * ice_fdir_comp_rules - compare 2 filters
2086  * @a: a Flow Director filter data structure
2087  * @b: a Flow Director filter data structure
2088  * @v6: bool true if v6 filter
2089  *
2090  * Returns true if the filters match
2091  */
2092 static bool
2093 ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
2094 {
2095 	enum ice_fltr_ptype flow_type = a->flow_type;
2096 
2097 	/* The calling function already checks that the two filters have the
2098 	 * same flow_type.
2099 	 */
2100 	if (!v6) {
2101 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
2102 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
2103 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
2104 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
2105 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
2106 			    a->ip.v4.dst_port == b->ip.v4.dst_port &&
2107 			    a->ip.v4.src_port == b->ip.v4.src_port)
2108 				return true;
2109 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
2110 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
2111 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
2112 			    a->ip.v4.l4_header == b->ip.v4.l4_header &&
2113 			    a->ip.v4.proto == b->ip.v4.proto &&
2114 			    a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
2115 			    a->ip.v4.tos == b->ip.v4.tos)
2116 				return true;
2117 		}
2118 	} else {
2119 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
2120 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
2121 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
2122 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
2123 			    a->ip.v6.src_port == b->ip.v6.src_port &&
2124 			    !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
2125 					       b->ip.v6.dst_ip) &&
2126 			    !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
2127 					       b->ip.v6.src_ip))
2128 				return true;
2129 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
2130 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
2131 			    a->ip.v6.src_port == b->ip.v6.src_port)
2132 				return true;
2133 		}
2134 	}
2135 
2136 	return false;
2137 }
2138 
2139 /**
2140  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
2141  * @hw: hardware data structure
2142  * @input: Flow Director filter data structure
2143  *
2144  * Returns true if the filter is found in the list
2145  */
2146 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
2147 {
2148 	struct ice_fdir_fltr *rule;
2149 	bool ret = false;
2150 
2151 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
2152 			    fltr_node) {
2153 		enum ice_fltr_ptype flow_type;
2154 
2155 		if (rule->flow_type != input->flow_type)
2156 			continue;
2157 
2158 		flow_type = input->flow_type;
2159 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
2160 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
2161 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
2162 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
2163 			ret = ice_fdir_comp_rules(rule, input, false);
2164 		else
2165 			ret = ice_fdir_comp_rules(rule, input, true);
2166 		if (ret) {
2167 			if (rule->fltr_id == input->fltr_id &&
2168 			    rule->q_index != input->q_index)
2169 				ret = false;
2170 			else
2171 				break;
2172 		}
2173 	}
2174 
2175 	return ret;
2176 }
2177 
2178 /**
2179  * ice_clear_pf_fd_table - admin command to clear FD table for PF
2180  * @hw: hardware data structure
2181  *
2182  * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
2183  */
2184 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
2185 {
2186 	struct ice_aqc_clear_fd_table *cmd;
2187 	struct ice_aq_desc desc;
2188 
2189 	cmd = &desc.params.clear_fd_table;
2190 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
2191 	cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
2192 	/* vsi_index must be 0 to clear FD table for a PF */
2193 	cmd->vsi_index = CPU_TO_LE16(0);
2194 
2195 	return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
2196 }
2197