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