net/ice/base: use package info from ice segment metadata
[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_mac_addr(pkt, input->ext_data_outer.dst_mac);
1061                 ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1062                                         input->ext_data_outer.src_mac);
1063                 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1064                                    input->ip_outer.v4.dst_ip);
1065                 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1066                                    input->ip_outer.v4.src_ip);
1067                 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1068                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1069                                    input->ip.v4.src_ip);
1070                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1071                                    input->ip.v4.src_port);
1072                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1073                                    input->ip.v4.dst_ip);
1074                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1075                                    input->ip.v4.dst_port);
1076                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1077                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1078                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1079                 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1080                 break;
1081         case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1082                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1083                                    input->ip.v4.src_ip);
1084                 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1085                                    input->ip.v4.src_port);
1086                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1087                                    input->ip.v4.dst_ip);
1088                 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1089                                    input->ip.v4.dst_port);
1090                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1091                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1092                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1093                 break;
1094         case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1095                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1096                                    input->ip.v4.src_ip);
1097                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1098                                    input->ip.v4.dst_ip);
1099                 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1100                 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1101                 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1102                                   input->ip.v4.proto);
1103                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1104                 break;
1105         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
1106                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1107                                    input->ip.v4.src_ip);
1108                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1109                                    input->ip.v4.dst_ip);
1110                 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1111                                    input->gtpu_data.teid);
1112                 break;
1113         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1114         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1115         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
1116         case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER:
1117                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1118                                    input->ip.v4.src_ip);
1119                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1120                                    input->ip.v4.dst_ip);
1121                 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1122                                    input->gtpu_data.teid);
1123                 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1124                                       input->gtpu_data.qfi);
1125                 break;
1126         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_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                 break;
1134         case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
1135                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1136                                          input->ip.v6.src_ip);
1137                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1138                                          input->ip.v6.dst_ip);
1139                 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1140                                    input->gtpu_data.teid);
1141                 ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
1142                                       input->gtpu_data.qfi);
1143                 break;
1144         case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1145                 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1146                                    input->l2tpv3_data.session_id);
1147                 break;
1148         case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1149                 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1150                                    input->l2tpv3_data.session_id);
1151                 break;
1152         case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1153                 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1154                                    input->ip.v4.sec_parm_idx);
1155                 break;
1156         case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1157                 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1158                                    input->ip.v6.sec_parm_idx);
1159                 break;
1160         case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1161                 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1162                                    input->ip.v4.sec_parm_idx);
1163                 break;
1164         case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1165                 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1166                                    input->ip.v6.sec_parm_idx);
1167                 break;
1168         case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1169                 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1170                                    input->ip.v4.src_ip);
1171                 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1172                                    input->ip.v4.dst_ip);
1173                 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1174                                    input->ip.v4.sec_parm_idx);
1175                 break;
1176         case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1177                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1178                                          input->ip.v6.src_ip);
1179                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1180                                          input->ip.v6.dst_ip);
1181                 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1182                                    input->ip.v6.sec_parm_idx);
1183                 break;
1184         case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1185         case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1186                 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1187                                    input->ip.v4.dst_port);
1188                 break;
1189         case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1190         case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1191                 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1192                                    input->ip.v6.dst_port);
1193                 break;
1194         case ICE_FLTR_PTYPE_NON_IP_L2:
1195                 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1196                                    input->ext_data.ether_type);
1197                 break;
1198         case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1199                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1200                                          input->ip.v6.src_ip);
1201                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1202                                          input->ip.v6.dst_ip);
1203                 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1204                                    input->ip.v6.src_port);
1205                 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1206                                    input->ip.v6.dst_port);
1207                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1208                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1209                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1210                 break;
1211         case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1212                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1213                                          input->ip.v6.src_ip);
1214                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1215                                          input->ip.v6.dst_ip);
1216                 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1217                                    input->ip.v6.src_port);
1218                 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1219                                    input->ip.v6.dst_port);
1220                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1221                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1222                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1223                 break;
1224         case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1225                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1226                                          input->ip.v6.src_ip);
1227                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1228                                          input->ip.v6.dst_ip);
1229                 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1230                                    input->ip.v6.src_port);
1231                 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1232                                    input->ip.v6.dst_port);
1233                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1234                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1235                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1236                 break;
1237         case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1238                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1239                                          input->ip.v6.src_ip);
1240                 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1241                                          input->ip.v6.dst_ip);
1242                 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1243                 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1244                 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1245                                   input->ip.v6.proto);
1246                 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1247                 break;
1248         default:
1249                 return ICE_ERR_PARAM;
1250         }
1251
1252         if (input->flex_fltr)
1253                 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1254
1255         return ICE_SUCCESS;
1256 }
1257
1258 /**
1259  * ice_fdir_get_prgm_pkt - generate a training packet
1260  * @input: flow director filter data structure
1261  * @pkt: pointer to return filter packet
1262  * @frag: generate a fragment packet
1263  */
1264 enum ice_status
1265 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1266 {
1267         return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1268 }
1269
1270 /**
1271  * ice_fdir_has_frag - does flow type have 2 ptypes
1272  * @flow: flow ptype
1273  *
1274  * returns true is there is a fragment packet for this ptype
1275  */
1276 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1277 {
1278         if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1279                 return true;
1280         else
1281                 return false;
1282 }
1283
1284 /**
1285  * ice_fdir_find_by_idx - find filter with idx
1286  * @hw: pointer to hardware structure
1287  * @fltr_idx: index to find.
1288  *
1289  * Returns pointer to filter if found or null
1290  */
1291 struct ice_fdir_fltr *
1292 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1293 {
1294         struct ice_fdir_fltr *rule;
1295
1296         LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1297                             fltr_node) {
1298                 /* rule ID found in the list */
1299                 if (fltr_idx == rule->fltr_id)
1300                         return rule;
1301                 if (fltr_idx < rule->fltr_id)
1302                         break;
1303         }
1304         return NULL;
1305 }
1306
1307 /**
1308  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1309  * @hw: hardware structure
1310  * @fltr: filter node to add to structure
1311  */
1312 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1313 {
1314         struct ice_fdir_fltr *rule, *parent = NULL;
1315
1316         LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1317                             fltr_node) {
1318                 /* rule ID found or pass its spot in the list */
1319                 if (rule->fltr_id >= fltr->fltr_id)
1320                         break;
1321                 parent = rule;
1322         }
1323
1324         if (parent)
1325                 LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1326         else
1327                 LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1328 }
1329
1330 /**
1331  * ice_fdir_update_cntrs - increment / decrement filter counter
1332  * @hw: pointer to hardware structure
1333  * @flow: filter flow type
1334  * @acl_fltr: true indicates an ACL filter
1335  * @add: true implies filters added
1336  */
1337 void
1338 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1339                       bool acl_fltr, bool add)
1340 {
1341         int incr;
1342
1343         incr = add ? 1 : -1;
1344         hw->fdir_active_fltr += incr;
1345         if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1346                 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1347         } else {
1348                 if (acl_fltr)
1349                         hw->acl_fltr_cnt[flow] += incr;
1350                 else
1351                         hw->fdir_fltr_cnt[flow] += incr;
1352         }
1353 }
1354
1355 /**
1356  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1357  * @a: IP v6 address
1358  * @b: IP v6 address
1359  *
1360  * Returns 0 on equal, returns non-0 if different
1361  */
1362 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1363 {
1364         return memcmp(a, b, 4 * sizeof(__be32));
1365 }
1366
1367 /**
1368  * ice_fdir_comp_rules - compare 2 filters
1369  * @a: a Flow Director filter data structure
1370  * @b: a Flow Director filter data structure
1371  * @v6: bool true if v6 filter
1372  *
1373  * Returns true if the filters match
1374  */
1375 static bool
1376 ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
1377 {
1378         enum ice_fltr_ptype flow_type = a->flow_type;
1379
1380         /* The calling function already checks that the two filters have the
1381          * same flow_type.
1382          */
1383         if (!v6) {
1384                 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1385                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1386                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1387                         if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1388                             a->ip.v4.src_ip == b->ip.v4.src_ip &&
1389                             a->ip.v4.dst_port == b->ip.v4.dst_port &&
1390                             a->ip.v4.src_port == b->ip.v4.src_port)
1391                                 return true;
1392                 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1393                         if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1394                             a->ip.v4.src_ip == b->ip.v4.src_ip &&
1395                             a->ip.v4.l4_header == b->ip.v4.l4_header &&
1396                             a->ip.v4.proto == b->ip.v4.proto &&
1397                             a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1398                             a->ip.v4.tos == b->ip.v4.tos)
1399                                 return true;
1400                 }
1401         } else {
1402                 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1403                     flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1404                     flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1405                         if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1406                             a->ip.v6.src_port == b->ip.v6.src_port &&
1407                             !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1408                                                b->ip.v6.dst_ip) &&
1409                             !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1410                                                b->ip.v6.src_ip))
1411                                 return true;
1412                 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1413                         if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1414                             a->ip.v6.src_port == b->ip.v6.src_port)
1415                                 return true;
1416                 }
1417         }
1418
1419         return false;
1420 }
1421
1422 /**
1423  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1424  * @hw: hardware data structure
1425  * @input: Flow Director filter data structure
1426  *
1427  * Returns true if the filter is found in the list
1428  */
1429 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1430 {
1431         struct ice_fdir_fltr *rule;
1432         bool ret = false;
1433
1434         LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1435                             fltr_node) {
1436                 enum ice_fltr_ptype flow_type;
1437
1438                 if (rule->flow_type != input->flow_type)
1439                         continue;
1440
1441                 flow_type = input->flow_type;
1442                 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1443                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1444                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1445                     flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1446                         ret = ice_fdir_comp_rules(rule, input, false);
1447                 else
1448                         ret = ice_fdir_comp_rules(rule, input, true);
1449                 if (ret) {
1450                         if (rule->fltr_id == input->fltr_id &&
1451                             rule->q_index != input->q_index)
1452                                 ret = false;
1453                         else
1454                                 break;
1455                 }
1456         }
1457
1458         return ret;
1459 }
1460
1461 /**
1462  * ice_clear_pf_fd_table - admin command to clear FD table for PF
1463  * @hw: hardware data structure
1464  *
1465  * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
1466  */
1467 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
1468 {
1469         struct ice_aqc_clear_fd_table *cmd;
1470         struct ice_aq_desc desc;
1471
1472         cmd = &desc.params.clear_fd_table;
1473         ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
1474         cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
1475         /* vsi_index must be 0 to clear FD table for a PF */
1476         cmd->vsi_index = CPU_TO_LE16(0);
1477
1478         return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
1479 }