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_ecpri_tp0_pkt[] = {
309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0xAE, 0xFE, 0x10, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 static const u8 ice_fdir_tcpv6_pkt[] = {
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
318 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
328 static const u8 ice_fdir_udpv6_pkt[] = {
329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
331 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
339 static const u8 ice_fdir_sctpv6_pkt[] = {
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
342 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 static const u8 ice_fdir_ipv6_pkt[] = {
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 static const u8 ice_fdir_tcp4_tun_pkt[] = {
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
364 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
370 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
371 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
377 static const u8 ice_fdir_udp4_tun_pkt[] = {
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
380 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
383 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
386 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
387 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389 0x00, 0x00, 0x00, 0x00,
392 static const u8 ice_fdir_sctp4_tun_pkt[] = {
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
395 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
399 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
401 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
402 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407 static const u8 ice_fdir_ip4_tun_pkt[] = {
408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
410 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
416 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
417 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
418 0x00, 0x00, 0x00, 0x00,
421 static const u8 ice_fdir_tcp6_tun_pkt[] = {
422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
423 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
424 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
427 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
428 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
429 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
430 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
431 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
432 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
433 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
434 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
435 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
436 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
437 0x00, 0x00, 0x00, 0x00,
440 static const u8 ice_fdir_udp6_tun_pkt[] = {
441 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
442 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
443 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
444 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
445 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
446 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
447 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
448 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
449 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
450 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
451 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
452 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
453 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
457 static const u8 ice_fdir_sctp6_tun_pkt[] = {
458 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
459 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
460 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
463 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
464 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
465 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
466 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
467 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
468 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
470 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
471 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472 0x00, 0x00, 0x00, 0x00,
475 static const u8 ice_fdir_ip6_tun_pkt[] = {
476 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
477 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
478 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
479 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
480 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
481 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
482 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
483 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
484 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
485 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
487 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
488 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
491 /* Flow Director no-op training packet table */
492 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
494 ICE_FLTR_PTYPE_NONF_IPV4_TCP,
495 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
496 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
499 ICE_FLTR_PTYPE_NONF_IPV4_UDP,
500 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
501 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
504 ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
505 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
506 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
509 ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
510 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
511 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
514 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
515 sizeof(ice_fdir_udp4_gtpu4_pkt),
516 ice_fdir_udp4_gtpu4_pkt,
517 sizeof(ice_fdir_udp4_gtpu4_pkt),
518 ice_fdir_udp4_gtpu4_pkt,
521 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
522 sizeof(ice_fdir_tcp4_gtpu4_pkt),
523 ice_fdir_tcp4_gtpu4_pkt,
524 sizeof(ice_fdir_tcp4_gtpu4_pkt),
525 ice_fdir_tcp4_gtpu4_pkt,
528 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
529 sizeof(ice_fdir_icmp4_gtpu4_pkt),
530 ice_fdir_icmp4_gtpu4_pkt,
531 sizeof(ice_fdir_icmp4_gtpu4_pkt),
532 ice_fdir_icmp4_gtpu4_pkt,
535 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
536 sizeof(ice_fdir_ipv4_gtpu4_pkt),
537 ice_fdir_ipv4_gtpu4_pkt,
538 sizeof(ice_fdir_ipv4_gtpu4_pkt),
539 ice_fdir_ipv4_gtpu4_pkt,
542 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER,
543 sizeof(ice_fdir_ipv6_gtpu6_pkt),
544 ice_fdir_ipv6_gtpu6_pkt,
545 sizeof(ice_fdir_ipv6_gtpu6_pkt),
546 ice_fdir_ipv6_gtpu6_pkt,
549 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER,
550 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
551 ice_fdir_ipv4_gtpu4_eh_pkt,
552 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
553 ice_fdir_ipv4_gtpu4_eh_pkt,
556 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER,
557 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
558 ice_fdir_ipv6_gtpu6_eh_pkt,
559 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
560 ice_fdir_ipv6_gtpu6_eh_pkt,
563 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
564 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
565 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
568 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
569 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
570 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
573 ICE_FLTR_PTYPE_NONF_IPV4_ESP,
574 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
575 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
578 ICE_FLTR_PTYPE_NONF_IPV6_ESP,
579 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
580 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
583 ICE_FLTR_PTYPE_NONF_IPV4_AH,
584 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
585 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
588 ICE_FLTR_PTYPE_NONF_IPV6_AH,
589 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
590 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
593 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
594 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
595 ice_fdir_ipv4_nat_t_esp_pkt,
596 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
597 ice_fdir_ipv4_nat_t_esp_pkt,
600 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
601 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
602 ice_fdir_ipv6_nat_t_esp_pkt,
603 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
604 ice_fdir_ipv6_nat_t_esp_pkt,
607 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
608 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
609 ice_fdir_ipv4_pfcp_node_pkt,
610 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
611 ice_fdir_ipv4_pfcp_node_pkt,
614 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
615 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
616 ice_fdir_ipv4_pfcp_session_pkt,
617 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
618 ice_fdir_ipv4_pfcp_session_pkt,
621 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
622 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
623 ice_fdir_ipv6_pfcp_node_pkt,
624 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
625 ice_fdir_ipv6_pfcp_node_pkt,
628 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
629 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
630 ice_fdir_ipv6_pfcp_session_pkt,
631 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
632 ice_fdir_ipv6_pfcp_session_pkt,
635 ICE_FLTR_PTYPE_NON_IP_L2,
636 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
637 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
640 ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN,
641 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
642 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
645 ICE_FLTR_PTYPE_NONF_ECPRI_TP0,
646 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
647 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
650 ICE_FLTR_PTYPE_NONF_IPV6_TCP,
651 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
652 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
655 ICE_FLTR_PTYPE_NONF_IPV6_UDP,
656 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
657 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
660 ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
661 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
662 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
665 ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
666 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
667 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
671 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
674 * ice_set_dflt_val_fd_desc
675 * @fd_fltr_ctx: pointer to fd filter descriptor
677 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
679 fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
680 fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
681 fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
682 fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
683 fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
684 fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
685 fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
686 fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
687 fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
688 fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
689 fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
690 fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
691 fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
692 fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
693 fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
694 fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
695 fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
696 fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
697 fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
701 * ice_set_fd_desc_val
702 * @ctx: pointer to fd filter descriptor context
703 * @fdir_desc: populated with fd filter descriptor values
706 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
707 struct ice_fltr_desc *fdir_desc)
711 /* prep QW0 of FD filter programming desc */
712 qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
713 ICE_FXD_FLTR_QW0_QINDEX_M;
714 qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
715 ICE_FXD_FLTR_QW0_COMP_Q_M;
716 qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
717 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
718 qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
719 ICE_FXD_FLTR_QW0_FD_SPACE_M;
720 qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
721 ICE_FXD_FLTR_QW0_STAT_CNT_M;
722 qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
723 ICE_FXD_FLTR_QW0_STAT_ENA_M;
724 qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
725 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
726 qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
727 ICE_FXD_FLTR_QW0_TO_Q_M;
728 qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
729 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
730 qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
731 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
732 qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
733 ICE_FXD_FLTR_QW0_DROP_M;
734 qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
735 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
736 qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
737 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
738 qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
739 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
740 fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
742 /* prep QW1 of FD filter programming desc */
743 qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
744 ICE_FXD_FLTR_QW1_DTYPE_M;
745 qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
746 ICE_FXD_FLTR_QW1_PCMD_M;
747 qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
748 ICE_FXD_FLTR_QW1_PROF_PRI_M;
749 qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
750 ICE_FXD_FLTR_QW1_PROF_M;
751 qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
752 ICE_FXD_FLTR_QW1_FD_VSI_M;
753 qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
754 ICE_FXD_FLTR_QW1_SWAP_M;
755 qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
756 ICE_FXD_FLTR_QW1_FDID_PRI_M;
757 qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
758 ICE_FXD_FLTR_QW1_FDID_MDID_M;
759 qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
760 ICE_FXD_FLTR_QW1_FDID_M;
761 fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
765 * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
766 * @hw: pointer to the hardware structure
768 * @fdesc: filter descriptor
769 * @add: if add is true, this is an add operation, false implies delete
772 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
773 struct ice_fltr_desc *fdesc, bool add)
775 struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
777 /* set default context info */
778 ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
780 /* change sideband filtering values */
781 fdir_fltr_ctx.fdid = input->fltr_id;
782 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
783 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
784 fdir_fltr_ctx.qindex = 0;
785 } else if (input->dest_ctl ==
786 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
787 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
788 fdir_fltr_ctx.qindex = 0;
790 if (input->dest_ctl ==
791 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
792 fdir_fltr_ctx.toq = input->q_region;
793 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
794 fdir_fltr_ctx.qindex = input->q_index;
796 fdir_fltr_ctx.cnt_ena = input->cnt_ena;
797 fdir_fltr_ctx.cnt_index = input->cnt_index;
798 fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
799 fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
800 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
801 fdir_fltr_ctx.toq_prio = 0;
803 fdir_fltr_ctx.toq_prio = 3;
804 fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
805 ICE_FXD_FLTR_QW1_PCMD_REMOVE;
806 fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
807 fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
808 fdir_fltr_ctx.comp_report = input->comp_report;
809 fdir_fltr_ctx.fdid_prio = input->fdid_prio;
810 fdir_fltr_ctx.desc_prof = 1;
811 fdir_fltr_ctx.desc_prof_prio = 3;
812 ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
816 * ice_alloc_fd_res_cntr - obtain counter resource for FD type
817 * @hw: pointer to the hardware structure
818 * @cntr_id: returns counter index
820 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
822 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
823 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
827 * ice_free_fd_res_cntr - Free counter resource for FD type
828 * @hw: pointer to the hardware structure
829 * @cntr_id: counter index to be freed
831 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
833 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
834 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
838 * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
839 * @hw: pointer to the hardware structure
840 * @cntr_id: returns counter index
841 * @num_fltr: number of filter entries to be allocated
844 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
846 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
847 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
852 * ice_free_fd_guar_item - Free flow director guaranteed entries
853 * @hw: pointer to the hardware structure
854 * @cntr_id: counter index that needs to be freed
855 * @num_fltr: number of filters to be freed
858 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
860 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
861 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
866 * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
867 * @hw: pointer to the hardware structure
868 * @cntr_id: returns counter index
869 * @num_fltr: number of filter entries to be allocated
872 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
874 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
875 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
880 * ice_free_fd_shrd_item - Free flow director shared entries
881 * @hw: pointer to the hardware structure
882 * @cntr_id: counter index that needs to be freed
883 * @num_fltr: number of filters to be freed
886 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
888 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
889 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
894 * ice_get_fdir_cnt_all - get the number of Flow Director filters
895 * @hw: hardware data structure
897 * Returns the number of filters available on device
899 int ice_get_fdir_cnt_all(struct ice_hw *hw)
901 return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
905 * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
906 * @pkt: packet buffer
907 * @offset: offset into buffer
908 * @addr: IPv6 address to convert and insert into pkt at offset
910 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
914 for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
915 ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
916 sizeof(*addr), ICE_NONDMA_TO_NONDMA);
920 * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
921 * @pkt: packet buffer
922 * @offset: offset into buffer
923 * @data: 8 bit value to convert and insert into pkt at offset
925 * This function is designed for inserting qfi (6 bits) for gtpu.
927 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
931 ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
932 ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
936 * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
937 * @pkt: packet buffer
938 * @offset: offset into buffer
939 * @data: 8 bit value to convert and insert into pkt at offset
941 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
943 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
947 * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
948 * @pkt: packet buffer
949 * @offset: offset into buffer
950 * @data: 8 bit value to convert and insert into pkt at offset
952 * This function is designed for inserting Traffic Class (TC) for IPv6,
953 * since that TC is not aligned in number of bytes. Here we split it out
954 * into two part and fill each byte with data copy from pkt, then insert
955 * the two bytes data one by one.
957 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
961 high = (data >> 4) + (*(pkt + offset) & 0xF0);
962 ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
964 low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
965 ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
969 * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
970 * @pkt: packet buffer
971 * @offset: offset into buffer
972 * @data: 16 bit value to convert and insert into pkt at offset
974 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
976 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
980 * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
981 * @pkt: packet buffer
982 * @offset: offset into buffer
983 * @data: 32 bit value to convert and insert into pkt at offset
985 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
987 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
991 * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
992 * @pkt: packet buffer
993 * @addr: MAC address to convert and insert into pkt at offset
995 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
997 ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
1001 * ice_fdir_get_gen_prgm_pkt - generate a training packet
1002 * @hw: pointer to the hardware structure
1003 * @input: flow director filter data structure
1004 * @pkt: pointer to return filter packet
1005 * @frag: generate a fragment packet
1006 * @tun: true implies generate a tunnel packet
1009 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
1010 u8 *pkt, bool frag, bool tun)
1012 enum ice_fltr_ptype flow;
1017 if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1018 switch (input->ip.v4.proto) {
1019 case ICE_IP_PROTO_TCP:
1020 flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
1022 case ICE_IP_PROTO_UDP:
1023 flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
1025 case ICE_IP_PROTO_SCTP:
1026 flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
1029 flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
1032 } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1033 switch (input->ip.v6.proto) {
1034 case ICE_IP_PROTO_TCP:
1035 flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
1037 case ICE_IP_PROTO_UDP:
1038 flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
1040 case ICE_IP_PROTO_SCTP:
1041 flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
1044 flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
1048 flow = input->flow_type;
1051 for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
1052 if (ice_fdir_pkt[idx].flow == flow)
1054 if (idx == ICE_FDIR_NUM_PKT)
1055 return ICE_ERR_PARAM;
1057 ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
1058 ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
1061 if (!ice_get_open_tunnel_port(hw, TNL_ALL, &tnl_port))
1062 return ICE_ERR_DOES_NOT_EXIST;
1063 if (!ice_fdir_pkt[idx].tun_pkt)
1064 return ICE_ERR_PARAM;
1065 ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1066 ice_fdir_pkt[idx].tun_pkt_len, ICE_NONDMA_TO_NONDMA);
1067 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
1069 loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
1072 /* Reverse the src and dst, since the HW expects them to be from Tx
1073 * perspective. The input from user is from Rx filter perspective.
1076 case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
1077 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1078 input->ip.v4.src_ip);
1079 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1080 input->ip.v4.src_port);
1081 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1082 input->ip.v4.dst_ip);
1083 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1084 input->ip.v4.dst_port);
1085 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1086 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1087 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1089 loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
1091 case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
1092 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1093 ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1094 input->ext_data_outer.src_mac);
1095 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1096 input->ip_outer.v4.dst_ip);
1097 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1098 input->ip_outer.v4.src_ip);
1099 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1100 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1101 input->ip.v4.src_ip);
1102 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1103 input->ip.v4.src_port);
1104 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1105 input->ip.v4.dst_ip);
1106 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1107 input->ip.v4.dst_port);
1108 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1109 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1110 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1111 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1113 case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1114 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1115 input->ip.v4.src_ip);
1116 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1117 input->ip.v4.src_port);
1118 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1119 input->ip.v4.dst_ip);
1120 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1121 input->ip.v4.dst_port);
1122 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1123 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1124 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1126 case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1127 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1128 input->ip.v4.src_ip);
1129 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1130 input->ip.v4.dst_ip);
1131 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1132 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1133 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1134 input->ip.v4.proto);
1135 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1137 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
1138 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1139 ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac);
1140 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1141 input->ip_outer.v4.dst_ip);
1142 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1143 input->ip_outer.v4.src_ip);
1144 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1145 ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1146 input->vxlan_data.vni);
1147 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1148 input->ip.v4.src_ip);
1149 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1150 input->ip.v4.src_port);
1151 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1152 input->ip.v4.dst_ip);
1153 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1154 input->ip.v4.dst_port);
1155 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1156 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1157 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1158 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1160 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
1161 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1162 input->ip.v4.src_ip);
1163 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1164 input->ip.v4.dst_ip);
1165 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1166 input->gtpu_data.teid);
1168 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1169 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1170 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
1171 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER:
1172 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1173 input->ip.v4.src_ip);
1174 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1175 input->ip.v4.dst_ip);
1176 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1177 input->gtpu_data.teid);
1178 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1179 input->gtpu_data.qfi);
1181 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER:
1182 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1183 input->ip.v6.src_ip);
1184 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1185 input->ip.v6.dst_ip);
1186 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1187 input->gtpu_data.teid);
1189 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
1190 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1191 input->ip.v6.src_ip);
1192 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1193 input->ip.v6.dst_ip);
1194 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1195 input->gtpu_data.teid);
1196 ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
1197 input->gtpu_data.qfi);
1199 case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1200 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1201 input->l2tpv3_data.session_id);
1203 case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1204 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1205 input->l2tpv3_data.session_id);
1207 case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1208 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1209 input->ip.v4.sec_parm_idx);
1211 case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1212 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1213 input->ip.v6.sec_parm_idx);
1215 case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1216 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1217 input->ip.v4.sec_parm_idx);
1219 case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1220 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1221 input->ip.v6.sec_parm_idx);
1223 case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1224 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1225 input->ip.v4.src_ip);
1226 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1227 input->ip.v4.dst_ip);
1228 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1229 input->ip.v4.sec_parm_idx);
1231 case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1232 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1233 input->ip.v6.src_ip);
1234 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1235 input->ip.v6.dst_ip);
1236 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1237 input->ip.v6.sec_parm_idx);
1239 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1240 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1241 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1242 input->ip.v4.dst_port);
1244 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1245 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1246 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1247 input->ip.v6.dst_port);
1249 case ICE_FLTR_PTYPE_NON_IP_L2:
1250 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1251 input->ext_data.ether_type);
1253 case ICE_FLTR_PTYPE_NONF_ECPRI_TP0:
1254 ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET,
1255 input->ecpri_data.pc_id);
1257 case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1258 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1259 input->ip.v6.src_ip);
1260 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1261 input->ip.v6.dst_ip);
1262 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1263 input->ip.v6.src_port);
1264 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1265 input->ip.v6.dst_port);
1266 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1267 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1268 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1270 case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1271 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1272 input->ip.v6.src_ip);
1273 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1274 input->ip.v6.dst_ip);
1275 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1276 input->ip.v6.src_port);
1277 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1278 input->ip.v6.dst_port);
1279 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1280 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1281 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1283 case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1284 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1285 input->ip.v6.src_ip);
1286 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1287 input->ip.v6.dst_ip);
1288 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1289 input->ip.v6.src_port);
1290 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1291 input->ip.v6.dst_port);
1292 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1293 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1294 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1296 case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1297 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1298 input->ip.v6.src_ip);
1299 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1300 input->ip.v6.dst_ip);
1301 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1302 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1303 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1304 input->ip.v6.proto);
1305 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1308 return ICE_ERR_PARAM;
1311 if (input->flex_fltr)
1312 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1318 * ice_fdir_get_prgm_pkt - generate a training packet
1319 * @input: flow director filter data structure
1320 * @pkt: pointer to return filter packet
1321 * @frag: generate a fragment packet
1324 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1326 return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1330 * ice_fdir_has_frag - does flow type have 2 ptypes
1333 * returns true is there is a fragment packet for this ptype
1335 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1337 if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1344 * ice_fdir_find_by_idx - find filter with idx
1345 * @hw: pointer to hardware structure
1346 * @fltr_idx: index to find.
1348 * Returns pointer to filter if found or null
1350 struct ice_fdir_fltr *
1351 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1353 struct ice_fdir_fltr *rule;
1355 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1357 /* rule ID found in the list */
1358 if (fltr_idx == rule->fltr_id)
1360 if (fltr_idx < rule->fltr_id)
1367 * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1368 * @hw: hardware structure
1369 * @fltr: filter node to add to structure
1371 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1373 struct ice_fdir_fltr *rule, *parent = NULL;
1375 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1377 /* rule ID found or pass its spot in the list */
1378 if (rule->fltr_id >= fltr->fltr_id)
1384 LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1386 LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1390 * ice_fdir_update_cntrs - increment / decrement filter counter
1391 * @hw: pointer to hardware structure
1392 * @flow: filter flow type
1393 * @acl_fltr: true indicates an ACL filter
1394 * @add: true implies filters added
1397 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1398 bool acl_fltr, bool add)
1402 incr = add ? 1 : -1;
1403 hw->fdir_active_fltr += incr;
1404 if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1405 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1408 hw->acl_fltr_cnt[flow] += incr;
1410 hw->fdir_fltr_cnt[flow] += incr;
1415 * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1419 * Returns 0 on equal, returns non-0 if different
1421 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1423 return memcmp(a, b, 4 * sizeof(__be32));
1427 * ice_fdir_comp_rules - compare 2 filters
1428 * @a: a Flow Director filter data structure
1429 * @b: a Flow Director filter data structure
1430 * @v6: bool true if v6 filter
1432 * Returns true if the filters match
1435 ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6)
1437 enum ice_fltr_ptype flow_type = a->flow_type;
1439 /* The calling function already checks that the two filters have the
1443 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1444 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1445 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1446 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1447 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1448 a->ip.v4.dst_port == b->ip.v4.dst_port &&
1449 a->ip.v4.src_port == b->ip.v4.src_port)
1451 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1452 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1453 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1454 a->ip.v4.l4_header == b->ip.v4.l4_header &&
1455 a->ip.v4.proto == b->ip.v4.proto &&
1456 a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1457 a->ip.v4.tos == b->ip.v4.tos)
1461 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1462 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1463 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1464 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1465 a->ip.v6.src_port == b->ip.v6.src_port &&
1466 !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1468 !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1471 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1472 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1473 a->ip.v6.src_port == b->ip.v6.src_port)
1482 * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1483 * @hw: hardware data structure
1484 * @input: Flow Director filter data structure
1486 * Returns true if the filter is found in the list
1488 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1490 struct ice_fdir_fltr *rule;
1493 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1495 enum ice_fltr_ptype flow_type;
1497 if (rule->flow_type != input->flow_type)
1500 flow_type = input->flow_type;
1501 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1502 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1503 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1504 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1505 ret = ice_fdir_comp_rules(rule, input, false);
1507 ret = ice_fdir_comp_rules(rule, input, true);
1509 if (rule->fltr_id == input->fltr_id &&
1510 rule->q_index != input->q_index)
1521 * ice_clear_pf_fd_table - admin command to clear FD table for PF
1522 * @hw: hardware data structure
1524 * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
1526 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
1528 struct ice_aqc_clear_fd_table *cmd;
1529 struct ice_aq_desc desc;
1531 cmd = &desc.params.clear_fd_table;
1532 ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
1533 cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
1534 /* vsi_index must be 0 to clear FD table for a PF */
1535 cmd->vsi_index = CPU_TO_LE16(0);
1537 return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);