ecdebd38494d30eb6f88e7832ab515fb39002339
[dpdk.git] / drivers / net / ice / base / ice_fdir.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2001-2020 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_gtpu4_pkt[] = {
46         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
48         0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
49         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50         0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
51         0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
52         0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
53         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
54         0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
55         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57         0x00, 0x00,
58 };
59
60 static const u8 ice_fdir_tcp4_gtpu4_pkt[] = {
61         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
63         0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
64         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65         0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
66         0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
67         0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
68         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
69         0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06,
70         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74 };
75
76 static const u8 ice_fdir_icmp4_gtpu4_pkt[] = {
77         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
78         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
79         0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
80         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
81         0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
82         0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
83         0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
84         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
85         0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01,
86         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88         0x00, 0x00,
89 };
90
91 static const u8 ice_fdir_ipv4_gtpu4_pkt[] = {
92         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
94         0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
95         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96         0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
97         0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
98         0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
99         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
100         0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
101         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102         0x00, 0x00,
103 };
104
105 static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
106         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
108         0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
109         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112 };
113
114 static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
115         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
117         0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00,
118         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123         0x00, 0x00,
124 };
125
126 static const u8 ice_fdir_ipv4_esp_pkt[] = {
127         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
129         0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
130         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
131         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132         0x00, 0x00
133 };
134
135 static const u8 ice_fdir_ipv6_esp_pkt[] = {
136         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
137         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
138         0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00,
139         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
143         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
144 };
145
146 static const u8 ice_fdir_ipv4_ah_pkt[] = {
147         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
149         0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
150         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153         0x00, 0x00
154 };
155
156 static const u8 ice_fdir_ipv6_ah_pkt[] = {
157         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
159         0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00,
160         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166 };
167
168 static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
169         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
171         0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
172         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173         0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
174         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175         0x00, 0x00,
176 };
177
178 static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
179         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
181         0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
182         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
185         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
186         0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
187 };
188
189 static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
190         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
192         0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
193         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194         0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
195         0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
196         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197         0x00, 0x00,
198 };
199
200 static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
201         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
203         0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
204         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205         0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
206         0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
207         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208         0x00, 0x00,
209 };
210
211 static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
212         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
214         0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
215         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
219         0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
220         0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
221         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
222 };
223
224 static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
225         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
227         0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
228         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
232         0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
233         0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 };
236
237 static const u8 ice_fdir_non_ip_l2_pkt[] = {
238         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241 };
242
243 static const u8 ice_fdir_tcpv6_pkt[] = {
244         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
246         0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
247         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252         0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
253         0x00, 0x00,
254 };
255
256 static const u8 ice_fdir_udpv6_pkt[] = {
257         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
259         0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
260         0x00, 0x00, 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, 0x08, 0x00, 0x00,
265 };
266
267 static const u8 ice_fdir_sctpv6_pkt[] = {
268         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
269         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
270         0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
271         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
272         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
274         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
276         0x00, 0x00,
277 };
278
279 static const u8 ice_fdir_ipv6_pkt[] = {
280         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281         0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
282         0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
283         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287 };
288
289 static const u8 ice_fdir_tcp4_tun_pkt[] = {
290         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
292         0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
293         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
296         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
298         0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
299         0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302         0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
303 };
304
305 static const u8 ice_fdir_udp4_tun_pkt[] = {
306         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
308         0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
309         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
312         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
314         0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
315         0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317         0x00, 0x00, 0x00, 0x00,
318 };
319
320 static const u8 ice_fdir_sctp4_tun_pkt[] = {
321         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
323         0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
324         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
325         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
327         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
328         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
329         0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
330         0x40, 0x84, 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 };
334
335 static const u8 ice_fdir_ip4_tun_pkt[] = {
336         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
338         0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
339         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
342         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
344         0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
345         0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346         0x00, 0x00, 0x00, 0x00,
347 };
348
349 static const u8 ice_fdir_tcp6_tun_pkt[] = {
350         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
352         0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
353         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
356         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
358         0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
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, 0x00, 0x00,
363         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364         0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
365         0x00, 0x00, 0x00, 0x00,
366 };
367
368 static const u8 ice_fdir_udp6_tun_pkt[] = {
369         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
370         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
371         0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
372         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
375         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
377         0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
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, 0x00, 0x00,
381         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
383 };
384
385 static const u8 ice_fdir_sctp6_tun_pkt[] = {
386         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
387         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
388         0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
389         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
392         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
394         0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
395         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
399         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
400         0x00, 0x00, 0x00, 0x00,
401 };
402
403 static const u8 ice_fdir_ip6_tun_pkt[] = {
404         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
405         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
406         0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
407         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409         0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
410         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
412         0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
413         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
416         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
417 };
418
419 /* Flow Director no-op training packet table */
420 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
421         {
422                 ICE_FLTR_PTYPE_NONF_IPV4_TCP,
423                 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
424                 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
425         },
426         {
427                 ICE_FLTR_PTYPE_NONF_IPV4_UDP,
428                 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
429                 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
430         },
431         {
432                 ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
433                 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
434                 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
435         },
436         {
437                 ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
438                 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
439                 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
440         },
441         {
442                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
443                 sizeof(ice_fdir_udp4_gtpu4_pkt),
444                 ice_fdir_udp4_gtpu4_pkt,
445                 sizeof(ice_fdir_udp4_gtpu4_pkt),
446                 ice_fdir_udp4_gtpu4_pkt,
447         },
448         {
449                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
450                 sizeof(ice_fdir_tcp4_gtpu4_pkt),
451                 ice_fdir_tcp4_gtpu4_pkt,
452                 sizeof(ice_fdir_tcp4_gtpu4_pkt),
453                 ice_fdir_tcp4_gtpu4_pkt,
454         },
455         {
456                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
457                 sizeof(ice_fdir_icmp4_gtpu4_pkt),
458                 ice_fdir_icmp4_gtpu4_pkt,
459                 sizeof(ice_fdir_icmp4_gtpu4_pkt),
460                 ice_fdir_icmp4_gtpu4_pkt,
461         },
462         {
463                 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
464                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
465                 ice_fdir_ipv4_gtpu4_pkt,
466                 sizeof(ice_fdir_ipv4_gtpu4_pkt),
467                 ice_fdir_ipv4_gtpu4_pkt,
468         },
469         {
470                 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
471                 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
472                 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
473         },
474         {
475                 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
476                 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
477                 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
478         },
479         {
480                 ICE_FLTR_PTYPE_NONF_IPV4_ESP,
481                 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
482                 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
483         },
484         {
485                 ICE_FLTR_PTYPE_NONF_IPV6_ESP,
486                 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
487                 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
488         },
489         {
490                 ICE_FLTR_PTYPE_NONF_IPV4_AH,
491                 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
492                 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
493         },
494         {
495                 ICE_FLTR_PTYPE_NONF_IPV6_AH,
496                 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
497                 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
498         },
499         {
500                 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
501                 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
502                 ice_fdir_ipv4_nat_t_esp_pkt,
503                 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
504                 ice_fdir_ipv4_nat_t_esp_pkt,
505         },
506         {
507                 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
508                 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
509                 ice_fdir_ipv6_nat_t_esp_pkt,
510                 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
511                 ice_fdir_ipv6_nat_t_esp_pkt,
512         },
513         {
514                 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
515                 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
516                 ice_fdir_ipv4_pfcp_node_pkt,
517                 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
518                 ice_fdir_ipv4_pfcp_node_pkt,
519         },
520         {
521                 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
522                 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
523                 ice_fdir_ipv4_pfcp_session_pkt,
524                 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
525                 ice_fdir_ipv4_pfcp_session_pkt,
526         },
527         {
528                 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
529                 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
530                 ice_fdir_ipv6_pfcp_node_pkt,
531                 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
532                 ice_fdir_ipv6_pfcp_node_pkt,
533         },
534         {
535                 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
536                 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
537                 ice_fdir_ipv6_pfcp_session_pkt,
538                 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
539                 ice_fdir_ipv6_pfcp_session_pkt,
540         },
541         {
542                 ICE_FLTR_PTYPE_NON_IP_L2,
543                 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
544                 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
545         },
546         {
547                 ICE_FLTR_PTYPE_NONF_IPV6_TCP,
548                 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
549                 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
550         },
551         {
552                 ICE_FLTR_PTYPE_NONF_IPV6_UDP,
553                 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
554                 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
555         },
556         {
557                 ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
558                 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
559                 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
560         },
561         {
562                 ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
563                 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
564                 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
565         },
566 };
567
568 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
569
570 /**
571  * ice_set_dflt_val_fd_desc
572  * @fd_fltr_ctx: pointer to fd filter descriptor
573  */
574 void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
575 {
576         fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
577         fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
578         fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
579         fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
580         fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
581         fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
582         fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
583         fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
584         fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
585         fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
586         fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
587         fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
588         fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
589         fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
590         fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
591         fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
592         fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
593         fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
594         fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
595 }
596
597 /**
598  * ice_set_fd_desc_val
599  * @ctx: pointer to fd filter descriptor context
600  * @fdir_desc: populated with fd filter descriptor values
601  */
602 static void
603 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
604                     struct ice_fltr_desc *fdir_desc)
605 {
606         u64 qword;
607
608         /* prep QW0 of FD filter programming desc */
609         qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
610                 ICE_FXD_FLTR_QW0_QINDEX_M;
611         qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
612                  ICE_FXD_FLTR_QW0_COMP_Q_M;
613         qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
614                  ICE_FXD_FLTR_QW0_COMP_REPORT_M;
615         qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
616                  ICE_FXD_FLTR_QW0_FD_SPACE_M;
617         qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
618                  ICE_FXD_FLTR_QW0_STAT_CNT_M;
619         qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
620                  ICE_FXD_FLTR_QW0_STAT_ENA_M;
621         qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
622                  ICE_FXD_FLTR_QW0_EVICT_ENA_M;
623         qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
624                  ICE_FXD_FLTR_QW0_TO_Q_M;
625         qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
626                  ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
627         qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
628                  ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
629         qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
630                  ICE_FXD_FLTR_QW0_DROP_M;
631         qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
632                  ICE_FXD_FLTR_QW0_FLEX_PRI_M;
633         qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
634                  ICE_FXD_FLTR_QW0_FLEX_MDID_M;
635         qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
636                  ICE_FXD_FLTR_QW0_FLEX_VAL_M;
637         fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
638
639         /* prep QW1 of FD filter programming desc */
640         qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
641                 ICE_FXD_FLTR_QW1_DTYPE_M;
642         qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
643                  ICE_FXD_FLTR_QW1_PCMD_M;
644         qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
645                  ICE_FXD_FLTR_QW1_PROF_PRI_M;
646         qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
647                  ICE_FXD_FLTR_QW1_PROF_M;
648         qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
649                  ICE_FXD_FLTR_QW1_FD_VSI_M;
650         qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
651                  ICE_FXD_FLTR_QW1_SWAP_M;
652         qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
653                  ICE_FXD_FLTR_QW1_FDID_PRI_M;
654         qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
655                  ICE_FXD_FLTR_QW1_FDID_MDID_M;
656         qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
657                  ICE_FXD_FLTR_QW1_FDID_M;
658         fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
659 }
660
661 /**
662  * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
663  * @hw: pointer to the hardware structure
664  * @input: filter
665  * @fdesc: filter descriptor
666  * @add: if add is true, this is an add operation, false implies delete
667  */
668 void
669 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
670                        struct ice_fltr_desc *fdesc, bool add)
671 {
672         struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
673
674         /* set default context info */
675         ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
676
677         /* change sideband filtering values */
678         fdir_fltr_ctx.fdid = input->fltr_id;
679         if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
680                 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
681                 fdir_fltr_ctx.qindex = 0;
682         } else if (input->dest_ctl ==
683                    ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
684                 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
685                 fdir_fltr_ctx.qindex = 0;
686         } else {
687                 if (input->dest_ctl ==
688                     ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
689                         fdir_fltr_ctx.toq = input->q_region;
690                 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
691                 fdir_fltr_ctx.qindex = input->q_index;
692         }
693         fdir_fltr_ctx.cnt_ena = input->cnt_ena;
694         fdir_fltr_ctx.cnt_index = input->cnt_index;
695         fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
696         fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
697         if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
698                 fdir_fltr_ctx.toq_prio = 0;
699         else
700                 fdir_fltr_ctx.toq_prio = 3;
701         fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
702                 ICE_FXD_FLTR_QW1_PCMD_REMOVE;
703         fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
704         fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
705         fdir_fltr_ctx.comp_report = input->comp_report;
706         fdir_fltr_ctx.fdid_prio = input->fdid_prio;
707         fdir_fltr_ctx.desc_prof = 1;
708         fdir_fltr_ctx.desc_prof_prio = 3;
709         ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
710 }
711
712 /**
713  * ice_alloc_fd_res_cntr - obtain counter resource for FD type
714  * @hw: pointer to the hardware structure
715  * @cntr_id: returns counter index
716  */
717 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
718 {
719         return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
720                                   ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
721 }
722
723 /**
724  * ice_free_fd_res_cntr - Free counter resource for FD type
725  * @hw: pointer to the hardware structure
726  * @cntr_id: counter index to be freed
727  */
728 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
729 {
730         return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
731                                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
732 }
733
734 /**
735  * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
736  * @hw: pointer to the hardware structure
737  * @cntr_id: returns counter index
738  * @num_fltr: number of filter entries to be allocated
739  */
740 enum ice_status
741 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
742 {
743         return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
744                                   ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
745                                   cntr_id);
746 }
747
748 /**
749  * ice_free_fd_guar_item - Free flow director guaranteed entries
750  * @hw: pointer to the hardware structure
751  * @cntr_id: counter index that needs to be freed
752  * @num_fltr: number of filters to be freed
753  */
754 enum ice_status
755 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
756 {
757         return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
758                                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
759                                  cntr_id);
760 }
761
762 /**
763  * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
764  * @hw: pointer to the hardware structure
765  * @cntr_id: returns counter index
766  * @num_fltr: number of filter entries to be allocated
767  */
768 enum ice_status
769 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
770 {
771         return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
772                                   ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
773                                   cntr_id);
774 }
775
776 /**
777  * ice_free_fd_shrd_item - Free flow director shared entries
778  * @hw: pointer to the hardware structure
779  * @cntr_id: counter index that needs to be freed
780  * @num_fltr: number of filters to be freed
781  */
782 enum ice_status
783 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
784 {
785         return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
786                                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
787                                  cntr_id);
788 }
789
790 /**
791  * ice_get_fdir_cnt_all - get the number of Flow Director filters
792  * @hw: hardware data structure
793  *
794  * Returns the number of filters available on device
795  */
796 int ice_get_fdir_cnt_all(struct ice_hw *hw)
797 {
798         return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
799 }
800
801 /**
802  * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
803  * @pkt: packet buffer
804  * @offset: offset into buffer
805  * @addr: IPv6 address to convert and insert into pkt at offset
806  */
807 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
808 {
809         int idx;
810
811         for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
812                 ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
813                            sizeof(*addr), ICE_NONDMA_TO_NONDMA);
814 }
815
816 /**
817  * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
818  * @pkt: packet buffer
819  * @offset: offset into buffer
820  * @data: 8 bit value to convert and insert into pkt at offset
821  *
822  * This function is designed for inserting qfi (6 bits) for gtpu.
823  */
824 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
825 {
826         u8 ret;
827
828         ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
829         ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
830 }
831
832 /**
833  * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
834  * @pkt: packet buffer
835  * @offset: offset into buffer
836  * @data: 8 bit value to convert and insert into pkt at offset
837  */
838 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
839 {
840         ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
841 }
842
843 /**
844  * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
845  * @pkt: packet buffer
846  * @offset: offset into buffer
847  * @data: 8 bit value to convert and insert into pkt at offset
848  *
849  * This function is designed for inserting Traffic Class (TC) for IPv6,
850  * since that TC is not aligned in number of bytes. Here we split it out
851  * into two part and fill each byte with data copy from pkt, then insert
852  * the two bytes data one by one.
853  */
854 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
855 {
856         u8 high, low;
857
858         high = (data >> 4) + (*(pkt + offset) & 0xF0);
859         ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
860
861         low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
862         ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
863 }
864
865 /**
866  * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
867  * @pkt: packet buffer
868  * @offset: offset into buffer
869  * @data: 16 bit value to convert and insert into pkt at offset
870  */
871 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
872 {
873         ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
874 }
875
876 /**
877  * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
878  * @pkt: packet buffer
879  * @offset: offset into buffer
880  * @data: 32 bit value to convert and insert into pkt at offset
881  */
882 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
883 {
884         ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
885 }
886
887 /**
888  * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
889  * @pkt: packet buffer
890  * @addr: MAC address to convert and insert into pkt at offset
891  */
892 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
893 {
894         ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
895 }
896
897 /**
898  * ice_fdir_get_gen_prgm_pkt - generate a training packet
899  * @hw: pointer to the hardware structure
900  * @input: flow director filter data structure
901  * @pkt: pointer to return filter packet
902  * @frag: generate a fragment packet
903  * @tun: true implies generate a tunnel packet
904  */
905 enum ice_status
906 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
907                           u8 *pkt, bool frag, bool tun)
908 {
909         enum ice_fltr_ptype flow;
910         u16 tnl_port;
911         u8 *loc;
912         u16 idx;
913
914         if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
915                 switch (input->ip.v4.proto) {
916                 case ICE_IP_PROTO_TCP:
917                         flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
918                         break;
919                 case ICE_IP_PROTO_UDP:
920                         flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
921                         break;
922                 case ICE_IP_PROTO_SCTP:
923                         flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
924                         break;
925                 default:
926                         flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
927                         break;
928                 }
929         } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
930                 switch (input->ip.v6.proto) {
931                 case ICE_IP_PROTO_TCP:
932                         flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
933                         break;
934                 case ICE_IP_PROTO_UDP:
935                         flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
936                         break;
937                 case ICE_IP_PROTO_SCTP:
938                         flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
939                         break;
940                 default:
941                         flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
942                         break;
943                 }
944         } else {
945                 flow = input->flow_type;
946         }
947
948         for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
949                 if (ice_fdir_pkt[idx].flow == flow)
950                         break;
951         if (idx == ICE_FDIR_NUM_PKT)
952                 return ICE_ERR_PARAM;
953         if (!tun) {
954                 ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
955                            ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
956                 loc = pkt;
957         } else {
958                 if (!ice_get_open_tunnel_port(hw, TNL_ALL, &tnl_port))
959                         return ICE_ERR_DOES_NOT_EXIST;
960                 if (!ice_fdir_pkt[idx].tun_pkt)
961                         return ICE_ERR_PARAM;
962                 ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
963                            ice_fdir_pkt[idx].tun_pkt_len, ICE_NONDMA_TO_NONDMA);
964                 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
965                                    HTONS(tnl_port));
966                 loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
967         }
968
969         /* Reverse the src and dst, since the HW expects them to be from Tx
970          * perspective. The input from user is from Rx filter perspective.
971          */
972         switch (flow) {
973         case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
974                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
975                                    input->ip.v4.src_ip);
976                 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
977                                    input->ip.v4.src_port);
978                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
979                                    input->ip.v4.dst_ip);
980                 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
981                                    input->ip.v4.dst_port);
982                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
983                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
984                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
985                 if (frag)
986                         loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
987                 break;
988         case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
989                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
990                                    input->ip.v4.src_ip);
991                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
992                                    input->ip.v4.src_port);
993                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
994                                    input->ip.v4.dst_ip);
995                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
996                                    input->ip.v4.dst_port);
997                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
998                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
999                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1000                 break;
1001         case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1002                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1003                                    input->ip.v4.src_ip);
1004                 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1005                                    input->ip.v4.src_port);
1006                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1007                                    input->ip.v4.dst_ip);
1008                 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1009                                    input->ip.v4.dst_port);
1010                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1011                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1012                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1013                 break;
1014         case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1015                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1016                                    input->ip.v4.src_ip);
1017                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1018                                    input->ip.v4.dst_ip);
1019                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1020                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1021                 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1022                                   input->ip.v4.proto);
1023                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1024                 break;
1025         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1026         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1027         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
1028         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
1029                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1030                                    input->ip.v4.src_ip);
1031                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1032                                    input->ip.v4.dst_ip);
1033                 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1034                                    input->gtpu_data.teid);
1035                 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1036                                       input->gtpu_data.qfi);
1037                 break;
1038         case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1039                 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1040                                    input->l2tpv3_data.session_id);
1041                 break;
1042         case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1043                 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1044                                    input->l2tpv3_data.session_id);
1045                 break;
1046         case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1047                 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1048                                    input->ip.v4.sec_parm_idx);
1049                 break;
1050         case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1051                 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1052                                    input->ip.v6.sec_parm_idx);
1053                 break;
1054         case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1055                 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1056                                    input->ip.v4.sec_parm_idx);
1057                 break;
1058         case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1059                 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1060                                    input->ip.v6.sec_parm_idx);
1061                 break;
1062         case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1063                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1064                                    input->ip.v4.src_ip);
1065                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1066                                    input->ip.v4.dst_ip);
1067                 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1068                                    input->ip.v4.sec_parm_idx);
1069                 break;
1070         case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1071                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1072                                          input->ip.v6.src_ip);
1073                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1074                                          input->ip.v6.dst_ip);
1075                 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1076                                    input->ip.v6.sec_parm_idx);
1077                 break;
1078         case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1079         case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1080                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1081                                    input->ip.v4.dst_port);
1082                 break;
1083         case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1084         case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1085                 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1086                                    input->ip.v6.dst_port);
1087                 break;
1088         case ICE_FLTR_PTYPE_NON_IP_L2:
1089                 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1090                                    input->ext_data.ether_type);
1091                 break;
1092         case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1093                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1094                                          input->ip.v6.src_ip);
1095                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1096                                          input->ip.v6.dst_ip);
1097                 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1098                                    input->ip.v6.src_port);
1099                 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1100                                    input->ip.v6.dst_port);
1101                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1102                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1103                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1104                 break;
1105         case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1106                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1107                                          input->ip.v6.src_ip);
1108                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1109                                          input->ip.v6.dst_ip);
1110                 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1111                                    input->ip.v6.src_port);
1112                 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1113                                    input->ip.v6.dst_port);
1114                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1115                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1116                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1117                 break;
1118         case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1119                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1120                                          input->ip.v6.src_ip);
1121                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1122                                          input->ip.v6.dst_ip);
1123                 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1124                                    input->ip.v6.src_port);
1125                 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1126                                    input->ip.v6.dst_port);
1127                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1128                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1129                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1130                 break;
1131         case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1132                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1133                                          input->ip.v6.src_ip);
1134                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1135                                          input->ip.v6.dst_ip);
1136                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1137                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1138                 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1139                                   input->ip.v6.proto);
1140                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1141                 break;
1142         default:
1143                 return ICE_ERR_PARAM;
1144         }
1145
1146         if (input->flex_fltr)
1147                 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1148
1149         return ICE_SUCCESS;
1150 }
1151
1152 /**
1153  * ice_fdir_get_prgm_pkt - generate a training packet
1154  * @input: flow director filter data structure
1155  * @pkt: pointer to return filter packet
1156  * @frag: generate a fragment packet
1157  */
1158 enum ice_status
1159 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1160 {
1161         return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1162 }
1163
1164 /**
1165  * ice_fdir_has_frag - does flow type have 2 ptypes
1166  * @flow: flow ptype
1167  *
1168  * returns true is there is a fragment packet for this ptype
1169  */
1170 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1171 {
1172         if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1173                 return true;
1174         else
1175                 return false;
1176 }
1177
1178 /**
1179  * ice_fdir_find_by_idx - find filter with idx
1180  * @hw: pointer to hardware structure
1181  * @fltr_idx: index to find.
1182  *
1183  * Returns pointer to filter if found or null
1184  */
1185 struct ice_fdir_fltr *
1186 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1187 {
1188         struct ice_fdir_fltr *rule;
1189
1190         LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1191                             fltr_node) {
1192                 /* rule ID found in the list */
1193                 if (fltr_idx == rule->fltr_id)
1194                         return rule;
1195                 if (fltr_idx < rule->fltr_id)
1196                         break;
1197         }
1198         return NULL;
1199 }
1200
1201 /**
1202  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1203  * @hw: hardware structure
1204  * @fltr: filter node to add to structure
1205  */
1206 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1207 {
1208         struct ice_fdir_fltr *rule, *parent = NULL;
1209
1210         LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1211                             fltr_node) {
1212                 /* rule ID found or pass its spot in the list */
1213                 if (rule->fltr_id >= fltr->fltr_id)
1214                         break;
1215                 parent = rule;
1216         }
1217
1218         if (parent)
1219                 LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1220         else
1221                 LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1222 }
1223
1224 /**
1225  * ice_fdir_update_cntrs - increment / decrement filter counter
1226  * @hw: pointer to hardware structure
1227  * @flow: filter flow type
1228  * @acl_fltr: true indicates an ACL filter
1229  * @add: true implies filters added
1230  */
1231 void
1232 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1233                       bool acl_fltr, bool add)
1234 {
1235         int incr;
1236
1237         incr = add ? 1 : -1;
1238         hw->fdir_active_fltr += incr;
1239         if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1240                 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1241         } else {
1242                 if (acl_fltr)
1243                         hw->acl_fltr_cnt[flow] += incr;
1244                 else
1245                         hw->fdir_fltr_cnt[flow] += incr;
1246         }
1247 }
1248
1249 /**
1250  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1251  * @a: IP v6 address
1252  * @b: IP v6 address
1253  *
1254  * Returns 0 on equal, returns non-0 if different
1255  */
1256 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1257 {
1258         return memcmp(a, b, 4 * sizeof(__be32));
1259 }
1260
1261 /**
1262  * ice_fdir_comp_rules - compare 2 filters
1263  * @a: a Flow Director filter data structure
1264  * @b: a Flow Director filter data structure
1265  * @v6: bool true if v6 filter
1266  *
1267  * Returns true if the filters match
1268  */
1269 static bool
1270 ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
1271 {
1272         enum ice_fltr_ptype flow_type = a->flow_type;
1273
1274         /* The calling function already checks that the two filters have the
1275          * same flow_type.
1276          */
1277         if (!v6) {
1278                 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1279                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1280                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1281                         if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1282                             a->ip.v4.src_ip == b->ip.v4.src_ip &&
1283                             a->ip.v4.dst_port == b->ip.v4.dst_port &&
1284                             a->ip.v4.src_port == b->ip.v4.src_port)
1285                                 return true;
1286                 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1287                         if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1288                             a->ip.v4.src_ip == b->ip.v4.src_ip &&
1289                             a->ip.v4.l4_header == b->ip.v4.l4_header &&
1290                             a->ip.v4.proto == b->ip.v4.proto &&
1291                             a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1292                             a->ip.v4.tos == b->ip.v4.tos)
1293                                 return true;
1294                 }
1295         } else {
1296                 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1297                     flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1298                     flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1299                         if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1300                             a->ip.v6.src_port == b->ip.v6.src_port &&
1301                             !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1302                                                b->ip.v6.dst_ip) &&
1303                             !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1304                                                b->ip.v6.src_ip))
1305                                 return true;
1306                 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1307                         if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1308                             a->ip.v6.src_port == b->ip.v6.src_port)
1309                                 return true;
1310                 }
1311         }
1312
1313         return false;
1314 }
1315
1316 /**
1317  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1318  * @hw: hardware data structure
1319  * @input: Flow Director filter data structure
1320  *
1321  * Returns true if the filter is found in the list
1322  */
1323 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1324 {
1325         struct ice_fdir_fltr *rule;
1326         bool ret = false;
1327
1328         LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1329                             fltr_node) {
1330                 enum ice_fltr_ptype flow_type;
1331
1332                 if (rule->flow_type != input->flow_type)
1333                         continue;
1334
1335                 flow_type = input->flow_type;
1336                 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1337                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1338                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1339                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1340                         ret = ice_fdir_comp_rules(rule, input, false);
1341                 else
1342                         ret = ice_fdir_comp_rules(rule, input, true);
1343                 if (ret) {
1344                         if (rule->fltr_id == input->fltr_id &&
1345                             rule->q_index != input->q_index)
1346                                 ret = false;
1347                         else
1348                                 break;
1349                 }
1350         }
1351
1352         return ret;
1353 }
1354
1355 /**
1356  * ice_clear_vsi_fd_table - admin command to clear FD table for a VSI
1357  * @hw: hardware data structure
1358  * @vsi_num: vsi_num (HW VSI num)
1359  *
1360  * Clears FD table entries by issuing admin command (direct, 0x0B06)
1361  * Must to pass valid vsi_num as returned by "AddVSI".
1362  */
1363 enum ice_status ice_clear_vsi_fd_table(struct ice_hw *hw, u16 vsi_num)
1364 {
1365         struct ice_aqc_clear_fd_table *cmd;
1366         struct ice_aq_desc desc;
1367
1368         cmd = &desc.params.clear_fd_table;
1369         ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
1370         cmd->clear_type = CL_FD_VM_VF_TYPE_VSI_IDX;
1371
1372         cmd->vsi_index = CPU_TO_LE16(vsi_num);
1373         return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
1374 }
1375
1376 /**
1377  * ice_clear_pf_fd_table - admin command to clear FD table for PF
1378  * @hw: hardware data structure
1379  *
1380  * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
1381  */
1382 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
1383 {
1384         struct ice_aqc_clear_fd_table *cmd;
1385         struct ice_aq_desc desc;
1386
1387         cmd = &desc.params.clear_fd_table;
1388         ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
1389         cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
1390         /* vsi_index must be 0 to clear FD table for a PF */
1391         cmd->vsi_index = CPU_TO_LE16(0);
1392
1393         return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
1394 }