1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2001-2021 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_ipv4_gtpu4_pkt[] = {
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
63 0x00, 0x38, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
64 0x7c, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x24,
66 0xbf, 0xc0, 0x30, 0xff, 0x00, 0x14, 0x00, 0x00,
67 0x00, 0x00, 0x45, 0x00, 0x00, 0x14, 0x00, 0x01,
68 0x00, 0x00, 0x40, 0x00, 0x3a, 0x3d, 0x00, 0x00,
69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72 static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
73 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
75 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
76 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
77 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
78 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
79 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
80 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
81 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
82 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
83 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87 static const u8 ice_fdir_tcp4_gtpu4_pkt[] = {
88 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
90 0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
91 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
93 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
94 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
96 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06,
97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103 static const u8 ice_fdir_ipv4_gtpu4_eh_pkt[] = {
104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
106 0x00, 0x44, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
107 0x39, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x30,
109 0x76, 0x6c, 0x34, 0xff, 0x00, 0x20, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
112 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00,
113 0x3a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114 0x00, 0x00, 0x00, 0x00,
117 static const u8 ice_fdir_udp4_gtpu4_eh_pkt[] = {
118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
120 0x00, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
121 0x39, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x38,
123 0xb7, 0x1a, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
124 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
126 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
127 0x3a, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
129 0xbe, 0xc7, 0x00, 0x00,
132 static const u8 ice_fdir_tcp4_gtpu4_eh_pkt[] = {
133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
134 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
135 0x00, 0x58, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
136 0x39, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
137 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x44,
138 0xb6, 0xf7, 0x34, 0xff, 0x00, 0x34, 0x00, 0x00,
139 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
141 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
142 0x3a, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
145 0x20, 0x00, 0x4e, 0xd2, 0x00, 0x00, 0x00, 0x00,
148 static const u8 ice_fdir_ipv4_gtpu4_eh_dw_pkt[] = {
149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
151 0x00, 0x58, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
152 0x39, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x44,
154 0xb6, 0xf7, 0x34, 0xff, 0x00, 0x34, 0x00, 0x00,
155 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
157 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
158 0x3a, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
161 0x20, 0x00, 0x4e, 0xd2, 0x00, 0x00, 0x00, 0x00,
164 static const u8 ice_fdir_udp4_gtpu4_eh_dw_pkt[] = {
165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
167 0x00, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
168 0x39, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
169 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x38,
170 0xb7, 0x1a, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
171 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
173 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
174 0x3a, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
176 0xbe, 0xc7, 0x00, 0x00,
179 static const u8 ice_fdir_tcp4_gtpu4_eh_dw_pkt[] = {
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
182 0x00, 0x58, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
183 0x39, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x44,
185 0xb6, 0xf7, 0x34, 0xff, 0x00, 0x34, 0x00, 0x00,
186 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
188 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
189 0x3a, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
192 0x20, 0x00, 0x4e, 0xd2, 0x00, 0x00, 0x00, 0x00,
195 static const u8 ice_fdir_ipv4_gtpu4_eh_up_pkt[] = {
196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
198 0x00, 0x44, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
199 0x39, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x30,
201 0x76, 0x5c, 0x34, 0xff, 0x00, 0x20, 0x00, 0x00,
202 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x10,
203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
204 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00,
205 0x3a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00,
209 static const u8 ice_fdir_udp4_gtpu4_eh_up_pkt[] = {
210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
212 0x00, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
213 0x39, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x38,
215 0xb7, 0x0a, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
216 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x10,
217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
218 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
219 0x3a, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
221 0xbe, 0xc7, 0x00, 0x00,
224 static const u8 ice_fdir_tcp4_gtpu4_eh_up_pkt[] = {
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
227 0x00, 0x58, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
228 0x39, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x44,
230 0xb6, 0xe7, 0x34, 0xff, 0x00, 0x34, 0x00, 0x00,
231 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x10,
232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
233 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
234 0x3a, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
237 0x20, 0x00, 0x4e, 0xd2, 0x00, 0x00, 0x00, 0x00,
240 static const u8 ice_fdir_icmp4_gtpu4_pkt[] = {
241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
243 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
246 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
247 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
249 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01,
250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255 static const u8 ice_fdir_ipv6_gtpu6_pkt[] = {
256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
258 0x00, 0x00, 0x00, 0x38, 0x11, 0x40, 0x00, 0x00,
259 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68,
263 0x08, 0x68, 0x00, 0x38, 0x22, 0x43, 0x30, 0xff,
264 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
265 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
272 static const u8 ice_fdir_ipv6_gtpu6_eh_pkt[] = {
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
274 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
275 0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00,
276 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
277 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68,
280 0x08, 0x68, 0x00, 0x44, 0x1b, 0x9a, 0x34, 0xff,
281 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282 0x00, 0x85, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
283 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
284 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
288 0x00, 0x00, 0x00, 0x00,
291 static const u8 ice_fdir_ipv6_gtpu6_eh_dw_pkt[] = {
292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
294 0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00,
295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
296 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68,
299 0x08, 0x68, 0x00, 0x44, 0x1b, 0x9a, 0x34, 0xff,
300 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x85, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
303 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00,
310 static const u8 ice_fdir_ipv6_gtpu6_eh_up_pkt[] = {
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
313 0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68,
318 0x08, 0x68, 0x00, 0x44, 0x1b, 0x8a, 0x34, 0xff,
319 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x85, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
322 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326 0x00, 0x00, 0x00, 0x00,
329 static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
332 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
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,
338 static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
341 0x00, 0x00, 0x00, 0x00, 0x73, 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, 0x00, 0x00, 0x00, 0x00, 0x00,
350 static const u8 ice_fdir_ipv4_esp_pkt[] = {
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
353 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 static const u8 ice_fdir_ipv6_esp_pkt[] = {
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
370 static const u8 ice_fdir_ipv4_ah_pkt[] = {
371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
373 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380 static const u8 ice_fdir_ipv6_ah_pkt[] = {
381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
383 0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00,
384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
392 static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
395 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
402 static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
405 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410 0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
413 static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
416 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
417 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
418 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
419 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
424 static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
426 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
427 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
428 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
429 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
430 0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
431 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
435 static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
436 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
437 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
438 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
439 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
440 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
441 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
442 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
443 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
444 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
445 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
448 static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
449 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
450 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
451 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 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,
455 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
456 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
457 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
458 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
461 static const u8 ice_fdir_non_ip_l2_pkt[] = {
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,
467 static const u8 ice_fdir_ecpri_tp0_pkt[] = {
468 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469 0x00, 0x00, 0x00, 0x00, 0xAE, 0xFE, 0x10, 0x00,
470 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
471 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
474 static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = {
475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
477 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
478 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
479 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
480 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484 static const u8 ice_fdir_tcpv6_pkt[] = {
485 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
486 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
487 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
488 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
491 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
492 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
493 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
497 static const u8 ice_fdir_udpv6_pkt[] = {
498 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
499 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
500 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
501 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
502 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
503 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
504 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
505 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
508 static const u8 ice_fdir_sctpv6_pkt[] = {
509 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
510 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
511 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
512 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
513 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
514 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
515 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
516 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
520 static const u8 ice_fdir_ipv6_pkt[] = {
521 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
522 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
523 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
524 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
525 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
526 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
527 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
530 static const u8 ice_fdir_tcp4_tun_pkt[] = {
531 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
532 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
533 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
534 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
535 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
536 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
537 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
538 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
539 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
540 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
541 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
542 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
543 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
546 static const u8 ice_fdir_udp4_tun_pkt[] = {
547 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
548 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
549 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
550 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
551 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
552 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
553 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
554 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
555 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
556 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
557 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
558 0x00, 0x00, 0x00, 0x00,
561 static const u8 ice_fdir_sctp4_tun_pkt[] = {
562 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
563 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
564 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
565 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
566 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
567 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
568 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
569 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
570 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
571 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
572 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
573 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
576 static const u8 ice_fdir_ip4_tun_pkt[] = {
577 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
578 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
579 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
580 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
581 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
582 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
583 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
584 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
585 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
586 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
587 0x00, 0x00, 0x00, 0x00,
590 static const u8 ice_fdir_tcp6_tun_pkt[] = {
591 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
592 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
593 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
594 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
595 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
596 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
597 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
598 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
599 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
600 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
601 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
602 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
603 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
605 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
606 0x00, 0x00, 0x00, 0x00,
609 static const u8 ice_fdir_udp6_tun_pkt[] = {
610 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
611 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
612 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
613 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
614 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
615 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
616 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
617 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
618 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
619 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
620 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
622 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
623 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
626 static const u8 ice_fdir_sctp6_tun_pkt[] = {
627 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
628 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
629 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
630 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
631 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
632 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
633 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
634 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
635 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
636 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
637 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
638 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
639 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
640 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
641 0x00, 0x00, 0x00, 0x00,
644 static const u8 ice_fdir_ip6_tun_pkt[] = {
645 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
646 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
647 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
648 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
649 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
650 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
651 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
652 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
653 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
655 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
657 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
660 /* Flow Director no-op training packet table */
661 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
663 ICE_FLTR_PTYPE_NONF_IPV4_TCP,
664 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
665 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
668 ICE_FLTR_PTYPE_NONF_IPV4_UDP,
669 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
670 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
673 ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
674 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
675 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
678 ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
679 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
680 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
683 ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
684 sizeof(ice_fdir_ipv4_gtpu4_pkt),
685 ice_fdir_ipv4_gtpu4_pkt,
686 sizeof(ice_fdir_ipv4_gtpu4_pkt),
687 ice_fdir_ipv4_gtpu4_pkt,
690 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH,
691 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
692 ice_fdir_ipv4_gtpu4_eh_pkt,
693 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
694 ice_fdir_ipv4_gtpu4_eh_pkt,
697 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW,
698 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
699 ice_fdir_ipv4_gtpu4_eh_dw_pkt,
700 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
701 ice_fdir_ipv4_gtpu4_eh_dw_pkt,
704 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP,
705 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
706 ice_fdir_ipv4_gtpu4_eh_up_pkt,
707 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
708 ice_fdir_ipv4_gtpu4_eh_up_pkt,
711 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4,
712 sizeof(ice_fdir_ipv4_gtpu4_pkt),
713 ice_fdir_ipv4_gtpu4_pkt,
714 sizeof(ice_fdir_ipv4_gtpu4_pkt),
715 ice_fdir_ipv4_gtpu4_pkt,
718 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
719 sizeof(ice_fdir_udp4_gtpu4_pkt),
720 ice_fdir_udp4_gtpu4_pkt,
721 sizeof(ice_fdir_udp4_gtpu4_pkt),
722 ice_fdir_udp4_gtpu4_pkt,
725 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
726 sizeof(ice_fdir_tcp4_gtpu4_pkt),
727 ice_fdir_tcp4_gtpu4_pkt,
728 sizeof(ice_fdir_tcp4_gtpu4_pkt),
729 ice_fdir_tcp4_gtpu4_pkt,
732 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4,
733 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
734 ice_fdir_ipv4_gtpu4_eh_pkt,
735 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
736 ice_fdir_ipv4_gtpu4_eh_pkt,
739 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP,
740 sizeof(ice_fdir_udp4_gtpu4_eh_pkt),
741 ice_fdir_udp4_gtpu4_eh_pkt,
742 sizeof(ice_fdir_udp4_gtpu4_eh_pkt),
743 ice_fdir_udp4_gtpu4_eh_pkt,
746 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP,
747 sizeof(ice_fdir_tcp4_gtpu4_eh_pkt),
748 ice_fdir_tcp4_gtpu4_eh_pkt,
749 sizeof(ice_fdir_tcp4_gtpu4_eh_pkt),
750 ice_fdir_tcp4_gtpu4_eh_pkt,
753 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4,
754 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
755 ice_fdir_ipv4_gtpu4_eh_dw_pkt,
756 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
757 ice_fdir_ipv4_gtpu4_eh_dw_pkt,
760 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP,
761 sizeof(ice_fdir_udp4_gtpu4_eh_dw_pkt),
762 ice_fdir_udp4_gtpu4_eh_dw_pkt,
763 sizeof(ice_fdir_udp4_gtpu4_eh_dw_pkt),
764 ice_fdir_udp4_gtpu4_eh_dw_pkt,
767 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP,
768 sizeof(ice_fdir_tcp4_gtpu4_eh_dw_pkt),
769 ice_fdir_tcp4_gtpu4_eh_dw_pkt,
770 sizeof(ice_fdir_tcp4_gtpu4_eh_dw_pkt),
771 ice_fdir_tcp4_gtpu4_eh_dw_pkt,
774 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4,
775 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
776 ice_fdir_ipv4_gtpu4_eh_up_pkt,
777 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
778 ice_fdir_ipv4_gtpu4_eh_up_pkt,
781 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP,
782 sizeof(ice_fdir_udp4_gtpu4_eh_up_pkt),
783 ice_fdir_udp4_gtpu4_eh_up_pkt,
784 sizeof(ice_fdir_udp4_gtpu4_eh_up_pkt),
785 ice_fdir_udp4_gtpu4_eh_up_pkt,
788 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP,
789 sizeof(ice_fdir_tcp4_gtpu4_eh_up_pkt),
790 ice_fdir_tcp4_gtpu4_eh_up_pkt,
791 sizeof(ice_fdir_tcp4_gtpu4_eh_up_pkt),
792 ice_fdir_tcp4_gtpu4_eh_up_pkt,
795 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
796 sizeof(ice_fdir_icmp4_gtpu4_pkt),
797 ice_fdir_icmp4_gtpu4_pkt,
798 sizeof(ice_fdir_icmp4_gtpu4_pkt),
799 ice_fdir_icmp4_gtpu4_pkt,
802 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
803 sizeof(ice_fdir_ipv4_gtpu4_pkt),
804 ice_fdir_ipv4_gtpu4_pkt,
805 sizeof(ice_fdir_ipv4_gtpu4_pkt),
806 ice_fdir_ipv4_gtpu4_pkt,
809 ICE_FLTR_PTYPE_NONF_IPV6_GTPU,
810 sizeof(ice_fdir_ipv6_gtpu6_pkt),
811 ice_fdir_ipv6_gtpu6_pkt,
812 sizeof(ice_fdir_ipv6_gtpu6_pkt),
813 ice_fdir_ipv6_gtpu6_pkt,
816 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH,
817 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
818 ice_fdir_ipv6_gtpu6_eh_pkt,
819 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
820 ice_fdir_ipv6_gtpu6_eh_pkt,
823 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW,
824 sizeof(ice_fdir_ipv6_gtpu6_eh_dw_pkt),
825 ice_fdir_ipv6_gtpu6_eh_dw_pkt,
826 sizeof(ice_fdir_ipv6_gtpu6_eh_dw_pkt),
827 ice_fdir_ipv6_gtpu6_eh_dw_pkt,
830 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP,
831 sizeof(ice_fdir_ipv6_gtpu6_eh_up_pkt),
832 ice_fdir_ipv6_gtpu6_eh_up_pkt,
833 sizeof(ice_fdir_ipv6_gtpu6_eh_up_pkt),
834 ice_fdir_ipv6_gtpu6_eh_up_pkt,
837 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER,
838 sizeof(ice_fdir_ipv6_gtpu6_pkt),
839 ice_fdir_ipv6_gtpu6_pkt,
840 sizeof(ice_fdir_ipv6_gtpu6_pkt),
841 ice_fdir_ipv6_gtpu6_pkt,
844 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER,
845 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
846 ice_fdir_ipv4_gtpu4_eh_pkt,
847 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
848 ice_fdir_ipv4_gtpu4_eh_pkt,
851 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER,
852 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
853 ice_fdir_ipv6_gtpu6_eh_pkt,
854 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
855 ice_fdir_ipv6_gtpu6_eh_pkt,
858 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
859 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
860 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
863 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
864 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
865 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
868 ICE_FLTR_PTYPE_NONF_IPV4_ESP,
869 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
870 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
873 ICE_FLTR_PTYPE_NONF_IPV6_ESP,
874 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
875 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
878 ICE_FLTR_PTYPE_NONF_IPV4_AH,
879 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
880 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
883 ICE_FLTR_PTYPE_NONF_IPV6_AH,
884 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
885 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
888 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
889 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
890 ice_fdir_ipv4_nat_t_esp_pkt,
891 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
892 ice_fdir_ipv4_nat_t_esp_pkt,
895 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
896 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
897 ice_fdir_ipv6_nat_t_esp_pkt,
898 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
899 ice_fdir_ipv6_nat_t_esp_pkt,
902 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
903 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
904 ice_fdir_ipv4_pfcp_node_pkt,
905 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
906 ice_fdir_ipv4_pfcp_node_pkt,
909 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
910 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
911 ice_fdir_ipv4_pfcp_session_pkt,
912 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
913 ice_fdir_ipv4_pfcp_session_pkt,
916 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
917 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
918 ice_fdir_ipv6_pfcp_node_pkt,
919 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
920 ice_fdir_ipv6_pfcp_node_pkt,
923 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
924 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
925 ice_fdir_ipv6_pfcp_session_pkt,
926 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
927 ice_fdir_ipv6_pfcp_session_pkt,
930 ICE_FLTR_PTYPE_NON_IP_L2,
931 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
932 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
935 ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN,
936 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
937 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
940 ICE_FLTR_PTYPE_NONF_ECPRI_TP0,
941 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
942 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
945 ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0,
946 sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
947 ice_fdir_ipv4_udp_ecpri_tp0_pkt,
948 sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
949 ice_fdir_ipv4_udp_ecpri_tp0_pkt,
952 ICE_FLTR_PTYPE_NONF_IPV6_TCP,
953 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
954 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
957 ICE_FLTR_PTYPE_NONF_IPV6_UDP,
958 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
959 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
962 ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
963 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
964 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
967 ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
968 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
969 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
973 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
976 * ice_set_dflt_val_fd_desc
977 * @fd_fltr_ctx: pointer to fd filter descriptor
979 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
981 fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
982 fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
983 fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
984 fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
985 fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
986 fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
987 fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
988 fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
989 fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
990 fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
991 fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
992 fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
993 fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
994 fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
995 fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
996 fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
997 fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
998 fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
999 fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
1003 * ice_set_fd_desc_val
1004 * @ctx: pointer to fd filter descriptor context
1005 * @fdir_desc: populated with fd filter descriptor values
1008 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
1009 struct ice_fltr_desc *fdir_desc)
1013 /* prep QW0 of FD filter programming desc */
1014 qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
1015 ICE_FXD_FLTR_QW0_QINDEX_M;
1016 qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
1017 ICE_FXD_FLTR_QW0_COMP_Q_M;
1018 qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
1019 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
1020 qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
1021 ICE_FXD_FLTR_QW0_FD_SPACE_M;
1022 qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
1023 ICE_FXD_FLTR_QW0_STAT_CNT_M;
1024 qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
1025 ICE_FXD_FLTR_QW0_STAT_ENA_M;
1026 qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
1027 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
1028 qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
1029 ICE_FXD_FLTR_QW0_TO_Q_M;
1030 qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
1031 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
1032 qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
1033 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
1034 qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
1035 ICE_FXD_FLTR_QW0_DROP_M;
1036 qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
1037 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
1038 qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
1039 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
1040 qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
1041 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
1042 fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
1044 /* prep QW1 of FD filter programming desc */
1045 qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
1046 ICE_FXD_FLTR_QW1_DTYPE_M;
1047 qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
1048 ICE_FXD_FLTR_QW1_PCMD_M;
1049 qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
1050 ICE_FXD_FLTR_QW1_PROF_PRI_M;
1051 qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
1052 ICE_FXD_FLTR_QW1_PROF_M;
1053 qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
1054 ICE_FXD_FLTR_QW1_FD_VSI_M;
1055 qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
1056 ICE_FXD_FLTR_QW1_SWAP_M;
1057 qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
1058 ICE_FXD_FLTR_QW1_FDID_PRI_M;
1059 qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
1060 ICE_FXD_FLTR_QW1_FDID_MDID_M;
1061 qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
1062 ICE_FXD_FLTR_QW1_FDID_M;
1063 fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
1067 * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
1068 * @hw: pointer to the hardware structure
1070 * @fdesc: filter descriptor
1071 * @add: if add is true, this is an add operation, false implies delete
1074 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
1075 struct ice_fltr_desc *fdesc, bool add)
1077 struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
1079 /* set default context info */
1080 ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
1082 /* change sideband filtering values */
1083 fdir_fltr_ctx.fdid = input->fltr_id;
1084 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
1085 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
1086 fdir_fltr_ctx.qindex = 0;
1087 } else if (input->dest_ctl ==
1088 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
1089 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
1090 fdir_fltr_ctx.qindex = 0;
1092 if (input->dest_ctl ==
1093 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
1094 fdir_fltr_ctx.toq = input->q_region;
1095 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
1096 fdir_fltr_ctx.qindex = input->q_index;
1098 fdir_fltr_ctx.cnt_ena = input->cnt_ena;
1099 fdir_fltr_ctx.cnt_index = input->cnt_index;
1100 fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
1101 fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
1102 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
1103 fdir_fltr_ctx.toq_prio = 0;
1105 fdir_fltr_ctx.toq_prio = 3;
1106 fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
1107 ICE_FXD_FLTR_QW1_PCMD_REMOVE;
1108 fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
1109 fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
1110 fdir_fltr_ctx.comp_report = input->comp_report;
1111 fdir_fltr_ctx.fdid_prio = input->fdid_prio;
1112 fdir_fltr_ctx.desc_prof = 1;
1113 fdir_fltr_ctx.desc_prof_prio = 3;
1114 ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
1118 * ice_alloc_fd_res_cntr - obtain counter resource for FD type
1119 * @hw: pointer to the hardware structure
1120 * @cntr_id: returns counter index
1122 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
1124 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
1125 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
1129 * ice_free_fd_res_cntr - Free counter resource for FD type
1130 * @hw: pointer to the hardware structure
1131 * @cntr_id: counter index to be freed
1133 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
1135 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
1136 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
1140 * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
1141 * @hw: pointer to the hardware structure
1142 * @cntr_id: returns counter index
1143 * @num_fltr: number of filter entries to be allocated
1146 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
1148 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
1149 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1154 * ice_free_fd_guar_item - Free flow director guaranteed entries
1155 * @hw: pointer to the hardware structure
1156 * @cntr_id: counter index that needs to be freed
1157 * @num_fltr: number of filters to be freed
1160 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
1162 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
1163 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1168 * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
1169 * @hw: pointer to the hardware structure
1170 * @cntr_id: returns counter index
1171 * @num_fltr: number of filter entries to be allocated
1174 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
1176 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
1177 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1182 * ice_free_fd_shrd_item - Free flow director shared entries
1183 * @hw: pointer to the hardware structure
1184 * @cntr_id: counter index that needs to be freed
1185 * @num_fltr: number of filters to be freed
1188 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
1190 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
1191 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1196 * ice_get_fdir_cnt_all - get the number of Flow Director filters
1197 * @hw: hardware data structure
1199 * Returns the number of filters available on device
1201 int ice_get_fdir_cnt_all(struct ice_hw *hw)
1203 return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
1207 * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
1208 * @pkt: packet buffer
1209 * @offset: offset into buffer
1210 * @addr: IPv6 address to convert and insert into pkt at offset
1212 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
1216 for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
1217 ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
1218 sizeof(*addr), ICE_NONDMA_TO_NONDMA);
1222 * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
1223 * @pkt: packet buffer
1224 * @offset: offset into buffer
1225 * @data: 8 bit value to convert and insert into pkt at offset
1227 * This function is designed for inserting qfi (6 bits) for gtpu.
1229 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
1233 ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
1234 ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
1238 * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
1239 * @pkt: packet buffer
1240 * @offset: offset into buffer
1241 * @data: 8 bit value to convert and insert into pkt at offset
1243 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
1245 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1249 * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
1250 * @pkt: packet buffer
1251 * @offset: offset into buffer
1252 * @data: 8 bit value to convert and insert into pkt at offset
1254 * This function is designed for inserting Traffic Class (TC) for IPv6,
1255 * since that TC is not aligned in number of bytes. Here we split it out
1256 * into two part and fill each byte with data copy from pkt, then insert
1257 * the two bytes data one by one.
1259 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
1263 high = (data >> 4) + (*(pkt + offset) & 0xF0);
1264 ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
1266 low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
1267 ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
1271 * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
1272 * @pkt: packet buffer
1273 * @offset: offset into buffer
1274 * @data: 16 bit value to convert and insert into pkt at offset
1276 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
1278 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1282 * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
1283 * @pkt: packet buffer
1284 * @offset: offset into buffer
1285 * @data: 32 bit value to convert and insert into pkt at offset
1287 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
1289 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1293 * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
1294 * @pkt: packet buffer
1295 * @addr: MAC address to convert and insert into pkt at offset
1297 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
1299 ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
1303 * ice_fdir_get_open_tunnel_port
1304 * @hw: pointer to the hardware structure
1306 * @port: returns open port
1308 * returns an open tunnel port specified for this flow type
1310 static enum ice_status
1311 ice_fdir_get_open_tunnel_port(struct ice_hw *hw, enum ice_fltr_ptype flow,
1315 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1317 if (!ice_get_open_tunnel_port(hw, TNL_ECPRI, port))
1318 return ICE_ERR_DOES_NOT_EXIST;
1321 if (!ice_get_open_tunnel_port(hw, TNL_VXLAN, port) &&
1322 !ice_get_open_tunnel_port(hw, TNL_GENEVE, port))
1323 return ICE_ERR_DOES_NOT_EXIST;
1330 * ice_fdir_get_gen_prgm_pkt - generate a training packet
1331 * @hw: pointer to the hardware structure
1332 * @input: flow director filter data structure
1333 * @pkt: pointer to return filter packet
1334 * @frag: generate a fragment packet
1335 * @tun: true implies generate a tunnel packet
1338 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
1339 u8 *pkt, bool frag, bool tun)
1341 enum ice_fltr_ptype flow;
1346 if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1347 switch (input->ip.v4.proto) {
1348 case ICE_IP_PROTO_TCP:
1349 flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
1351 case ICE_IP_PROTO_UDP:
1352 flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
1354 case ICE_IP_PROTO_SCTP:
1355 flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
1358 flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
1361 } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1362 switch (input->ip.v6.proto) {
1363 case ICE_IP_PROTO_TCP:
1364 flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
1366 case ICE_IP_PROTO_UDP:
1367 flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
1369 case ICE_IP_PROTO_SCTP:
1370 flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
1373 flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
1377 flow = input->flow_type;
1380 for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
1381 if (ice_fdir_pkt[idx].flow == flow)
1383 if (idx == ICE_FDIR_NUM_PKT)
1384 return ICE_ERR_PARAM;
1386 ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
1387 ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
1390 enum ice_status ret;
1392 ret = ice_fdir_get_open_tunnel_port(hw, flow, &tnl_port);
1396 if (!ice_fdir_pkt[idx].tun_pkt)
1397 return ICE_ERR_PARAM;
1398 ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1399 ice_fdir_pkt[idx].tun_pkt_len, ICE_NONDMA_TO_NONDMA);
1400 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
1402 loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
1405 /* Reverse the src and dst, since the HW expects them to be from Tx
1406 * perspective. The input from user is from Rx filter perspective.
1409 case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
1410 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1411 input->ip.v4.src_ip);
1412 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1413 input->ip.v4.src_port);
1414 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1415 input->ip.v4.dst_ip);
1416 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1417 input->ip.v4.dst_port);
1418 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1419 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1420 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1422 loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
1424 case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
1425 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1426 ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1427 input->ext_data_outer.src_mac);
1428 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1429 input->ip_outer.v4.dst_ip);
1430 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1431 input->ip_outer.v4.src_ip);
1432 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1433 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1434 input->ip.v4.src_ip);
1435 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1436 input->ip.v4.src_port);
1437 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1438 input->ip.v4.dst_ip);
1439 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1440 input->ip.v4.dst_port);
1441 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1442 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1443 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1444 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1446 case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1447 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1448 input->ip.v4.src_ip);
1449 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1450 input->ip.v4.src_port);
1451 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1452 input->ip.v4.dst_ip);
1453 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1454 input->ip.v4.dst_port);
1455 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1456 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1457 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1459 case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1460 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1461 input->ip.v4.src_ip);
1462 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1463 input->ip.v4.dst_ip);
1464 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1465 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1466 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1467 input->ip.v4.proto);
1468 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1470 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
1471 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1472 ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac);
1473 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1474 input->ip_outer.v4.dst_ip);
1475 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1476 input->ip_outer.v4.src_ip);
1477 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1478 ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1479 input->vxlan_data.vni);
1480 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1481 input->ip.v4.src_ip);
1482 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1483 input->ip.v4.src_port);
1484 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1485 input->ip.v4.dst_ip);
1486 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1487 input->ip.v4.dst_port);
1488 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1489 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1490 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1491 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1493 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU:
1494 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
1495 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1496 input->ip.v4.src_ip);
1497 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1498 input->ip.v4.dst_ip);
1499 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1500 input->gtpu_data.teid);
1502 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH:
1503 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW:
1504 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP:
1505 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1506 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1507 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
1508 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER:
1509 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1510 input->ip.v4.src_ip);
1511 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1512 input->ip.v4.dst_ip);
1513 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1514 input->gtpu_data.teid);
1515 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1516 input->gtpu_data.qfi);
1518 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU:
1519 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER:
1520 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1521 input->ip.v6.src_ip);
1522 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1523 input->ip.v6.dst_ip);
1524 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1525 input->gtpu_data.teid);
1527 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH:
1528 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW:
1529 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP:
1530 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
1531 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1532 input->ip.v6.src_ip);
1533 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1534 input->ip.v6.dst_ip);
1535 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1536 input->gtpu_data.teid);
1537 ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
1538 input->gtpu_data.qfi);
1540 case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1541 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1542 input->l2tpv3_data.session_id);
1544 case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1545 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1546 input->l2tpv3_data.session_id);
1548 case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1549 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1550 input->ip.v4.sec_parm_idx);
1552 case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1553 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1554 input->ip.v6.sec_parm_idx);
1556 case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1557 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1558 input->ip.v4.sec_parm_idx);
1560 case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1561 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1562 input->ip.v6.sec_parm_idx);
1564 case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1565 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1566 input->ip.v4.src_ip);
1567 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1568 input->ip.v4.dst_ip);
1569 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1570 input->ip.v4.sec_parm_idx);
1572 case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1573 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1574 input->ip.v6.src_ip);
1575 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1576 input->ip.v6.dst_ip);
1577 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1578 input->ip.v6.sec_parm_idx);
1580 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1581 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1582 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1583 input->ip.v4.dst_port);
1585 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1586 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1587 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1588 input->ip.v6.dst_port);
1590 case ICE_FLTR_PTYPE_NON_IP_L2:
1591 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1592 input->ext_data.ether_type);
1594 case ICE_FLTR_PTYPE_NONF_ECPRI_TP0:
1595 ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET,
1596 input->ecpri_data.pc_id);
1598 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1599 /* Use pkt instead of loc, since PC_ID is in outer part */
1600 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET,
1601 input->ecpri_data.pc_id);
1603 case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1604 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1605 input->ip.v6.src_ip);
1606 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1607 input->ip.v6.dst_ip);
1608 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1609 input->ip.v6.src_port);
1610 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1611 input->ip.v6.dst_port);
1612 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1613 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1614 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1616 case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1617 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1618 input->ip.v6.src_ip);
1619 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1620 input->ip.v6.dst_ip);
1621 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1622 input->ip.v6.src_port);
1623 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1624 input->ip.v6.dst_port);
1625 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1626 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1627 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1629 case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1630 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1631 input->ip.v6.src_ip);
1632 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1633 input->ip.v6.dst_ip);
1634 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1635 input->ip.v6.src_port);
1636 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1637 input->ip.v6.dst_port);
1638 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1639 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1640 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1642 case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1643 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1644 input->ip.v6.src_ip);
1645 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1646 input->ip.v6.dst_ip);
1647 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1648 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1649 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1650 input->ip.v6.proto);
1651 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1654 return ICE_ERR_PARAM;
1657 if (input->flex_fltr)
1658 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1664 * ice_fdir_get_prgm_pkt - generate a training packet
1665 * @input: flow director filter data structure
1666 * @pkt: pointer to return filter packet
1667 * @frag: generate a fragment packet
1670 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1672 return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1676 * ice_fdir_has_frag - does flow type have 2 ptypes
1679 * returns true is there is a fragment packet for this ptype
1681 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1683 if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1690 * ice_fdir_find_by_idx - find filter with idx
1691 * @hw: pointer to hardware structure
1692 * @fltr_idx: index to find.
1694 * Returns pointer to filter if found or null
1696 struct ice_fdir_fltr *
1697 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1699 struct ice_fdir_fltr *rule;
1701 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1703 /* rule ID found in the list */
1704 if (fltr_idx == rule->fltr_id)
1706 if (fltr_idx < rule->fltr_id)
1713 * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1714 * @hw: hardware structure
1715 * @fltr: filter node to add to structure
1717 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1719 struct ice_fdir_fltr *rule, *parent = NULL;
1721 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1723 /* rule ID found or pass its spot in the list */
1724 if (rule->fltr_id >= fltr->fltr_id)
1730 LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1732 LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1736 * ice_fdir_update_cntrs - increment / decrement filter counter
1737 * @hw: pointer to hardware structure
1738 * @flow: filter flow type
1739 * @acl_fltr: true indicates an ACL filter
1740 * @add: true implies filters added
1743 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1744 bool acl_fltr, bool add)
1748 incr = add ? 1 : -1;
1749 hw->fdir_active_fltr += incr;
1750 if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1751 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1754 hw->acl_fltr_cnt[flow] += incr;
1756 hw->fdir_fltr_cnt[flow] += incr;
1761 * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1765 * Returns 0 on equal, returns non-0 if different
1767 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1769 return memcmp(a, b, 4 * sizeof(__be32));
1773 * ice_fdir_comp_rules - compare 2 filters
1774 * @a: a Flow Director filter data structure
1775 * @b: a Flow Director filter data structure
1776 * @v6: bool true if v6 filter
1778 * Returns true if the filters match
1781 ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6)
1783 enum ice_fltr_ptype flow_type = a->flow_type;
1785 /* The calling function already checks that the two filters have the
1789 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1790 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1791 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1792 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1793 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1794 a->ip.v4.dst_port == b->ip.v4.dst_port &&
1795 a->ip.v4.src_port == b->ip.v4.src_port)
1797 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1798 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1799 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1800 a->ip.v4.l4_header == b->ip.v4.l4_header &&
1801 a->ip.v4.proto == b->ip.v4.proto &&
1802 a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1803 a->ip.v4.tos == b->ip.v4.tos)
1807 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1808 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1809 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1810 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1811 a->ip.v6.src_port == b->ip.v6.src_port &&
1812 !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1814 !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1817 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1818 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1819 a->ip.v6.src_port == b->ip.v6.src_port)
1828 * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1829 * @hw: hardware data structure
1830 * @input: Flow Director filter data structure
1832 * Returns true if the filter is found in the list
1834 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1836 struct ice_fdir_fltr *rule;
1839 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1841 enum ice_fltr_ptype flow_type;
1843 if (rule->flow_type != input->flow_type)
1846 flow_type = input->flow_type;
1847 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1848 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1849 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1850 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1851 ret = ice_fdir_comp_rules(rule, input, false);
1853 ret = ice_fdir_comp_rules(rule, input, true);
1855 if (rule->fltr_id == input->fltr_id &&
1856 rule->q_index != input->q_index)
1867 * ice_clear_pf_fd_table - admin command to clear FD table for PF
1868 * @hw: hardware data structure
1870 * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
1872 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
1874 struct ice_aqc_clear_fd_table *cmd;
1875 struct ice_aq_desc desc;
1877 cmd = &desc.params.clear_fd_table;
1878 ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
1879 cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
1880 /* vsi_index must be 0 to clear FD table for a PF */
1881 cmd->vsi_index = CPU_TO_LE16(0);
1883 return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);