xref: /f-stack/dpdk/drivers/net/ice/base/ice_fdir.c (revision 2d9fd380)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2001-2020 Intel Corporation
3  */
4 
5 #include "ice_common.h"
6 #include "ice_fdir.h"
7 
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
17 };
18 
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,
25 	0x00, 0x00,
26 };
27 
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,
35 };
36 
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,
42 	0x00, 0x00
43 };
44 
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,
57 	0x00, 0x00,
58 };
59 
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,
74 };
75 
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,
88 	0x00, 0x00,
89 };
90 
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,
101 	0x00, 0x00,
102 };
103 
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,
119 	0x00, 0x00,
120 };
121 
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,
133 	0x00, 0x00,
134 };
135 
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,
152 	0x00, 0x00,
153 };
154 
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,
162 };
163 
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,
173 	0x00, 0x00,
174 };
175 
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,
182 	0x00, 0x00
183 };
184 
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,
194 };
195 
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,
203 	0x00, 0x00
204 };
205 
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,
216 };
217 
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,
225 	0x00, 0x00,
226 };
227 
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,
237 };
238 
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,
247 	0x00, 0x00,
248 };
249 
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,
258 	0x00, 0x00,
259 };
260 
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,
272 };
273 
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,
285 };
286 
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,
291 };
292 
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,
303 	0x00, 0x00,
304 };
305 
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,
315 };
316 
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,
326 	0x00, 0x00,
327 };
328 
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,
337 };
338 
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,
353 };
354 
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,
368 };
369 
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,
383 };
384 
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,
397 };
398 
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,
416 };
417 
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,
433 };
434 
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,
451 };
452 
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,
467 };
468 
469 /* Flow Director no-op training packet table */
470 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
471 	{
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,
475 	},
476 	{
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,
480 	},
481 	{
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,
485 	},
486 	{
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,
490 	},
491 	{
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,
497 	},
498 	{
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,
504 	},
505 	{
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,
511 	},
512 	{
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,
518 	},
519 	{
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,
525 	},
526 	{
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,
532 	},
533 	{
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,
539 	},
540 	{
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,
544 	},
545 	{
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,
549 	},
550 	{
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,
554 	},
555 	{
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,
559 	},
560 	{
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,
564 	},
565 	{
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,
569 	},
570 	{
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,
576 	},
577 	{
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,
583 	},
584 	{
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,
590 	},
591 	{
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,
597 	},
598 	{
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,
604 	},
605 	{
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,
611 	},
612 	{
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,
616 	},
617 	{
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,
621 	},
622 	{
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,
626 	},
627 	{
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,
631 	},
632 	{
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,
636 	},
637 };
638 
639 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
640 
641 /**
642  * ice_set_dflt_val_fd_desc
643  * @fd_fltr_ctx: pointer to fd filter descriptor
644  */
ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx * fd_fltr_ctx)645 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
646 {
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;
666 }
667 
668 /**
669  * ice_set_fd_desc_val
670  * @ctx: pointer to fd filter descriptor context
671  * @fdir_desc: populated with fd filter descriptor values
672  */
673 static void
ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx * ctx,struct ice_fltr_desc * fdir_desc)674 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
675 		    struct ice_fltr_desc *fdir_desc)
676 {
677 	u64 qword;
678 
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);
709 
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);
730 }
731 
732 /**
733  * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
734  * @hw: pointer to the hardware structure
735  * @input: filter
736  * @fdesc: filter descriptor
737  * @add: if add is true, this is an add operation, false implies delete
738  */
739 void
ice_fdir_get_prgm_desc(struct ice_hw * hw,struct ice_fdir_fltr * input,struct ice_fltr_desc * fdesc,bool add)740 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
741 		       struct ice_fltr_desc *fdesc, bool add)
742 {
743 	struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
744 
745 	/* set default context info */
746 	ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
747 
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;
757 	} else {
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;
763 	}
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;
770 	else
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);
781 }
782 
783 /**
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
787  */
ice_alloc_fd_res_cntr(struct ice_hw * hw,u16 * cntr_id)788 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
789 {
790 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
791 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
792 }
793 
794 /**
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
798  */
ice_free_fd_res_cntr(struct ice_hw * hw,u16 cntr_id)799 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
800 {
801 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
802 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
803 }
804 
805 /**
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
810  */
811 enum ice_status
ice_alloc_fd_guar_item(struct ice_hw * hw,u16 * cntr_id,u16 num_fltr)812 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
813 {
814 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
815 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
816 				  cntr_id);
817 }
818 
819 /**
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
824  */
825 enum ice_status
ice_free_fd_guar_item(struct ice_hw * hw,u16 cntr_id,u16 num_fltr)826 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
827 {
828 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
829 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
830 				 cntr_id);
831 }
832 
833 /**
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
838  */
839 enum ice_status
ice_alloc_fd_shrd_item(struct ice_hw * hw,u16 * cntr_id,u16 num_fltr)840 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
841 {
842 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
843 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
844 				  cntr_id);
845 }
846 
847 /**
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
852  */
853 enum ice_status
ice_free_fd_shrd_item(struct ice_hw * hw,u16 cntr_id,u16 num_fltr)854 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
855 {
856 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
857 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
858 				 cntr_id);
859 }
860 
861 /**
862  * ice_get_fdir_cnt_all - get the number of Flow Director filters
863  * @hw: hardware data structure
864  *
865  * Returns the number of filters available on device
866  */
ice_get_fdir_cnt_all(struct ice_hw * hw)867 int ice_get_fdir_cnt_all(struct ice_hw *hw)
868 {
869 	return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
870 }
871 
872 /**
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
877  */
ice_pkt_insert_ipv6_addr(u8 * pkt,int offset,__be32 * addr)878 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
879 {
880 	int idx;
881 
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);
885 }
886 
887 /**
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
892  *
893  * This function is designed for inserting qfi (6 bits) for gtpu.
894  */
ice_pkt_insert_u6_qfi(u8 * pkt,int offset,u8 data)895 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
896 {
897 	u8 ret;
898 
899 	ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
900 	ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
901 }
902 
903 /**
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
908  */
ice_pkt_insert_u8(u8 * pkt,int offset,u8 data)909 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
910 {
911 	ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
912 }
913 
914 /**
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
919  *
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.
924  */
ice_pkt_insert_u8_tc(u8 * pkt,int offset,u8 data)925 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
926 {
927 	u8 high, low;
928 
929 	high = (data >> 4) + (*(pkt + offset) & 0xF0);
930 	ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
931 
932 	low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
933 	ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
934 }
935 
936 /**
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
941  */
ice_pkt_insert_u16(u8 * pkt,int offset,__be16 data)942 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
943 {
944 	ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
945 }
946 
947 /**
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
952  */
ice_pkt_insert_u32(u8 * pkt,int offset,__be32 data)953 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
954 {
955 	ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
956 }
957 
958 /**
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
962  */
ice_pkt_insert_mac_addr(u8 * pkt,u8 * addr)963 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
964 {
965 	ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
966 }
967 
968 /**
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
975  */
976 enum ice_status
ice_fdir_get_gen_prgm_pkt(struct ice_hw * hw,struct ice_fdir_fltr * input,u8 * pkt,bool frag,bool tun)977 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
978 			  u8 *pkt, bool frag, bool tun)
979 {
980 	enum ice_fltr_ptype flow;
981 	u16 tnl_port;
982 	u8 *loc;
983 	u16 idx;
984 
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;
989 			break;
990 		case ICE_IP_PROTO_UDP:
991 			flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
992 			break;
993 		case ICE_IP_PROTO_SCTP:
994 			flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
995 			break;
996 		default:
997 			flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
998 			break;
999 		}
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;
1004 			break;
1005 		case ICE_IP_PROTO_UDP:
1006 			flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
1007 			break;
1008 		case ICE_IP_PROTO_SCTP:
1009 			flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
1010 			break;
1011 		default:
1012 			flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
1013 			break;
1014 		}
1015 	} else {
1016 		flow = input->flow_type;
1017 	}
1018 
1019 	for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
1020 		if (ice_fdir_pkt[idx].flow == flow)
1021 			break;
1022 	if (idx == ICE_FDIR_NUM_PKT)
1023 		return ICE_ERR_PARAM;
1024 	if (!tun) {
1025 		ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
1026 			   ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
1027 		loc = pkt;
1028 	} else {
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,
1036 				   HTONS(tnl_port));
1037 		loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
1038 	}
1039 
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.
1042 	 */
1043 	switch (flow) {
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);
1056 		if (frag)
1057 			loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
1058 		break;
1059 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
1060 		ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1061 		ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1062 					input->ext_data_outer.src_mac);
1063 		ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1064 				   input->ip_outer.v4.dst_ip);
1065 		ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1066 				   input->ip_outer.v4.src_ip);
1067 		ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1068 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1069 				   input->ip.v4.src_ip);
1070 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1071 				   input->ip.v4.src_port);
1072 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1073 				   input->ip.v4.dst_ip);
1074 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1075 				   input->ip.v4.dst_port);
1076 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1077 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1078 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1079 		ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1080 		break;
1081 	case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1082 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1083 				   input->ip.v4.src_ip);
1084 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1085 				   input->ip.v4.src_port);
1086 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1087 				   input->ip.v4.dst_ip);
1088 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1089 				   input->ip.v4.dst_port);
1090 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1091 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1092 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1093 		break;
1094 	case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1095 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1096 				   input->ip.v4.src_ip);
1097 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1098 				   input->ip.v4.dst_ip);
1099 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1100 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1101 		ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1102 				  input->ip.v4.proto);
1103 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1104 		break;
1105 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
1106 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1107 				   input->ip.v4.src_ip);
1108 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1109 				   input->ip.v4.dst_ip);
1110 		ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1111 				   input->gtpu_data.teid);
1112 		break;
1113 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1114 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1115 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
1116 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER:
1117 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1118 				   input->ip.v4.src_ip);
1119 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1120 				   input->ip.v4.dst_ip);
1121 		ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1122 				   input->gtpu_data.teid);
1123 		ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1124 				      input->gtpu_data.qfi);
1125 		break;
1126 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_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 		break;
1134 	case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
1135 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1136 					 input->ip.v6.src_ip);
1137 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1138 					 input->ip.v6.dst_ip);
1139 		ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1140 				   input->gtpu_data.teid);
1141 		ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
1142 				      input->gtpu_data.qfi);
1143 		break;
1144 	case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1145 		ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1146 				   input->l2tpv3_data.session_id);
1147 		break;
1148 	case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1149 		ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1150 				   input->l2tpv3_data.session_id);
1151 		break;
1152 	case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1153 		ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1154 				   input->ip.v4.sec_parm_idx);
1155 		break;
1156 	case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1157 		ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1158 				   input->ip.v6.sec_parm_idx);
1159 		break;
1160 	case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1161 		ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1162 				   input->ip.v4.sec_parm_idx);
1163 		break;
1164 	case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1165 		ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1166 				   input->ip.v6.sec_parm_idx);
1167 		break;
1168 	case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1169 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1170 				   input->ip.v4.src_ip);
1171 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1172 				   input->ip.v4.dst_ip);
1173 		ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1174 				   input->ip.v4.sec_parm_idx);
1175 		break;
1176 	case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1177 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1178 					 input->ip.v6.src_ip);
1179 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1180 					 input->ip.v6.dst_ip);
1181 		ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1182 				   input->ip.v6.sec_parm_idx);
1183 		break;
1184 	case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1185 	case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1186 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1187 				   input->ip.v4.dst_port);
1188 		break;
1189 	case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1190 	case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1191 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1192 				   input->ip.v6.dst_port);
1193 		break;
1194 	case ICE_FLTR_PTYPE_NON_IP_L2:
1195 		ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1196 				   input->ext_data.ether_type);
1197 		break;
1198 	case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1199 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1200 					 input->ip.v6.src_ip);
1201 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1202 					 input->ip.v6.dst_ip);
1203 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1204 				   input->ip.v6.src_port);
1205 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1206 				   input->ip.v6.dst_port);
1207 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1208 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1209 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1210 		break;
1211 	case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1212 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1213 					 input->ip.v6.src_ip);
1214 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1215 					 input->ip.v6.dst_ip);
1216 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1217 				   input->ip.v6.src_port);
1218 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1219 				   input->ip.v6.dst_port);
1220 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1221 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1222 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1223 		break;
1224 	case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1225 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1226 					 input->ip.v6.src_ip);
1227 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1228 					 input->ip.v6.dst_ip);
1229 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1230 				   input->ip.v6.src_port);
1231 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1232 				   input->ip.v6.dst_port);
1233 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1234 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1235 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1236 		break;
1237 	case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1238 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1239 					 input->ip.v6.src_ip);
1240 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1241 					 input->ip.v6.dst_ip);
1242 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1243 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1244 		ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1245 				  input->ip.v6.proto);
1246 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1247 		break;
1248 	default:
1249 		return ICE_ERR_PARAM;
1250 	}
1251 
1252 	if (input->flex_fltr)
1253 		ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1254 
1255 	return ICE_SUCCESS;
1256 }
1257 
1258 /**
1259  * ice_fdir_get_prgm_pkt - generate a training packet
1260  * @input: flow director filter data structure
1261  * @pkt: pointer to return filter packet
1262  * @frag: generate a fragment packet
1263  */
1264 enum ice_status
ice_fdir_get_prgm_pkt(struct ice_fdir_fltr * input,u8 * pkt,bool frag)1265 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1266 {
1267 	return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1268 }
1269 
1270 /**
1271  * ice_fdir_has_frag - does flow type have 2 ptypes
1272  * @flow: flow ptype
1273  *
1274  * returns true is there is a fragment packet for this ptype
1275  */
ice_fdir_has_frag(enum ice_fltr_ptype flow)1276 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1277 {
1278 	if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1279 		return true;
1280 	else
1281 		return false;
1282 }
1283 
1284 /**
1285  * ice_fdir_find_by_idx - find filter with idx
1286  * @hw: pointer to hardware structure
1287  * @fltr_idx: index to find.
1288  *
1289  * Returns pointer to filter if found or null
1290  */
1291 struct ice_fdir_fltr *
ice_fdir_find_fltr_by_idx(struct ice_hw * hw,u32 fltr_idx)1292 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1293 {
1294 	struct ice_fdir_fltr *rule;
1295 
1296 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1297 			    fltr_node) {
1298 		/* rule ID found in the list */
1299 		if (fltr_idx == rule->fltr_id)
1300 			return rule;
1301 		if (fltr_idx < rule->fltr_id)
1302 			break;
1303 	}
1304 	return NULL;
1305 }
1306 
1307 /**
1308  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1309  * @hw: hardware structure
1310  * @fltr: filter node to add to structure
1311  */
ice_fdir_list_add_fltr(struct ice_hw * hw,struct ice_fdir_fltr * fltr)1312 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1313 {
1314 	struct ice_fdir_fltr *rule, *parent = NULL;
1315 
1316 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1317 			    fltr_node) {
1318 		/* rule ID found or pass its spot in the list */
1319 		if (rule->fltr_id >= fltr->fltr_id)
1320 			break;
1321 		parent = rule;
1322 	}
1323 
1324 	if (parent)
1325 		LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1326 	else
1327 		LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1328 }
1329 
1330 /**
1331  * ice_fdir_update_cntrs - increment / decrement filter counter
1332  * @hw: pointer to hardware structure
1333  * @flow: filter flow type
1334  * @acl_fltr: true indicates an ACL filter
1335  * @add: true implies filters added
1336  */
1337 void
ice_fdir_update_cntrs(struct ice_hw * hw,enum ice_fltr_ptype flow,bool acl_fltr,bool add)1338 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1339 		      bool acl_fltr, bool add)
1340 {
1341 	int incr;
1342 
1343 	incr = add ? 1 : -1;
1344 	hw->fdir_active_fltr += incr;
1345 	if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1346 		ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1347 	} else {
1348 		if (acl_fltr)
1349 			hw->acl_fltr_cnt[flow] += incr;
1350 		else
1351 			hw->fdir_fltr_cnt[flow] += incr;
1352 	}
1353 }
1354 
1355 /**
1356  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1357  * @a: IP v6 address
1358  * @b: IP v6 address
1359  *
1360  * Returns 0 on equal, returns non-0 if different
1361  */
ice_cmp_ipv6_addr(__be32 * a,__be32 * b)1362 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1363 {
1364 	return memcmp(a, b, 4 * sizeof(__be32));
1365 }
1366 
1367 /**
1368  * ice_fdir_comp_rules - compare 2 filters
1369  * @a: a Flow Director filter data structure
1370  * @b: a Flow Director filter data structure
1371  * @v6: bool true if v6 filter
1372  *
1373  * Returns true if the filters match
1374  */
1375 static bool
ice_fdir_comp_rules(struct ice_fdir_fltr * a,struct ice_fdir_fltr * b,bool v6)1376 ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
1377 {
1378 	enum ice_fltr_ptype flow_type = a->flow_type;
1379 
1380 	/* The calling function already checks that the two filters have the
1381 	 * same flow_type.
1382 	 */
1383 	if (!v6) {
1384 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1385 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1386 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1387 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1388 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
1389 			    a->ip.v4.dst_port == b->ip.v4.dst_port &&
1390 			    a->ip.v4.src_port == b->ip.v4.src_port)
1391 				return true;
1392 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1393 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1394 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
1395 			    a->ip.v4.l4_header == b->ip.v4.l4_header &&
1396 			    a->ip.v4.proto == b->ip.v4.proto &&
1397 			    a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1398 			    a->ip.v4.tos == b->ip.v4.tos)
1399 				return true;
1400 		}
1401 	} else {
1402 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1403 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1404 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1405 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1406 			    a->ip.v6.src_port == b->ip.v6.src_port &&
1407 			    !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1408 					       b->ip.v6.dst_ip) &&
1409 			    !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1410 					       b->ip.v6.src_ip))
1411 				return true;
1412 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1413 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1414 			    a->ip.v6.src_port == b->ip.v6.src_port)
1415 				return true;
1416 		}
1417 	}
1418 
1419 	return false;
1420 }
1421 
1422 /**
1423  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1424  * @hw: hardware data structure
1425  * @input: Flow Director filter data structure
1426  *
1427  * Returns true if the filter is found in the list
1428  */
ice_fdir_is_dup_fltr(struct ice_hw * hw,struct ice_fdir_fltr * input)1429 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1430 {
1431 	struct ice_fdir_fltr *rule;
1432 	bool ret = false;
1433 
1434 	LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1435 			    fltr_node) {
1436 		enum ice_fltr_ptype flow_type;
1437 
1438 		if (rule->flow_type != input->flow_type)
1439 			continue;
1440 
1441 		flow_type = input->flow_type;
1442 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1443 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1444 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1445 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1446 			ret = ice_fdir_comp_rules(rule, input, false);
1447 		else
1448 			ret = ice_fdir_comp_rules(rule, input, true);
1449 		if (ret) {
1450 			if (rule->fltr_id == input->fltr_id &&
1451 			    rule->q_index != input->q_index)
1452 				ret = false;
1453 			else
1454 				break;
1455 		}
1456 	}
1457 
1458 	return ret;
1459 }
1460 
1461 /**
1462  * ice_clear_pf_fd_table - admin command to clear FD table for PF
1463  * @hw: hardware data structure
1464  *
1465  * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
1466  */
ice_clear_pf_fd_table(struct ice_hw * hw)1467 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
1468 {
1469 	struct ice_aqc_clear_fd_table *cmd;
1470 	struct ice_aq_desc desc;
1471 
1472 	cmd = &desc.params.clear_fd_table;
1473 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
1474 	cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
1475 	/* vsi_index must be 0 to clear FD table for a PF */
1476 	cmd->vsi_index = CPU_TO_LE16(0);
1477 
1478 	return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
1479 }
1480