1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2001-2020 Intel Corporation
5 #include "ice_common.h"
8 /* These are training packet headers used to program flow director filters. */
9 static const u8 ice_fdir_tcpv4_pkt[] = {
10 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
12 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
13 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
15 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00,
16 0x20, 0x00, 0x00, 0x00, 0x00, 0x00
19 static const u8 ice_fdir_udpv4_pkt[] = {
20 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
22 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
23 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
24 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28 static const u8 ice_fdir_sctpv4_pkt[] = {
29 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
30 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
31 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84,
32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
34 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
37 static const u8 ice_fdir_ipv4_pkt[] = {
38 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
39 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
40 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10,
41 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45 static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
48 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
51 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
52 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
54 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
55 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60 static const u8 ice_fdir_tcp4_gtpu4_pkt[] = {
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
63 0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
66 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
67 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
68 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
69 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06,
70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76 static const u8 ice_fdir_icmp4_gtpu4_pkt[] = {
77 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
78 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
79 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
80 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
81 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
82 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
83 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
84 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
85 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01,
86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 static const u8 ice_fdir_ipv4_gtpu4_pkt[] = {
92 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
94 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
97 0x00, 0x00, 0x33, 0xff, 0x00, 0x20, 0x00, 0x00,
98 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x45, 0x00,
99 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104 static const u8 ice_fdir_ipv6_gtpu6_pkt[] = {
105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
107 0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00,
108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
109 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x68,
112 0x08, 0x68, 0x00, 0x44, 0x7f, 0xed, 0x33, 0xff,
113 0x00, 0x34, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00,
114 0x00, 0x85, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
115 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122 static const u8 ice_fdir_ipv4_gtpu4_eh_pkt[] = {
123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
125 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
127 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
128 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
131 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
136 static const u8 ice_fdir_ipv6_gtpu6_eh_pkt[] = {
137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
139 0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00,
140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
143 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x68,
144 0x08, 0x68, 0x00, 0x44, 0x7f, 0xed, 0x34, 0xff,
145 0x00, 0x34, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00,
146 0x00, 0x85, 0x02, 0x00, 0x33, 0x00, 0x00, 0x00,
147 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
148 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155 static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
158 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164 static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
167 0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00,
168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
176 static const u8 ice_fdir_ipv4_esp_pkt[] = {
177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
178 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
179 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
185 static const u8 ice_fdir_ipv6_esp_pkt[] = {
186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
187 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
188 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00,
189 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196 static const u8 ice_fdir_ipv4_ah_pkt[] = {
197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
198 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
199 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206 static const u8 ice_fdir_ipv6_ah_pkt[] = {
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
209 0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00,
210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218 static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
220 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
221 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223 0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
231 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236 0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
239 static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
242 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
244 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
245 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250 static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
253 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
256 0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
264 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x22, 0x65,
269 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
270 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
274 static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
276 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
277 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
282 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
283 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287 static const u8 ice_fdir_non_ip_l2_pkt[] = {
288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293 static const u8 ice_fdir_tcpv6_pkt[] = {
294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
296 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
306 static const u8 ice_fdir_udpv6_pkt[] = {
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
309 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
317 static const u8 ice_fdir_sctpv6_pkt[] = {
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
320 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 static const u8 ice_fdir_ipv6_pkt[] = {
330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
332 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 static const u8 ice_fdir_tcp4_tun_pkt[] = {
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
342 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
348 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
349 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
355 static const u8 ice_fdir_udp4_tun_pkt[] = {
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
358 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
364 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
365 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x00, 0x00, 0x00, 0x00,
370 static const u8 ice_fdir_sctp4_tun_pkt[] = {
371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
373 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
379 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
380 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 static const u8 ice_fdir_ip4_tun_pkt[] = {
386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
387 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
388 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
394 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
395 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0x00, 0x00, 0x00, 0x00,
399 static const u8 ice_fdir_tcp6_tun_pkt[] = {
400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
401 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
402 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
405 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
408 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
415 0x00, 0x00, 0x00, 0x00,
418 static const u8 ice_fdir_udp6_tun_pkt[] = {
419 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
421 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
423 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
424 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
427 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
428 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
429 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
430 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
431 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
432 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
435 static const u8 ice_fdir_sctp6_tun_pkt[] = {
436 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
437 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
438 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
439 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
440 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
441 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
442 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
443 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
444 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
445 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
446 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
447 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
448 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
449 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
450 0x00, 0x00, 0x00, 0x00,
453 static const u8 ice_fdir_ip6_tun_pkt[] = {
454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
455 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
456 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
458 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
459 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
462 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
463 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
464 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
465 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
466 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469 /* Flow Director no-op training packet table */
470 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
472 ICE_FLTR_PTYPE_NONF_IPV4_TCP,
473 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
474 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
477 ICE_FLTR_PTYPE_NONF_IPV4_UDP,
478 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
479 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
482 ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
483 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
484 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
487 ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
488 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
489 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
492 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
493 sizeof(ice_fdir_udp4_gtpu4_pkt),
494 ice_fdir_udp4_gtpu4_pkt,
495 sizeof(ice_fdir_udp4_gtpu4_pkt),
496 ice_fdir_udp4_gtpu4_pkt,
499 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
500 sizeof(ice_fdir_tcp4_gtpu4_pkt),
501 ice_fdir_tcp4_gtpu4_pkt,
502 sizeof(ice_fdir_tcp4_gtpu4_pkt),
503 ice_fdir_tcp4_gtpu4_pkt,
506 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
507 sizeof(ice_fdir_icmp4_gtpu4_pkt),
508 ice_fdir_icmp4_gtpu4_pkt,
509 sizeof(ice_fdir_icmp4_gtpu4_pkt),
510 ice_fdir_icmp4_gtpu4_pkt,
513 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
514 sizeof(ice_fdir_ipv4_gtpu4_pkt),
515 ice_fdir_ipv4_gtpu4_pkt,
516 sizeof(ice_fdir_ipv4_gtpu4_pkt),
517 ice_fdir_ipv4_gtpu4_pkt,
520 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER,
521 sizeof(ice_fdir_ipv6_gtpu6_pkt),
522 ice_fdir_ipv6_gtpu6_pkt,
523 sizeof(ice_fdir_ipv6_gtpu6_pkt),
524 ice_fdir_ipv6_gtpu6_pkt,
527 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER,
528 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
529 ice_fdir_ipv4_gtpu4_eh_pkt,
530 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
531 ice_fdir_ipv4_gtpu4_eh_pkt,
534 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER,
535 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
536 ice_fdir_ipv6_gtpu6_eh_pkt,
537 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
538 ice_fdir_ipv6_gtpu6_eh_pkt,
541 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
542 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
543 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
546 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
547 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
548 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
551 ICE_FLTR_PTYPE_NONF_IPV4_ESP,
552 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
553 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
556 ICE_FLTR_PTYPE_NONF_IPV6_ESP,
557 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
558 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
561 ICE_FLTR_PTYPE_NONF_IPV4_AH,
562 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
563 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
566 ICE_FLTR_PTYPE_NONF_IPV6_AH,
567 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
568 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
571 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
572 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
573 ice_fdir_ipv4_nat_t_esp_pkt,
574 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
575 ice_fdir_ipv4_nat_t_esp_pkt,
578 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
579 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
580 ice_fdir_ipv6_nat_t_esp_pkt,
581 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
582 ice_fdir_ipv6_nat_t_esp_pkt,
585 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
586 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
587 ice_fdir_ipv4_pfcp_node_pkt,
588 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
589 ice_fdir_ipv4_pfcp_node_pkt,
592 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
593 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
594 ice_fdir_ipv4_pfcp_session_pkt,
595 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
596 ice_fdir_ipv4_pfcp_session_pkt,
599 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
600 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
601 ice_fdir_ipv6_pfcp_node_pkt,
602 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
603 ice_fdir_ipv6_pfcp_node_pkt,
606 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
607 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
608 ice_fdir_ipv6_pfcp_session_pkt,
609 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
610 ice_fdir_ipv6_pfcp_session_pkt,
613 ICE_FLTR_PTYPE_NON_IP_L2,
614 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
615 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
618 ICE_FLTR_PTYPE_NONF_IPV6_TCP,
619 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
620 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
623 ICE_FLTR_PTYPE_NONF_IPV6_UDP,
624 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
625 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
628 ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
629 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
630 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
633 ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
634 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
635 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
639 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
642 * ice_set_dflt_val_fd_desc
643 * @fd_fltr_ctx: pointer to fd filter descriptor
645 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
647 fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
648 fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
649 fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
650 fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
651 fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
652 fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
653 fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
654 fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
655 fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
656 fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
657 fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
658 fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
659 fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
660 fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
661 fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
662 fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
663 fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
664 fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
665 fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
669 * ice_set_fd_desc_val
670 * @ctx: pointer to fd filter descriptor context
671 * @fdir_desc: populated with fd filter descriptor values
674 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
675 struct ice_fltr_desc *fdir_desc)
679 /* prep QW0 of FD filter programming desc */
680 qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
681 ICE_FXD_FLTR_QW0_QINDEX_M;
682 qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
683 ICE_FXD_FLTR_QW0_COMP_Q_M;
684 qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
685 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
686 qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
687 ICE_FXD_FLTR_QW0_FD_SPACE_M;
688 qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
689 ICE_FXD_FLTR_QW0_STAT_CNT_M;
690 qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
691 ICE_FXD_FLTR_QW0_STAT_ENA_M;
692 qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
693 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
694 qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
695 ICE_FXD_FLTR_QW0_TO_Q_M;
696 qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
697 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
698 qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
699 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
700 qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
701 ICE_FXD_FLTR_QW0_DROP_M;
702 qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
703 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
704 qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
705 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
706 qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
707 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
708 fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
710 /* prep QW1 of FD filter programming desc */
711 qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
712 ICE_FXD_FLTR_QW1_DTYPE_M;
713 qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
714 ICE_FXD_FLTR_QW1_PCMD_M;
715 qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
716 ICE_FXD_FLTR_QW1_PROF_PRI_M;
717 qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
718 ICE_FXD_FLTR_QW1_PROF_M;
719 qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
720 ICE_FXD_FLTR_QW1_FD_VSI_M;
721 qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
722 ICE_FXD_FLTR_QW1_SWAP_M;
723 qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
724 ICE_FXD_FLTR_QW1_FDID_PRI_M;
725 qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
726 ICE_FXD_FLTR_QW1_FDID_MDID_M;
727 qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
728 ICE_FXD_FLTR_QW1_FDID_M;
729 fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
733 * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
734 * @hw: pointer to the hardware structure
736 * @fdesc: filter descriptor
737 * @add: if add is true, this is an add operation, false implies delete
740 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
741 struct ice_fltr_desc *fdesc, bool add)
743 struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
745 /* set default context info */
746 ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
748 /* change sideband filtering values */
749 fdir_fltr_ctx.fdid = input->fltr_id;
750 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
751 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
752 fdir_fltr_ctx.qindex = 0;
753 } else if (input->dest_ctl ==
754 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
755 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
756 fdir_fltr_ctx.qindex = 0;
758 if (input->dest_ctl ==
759 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
760 fdir_fltr_ctx.toq = input->q_region;
761 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
762 fdir_fltr_ctx.qindex = input->q_index;
764 fdir_fltr_ctx.cnt_ena = input->cnt_ena;
765 fdir_fltr_ctx.cnt_index = input->cnt_index;
766 fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
767 fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
768 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
769 fdir_fltr_ctx.toq_prio = 0;
771 fdir_fltr_ctx.toq_prio = 3;
772 fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
773 ICE_FXD_FLTR_QW1_PCMD_REMOVE;
774 fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
775 fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
776 fdir_fltr_ctx.comp_report = input->comp_report;
777 fdir_fltr_ctx.fdid_prio = input->fdid_prio;
778 fdir_fltr_ctx.desc_prof = 1;
779 fdir_fltr_ctx.desc_prof_prio = 3;
780 ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
784 * ice_alloc_fd_res_cntr - obtain counter resource for FD type
785 * @hw: pointer to the hardware structure
786 * @cntr_id: returns counter index
788 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
790 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
791 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
795 * ice_free_fd_res_cntr - Free counter resource for FD type
796 * @hw: pointer to the hardware structure
797 * @cntr_id: counter index to be freed
799 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
801 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
802 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
806 * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
807 * @hw: pointer to the hardware structure
808 * @cntr_id: returns counter index
809 * @num_fltr: number of filter entries to be allocated
812 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
814 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
815 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
820 * ice_free_fd_guar_item - Free flow director guaranteed entries
821 * @hw: pointer to the hardware structure
822 * @cntr_id: counter index that needs to be freed
823 * @num_fltr: number of filters to be freed
826 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
828 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
829 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
834 * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
835 * @hw: pointer to the hardware structure
836 * @cntr_id: returns counter index
837 * @num_fltr: number of filter entries to be allocated
840 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
842 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
843 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
848 * ice_free_fd_shrd_item - Free flow director shared entries
849 * @hw: pointer to the hardware structure
850 * @cntr_id: counter index that needs to be freed
851 * @num_fltr: number of filters to be freed
854 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
856 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
857 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
862 * ice_get_fdir_cnt_all - get the number of Flow Director filters
863 * @hw: hardware data structure
865 * Returns the number of filters available on device
867 int ice_get_fdir_cnt_all(struct ice_hw *hw)
869 return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
873 * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
874 * @pkt: packet buffer
875 * @offset: offset into buffer
876 * @addr: IPv6 address to convert and insert into pkt at offset
878 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
882 for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
883 ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
884 sizeof(*addr), ICE_NONDMA_TO_NONDMA);
888 * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
889 * @pkt: packet buffer
890 * @offset: offset into buffer
891 * @data: 8 bit value to convert and insert into pkt at offset
893 * This function is designed for inserting qfi (6 bits) for gtpu.
895 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
899 ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
900 ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
904 * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
905 * @pkt: packet buffer
906 * @offset: offset into buffer
907 * @data: 8 bit value to convert and insert into pkt at offset
909 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
911 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
915 * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
916 * @pkt: packet buffer
917 * @offset: offset into buffer
918 * @data: 8 bit value to convert and insert into pkt at offset
920 * This function is designed for inserting Traffic Class (TC) for IPv6,
921 * since that TC is not aligned in number of bytes. Here we split it out
922 * into two part and fill each byte with data copy from pkt, then insert
923 * the two bytes data one by one.
925 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
929 high = (data >> 4) + (*(pkt + offset) & 0xF0);
930 ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
932 low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
933 ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
937 * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
938 * @pkt: packet buffer
939 * @offset: offset into buffer
940 * @data: 16 bit value to convert and insert into pkt at offset
942 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
944 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
948 * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
949 * @pkt: packet buffer
950 * @offset: offset into buffer
951 * @data: 32 bit value to convert and insert into pkt at offset
953 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
955 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
959 * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
960 * @pkt: packet buffer
961 * @addr: MAC address to convert and insert into pkt at offset
963 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
965 ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
969 * ice_fdir_get_gen_prgm_pkt - generate a training packet
970 * @hw: pointer to the hardware structure
971 * @input: flow director filter data structure
972 * @pkt: pointer to return filter packet
973 * @frag: generate a fragment packet
974 * @tun: true implies generate a tunnel packet
977 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
978 u8 *pkt, bool frag, bool tun)
980 enum ice_fltr_ptype flow;
985 if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
986 switch (input->ip.v4.proto) {
987 case ICE_IP_PROTO_TCP:
988 flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
990 case ICE_IP_PROTO_UDP:
991 flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
993 case ICE_IP_PROTO_SCTP:
994 flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
997 flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
1000 } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1001 switch (input->ip.v6.proto) {
1002 case ICE_IP_PROTO_TCP:
1003 flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
1005 case ICE_IP_PROTO_UDP:
1006 flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
1008 case ICE_IP_PROTO_SCTP:
1009 flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
1012 flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
1016 flow = input->flow_type;
1019 for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
1020 if (ice_fdir_pkt[idx].flow == flow)
1022 if (idx == ICE_FDIR_NUM_PKT)
1023 return ICE_ERR_PARAM;
1025 ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
1026 ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
1029 if (!ice_get_open_tunnel_port(hw, TNL_ALL, &tnl_port))
1030 return ICE_ERR_DOES_NOT_EXIST;
1031 if (!ice_fdir_pkt[idx].tun_pkt)
1032 return ICE_ERR_PARAM;
1033 ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1034 ice_fdir_pkt[idx].tun_pkt_len, ICE_NONDMA_TO_NONDMA);
1035 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
1037 loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
1040 /* Reverse the src and dst, since the HW expects them to be from Tx
1041 * perspective. The input from user is from Rx filter perspective.
1044 case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
1045 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1046 input->ip.v4.src_ip);
1047 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1048 input->ip.v4.src_port);
1049 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1050 input->ip.v4.dst_ip);
1051 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1052 input->ip.v4.dst_port);
1053 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1054 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1055 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1057 loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
1059 case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
1060 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1061 input->ip.v4.src_ip);
1062 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1063 input->ip.v4.src_port);
1064 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1065 input->ip.v4.dst_ip);
1066 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1067 input->ip.v4.dst_port);
1068 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1069 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1070 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1071 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1073 case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1074 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1075 input->ip.v4.src_ip);
1076 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1077 input->ip.v4.src_port);
1078 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1079 input->ip.v4.dst_ip);
1080 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1081 input->ip.v4.dst_port);
1082 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1083 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1084 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1086 case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1087 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1088 input->ip.v4.src_ip);
1089 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1090 input->ip.v4.dst_ip);
1091 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1092 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1093 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1094 input->ip.v4.proto);
1095 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1097 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
1098 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1099 input->ip.v4.src_ip);
1100 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1101 input->ip.v4.dst_ip);
1102 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1103 input->gtpu_data.teid);
1105 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1106 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1107 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
1108 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER:
1109 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1110 input->ip.v4.src_ip);
1111 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1112 input->ip.v4.dst_ip);
1113 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1114 input->gtpu_data.teid);
1115 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1116 input->gtpu_data.qfi);
1118 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER:
1119 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1120 input->ip.v6.src_ip);
1121 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1122 input->ip.v6.dst_ip);
1123 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1124 input->gtpu_data.teid);
1126 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
1127 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1128 input->ip.v6.src_ip);
1129 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1130 input->ip.v6.dst_ip);
1131 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1132 input->gtpu_data.teid);
1133 ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
1134 input->gtpu_data.qfi);
1136 case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1137 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1138 input->l2tpv3_data.session_id);
1140 case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1141 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1142 input->l2tpv3_data.session_id);
1144 case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1145 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1146 input->ip.v4.sec_parm_idx);
1148 case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1149 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1150 input->ip.v6.sec_parm_idx);
1152 case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1153 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1154 input->ip.v4.sec_parm_idx);
1156 case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1157 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1158 input->ip.v6.sec_parm_idx);
1160 case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1161 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1162 input->ip.v4.src_ip);
1163 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1164 input->ip.v4.dst_ip);
1165 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1166 input->ip.v4.sec_parm_idx);
1168 case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1169 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1170 input->ip.v6.src_ip);
1171 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1172 input->ip.v6.dst_ip);
1173 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1174 input->ip.v6.sec_parm_idx);
1176 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1177 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1178 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1179 input->ip.v4.dst_port);
1181 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1182 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1183 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1184 input->ip.v6.dst_port);
1186 case ICE_FLTR_PTYPE_NON_IP_L2:
1187 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1188 input->ext_data.ether_type);
1190 case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1191 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1192 input->ip.v6.src_ip);
1193 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1194 input->ip.v6.dst_ip);
1195 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1196 input->ip.v6.src_port);
1197 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1198 input->ip.v6.dst_port);
1199 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1200 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1201 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1203 case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1204 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1205 input->ip.v6.src_ip);
1206 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1207 input->ip.v6.dst_ip);
1208 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1209 input->ip.v6.src_port);
1210 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1211 input->ip.v6.dst_port);
1212 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1213 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1214 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1216 case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1217 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1218 input->ip.v6.src_ip);
1219 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1220 input->ip.v6.dst_ip);
1221 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1222 input->ip.v6.src_port);
1223 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1224 input->ip.v6.dst_port);
1225 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1226 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1227 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1229 case ICE_FLTR_PTYPE_NONF_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_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1235 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1236 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1237 input->ip.v6.proto);
1238 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1241 return ICE_ERR_PARAM;
1244 if (input->flex_fltr)
1245 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1251 * ice_fdir_get_prgm_pkt - generate a training packet
1252 * @input: flow director filter data structure
1253 * @pkt: pointer to return filter packet
1254 * @frag: generate a fragment packet
1257 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1259 return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1263 * ice_fdir_has_frag - does flow type have 2 ptypes
1266 * returns true is there is a fragment packet for this ptype
1268 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1270 if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1277 * ice_fdir_find_by_idx - find filter with idx
1278 * @hw: pointer to hardware structure
1279 * @fltr_idx: index to find.
1281 * Returns pointer to filter if found or null
1283 struct ice_fdir_fltr *
1284 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1286 struct ice_fdir_fltr *rule;
1288 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1290 /* rule ID found in the list */
1291 if (fltr_idx == rule->fltr_id)
1293 if (fltr_idx < rule->fltr_id)
1300 * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1301 * @hw: hardware structure
1302 * @fltr: filter node to add to structure
1304 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1306 struct ice_fdir_fltr *rule, *parent = NULL;
1308 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1310 /* rule ID found or pass its spot in the list */
1311 if (rule->fltr_id >= fltr->fltr_id)
1317 LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1319 LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1323 * ice_fdir_update_cntrs - increment / decrement filter counter
1324 * @hw: pointer to hardware structure
1325 * @flow: filter flow type
1326 * @acl_fltr: true indicates an ACL filter
1327 * @add: true implies filters added
1330 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1331 bool acl_fltr, bool add)
1335 incr = add ? 1 : -1;
1336 hw->fdir_active_fltr += incr;
1337 if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1338 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1341 hw->acl_fltr_cnt[flow] += incr;
1343 hw->fdir_fltr_cnt[flow] += incr;
1348 * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1352 * Returns 0 on equal, returns non-0 if different
1354 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1356 return memcmp(a, b, 4 * sizeof(__be32));
1360 * ice_fdir_comp_rules - compare 2 filters
1361 * @a: a Flow Director filter data structure
1362 * @b: a Flow Director filter data structure
1363 * @v6: bool true if v6 filter
1365 * Returns true if the filters match
1368 ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6)
1370 enum ice_fltr_ptype flow_type = a->flow_type;
1372 /* The calling function already checks that the two filters have the
1376 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1377 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1378 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1379 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1380 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1381 a->ip.v4.dst_port == b->ip.v4.dst_port &&
1382 a->ip.v4.src_port == b->ip.v4.src_port)
1384 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1385 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1386 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1387 a->ip.v4.l4_header == b->ip.v4.l4_header &&
1388 a->ip.v4.proto == b->ip.v4.proto &&
1389 a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1390 a->ip.v4.tos == b->ip.v4.tos)
1394 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1395 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1396 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1397 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1398 a->ip.v6.src_port == b->ip.v6.src_port &&
1399 !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1401 !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1404 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1405 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1406 a->ip.v6.src_port == b->ip.v6.src_port)
1415 * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1416 * @hw: hardware data structure
1417 * @input: Flow Director filter data structure
1419 * Returns true if the filter is found in the list
1421 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1423 struct ice_fdir_fltr *rule;
1426 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1428 enum ice_fltr_ptype flow_type;
1430 if (rule->flow_type != input->flow_type)
1433 flow_type = input->flow_type;
1434 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1435 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1436 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1437 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1438 ret = ice_fdir_comp_rules(rule, input, false);
1440 ret = ice_fdir_comp_rules(rule, input, true);
1442 if (rule->fltr_id == input->fltr_id &&
1443 rule->q_index != input->q_index)
1454 * ice_clear_pf_fd_table - admin command to clear FD table for PF
1455 * @hw: hardware data structure
1457 * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
1459 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
1461 struct ice_aqc_clear_fd_table *cmd;
1462 struct ice_aq_desc desc;
1464 cmd = &desc.params.clear_fd_table;
1465 ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
1466 cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
1467 /* vsi_index must be 0 to clear FD table for a PF */
1468 cmd->vsi_index = CPU_TO_LE16(0);
1470 return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);