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