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. */ |
7 | static 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 | |
17 | static 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 | |
26 | static 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 | |
35 | static 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 | |
43 | static 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 | |
58 | static 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 | |
74 | static 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 | |
89 | static 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 | |
103 | static 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 | |
112 | static 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 | |
124 | static 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 | |
133 | static 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 | |
144 | static 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 | |
154 | static 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 | |
166 | static 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 | |
176 | static 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 | |
187 | static 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 | |
198 | static 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 | |
209 | static 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 | |
222 | static 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 | |
235 | static 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 | |
241 | static 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 | |
254 | static 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 | |
265 | static 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 | |
277 | static 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 | |
287 | static 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 | |
303 | static 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 | |
318 | static 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 | |
333 | static 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 | |
347 | static 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 | |
366 | static 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 | |
383 | static 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 | |
401 | static 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 */ |
418 | static 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 | */ |
572 | static 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 | */ |
600 | static void |
601 | ice_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 | */ |
666 | void |
667 | ice_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(fd_fltr_ctx: &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, vsi_handle: 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(ctx: &fdir_fltr_ctx, fdir_desc: 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 | */ |
715 | int 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, num_items: 1, counter_id: 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 | */ |
726 | int 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, num_items: 1, counter_id: 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 | */ |
738 | int ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) |
739 | { |
740 | return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES, |
741 | ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_items: num_fltr, |
742 | counter_id: cntr_id); |
743 | } |
744 | |
745 | /** |
746 | * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries |
747 | * @hw: pointer to the hardware structure |
748 | * @cntr_id: returns counter index |
749 | * @num_fltr: number of filter entries to be allocated |
750 | */ |
751 | int ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) |
752 | { |
753 | return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES, |
754 | ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_items: num_fltr, |
755 | counter_id: cntr_id); |
756 | } |
757 | |
758 | /** |
759 | * ice_get_fdir_cnt_all - get the number of Flow Director filters |
760 | * @hw: hardware data structure |
761 | * |
762 | * Returns the number of filters available on device |
763 | */ |
764 | int ice_get_fdir_cnt_all(struct ice_hw *hw) |
765 | { |
766 | return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort; |
767 | } |
768 | |
769 | /** |
770 | * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer |
771 | * @pkt: packet buffer |
772 | * @offset: offset into buffer |
773 | * @addr: IPv6 address to convert and insert into pkt at offset |
774 | */ |
775 | static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr) |
776 | { |
777 | int idx; |
778 | |
779 | for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++) |
780 | memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx], |
781 | sizeof(*addr)); |
782 | } |
783 | |
784 | /** |
785 | * ice_pkt_insert_u6_qfi - insert a u6 value QFI into a memory buffer for GTPU |
786 | * @pkt: packet buffer |
787 | * @offset: offset into buffer |
788 | * @data: 8 bit value to convert and insert into pkt at offset |
789 | * |
790 | * This function is designed for inserting QFI (6 bits) for GTPU. |
791 | */ |
792 | static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data) |
793 | { |
794 | u8 ret; |
795 | |
796 | ret = (data & 0x3F) + (*(pkt + offset) & 0xC0); |
797 | memcpy(pkt + offset, &ret, sizeof(ret)); |
798 | } |
799 | |
800 | /** |
801 | * ice_pkt_insert_u8 - insert a u8 value into a memory buffer. |
802 | * @pkt: packet buffer |
803 | * @offset: offset into buffer |
804 | * @data: 8 bit value to convert and insert into pkt at offset |
805 | */ |
806 | static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data) |
807 | { |
808 | memcpy(pkt + offset, &data, sizeof(data)); |
809 | } |
810 | |
811 | /** |
812 | * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6. |
813 | * @pkt: packet buffer |
814 | * @offset: offset into buffer |
815 | * @data: 8 bit value to convert and insert into pkt at offset |
816 | * |
817 | * This function is designed for inserting Traffic Class (TC) for IPv6, |
818 | * since that TC is not aligned in number of bytes. Here we split it out |
819 | * into two part and fill each byte with data copy from pkt, then insert |
820 | * the two bytes data one by one. |
821 | */ |
822 | static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data) |
823 | { |
824 | u8 high, low; |
825 | |
826 | high = (data >> 4) + (*(pkt + offset) & 0xF0); |
827 | memcpy(pkt + offset, &high, sizeof(high)); |
828 | |
829 | low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4); |
830 | memcpy(pkt + offset + 1, &low, sizeof(low)); |
831 | } |
832 | |
833 | /** |
834 | * ice_pkt_insert_u16 - insert a be16 value into a memory buffer |
835 | * @pkt: packet buffer |
836 | * @offset: offset into buffer |
837 | * @data: 16 bit value to convert and insert into pkt at offset |
838 | */ |
839 | static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data) |
840 | { |
841 | memcpy(pkt + offset, &data, sizeof(data)); |
842 | } |
843 | |
844 | /** |
845 | * ice_pkt_insert_u32 - insert a be32 value into a memory buffer |
846 | * @pkt: packet buffer |
847 | * @offset: offset into buffer |
848 | * @data: 32 bit value to convert and insert into pkt at offset |
849 | */ |
850 | static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data) |
851 | { |
852 | memcpy(pkt + offset, &data, sizeof(data)); |
853 | } |
854 | |
855 | /** |
856 | * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer. |
857 | * @pkt: packet buffer |
858 | * @addr: MAC address to convert and insert into pkt at offset |
859 | */ |
860 | static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr) |
861 | { |
862 | ether_addr_copy(dst: pkt, src: addr); |
863 | } |
864 | |
865 | /** |
866 | * ice_fdir_get_gen_prgm_pkt - generate a training packet |
867 | * @hw: pointer to the hardware structure |
868 | * @input: flow director filter data structure |
869 | * @pkt: pointer to return filter packet |
870 | * @frag: generate a fragment packet |
871 | * @tun: true implies generate a tunnel packet |
872 | */ |
873 | int |
874 | ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input, |
875 | u8 *pkt, bool frag, bool tun) |
876 | { |
877 | enum ice_fltr_ptype flow; |
878 | u16 tnl_port; |
879 | u8 *loc; |
880 | u16 idx; |
881 | |
882 | if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { |
883 | switch (input->ip.v4.proto) { |
884 | case IPPROTO_TCP: |
885 | flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP; |
886 | break; |
887 | case IPPROTO_UDP: |
888 | flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP; |
889 | break; |
890 | case IPPROTO_SCTP: |
891 | flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP; |
892 | break; |
893 | default: |
894 | flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER; |
895 | break; |
896 | } |
897 | } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { |
898 | switch (input->ip.v6.proto) { |
899 | case IPPROTO_TCP: |
900 | flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP; |
901 | break; |
902 | case IPPROTO_UDP: |
903 | flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP; |
904 | break; |
905 | case IPPROTO_SCTP: |
906 | flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP; |
907 | break; |
908 | default: |
909 | flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER; |
910 | break; |
911 | } |
912 | } else { |
913 | flow = input->flow_type; |
914 | } |
915 | |
916 | for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++) |
917 | if (ice_fdir_pkt[idx].flow == flow) |
918 | break; |
919 | if (idx == ICE_FDIR_NUM_PKT) |
920 | return -EINVAL; |
921 | if (!tun) { |
922 | memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len); |
923 | loc = pkt; |
924 | } else { |
925 | if (!ice_get_open_tunnel_port(hw, port: &tnl_port, type: TNL_ALL)) |
926 | return -ENOENT; |
927 | if (!ice_fdir_pkt[idx].tun_pkt) |
928 | return -EINVAL; |
929 | memcpy(pkt, ice_fdir_pkt[idx].tun_pkt, |
930 | ice_fdir_pkt[idx].tun_pkt_len); |
931 | ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET, |
932 | htons(tnl_port)); |
933 | loc = &pkt[ICE_FDIR_TUN_PKT_OFF]; |
934 | } |
935 | |
936 | /* Reverse the src and dst, since the HW expects them to be from Tx |
937 | * perspective. The input from user is from Rx filter perspective. |
938 | */ |
939 | switch (flow) { |
940 | case ICE_FLTR_PTYPE_NONF_IPV4_TCP: |
941 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_DST_ADDR_OFFSET, |
942 | data: input->ip.v4.src_ip); |
943 | ice_pkt_insert_u16(pkt: loc, ICE_IPV4_TCP_DST_PORT_OFFSET, |
944 | data: input->ip.v4.src_port); |
945 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_SRC_ADDR_OFFSET, |
946 | data: input->ip.v4.dst_ip); |
947 | ice_pkt_insert_u16(pkt: loc, ICE_IPV4_TCP_SRC_PORT_OFFSET, |
948 | data: input->ip.v4.dst_port); |
949 | ice_pkt_insert_u8(pkt: loc, ICE_IPV4_TOS_OFFSET, data: input->ip.v4.tos); |
950 | ice_pkt_insert_u8(pkt: loc, ICE_IPV4_TTL_OFFSET, data: input->ip.v4.ttl); |
951 | ice_pkt_insert_mac_addr(pkt: loc, addr: input->ext_data.dst_mac); |
952 | if (frag) |
953 | loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF; |
954 | break; |
955 | case ICE_FLTR_PTYPE_NONF_IPV4_UDP: |
956 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_DST_ADDR_OFFSET, |
957 | data: input->ip.v4.src_ip); |
958 | ice_pkt_insert_u16(pkt: loc, ICE_IPV4_UDP_DST_PORT_OFFSET, |
959 | data: input->ip.v4.src_port); |
960 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_SRC_ADDR_OFFSET, |
961 | data: input->ip.v4.dst_ip); |
962 | ice_pkt_insert_u16(pkt: loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, |
963 | data: input->ip.v4.dst_port); |
964 | ice_pkt_insert_u8(pkt: loc, ICE_IPV4_TOS_OFFSET, data: input->ip.v4.tos); |
965 | ice_pkt_insert_u8(pkt: loc, ICE_IPV4_TTL_OFFSET, data: input->ip.v4.ttl); |
966 | ice_pkt_insert_mac_addr(pkt: loc, addr: input->ext_data.dst_mac); |
967 | ice_pkt_insert_mac_addr(pkt: loc + ETH_ALEN, |
968 | addr: input->ext_data.src_mac); |
969 | break; |
970 | case ICE_FLTR_PTYPE_NONF_IPV4_SCTP: |
971 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_DST_ADDR_OFFSET, |
972 | data: input->ip.v4.src_ip); |
973 | ice_pkt_insert_u16(pkt: loc, ICE_IPV4_SCTP_DST_PORT_OFFSET, |
974 | data: input->ip.v4.src_port); |
975 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_SRC_ADDR_OFFSET, |
976 | data: input->ip.v4.dst_ip); |
977 | ice_pkt_insert_u16(pkt: loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET, |
978 | data: input->ip.v4.dst_port); |
979 | ice_pkt_insert_u8(pkt: loc, ICE_IPV4_TOS_OFFSET, data: input->ip.v4.tos); |
980 | ice_pkt_insert_u8(pkt: loc, ICE_IPV4_TTL_OFFSET, data: input->ip.v4.ttl); |
981 | ice_pkt_insert_mac_addr(pkt: loc, addr: input->ext_data.dst_mac); |
982 | break; |
983 | case ICE_FLTR_PTYPE_NONF_IPV4_OTHER: |
984 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_DST_ADDR_OFFSET, |
985 | data: input->ip.v4.src_ip); |
986 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_SRC_ADDR_OFFSET, |
987 | data: input->ip.v4.dst_ip); |
988 | ice_pkt_insert_u8(pkt: loc, ICE_IPV4_TOS_OFFSET, data: input->ip.v4.tos); |
989 | ice_pkt_insert_u8(pkt: loc, ICE_IPV4_TTL_OFFSET, data: input->ip.v4.ttl); |
990 | ice_pkt_insert_u8(pkt: loc, ICE_IPV4_PROTO_OFFSET, |
991 | data: input->ip.v4.proto); |
992 | ice_pkt_insert_mac_addr(pkt: loc, addr: input->ext_data.dst_mac); |
993 | break; |
994 | case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP: |
995 | case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP: |
996 | case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP: |
997 | case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER: |
998 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_DST_ADDR_OFFSET, |
999 | data: input->ip.v4.src_ip); |
1000 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_SRC_ADDR_OFFSET, |
1001 | data: input->ip.v4.dst_ip); |
1002 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_GTPU_TEID_OFFSET, |
1003 | data: input->gtpu_data.teid); |
1004 | ice_pkt_insert_u6_qfi(pkt: loc, ICE_IPV4_GTPU_QFI_OFFSET, |
1005 | data: input->gtpu_data.qfi); |
1006 | break; |
1007 | case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3: |
1008 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET, |
1009 | data: input->l2tpv3_data.session_id); |
1010 | break; |
1011 | case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3: |
1012 | ice_pkt_insert_u32(pkt: loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET, |
1013 | data: input->l2tpv3_data.session_id); |
1014 | break; |
1015 | case ICE_FLTR_PTYPE_NONF_IPV4_ESP: |
1016 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_ESP_SPI_OFFSET, |
1017 | data: input->ip.v4.sec_parm_idx); |
1018 | break; |
1019 | case ICE_FLTR_PTYPE_NONF_IPV6_ESP: |
1020 | ice_pkt_insert_u32(pkt: loc, ICE_IPV6_ESP_SPI_OFFSET, |
1021 | data: input->ip.v6.sec_parm_idx); |
1022 | break; |
1023 | case ICE_FLTR_PTYPE_NONF_IPV4_AH: |
1024 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_AH_SPI_OFFSET, |
1025 | data: input->ip.v4.sec_parm_idx); |
1026 | break; |
1027 | case ICE_FLTR_PTYPE_NONF_IPV6_AH: |
1028 | ice_pkt_insert_u32(pkt: loc, ICE_IPV6_AH_SPI_OFFSET, |
1029 | data: input->ip.v6.sec_parm_idx); |
1030 | break; |
1031 | case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP: |
1032 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_DST_ADDR_OFFSET, |
1033 | data: input->ip.v4.src_ip); |
1034 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_SRC_ADDR_OFFSET, |
1035 | data: input->ip.v4.dst_ip); |
1036 | ice_pkt_insert_u32(pkt: loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET, |
1037 | data: input->ip.v4.sec_parm_idx); |
1038 | break; |
1039 | case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP: |
1040 | ice_pkt_insert_ipv6_addr(pkt: loc, ICE_IPV6_DST_ADDR_OFFSET, |
1041 | addr: input->ip.v6.src_ip); |
1042 | ice_pkt_insert_ipv6_addr(pkt: loc, ICE_IPV6_SRC_ADDR_OFFSET, |
1043 | addr: input->ip.v6.dst_ip); |
1044 | ice_pkt_insert_u32(pkt: loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET, |
1045 | data: input->ip.v6.sec_parm_idx); |
1046 | break; |
1047 | case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE: |
1048 | case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION: |
1049 | ice_pkt_insert_u16(pkt: loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, |
1050 | data: input->ip.v4.dst_port); |
1051 | break; |
1052 | case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE: |
1053 | case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION: |
1054 | ice_pkt_insert_u16(pkt: loc, ICE_IPV6_UDP_SRC_PORT_OFFSET, |
1055 | data: input->ip.v6.dst_port); |
1056 | break; |
1057 | case ICE_FLTR_PTYPE_NON_IP_L2: |
1058 | ice_pkt_insert_u16(pkt: loc, ICE_MAC_ETHTYPE_OFFSET, |
1059 | data: input->ext_data.ether_type); |
1060 | break; |
1061 | case ICE_FLTR_PTYPE_NONF_IPV6_TCP: |
1062 | ice_pkt_insert_ipv6_addr(pkt: loc, ICE_IPV6_DST_ADDR_OFFSET, |
1063 | addr: input->ip.v6.src_ip); |
1064 | ice_pkt_insert_ipv6_addr(pkt: loc, ICE_IPV6_SRC_ADDR_OFFSET, |
1065 | addr: input->ip.v6.dst_ip); |
1066 | ice_pkt_insert_u16(pkt: loc, ICE_IPV6_TCP_DST_PORT_OFFSET, |
1067 | data: input->ip.v6.src_port); |
1068 | ice_pkt_insert_u16(pkt: loc, ICE_IPV6_TCP_SRC_PORT_OFFSET, |
1069 | data: input->ip.v6.dst_port); |
1070 | ice_pkt_insert_u8_tc(pkt: loc, ICE_IPV6_TC_OFFSET, data: input->ip.v6.tc); |
1071 | ice_pkt_insert_u8(pkt: loc, ICE_IPV6_HLIM_OFFSET, data: input->ip.v6.hlim); |
1072 | ice_pkt_insert_mac_addr(pkt: loc, addr: input->ext_data.dst_mac); |
1073 | break; |
1074 | case ICE_FLTR_PTYPE_NONF_IPV6_UDP: |
1075 | ice_pkt_insert_ipv6_addr(pkt: loc, ICE_IPV6_DST_ADDR_OFFSET, |
1076 | addr: input->ip.v6.src_ip); |
1077 | ice_pkt_insert_ipv6_addr(pkt: loc, ICE_IPV6_SRC_ADDR_OFFSET, |
1078 | addr: input->ip.v6.dst_ip); |
1079 | ice_pkt_insert_u16(pkt: loc, ICE_IPV6_UDP_DST_PORT_OFFSET, |
1080 | data: input->ip.v6.src_port); |
1081 | ice_pkt_insert_u16(pkt: loc, ICE_IPV6_UDP_SRC_PORT_OFFSET, |
1082 | data: input->ip.v6.dst_port); |
1083 | ice_pkt_insert_u8_tc(pkt: loc, ICE_IPV6_TC_OFFSET, data: input->ip.v6.tc); |
1084 | ice_pkt_insert_u8(pkt: loc, ICE_IPV6_HLIM_OFFSET, data: input->ip.v6.hlim); |
1085 | ice_pkt_insert_mac_addr(pkt: loc, addr: input->ext_data.dst_mac); |
1086 | break; |
1087 | case ICE_FLTR_PTYPE_NONF_IPV6_SCTP: |
1088 | ice_pkt_insert_ipv6_addr(pkt: loc, ICE_IPV6_DST_ADDR_OFFSET, |
1089 | addr: input->ip.v6.src_ip); |
1090 | ice_pkt_insert_ipv6_addr(pkt: loc, ICE_IPV6_SRC_ADDR_OFFSET, |
1091 | addr: input->ip.v6.dst_ip); |
1092 | ice_pkt_insert_u16(pkt: loc, ICE_IPV6_SCTP_DST_PORT_OFFSET, |
1093 | data: input->ip.v6.src_port); |
1094 | ice_pkt_insert_u16(pkt: loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET, |
1095 | data: input->ip.v6.dst_port); |
1096 | ice_pkt_insert_u8_tc(pkt: loc, ICE_IPV6_TC_OFFSET, data: input->ip.v6.tc); |
1097 | ice_pkt_insert_u8(pkt: loc, ICE_IPV6_HLIM_OFFSET, data: input->ip.v6.hlim); |
1098 | ice_pkt_insert_mac_addr(pkt: loc, addr: input->ext_data.dst_mac); |
1099 | break; |
1100 | case ICE_FLTR_PTYPE_NONF_IPV6_OTHER: |
1101 | ice_pkt_insert_ipv6_addr(pkt: loc, ICE_IPV6_DST_ADDR_OFFSET, |
1102 | addr: input->ip.v6.src_ip); |
1103 | ice_pkt_insert_ipv6_addr(pkt: loc, ICE_IPV6_SRC_ADDR_OFFSET, |
1104 | addr: input->ip.v6.dst_ip); |
1105 | ice_pkt_insert_u8_tc(pkt: loc, ICE_IPV6_TC_OFFSET, data: input->ip.v6.tc); |
1106 | ice_pkt_insert_u8(pkt: loc, ICE_IPV6_HLIM_OFFSET, data: input->ip.v6.hlim); |
1107 | ice_pkt_insert_u8(pkt: loc, ICE_IPV6_PROTO_OFFSET, |
1108 | data: input->ip.v6.proto); |
1109 | ice_pkt_insert_mac_addr(pkt: loc, addr: input->ext_data.dst_mac); |
1110 | break; |
1111 | default: |
1112 | return -EINVAL; |
1113 | } |
1114 | |
1115 | if (input->flex_fltr) |
1116 | ice_pkt_insert_u16(pkt: loc, offset: input->flex_offset, data: input->flex_word); |
1117 | |
1118 | return 0; |
1119 | } |
1120 | |
1121 | /** |
1122 | * ice_fdir_has_frag - does flow type have 2 ptypes |
1123 | * @flow: flow ptype |
1124 | * |
1125 | * returns true is there is a fragment packet for this ptype |
1126 | */ |
1127 | bool ice_fdir_has_frag(enum ice_fltr_ptype flow) |
1128 | { |
1129 | if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) |
1130 | return true; |
1131 | else |
1132 | return false; |
1133 | } |
1134 | |
1135 | /** |
1136 | * ice_fdir_find_fltr_by_idx - find filter with idx |
1137 | * @hw: pointer to hardware structure |
1138 | * @fltr_idx: index to find. |
1139 | * |
1140 | * Returns pointer to filter if found or null |
1141 | */ |
1142 | struct ice_fdir_fltr * |
1143 | ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx) |
1144 | { |
1145 | struct ice_fdir_fltr *rule; |
1146 | |
1147 | list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { |
1148 | /* rule ID found in the list */ |
1149 | if (fltr_idx == rule->fltr_id) |
1150 | return rule; |
1151 | if (fltr_idx < rule->fltr_id) |
1152 | break; |
1153 | } |
1154 | return NULL; |
1155 | } |
1156 | |
1157 | /** |
1158 | * ice_fdir_list_add_fltr - add a new node to the flow director filter list |
1159 | * @hw: hardware structure |
1160 | * @fltr: filter node to add to structure |
1161 | */ |
1162 | void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr) |
1163 | { |
1164 | struct ice_fdir_fltr *rule, *parent = NULL; |
1165 | |
1166 | list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { |
1167 | /* rule ID found or pass its spot in the list */ |
1168 | if (rule->fltr_id >= fltr->fltr_id) |
1169 | break; |
1170 | parent = rule; |
1171 | } |
1172 | |
1173 | if (parent) |
1174 | list_add(new: &fltr->fltr_node, head: &parent->fltr_node); |
1175 | else |
1176 | list_add(new: &fltr->fltr_node, head: &hw->fdir_list_head); |
1177 | } |
1178 | |
1179 | /** |
1180 | * ice_fdir_update_cntrs - increment / decrement filter counter |
1181 | * @hw: pointer to hardware structure |
1182 | * @flow: filter flow type |
1183 | * @add: true implies filters added |
1184 | */ |
1185 | void |
1186 | ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add) |
1187 | { |
1188 | int incr; |
1189 | |
1190 | incr = add ? 1 : -1; |
1191 | hw->fdir_active_fltr += incr; |
1192 | |
1193 | if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) |
1194 | ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n" , flow); |
1195 | else |
1196 | hw->fdir_fltr_cnt[flow] += incr; |
1197 | } |
1198 | |
1199 | /** |
1200 | * ice_cmp_ipv6_addr - compare 2 IP v6 addresses |
1201 | * @a: IP v6 address |
1202 | * @b: IP v6 address |
1203 | * |
1204 | * Returns 0 on equal, returns non-0 if different |
1205 | */ |
1206 | static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b) |
1207 | { |
1208 | return memcmp(p: a, q: b, size: 4 * sizeof(__be32)); |
1209 | } |
1210 | |
1211 | /** |
1212 | * ice_fdir_comp_rules - compare 2 filters |
1213 | * @a: a Flow Director filter data structure |
1214 | * @b: a Flow Director filter data structure |
1215 | * @v6: bool true if v6 filter |
1216 | * |
1217 | * Returns true if the filters match |
1218 | */ |
1219 | static bool |
1220 | ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6) |
1221 | { |
1222 | enum ice_fltr_ptype flow_type = a->flow_type; |
1223 | |
1224 | /* The calling function already checks that the two filters have the |
1225 | * same flow_type. |
1226 | */ |
1227 | if (!v6) { |
1228 | if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || |
1229 | flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || |
1230 | flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) { |
1231 | if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && |
1232 | a->ip.v4.src_ip == b->ip.v4.src_ip && |
1233 | a->ip.v4.dst_port == b->ip.v4.dst_port && |
1234 | a->ip.v4.src_port == b->ip.v4.src_port) |
1235 | return true; |
1236 | } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { |
1237 | if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && |
1238 | a->ip.v4.src_ip == b->ip.v4.src_ip && |
1239 | a->ip.v4.l4_header == b->ip.v4.l4_header && |
1240 | a->ip.v4.proto == b->ip.v4.proto && |
1241 | a->ip.v4.ip_ver == b->ip.v4.ip_ver && |
1242 | a->ip.v4.tos == b->ip.v4.tos) |
1243 | return true; |
1244 | } |
1245 | } else { |
1246 | if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP || |
1247 | flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP || |
1248 | flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) { |
1249 | if (a->ip.v6.dst_port == b->ip.v6.dst_port && |
1250 | a->ip.v6.src_port == b->ip.v6.src_port && |
1251 | !ice_cmp_ipv6_addr(a: a->ip.v6.dst_ip, |
1252 | b: b->ip.v6.dst_ip) && |
1253 | !ice_cmp_ipv6_addr(a: a->ip.v6.src_ip, |
1254 | b: b->ip.v6.src_ip)) |
1255 | return true; |
1256 | } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { |
1257 | if (a->ip.v6.dst_port == b->ip.v6.dst_port && |
1258 | a->ip.v6.src_port == b->ip.v6.src_port) |
1259 | return true; |
1260 | } |
1261 | } |
1262 | |
1263 | return false; |
1264 | } |
1265 | |
1266 | /** |
1267 | * ice_fdir_is_dup_fltr - test if filter is already in list for PF |
1268 | * @hw: hardware data structure |
1269 | * @input: Flow Director filter data structure |
1270 | * |
1271 | * Returns true if the filter is found in the list |
1272 | */ |
1273 | bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input) |
1274 | { |
1275 | struct ice_fdir_fltr *rule; |
1276 | bool ret = false; |
1277 | |
1278 | list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { |
1279 | enum ice_fltr_ptype flow_type; |
1280 | |
1281 | if (rule->flow_type != input->flow_type) |
1282 | continue; |
1283 | |
1284 | flow_type = input->flow_type; |
1285 | if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || |
1286 | flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || |
1287 | flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP || |
1288 | flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) |
1289 | ret = ice_fdir_comp_rules(a: rule, b: input, v6: false); |
1290 | else |
1291 | ret = ice_fdir_comp_rules(a: rule, b: input, v6: true); |
1292 | if (ret) { |
1293 | if (rule->fltr_id == input->fltr_id && |
1294 | rule->q_index != input->q_index) |
1295 | ret = false; |
1296 | else |
1297 | break; |
1298 | } |
1299 | } |
1300 | |
1301 | return ret; |
1302 | } |
1303 | |