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