1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2001-2020 Intel Corporation
5 #include "ice_common.h"
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
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,
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,
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,
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,
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,
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,
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,
105 static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
108 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114 static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
117 0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126 static const u8 ice_fdir_ipv4_esp_pkt[] = {
127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
129 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
135 static const u8 ice_fdir_ipv6_esp_pkt[] = {
136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
137 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
138 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00,
139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
146 static const u8 ice_fdir_ipv4_ah_pkt[] = {
147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
149 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156 static const u8 ice_fdir_ipv6_ah_pkt[] = {
157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
159 0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00,
160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168 static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
171 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
178 static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
181 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
186 0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
189 static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
192 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
195 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200 static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
203 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
206 0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
214 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
219 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
220 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224 static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
227 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
232 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
233 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237 static const u8 ice_fdir_non_ip_l2_pkt[] = {
238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243 static const u8 ice_fdir_tcpv6_pkt[] = {
244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
246 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
256 static const u8 ice_fdir_udpv6_pkt[] = {
257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
259 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
260 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
267 static const u8 ice_fdir_sctpv6_pkt[] = {
268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
269 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
270 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
274 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279 static const u8 ice_fdir_ipv6_pkt[] = {
280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
282 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 static const u8 ice_fdir_tcp4_tun_pkt[] = {
290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
292 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
296 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
298 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
299 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
305 static const u8 ice_fdir_udp4_tun_pkt[] = {
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
308 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
314 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
315 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00,
320 static const u8 ice_fdir_sctp4_tun_pkt[] = {
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
323 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
324 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
329 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
330 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335 static const u8 ice_fdir_ip4_tun_pkt[] = {
336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
338 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
344 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
345 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00,
349 static const u8 ice_fdir_tcp6_tun_pkt[] = {
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
352 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
358 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
365 0x00, 0x00, 0x00, 0x00,
368 static const u8 ice_fdir_udp6_tun_pkt[] = {
369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
370 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
371 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
377 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 static const u8 ice_fdir_sctp6_tun_pkt[] = {
386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
387 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
388 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
394 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
399 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
400 0x00, 0x00, 0x00, 0x00,
403 static const u8 ice_fdir_ip6_tun_pkt[] = {
404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
405 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
406 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
412 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419 /* Flow Director no-op training packet table */
420 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
422 ICE_FLTR_PTYPE_NONF_IPV4_TCP,
423 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
424 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
427 ICE_FLTR_PTYPE_NONF_IPV4_UDP,
428 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
429 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
432 ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
433 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
434 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
437 ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
438 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
439 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
442 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
443 sizeof(ice_fdir_udp4_gtpu4_pkt),
444 ice_fdir_udp4_gtpu4_pkt,
445 sizeof(ice_fdir_udp4_gtpu4_pkt),
446 ice_fdir_udp4_gtpu4_pkt,
449 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
450 sizeof(ice_fdir_tcp4_gtpu4_pkt),
451 ice_fdir_tcp4_gtpu4_pkt,
452 sizeof(ice_fdir_tcp4_gtpu4_pkt),
453 ice_fdir_tcp4_gtpu4_pkt,
456 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
457 sizeof(ice_fdir_icmp4_gtpu4_pkt),
458 ice_fdir_icmp4_gtpu4_pkt,
459 sizeof(ice_fdir_icmp4_gtpu4_pkt),
460 ice_fdir_icmp4_gtpu4_pkt,
463 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
464 sizeof(ice_fdir_ipv4_gtpu4_pkt),
465 ice_fdir_ipv4_gtpu4_pkt,
466 sizeof(ice_fdir_ipv4_gtpu4_pkt),
467 ice_fdir_ipv4_gtpu4_pkt,
470 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
471 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
472 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
475 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
476 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
477 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
480 ICE_FLTR_PTYPE_NONF_IPV4_ESP,
481 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
482 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
485 ICE_FLTR_PTYPE_NONF_IPV6_ESP,
486 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
487 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
490 ICE_FLTR_PTYPE_NONF_IPV4_AH,
491 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
492 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
495 ICE_FLTR_PTYPE_NONF_IPV6_AH,
496 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
497 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
500 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
501 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
502 ice_fdir_ipv4_nat_t_esp_pkt,
503 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
504 ice_fdir_ipv4_nat_t_esp_pkt,
507 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
508 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
509 ice_fdir_ipv6_nat_t_esp_pkt,
510 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
511 ice_fdir_ipv6_nat_t_esp_pkt,
514 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
515 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
516 ice_fdir_ipv4_pfcp_node_pkt,
517 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
518 ice_fdir_ipv4_pfcp_node_pkt,
521 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
522 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
523 ice_fdir_ipv4_pfcp_session_pkt,
524 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
525 ice_fdir_ipv4_pfcp_session_pkt,
528 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
529 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
530 ice_fdir_ipv6_pfcp_node_pkt,
531 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
532 ice_fdir_ipv6_pfcp_node_pkt,
535 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
536 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
537 ice_fdir_ipv6_pfcp_session_pkt,
538 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
539 ice_fdir_ipv6_pfcp_session_pkt,
542 ICE_FLTR_PTYPE_NON_IP_L2,
543 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
544 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
547 ICE_FLTR_PTYPE_NONF_IPV6_TCP,
548 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
549 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
552 ICE_FLTR_PTYPE_NONF_IPV6_UDP,
553 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
554 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
557 ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
558 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
559 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
562 ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
563 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
564 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
568 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
571 * ice_set_dflt_val_fd_desc
572 * @fd_fltr_ctx: pointer to fd filter descriptor
574 void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
576 fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
577 fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
578 fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
579 fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
580 fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
581 fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
582 fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
583 fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
584 fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
585 fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
586 fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
587 fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
588 fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
589 fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
590 fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
591 fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
592 fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
593 fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
594 fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
598 * ice_set_fd_desc_val
599 * @ctx: pointer to fd filter descriptor context
600 * @fdir_desc: populated with fd filter descriptor values
603 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
604 struct ice_fltr_desc *fdir_desc)
608 /* prep QW0 of FD filter programming desc */
609 qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
610 ICE_FXD_FLTR_QW0_QINDEX_M;
611 qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
612 ICE_FXD_FLTR_QW0_COMP_Q_M;
613 qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
614 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
615 qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
616 ICE_FXD_FLTR_QW0_FD_SPACE_M;
617 qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
618 ICE_FXD_FLTR_QW0_STAT_CNT_M;
619 qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
620 ICE_FXD_FLTR_QW0_STAT_ENA_M;
621 qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
622 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
623 qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
624 ICE_FXD_FLTR_QW0_TO_Q_M;
625 qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
626 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
627 qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
628 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
629 qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
630 ICE_FXD_FLTR_QW0_DROP_M;
631 qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
632 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
633 qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
634 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
635 qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
636 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
637 fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
639 /* prep QW1 of FD filter programming desc */
640 qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
641 ICE_FXD_FLTR_QW1_DTYPE_M;
642 qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
643 ICE_FXD_FLTR_QW1_PCMD_M;
644 qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
645 ICE_FXD_FLTR_QW1_PROF_PRI_M;
646 qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
647 ICE_FXD_FLTR_QW1_PROF_M;
648 qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
649 ICE_FXD_FLTR_QW1_FD_VSI_M;
650 qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
651 ICE_FXD_FLTR_QW1_SWAP_M;
652 qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
653 ICE_FXD_FLTR_QW1_FDID_PRI_M;
654 qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
655 ICE_FXD_FLTR_QW1_FDID_MDID_M;
656 qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
657 ICE_FXD_FLTR_QW1_FDID_M;
658 fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
662 * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
663 * @hw: pointer to the hardware structure
665 * @fdesc: filter descriptor
666 * @add: if add is true, this is an add operation, false implies delete
669 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
670 struct ice_fltr_desc *fdesc, bool add)
672 struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
674 /* set default context info */
675 ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
677 /* change sideband filtering values */
678 fdir_fltr_ctx.fdid = input->fltr_id;
679 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
680 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
681 fdir_fltr_ctx.qindex = 0;
682 } else if (input->dest_ctl ==
683 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
684 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
685 fdir_fltr_ctx.qindex = 0;
687 if (input->dest_ctl ==
688 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
689 fdir_fltr_ctx.toq = input->q_region;
690 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
691 fdir_fltr_ctx.qindex = input->q_index;
693 fdir_fltr_ctx.cnt_ena = input->cnt_ena;
694 fdir_fltr_ctx.cnt_index = input->cnt_index;
695 fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
696 fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
697 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
698 fdir_fltr_ctx.toq_prio = 0;
700 fdir_fltr_ctx.toq_prio = 3;
701 fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
702 ICE_FXD_FLTR_QW1_PCMD_REMOVE;
703 fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
704 fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
705 fdir_fltr_ctx.comp_report = input->comp_report;
706 fdir_fltr_ctx.fdid_prio = input->fdid_prio;
707 fdir_fltr_ctx.desc_prof = 1;
708 fdir_fltr_ctx.desc_prof_prio = 3;
709 ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
713 * ice_alloc_fd_res_cntr - obtain counter resource for FD type
714 * @hw: pointer to the hardware structure
715 * @cntr_id: returns counter index
717 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
719 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
720 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
724 * ice_free_fd_res_cntr - Free counter resource for FD type
725 * @hw: pointer to the hardware structure
726 * @cntr_id: counter index to be freed
728 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
730 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
731 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
735 * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
736 * @hw: pointer to the hardware structure
737 * @cntr_id: returns counter index
738 * @num_fltr: number of filter entries to be allocated
741 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
743 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
744 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
749 * ice_free_fd_guar_item - Free flow director guaranteed entries
750 * @hw: pointer to the hardware structure
751 * @cntr_id: counter index that needs to be freed
752 * @num_fltr: number of filters to be freed
755 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
757 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
758 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
763 * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
764 * @hw: pointer to the hardware structure
765 * @cntr_id: returns counter index
766 * @num_fltr: number of filter entries to be allocated
769 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
771 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
772 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
777 * ice_free_fd_shrd_item - Free flow director shared entries
778 * @hw: pointer to the hardware structure
779 * @cntr_id: counter index that needs to be freed
780 * @num_fltr: number of filters to be freed
783 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
785 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
786 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
791 * ice_get_fdir_cnt_all - get the number of Flow Director filters
792 * @hw: hardware data structure
794 * Returns the number of filters available on device
796 int ice_get_fdir_cnt_all(struct ice_hw *hw)
798 return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
802 * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
803 * @pkt: packet buffer
804 * @offset: offset into buffer
805 * @addr: IPv6 address to convert and insert into pkt at offset
807 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
811 for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
812 ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
813 sizeof(*addr), ICE_NONDMA_TO_NONDMA);
817 * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
818 * @pkt: packet buffer
819 * @offset: offset into buffer
820 * @data: 8 bit value to convert and insert into pkt at offset
822 * This function is designed for inserting qfi (6 bits) for gtpu.
824 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
828 ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
829 ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
833 * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
834 * @pkt: packet buffer
835 * @offset: offset into buffer
836 * @data: 8 bit value to convert and insert into pkt at offset
838 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
840 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
844 * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
845 * @pkt: packet buffer
846 * @offset: offset into buffer
847 * @data: 8 bit value to convert and insert into pkt at offset
849 * This function is designed for inserting Traffic Class (TC) for IPv6,
850 * since that TC is not aligned in number of bytes. Here we split it out
851 * into two part and fill each byte with data copy from pkt, then insert
852 * the two bytes data one by one.
854 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
858 high = (data >> 4) + (*(pkt + offset) & 0xF0);
859 ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
861 low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
862 ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
866 * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
867 * @pkt: packet buffer
868 * @offset: offset into buffer
869 * @data: 16 bit value to convert and insert into pkt at offset
871 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
873 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
877 * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
878 * @pkt: packet buffer
879 * @offset: offset into buffer
880 * @data: 32 bit value to convert and insert into pkt at offset
882 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
884 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
888 * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
889 * @pkt: packet buffer
890 * @addr: MAC address to convert and insert into pkt at offset
892 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
894 ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
898 * ice_fdir_get_gen_prgm_pkt - generate a training packet
899 * @hw: pointer to the hardware structure
900 * @input: flow director filter data structure
901 * @pkt: pointer to return filter packet
902 * @frag: generate a fragment packet
903 * @tun: true implies generate a tunnel packet
906 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
907 u8 *pkt, bool frag, bool tun)
909 enum ice_fltr_ptype flow;
914 if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
915 switch (input->ip.v4.proto) {
916 case ICE_IP_PROTO_TCP:
917 flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
919 case ICE_IP_PROTO_UDP:
920 flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
922 case ICE_IP_PROTO_SCTP:
923 flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
926 flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
929 } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
930 switch (input->ip.v6.proto) {
931 case ICE_IP_PROTO_TCP:
932 flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
934 case ICE_IP_PROTO_UDP:
935 flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
937 case ICE_IP_PROTO_SCTP:
938 flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
941 flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
945 flow = input->flow_type;
948 for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
949 if (ice_fdir_pkt[idx].flow == flow)
951 if (idx == ICE_FDIR_NUM_PKT)
952 return ICE_ERR_PARAM;
954 ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
955 ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
958 if (!ice_get_open_tunnel_port(hw, TNL_ALL, &tnl_port))
959 return ICE_ERR_DOES_NOT_EXIST;
960 if (!ice_fdir_pkt[idx].tun_pkt)
961 return ICE_ERR_PARAM;
962 ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
963 ice_fdir_pkt[idx].tun_pkt_len, ICE_NONDMA_TO_NONDMA);
964 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
966 loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
969 /* Reverse the src and dst, since the HW expects them to be from Tx
970 * perspective. The input from user is from Rx filter perspective.
973 case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
974 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
975 input->ip.v4.src_ip);
976 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
977 input->ip.v4.src_port);
978 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
979 input->ip.v4.dst_ip);
980 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
981 input->ip.v4.dst_port);
982 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
983 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
984 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
986 loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
988 case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
989 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
990 input->ip.v4.src_ip);
991 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
992 input->ip.v4.src_port);
993 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
994 input->ip.v4.dst_ip);
995 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
996 input->ip.v4.dst_port);
997 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
998 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
999 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1001 case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1002 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1003 input->ip.v4.src_ip);
1004 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1005 input->ip.v4.src_port);
1006 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1007 input->ip.v4.dst_ip);
1008 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1009 input->ip.v4.dst_port);
1010 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1011 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1012 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1014 case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1015 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1016 input->ip.v4.src_ip);
1017 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1018 input->ip.v4.dst_ip);
1019 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1020 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1021 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1022 input->ip.v4.proto);
1023 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1025 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1026 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1027 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
1028 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
1029 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1030 input->ip.v4.src_ip);
1031 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1032 input->ip.v4.dst_ip);
1033 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1034 input->gtpu_data.teid);
1035 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1036 input->gtpu_data.qfi);
1038 case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1039 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1040 input->l2tpv3_data.session_id);
1042 case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1043 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1044 input->l2tpv3_data.session_id);
1046 case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1047 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1048 input->ip.v4.sec_parm_idx);
1050 case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1051 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1052 input->ip.v6.sec_parm_idx);
1054 case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1055 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1056 input->ip.v4.sec_parm_idx);
1058 case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1059 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1060 input->ip.v6.sec_parm_idx);
1062 case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1063 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1064 input->ip.v4.src_ip);
1065 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1066 input->ip.v4.dst_ip);
1067 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1068 input->ip.v4.sec_parm_idx);
1070 case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1071 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1072 input->ip.v6.src_ip);
1073 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1074 input->ip.v6.dst_ip);
1075 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1076 input->ip.v6.sec_parm_idx);
1078 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1079 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1080 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1081 input->ip.v4.dst_port);
1083 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1084 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1085 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1086 input->ip.v6.dst_port);
1088 case ICE_FLTR_PTYPE_NON_IP_L2:
1089 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1090 input->ext_data.ether_type);
1092 case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1093 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1094 input->ip.v6.src_ip);
1095 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1096 input->ip.v6.dst_ip);
1097 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1098 input->ip.v6.src_port);
1099 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1100 input->ip.v6.dst_port);
1101 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1102 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1103 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1105 case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1106 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1107 input->ip.v6.src_ip);
1108 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1109 input->ip.v6.dst_ip);
1110 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1111 input->ip.v6.src_port);
1112 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1113 input->ip.v6.dst_port);
1114 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1115 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1116 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1118 case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1119 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1120 input->ip.v6.src_ip);
1121 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1122 input->ip.v6.dst_ip);
1123 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1124 input->ip.v6.src_port);
1125 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1126 input->ip.v6.dst_port);
1127 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1128 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1129 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1131 case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1132 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1133 input->ip.v6.src_ip);
1134 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1135 input->ip.v6.dst_ip);
1136 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1137 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1138 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1139 input->ip.v6.proto);
1140 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1143 return ICE_ERR_PARAM;
1146 if (input->flex_fltr)
1147 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1153 * ice_fdir_get_prgm_pkt - generate a training packet
1154 * @input: flow director filter data structure
1155 * @pkt: pointer to return filter packet
1156 * @frag: generate a fragment packet
1159 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1161 return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1165 * ice_fdir_has_frag - does flow type have 2 ptypes
1168 * returns true is there is a fragment packet for this ptype
1170 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1172 if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1179 * ice_fdir_find_by_idx - find filter with idx
1180 * @hw: pointer to hardware structure
1181 * @fltr_idx: index to find.
1183 * Returns pointer to filter if found or null
1185 struct ice_fdir_fltr *
1186 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1188 struct ice_fdir_fltr *rule;
1190 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1192 /* rule ID found in the list */
1193 if (fltr_idx == rule->fltr_id)
1195 if (fltr_idx < rule->fltr_id)
1202 * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1203 * @hw: hardware structure
1204 * @fltr: filter node to add to structure
1206 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1208 struct ice_fdir_fltr *rule, *parent = NULL;
1210 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1212 /* rule ID found or pass its spot in the list */
1213 if (rule->fltr_id >= fltr->fltr_id)
1219 LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1221 LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1225 * ice_fdir_update_cntrs - increment / decrement filter counter
1226 * @hw: pointer to hardware structure
1227 * @flow: filter flow type
1228 * @acl_fltr: true indicates an ACL filter
1229 * @add: true implies filters added
1232 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1233 bool acl_fltr, bool add)
1237 incr = add ? 1 : -1;
1238 hw->fdir_active_fltr += incr;
1239 if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1240 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1243 hw->acl_fltr_cnt[flow] += incr;
1245 hw->fdir_fltr_cnt[flow] += incr;
1250 * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1254 * Returns 0 on equal, returns non-0 if different
1256 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1258 return memcmp(a, b, 4 * sizeof(__be32));
1262 * ice_fdir_comp_rules - compare 2 filters
1263 * @a: a Flow Director filter data structure
1264 * @b: a Flow Director filter data structure
1265 * @v6: bool true if v6 filter
1267 * Returns true if the filters match
1270 ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6)
1272 enum ice_fltr_ptype flow_type = a->flow_type;
1274 /* The calling function already checks that the two filters have the
1278 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1279 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1280 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1281 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1282 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1283 a->ip.v4.dst_port == b->ip.v4.dst_port &&
1284 a->ip.v4.src_port == b->ip.v4.src_port)
1286 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1287 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1288 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1289 a->ip.v4.l4_header == b->ip.v4.l4_header &&
1290 a->ip.v4.proto == b->ip.v4.proto &&
1291 a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1292 a->ip.v4.tos == b->ip.v4.tos)
1296 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1297 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1298 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1299 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1300 a->ip.v6.src_port == b->ip.v6.src_port &&
1301 !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1303 !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1306 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1307 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1308 a->ip.v6.src_port == b->ip.v6.src_port)
1317 * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1318 * @hw: hardware data structure
1319 * @input: Flow Director filter data structure
1321 * Returns true if the filter is found in the list
1323 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1325 struct ice_fdir_fltr *rule;
1328 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1330 enum ice_fltr_ptype flow_type;
1332 if (rule->flow_type != input->flow_type)
1335 flow_type = input->flow_type;
1336 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1337 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1338 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1339 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1340 ret = ice_fdir_comp_rules(rule, input, false);
1342 ret = ice_fdir_comp_rules(rule, input, true);
1344 if (rule->fltr_id == input->fltr_id &&
1345 rule->q_index != input->q_index)
1356 * ice_clear_vsi_fd_table - admin command to clear FD table for a VSI
1357 * @hw: hardware data structure
1358 * @vsi_num: vsi_num (HW VSI num)
1360 * Clears FD table entries by issuing admin command (direct, 0x0B06)
1361 * Must to pass valid vsi_num as returned by "AddVSI".
1363 enum ice_status ice_clear_vsi_fd_table(struct ice_hw *hw, u16 vsi_num)
1365 struct ice_aqc_clear_fd_table *cmd;
1366 struct ice_aq_desc desc;
1368 cmd = &desc.params.clear_fd_table;
1369 ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
1370 cmd->clear_type = CL_FD_VM_VF_TYPE_VSI_IDX;
1372 cmd->vsi_index = CPU_TO_LE16(vsi_num);
1373 return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
1377 * ice_clear_pf_fd_table - admin command to clear FD table for PF
1378 * @hw: hardware data structure
1380 * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
1382 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
1384 struct ice_aqc_clear_fd_table *cmd;
1385 struct ice_aq_desc desc;
1387 cmd = &desc.params.clear_fd_table;
1388 ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
1389 cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
1390 /* vsi_index must be 0 to clear FD table for a PF */
1391 cmd->vsi_index = CPU_TO_LE16(0);
1393 return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);