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