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