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