net/ice/base: update GTPU EH dummy packets for FDIR
[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_tcpv6_pkt[] = {
522         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
523         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
524         0x00, 0x00, 0x00, 0x14, 0x06, 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, 0x00, 0x00,
529         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
530         0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
531         0x00, 0x00,
532 };
533
534 static const u8 ice_fdir_udpv6_pkt[] = {
535         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
536         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
537         0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
538         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
539         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
540         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
541         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
542         0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
543 };
544
545 static const u8 ice_fdir_sctpv6_pkt[] = {
546         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
547         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
548         0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
549         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
550         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
551         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
552         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
553         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
554         0x00, 0x00,
555 };
556
557 static const u8 ice_fdir_ipv6_pkt[] = {
558         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
559         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
560         0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
561         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
562         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
563         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
564         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
565 };
566
567 static const u8 ice_fdir_tcp4_tun_pkt[] = {
568         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
569         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
570         0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
571         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
572         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
573         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
574         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
575         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
576         0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
577         0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
578         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
579         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580         0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
581 };
582
583 static const u8 ice_fdir_udp4_tun_pkt[] = {
584         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
585         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
586         0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
587         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
588         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
589         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
590         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
591         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
592         0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
593         0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
594         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
595         0x00, 0x00, 0x00, 0x00,
596 };
597
598 static const u8 ice_fdir_sctp4_tun_pkt[] = {
599         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
600         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
601         0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
602         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
603         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
605         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
606         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
607         0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
608         0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
609         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
610         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
611 };
612
613 static const u8 ice_fdir_ip4_tun_pkt[] = {
614         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
615         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
616         0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
617         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
618         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
619         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
620         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
621         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
622         0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
623         0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
624         0x00, 0x00, 0x00, 0x00,
625 };
626
627 static const u8 ice_fdir_tcp6_tun_pkt[] = {
628         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
629         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
630         0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
631         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
632         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
633         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
634         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
635         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
636         0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
637         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
638         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
639         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
640         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
641         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
642         0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
643         0x00, 0x00, 0x00, 0x00,
644 };
645
646 static const u8 ice_fdir_udp6_tun_pkt[] = {
647         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
648         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
649         0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
650         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
651         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
652         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
653         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
654         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
655         0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
656         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
657         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
658         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
659         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
660         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
661 };
662
663 static const u8 ice_fdir_sctp6_tun_pkt[] = {
664         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
665         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
666         0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
667         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
668         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
669         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
670         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
671         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
672         0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
673         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
674         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
675         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
676         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
677         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
678         0x00, 0x00, 0x00, 0x00,
679 };
680
681 static const u8 ice_fdir_ip6_tun_pkt[] = {
682         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
683         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
684         0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
685         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
686         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
687         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
688         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
689         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
690         0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
691         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
692         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
693         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
694         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
695 };
696
697 /* Flow Director no-op training packet table */
698 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
699         {
700                 ICE_FLTR_PTYPE_NONF_IPV4_TCP,
701                 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
702                 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
703         },
704         {
705                 ICE_FLTR_PTYPE_NONF_IPV4_UDP,
706                 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
707                 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
708         },
709         {
710                 ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
711                 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
712                 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
713         },
714         {
715                 ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
716                 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
717                 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
718         },
719         {
720                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
721                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
722                 ice_fdir_ipv4_gtpu4_pkt,
723                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
724                 ice_fdir_ipv4_gtpu4_pkt,
725         },
726         {
727                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH,
728                 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
729                 ice_fdir_ipv4_gtpu4_eh_pkt,
730                 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
731                 ice_fdir_ipv4_gtpu4_eh_pkt,
732         },
733         {
734                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW,
735                 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
736                 ice_fdir_ipv4_gtpu4_eh_dw_pkt,
737                 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
738                 ice_fdir_ipv4_gtpu4_eh_dw_pkt,
739         },
740         {
741                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP,
742                 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
743                 ice_fdir_ipv4_gtpu4_eh_up_pkt,
744                 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
745                 ice_fdir_ipv4_gtpu4_eh_up_pkt,
746         },
747         {
748                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4,
749                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
750                 ice_fdir_ipv4_gtpu4_pkt,
751                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
752                 ice_fdir_ipv4_gtpu4_pkt,
753         },
754         {
755                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
756                 sizeof(ice_fdir_udp4_gtpu4_pkt),
757                 ice_fdir_udp4_gtpu4_pkt,
758                 sizeof(ice_fdir_udp4_gtpu4_pkt),
759                 ice_fdir_udp4_gtpu4_pkt,
760         },
761         {
762                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
763                 sizeof(ice_fdir_tcp4_gtpu4_pkt),
764                 ice_fdir_tcp4_gtpu4_pkt,
765                 sizeof(ice_fdir_tcp4_gtpu4_pkt),
766                 ice_fdir_tcp4_gtpu4_pkt,
767         },
768         {
769                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4,
770                 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
771                 ice_fdir_ipv4_gtpu4_eh_pkt,
772                 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
773                 ice_fdir_ipv4_gtpu4_eh_pkt,
774         },
775         {
776                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP,
777                 sizeof(ice_fdir_udp4_gtpu4_eh_pkt),
778                 ice_fdir_udp4_gtpu4_eh_pkt,
779                 sizeof(ice_fdir_udp4_gtpu4_eh_pkt),
780                 ice_fdir_udp4_gtpu4_eh_pkt,
781         },
782         {
783                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP,
784                 sizeof(ice_fdir_tcp4_gtpu4_eh_pkt),
785                 ice_fdir_tcp4_gtpu4_eh_pkt,
786                 sizeof(ice_fdir_tcp4_gtpu4_eh_pkt),
787                 ice_fdir_tcp4_gtpu4_eh_pkt,
788         },
789         {
790                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4,
791                 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
792                 ice_fdir_ipv4_gtpu4_eh_dw_pkt,
793                 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
794                 ice_fdir_ipv4_gtpu4_eh_dw_pkt,
795         },
796         {
797                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP,
798                 sizeof(ice_fdir_udp4_gtpu4_eh_dw_pkt),
799                 ice_fdir_udp4_gtpu4_eh_dw_pkt,
800                 sizeof(ice_fdir_udp4_gtpu4_eh_dw_pkt),
801                 ice_fdir_udp4_gtpu4_eh_dw_pkt,
802         },
803         {
804                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP,
805                 sizeof(ice_fdir_tcp4_gtpu4_eh_dw_pkt),
806                 ice_fdir_tcp4_gtpu4_eh_dw_pkt,
807                 sizeof(ice_fdir_tcp4_gtpu4_eh_dw_pkt),
808                 ice_fdir_tcp4_gtpu4_eh_dw_pkt,
809         },
810         {
811                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4,
812                 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
813                 ice_fdir_ipv4_gtpu4_eh_up_pkt,
814                 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
815                 ice_fdir_ipv4_gtpu4_eh_up_pkt,
816         },
817         {
818                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP,
819                 sizeof(ice_fdir_udp4_gtpu4_eh_up_pkt),
820                 ice_fdir_udp4_gtpu4_eh_up_pkt,
821                 sizeof(ice_fdir_udp4_gtpu4_eh_up_pkt),
822                 ice_fdir_udp4_gtpu4_eh_up_pkt,
823         },
824         {
825                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP,
826                 sizeof(ice_fdir_tcp4_gtpu4_eh_up_pkt),
827                 ice_fdir_tcp4_gtpu4_eh_up_pkt,
828                 sizeof(ice_fdir_tcp4_gtpu4_eh_up_pkt),
829                 ice_fdir_tcp4_gtpu4_eh_up_pkt,
830         },
831         {
832                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
833                 sizeof(ice_fdir_icmp4_gtpu4_pkt),
834                 ice_fdir_icmp4_gtpu4_pkt,
835                 sizeof(ice_fdir_icmp4_gtpu4_pkt),
836                 ice_fdir_icmp4_gtpu4_pkt,
837         },
838         {
839                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
840                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
841                 ice_fdir_ipv4_gtpu4_pkt,
842                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
843                 ice_fdir_ipv4_gtpu4_pkt,
844         },
845         {
846                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6,
847                 sizeof(ice_fdir_ipv6_gtpu4_pkt),
848                 ice_fdir_ipv6_gtpu4_pkt,
849                 sizeof(ice_fdir_ipv6_gtpu4_pkt),
850                 ice_fdir_ipv6_gtpu4_pkt,
851         },
852         {
853                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP,
854                 sizeof(ice_fdir_udp6_gtpu4_pkt),
855                 ice_fdir_udp6_gtpu4_pkt,
856                 sizeof(ice_fdir_udp6_gtpu4_pkt),
857                 ice_fdir_udp6_gtpu4_pkt,
858         },
859         {
860                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP,
861                 sizeof(ice_fdir_tcp6_gtpu4_pkt),
862                 ice_fdir_tcp6_gtpu4_pkt,
863                 sizeof(ice_fdir_tcp6_gtpu4_pkt),
864                 ice_fdir_tcp6_gtpu4_pkt,
865         },
866         {
867                 ICE_FLTR_PTYPE_NONF_IPV6_GTPU,
868                 sizeof(ice_fdir_ipv6_gtpu6_pkt),
869                 ice_fdir_ipv6_gtpu6_pkt,
870                 sizeof(ice_fdir_ipv6_gtpu6_pkt),
871                 ice_fdir_ipv6_gtpu6_pkt,
872         },
873         {
874                 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH,
875                 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
876                 ice_fdir_ipv6_gtpu6_eh_pkt,
877                 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
878                 ice_fdir_ipv6_gtpu6_eh_pkt,
879         },
880         {
881                 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW,
882                 sizeof(ice_fdir_ipv6_gtpu6_eh_dw_pkt),
883                 ice_fdir_ipv6_gtpu6_eh_dw_pkt,
884                 sizeof(ice_fdir_ipv6_gtpu6_eh_dw_pkt),
885                 ice_fdir_ipv6_gtpu6_eh_dw_pkt,
886         },
887         {
888                 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP,
889                 sizeof(ice_fdir_ipv6_gtpu6_eh_up_pkt),
890                 ice_fdir_ipv6_gtpu6_eh_up_pkt,
891                 sizeof(ice_fdir_ipv6_gtpu6_eh_up_pkt),
892                 ice_fdir_ipv6_gtpu6_eh_up_pkt,
893         },
894         {
895                 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER,
896                 sizeof(ice_fdir_ipv6_gtpu6_pkt),
897                 ice_fdir_ipv6_gtpu6_pkt,
898                 sizeof(ice_fdir_ipv6_gtpu6_pkt),
899                 ice_fdir_ipv6_gtpu6_pkt,
900         },
901         {
902                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER,
903                 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
904                 ice_fdir_ipv4_gtpu4_eh_pkt,
905                 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
906                 ice_fdir_ipv4_gtpu4_eh_pkt,
907         },
908         {
909                 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER,
910                 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
911                 ice_fdir_ipv6_gtpu6_eh_pkt,
912                 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
913                 ice_fdir_ipv6_gtpu6_eh_pkt,
914         },
915         {
916                 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
917                 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
918                 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
919         },
920         {
921                 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
922                 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
923                 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
924         },
925         {
926                 ICE_FLTR_PTYPE_NONF_IPV4_ESP,
927                 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
928                 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
929         },
930         {
931                 ICE_FLTR_PTYPE_NONF_IPV6_ESP,
932                 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
933                 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
934         },
935         {
936                 ICE_FLTR_PTYPE_NONF_IPV4_AH,
937                 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
938                 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
939         },
940         {
941                 ICE_FLTR_PTYPE_NONF_IPV6_AH,
942                 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
943                 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
944         },
945         {
946                 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
947                 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
948                 ice_fdir_ipv4_nat_t_esp_pkt,
949                 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
950                 ice_fdir_ipv4_nat_t_esp_pkt,
951         },
952         {
953                 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
954                 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
955                 ice_fdir_ipv6_nat_t_esp_pkt,
956                 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
957                 ice_fdir_ipv6_nat_t_esp_pkt,
958         },
959         {
960                 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
961                 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
962                 ice_fdir_ipv4_pfcp_node_pkt,
963                 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
964                 ice_fdir_ipv4_pfcp_node_pkt,
965         },
966         {
967                 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
968                 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
969                 ice_fdir_ipv4_pfcp_session_pkt,
970                 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
971                 ice_fdir_ipv4_pfcp_session_pkt,
972         },
973         {
974                 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
975                 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
976                 ice_fdir_ipv6_pfcp_node_pkt,
977                 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
978                 ice_fdir_ipv6_pfcp_node_pkt,
979         },
980         {
981                 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
982                 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
983                 ice_fdir_ipv6_pfcp_session_pkt,
984                 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
985                 ice_fdir_ipv6_pfcp_session_pkt,
986         },
987         {
988                 ICE_FLTR_PTYPE_NON_IP_L2,
989                 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
990                 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
991         },
992         {
993                 ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN,
994                 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
995                 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
996         },
997         {
998                 ICE_FLTR_PTYPE_NONF_ECPRI_TP0,
999                 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
1000                 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
1001         },
1002         {
1003                 ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0,
1004                 sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
1005                 ice_fdir_ipv4_udp_ecpri_tp0_pkt,
1006                 sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
1007                 ice_fdir_ipv4_udp_ecpri_tp0_pkt,
1008         },
1009         {
1010                 ICE_FLTR_PTYPE_NONF_IPV6_TCP,
1011                 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
1012                 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
1013         },
1014         {
1015                 ICE_FLTR_PTYPE_NONF_IPV6_UDP,
1016                 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
1017                 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
1018         },
1019         {
1020                 ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
1021                 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
1022                 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
1023         },
1024         {
1025                 ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
1026                 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
1027                 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
1028         },
1029 };
1030
1031 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
1032
1033 /**
1034  * ice_set_dflt_val_fd_desc
1035  * @fd_fltr_ctx: pointer to fd filter descriptor
1036  */
1037 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
1038 {
1039         fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
1040         fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
1041         fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
1042         fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
1043         fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
1044         fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
1045         fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
1046         fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
1047         fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
1048         fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
1049         fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
1050         fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
1051         fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
1052         fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
1053         fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
1054         fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
1055         fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
1056         fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
1057         fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
1058 }
1059
1060 /**
1061  * ice_set_fd_desc_val
1062  * @ctx: pointer to fd filter descriptor context
1063  * @fdir_desc: populated with fd filter descriptor values
1064  */
1065 static void
1066 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
1067                     struct ice_fltr_desc *fdir_desc)
1068 {
1069         u64 qword;
1070
1071         /* prep QW0 of FD filter programming desc */
1072         qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
1073                 ICE_FXD_FLTR_QW0_QINDEX_M;
1074         qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
1075                  ICE_FXD_FLTR_QW0_COMP_Q_M;
1076         qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
1077                  ICE_FXD_FLTR_QW0_COMP_REPORT_M;
1078         qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
1079                  ICE_FXD_FLTR_QW0_FD_SPACE_M;
1080         qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
1081                  ICE_FXD_FLTR_QW0_STAT_CNT_M;
1082         qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
1083                  ICE_FXD_FLTR_QW0_STAT_ENA_M;
1084         qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
1085                  ICE_FXD_FLTR_QW0_EVICT_ENA_M;
1086         qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
1087                  ICE_FXD_FLTR_QW0_TO_Q_M;
1088         qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
1089                  ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
1090         qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
1091                  ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
1092         qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
1093                  ICE_FXD_FLTR_QW0_DROP_M;
1094         qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
1095                  ICE_FXD_FLTR_QW0_FLEX_PRI_M;
1096         qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
1097                  ICE_FXD_FLTR_QW0_FLEX_MDID_M;
1098         qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
1099                  ICE_FXD_FLTR_QW0_FLEX_VAL_M;
1100         fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
1101
1102         /* prep QW1 of FD filter programming desc */
1103         qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
1104                 ICE_FXD_FLTR_QW1_DTYPE_M;
1105         qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
1106                  ICE_FXD_FLTR_QW1_PCMD_M;
1107         qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
1108                  ICE_FXD_FLTR_QW1_PROF_PRI_M;
1109         qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
1110                  ICE_FXD_FLTR_QW1_PROF_M;
1111         qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
1112                  ICE_FXD_FLTR_QW1_FD_VSI_M;
1113         qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
1114                  ICE_FXD_FLTR_QW1_SWAP_M;
1115         qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
1116                  ICE_FXD_FLTR_QW1_FDID_PRI_M;
1117         qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
1118                  ICE_FXD_FLTR_QW1_FDID_MDID_M;
1119         qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
1120                  ICE_FXD_FLTR_QW1_FDID_M;
1121         fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
1122 }
1123
1124 /**
1125  * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
1126  * @hw: pointer to the hardware structure
1127  * @input: filter
1128  * @fdesc: filter descriptor
1129  * @add: if add is true, this is an add operation, false implies delete
1130  */
1131 void
1132 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
1133                        struct ice_fltr_desc *fdesc, bool add)
1134 {
1135         struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
1136
1137         /* set default context info */
1138         ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
1139
1140         /* change sideband filtering values */
1141         fdir_fltr_ctx.fdid = input->fltr_id;
1142         if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
1143                 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
1144                 fdir_fltr_ctx.qindex = 0;
1145         } else if (input->dest_ctl ==
1146                    ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
1147                 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
1148                 fdir_fltr_ctx.qindex = 0;
1149         } else {
1150                 if (input->dest_ctl ==
1151                     ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
1152                         fdir_fltr_ctx.toq = input->q_region;
1153                 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
1154                 fdir_fltr_ctx.qindex = input->q_index;
1155         }
1156         fdir_fltr_ctx.cnt_ena = input->cnt_ena;
1157         fdir_fltr_ctx.cnt_index = input->cnt_index;
1158         fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
1159         fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
1160         if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
1161                 fdir_fltr_ctx.toq_prio = 0;
1162         else
1163                 fdir_fltr_ctx.toq_prio = 3;
1164         fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
1165                 ICE_FXD_FLTR_QW1_PCMD_REMOVE;
1166         fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
1167         fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
1168         fdir_fltr_ctx.comp_report = input->comp_report;
1169         fdir_fltr_ctx.fdid_prio = input->fdid_prio;
1170         fdir_fltr_ctx.desc_prof = 1;
1171         fdir_fltr_ctx.desc_prof_prio = 3;
1172         ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
1173 }
1174
1175 /**
1176  * ice_alloc_fd_res_cntr - obtain counter resource for FD type
1177  * @hw: pointer to the hardware structure
1178  * @cntr_id: returns counter index
1179  */
1180 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
1181 {
1182         return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
1183                                   ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
1184 }
1185
1186 /**
1187  * ice_free_fd_res_cntr - Free counter resource for FD type
1188  * @hw: pointer to the hardware structure
1189  * @cntr_id: counter index to be freed
1190  */
1191 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
1192 {
1193         return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
1194                                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
1195 }
1196
1197 /**
1198  * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
1199  * @hw: pointer to the hardware structure
1200  * @cntr_id: returns counter index
1201  * @num_fltr: number of filter entries to be allocated
1202  */
1203 enum ice_status
1204 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
1205 {
1206         return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
1207                                   ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1208                                   cntr_id);
1209 }
1210
1211 /**
1212  * ice_free_fd_guar_item - Free flow director guaranteed entries
1213  * @hw: pointer to the hardware structure
1214  * @cntr_id: counter index that needs to be freed
1215  * @num_fltr: number of filters to be freed
1216  */
1217 enum ice_status
1218 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
1219 {
1220         return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
1221                                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1222                                  cntr_id);
1223 }
1224
1225 /**
1226  * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
1227  * @hw: pointer to the hardware structure
1228  * @cntr_id: returns counter index
1229  * @num_fltr: number of filter entries to be allocated
1230  */
1231 enum ice_status
1232 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
1233 {
1234         return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
1235                                   ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1236                                   cntr_id);
1237 }
1238
1239 /**
1240  * ice_free_fd_shrd_item - Free flow director shared entries
1241  * @hw: pointer to the hardware structure
1242  * @cntr_id: counter index that needs to be freed
1243  * @num_fltr: number of filters to be freed
1244  */
1245 enum ice_status
1246 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
1247 {
1248         return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
1249                                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1250                                  cntr_id);
1251 }
1252
1253 /**
1254  * ice_get_fdir_cnt_all - get the number of Flow Director filters
1255  * @hw: hardware data structure
1256  *
1257  * Returns the number of filters available on device
1258  */
1259 int ice_get_fdir_cnt_all(struct ice_hw *hw)
1260 {
1261         return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
1262 }
1263
1264 /**
1265  * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
1266  * @pkt: packet buffer
1267  * @offset: offset into buffer
1268  * @addr: IPv6 address to convert and insert into pkt at offset
1269  */
1270 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
1271 {
1272         int idx;
1273
1274         for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
1275                 ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
1276                            sizeof(*addr), ICE_NONDMA_TO_NONDMA);
1277 }
1278
1279 /**
1280  * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
1281  * @pkt: packet buffer
1282  * @offset: offset into buffer
1283  * @data: 8 bit value to convert and insert into pkt at offset
1284  *
1285  * This function is designed for inserting qfi (6 bits) for gtpu.
1286  */
1287 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
1288 {
1289         u8 ret;
1290
1291         ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
1292         ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
1293 }
1294
1295 /**
1296  * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
1297  * @pkt: packet buffer
1298  * @offset: offset into buffer
1299  * @data: 8 bit value to convert and insert into pkt at offset
1300  */
1301 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
1302 {
1303         ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1304 }
1305
1306 /**
1307  * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
1308  * @pkt: packet buffer
1309  * @offset: offset into buffer
1310  * @data: 8 bit value to convert and insert into pkt at offset
1311  *
1312  * This function is designed for inserting Traffic Class (TC) for IPv6,
1313  * since that TC is not aligned in number of bytes. Here we split it out
1314  * into two part and fill each byte with data copy from pkt, then insert
1315  * the two bytes data one by one.
1316  */
1317 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
1318 {
1319         u8 high, low;
1320
1321         high = (data >> 4) + (*(pkt + offset) & 0xF0);
1322         ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
1323
1324         low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
1325         ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
1326 }
1327
1328 /**
1329  * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
1330  * @pkt: packet buffer
1331  * @offset: offset into buffer
1332  * @data: 16 bit value to convert and insert into pkt at offset
1333  */
1334 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
1335 {
1336         ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1337 }
1338
1339 /**
1340  * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
1341  * @pkt: packet buffer
1342  * @offset: offset into buffer
1343  * @data: 32 bit value to convert and insert into pkt at offset
1344  */
1345 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
1346 {
1347         ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1348 }
1349
1350 /**
1351  * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
1352  * @pkt: packet buffer
1353  * @addr: MAC address to convert and insert into pkt at offset
1354  */
1355 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
1356 {
1357         ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
1358 }
1359
1360 /**
1361  * ice_fdir_get_open_tunnel_port
1362  * @hw: pointer to the hardware structure
1363  * @flow: flow ptype
1364  * @port: returns open port
1365  *
1366  * returns an open tunnel port specified for this flow type
1367  */
1368 static enum ice_status
1369 ice_fdir_get_open_tunnel_port(struct ice_hw *hw, enum ice_fltr_ptype flow,
1370                               u16 *port)
1371 {
1372         switch (flow) {
1373         case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1374                 /* eCPRI tunnel */
1375                 if (!ice_get_open_tunnel_port(hw, TNL_ECPRI, port))
1376                         return ICE_ERR_DOES_NOT_EXIST;
1377                 break;
1378         default:
1379                 if (!ice_get_open_tunnel_port(hw, TNL_VXLAN, port) &&
1380                     !ice_get_open_tunnel_port(hw, TNL_GENEVE, port))
1381                         return ICE_ERR_DOES_NOT_EXIST;
1382         }
1383
1384         return ICE_SUCCESS;
1385 }
1386
1387 /**
1388  * ice_fdir_get_gen_prgm_pkt - generate a training packet
1389  * @hw: pointer to the hardware structure
1390  * @input: flow director filter data structure
1391  * @pkt: pointer to return filter packet
1392  * @frag: generate a fragment packet
1393  * @tun: true implies generate a tunnel packet
1394  */
1395 enum ice_status
1396 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
1397                           u8 *pkt, bool frag, bool tun)
1398 {
1399         enum ice_fltr_ptype flow;
1400         u16 tnl_port;
1401         u8 *loc;
1402         u16 idx;
1403
1404         if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1405                 switch (input->ip.v4.proto) {
1406                 case ICE_IP_PROTO_TCP:
1407                         flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
1408                         break;
1409                 case ICE_IP_PROTO_UDP:
1410                         flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
1411                         break;
1412                 case ICE_IP_PROTO_SCTP:
1413                         flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
1414                         break;
1415                 default:
1416                         flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
1417                         break;
1418                 }
1419         } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1420                 switch (input->ip.v6.proto) {
1421                 case ICE_IP_PROTO_TCP:
1422                         flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
1423                         break;
1424                 case ICE_IP_PROTO_UDP:
1425                         flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
1426                         break;
1427                 case ICE_IP_PROTO_SCTP:
1428                         flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
1429                         break;
1430                 default:
1431                         flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
1432                         break;
1433                 }
1434         } else {
1435                 flow = input->flow_type;
1436         }
1437
1438         for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
1439                 if (ice_fdir_pkt[idx].flow == flow)
1440                         break;
1441         if (idx == ICE_FDIR_NUM_PKT)
1442                 return ICE_ERR_PARAM;
1443         if (!tun) {
1444                 ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
1445                            ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
1446                 loc = pkt;
1447         } else {
1448                 if (!ice_fdir_pkt[idx].tun_pkt)
1449                         return ICE_ERR_PARAM;
1450
1451                 switch (flow) {
1452                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4:
1453                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1454                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1455                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6:
1456                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP:
1457                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP:
1458                         ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1459                                    ice_fdir_pkt[idx].tun_pkt_len,
1460                                    ICE_NONDMA_TO_NONDMA);
1461                         loc = &pkt[ICE_FDIR_GTPU_IP_INNER_PKT_OFF];
1462                         break;
1463                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4:
1464                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP:
1465                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP:
1466                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4:
1467                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP:
1468                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP:
1469                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4:
1470                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP:
1471                 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP:
1472                         ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1473                                    ice_fdir_pkt[idx].tun_pkt_len,
1474                                    ICE_NONDMA_TO_NONDMA);
1475                         loc = &pkt[ICE_FDIR_GTPU_EH_INNER_PKT_OFF];
1476                         break;
1477                 default:
1478                         if (ice_fdir_get_open_tunnel_port(hw, flow, &tnl_port))
1479                                 return ICE_ERR_DOES_NOT_EXIST;
1480
1481                         ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1482                                    ice_fdir_pkt[idx].tun_pkt_len,
1483                                    ICE_NONDMA_TO_NONDMA);
1484                         ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
1485                                            HTONS(tnl_port));
1486                         loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
1487                         break;
1488                 }
1489         }
1490
1491         /* Reverse the src and dst, since the HW expects them to be from Tx
1492          * perspective. The input from user is from Rx filter perspective.
1493          */
1494         switch (flow) {
1495         case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
1496                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1497                                    input->ip.v4.src_ip);
1498                 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1499                                    input->ip.v4.src_port);
1500                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1501                                    input->ip.v4.dst_ip);
1502                 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1503                                    input->ip.v4.dst_port);
1504                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1505                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1506                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1507                 if (frag)
1508                         loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
1509                 break;
1510         case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
1511                 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1512                 ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1513                                         input->ext_data_outer.src_mac);
1514                 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1515                                    input->ip_outer.v4.dst_ip);
1516                 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1517                                    input->ip_outer.v4.src_ip);
1518                 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1519                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1520                                    input->ip.v4.src_ip);
1521                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1522                                    input->ip.v4.src_port);
1523                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1524                                    input->ip.v4.dst_ip);
1525                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1526                                    input->ip.v4.dst_port);
1527                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1528                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1529                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1530                 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1531                 break;
1532         case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1533                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1534                                    input->ip.v4.src_ip);
1535                 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1536                                    input->ip.v4.src_port);
1537                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1538                                    input->ip.v4.dst_ip);
1539                 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1540                                    input->ip.v4.dst_port);
1541                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1542                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1543                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1544                 break;
1545         case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1546                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1547                                    input->ip.v4.src_ip);
1548                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1549                                    input->ip.v4.dst_ip);
1550                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1551                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1552                 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1553                                   input->ip.v4.proto);
1554                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1555                 break;
1556         case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
1557                 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1558                 ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac);
1559                 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1560                                    input->ip_outer.v4.dst_ip);
1561                 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1562                                    input->ip_outer.v4.src_ip);
1563                 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1564                 ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1565                                    input->vxlan_data.vni);
1566                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1567                                    input->ip.v4.src_ip);
1568                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1569                                    input->ip.v4.src_port);
1570                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1571                                    input->ip.v4.dst_ip);
1572                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1573                                    input->ip.v4.dst_port);
1574                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1575                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1576                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1577                 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1578                 break;
1579         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU:
1580                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1581                                    input->ip.v4.src_ip);
1582                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1583                                    input->ip.v4.dst_ip);
1584                 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1585                                    input->gtpu_data.teid);
1586                 break;
1587         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4:
1588         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4:
1589         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4:
1590         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4:
1591                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
1592                                    input->ip.v4.src_ip);
1593                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
1594                                    input->ip.v4.dst_ip);
1595                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
1596                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
1597                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_PROTO_OFFSET,
1598                                   input->ip.v4.proto);
1599                 break;
1600         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH:
1601         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW:
1602         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP:
1603                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1604                                    input->ip.v4.src_ip);
1605                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1606                                    input->ip.v4.dst_ip);
1607                 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1608                                    input->gtpu_data.teid);
1609                 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1610                                       input->gtpu_data.qfi);
1611                 break;
1612         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1613         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP:
1614         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP:
1615         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP:
1616                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
1617                                    input->ip.v4.src_ip);
1618                 ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_DST_PORT_OFFSET,
1619                                    input->ip.v4.src_port);
1620                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
1621                                    input->ip.v4.dst_ip);
1622                 ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_SRC_PORT_OFFSET,
1623                                    input->ip.v4.dst_port);
1624                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
1625                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
1626                 break;
1627         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1628         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP:
1629         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP:
1630         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP:
1631                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
1632                                    input->ip.v4.src_ip);
1633                 ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_DST_PORT_OFFSET,
1634                                    input->ip.v4.src_port);
1635                 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
1636                                    input->ip.v4.dst_ip);
1637                 ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_SRC_PORT_OFFSET,
1638                                    input->ip.v4.dst_port);
1639                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
1640                 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
1641                 break;
1642         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6:
1643                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
1644                                          input->ip.v6.src_ip);
1645                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
1646                                          input->ip.v6.dst_ip);
1647                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
1648                 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
1649                 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_PROTO_OFFSET,
1650                                   input->ip.v6.proto);
1651                 break;
1652         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP:
1653                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
1654                                          input->ip.v6.src_ip);
1655                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
1656                                          input->ip.v6.dst_ip);
1657                 ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_DST_PORT_OFFSET,
1658                                    input->ip.v6.src_port);
1659                 ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_SRC_PORT_OFFSET,
1660                                    input->ip.v6.dst_port);
1661                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
1662                 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
1663                 break;
1664         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP:
1665                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
1666                                          input->ip.v6.src_ip);
1667                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
1668                                          input->ip.v6.dst_ip);
1669                 ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_DST_PORT_OFFSET,
1670                                    input->ip.v6.src_port);
1671                 ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_SRC_PORT_OFFSET,
1672                                    input->ip.v6.dst_port);
1673                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
1674                 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
1675                 break;
1676         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU:
1677         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER:
1678                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1679                                          input->ip.v6.src_ip);
1680                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1681                                          input->ip.v6.dst_ip);
1682                 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1683                                    input->gtpu_data.teid);
1684                 break;
1685         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH:
1686         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW:
1687         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP:
1688         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
1689                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1690                                          input->ip.v6.src_ip);
1691                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1692                                          input->ip.v6.dst_ip);
1693                 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1694                                    input->gtpu_data.teid);
1695                 ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
1696                                       input->gtpu_data.qfi);
1697                 break;
1698         case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1699                 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1700                                    input->l2tpv3_data.session_id);
1701                 break;
1702         case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1703                 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1704                                    input->l2tpv3_data.session_id);
1705                 break;
1706         case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1707                 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1708                                    input->ip.v4.sec_parm_idx);
1709                 break;
1710         case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1711                 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1712                                    input->ip.v6.sec_parm_idx);
1713                 break;
1714         case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1715                 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1716                                    input->ip.v4.sec_parm_idx);
1717                 break;
1718         case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1719                 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1720                                    input->ip.v6.sec_parm_idx);
1721                 break;
1722         case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1723                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1724                                    input->ip.v4.src_ip);
1725                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1726                                    input->ip.v4.dst_ip);
1727                 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1728                                    input->ip.v4.sec_parm_idx);
1729                 break;
1730         case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1731                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1732                                          input->ip.v6.src_ip);
1733                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1734                                          input->ip.v6.dst_ip);
1735                 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1736                                    input->ip.v6.sec_parm_idx);
1737                 break;
1738         case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1739         case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1740                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1741                                    input->ip.v4.dst_port);
1742                 break;
1743         case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1744         case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1745                 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1746                                    input->ip.v6.dst_port);
1747                 break;
1748         case ICE_FLTR_PTYPE_NON_IP_L2:
1749                 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1750                                    input->ext_data.ether_type);
1751                 break;
1752         case ICE_FLTR_PTYPE_NONF_ECPRI_TP0:
1753                 ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET,
1754                                    input->ecpri_data.pc_id);
1755                 break;
1756         case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1757                 /* Use pkt instead of loc, since PC_ID is in outer part */
1758                 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET,
1759                                    input->ecpri_data.pc_id);
1760                 break;
1761         case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1762                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1763                                          input->ip.v6.src_ip);
1764                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1765                                          input->ip.v6.dst_ip);
1766                 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1767                                    input->ip.v6.src_port);
1768                 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1769                                    input->ip.v6.dst_port);
1770                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1771                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1772                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1773                 break;
1774         case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1775                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1776                                          input->ip.v6.src_ip);
1777                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1778                                          input->ip.v6.dst_ip);
1779                 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1780                                    input->ip.v6.src_port);
1781                 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1782                                    input->ip.v6.dst_port);
1783                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1784                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1785                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1786                 break;
1787         case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1788                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1789                                          input->ip.v6.src_ip);
1790                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1791                                          input->ip.v6.dst_ip);
1792                 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1793                                    input->ip.v6.src_port);
1794                 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1795                                    input->ip.v6.dst_port);
1796                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1797                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1798                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1799                 break;
1800         case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1801                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1802                                          input->ip.v6.src_ip);
1803                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1804                                          input->ip.v6.dst_ip);
1805                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1806                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1807                 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1808                                   input->ip.v6.proto);
1809                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1810                 break;
1811         default:
1812                 return ICE_ERR_PARAM;
1813         }
1814
1815         if (input->flex_fltr)
1816                 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1817
1818         return ICE_SUCCESS;
1819 }
1820
1821 /**
1822  * ice_fdir_get_prgm_pkt - generate a training packet
1823  * @input: flow director filter data structure
1824  * @pkt: pointer to return filter packet
1825  * @frag: generate a fragment packet
1826  */
1827 enum ice_status
1828 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1829 {
1830         return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1831 }
1832
1833 /**
1834  * ice_fdir_has_frag - does flow type have 2 ptypes
1835  * @flow: flow ptype
1836  *
1837  * returns true is there is a fragment packet for this ptype
1838  */
1839 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1840 {
1841         if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1842                 return true;
1843         else
1844                 return false;
1845 }
1846
1847 /**
1848  * ice_fdir_find_by_idx - find filter with idx
1849  * @hw: pointer to hardware structure
1850  * @fltr_idx: index to find.
1851  *
1852  * Returns pointer to filter if found or null
1853  */
1854 struct ice_fdir_fltr *
1855 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1856 {
1857         struct ice_fdir_fltr *rule;
1858
1859         LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1860                             fltr_node) {
1861                 /* rule ID found in the list */
1862                 if (fltr_idx == rule->fltr_id)
1863                         return rule;
1864                 if (fltr_idx < rule->fltr_id)
1865                         break;
1866         }
1867         return NULL;
1868 }
1869
1870 /**
1871  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1872  * @hw: hardware structure
1873  * @fltr: filter node to add to structure
1874  */
1875 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1876 {
1877         struct ice_fdir_fltr *rule, *parent = NULL;
1878
1879         LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1880                             fltr_node) {
1881                 /* rule ID found or pass its spot in the list */
1882                 if (rule->fltr_id >= fltr->fltr_id)
1883                         break;
1884                 parent = rule;
1885         }
1886
1887         if (parent)
1888                 LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1889         else
1890                 LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1891 }
1892
1893 /**
1894  * ice_fdir_update_cntrs - increment / decrement filter counter
1895  * @hw: pointer to hardware structure
1896  * @flow: filter flow type
1897  * @acl_fltr: true indicates an ACL filter
1898  * @add: true implies filters added
1899  */
1900 void
1901 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1902                       bool acl_fltr, bool add)
1903 {
1904         int incr;
1905
1906         incr = add ? 1 : -1;
1907         hw->fdir_active_fltr += incr;
1908         if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1909                 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1910         } else {
1911                 if (acl_fltr)
1912                         hw->acl_fltr_cnt[flow] += incr;
1913                 else
1914                         hw->fdir_fltr_cnt[flow] += incr;
1915         }
1916 }
1917
1918 /**
1919  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1920  * @a: IP v6 address
1921  * @b: IP v6 address
1922  *
1923  * Returns 0 on equal, returns non-0 if different
1924  */
1925 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1926 {
1927         return memcmp(a, b, 4 * sizeof(__be32));
1928 }
1929
1930 /**
1931  * ice_fdir_comp_rules - compare 2 filters
1932  * @a: a Flow Director filter data structure
1933  * @b: a Flow Director filter data structure
1934  * @v6: bool true if v6 filter
1935  *
1936  * Returns true if the filters match
1937  */
1938 static bool
1939 ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
1940 {
1941         enum ice_fltr_ptype flow_type = a->flow_type;
1942
1943         /* The calling function already checks that the two filters have the
1944          * same flow_type.
1945          */
1946         if (!v6) {
1947                 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1948                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1949                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1950                         if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1951                             a->ip.v4.src_ip == b->ip.v4.src_ip &&
1952                             a->ip.v4.dst_port == b->ip.v4.dst_port &&
1953                             a->ip.v4.src_port == b->ip.v4.src_port)
1954                                 return true;
1955                 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1956                         if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1957                             a->ip.v4.src_ip == b->ip.v4.src_ip &&
1958                             a->ip.v4.l4_header == b->ip.v4.l4_header &&
1959                             a->ip.v4.proto == b->ip.v4.proto &&
1960                             a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1961                             a->ip.v4.tos == b->ip.v4.tos)
1962                                 return true;
1963                 }
1964         } else {
1965                 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1966                     flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1967                     flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1968                         if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1969                             a->ip.v6.src_port == b->ip.v6.src_port &&
1970                             !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1971                                                b->ip.v6.dst_ip) &&
1972                             !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1973                                                b->ip.v6.src_ip))
1974                                 return true;
1975                 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1976                         if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1977                             a->ip.v6.src_port == b->ip.v6.src_port)
1978                                 return true;
1979                 }
1980         }
1981
1982         return false;
1983 }
1984
1985 /**
1986  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1987  * @hw: hardware data structure
1988  * @input: Flow Director filter data structure
1989  *
1990  * Returns true if the filter is found in the list
1991  */
1992 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1993 {
1994         struct ice_fdir_fltr *rule;
1995         bool ret = false;
1996
1997         LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1998                             fltr_node) {
1999                 enum ice_fltr_ptype flow_type;
2000
2001                 if (rule->flow_type != input->flow_type)
2002                         continue;
2003
2004                 flow_type = input->flow_type;
2005                 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
2006                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
2007                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
2008                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
2009                         ret = ice_fdir_comp_rules(rule, input, false);
2010                 else
2011                         ret = ice_fdir_comp_rules(rule, input, true);
2012                 if (ret) {
2013                         if (rule->fltr_id == input->fltr_id &&
2014                             rule->q_index != input->q_index)
2015                                 ret = false;
2016                         else
2017                                 break;
2018                 }
2019         }
2020
2021         return ret;
2022 }
2023
2024 /**
2025  * ice_clear_pf_fd_table - admin command to clear FD table for PF
2026  * @hw: hardware data structure
2027  *
2028  * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
2029  */
2030 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
2031 {
2032         struct ice_aqc_clear_fd_table *cmd;
2033         struct ice_aq_desc desc;
2034
2035         cmd = &desc.params.clear_fd_table;
2036         ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
2037         cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
2038         /* vsi_index must be 0 to clear FD table for a PF */
2039         cmd->vsi_index = CPU_TO_LE16(0);
2040
2041         return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
2042 }