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