Loading...
Note: File does not exist in v4.17.
1// SPDX-License-Identifier: GPL-2.0
2/* Copyright (C) 2018-2020, Intel Corporation. */
3
4#include "ice_common.h"
5
6/* These are training packet headers used to program flow director filters. */
7static const u8 ice_fdir_tcpv4_pkt[] = {
8 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
10 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
11 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00,
14 0x20, 0x00, 0x00, 0x00, 0x00, 0x00
15};
16
17static const u8 ice_fdir_udpv4_pkt[] = {
18 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
19 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
20 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
22 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
23 0x00, 0x00,
24};
25
26static const u8 ice_fdir_sctpv4_pkt[] = {
27 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
29 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84,
30 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
31 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33};
34
35static const u8 ice_fdir_ipv4_pkt[] = {
36 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
37 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
38 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10,
39 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40 0x00, 0x00
41};
42
43static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
44 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
46 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
47 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
49 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
51 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
52 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55 0x00, 0x00,
56};
57
58static const u8 ice_fdir_tcp4_gtpu4_pkt[] = {
59 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
61 0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
62 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
64 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
65 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
67 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06,
68 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72};
73
74static const u8 ice_fdir_icmp4_gtpu4_pkt[] = {
75 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
77 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
78 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
79 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
80 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
81 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
82 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
83 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01,
84 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86 0x00, 0x00,
87};
88
89static const u8 ice_fdir_ipv4_gtpu4_pkt[] = {
90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
92 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
93 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
95 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
96 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
98 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100 0x00, 0x00,
101};
102
103static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
106 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110};
111
112static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
115 0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x00,
122};
123
124static const u8 ice_fdir_ipv4_esp_pkt[] = {
125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
127 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
130 0x00, 0x00
131};
132
133static const u8 ice_fdir_ipv6_esp_pkt[] = {
134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
135 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
136 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00,
137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142};
143
144static const u8 ice_fdir_ipv4_ah_pkt[] = {
145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
146 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
147 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
148 0x00, 0x00, 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
152};
153
154static const u8 ice_fdir_ipv6_ah_pkt[] = {
155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
157 0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0x00, 0x00,
162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164};
165
166static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
169 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171 0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x00,
174};
175
176static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
178 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
179 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184 0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
185};
186
187static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
189 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
190 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
193 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195 0x00, 0x00,
196};
197
198static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
201 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
203 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
204 0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206 0x00, 0x00,
207};
208
209static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
212 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 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, 0x00, 0x00,
216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
217 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
218 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
220};
221
222static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
225 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
230 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
231 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233};
234
235static const u8 ice_fdir_non_ip_l2_pkt[] = {
236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239};
240
241static const u8 ice_fdir_tcpv6_pkt[] = {
242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
244 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
251 0x00, 0x00,
252};
253
254static const u8 ice_fdir_udpv6_pkt[] = {
255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
256 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
257 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
258 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
263};
264
265static const u8 ice_fdir_sctpv6_pkt[] = {
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
268 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
274 0x00, 0x00,
275};
276
277static const u8 ice_fdir_ipv6_pkt[] = {
278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
280 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285};
286
287static const u8 ice_fdir_tcp4_tun_pkt[] = {
288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
290 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
296 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
297 0x40, 0x06, 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 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
301};
302
303static const u8 ice_fdir_udp4_tun_pkt[] = {
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
306 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
312 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
313 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00,
316};
317
318static const u8 ice_fdir_sctp4_tun_pkt[] = {
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
321 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
327 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
328 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331};
332
333static const u8 ice_fdir_ip4_tun_pkt[] = {
334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
336 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
342 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
343 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 0x00, 0x00, 0x00, 0x00,
345};
346
347static const u8 ice_fdir_tcp6_tun_pkt[] = {
348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
350 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
356 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
363 0x00, 0x00, 0x00, 0x00,
364};
365
366static const u8 ice_fdir_udp6_tun_pkt[] = {
367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
369 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
375 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381};
382
383static const u8 ice_fdir_sctp6_tun_pkt[] = {
384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
386 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
392 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398 0x00, 0x00, 0x00, 0x00,
399};
400
401static const u8 ice_fdir_ip6_tun_pkt[] = {
402 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
403 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
404 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
410 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
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, 0x00, 0x00, 0x00, 0x00,
415};
416
417/* Flow Director no-op training packet table */
418static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
419 {
420 ICE_FLTR_PTYPE_NONF_IPV4_TCP,
421 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
422 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
423 },
424 {
425 ICE_FLTR_PTYPE_NONF_IPV4_UDP,
426 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
427 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
428 },
429 {
430 ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
431 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
432 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
433 },
434 {
435 ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
436 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
437 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
438 },
439 {
440 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
441 sizeof(ice_fdir_udp4_gtpu4_pkt),
442 ice_fdir_udp4_gtpu4_pkt,
443 sizeof(ice_fdir_udp4_gtpu4_pkt),
444 ice_fdir_udp4_gtpu4_pkt,
445 },
446 {
447 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
448 sizeof(ice_fdir_tcp4_gtpu4_pkt),
449 ice_fdir_tcp4_gtpu4_pkt,
450 sizeof(ice_fdir_tcp4_gtpu4_pkt),
451 ice_fdir_tcp4_gtpu4_pkt,
452 },
453 {
454 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
455 sizeof(ice_fdir_icmp4_gtpu4_pkt),
456 ice_fdir_icmp4_gtpu4_pkt,
457 sizeof(ice_fdir_icmp4_gtpu4_pkt),
458 ice_fdir_icmp4_gtpu4_pkt,
459 },
460 {
461 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
462 sizeof(ice_fdir_ipv4_gtpu4_pkt),
463 ice_fdir_ipv4_gtpu4_pkt,
464 sizeof(ice_fdir_ipv4_gtpu4_pkt),
465 ice_fdir_ipv4_gtpu4_pkt,
466 },
467 {
468 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
469 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
470 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
471 },
472 {
473 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
474 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
475 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
476 },
477 {
478 ICE_FLTR_PTYPE_NONF_IPV4_ESP,
479 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
480 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
481 },
482 {
483 ICE_FLTR_PTYPE_NONF_IPV6_ESP,
484 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
485 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
486 },
487 {
488 ICE_FLTR_PTYPE_NONF_IPV4_AH,
489 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
490 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
491 },
492 {
493 ICE_FLTR_PTYPE_NONF_IPV6_AH,
494 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
495 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
496 },
497 {
498 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
499 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
500 ice_fdir_ipv4_nat_t_esp_pkt,
501 sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
502 ice_fdir_ipv4_nat_t_esp_pkt,
503 },
504 {
505 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
506 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
507 ice_fdir_ipv6_nat_t_esp_pkt,
508 sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
509 ice_fdir_ipv6_nat_t_esp_pkt,
510 },
511 {
512 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
513 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
514 ice_fdir_ipv4_pfcp_node_pkt,
515 sizeof(ice_fdir_ipv4_pfcp_node_pkt),
516 ice_fdir_ipv4_pfcp_node_pkt,
517 },
518 {
519 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
520 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
521 ice_fdir_ipv4_pfcp_session_pkt,
522 sizeof(ice_fdir_ipv4_pfcp_session_pkt),
523 ice_fdir_ipv4_pfcp_session_pkt,
524 },
525 {
526 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
527 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
528 ice_fdir_ipv6_pfcp_node_pkt,
529 sizeof(ice_fdir_ipv6_pfcp_node_pkt),
530 ice_fdir_ipv6_pfcp_node_pkt,
531 },
532 {
533 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
534 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
535 ice_fdir_ipv6_pfcp_session_pkt,
536 sizeof(ice_fdir_ipv6_pfcp_session_pkt),
537 ice_fdir_ipv6_pfcp_session_pkt,
538 },
539 {
540 ICE_FLTR_PTYPE_NON_IP_L2,
541 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
542 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
543 },
544 {
545 ICE_FLTR_PTYPE_NONF_IPV6_TCP,
546 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
547 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
548 },
549 {
550 ICE_FLTR_PTYPE_NONF_IPV6_UDP,
551 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
552 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
553 },
554 {
555 ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
556 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
557 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
558 },
559 {
560 ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
561 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
562 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
563 },
564};
565
566#define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
567
568/**
569 * ice_set_dflt_val_fd_desc
570 * @fd_fltr_ctx: pointer to fd filter descriptor
571 */
572static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
573{
574 fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
575 fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
576 fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
577 fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
578 fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
579 fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
580 fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
581 fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
582 fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
583 fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
584 fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
585 fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
586 fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
587 fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
588 fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
589 fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
590 fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
591 fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
592 fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
593}
594
595/**
596 * ice_set_fd_desc_val
597 * @ctx: pointer to fd filter descriptor context
598 * @fdir_desc: populated with fd filter descriptor values
599 */
600static void
601ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
602 struct ice_fltr_desc *fdir_desc)
603{
604 u64 qword;
605
606 /* prep QW0 of FD filter programming desc */
607 qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
608 ICE_FXD_FLTR_QW0_QINDEX_M;
609 qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
610 ICE_FXD_FLTR_QW0_COMP_Q_M;
611 qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
612 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
613 qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
614 ICE_FXD_FLTR_QW0_FD_SPACE_M;
615 qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
616 ICE_FXD_FLTR_QW0_STAT_CNT_M;
617 qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
618 ICE_FXD_FLTR_QW0_STAT_ENA_M;
619 qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
620 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
621 qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
622 ICE_FXD_FLTR_QW0_TO_Q_M;
623 qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
624 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
625 qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
626 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
627 qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
628 ICE_FXD_FLTR_QW0_DROP_M;
629 qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
630 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
631 qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
632 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
633 qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
634 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
635 fdir_desc->qidx_compq_space_stat = cpu_to_le64(qword);
636
637 /* prep QW1 of FD filter programming desc */
638 qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
639 ICE_FXD_FLTR_QW1_DTYPE_M;
640 qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
641 ICE_FXD_FLTR_QW1_PCMD_M;
642 qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
643 ICE_FXD_FLTR_QW1_PROF_PRI_M;
644 qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
645 ICE_FXD_FLTR_QW1_PROF_M;
646 qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
647 ICE_FXD_FLTR_QW1_FD_VSI_M;
648 qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
649 ICE_FXD_FLTR_QW1_SWAP_M;
650 qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
651 ICE_FXD_FLTR_QW1_FDID_PRI_M;
652 qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
653 ICE_FXD_FLTR_QW1_FDID_MDID_M;
654 qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
655 ICE_FXD_FLTR_QW1_FDID_M;
656 fdir_desc->dtype_cmd_vsi_fdid = cpu_to_le64(qword);
657}
658
659/**
660 * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
661 * @hw: pointer to the hardware structure
662 * @input: filter
663 * @fdesc: filter descriptor
664 * @add: if add is true, this is an add operation, false implies delete
665 */
666void
667ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
668 struct ice_fltr_desc *fdesc, bool add)
669{
670 struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
671
672 /* set default context info */
673 ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
674
675 /* change sideband filtering values */
676 fdir_fltr_ctx.fdid = input->fltr_id;
677 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
678 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
679 fdir_fltr_ctx.qindex = 0;
680 } else if (input->dest_ctl ==
681 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
682 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
683 fdir_fltr_ctx.qindex = 0;
684 } else {
685 if (input->dest_ctl ==
686 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
687 fdir_fltr_ctx.toq = input->q_region;
688 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
689 fdir_fltr_ctx.qindex = input->q_index;
690 }
691 fdir_fltr_ctx.cnt_ena = input->cnt_ena;
692 fdir_fltr_ctx.cnt_index = input->cnt_index;
693 fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
694 fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
695 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
696 fdir_fltr_ctx.toq_prio = 0;
697 else
698 fdir_fltr_ctx.toq_prio = 3;
699 fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
700 ICE_FXD_FLTR_QW1_PCMD_REMOVE;
701 fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
702 fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
703 fdir_fltr_ctx.comp_report = input->comp_report;
704 fdir_fltr_ctx.fdid_prio = input->fdid_prio;
705 fdir_fltr_ctx.desc_prof = 1;
706 fdir_fltr_ctx.desc_prof_prio = 3;
707 ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
708}
709
710/**
711 * ice_alloc_fd_res_cntr - obtain counter resource for FD type
712 * @hw: pointer to the hardware structure
713 * @cntr_id: returns counter index
714 */
715enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
716{
717 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
718 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
719}
720
721/**
722 * ice_free_fd_res_cntr - Free counter resource for FD type
723 * @hw: pointer to the hardware structure
724 * @cntr_id: counter index to be freed
725 */
726enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
727{
728 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
729 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
730}
731
732/**
733 * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
734 * @hw: pointer to the hardware structure
735 * @cntr_id: returns counter index
736 * @num_fltr: number of filter entries to be allocated
737 */
738enum ice_status
739ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
740{
741 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
742 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
743 cntr_id);
744}
745
746/**
747 * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
748 * @hw: pointer to the hardware structure
749 * @cntr_id: returns counter index
750 * @num_fltr: number of filter entries to be allocated
751 */
752enum ice_status
753ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
754{
755 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
756 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
757 cntr_id);
758}
759
760/**
761 * ice_get_fdir_cnt_all - get the number of Flow Director filters
762 * @hw: hardware data structure
763 *
764 * Returns the number of filters available on device
765 */
766int ice_get_fdir_cnt_all(struct ice_hw *hw)
767{
768 return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
769}
770
771/**
772 * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer
773 * @pkt: packet buffer
774 * @offset: offset into buffer
775 * @addr: IPv6 address to convert and insert into pkt at offset
776 */
777static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
778{
779 int idx;
780
781 for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
782 memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
783 sizeof(*addr));
784}
785
786/**
787 * ice_pkt_insert_u6_qfi - insert a u6 value QFI into a memory buffer for GTPU
788 * @pkt: packet buffer
789 * @offset: offset into buffer
790 * @data: 8 bit value to convert and insert into pkt at offset
791 *
792 * This function is designed for inserting QFI (6 bits) for GTPU.
793 */
794static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
795{
796 u8 ret;
797
798 ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
799 memcpy(pkt + offset, &ret, sizeof(ret));
800}
801
802/**
803 * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
804 * @pkt: packet buffer
805 * @offset: offset into buffer
806 * @data: 8 bit value to convert and insert into pkt at offset
807 */
808static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
809{
810 memcpy(pkt + offset, &data, sizeof(data));
811}
812
813/**
814 * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
815 * @pkt: packet buffer
816 * @offset: offset into buffer
817 * @data: 8 bit value to convert and insert into pkt at offset
818 *
819 * This function is designed for inserting Traffic Class (TC) for IPv6,
820 * since that TC is not aligned in number of bytes. Here we split it out
821 * into two part and fill each byte with data copy from pkt, then insert
822 * the two bytes data one by one.
823 */
824static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
825{
826 u8 high, low;
827
828 high = (data >> 4) + (*(pkt + offset) & 0xF0);
829 memcpy(pkt + offset, &high, sizeof(high));
830
831 low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
832 memcpy(pkt + offset + 1, &low, sizeof(low));
833}
834
835/**
836 * ice_pkt_insert_u16 - insert a be16 value into a memory buffer
837 * @pkt: packet buffer
838 * @offset: offset into buffer
839 * @data: 16 bit value to convert and insert into pkt at offset
840 */
841static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
842{
843 memcpy(pkt + offset, &data, sizeof(data));
844}
845
846/**
847 * ice_pkt_insert_u32 - insert a be32 value into a memory buffer
848 * @pkt: packet buffer
849 * @offset: offset into buffer
850 * @data: 32 bit value to convert and insert into pkt at offset
851 */
852static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
853{
854 memcpy(pkt + offset, &data, sizeof(data));
855}
856
857/**
858 * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
859 * @pkt: packet buffer
860 * @addr: MAC address to convert and insert into pkt at offset
861 */
862static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
863{
864 ether_addr_copy(pkt, addr);
865}
866
867/**
868 * ice_fdir_get_gen_prgm_pkt - generate a training packet
869 * @hw: pointer to the hardware structure
870 * @input: flow director filter data structure
871 * @pkt: pointer to return filter packet
872 * @frag: generate a fragment packet
873 * @tun: true implies generate a tunnel packet
874 */
875enum ice_status
876ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
877 u8 *pkt, bool frag, bool tun)
878{
879 enum ice_fltr_ptype flow;
880 u16 tnl_port;
881 u8 *loc;
882 u16 idx;
883
884 if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
885 switch (input->ip.v4.proto) {
886 case IPPROTO_TCP:
887 flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
888 break;
889 case IPPROTO_UDP:
890 flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
891 break;
892 case IPPROTO_SCTP:
893 flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
894 break;
895 default:
896 flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
897 break;
898 }
899 } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
900 switch (input->ip.v6.proto) {
901 case IPPROTO_TCP:
902 flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
903 break;
904 case IPPROTO_UDP:
905 flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
906 break;
907 case IPPROTO_SCTP:
908 flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
909 break;
910 default:
911 flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
912 break;
913 }
914 } else {
915 flow = input->flow_type;
916 }
917
918 for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
919 if (ice_fdir_pkt[idx].flow == flow)
920 break;
921 if (idx == ICE_FDIR_NUM_PKT)
922 return ICE_ERR_PARAM;
923 if (!tun) {
924 memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len);
925 loc = pkt;
926 } else {
927 if (!ice_get_open_tunnel_port(hw, &tnl_port))
928 return ICE_ERR_DOES_NOT_EXIST;
929 if (!ice_fdir_pkt[idx].tun_pkt)
930 return ICE_ERR_PARAM;
931 memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
932 ice_fdir_pkt[idx].tun_pkt_len);
933 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
934 htons(tnl_port));
935 loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
936 }
937
938 /* Reverse the src and dst, since the HW expects them to be from Tx
939 * perspective. The input from user is from Rx filter perspective.
940 */
941 switch (flow) {
942 case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
943 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
944 input->ip.v4.src_ip);
945 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
946 input->ip.v4.src_port);
947 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
948 input->ip.v4.dst_ip);
949 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
950 input->ip.v4.dst_port);
951 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
952 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
953 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
954 if (frag)
955 loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
956 break;
957 case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
958 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
959 input->ip.v4.src_ip);
960 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
961 input->ip.v4.src_port);
962 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
963 input->ip.v4.dst_ip);
964 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
965 input->ip.v4.dst_port);
966 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
967 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
968 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
969 ice_pkt_insert_mac_addr(loc + ETH_ALEN,
970 input->ext_data.src_mac);
971 break;
972 case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
973 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
974 input->ip.v4.src_ip);
975 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
976 input->ip.v4.src_port);
977 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
978 input->ip.v4.dst_ip);
979 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
980 input->ip.v4.dst_port);
981 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
982 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
983 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
984 break;
985 case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
986 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
987 input->ip.v4.src_ip);
988 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
989 input->ip.v4.dst_ip);
990 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
991 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
992 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
993 input->ip.v4.proto);
994 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
995 break;
996 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
997 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
998 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
999 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
1000 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1001 input->ip.v4.src_ip);
1002 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1003 input->ip.v4.dst_ip);
1004 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1005 input->gtpu_data.teid);
1006 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1007 input->gtpu_data.qfi);
1008 break;
1009 case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1010 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1011 input->l2tpv3_data.session_id);
1012 break;
1013 case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1014 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1015 input->l2tpv3_data.session_id);
1016 break;
1017 case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1018 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1019 input->ip.v4.sec_parm_idx);
1020 break;
1021 case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1022 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1023 input->ip.v6.sec_parm_idx);
1024 break;
1025 case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1026 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1027 input->ip.v4.sec_parm_idx);
1028 break;
1029 case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1030 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1031 input->ip.v6.sec_parm_idx);
1032 break;
1033 case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1034 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1035 input->ip.v4.src_ip);
1036 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1037 input->ip.v4.dst_ip);
1038 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1039 input->ip.v4.sec_parm_idx);
1040 break;
1041 case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1042 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1043 input->ip.v6.src_ip);
1044 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1045 input->ip.v6.dst_ip);
1046 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1047 input->ip.v6.sec_parm_idx);
1048 break;
1049 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1050 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1051 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1052 input->ip.v4.dst_port);
1053 break;
1054 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1055 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1056 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1057 input->ip.v6.dst_port);
1058 break;
1059 case ICE_FLTR_PTYPE_NON_IP_L2:
1060 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1061 input->ext_data.ether_type);
1062 break;
1063 case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1064 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1065 input->ip.v6.src_ip);
1066 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1067 input->ip.v6.dst_ip);
1068 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1069 input->ip.v6.src_port);
1070 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1071 input->ip.v6.dst_port);
1072 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1073 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1074 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1075 break;
1076 case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1077 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1078 input->ip.v6.src_ip);
1079 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1080 input->ip.v6.dst_ip);
1081 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1082 input->ip.v6.src_port);
1083 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1084 input->ip.v6.dst_port);
1085 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1086 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1087 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1088 break;
1089 case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1090 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1091 input->ip.v6.src_ip);
1092 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1093 input->ip.v6.dst_ip);
1094 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1095 input->ip.v6.src_port);
1096 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1097 input->ip.v6.dst_port);
1098 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1099 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1100 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1101 break;
1102 case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1103 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1104 input->ip.v6.src_ip);
1105 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1106 input->ip.v6.dst_ip);
1107 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1108 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1109 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1110 input->ip.v6.proto);
1111 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1112 break;
1113 default:
1114 return ICE_ERR_PARAM;
1115 }
1116
1117 if (input->flex_fltr)
1118 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1119
1120 return 0;
1121}
1122
1123/**
1124 * ice_fdir_has_frag - does flow type have 2 ptypes
1125 * @flow: flow ptype
1126 *
1127 * returns true is there is a fragment packet for this ptype
1128 */
1129bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1130{
1131 if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1132 return true;
1133 else
1134 return false;
1135}
1136
1137/**
1138 * ice_fdir_find_fltr_by_idx - find filter with idx
1139 * @hw: pointer to hardware structure
1140 * @fltr_idx: index to find.
1141 *
1142 * Returns pointer to filter if found or null
1143 */
1144struct ice_fdir_fltr *
1145ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1146{
1147 struct ice_fdir_fltr *rule;
1148
1149 list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
1150 /* rule ID found in the list */
1151 if (fltr_idx == rule->fltr_id)
1152 return rule;
1153 if (fltr_idx < rule->fltr_id)
1154 break;
1155 }
1156 return NULL;
1157}
1158
1159/**
1160 * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1161 * @hw: hardware structure
1162 * @fltr: filter node to add to structure
1163 */
1164void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1165{
1166 struct ice_fdir_fltr *rule, *parent = NULL;
1167
1168 list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
1169 /* rule ID found or pass its spot in the list */
1170 if (rule->fltr_id >= fltr->fltr_id)
1171 break;
1172 parent = rule;
1173 }
1174
1175 if (parent)
1176 list_add(&fltr->fltr_node, &parent->fltr_node);
1177 else
1178 list_add(&fltr->fltr_node, &hw->fdir_list_head);
1179}
1180
1181/**
1182 * ice_fdir_update_cntrs - increment / decrement filter counter
1183 * @hw: pointer to hardware structure
1184 * @flow: filter flow type
1185 * @add: true implies filters added
1186 */
1187void
1188ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add)
1189{
1190 int incr;
1191
1192 incr = add ? 1 : -1;
1193 hw->fdir_active_fltr += incr;
1194
1195 if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX)
1196 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1197 else
1198 hw->fdir_fltr_cnt[flow] += incr;
1199}
1200
1201/**
1202 * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1203 * @a: IP v6 address
1204 * @b: IP v6 address
1205 *
1206 * Returns 0 on equal, returns non-0 if different
1207 */
1208static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1209{
1210 return memcmp(a, b, 4 * sizeof(__be32));
1211}
1212
1213/**
1214 * ice_fdir_comp_rules - compare 2 filters
1215 * @a: a Flow Director filter data structure
1216 * @b: a Flow Director filter data structure
1217 * @v6: bool true if v6 filter
1218 *
1219 * Returns true if the filters match
1220 */
1221static bool
1222ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6)
1223{
1224 enum ice_fltr_ptype flow_type = a->flow_type;
1225
1226 /* The calling function already checks that the two filters have the
1227 * same flow_type.
1228 */
1229 if (!v6) {
1230 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1231 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1232 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1233 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1234 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1235 a->ip.v4.dst_port == b->ip.v4.dst_port &&
1236 a->ip.v4.src_port == b->ip.v4.src_port)
1237 return true;
1238 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1239 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1240 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1241 a->ip.v4.l4_header == b->ip.v4.l4_header &&
1242 a->ip.v4.proto == b->ip.v4.proto &&
1243 a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1244 a->ip.v4.tos == b->ip.v4.tos)
1245 return true;
1246 }
1247 } else {
1248 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1249 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1250 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1251 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1252 a->ip.v6.src_port == b->ip.v6.src_port &&
1253 !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1254 b->ip.v6.dst_ip) &&
1255 !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1256 b->ip.v6.src_ip))
1257 return true;
1258 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1259 if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1260 a->ip.v6.src_port == b->ip.v6.src_port)
1261 return true;
1262 }
1263 }
1264
1265 return false;
1266}
1267
1268/**
1269 * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1270 * @hw: hardware data structure
1271 * @input: Flow Director filter data structure
1272 *
1273 * Returns true if the filter is found in the list
1274 */
1275bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1276{
1277 struct ice_fdir_fltr *rule;
1278 bool ret = false;
1279
1280 list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
1281 enum ice_fltr_ptype flow_type;
1282
1283 if (rule->flow_type != input->flow_type)
1284 continue;
1285
1286 flow_type = input->flow_type;
1287 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1288 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1289 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1290 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1291 ret = ice_fdir_comp_rules(rule, input, false);
1292 else
1293 ret = ice_fdir_comp_rules(rule, input, true);
1294 if (ret) {
1295 if (rule->fltr_id == input->fltr_id &&
1296 rule->q_index != input->q_index)
1297 ret = false;
1298 else
1299 break;
1300 }
1301 }
1302
1303 return ret;
1304}