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 */
ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx * fd_fltr_ctx)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
ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx * ctx,struct ice_fltr_desc * fdir_desc)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
ice_fdir_get_prgm_desc(struct ice_hw * hw,struct ice_fdir_fltr * input,struct ice_fltr_desc * fdesc,bool add)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 */
ice_alloc_fd_res_cntr(struct ice_hw * hw,u16 * cntr_id)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 */
ice_free_fd_res_cntr(struct ice_hw * hw,u16 cntr_id)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
ice_alloc_fd_guar_item(struct ice_hw * hw,u16 * cntr_id,u16 num_fltr)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
ice_free_fd_guar_item(struct ice_hw * hw,u16 cntr_id,u16 num_fltr)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
ice_alloc_fd_shrd_item(struct ice_hw * hw,u16 * cntr_id,u16 num_fltr)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
ice_free_fd_shrd_item(struct ice_hw * hw,u16 cntr_id,u16 num_fltr)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 */
ice_get_fdir_cnt_all(struct ice_hw * hw)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 */
ice_pkt_insert_ipv6_addr(u8 * pkt,int offset,__be32 * addr)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 */
ice_pkt_insert_u6_qfi(u8 * pkt,int offset,u8 data)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 */
ice_pkt_insert_u8(u8 * pkt,int offset,u8 data)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 */
ice_pkt_insert_u8_tc(u8 * pkt,int offset,u8 data)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 */
ice_pkt_insert_u16(u8 * pkt,int offset,__be16 data)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 */
ice_pkt_insert_u32(u8 * pkt,int offset,__be32 data)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 */
ice_pkt_insert_mac_addr(u8 * pkt,u8 * addr)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
ice_fdir_get_gen_prgm_pkt(struct ice_hw * hw,struct ice_fdir_fltr * input,u8 * pkt,bool frag,bool tun)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
ice_fdir_get_prgm_pkt(struct ice_fdir_fltr * input,u8 * pkt,bool frag)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 */
ice_fdir_has_frag(enum ice_fltr_ptype flow)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 *
ice_fdir_find_fltr_by_idx(struct ice_hw * hw,u32 fltr_idx)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 */
ice_fdir_list_add_fltr(struct ice_hw * hw,struct ice_fdir_fltr * fltr)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
ice_fdir_update_cntrs(struct ice_hw * hw,enum ice_fltr_ptype flow,bool acl_fltr,bool add)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 */
ice_cmp_ipv6_addr(__be32 * a,__be32 * b)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
ice_fdir_comp_rules(struct ice_fdir_fltr * a,struct ice_fdir_fltr * b,bool v6)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 */
ice_fdir_is_dup_fltr(struct ice_hw * hw,struct ice_fdir_fltr * input)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 */
ice_clear_pf_fd_table(struct ice_hw * hw)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 }
1480