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