net/ice/base: support RSS for GRE tunnel
[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 /* IPV4 GRE INNER IPV4 */
541 static const u8 ice_fdir_ipv4_gre4_pkt[] = {
542         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
543         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
544         0x00, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x40, 0x2f,
545         0x7c, 0x9e, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
546         0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
547         0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00,
548         0x7c, 0xe5, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
549         0x00, 0x01, 0x00, 0x00,
550 };
551
552 static const u8 ice_fdir_udp4_gre4_pkt[] = {
553         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
554         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
555         0x00, 0x36, 0x00, 0x01, 0x00, 0x00, 0x40, 0x2f,
556         0x7c, 0x96, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
557         0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
558         0x00, 0x1e, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
559         0x7c, 0xcc, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
560         0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
561         0x01, 0xd8, 0x00, 0x00,
562 };
563
564 static const u8 ice_fdir_tcp4_gre4_pkt[] = {
565         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
566         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
567         0x00, 0x42, 0x00, 0x01, 0x00, 0x00, 0x40, 0x2f,
568         0x7c, 0x8a, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
569         0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
570         0x00, 0x2a, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
571         0x7c, 0xcb, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
572         0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
573         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
574         0x20, 0x00, 0x91, 0xde, 0x00, 0x00, 0x00, 0x00,
575 };
576
577 /* IPV4 GRE INNER IPV6 */
578 static const u8 ice_fdir_ipv6_gre4_pkt[] = {
579         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
581         0x00, 0x42, 0x00, 0x01, 0x00, 0x00, 0x40, 0x2f,
582         0x7c, 0x8a, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
583         0x00, 0x01, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
584         0x00, 0x00, 0x00, 0x02, 0x3b, 0x40, 0x00, 0x00,
585         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
586         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
587         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
588         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
589 };
590
591 static const u8 ice_fdir_udp6_gre4_pkt[] = {
592         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
593         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
594         0x00, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x40, 0x2f,
595         0x7c, 0x82, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
596         0x00, 0x01, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
597         0x00, 0x00, 0x00, 0x0a, 0x11, 0x40, 0x00, 0x00,
598         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
599         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
600         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
601         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
602         0x00, 0x00, 0x00, 0x0a, 0xff, 0xd8, 0x00, 0x00,
603 };
604
605 static const u8 ice_fdir_tcp6_gre4_pkt[] = {
606         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
607         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
608         0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x2f,
609         0x7c, 0x76, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
610         0x00, 0x01, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
611         0x00, 0x00, 0x00, 0x16, 0x06, 0x40, 0x00, 0x00,
612         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
613         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
614         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
615         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
616         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
617         0x00, 0x00, 0x50, 0x02, 0x20, 0x00, 0x8f, 0xdf,
618         0x00, 0x00, 0x00, 0x00,
619 };
620
621 /* IPV6 GRE INNER IPV4 */
622 static const u8 ice_fdir_ipv4_gre6_pkt[] = {
623         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
624         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
625         0x00, 0x00, 0x00, 0x18, 0x2F, 0x40, 0x00, 0x00,
626         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
627         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
628         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
629         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
630         0x08, 0x00, 0x45, 0x00, 0x00, 0x14, 0x00, 0x01,
631         0x00, 0x00, 0x40, 0x00, 0x7A, 0xEA, 0x00, 0x00,
632         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
633 };
634
635 static const u8 ice_fdir_udp4_gre6_pkt[] = {
636         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
637         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
638         0x00, 0x00, 0x00, 0x20, 0x2F, 0x40, 0x00, 0x00,
639         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
640         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
641         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
642         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
643         0x08, 0x00, 0x45, 0x00, 0x00, 0x1C, 0x00, 0x01,
644         0x00, 0x00, 0x40, 0x11, 0x7A, 0xD1, 0x00, 0x00,
645         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
646         0x00, 0x00, 0x00, 0x08, 0xFF, 0xDE, 0x00, 0x00,
647 };
648
649 static const u8 ice_fdir_tcp4_gre6_pkt[] = {
650         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
651         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
652         0x00, 0x00, 0x00, 0x2C, 0x2F, 0x40, 0x00, 0x00,
653         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
654         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
655         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
657         0x08, 0x00, 0x45, 0x00, 0x00, 0x28, 0x00, 0x01,
658         0x00, 0x00, 0x40, 0x06, 0x7A, 0xD0, 0x00, 0x00,
659         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
660         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
661         0x00, 0x00, 0x50, 0x02, 0x20, 0x00, 0x8F, 0xE3,
662         0x00, 0x00, 0x00, 0x00,
663 };
664
665 /* IPV6 GRE INNER IPV6 */
666 static const u8 ice_fdir_ipv6_gre6_pkt[] = {
667         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
668         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
669         0x00, 0x00, 0x00, 0x2C, 0x2F, 0x40, 0x00, 0x00,
670         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
671         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
672         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
673         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
674         0x86, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
675         0x3B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
676         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
677         0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
678         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
679         0x00, 0x01, 0x00, 0x00,
680 };
681
682 static const u8 ice_fdir_udp6_gre6_pkt[] = {
683         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
684         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
685         0x00, 0x00, 0x00, 0x34, 0x2F, 0x40, 0x00, 0x00,
686         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
687         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
688         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
689         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
690         0x86, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08,
691         0x11, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
692         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
693         0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
694         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
695         0x00, 0x01, 0x00, 0x35, 0x00, 0x35, 0x00, 0x08,
696         0xFF, 0x72, 0x00, 0x00,
697 };
698
699 static const u8 ice_fdir_tcp6_gre6_pkt[] = {
700         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
701         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
702         0x00, 0x00, 0x00, 0x40, 0x2F, 0x40, 0x00, 0x00,
703         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
704         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
705         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
706         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
707         0x86, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x14,
708         0x06, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
709         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
710         0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
711         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
712         0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
713         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
714         0x20, 0x00, 0x8F, 0xE1, 0x00, 0x00, 0x00, 0x00,
715 };
716
717 static const u8 ice_fdir_tcpv6_pkt[] = {
718         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
719         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
720         0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
721         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
722         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
723         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
724         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
725         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
726         0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
727         0x00, 0x00,
728 };
729
730 static const u8 ice_fdir_udpv6_pkt[] = {
731         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
732         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
733         0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
734         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
735         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
736         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
737         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
738         0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
739 };
740
741 static const u8 ice_fdir_sctpv6_pkt[] = {
742         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
743         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
744         0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
745         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
746         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
747         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
748         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
749         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
750         0x00, 0x00,
751 };
752
753 static const u8 ice_fdir_ipv6_pkt[] = {
754         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
755         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
756         0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
757         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
758         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
759         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
760         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
761 };
762
763 static const u8 ice_fdir_tcp4_tun_pkt[] = {
764         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
765         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
766         0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
767         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
768         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
769         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
770         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
771         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
772         0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
773         0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
774         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
775         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
776         0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
777 };
778
779 static const u8 ice_fdir_udp4_tun_pkt[] = {
780         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
781         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
782         0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
783         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
784         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
785         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
786         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
787         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
788         0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
789         0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
790         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
791         0x00, 0x00, 0x00, 0x00,
792 };
793
794 static const u8 ice_fdir_sctp4_tun_pkt[] = {
795         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
797         0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
798         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
799         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
800         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
801         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
802         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
803         0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
804         0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
805         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
806         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
807 };
808
809 static const u8 ice_fdir_ip4_tun_pkt[] = {
810         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
811         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
812         0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
813         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
814         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
815         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
816         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
817         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
818         0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
819         0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
820         0x00, 0x00, 0x00, 0x00,
821 };
822
823 static const u8 ice_fdir_tcp6_tun_pkt[] = {
824         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
825         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
826         0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
827         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
828         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
829         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
830         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
831         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
832         0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
833         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
834         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
835         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
836         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
837         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
838         0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
839         0x00, 0x00, 0x00, 0x00,
840 };
841
842 static const u8 ice_fdir_udp6_tun_pkt[] = {
843         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
844         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
845         0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
846         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
847         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
848         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
849         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
850         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
851         0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
852         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
853         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
854         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
855         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
856         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
857 };
858
859 static const u8 ice_fdir_sctp6_tun_pkt[] = {
860         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
861         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
862         0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
863         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
864         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
865         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
866         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
867         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
868         0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
869         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
870         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
871         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
872         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
873         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
874         0x00, 0x00, 0x00, 0x00,
875 };
876
877 static const u8 ice_fdir_ip6_tun_pkt[] = {
878         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
879         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
880         0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
881         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
882         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
883         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
884         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
885         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
886         0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
887         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
888         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
889         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
890         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
891 };
892
893 /* Flow Director no-op training packet table */
894 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
895         {
896                 ICE_FLTR_PTYPE_NONF_IPV4_TCP,
897                 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
898                 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
899         },
900         {
901                 ICE_FLTR_PTYPE_NONF_IPV4_UDP,
902                 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
903                 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
904         },
905         {
906                 ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
907                 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
908                 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
909         },
910         {
911                 ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
912                 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
913                 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
914         },
915         {
916                 ICE_FLTR_PTYPE_FRAG_IPV4,
917                 sizeof(ice_fdir_ipv4_frag_pkt), ice_fdir_ipv4_frag_pkt,
918                 sizeof(ice_fdir_ipv4_frag_pkt), ice_fdir_ipv4_frag_pkt,
919         },
920         {
921                 ICE_FLTR_PTYPE_FRAG_IPV6,
922                 sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
923                 sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
924         },
925         {
926                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
927                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
928                 ice_fdir_ipv4_gtpu4_pkt,
929                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
930                 ice_fdir_ipv4_gtpu4_pkt,
931         },
932         {
933                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH,
934                 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
935                 ice_fdir_ipv4_gtpu4_eh_pkt,
936                 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
937                 ice_fdir_ipv4_gtpu4_eh_pkt,
938         },
939         {
940                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW,
941                 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
942                 ice_fdir_ipv4_gtpu4_eh_dw_pkt,
943                 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
944                 ice_fdir_ipv4_gtpu4_eh_dw_pkt,
945         },
946         {
947                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP,
948                 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
949                 ice_fdir_ipv4_gtpu4_eh_up_pkt,
950                 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
951                 ice_fdir_ipv4_gtpu4_eh_up_pkt,
952         },
953         {
954                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4,
955                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
956                 ice_fdir_ipv4_gtpu4_pkt,
957                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
958                 ice_fdir_ipv4_gtpu4_pkt,
959         },
960         {
961                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
962                 sizeof(ice_fdir_udp4_gtpu4_pkt),
963                 ice_fdir_udp4_gtpu4_pkt,
964                 sizeof(ice_fdir_udp4_gtpu4_pkt),
965                 ice_fdir_udp4_gtpu4_pkt,
966         },
967         {
968                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
969                 sizeof(ice_fdir_tcp4_gtpu4_pkt),
970                 ice_fdir_tcp4_gtpu4_pkt,
971                 sizeof(ice_fdir_tcp4_gtpu4_pkt),
972                 ice_fdir_tcp4_gtpu4_pkt,
973         },
974         {
975                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4,
976                 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
977                 ice_fdir_ipv4_gtpu4_eh_pkt,
978                 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
979                 ice_fdir_ipv4_gtpu4_eh_pkt,
980         },
981         {
982                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP,
983                 sizeof(ice_fdir_udp4_gtpu4_eh_pkt),
984                 ice_fdir_udp4_gtpu4_eh_pkt,
985                 sizeof(ice_fdir_udp4_gtpu4_eh_pkt),
986                 ice_fdir_udp4_gtpu4_eh_pkt,
987         },
988         {
989                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP,
990                 sizeof(ice_fdir_tcp4_gtpu4_eh_pkt),
991                 ice_fdir_tcp4_gtpu4_eh_pkt,
992                 sizeof(ice_fdir_tcp4_gtpu4_eh_pkt),
993                 ice_fdir_tcp4_gtpu4_eh_pkt,
994         },
995         {
996                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4,
997                 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
998                 ice_fdir_ipv4_gtpu4_eh_dw_pkt,
999                 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
1000                 ice_fdir_ipv4_gtpu4_eh_dw_pkt,
1001         },
1002         {
1003                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP,
1004                 sizeof(ice_fdir_udp4_gtpu4_eh_dw_pkt),
1005                 ice_fdir_udp4_gtpu4_eh_dw_pkt,
1006                 sizeof(ice_fdir_udp4_gtpu4_eh_dw_pkt),
1007                 ice_fdir_udp4_gtpu4_eh_dw_pkt,
1008         },
1009         {
1010                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP,
1011                 sizeof(ice_fdir_tcp4_gtpu4_eh_dw_pkt),
1012                 ice_fdir_tcp4_gtpu4_eh_dw_pkt,
1013                 sizeof(ice_fdir_tcp4_gtpu4_eh_dw_pkt),
1014                 ice_fdir_tcp4_gtpu4_eh_dw_pkt,
1015         },
1016         {
1017                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4,
1018                 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
1019                 ice_fdir_ipv4_gtpu4_eh_up_pkt,
1020                 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
1021                 ice_fdir_ipv4_gtpu4_eh_up_pkt,
1022         },
1023         {
1024                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP,
1025                 sizeof(ice_fdir_udp4_gtpu4_eh_up_pkt),
1026                 ice_fdir_udp4_gtpu4_eh_up_pkt,
1027                 sizeof(ice_fdir_udp4_gtpu4_eh_up_pkt),
1028                 ice_fdir_udp4_gtpu4_eh_up_pkt,
1029         },
1030         {
1031                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP,
1032                 sizeof(ice_fdir_tcp4_gtpu4_eh_up_pkt),
1033                 ice_fdir_tcp4_gtpu4_eh_up_pkt,
1034                 sizeof(ice_fdir_tcp4_gtpu4_eh_up_pkt),
1035                 ice_fdir_tcp4_gtpu4_eh_up_pkt,
1036         },
1037         {
1038                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
1039                 sizeof(ice_fdir_icmp4_gtpu4_pkt),
1040                 ice_fdir_icmp4_gtpu4_pkt,
1041                 sizeof(ice_fdir_icmp4_gtpu4_pkt),
1042                 ice_fdir_icmp4_gtpu4_pkt,
1043         },
1044         {
1045                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
1046                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
1047                 ice_fdir_ipv4_gtpu4_pkt,
1048                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
1049                 ice_fdir_ipv4_gtpu4_pkt,
1050         },
1051         {
1052                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6,
1053                 sizeof(ice_fdir_ipv6_gtpu4_pkt),
1054                 ice_fdir_ipv6_gtpu4_pkt,
1055                 sizeof(ice_fdir_ipv6_gtpu4_pkt),
1056                 ice_fdir_ipv6_gtpu4_pkt,
1057         },
1058         {
1059                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP,
1060                 sizeof(ice_fdir_udp6_gtpu4_pkt),
1061                 ice_fdir_udp6_gtpu4_pkt,
1062                 sizeof(ice_fdir_udp6_gtpu4_pkt),
1063                 ice_fdir_udp6_gtpu4_pkt,
1064         },
1065         {
1066                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP,
1067                 sizeof(ice_fdir_tcp6_gtpu4_pkt),
1068                 ice_fdir_tcp6_gtpu4_pkt,
1069                 sizeof(ice_fdir_tcp6_gtpu4_pkt),
1070                 ice_fdir_tcp6_gtpu4_pkt,
1071         },
1072         {
1073                 ICE_FLTR_PTYPE_NONF_IPV6_GTPU,
1074                 sizeof(ice_fdir_ipv6_gtpu6_pkt),
1075                 ice_fdir_ipv6_gtpu6_pkt,
1076                 sizeof(ice_fdir_ipv6_gtpu6_pkt),
1077                 ice_fdir_ipv6_gtpu6_pkt,
1078         },
1079         {
1080                 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH,
1081                 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
1082                 ice_fdir_ipv6_gtpu6_eh_pkt,
1083                 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
1084                 ice_fdir_ipv6_gtpu6_eh_pkt,
1085         },
1086         {
1087                 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW,
1088                 sizeof(ice_fdir_ipv6_gtpu6_eh_dw_pkt),
1089                 ice_fdir_ipv6_gtpu6_eh_dw_pkt,
1090                 sizeof(ice_fdir_ipv6_gtpu6_eh_dw_pkt),
1091                 ice_fdir_ipv6_gtpu6_eh_dw_pkt,
1092         },
1093         {
1094                 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP,
1095                 sizeof(ice_fdir_ipv6_gtpu6_eh_up_pkt),
1096                 ice_fdir_ipv6_gtpu6_eh_up_pkt,
1097                 sizeof(ice_fdir_ipv6_gtpu6_eh_up_pkt),
1098                 ice_fdir_ipv6_gtpu6_eh_up_pkt,
1099         },
1100         {
1101                 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER,
1102                 sizeof(ice_fdir_ipv6_gtpu6_pkt),
1103                 ice_fdir_ipv6_gtpu6_pkt,
1104                 sizeof(ice_fdir_ipv6_gtpu6_pkt),
1105                 ice_fdir_ipv6_gtpu6_pkt,
1106         },
1107         {
1108                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER,
1109                 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
1110                 ice_fdir_ipv4_gtpu4_eh_pkt,
1111                 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
1112                 ice_fdir_ipv4_gtpu4_eh_pkt,
1113         },
1114         {
1115                 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER,
1116                 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
1117                 ice_fdir_ipv6_gtpu6_eh_pkt,
1118                 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
1119                 ice_fdir_ipv6_gtpu6_eh_pkt,
1120         },
1121         {
1122                 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
1123                 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
1124                 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
1125         },
1126         {
1127                 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
1128                 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
1129                 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
1130         },
1131         {
1132                 ICE_FLTR_PTYPE_NONF_IPV4_ESP,
1133                 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
1134                 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
1135         },
1136         {
1137                 ICE_FLTR_PTYPE_NONF_IPV6_ESP,
1138                 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
1139                 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
1140         },
1141         {
1142                 ICE_FLTR_PTYPE_NONF_IPV4_AH,
1143                 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
1144                 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
1145         },
1146         {
1147                 ICE_FLTR_PTYPE_NONF_IPV6_AH,
1148                 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
1149                 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
1150         },
1151         {
1152                 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
1153                 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
1154                 ice_fdir_ipv4_nat_t_esp_pkt,
1155                 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
1156                 ice_fdir_ipv4_nat_t_esp_pkt,
1157         },
1158         {
1159                 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
1160                 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
1161                 ice_fdir_ipv6_nat_t_esp_pkt,
1162                 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
1163                 ice_fdir_ipv6_nat_t_esp_pkt,
1164         },
1165         {
1166                 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
1167                 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
1168                 ice_fdir_ipv4_pfcp_node_pkt,
1169                 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
1170                 ice_fdir_ipv4_pfcp_node_pkt,
1171         },
1172         {
1173                 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
1174                 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
1175                 ice_fdir_ipv4_pfcp_session_pkt,
1176                 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
1177                 ice_fdir_ipv4_pfcp_session_pkt,
1178         },
1179         {
1180                 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
1181                 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
1182                 ice_fdir_ipv6_pfcp_node_pkt,
1183                 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
1184                 ice_fdir_ipv6_pfcp_node_pkt,
1185         },
1186         {
1187                 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
1188                 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
1189                 ice_fdir_ipv6_pfcp_session_pkt,
1190                 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
1191                 ice_fdir_ipv6_pfcp_session_pkt,
1192         },
1193         {
1194                 ICE_FLTR_PTYPE_NON_IP_L2,
1195                 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
1196                 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
1197         },
1198         {
1199                 ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN,
1200                 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
1201                 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
1202         },
1203         {
1204                 ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_UDP,
1205                 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
1206                 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
1207         },
1208         {
1209                 ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_TCP,
1210                 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
1211                 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
1212         },
1213         {
1214                 ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_SCTP,
1215                 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
1216                 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
1217         },
1218         {
1219                 ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_OTHER,
1220                 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
1221                 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
1222         },
1223         {
1224                 ICE_FLTR_PTYPE_NONF_ECPRI_TP0,
1225                 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
1226                 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
1227         },
1228         {
1229                 ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0,
1230                 sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
1231                 ice_fdir_ipv4_udp_ecpri_tp0_pkt,
1232                 sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
1233                 ice_fdir_ipv4_udp_ecpri_tp0_pkt,
1234         },
1235         /* IPV4 GRE INNER IPV4 */
1236         {
1237                 ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV4,
1238                 sizeof(ice_fdir_ipv4_gre4_pkt),
1239                 ice_fdir_ipv4_gre4_pkt,
1240                 sizeof(ice_fdir_ipv4_gre4_pkt),
1241                 ice_fdir_ipv4_gre4_pkt,
1242         },
1243         {
1244                 ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV4_UDP,
1245                 sizeof(ice_fdir_udp4_gre4_pkt),
1246                 ice_fdir_udp4_gre4_pkt,
1247                 sizeof(ice_fdir_udp4_gre4_pkt),
1248                 ice_fdir_udp4_gre4_pkt,
1249         },
1250         {
1251                 ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV4_TCP,
1252                 sizeof(ice_fdir_tcp4_gre4_pkt),
1253                 ice_fdir_tcp4_gre4_pkt,
1254                 sizeof(ice_fdir_tcp4_gre4_pkt),
1255                 ice_fdir_tcp4_gre4_pkt,
1256         },
1257         /* IPV4 GRE INNER IPV6 */
1258         {
1259                 ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV6,
1260                 sizeof(ice_fdir_ipv6_gre4_pkt),
1261                 ice_fdir_ipv6_gre4_pkt,
1262                 sizeof(ice_fdir_ipv6_gre4_pkt),
1263                 ice_fdir_ipv6_gre4_pkt,
1264         },
1265         {
1266                 ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV6_UDP,
1267                 sizeof(ice_fdir_udp6_gre4_pkt),
1268                 ice_fdir_udp6_gre4_pkt,
1269                 sizeof(ice_fdir_udp6_gre4_pkt),
1270                 ice_fdir_udp6_gre4_pkt,
1271         },
1272         {
1273                 ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV6_TCP,
1274                 sizeof(ice_fdir_tcp6_gre4_pkt),
1275                 ice_fdir_tcp6_gre4_pkt,
1276                 sizeof(ice_fdir_tcp6_gre4_pkt),
1277                 ice_fdir_tcp6_gre4_pkt,
1278         },
1279         /* IPV6 GRE INNER IPV4 */
1280         {
1281                 ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV4,
1282                 sizeof(ice_fdir_ipv4_gre6_pkt),
1283                 ice_fdir_ipv4_gre6_pkt,
1284                 sizeof(ice_fdir_ipv4_gre6_pkt),
1285                 ice_fdir_ipv4_gre6_pkt,
1286         },
1287         {
1288                 ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV4_UDP,
1289                 sizeof(ice_fdir_udp4_gre6_pkt),
1290                 ice_fdir_udp4_gre6_pkt,
1291                 sizeof(ice_fdir_udp4_gre6_pkt),
1292                 ice_fdir_udp4_gre6_pkt,
1293         },
1294         {
1295                 ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV4_TCP,
1296                 sizeof(ice_fdir_tcp4_gre6_pkt),
1297                 ice_fdir_tcp4_gre6_pkt,
1298                 sizeof(ice_fdir_tcp4_gre6_pkt),
1299                 ice_fdir_tcp4_gre6_pkt,
1300         },
1301         /* IPV4 GRE INNER IPV6 */
1302         {
1303                 ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV6,
1304                 sizeof(ice_fdir_ipv6_gre6_pkt),
1305                 ice_fdir_ipv6_gre6_pkt,
1306                 sizeof(ice_fdir_ipv6_gre6_pkt),
1307                 ice_fdir_ipv6_gre6_pkt,
1308         },
1309         {
1310                 ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV6_UDP,
1311                 sizeof(ice_fdir_udp6_gre6_pkt),
1312                 ice_fdir_udp6_gre6_pkt,
1313                 sizeof(ice_fdir_udp6_gre6_pkt),
1314                 ice_fdir_udp6_gre6_pkt,
1315         },
1316         {
1317                 ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV6_TCP,
1318                 sizeof(ice_fdir_tcp6_gre6_pkt),
1319                 ice_fdir_tcp6_gre6_pkt,
1320                 sizeof(ice_fdir_tcp6_gre6_pkt),
1321                 ice_fdir_tcp6_gre6_pkt,
1322         },
1323         {
1324                 ICE_FLTR_PTYPE_NONF_IPV6_TCP,
1325                 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
1326                 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
1327         },
1328         {
1329                 ICE_FLTR_PTYPE_NONF_IPV6_UDP,
1330                 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
1331                 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
1332         },
1333         {
1334                 ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
1335                 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
1336                 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
1337         },
1338         {
1339                 ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
1340                 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
1341                 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
1342         },
1343 };
1344
1345 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
1346
1347 /**
1348  * ice_set_dflt_val_fd_desc
1349  * @fd_fltr_ctx: pointer to fd filter descriptor
1350  */
1351 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
1352 {
1353         fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
1354         fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
1355         fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
1356         fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
1357         fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
1358         fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
1359         fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
1360         fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
1361         fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
1362         fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
1363         fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
1364         fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
1365         fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
1366         fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
1367         fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
1368         fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
1369         fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
1370         fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
1371         fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
1372 }
1373
1374 /**
1375  * ice_set_fd_desc_val
1376  * @ctx: pointer to fd filter descriptor context
1377  * @fdir_desc: populated with fd filter descriptor values
1378  */
1379 static void
1380 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
1381                     struct ice_fltr_desc *fdir_desc)
1382 {
1383         u64 qword;
1384
1385         /* prep QW0 of FD filter programming desc */
1386         qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
1387                 ICE_FXD_FLTR_QW0_QINDEX_M;
1388         qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
1389                  ICE_FXD_FLTR_QW0_COMP_Q_M;
1390         qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
1391                  ICE_FXD_FLTR_QW0_COMP_REPORT_M;
1392         qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
1393                  ICE_FXD_FLTR_QW0_FD_SPACE_M;
1394         qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
1395                  ICE_FXD_FLTR_QW0_STAT_CNT_M;
1396         qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
1397                  ICE_FXD_FLTR_QW0_STAT_ENA_M;
1398         qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
1399                  ICE_FXD_FLTR_QW0_EVICT_ENA_M;
1400         qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
1401                  ICE_FXD_FLTR_QW0_TO_Q_M;
1402         qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
1403                  ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
1404         qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
1405                  ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
1406         qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
1407                  ICE_FXD_FLTR_QW0_DROP_M;
1408         qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
1409                  ICE_FXD_FLTR_QW0_FLEX_PRI_M;
1410         qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
1411                  ICE_FXD_FLTR_QW0_FLEX_MDID_M;
1412         qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
1413                  ICE_FXD_FLTR_QW0_FLEX_VAL_M;
1414         fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
1415
1416         /* prep QW1 of FD filter programming desc */
1417         qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
1418                 ICE_FXD_FLTR_QW1_DTYPE_M;
1419         qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
1420                  ICE_FXD_FLTR_QW1_PCMD_M;
1421         qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
1422                  ICE_FXD_FLTR_QW1_PROF_PRI_M;
1423         qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
1424                  ICE_FXD_FLTR_QW1_PROF_M;
1425         qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
1426                  ICE_FXD_FLTR_QW1_FD_VSI_M;
1427         qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
1428                  ICE_FXD_FLTR_QW1_SWAP_M;
1429         qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
1430                  ICE_FXD_FLTR_QW1_FDID_PRI_M;
1431         qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
1432                  ICE_FXD_FLTR_QW1_FDID_MDID_M;
1433         qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
1434                  ICE_FXD_FLTR_QW1_FDID_M;
1435         fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
1436 }
1437
1438 /**
1439  * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
1440  * @hw: pointer to the hardware structure
1441  * @input: filter
1442  * @fdesc: filter descriptor
1443  * @add: if add is true, this is an add operation, false implies delete
1444  */
1445 void
1446 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
1447                        struct ice_fltr_desc *fdesc, bool add)
1448 {
1449         struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
1450
1451         /* set default context info */
1452         ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
1453
1454         /* change sideband filtering values */
1455         fdir_fltr_ctx.fdid = input->fltr_id;
1456         if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
1457                 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
1458                 fdir_fltr_ctx.qindex = 0;
1459         } else if (input->dest_ctl ==
1460                    ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
1461                 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
1462                 fdir_fltr_ctx.qindex = 0;
1463         } else {
1464                 if (input->dest_ctl ==
1465                     ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
1466                         fdir_fltr_ctx.toq = input->q_region;
1467                 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
1468                 fdir_fltr_ctx.qindex = input->q_index;
1469         }
1470         fdir_fltr_ctx.cnt_ena = input->cnt_ena;
1471         fdir_fltr_ctx.cnt_index = input->cnt_index;
1472         fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
1473         fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
1474         if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
1475                 fdir_fltr_ctx.toq_prio = 0;
1476         else
1477                 fdir_fltr_ctx.toq_prio = 3;
1478         fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
1479                 ICE_FXD_FLTR_QW1_PCMD_REMOVE;
1480         fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
1481         fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
1482         fdir_fltr_ctx.comp_report = input->comp_report;
1483         fdir_fltr_ctx.fdid_prio = input->fdid_prio;
1484         fdir_fltr_ctx.desc_prof = 1;
1485         fdir_fltr_ctx.desc_prof_prio = 3;
1486         ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
1487 }
1488
1489 /**
1490  * ice_alloc_fd_res_cntr - obtain counter resource for FD type
1491  * @hw: pointer to the hardware structure
1492  * @cntr_id: returns counter index
1493  */
1494 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
1495 {
1496         return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
1497                                   ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
1498 }
1499
1500 /**
1501  * ice_free_fd_res_cntr - Free counter resource for FD type
1502  * @hw: pointer to the hardware structure
1503  * @cntr_id: counter index to be freed
1504  */
1505 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
1506 {
1507         return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
1508                                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
1509 }
1510
1511 /**
1512  * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
1513  * @hw: pointer to the hardware structure
1514  * @cntr_id: returns counter index
1515  * @num_fltr: number of filter entries to be allocated
1516  */
1517 enum ice_status
1518 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
1519 {
1520         return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
1521                                   ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1522                                   cntr_id);
1523 }
1524
1525 /**
1526  * ice_free_fd_guar_item - Free flow director guaranteed entries
1527  * @hw: pointer to the hardware structure
1528  * @cntr_id: counter index that needs to be freed
1529  * @num_fltr: number of filters to be freed
1530  */
1531 enum ice_status
1532 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
1533 {
1534         return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
1535                                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1536                                  cntr_id);
1537 }
1538
1539 /**
1540  * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
1541  * @hw: pointer to the hardware structure
1542  * @cntr_id: returns counter index
1543  * @num_fltr: number of filter entries to be allocated
1544  */
1545 enum ice_status
1546 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
1547 {
1548         return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
1549                                   ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1550                                   cntr_id);
1551 }
1552
1553 /**
1554  * ice_free_fd_shrd_item - Free flow director shared entries
1555  * @hw: pointer to the hardware structure
1556  * @cntr_id: counter index that needs to be freed
1557  * @num_fltr: number of filters to be freed
1558  */
1559 enum ice_status
1560 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
1561 {
1562         return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
1563                                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1564                                  cntr_id);
1565 }
1566
1567 /**
1568  * ice_get_fdir_cnt_all - get the number of Flow Director filters
1569  * @hw: hardware data structure
1570  *
1571  * Returns the number of filters available on device
1572  */
1573 int ice_get_fdir_cnt_all(struct ice_hw *hw)
1574 {
1575         return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
1576 }
1577
1578 /**
1579  * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
1580  * @pkt: packet buffer
1581  * @offset: offset into buffer
1582  * @addr: IPv6 address to convert and insert into pkt at offset
1583  */
1584 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
1585 {
1586         int idx;
1587
1588         for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
1589                 ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
1590                            sizeof(*addr), ICE_NONDMA_TO_NONDMA);
1591 }
1592
1593 /**
1594  * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
1595  * @pkt: packet buffer
1596  * @offset: offset into buffer
1597  * @data: 8 bit value to convert and insert into pkt at offset
1598  *
1599  * This function is designed for inserting qfi (6 bits) for gtpu.
1600  */
1601 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
1602 {
1603         u8 ret;
1604
1605         ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
1606         ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
1607 }
1608
1609 /**
1610  * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
1611  * @pkt: packet buffer
1612  * @offset: offset into buffer
1613  * @data: 8 bit value to convert and insert into pkt at offset
1614  */
1615 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
1616 {
1617         ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1618 }
1619
1620 /**
1621  * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
1622  * @pkt: packet buffer
1623  * @offset: offset into buffer
1624  * @data: 8 bit value to convert and insert into pkt at offset
1625  *
1626  * This function is designed for inserting Traffic Class (TC) for IPv6,
1627  * since that TC is not aligned in number of bytes. Here we split it out
1628  * into two part and fill each byte with data copy from pkt, then insert
1629  * the two bytes data one by one.
1630  */
1631 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
1632 {
1633         u8 high, low;
1634
1635         high = (data >> 4) + (*(pkt + offset) & 0xF0);
1636         ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
1637
1638         low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
1639         ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
1640 }
1641
1642 /**
1643  * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
1644  * @pkt: packet buffer
1645  * @offset: offset into buffer
1646  * @data: 16 bit value to convert and insert into pkt at offset
1647  */
1648 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
1649 {
1650         ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1651 }
1652
1653 /**
1654  * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
1655  * @pkt: packet buffer
1656  * @offset: offset into buffer
1657  * @data: 32 bit value to convert and insert into pkt at offset
1658  */
1659 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
1660 {
1661         ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1662 }
1663
1664 /**
1665  * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
1666  * @pkt: packet buffer
1667  * @addr: MAC address to convert and insert into pkt at offset
1668  */
1669 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
1670 {
1671         ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
1672 }
1673
1674 /**
1675  * ice_fdir_get_open_tunnel_port
1676  * @hw: pointer to the hardware structure
1677  * @flow: flow ptype
1678  * @port: returns open port
1679  *
1680  * returns an open tunnel port specified for this flow type
1681  */
1682 static enum ice_status
1683 ice_fdir_get_open_tunnel_port(struct ice_hw *hw, enum ice_fltr_ptype flow,
1684                               u16 *port)
1685 {
1686         switch (flow) {
1687         case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1688                 /* eCPRI tunnel */
1689                 if (!ice_get_open_tunnel_port(hw, TNL_ECPRI, port))
1690                         return ICE_ERR_DOES_NOT_EXIST;
1691                 break;
1692         default:
1693                 if (!ice_get_open_tunnel_port(hw, TNL_VXLAN, port) &&
1694                     !ice_get_open_tunnel_port(hw, TNL_GENEVE, port))
1695                         return ICE_ERR_DOES_NOT_EXIST;
1696         }
1697
1698         return ICE_SUCCESS;
1699 }
1700
1701 /**
1702  * ice_fdir_get_gen_prgm_pkt - generate a training packet
1703  * @hw: pointer to the hardware structure
1704  * @input: flow director filter data structure
1705  * @pkt: pointer to return filter packet
1706  * @frag: generate a fragment packet
1707  * @tun: true implies generate a tunnel packet
1708  */
1709 enum ice_status
1710 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
1711                           u8 *pkt, bool frag, bool tun)
1712 {
1713         enum ice_fltr_ptype flow;
1714         u16 tnl_port;
1715         u8 *loc;
1716         u16 idx;
1717
1718         if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1719                 switch (input->ip.v4.proto) {
1720                 case ICE_IP_PROTO_TCP:
1721                         flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
1722                         break;
1723                 case ICE_IP_PROTO_UDP:
1724                         flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
1725                         break;
1726                 case ICE_IP_PROTO_SCTP:
1727                         flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
1728                         break;
1729                 default:
1730                         flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
1731                         break;
1732                 }
1733         } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1734                 switch (input->ip.v6.proto) {
1735                 case ICE_IP_PROTO_TCP:
1736                         flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
1737                         break;
1738                 case ICE_IP_PROTO_UDP:
1739                         flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
1740                         break;
1741                 case ICE_IP_PROTO_SCTP:
1742                         flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
1743                         break;
1744                 default:
1745                         flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
1746                         break;
1747                 }
1748         } else {
1749                 flow = input->flow_type;
1750         }
1751
1752         for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
1753                 if (ice_fdir_pkt[idx].flow == flow)
1754                         break;
1755         if (idx == ICE_FDIR_NUM_PKT)
1756                 return ICE_ERR_PARAM;
1757         if (!tun) {
1758                 ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
1759                            ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
1760                 loc = pkt;
1761         } else {
1762                 if (!ice_fdir_pkt[idx].tun_pkt)
1763                         return ICE_ERR_PARAM;
1764
1765                 switch (flow) {
1766                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4:
1767                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1768                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1769                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6:
1770                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP:
1771                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP:
1772                         ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1773                                    ice_fdir_pkt[idx].tun_pkt_len,
1774                                    ICE_NONDMA_TO_NONDMA);
1775                         loc = &pkt[ICE_FDIR_GTPU_IP_INNER_PKT_OFF];
1776                         break;
1777                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4:
1778                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP:
1779                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP:
1780                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4:
1781                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP:
1782                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP:
1783                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4:
1784                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP:
1785                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP:
1786                         ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1787                                    ice_fdir_pkt[idx].tun_pkt_len,
1788                                    ICE_NONDMA_TO_NONDMA);
1789                         loc = &pkt[ICE_FDIR_GTPU_EH_INNER_PKT_OFF];
1790                         break;
1791                 case ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV4:
1792                 case ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV4_UDP:
1793                 case ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV4_TCP:
1794                 case ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV6:
1795                 case ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV6_UDP:
1796                 case ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV6_TCP:
1797                         ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1798                                    ice_fdir_pkt[idx].tun_pkt_len,
1799                                    ICE_NONDMA_TO_NONDMA);
1800                         loc = &pkt[ICE_FDIR_IPV4_GRE_INNER_PKT_OFF];
1801                         break;
1802                 case ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV4:
1803                 case ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV4_UDP:
1804                 case ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV4_TCP:
1805                 case ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV6:
1806                 case ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV6_UDP:
1807                 case ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV6_TCP:
1808                         ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1809                                    ice_fdir_pkt[idx].tun_pkt_len,
1810                                    ICE_NONDMA_TO_NONDMA);
1811                         loc = &pkt[ICE_FDIR_IPV6_GRE_INNER_PKT_OFF];
1812                         break;
1813                 default:
1814                         if (ice_fdir_get_open_tunnel_port(hw, flow, &tnl_port))
1815                                 return ICE_ERR_DOES_NOT_EXIST;
1816
1817                         ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1818                                    ice_fdir_pkt[idx].tun_pkt_len,
1819                                    ICE_NONDMA_TO_NONDMA);
1820                         ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
1821                                            HTONS(tnl_port));
1822                         loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
1823                         break;
1824                 }
1825         }
1826
1827         /* Reverse the src and dst, since the HW expects them to be from Tx
1828          * perspective. The input from user is from Rx filter perspective.
1829          */
1830         switch (flow) {
1831         case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
1832                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1833                                    input->ip.v4.src_ip);
1834                 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1835                                    input->ip.v4.src_port);
1836                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1837                                    input->ip.v4.dst_ip);
1838                 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1839                                    input->ip.v4.dst_port);
1840                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1841                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1842                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1843                 if (frag)
1844                         loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
1845                 break;
1846         case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
1847                 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1848                 ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1849                                         input->ext_data_outer.src_mac);
1850                 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1851                                    input->ip_outer.v4.dst_ip);
1852                 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1853                                    input->ip_outer.v4.src_ip);
1854                 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1855                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1856                                    input->ip.v4.src_ip);
1857                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1858                                    input->ip.v4.src_port);
1859                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1860                                    input->ip.v4.dst_ip);
1861                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1862                                    input->ip.v4.dst_port);
1863                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1864                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1865                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1866                 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1867                 break;
1868         case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1869                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1870                                    input->ip.v4.src_ip);
1871                 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1872                                    input->ip.v4.src_port);
1873                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1874                                    input->ip.v4.dst_ip);
1875                 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1876                                    input->ip.v4.dst_port);
1877                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1878                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1879                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1880                 break;
1881         case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1882                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1883                                    input->ip.v4.src_ip);
1884                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1885                                    input->ip.v4.dst_ip);
1886                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1887                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1888                 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1889                                   input->ip.v4.proto);
1890                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1891                 break;
1892         case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
1893         case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_UDP:
1894                 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1895                 ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac);
1896                 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1897                                    input->ip_outer.v4.dst_ip);
1898                 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1899                                    input->ip_outer.v4.src_ip);
1900                 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1901                 ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1902                                    input->vxlan_data.vni);
1903                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1904                                    input->ip.v4.src_ip);
1905                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1906                                    input->ip.v4.src_port);
1907                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1908                                    input->ip.v4.dst_ip);
1909                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1910                                    input->ip.v4.dst_port);
1911                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1912                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1913                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1914                 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1915                 break;
1916         case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_TCP:
1917                 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1918                 ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1919                                         input->ext_data_outer.src_mac);
1920                 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1921                                    input->ip_outer.v4.dst_ip);
1922                 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1923                                    input->ip_outer.v4.src_ip);
1924                 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET,
1925                                   input->ip_outer.v4.tos);
1926                 ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1927                                    input->vxlan_data.vni);
1928                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1929                                    input->ip.v4.src_ip);
1930                 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1931                                    input->ip.v4.src_port);
1932                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1933                                    input->ip.v4.dst_ip);
1934                 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1935                                    input->ip.v4.dst_port);
1936                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1937                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1938                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1939                 ice_pkt_insert_mac_addr(loc + ETH_ALEN,
1940                                         input->ext_data.src_mac);
1941                 if (frag)
1942                         loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
1943                 break;
1944         case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_SCTP:
1945                 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1946                 ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1947                                         input->ext_data_outer.src_mac);
1948                 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1949                                    input->ip_outer.v4.dst_ip);
1950                 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1951                                    input->ip_outer.v4.src_ip);
1952                 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET,
1953                                   input->ip_outer.v4.tos);
1954                 ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1955                                    input->vxlan_data.vni);
1956                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1957                                    input->ip.v4.src_ip);
1958                 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1959                                    input->ip.v4.src_port);
1960                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1961                                    input->ip.v4.dst_ip);
1962                 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1963                                    input->ip.v4.dst_port);
1964                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1965                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1966                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1967                 ice_pkt_insert_mac_addr(loc + ETH_ALEN,
1968                                         input->ext_data.src_mac);
1969                 break;
1970         case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_OTHER:
1971                 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1972                 ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1973                                         input->ext_data_outer.src_mac);
1974                 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1975                                    input->ip_outer.v4.dst_ip);
1976                 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1977                                    input->ip_outer.v4.src_ip);
1978                 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET,
1979                                   input->ip_outer.v4.tos);
1980                 ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1981                                    input->vxlan_data.vni);
1982                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1983                                    input->ip.v4.src_ip);
1984                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1985                                    input->ip.v4.dst_ip);
1986                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1987                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1988                 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1989                                   input->ip.v4.proto);
1990                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1991                 ice_pkt_insert_mac_addr(loc + ETH_ALEN,
1992                                         input->ext_data.src_mac);
1993                 break;
1994         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU:
1995                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1996                                    input->ip.v4.src_ip);
1997                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1998                                    input->ip.v4.dst_ip);
1999                 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
2000                                    input->gtpu_data.teid);
2001                 break;
2002         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4:
2003         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4:
2004         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4:
2005         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4:
2006                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
2007                                    input->ip.v4.src_ip);
2008                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
2009                                    input->ip.v4.dst_ip);
2010                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
2011                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
2012                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_PROTO_OFFSET,
2013                                   input->ip.v4.proto);
2014                 break;
2015         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH:
2016         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW:
2017         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP:
2018                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
2019                                    input->ip.v4.src_ip);
2020                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
2021                                    input->ip.v4.dst_ip);
2022                 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
2023                                    input->gtpu_data.teid);
2024                 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
2025                                       input->gtpu_data.qfi);
2026                 break;
2027         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
2028         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP:
2029         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP:
2030         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP:
2031                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
2032                                    input->ip.v4.src_ip);
2033                 ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_DST_PORT_OFFSET,
2034                                    input->ip.v4.src_port);
2035                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
2036                                    input->ip.v4.dst_ip);
2037                 ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_SRC_PORT_OFFSET,
2038                                    input->ip.v4.dst_port);
2039                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
2040                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
2041                 break;
2042         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
2043         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP:
2044         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP:
2045         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP:
2046                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
2047                                    input->ip.v4.src_ip);
2048                 ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_DST_PORT_OFFSET,
2049                                    input->ip.v4.src_port);
2050                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
2051                                    input->ip.v4.dst_ip);
2052                 ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_SRC_PORT_OFFSET,
2053                                    input->ip.v4.dst_port);
2054                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
2055                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
2056                 break;
2057         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6:
2058                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
2059                                          input->ip.v6.src_ip);
2060                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
2061                                          input->ip.v6.dst_ip);
2062                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
2063                 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
2064                 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_PROTO_OFFSET,
2065                                   input->ip.v6.proto);
2066                 break;
2067         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP:
2068                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
2069                                          input->ip.v6.src_ip);
2070                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
2071                                          input->ip.v6.dst_ip);
2072                 ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_DST_PORT_OFFSET,
2073                                    input->ip.v6.src_port);
2074                 ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_SRC_PORT_OFFSET,
2075                                    input->ip.v6.dst_port);
2076                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
2077                 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
2078                 break;
2079         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP:
2080                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
2081                                          input->ip.v6.src_ip);
2082                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
2083                                          input->ip.v6.dst_ip);
2084                 ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_DST_PORT_OFFSET,
2085                                    input->ip.v6.src_port);
2086                 ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_SRC_PORT_OFFSET,
2087                                    input->ip.v6.dst_port);
2088                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
2089                 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
2090                 break;
2091         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU:
2092         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER:
2093                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
2094                                          input->ip.v6.src_ip);
2095                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
2096                                          input->ip.v6.dst_ip);
2097                 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
2098                                    input->gtpu_data.teid);
2099                 break;
2100         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH:
2101         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW:
2102         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP:
2103         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
2104                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
2105                                          input->ip.v6.src_ip);
2106                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
2107                                          input->ip.v6.dst_ip);
2108                 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
2109                                    input->gtpu_data.teid);
2110                 ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
2111                                       input->gtpu_data.qfi);
2112                 break;
2113         case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
2114                 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
2115                                    input->l2tpv3_data.session_id);
2116                 break;
2117         case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
2118                 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
2119                                    input->l2tpv3_data.session_id);
2120                 break;
2121         case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
2122                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
2123                                    input->ip.v4.src_ip);
2124                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
2125                                    input->ip.v4.dst_ip);
2126                 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
2127                                    input->ip.v4.sec_parm_idx);
2128                 break;
2129         case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
2130                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
2131                                          input->ip.v6.src_ip);
2132                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
2133                                          input->ip.v6.dst_ip);
2134                 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
2135                                    input->ip.v6.sec_parm_idx);
2136                 break;
2137         case ICE_FLTR_PTYPE_NONF_IPV4_AH:
2138                 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
2139                                    input->ip.v4.sec_parm_idx);
2140                 break;
2141         case ICE_FLTR_PTYPE_NONF_IPV6_AH:
2142                 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
2143                                    input->ip.v6.sec_parm_idx);
2144                 break;
2145         case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
2146                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
2147                                    input->ip.v4.src_ip);
2148                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
2149                                    input->ip.v4.dst_ip);
2150                 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
2151                                    input->ip.v4.sec_parm_idx);
2152                 break;
2153         case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
2154                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
2155                                          input->ip.v6.src_ip);
2156                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
2157                                          input->ip.v6.dst_ip);
2158                 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
2159                                    input->ip.v6.sec_parm_idx);
2160                 break;
2161         case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
2162         case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
2163                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
2164                                    input->ip.v4.dst_port);
2165                 break;
2166         case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
2167         case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
2168                 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
2169                                    input->ip.v6.dst_port);
2170                 break;
2171         case ICE_FLTR_PTYPE_NON_IP_L2:
2172                 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
2173                                    input->ext_data.ether_type);
2174                 break;
2175         case ICE_FLTR_PTYPE_NONF_ECPRI_TP0:
2176                 ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET,
2177                                    input->ecpri_data.pc_id);
2178                 break;
2179         case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
2180                 /* Use pkt instead of loc, since PC_ID is in outer part */
2181                 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET,
2182                                    input->ecpri_data.pc_id);
2183                 break;
2184         case ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV4:
2185         case ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV4:
2186                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
2187                                    input->ip.v4.src_ip);
2188                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
2189                                    input->ip.v4.dst_ip);
2190                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET,
2191                                   input->ip.v4.tos);
2192                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_PROTO_OFFSET,
2193                                   input->ip.v4.proto);
2194                 break;
2195         case ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV4_TCP:
2196         case ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV4_TCP:
2197                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
2198                                    input->ip.v4.src_ip);
2199                 ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_DST_PORT_OFFSET,
2200                                    input->ip.v4.src_port);
2201                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
2202                                    input->ip.v4.dst_ip);
2203                 ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_SRC_PORT_OFFSET,
2204                                    input->ip.v4.dst_port);
2205                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET,
2206                                   input->ip.v4.tos);
2207                 break;
2208         case ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV4_UDP:
2209         case ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV4_UDP:
2210                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
2211                                    input->ip.v4.src_ip);
2212                 ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_DST_PORT_OFFSET,
2213                                    input->ip.v4.src_port);
2214                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
2215                                    input->ip.v4.dst_ip);
2216                 ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_SRC_PORT_OFFSET,
2217                                    input->ip.v4.dst_port);
2218                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET,
2219                                   input->ip.v4.tos);
2220                 break;
2221         case ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV6:
2222         case ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV6:
2223                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
2224                                          input->ip.v6.src_ip);
2225                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
2226                                          input->ip.v6.dst_ip);
2227                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET,
2228                                      input->ip.v6.tc);
2229                 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_PROTO_OFFSET,
2230                                   input->ip.v6.proto);
2231                 break;
2232         case ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV6_TCP:
2233         case ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV6_TCP:
2234                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
2235                                          input->ip.v6.src_ip);
2236                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
2237                                          input->ip.v6.dst_ip);
2238                 ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_DST_PORT_OFFSET,
2239                                    input->ip.v6.src_port);
2240                 ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_SRC_PORT_OFFSET,
2241                                    input->ip.v6.dst_port);
2242                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET,
2243                                      input->ip.v6.tc);
2244                 break;
2245         case ICE_FLTR_PTYPE_NONF_IPV4_GRE_IPV6_UDP:
2246         case ICE_FLTR_PTYPE_NONF_IPV6_GRE_IPV6_UDP:
2247                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
2248                                          input->ip.v6.src_ip);
2249                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
2250                                          input->ip.v6.dst_ip);
2251                 ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_DST_PORT_OFFSET,
2252                                    input->ip.v6.src_port);
2253                 ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_SRC_PORT_OFFSET,
2254                                    input->ip.v6.dst_port);
2255                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET,
2256                                      input->ip.v6.tc);
2257                 break;
2258         case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
2259                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
2260                                          input->ip.v6.src_ip);
2261                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
2262                                          input->ip.v6.dst_ip);
2263                 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
2264                                    input->ip.v6.src_port);
2265                 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
2266                                    input->ip.v6.dst_port);
2267                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
2268                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
2269                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
2270                 break;
2271         case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
2272                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
2273                                          input->ip.v6.src_ip);
2274                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
2275                                          input->ip.v6.dst_ip);
2276                 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
2277                                    input->ip.v6.src_port);
2278                 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
2279                                    input->ip.v6.dst_port);
2280                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
2281                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
2282                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
2283                 break;
2284         case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
2285                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
2286                                          input->ip.v6.src_ip);
2287                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
2288                                          input->ip.v6.dst_ip);
2289                 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
2290                                    input->ip.v6.src_port);
2291                 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
2292                                    input->ip.v6.dst_port);
2293                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
2294                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
2295                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
2296                 break;
2297         case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
2298                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
2299                                          input->ip.v6.src_ip);
2300                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
2301                                          input->ip.v6.dst_ip);
2302                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
2303                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
2304                 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
2305                                   input->ip.v6.proto);
2306                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
2307                 break;
2308         case ICE_FLTR_PTYPE_FRAG_IPV4:
2309                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
2310                                    input->ip.v4.src_ip);
2311                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
2312                                    input->ip.v4.dst_ip);
2313                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
2314                 ice_pkt_insert_u16(loc, ICE_IPV4_ID_OFFSET,
2315                                    input->ip.v4.packet_id);
2316                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
2317                 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
2318                                   input->ip.v4.proto);
2319                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
2320                 break;
2321         case ICE_FLTR_PTYPE_FRAG_IPV6:
2322                 ice_pkt_insert_u32(loc, ICE_IPV6_ID_OFFSET,
2323                                    input->ip.v6.packet_id);
2324                 break;
2325         default:
2326                 return ICE_ERR_PARAM;
2327         }
2328
2329         if (input->flex_fltr)
2330                 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
2331
2332         return ICE_SUCCESS;
2333 }
2334
2335 /**
2336  * ice_fdir_get_prgm_pkt - generate a training packet
2337  * @input: flow director filter data structure
2338  * @pkt: pointer to return filter packet
2339  * @frag: generate a fragment packet
2340  */
2341 enum ice_status
2342 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
2343 {
2344         return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
2345 }
2346
2347 /**
2348  * ice_fdir_has_frag - does flow type have 2 ptypes
2349  * @flow: flow ptype
2350  *
2351  * returns true is there is a fragment packet for this ptype
2352  */
2353 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
2354 {
2355         if (flow == ICE_FLTR_PTYPE_FRAG_IPV4 ||
2356             flow == ICE_FLTR_PTYPE_FRAG_IPV6)
2357                 return true;
2358         else
2359                 return false;
2360 }
2361
2362 /**
2363  * ice_fdir_find_fltr_by_idx - find filter with idx
2364  * @hw: pointer to hardware structure
2365  * @fltr_idx: index to find.
2366  *
2367  * Returns pointer to filter if found or null
2368  */
2369 struct ice_fdir_fltr *
2370 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
2371 {
2372         struct ice_fdir_fltr *rule;
2373
2374         LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
2375                             fltr_node) {
2376                 /* rule ID found in the list */
2377                 if (fltr_idx == rule->fltr_id)
2378                         return rule;
2379                 if (fltr_idx < rule->fltr_id)
2380                         break;
2381         }
2382         return NULL;
2383 }
2384
2385 /**
2386  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
2387  * @hw: hardware structure
2388  * @fltr: filter node to add to structure
2389  */
2390 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
2391 {
2392         struct ice_fdir_fltr *rule, *parent = NULL;
2393
2394         LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
2395                             fltr_node) {
2396                 /* rule ID found or pass its spot in the list */
2397                 if (rule->fltr_id >= fltr->fltr_id)
2398                         break;
2399                 parent = rule;
2400         }
2401
2402         if (parent)
2403                 LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
2404         else
2405                 LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
2406 }
2407
2408 /**
2409  * ice_fdir_update_cntrs - increment / decrement filter counter
2410  * @hw: pointer to hardware structure
2411  * @flow: filter flow type
2412  * @acl_fltr: true indicates an ACL filter
2413  * @add: true implies filters added
2414  */
2415 void
2416 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
2417                       bool acl_fltr, bool add)
2418 {
2419         int incr;
2420
2421         incr = add ? 1 : -1;
2422         hw->fdir_active_fltr += incr;
2423         if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
2424                 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
2425         } else {
2426                 if (acl_fltr)
2427                         hw->acl_fltr_cnt[flow] += incr;
2428                 else
2429                         hw->fdir_fltr_cnt[flow] += incr;
2430         }
2431 }
2432
2433 /**
2434  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
2435  * @a: IP v6 address
2436  * @b: IP v6 address
2437  *
2438  * Returns 0 on equal, returns non-0 if different
2439  */
2440 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
2441 {
2442         return memcmp(a, b, 4 * sizeof(__be32));
2443 }
2444
2445 /**
2446  * ice_fdir_comp_rules - compare 2 filters
2447  * @a: a Flow Director filter data structure
2448  * @b: a Flow Director filter data structure
2449  * @v6: bool true if v6 filter
2450  *
2451  * Returns true if the filters match
2452  */
2453 static bool
2454 ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
2455 {
2456         enum ice_fltr_ptype flow_type = a->flow_type;
2457
2458         /* The calling function already checks that the two filters have the
2459          * same flow_type.
2460          */
2461         if (!v6) {
2462                 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
2463                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
2464                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
2465                         if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
2466                             a->ip.v4.src_ip == b->ip.v4.src_ip &&
2467                             a->ip.v4.dst_port == b->ip.v4.dst_port &&
2468                             a->ip.v4.src_port == b->ip.v4.src_port)
2469                                 return true;
2470                 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
2471                         if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
2472                             a->ip.v4.src_ip == b->ip.v4.src_ip &&
2473                             a->ip.v4.l4_header == b->ip.v4.l4_header &&
2474                             a->ip.v4.proto == b->ip.v4.proto &&
2475                             a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
2476                             a->ip.v4.tos == b->ip.v4.tos)
2477                                 return true;
2478                 }
2479         } else {
2480                 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
2481                     flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
2482                     flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
2483                         if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
2484                             a->ip.v6.src_port == b->ip.v6.src_port &&
2485                             !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
2486                                                b->ip.v6.dst_ip) &&
2487                             !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
2488                                                b->ip.v6.src_ip))
2489                                 return true;
2490                 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
2491                         if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
2492                             a->ip.v6.src_port == b->ip.v6.src_port)
2493                                 return true;
2494                 }
2495         }
2496
2497         return false;
2498 }
2499
2500 /**
2501  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
2502  * @hw: hardware data structure
2503  * @input: Flow Director filter data structure
2504  *
2505  * Returns true if the filter is found in the list
2506  */
2507 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
2508 {
2509         struct ice_fdir_fltr *rule;
2510         bool ret = false;
2511
2512         LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
2513                             fltr_node) {
2514                 enum ice_fltr_ptype flow_type;
2515
2516                 if (rule->flow_type != input->flow_type)
2517                         continue;
2518
2519                 flow_type = input->flow_type;
2520                 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
2521                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
2522                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
2523                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
2524                         ret = ice_fdir_comp_rules(rule, input, false);
2525                 else
2526                         ret = ice_fdir_comp_rules(rule, input, true);
2527                 if (ret) {
2528                         if (rule->fltr_id == input->fltr_id &&
2529                             rule->q_index != input->q_index)
2530                                 ret = false;
2531                         else
2532                                 break;
2533                 }
2534         }
2535
2536         return ret;
2537 }
2538
2539 /**
2540  * ice_clear_pf_fd_table - admin command to clear FD table for PF
2541  * @hw: hardware data structure
2542  *
2543  * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
2544  */
2545 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
2546 {
2547         struct ice_aqc_clear_fd_table *cmd;
2548         struct ice_aq_desc desc;
2549
2550         cmd = &desc.params.clear_fd_table;
2551         ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
2552         cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
2553         /* vsi_index must be 0 to clear FD table for a PF */
2554         cmd->vsi_index = CPU_TO_LE16(0);
2555
2556         return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
2557 }