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_vxlan_pkt[] = {
46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
48 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
51 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
52 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
54 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
55 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57 0x00, 0x00, 0x00, 0x00,
60 static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
63 0x00, 0x4c, 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, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
75 static const u8 ice_fdir_tcp4_gtpu4_pkt[] = {
76 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
77 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
78 0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
79 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
80 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
81 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
82 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
83 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
84 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06,
85 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 static const u8 ice_fdir_icmp4_gtpu4_pkt[] = {
92 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
94 0x00, 0x4c, 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, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01,
101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106 static const u8 ice_fdir_ipv4_gtpu4_pkt[] = {
107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
109 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
112 0x00, 0x00, 0x33, 0xff, 0x00, 0x20, 0x00, 0x00,
113 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x45, 0x00,
114 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119 static const u8 ice_fdir_ipv6_gtpu6_pkt[] = {
120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
122 0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00,
123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x68,
127 0x08, 0x68, 0x00, 0x44, 0x7f, 0xed, 0x33, 0xff,
128 0x00, 0x34, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00,
129 0x00, 0x85, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
130 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
137 static const u8 ice_fdir_ipv4_gtpu4_eh_pkt[] = {
138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
139 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
140 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
143 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
144 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
146 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151 static const u8 ice_fdir_ipv6_gtpu6_eh_pkt[] = {
152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
154 0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00,
155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x68,
159 0x08, 0x68, 0x00, 0x44, 0x7f, 0xed, 0x34, 0xff,
160 0x00, 0x34, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00,
161 0x00, 0x85, 0x02, 0x00, 0x33, 0x00, 0x00, 0x00,
162 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
163 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
172 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
173 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
179 static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
182 0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191 static const u8 ice_fdir_ipv4_esp_pkt[] = {
192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
194 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200 static const u8 ice_fdir_ipv6_esp_pkt[] = {
201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
203 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00,
204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 static const u8 ice_fdir_ipv4_ah_pkt[] = {
212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
214 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
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,
221 static const u8 ice_fdir_ipv6_ah_pkt[] = {
222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
224 0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00,
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
233 static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
234 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
236 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243 static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
246 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251 0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
254 static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
256 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
257 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
258 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
260 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265 static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
268 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
271 0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
276 static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
277 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
278 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
279 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
284 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
285 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
292 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
296 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
297 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
298 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302 static const u8 ice_fdir_non_ip_l2_pkt[] = {
303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 static const u8 ice_fdir_tcpv6_pkt[] = {
309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
311 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
321 static const u8 ice_fdir_udpv6_pkt[] = {
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
324 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
332 static const u8 ice_fdir_sctpv6_pkt[] = {
333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
335 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 static const u8 ice_fdir_ipv6_pkt[] = {
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 static const u8 ice_fdir_tcp4_tun_pkt[] = {
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
357 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
363 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
364 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
370 static const u8 ice_fdir_udp4_tun_pkt[] = {
371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
373 0x00, 0x4e, 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, 0x1c, 0x00, 0x00, 0x40, 0x00,
380 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00,
385 static const u8 ice_fdir_sctp4_tun_pkt[] = {
386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
387 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
388 0x00, 0x52, 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, 0x20, 0x00, 0x01, 0x00, 0x00,
395 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
400 static const u8 ice_fdir_ip4_tun_pkt[] = {
401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
402 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
403 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
409 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
410 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411 0x00, 0x00, 0x00, 0x00,
414 static const u8 ice_fdir_tcp6_tun_pkt[] = {
415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
416 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
417 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
423 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
428 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
429 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
430 0x00, 0x00, 0x00, 0x00,
433 static const u8 ice_fdir_udp6_tun_pkt[] = {
434 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
435 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
436 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
437 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
439 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
440 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
441 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
442 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
443 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
444 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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,
450 static const u8 ice_fdir_sctp6_tun_pkt[] = {
451 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
452 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
453 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
455 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
456 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
458 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
459 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
463 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
464 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
465 0x00, 0x00, 0x00, 0x00,
468 static const u8 ice_fdir_ip6_tun_pkt[] = {
469 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
470 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
471 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
472 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
473 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
474 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
477 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
478 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
479 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
480 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484 /* Flow Director no-op training packet table */
485 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
487 ICE_FLTR_PTYPE_NONF_IPV4_TCP,
488 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
489 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
492 ICE_FLTR_PTYPE_NONF_IPV4_UDP,
493 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
494 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
497 ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
498 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
499 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
502 ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
503 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
504 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
507 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
508 sizeof(ice_fdir_udp4_gtpu4_pkt),
509 ice_fdir_udp4_gtpu4_pkt,
510 sizeof(ice_fdir_udp4_gtpu4_pkt),
511 ice_fdir_udp4_gtpu4_pkt,
514 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
515 sizeof(ice_fdir_tcp4_gtpu4_pkt),
516 ice_fdir_tcp4_gtpu4_pkt,
517 sizeof(ice_fdir_tcp4_gtpu4_pkt),
518 ice_fdir_tcp4_gtpu4_pkt,
521 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
522 sizeof(ice_fdir_icmp4_gtpu4_pkt),
523 ice_fdir_icmp4_gtpu4_pkt,
524 sizeof(ice_fdir_icmp4_gtpu4_pkt),
525 ice_fdir_icmp4_gtpu4_pkt,
528 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
529 sizeof(ice_fdir_ipv4_gtpu4_pkt),
530 ice_fdir_ipv4_gtpu4_pkt,
531 sizeof(ice_fdir_ipv4_gtpu4_pkt),
532 ice_fdir_ipv4_gtpu4_pkt,
535 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER,
536 sizeof(ice_fdir_ipv6_gtpu6_pkt),
537 ice_fdir_ipv6_gtpu6_pkt,
538 sizeof(ice_fdir_ipv6_gtpu6_pkt),
539 ice_fdir_ipv6_gtpu6_pkt,
542 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER,
543 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
544 ice_fdir_ipv4_gtpu4_eh_pkt,
545 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
546 ice_fdir_ipv4_gtpu4_eh_pkt,
549 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER,
550 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
551 ice_fdir_ipv6_gtpu6_eh_pkt,
552 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
553 ice_fdir_ipv6_gtpu6_eh_pkt,
556 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
557 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
558 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
561 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
562 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
563 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
566 ICE_FLTR_PTYPE_NONF_IPV4_ESP,
567 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
568 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
571 ICE_FLTR_PTYPE_NONF_IPV6_ESP,
572 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
573 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
576 ICE_FLTR_PTYPE_NONF_IPV4_AH,
577 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
578 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
581 ICE_FLTR_PTYPE_NONF_IPV6_AH,
582 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
583 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
586 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
587 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
588 ice_fdir_ipv4_nat_t_esp_pkt,
589 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
590 ice_fdir_ipv4_nat_t_esp_pkt,
593 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
594 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
595 ice_fdir_ipv6_nat_t_esp_pkt,
596 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
597 ice_fdir_ipv6_nat_t_esp_pkt,
600 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
601 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
602 ice_fdir_ipv4_pfcp_node_pkt,
603 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
604 ice_fdir_ipv4_pfcp_node_pkt,
607 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
608 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
609 ice_fdir_ipv4_pfcp_session_pkt,
610 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
611 ice_fdir_ipv4_pfcp_session_pkt,
614 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
615 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
616 ice_fdir_ipv6_pfcp_node_pkt,
617 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
618 ice_fdir_ipv6_pfcp_node_pkt,
621 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
622 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
623 ice_fdir_ipv6_pfcp_session_pkt,
624 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
625 ice_fdir_ipv6_pfcp_session_pkt,
628 ICE_FLTR_PTYPE_NON_IP_L2,
629 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
630 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
633 ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN,
634 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
635 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
638 ICE_FLTR_PTYPE_NONF_IPV6_TCP,
639 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
640 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
643 ICE_FLTR_PTYPE_NONF_IPV6_UDP,
644 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
645 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
648 ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
649 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
650 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
653 ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
654 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
655 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
659 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
662 * ice_set_dflt_val_fd_desc
663 * @fd_fltr_ctx: pointer to fd filter descriptor
665 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
667 fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
668 fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
669 fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
670 fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
671 fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
672 fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
673 fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
674 fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
675 fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
676 fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
677 fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
678 fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
679 fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
680 fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
681 fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
682 fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
683 fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
684 fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
685 fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
689 * ice_set_fd_desc_val
690 * @ctx: pointer to fd filter descriptor context
691 * @fdir_desc: populated with fd filter descriptor values
694 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
695 struct ice_fltr_desc *fdir_desc)
699 /* prep QW0 of FD filter programming desc */
700 qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
701 ICE_FXD_FLTR_QW0_QINDEX_M;
702 qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
703 ICE_FXD_FLTR_QW0_COMP_Q_M;
704 qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
705 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
706 qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
707 ICE_FXD_FLTR_QW0_FD_SPACE_M;
708 qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
709 ICE_FXD_FLTR_QW0_STAT_CNT_M;
710 qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
711 ICE_FXD_FLTR_QW0_STAT_ENA_M;
712 qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
713 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
714 qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
715 ICE_FXD_FLTR_QW0_TO_Q_M;
716 qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
717 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
718 qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
719 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
720 qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
721 ICE_FXD_FLTR_QW0_DROP_M;
722 qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
723 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
724 qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
725 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
726 qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
727 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
728 fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
730 /* prep QW1 of FD filter programming desc */
731 qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
732 ICE_FXD_FLTR_QW1_DTYPE_M;
733 qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
734 ICE_FXD_FLTR_QW1_PCMD_M;
735 qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
736 ICE_FXD_FLTR_QW1_PROF_PRI_M;
737 qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
738 ICE_FXD_FLTR_QW1_PROF_M;
739 qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
740 ICE_FXD_FLTR_QW1_FD_VSI_M;
741 qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
742 ICE_FXD_FLTR_QW1_SWAP_M;
743 qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
744 ICE_FXD_FLTR_QW1_FDID_PRI_M;
745 qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
746 ICE_FXD_FLTR_QW1_FDID_MDID_M;
747 qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
748 ICE_FXD_FLTR_QW1_FDID_M;
749 fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
753 * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
754 * @hw: pointer to the hardware structure
756 * @fdesc: filter descriptor
757 * @add: if add is true, this is an add operation, false implies delete
760 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
761 struct ice_fltr_desc *fdesc, bool add)
763 struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
765 /* set default context info */
766 ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
768 /* change sideband filtering values */
769 fdir_fltr_ctx.fdid = input->fltr_id;
770 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
771 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
772 fdir_fltr_ctx.qindex = 0;
773 } else if (input->dest_ctl ==
774 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
775 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
776 fdir_fltr_ctx.qindex = 0;
778 if (input->dest_ctl ==
779 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
780 fdir_fltr_ctx.toq = input->q_region;
781 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
782 fdir_fltr_ctx.qindex = input->q_index;
784 fdir_fltr_ctx.cnt_ena = input->cnt_ena;
785 fdir_fltr_ctx.cnt_index = input->cnt_index;
786 fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
787 fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
788 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
789 fdir_fltr_ctx.toq_prio = 0;
791 fdir_fltr_ctx.toq_prio = 3;
792 fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
793 ICE_FXD_FLTR_QW1_PCMD_REMOVE;
794 fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
795 fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
796 fdir_fltr_ctx.comp_report = input->comp_report;
797 fdir_fltr_ctx.fdid_prio = input->fdid_prio;
798 fdir_fltr_ctx.desc_prof = 1;
799 fdir_fltr_ctx.desc_prof_prio = 3;
800 ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
804 * ice_alloc_fd_res_cntr - obtain counter resource for FD type
805 * @hw: pointer to the hardware structure
806 * @cntr_id: returns counter index
808 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
810 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
811 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
815 * ice_free_fd_res_cntr - Free counter resource for FD type
816 * @hw: pointer to the hardware structure
817 * @cntr_id: counter index to be freed
819 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
821 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
822 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
826 * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
827 * @hw: pointer to the hardware structure
828 * @cntr_id: returns counter index
829 * @num_fltr: number of filter entries to be allocated
832 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
834 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
835 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
840 * ice_free_fd_guar_item - Free flow director guaranteed entries
841 * @hw: pointer to the hardware structure
842 * @cntr_id: counter index that needs to be freed
843 * @num_fltr: number of filters to be freed
846 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
848 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
849 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
854 * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
855 * @hw: pointer to the hardware structure
856 * @cntr_id: returns counter index
857 * @num_fltr: number of filter entries to be allocated
860 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
862 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
863 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
868 * ice_free_fd_shrd_item - Free flow director shared entries
869 * @hw: pointer to the hardware structure
870 * @cntr_id: counter index that needs to be freed
871 * @num_fltr: number of filters to be freed
874 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
876 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
877 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
882 * ice_get_fdir_cnt_all - get the number of Flow Director filters
883 * @hw: hardware data structure
885 * Returns the number of filters available on device
887 int ice_get_fdir_cnt_all(struct ice_hw *hw)
889 return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
893 * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
894 * @pkt: packet buffer
895 * @offset: offset into buffer
896 * @addr: IPv6 address to convert and insert into pkt at offset
898 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
902 for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
903 ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
904 sizeof(*addr), ICE_NONDMA_TO_NONDMA);
908 * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
909 * @pkt: packet buffer
910 * @offset: offset into buffer
911 * @data: 8 bit value to convert and insert into pkt at offset
913 * This function is designed for inserting qfi (6 bits) for gtpu.
915 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
919 ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
920 ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
924 * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
925 * @pkt: packet buffer
926 * @offset: offset into buffer
927 * @data: 8 bit value to convert and insert into pkt at offset
929 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
931 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
935 * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
936 * @pkt: packet buffer
937 * @offset: offset into buffer
938 * @data: 8 bit value to convert and insert into pkt at offset
940 * This function is designed for inserting Traffic Class (TC) for IPv6,
941 * since that TC is not aligned in number of bytes. Here we split it out
942 * into two part and fill each byte with data copy from pkt, then insert
943 * the two bytes data one by one.
945 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
949 high = (data >> 4) + (*(pkt + offset) & 0xF0);
950 ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
952 low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
953 ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
957 * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
958 * @pkt: packet buffer
959 * @offset: offset into buffer
960 * @data: 16 bit value to convert and insert into pkt at offset
962 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
964 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
968 * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
969 * @pkt: packet buffer
970 * @offset: offset into buffer
971 * @data: 32 bit value to convert and insert into pkt at offset
973 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
975 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
979 * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
980 * @pkt: packet buffer
981 * @addr: MAC address to convert and insert into pkt at offset
983 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
985 ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
989 * ice_fdir_get_gen_prgm_pkt - generate a training packet
990 * @hw: pointer to the hardware structure
991 * @input: flow director filter data structure
992 * @pkt: pointer to return filter packet
993 * @frag: generate a fragment packet
994 * @tun: true implies generate a tunnel packet
997 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
998 u8 *pkt, bool frag, bool tun)
1000 enum ice_fltr_ptype flow;
1005 if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1006 switch (input->ip.v4.proto) {
1007 case ICE_IP_PROTO_TCP:
1008 flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
1010 case ICE_IP_PROTO_UDP:
1011 flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
1013 case ICE_IP_PROTO_SCTP:
1014 flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
1017 flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
1020 } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1021 switch (input->ip.v6.proto) {
1022 case ICE_IP_PROTO_TCP:
1023 flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
1025 case ICE_IP_PROTO_UDP:
1026 flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
1028 case ICE_IP_PROTO_SCTP:
1029 flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
1032 flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
1036 flow = input->flow_type;
1039 for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
1040 if (ice_fdir_pkt[idx].flow == flow)
1042 if (idx == ICE_FDIR_NUM_PKT)
1043 return ICE_ERR_PARAM;
1045 ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
1046 ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
1049 if (!ice_get_open_tunnel_port(hw, TNL_ALL, &tnl_port))
1050 return ICE_ERR_DOES_NOT_EXIST;
1051 if (!ice_fdir_pkt[idx].tun_pkt)
1052 return ICE_ERR_PARAM;
1053 ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1054 ice_fdir_pkt[idx].tun_pkt_len, ICE_NONDMA_TO_NONDMA);
1055 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
1057 loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
1060 /* Reverse the src and dst, since the HW expects them to be from Tx
1061 * perspective. The input from user is from Rx filter perspective.
1064 case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
1065 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1066 input->ip.v4.src_ip);
1067 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1068 input->ip.v4.src_port);
1069 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1070 input->ip.v4.dst_ip);
1071 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1072 input->ip.v4.dst_port);
1073 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1074 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1075 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1077 loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
1079 case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
1080 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1081 ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1082 input->ext_data_outer.src_mac);
1083 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1084 input->ip_outer.v4.dst_ip);
1085 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1086 input->ip_outer.v4.src_ip);
1087 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1088 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1089 input->ip.v4.src_ip);
1090 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1091 input->ip.v4.src_port);
1092 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1093 input->ip.v4.dst_ip);
1094 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1095 input->ip.v4.dst_port);
1096 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1097 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1098 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1099 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1101 case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1102 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1103 input->ip.v4.src_ip);
1104 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1105 input->ip.v4.src_port);
1106 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1107 input->ip.v4.dst_ip);
1108 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1109 input->ip.v4.dst_port);
1110 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1111 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1112 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1114 case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1115 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1116 input->ip.v4.src_ip);
1117 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1118 input->ip.v4.dst_ip);
1119 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1120 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1121 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1122 input->ip.v4.proto);
1123 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1125 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
1126 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1127 ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac);
1128 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1129 input->ip_outer.v4.dst_ip);
1130 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1131 input->ip_outer.v4.src_ip);
1132 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1133 ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1134 input->vxlan_data.vni);
1135 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1136 input->ip.v4.src_ip);
1137 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1138 input->ip.v4.src_port);
1139 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1140 input->ip.v4.dst_ip);
1141 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1142 input->ip.v4.dst_port);
1143 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1144 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1145 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1146 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1148 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
1149 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1150 input->ip.v4.src_ip);
1151 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1152 input->ip.v4.dst_ip);
1153 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1154 input->gtpu_data.teid);
1156 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1157 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1158 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
1159 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER:
1160 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1161 input->ip.v4.src_ip);
1162 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1163 input->ip.v4.dst_ip);
1164 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1165 input->gtpu_data.teid);
1166 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1167 input->gtpu_data.qfi);
1169 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER:
1170 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1171 input->ip.v6.src_ip);
1172 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1173 input->ip.v6.dst_ip);
1174 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1175 input->gtpu_data.teid);
1177 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
1178 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1179 input->ip.v6.src_ip);
1180 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1181 input->ip.v6.dst_ip);
1182 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1183 input->gtpu_data.teid);
1184 ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
1185 input->gtpu_data.qfi);
1187 case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1188 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1189 input->l2tpv3_data.session_id);
1191 case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1192 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1193 input->l2tpv3_data.session_id);
1195 case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1196 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1197 input->ip.v4.sec_parm_idx);
1199 case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1200 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1201 input->ip.v6.sec_parm_idx);
1203 case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1204 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1205 input->ip.v4.sec_parm_idx);
1207 case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1208 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1209 input->ip.v6.sec_parm_idx);
1211 case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1212 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1213 input->ip.v4.src_ip);
1214 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1215 input->ip.v4.dst_ip);
1216 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1217 input->ip.v4.sec_parm_idx);
1219 case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1220 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1221 input->ip.v6.src_ip);
1222 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1223 input->ip.v6.dst_ip);
1224 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1225 input->ip.v6.sec_parm_idx);
1227 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1228 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1229 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1230 input->ip.v4.dst_port);
1232 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1233 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1234 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1235 input->ip.v6.dst_port);
1237 case ICE_FLTR_PTYPE_NON_IP_L2:
1238 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1239 input->ext_data.ether_type);
1241 case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1242 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1243 input->ip.v6.src_ip);
1244 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1245 input->ip.v6.dst_ip);
1246 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1247 input->ip.v6.src_port);
1248 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1249 input->ip.v6.dst_port);
1250 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1251 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1252 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1254 case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1255 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1256 input->ip.v6.src_ip);
1257 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1258 input->ip.v6.dst_ip);
1259 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1260 input->ip.v6.src_port);
1261 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1262 input->ip.v6.dst_port);
1263 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1264 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1265 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1267 case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1268 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1269 input->ip.v6.src_ip);
1270 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1271 input->ip.v6.dst_ip);
1272 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1273 input->ip.v6.src_port);
1274 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1275 input->ip.v6.dst_port);
1276 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1277 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1278 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1280 case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1281 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1282 input->ip.v6.src_ip);
1283 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1284 input->ip.v6.dst_ip);
1285 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1286 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1287 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1288 input->ip.v6.proto);
1289 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1292 return ICE_ERR_PARAM;
1295 if (input->flex_fltr)
1296 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1302 * ice_fdir_get_prgm_pkt - generate a training packet
1303 * @input: flow director filter data structure
1304 * @pkt: pointer to return filter packet
1305 * @frag: generate a fragment packet
1308 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1310 return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1314 * ice_fdir_has_frag - does flow type have 2 ptypes
1317 * returns true is there is a fragment packet for this ptype
1319 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1321 if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1328 * ice_fdir_find_by_idx - find filter with idx
1329 * @hw: pointer to hardware structure
1330 * @fltr_idx: index to find.
1332 * Returns pointer to filter if found or null
1334 struct ice_fdir_fltr *
1335 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1337 struct ice_fdir_fltr *rule;
1339 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1341 /* rule ID found in the list */
1342 if (fltr_idx == rule->fltr_id)
1344 if (fltr_idx < rule->fltr_id)
1351 * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1352 * @hw: hardware structure
1353 * @fltr: filter node to add to structure
1355 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1357 struct ice_fdir_fltr *rule, *parent = NULL;
1359 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1361 /* rule ID found or pass its spot in the list */
1362 if (rule->fltr_id >= fltr->fltr_id)
1368 LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1370 LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1374 * ice_fdir_update_cntrs - increment / decrement filter counter
1375 * @hw: pointer to hardware structure
1376 * @flow: filter flow type
1377 * @acl_fltr: true indicates an ACL filter
1378 * @add: true implies filters added
1381 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1382 bool acl_fltr, bool add)
1386 incr = add ? 1 : -1;
1387 hw->fdir_active_fltr += incr;
1388 if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1389 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1392 hw->acl_fltr_cnt[flow] += incr;
1394 hw->fdir_fltr_cnt[flow] += incr;
1399 * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1403 * Returns 0 on equal, returns non-0 if different
1405 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1407 return memcmp(a, b, 4 * sizeof(__be32));
1411 * ice_fdir_comp_rules - compare 2 filters
1412 * @a: a Flow Director filter data structure
1413 * @b: a Flow Director filter data structure
1414 * @v6: bool true if v6 filter
1416 * Returns true if the filters match
1419 ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6)
1421 enum ice_fltr_ptype flow_type = a->flow_type;
1423 /* The calling function already checks that the two filters have the
1427 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1428 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1429 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1430 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1431 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1432 a->ip.v4.dst_port == b->ip.v4.dst_port &&
1433 a->ip.v4.src_port == b->ip.v4.src_port)
1435 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1436 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1437 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1438 a->ip.v4.l4_header == b->ip.v4.l4_header &&
1439 a->ip.v4.proto == b->ip.v4.proto &&
1440 a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1441 a->ip.v4.tos == b->ip.v4.tos)
1445 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1446 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1447 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1448 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1449 a->ip.v6.src_port == b->ip.v6.src_port &&
1450 !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1452 !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1455 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1456 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1457 a->ip.v6.src_port == b->ip.v6.src_port)
1466 * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1467 * @hw: hardware data structure
1468 * @input: Flow Director filter data structure
1470 * Returns true if the filter is found in the list
1472 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1474 struct ice_fdir_fltr *rule;
1477 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1479 enum ice_fltr_ptype flow_type;
1481 if (rule->flow_type != input->flow_type)
1484 flow_type = input->flow_type;
1485 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1486 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1487 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1488 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1489 ret = ice_fdir_comp_rules(rule, input, false);
1491 ret = ice_fdir_comp_rules(rule, input, true);
1493 if (rule->fltr_id == input->fltr_id &&
1494 rule->q_index != input->q_index)
1505 * ice_clear_pf_fd_table - admin command to clear FD table for PF
1506 * @hw: hardware data structure
1508 * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
1510 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
1512 struct ice_aqc_clear_fd_table *cmd;
1513 struct ice_aq_desc desc;
1515 cmd = &desc.params.clear_fd_table;
1516 ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
1517 cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
1518 /* vsi_index must be 0 to clear FD table for a PF */
1519 cmd->vsi_index = CPU_TO_LE16(0);
1521 return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);