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_ipv4_udp_ecpri_tp0_pkt[] = {
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
318 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
325 static const u8 ice_fdir_tcpv6_pkt[] = {
326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
327 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
328 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
338 static const u8 ice_fdir_udpv6_pkt[] = {
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
341 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x08, 0x00, 0x00,
349 static const u8 ice_fdir_sctpv6_pkt[] = {
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
352 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
361 static const u8 ice_fdir_ipv6_pkt[] = {
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
364 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371 static const u8 ice_fdir_tcp4_tun_pkt[] = {
372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
374 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
380 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
381 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
383 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
384 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
387 static const u8 ice_fdir_udp4_tun_pkt[] = {
388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
390 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
396 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
397 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
399 0x00, 0x00, 0x00, 0x00,
402 static const u8 ice_fdir_sctp4_tun_pkt[] = {
403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
405 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
411 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
412 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
417 static const u8 ice_fdir_ip4_tun_pkt[] = {
418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
420 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
423 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
426 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
427 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
428 0x00, 0x00, 0x00, 0x00,
431 static const u8 ice_fdir_tcp6_tun_pkt[] = {
432 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
433 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
434 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
435 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
436 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
437 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
439 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
440 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
441 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
442 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0x50, 0x00, 0x20, 0x00,
447 0x00, 0x00, 0x00, 0x00,
450 static const u8 ice_fdir_udp6_tun_pkt[] = {
451 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
452 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
453 0x00, 0x62, 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, 0x08, 0x11, 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,
467 static const u8 ice_fdir_sctp6_tun_pkt[] = {
468 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
470 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
471 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
473 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
474 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
476 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
477 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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,
482 0x00, 0x00, 0x00, 0x00,
485 static const u8 ice_fdir_ip6_tun_pkt[] = {
486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
487 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
488 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
491 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
492 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
493 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
494 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
495 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
496 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
497 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
498 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
501 /* Flow Director no-op training packet table */
502 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
504 ICE_FLTR_PTYPE_NONF_IPV4_TCP,
505 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
506 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
509 ICE_FLTR_PTYPE_NONF_IPV4_UDP,
510 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
511 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
514 ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
515 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
516 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
519 ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
520 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
521 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
524 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
525 sizeof(ice_fdir_udp4_gtpu4_pkt),
526 ice_fdir_udp4_gtpu4_pkt,
527 sizeof(ice_fdir_udp4_gtpu4_pkt),
528 ice_fdir_udp4_gtpu4_pkt,
531 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
532 sizeof(ice_fdir_tcp4_gtpu4_pkt),
533 ice_fdir_tcp4_gtpu4_pkt,
534 sizeof(ice_fdir_tcp4_gtpu4_pkt),
535 ice_fdir_tcp4_gtpu4_pkt,
538 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
539 sizeof(ice_fdir_icmp4_gtpu4_pkt),
540 ice_fdir_icmp4_gtpu4_pkt,
541 sizeof(ice_fdir_icmp4_gtpu4_pkt),
542 ice_fdir_icmp4_gtpu4_pkt,
545 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
546 sizeof(ice_fdir_ipv4_gtpu4_pkt),
547 ice_fdir_ipv4_gtpu4_pkt,
548 sizeof(ice_fdir_ipv4_gtpu4_pkt),
549 ice_fdir_ipv4_gtpu4_pkt,
552 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER,
553 sizeof(ice_fdir_ipv6_gtpu6_pkt),
554 ice_fdir_ipv6_gtpu6_pkt,
555 sizeof(ice_fdir_ipv6_gtpu6_pkt),
556 ice_fdir_ipv6_gtpu6_pkt,
559 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER,
560 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
561 ice_fdir_ipv4_gtpu4_eh_pkt,
562 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
563 ice_fdir_ipv4_gtpu4_eh_pkt,
566 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER,
567 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
568 ice_fdir_ipv6_gtpu6_eh_pkt,
569 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
570 ice_fdir_ipv6_gtpu6_eh_pkt,
573 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
574 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
575 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
578 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
579 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
580 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
583 ICE_FLTR_PTYPE_NONF_IPV4_ESP,
584 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
585 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
588 ICE_FLTR_PTYPE_NONF_IPV6_ESP,
589 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
590 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
593 ICE_FLTR_PTYPE_NONF_IPV4_AH,
594 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
595 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
598 ICE_FLTR_PTYPE_NONF_IPV6_AH,
599 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
600 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
603 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
604 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
605 ice_fdir_ipv4_nat_t_esp_pkt,
606 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
607 ice_fdir_ipv4_nat_t_esp_pkt,
610 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
611 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
612 ice_fdir_ipv6_nat_t_esp_pkt,
613 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
614 ice_fdir_ipv6_nat_t_esp_pkt,
617 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
618 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
619 ice_fdir_ipv4_pfcp_node_pkt,
620 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
621 ice_fdir_ipv4_pfcp_node_pkt,
624 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
625 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
626 ice_fdir_ipv4_pfcp_session_pkt,
627 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
628 ice_fdir_ipv4_pfcp_session_pkt,
631 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
632 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
633 ice_fdir_ipv6_pfcp_node_pkt,
634 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
635 ice_fdir_ipv6_pfcp_node_pkt,
638 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
639 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
640 ice_fdir_ipv6_pfcp_session_pkt,
641 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
642 ice_fdir_ipv6_pfcp_session_pkt,
645 ICE_FLTR_PTYPE_NON_IP_L2,
646 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
647 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
650 ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN,
651 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
652 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
655 ICE_FLTR_PTYPE_NONF_ECPRI_TP0,
656 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
657 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
660 ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0,
661 sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
662 ice_fdir_ipv4_udp_ecpri_tp0_pkt,
663 sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
664 ice_fdir_ipv4_udp_ecpri_tp0_pkt,
667 ICE_FLTR_PTYPE_NONF_IPV6_TCP,
668 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
669 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
672 ICE_FLTR_PTYPE_NONF_IPV6_UDP,
673 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
674 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
677 ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
678 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
679 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
682 ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
683 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
684 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
688 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
691 * ice_set_dflt_val_fd_desc
692 * @fd_fltr_ctx: pointer to fd filter descriptor
694 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
696 fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
697 fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
698 fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
699 fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
700 fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
701 fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
702 fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
703 fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
704 fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
705 fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
706 fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
707 fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
708 fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
709 fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
710 fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
711 fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
712 fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
713 fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
714 fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
718 * ice_set_fd_desc_val
719 * @ctx: pointer to fd filter descriptor context
720 * @fdir_desc: populated with fd filter descriptor values
723 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
724 struct ice_fltr_desc *fdir_desc)
728 /* prep QW0 of FD filter programming desc */
729 qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
730 ICE_FXD_FLTR_QW0_QINDEX_M;
731 qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
732 ICE_FXD_FLTR_QW0_COMP_Q_M;
733 qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
734 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
735 qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
736 ICE_FXD_FLTR_QW0_FD_SPACE_M;
737 qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
738 ICE_FXD_FLTR_QW0_STAT_CNT_M;
739 qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
740 ICE_FXD_FLTR_QW0_STAT_ENA_M;
741 qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
742 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
743 qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
744 ICE_FXD_FLTR_QW0_TO_Q_M;
745 qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
746 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
747 qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
748 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
749 qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
750 ICE_FXD_FLTR_QW0_DROP_M;
751 qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
752 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
753 qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
754 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
755 qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
756 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
757 fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
759 /* prep QW1 of FD filter programming desc */
760 qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
761 ICE_FXD_FLTR_QW1_DTYPE_M;
762 qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
763 ICE_FXD_FLTR_QW1_PCMD_M;
764 qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
765 ICE_FXD_FLTR_QW1_PROF_PRI_M;
766 qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
767 ICE_FXD_FLTR_QW1_PROF_M;
768 qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
769 ICE_FXD_FLTR_QW1_FD_VSI_M;
770 qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
771 ICE_FXD_FLTR_QW1_SWAP_M;
772 qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
773 ICE_FXD_FLTR_QW1_FDID_PRI_M;
774 qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
775 ICE_FXD_FLTR_QW1_FDID_MDID_M;
776 qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
777 ICE_FXD_FLTR_QW1_FDID_M;
778 fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
782 * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
783 * @hw: pointer to the hardware structure
785 * @fdesc: filter descriptor
786 * @add: if add is true, this is an add operation, false implies delete
789 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
790 struct ice_fltr_desc *fdesc, bool add)
792 struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
794 /* set default context info */
795 ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
797 /* change sideband filtering values */
798 fdir_fltr_ctx.fdid = input->fltr_id;
799 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
800 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
801 fdir_fltr_ctx.qindex = 0;
802 } else if (input->dest_ctl ==
803 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
804 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
805 fdir_fltr_ctx.qindex = 0;
807 if (input->dest_ctl ==
808 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
809 fdir_fltr_ctx.toq = input->q_region;
810 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
811 fdir_fltr_ctx.qindex = input->q_index;
813 fdir_fltr_ctx.cnt_ena = input->cnt_ena;
814 fdir_fltr_ctx.cnt_index = input->cnt_index;
815 fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
816 fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
817 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
818 fdir_fltr_ctx.toq_prio = 0;
820 fdir_fltr_ctx.toq_prio = 3;
821 fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
822 ICE_FXD_FLTR_QW1_PCMD_REMOVE;
823 fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
824 fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
825 fdir_fltr_ctx.comp_report = input->comp_report;
826 fdir_fltr_ctx.fdid_prio = input->fdid_prio;
827 fdir_fltr_ctx.desc_prof = 1;
828 fdir_fltr_ctx.desc_prof_prio = 3;
829 ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
833 * ice_alloc_fd_res_cntr - obtain counter resource for FD type
834 * @hw: pointer to the hardware structure
835 * @cntr_id: returns counter index
837 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
839 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
840 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
844 * ice_free_fd_res_cntr - Free counter resource for FD type
845 * @hw: pointer to the hardware structure
846 * @cntr_id: counter index to be freed
848 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
850 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
851 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
855 * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
856 * @hw: pointer to the hardware structure
857 * @cntr_id: returns counter index
858 * @num_fltr: number of filter entries to be allocated
861 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
863 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
864 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
869 * ice_free_fd_guar_item - Free flow director guaranteed entries
870 * @hw: pointer to the hardware structure
871 * @cntr_id: counter index that needs to be freed
872 * @num_fltr: number of filters to be freed
875 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
877 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
878 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
883 * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
884 * @hw: pointer to the hardware structure
885 * @cntr_id: returns counter index
886 * @num_fltr: number of filter entries to be allocated
889 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
891 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
892 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
897 * ice_free_fd_shrd_item - Free flow director shared entries
898 * @hw: pointer to the hardware structure
899 * @cntr_id: counter index that needs to be freed
900 * @num_fltr: number of filters to be freed
903 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
905 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
906 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
911 * ice_get_fdir_cnt_all - get the number of Flow Director filters
912 * @hw: hardware data structure
914 * Returns the number of filters available on device
916 int ice_get_fdir_cnt_all(struct ice_hw *hw)
918 return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
922 * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
923 * @pkt: packet buffer
924 * @offset: offset into buffer
925 * @addr: IPv6 address to convert and insert into pkt at offset
927 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
931 for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
932 ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
933 sizeof(*addr), ICE_NONDMA_TO_NONDMA);
937 * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
938 * @pkt: packet buffer
939 * @offset: offset into buffer
940 * @data: 8 bit value to convert and insert into pkt at offset
942 * This function is designed for inserting qfi (6 bits) for gtpu.
944 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
948 ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
949 ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
953 * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
954 * @pkt: packet buffer
955 * @offset: offset into buffer
956 * @data: 8 bit value to convert and insert into pkt at offset
958 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
960 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
964 * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
965 * @pkt: packet buffer
966 * @offset: offset into buffer
967 * @data: 8 bit value to convert and insert into pkt at offset
969 * This function is designed for inserting Traffic Class (TC) for IPv6,
970 * since that TC is not aligned in number of bytes. Here we split it out
971 * into two part and fill each byte with data copy from pkt, then insert
972 * the two bytes data one by one.
974 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
978 high = (data >> 4) + (*(pkt + offset) & 0xF0);
979 ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
981 low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
982 ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
986 * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
987 * @pkt: packet buffer
988 * @offset: offset into buffer
989 * @data: 16 bit value to convert and insert into pkt at offset
991 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
993 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
997 * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
998 * @pkt: packet buffer
999 * @offset: offset into buffer
1000 * @data: 32 bit value to convert and insert into pkt at offset
1002 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
1004 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1008 * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
1009 * @pkt: packet buffer
1010 * @addr: MAC address to convert and insert into pkt at offset
1012 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
1014 ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
1018 * ice_fdir_get_open_tunnel_port
1019 * @hw: pointer to the hardware structure
1021 * @port: returns open port
1023 * returns an open tunnel port specified for this flow type
1025 static enum ice_status
1026 ice_fdir_get_open_tunnel_port(struct ice_hw *hw, enum ice_fltr_ptype flow,
1030 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1032 if (!ice_get_open_tunnel_port(hw, TNL_ECPRI, port))
1033 return ICE_ERR_DOES_NOT_EXIST;
1036 if (!ice_get_open_tunnel_port(hw, TNL_VXLAN, port) &&
1037 !ice_get_open_tunnel_port(hw, TNL_GENEVE, port))
1038 return ICE_ERR_DOES_NOT_EXIST;
1045 * ice_fdir_get_gen_prgm_pkt - generate a training packet
1046 * @hw: pointer to the hardware structure
1047 * @input: flow director filter data structure
1048 * @pkt: pointer to return filter packet
1049 * @frag: generate a fragment packet
1050 * @tun: true implies generate a tunnel packet
1053 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
1054 u8 *pkt, bool frag, bool tun)
1056 enum ice_fltr_ptype flow;
1061 if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1062 switch (input->ip.v4.proto) {
1063 case ICE_IP_PROTO_TCP:
1064 flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
1066 case ICE_IP_PROTO_UDP:
1067 flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
1069 case ICE_IP_PROTO_SCTP:
1070 flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
1073 flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
1076 } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1077 switch (input->ip.v6.proto) {
1078 case ICE_IP_PROTO_TCP:
1079 flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
1081 case ICE_IP_PROTO_UDP:
1082 flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
1084 case ICE_IP_PROTO_SCTP:
1085 flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
1088 flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
1092 flow = input->flow_type;
1095 for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
1096 if (ice_fdir_pkt[idx].flow == flow)
1098 if (idx == ICE_FDIR_NUM_PKT)
1099 return ICE_ERR_PARAM;
1101 ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
1102 ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
1105 enum ice_status ret;
1107 ret = ice_fdir_get_open_tunnel_port(hw, flow, &tnl_port);
1111 if (!ice_fdir_pkt[idx].tun_pkt)
1112 return ICE_ERR_PARAM;
1113 ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1114 ice_fdir_pkt[idx].tun_pkt_len, ICE_NONDMA_TO_NONDMA);
1115 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
1117 loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
1120 /* Reverse the src and dst, since the HW expects them to be from Tx
1121 * perspective. The input from user is from Rx filter perspective.
1124 case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
1125 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1126 input->ip.v4.src_ip);
1127 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1128 input->ip.v4.src_port);
1129 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1130 input->ip.v4.dst_ip);
1131 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1132 input->ip.v4.dst_port);
1133 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1134 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1135 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1137 loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
1139 case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
1140 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1141 ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1142 input->ext_data_outer.src_mac);
1143 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1144 input->ip_outer.v4.dst_ip);
1145 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1146 input->ip_outer.v4.src_ip);
1147 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1148 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1149 input->ip.v4.src_ip);
1150 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1151 input->ip.v4.src_port);
1152 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1153 input->ip.v4.dst_ip);
1154 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1155 input->ip.v4.dst_port);
1156 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1157 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1158 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1159 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1161 case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1162 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1163 input->ip.v4.src_ip);
1164 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1165 input->ip.v4.src_port);
1166 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1167 input->ip.v4.dst_ip);
1168 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1169 input->ip.v4.dst_port);
1170 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1171 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1172 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1174 case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1175 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1176 input->ip.v4.src_ip);
1177 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1178 input->ip.v4.dst_ip);
1179 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1180 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1181 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1182 input->ip.v4.proto);
1183 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1185 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
1186 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1187 ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac);
1188 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1189 input->ip_outer.v4.dst_ip);
1190 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1191 input->ip_outer.v4.src_ip);
1192 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1193 ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1194 input->vxlan_data.vni);
1195 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1196 input->ip.v4.src_ip);
1197 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1198 input->ip.v4.src_port);
1199 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1200 input->ip.v4.dst_ip);
1201 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1202 input->ip.v4.dst_port);
1203 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1204 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1205 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1206 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1208 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
1209 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1210 input->ip.v4.src_ip);
1211 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1212 input->ip.v4.dst_ip);
1213 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1214 input->gtpu_data.teid);
1216 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1217 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1218 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
1219 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER:
1220 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1221 input->ip.v4.src_ip);
1222 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1223 input->ip.v4.dst_ip);
1224 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1225 input->gtpu_data.teid);
1226 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1227 input->gtpu_data.qfi);
1229 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER:
1230 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1231 input->ip.v6.src_ip);
1232 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1233 input->ip.v6.dst_ip);
1234 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1235 input->gtpu_data.teid);
1237 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
1238 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1239 input->ip.v6.src_ip);
1240 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1241 input->ip.v6.dst_ip);
1242 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1243 input->gtpu_data.teid);
1244 ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
1245 input->gtpu_data.qfi);
1247 case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1248 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1249 input->l2tpv3_data.session_id);
1251 case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1252 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1253 input->l2tpv3_data.session_id);
1255 case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1256 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1257 input->ip.v4.sec_parm_idx);
1259 case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1260 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1261 input->ip.v6.sec_parm_idx);
1263 case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1264 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1265 input->ip.v4.sec_parm_idx);
1267 case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1268 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1269 input->ip.v6.sec_parm_idx);
1271 case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1272 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1273 input->ip.v4.src_ip);
1274 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1275 input->ip.v4.dst_ip);
1276 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1277 input->ip.v4.sec_parm_idx);
1279 case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1280 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1281 input->ip.v6.src_ip);
1282 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1283 input->ip.v6.dst_ip);
1284 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1285 input->ip.v6.sec_parm_idx);
1287 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1288 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1289 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1290 input->ip.v4.dst_port);
1292 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1293 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1294 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1295 input->ip.v6.dst_port);
1297 case ICE_FLTR_PTYPE_NON_IP_L2:
1298 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1299 input->ext_data.ether_type);
1301 case ICE_FLTR_PTYPE_NONF_ECPRI_TP0:
1302 ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET,
1303 input->ecpri_data.pc_id);
1305 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1306 /* Use pkt instead of loc, since PC_ID is in outer part */
1307 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET,
1308 input->ecpri_data.pc_id);
1310 case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1311 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1312 input->ip.v6.src_ip);
1313 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1314 input->ip.v6.dst_ip);
1315 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1316 input->ip.v6.src_port);
1317 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1318 input->ip.v6.dst_port);
1319 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1320 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1321 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1323 case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1324 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1325 input->ip.v6.src_ip);
1326 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1327 input->ip.v6.dst_ip);
1328 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1329 input->ip.v6.src_port);
1330 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1331 input->ip.v6.dst_port);
1332 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1333 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1334 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1336 case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1337 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1338 input->ip.v6.src_ip);
1339 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1340 input->ip.v6.dst_ip);
1341 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1342 input->ip.v6.src_port);
1343 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1344 input->ip.v6.dst_port);
1345 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1346 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1347 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1349 case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1350 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1351 input->ip.v6.src_ip);
1352 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1353 input->ip.v6.dst_ip);
1354 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1355 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1356 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1357 input->ip.v6.proto);
1358 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1361 return ICE_ERR_PARAM;
1364 if (input->flex_fltr)
1365 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1371 * ice_fdir_get_prgm_pkt - generate a training packet
1372 * @input: flow director filter data structure
1373 * @pkt: pointer to return filter packet
1374 * @frag: generate a fragment packet
1377 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1379 return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1383 * ice_fdir_has_frag - does flow type have 2 ptypes
1386 * returns true is there is a fragment packet for this ptype
1388 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1390 if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1397 * ice_fdir_find_by_idx - find filter with idx
1398 * @hw: pointer to hardware structure
1399 * @fltr_idx: index to find.
1401 * Returns pointer to filter if found or null
1403 struct ice_fdir_fltr *
1404 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1406 struct ice_fdir_fltr *rule;
1408 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1410 /* rule ID found in the list */
1411 if (fltr_idx == rule->fltr_id)
1413 if (fltr_idx < rule->fltr_id)
1420 * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1421 * @hw: hardware structure
1422 * @fltr: filter node to add to structure
1424 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1426 struct ice_fdir_fltr *rule, *parent = NULL;
1428 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1430 /* rule ID found or pass its spot in the list */
1431 if (rule->fltr_id >= fltr->fltr_id)
1437 LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1439 LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1443 * ice_fdir_update_cntrs - increment / decrement filter counter
1444 * @hw: pointer to hardware structure
1445 * @flow: filter flow type
1446 * @acl_fltr: true indicates an ACL filter
1447 * @add: true implies filters added
1450 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1451 bool acl_fltr, bool add)
1455 incr = add ? 1 : -1;
1456 hw->fdir_active_fltr += incr;
1457 if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1458 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1461 hw->acl_fltr_cnt[flow] += incr;
1463 hw->fdir_fltr_cnt[flow] += incr;
1468 * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1472 * Returns 0 on equal, returns non-0 if different
1474 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1476 return memcmp(a, b, 4 * sizeof(__be32));
1480 * ice_fdir_comp_rules - compare 2 filters
1481 * @a: a Flow Director filter data structure
1482 * @b: a Flow Director filter data structure
1483 * @v6: bool true if v6 filter
1485 * Returns true if the filters match
1488 ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6)
1490 enum ice_fltr_ptype flow_type = a->flow_type;
1492 /* The calling function already checks that the two filters have the
1496 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1497 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1498 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1499 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1500 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1501 a->ip.v4.dst_port == b->ip.v4.dst_port &&
1502 a->ip.v4.src_port == b->ip.v4.src_port)
1504 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1505 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1506 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1507 a->ip.v4.l4_header == b->ip.v4.l4_header &&
1508 a->ip.v4.proto == b->ip.v4.proto &&
1509 a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1510 a->ip.v4.tos == b->ip.v4.tos)
1514 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1515 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1516 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1517 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1518 a->ip.v6.src_port == b->ip.v6.src_port &&
1519 !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1521 !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1524 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1525 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1526 a->ip.v6.src_port == b->ip.v6.src_port)
1535 * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1536 * @hw: hardware data structure
1537 * @input: Flow Director filter data structure
1539 * Returns true if the filter is found in the list
1541 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1543 struct ice_fdir_fltr *rule;
1546 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1548 enum ice_fltr_ptype flow_type;
1550 if (rule->flow_type != input->flow_type)
1553 flow_type = input->flow_type;
1554 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1555 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1556 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1557 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1558 ret = ice_fdir_comp_rules(rule, input, false);
1560 ret = ice_fdir_comp_rules(rule, input, true);
1562 if (rule->fltr_id == input->fltr_id &&
1563 rule->q_index != input->q_index)
1574 * ice_clear_pf_fd_table - admin command to clear FD table for PF
1575 * @hw: hardware data structure
1577 * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
1579 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
1581 struct ice_aqc_clear_fd_table *cmd;
1582 struct ice_aq_desc desc;
1584 cmd = &desc.params.clear_fd_table;
1585 ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
1586 cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
1587 /* vsi_index must be 0 to clear FD table for a PF */
1588 cmd->vsi_index = CPU_TO_LE16(0);
1590 return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);