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