]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
1 | /* SPDX-License-Identifier: BSD-3-Clause |
2 | * Copyright(c) 2020 Intel Corporation | |
3 | */ | |
4 | ||
5 | #include <sys/queue.h> | |
6 | #include <stdio.h> | |
7 | #include <errno.h> | |
8 | #include <stdint.h> | |
9 | #include <string.h> | |
10 | #include <unistd.h> | |
11 | #include <stdarg.h> | |
12 | ||
13 | #include <rte_debug.h> | |
14 | #include <rte_ether.h> | |
15 | #include <rte_ethdev_driver.h> | |
16 | #include <rte_log.h> | |
17 | #include <rte_malloc.h> | |
18 | #include <rte_eth_ctrl.h> | |
19 | #include <rte_tailq.h> | |
20 | #include <rte_flow_driver.h> | |
21 | ||
22 | #include "iavf_log.h" | |
23 | #include "iavf.h" | |
24 | #include "iavf_generic_flow.h" | |
25 | ||
26 | enum iavf_pattern_hint_type { | |
27 | IAVF_PATTERN_HINT_NONE, | |
28 | IAVF_PATTERN_HINT_IPV4, | |
29 | IAVF_PATTERN_HINT_IPV4_UDP, | |
30 | IAVF_PATTERN_HINT_IPV4_TCP, | |
31 | IAVF_PATTERN_HINT_IPV4_SCTP, | |
32 | IAVF_PATTERN_HINT_IPV6, | |
33 | IAVF_PATTERN_HINT_IPV6_UDP, | |
34 | IAVF_PATTERN_HINT_IPV6_TCP, | |
35 | IAVF_PATTERN_HINT_IPV6_SCTP, | |
36 | }; | |
37 | ||
38 | struct iavf_pattern_match_type { | |
39 | enum iavf_pattern_hint_type phint_type; | |
40 | }; | |
41 | ||
42 | struct iavf_hash_match_type { | |
43 | enum iavf_pattern_hint_type phint_type; | |
44 | uint64_t hash_type; | |
45 | struct virtchnl_proto_hdrs *proto_hdrs; | |
46 | }; | |
47 | ||
48 | struct iavf_rss_meta { | |
49 | struct virtchnl_proto_hdrs *proto_hdrs; | |
50 | enum virtchnl_rss_algorithm rss_algorithm; | |
51 | }; | |
52 | ||
53 | struct iavf_hash_flow_cfg { | |
54 | struct virtchnl_rss_cfg *rss_cfg; | |
55 | bool simple_xor; | |
56 | }; | |
57 | ||
58 | static int | |
59 | iavf_hash_init(struct iavf_adapter *ad); | |
60 | static int | |
61 | iavf_hash_create(struct iavf_adapter *ad, struct rte_flow *flow, void *meta, | |
62 | struct rte_flow_error *error); | |
63 | static int | |
64 | iavf_hash_destroy(struct iavf_adapter *ad, struct rte_flow *flow, | |
65 | struct rte_flow_error *error); | |
66 | static void | |
67 | iavf_hash_uninit(struct iavf_adapter *ad); | |
68 | static void | |
69 | iavf_hash_free(struct rte_flow *flow); | |
70 | static int | |
71 | iavf_hash_parse_pattern_action(struct iavf_adapter *ad, | |
72 | struct iavf_pattern_match_item *array, | |
73 | uint32_t array_len, | |
74 | const struct rte_flow_item pattern[], | |
75 | const struct rte_flow_action actions[], | |
76 | void **meta, | |
77 | struct rte_flow_error *error); | |
78 | ||
79 | struct iavf_pattern_match_type phint_empty = { | |
80 | IAVF_PATTERN_HINT_NONE}; | |
81 | struct iavf_pattern_match_type phint_eth_ipv4 = { | |
82 | IAVF_PATTERN_HINT_IPV4}; | |
83 | struct iavf_pattern_match_type phint_eth_ipv4_udp = { | |
84 | IAVF_PATTERN_HINT_IPV4_UDP}; | |
85 | struct iavf_pattern_match_type phint_eth_ipv4_tcp = { | |
86 | IAVF_PATTERN_HINT_IPV4_TCP}; | |
87 | struct iavf_pattern_match_type phint_eth_ipv4_sctp = { | |
88 | IAVF_PATTERN_HINT_IPV4_SCTP}; | |
89 | struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh = { | |
90 | IAVF_PATTERN_HINT_IPV4_UDP}; | |
91 | struct iavf_pattern_match_type phint_eth_ipv4_esp = { | |
92 | IAVF_PATTERN_HINT_IPV4}; | |
93 | struct iavf_pattern_match_type phint_eth_ipv4_ah = { | |
94 | IAVF_PATTERN_HINT_IPV4}; | |
95 | struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = { | |
96 | IAVF_PATTERN_HINT_IPV4}; | |
97 | struct iavf_pattern_match_type phint_eth_ipv4_pfcp = { | |
98 | IAVF_PATTERN_HINT_IPV4_UDP}; | |
99 | struct iavf_pattern_match_type phint_eth_ipv6 = { | |
100 | IAVF_PATTERN_HINT_IPV6}; | |
101 | struct iavf_pattern_match_type phint_eth_ipv6_udp = { | |
102 | IAVF_PATTERN_HINT_IPV6_UDP}; | |
103 | struct iavf_pattern_match_type phint_eth_ipv6_tcp = { | |
104 | IAVF_PATTERN_HINT_IPV6_TCP}; | |
105 | struct iavf_pattern_match_type phint_eth_ipv6_sctp = { | |
106 | IAVF_PATTERN_HINT_IPV6_SCTP}; | |
107 | struct iavf_pattern_match_type phint_eth_ipv6_esp = { | |
108 | IAVF_PATTERN_HINT_IPV6}; | |
109 | struct iavf_pattern_match_type phint_eth_ipv6_ah = { | |
110 | IAVF_PATTERN_HINT_IPV6}; | |
111 | struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = { | |
112 | IAVF_PATTERN_HINT_IPV6}; | |
113 | struct iavf_pattern_match_type phint_eth_ipv6_pfcp = { | |
114 | IAVF_PATTERN_HINT_IPV6_UDP}; | |
115 | ||
116 | /** | |
117 | * Supported pattern for hash. | |
118 | * The first member is pattern item type, | |
119 | * the second member is input set mask, | |
120 | * the third member is pattern hint for hash. | |
121 | */ | |
122 | static struct iavf_pattern_match_item iavf_hash_pattern_list[] = { | |
123 | {iavf_pattern_eth_ipv4, IAVF_INSET_NONE, &phint_eth_ipv4}, | |
124 | {iavf_pattern_eth_ipv4_udp, IAVF_INSET_NONE, &phint_eth_ipv4_udp}, | |
125 | {iavf_pattern_eth_ipv4_tcp, IAVF_INSET_NONE, &phint_eth_ipv4_tcp}, | |
126 | {iavf_pattern_eth_ipv4_sctp, IAVF_INSET_NONE, &phint_eth_ipv4_sctp}, | |
127 | {iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6}, | |
128 | {iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_INSET_NONE, | |
129 | &phint_eth_ipv4_gtpu_eh}, | |
130 | {iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_INSET_NONE, | |
131 | &phint_eth_ipv4_gtpu_eh}, | |
132 | {iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_INSET_NONE, | |
133 | &phint_eth_ipv4_gtpu_eh}, | |
134 | {iavf_pattern_eth_ipv4_esp, IAVF_INSET_NONE, &phint_eth_ipv4_esp}, | |
135 | {iavf_pattern_eth_ipv4_ah, IAVF_INSET_NONE, &phint_eth_ipv4_ah}, | |
136 | {iavf_pattern_eth_ipv4_l2tpv3, IAVF_INSET_NONE, | |
137 | &phint_eth_ipv4_l2tpv3}, | |
138 | {iavf_pattern_eth_ipv4_pfcp, IAVF_INSET_NONE, &phint_eth_ipv4_pfcp}, | |
139 | {iavf_pattern_eth_ipv6_udp, IAVF_INSET_NONE, &phint_eth_ipv6_udp}, | |
140 | {iavf_pattern_eth_ipv6_tcp, IAVF_INSET_NONE, &phint_eth_ipv6_tcp}, | |
141 | {iavf_pattern_eth_ipv6_sctp, IAVF_INSET_NONE, &phint_eth_ipv6_sctp}, | |
142 | {iavf_pattern_eth_ipv6_esp, IAVF_INSET_NONE, &phint_eth_ipv6_esp}, | |
143 | {iavf_pattern_eth_ipv6_ah, IAVF_INSET_NONE, &phint_eth_ipv6_ah}, | |
144 | {iavf_pattern_eth_ipv6_l2tpv3, IAVF_INSET_NONE, | |
145 | &phint_eth_ipv6_l2tpv3}, | |
146 | {iavf_pattern_eth_ipv6_pfcp, IAVF_INSET_NONE, &phint_eth_ipv6_pfcp}, | |
147 | {iavf_pattern_empty, IAVF_INSET_NONE, &phint_empty}, | |
148 | }; | |
149 | ||
150 | #define GTP_EH_PDU_LINK_UP 1 | |
151 | #define GTP_EH_PDU_LINK_DWN 0 | |
152 | ||
153 | #define TUNNEL_LEVEL_OUTER 0 | |
154 | #define TUNNEL_LEVEL_FIRST_INNER 1 | |
155 | ||
156 | #define PROTO_COUNT_ONE 1 | |
157 | #define PROTO_COUNT_TWO 2 | |
158 | #define PROTO_COUNT_THREE 3 | |
159 | ||
160 | #define BUFF_NOUSED 0 | |
161 | #define FIELD_FOR_PROTO_ONLY 0 | |
162 | ||
163 | #define proto_hint_eth_src { \ | |
164 | VIRTCHNL_PROTO_HDR_ETH, VIRTCHNL_PROTO_HDR_ETH_SRC, {BUFF_NOUSED } } | |
165 | ||
166 | #define proto_hint_eth_dst { \ | |
167 | VIRTCHNL_PROTO_HDR_ETH, VIRTCHNL_PROTO_HDR_ETH_DST, {BUFF_NOUSED } } | |
168 | ||
169 | #define proto_hint_eth_only { \ | |
170 | VIRTCHNL_PROTO_HDR_ETH, FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } } | |
171 | ||
172 | #define proto_hint_eth { \ | |
173 | VIRTCHNL_PROTO_HDR_ETH, \ | |
174 | VIRTCHNL_PROTO_HDR_ETH_SRC | VIRTCHNL_PROTO_HDR_ETH_DST, \ | |
175 | {BUFF_NOUSED } } | |
176 | ||
177 | #define proto_hint_svlan { \ | |
178 | VIRTCHNL_PROTO_HDR_S_VLAN, VIRTCHNL_PROTO_HDR_S_VLAN_ID, \ | |
179 | {BUFF_NOUSED } } | |
180 | ||
181 | #define proto_hint_cvlan { \ | |
182 | VIRTCHNL_PROTO_HDR_C_VLAN, VIRTCHNL_PROTO_HDR_C_VLAN_ID, \ | |
183 | {BUFF_NOUSED } } | |
184 | ||
185 | #define proto_hint_ipv4_src { \ | |
186 | VIRTCHNL_PROTO_HDR_IPV4, VIRTCHNL_PROTO_HDR_IPV4_SRC, {BUFF_NOUSED } } | |
187 | ||
188 | #define proto_hint_ipv4_dst { \ | |
189 | VIRTCHNL_PROTO_HDR_IPV4, VIRTCHNL_PROTO_HDR_IPV4_DST, {BUFF_NOUSED } } | |
190 | ||
191 | #define proto_hint_ipv4_only { \ | |
192 | VIRTCHNL_PROTO_HDR_IPV4, FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } } | |
193 | ||
194 | #define proto_hint_ipv4 { \ | |
195 | VIRTCHNL_PROTO_HDR_IPV4, \ | |
196 | VIRTCHNL_PROTO_HDR_IPV4_SRC | VIRTCHNL_PROTO_HDR_IPV4_DST, \ | |
197 | {BUFF_NOUSED } } | |
198 | ||
199 | #define proto_hint_udp_src_port { \ | |
200 | VIRTCHNL_PROTO_HDR_UDP, VIRTCHNL_PROTO_HDR_UDP_SRC_PORT, \ | |
201 | {BUFF_NOUSED } } | |
202 | ||
203 | #define proto_hint_udp_dst_port { \ | |
204 | VIRTCHNL_PROTO_HDR_UDP, VIRTCHNL_PROTO_HDR_UDP_DST_PORT, \ | |
205 | {BUFF_NOUSED } } | |
206 | ||
207 | #define proto_hint_udp_only { \ | |
208 | VIRTCHNL_PROTO_HDR_UDP, FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } } | |
209 | ||
210 | #define proto_hint_udp { \ | |
211 | VIRTCHNL_PROTO_HDR_UDP, \ | |
212 | VIRTCHNL_PROTO_HDR_UDP_SRC_PORT | VIRTCHNL_PROTO_HDR_UDP_DST_PORT, \ | |
213 | {BUFF_NOUSED } } | |
214 | ||
215 | #define proto_hint_tcp_src_port { \ | |
216 | VIRTCHNL_PROTO_HDR_TCP, VIRTCHNL_PROTO_HDR_TCP_SRC_PORT, \ | |
217 | {BUFF_NOUSED } } | |
218 | ||
219 | #define proto_hint_tcp_dst_port { \ | |
220 | VIRTCHNL_PROTO_HDR_TCP, VIRTCHNL_PROTO_HDR_TCP_DST_PORT, \ | |
221 | {BUFF_NOUSED } } | |
222 | ||
223 | #define proto_hint_tcp_only { \ | |
224 | VIRTCHNL_PROTO_HDR_TCP, FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } } | |
225 | ||
226 | #define proto_hint_tcp { \ | |
227 | VIRTCHNL_PROTO_HDR_TCP, \ | |
228 | VIRTCHNL_PROTO_HDR_TCP_SRC_PORT | VIRTCHNL_PROTO_HDR_TCP_DST_PORT, \ | |
229 | {BUFF_NOUSED } } | |
230 | ||
231 | #define proto_hint_sctp_src_port { \ | |
232 | VIRTCHNL_PROTO_HDR_SCTP, VIRTCHNL_PROTO_HDR_SCTP_SRC_PORT, \ | |
233 | {BUFF_NOUSED } } | |
234 | ||
235 | #define proto_hint_sctp_dst_port { \ | |
236 | VIRTCHNL_PROTO_HDR_SCTP, VIRTCHNL_PROTO_HDR_SCTP_DST_PORT, \ | |
237 | {BUFF_NOUSED } } | |
238 | ||
239 | #define proto_hint_sctp_only { \ | |
240 | VIRTCHNL_PROTO_HDR_SCTP, FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } } | |
241 | ||
242 | #define proto_hint_sctp { \ | |
243 | VIRTCHNL_PROTO_HDR_SCTP, \ | |
244 | VIRTCHNL_PROTO_HDR_SCTP_SRC_PORT | VIRTCHNL_PROTO_HDR_SCTP_DST_PORT, \ | |
245 | {BUFF_NOUSED } } | |
246 | ||
247 | #define proto_hint_ipv6_src { \ | |
248 | VIRTCHNL_PROTO_HDR_IPV6, VIRTCHNL_PROTO_HDR_IPV6_SRC, {BUFF_NOUSED } } | |
249 | ||
250 | #define proto_hint_ipv6_dst { \ | |
251 | VIRTCHNL_PROTO_HDR_IPV6, VIRTCHNL_PROTO_HDR_IPV6_DST, {BUFF_NOUSED } } | |
252 | ||
253 | #define proto_hint_ipv6_only { \ | |
254 | VIRTCHNL_PROTO_HDR_IPV6, FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } } | |
255 | ||
256 | #define proto_hint_ipv6 { \ | |
257 | VIRTCHNL_PROTO_HDR_IPV6, \ | |
258 | VIRTCHNL_PROTO_HDR_IPV6_SRC | VIRTCHNL_PROTO_HDR_IPV6_DST, \ | |
259 | {BUFF_NOUSED } } | |
260 | ||
261 | #define proto_hint_gtpu_up_only { \ | |
262 | VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP, \ | |
263 | FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } } | |
264 | ||
265 | #define proto_hint_gtpu_dwn_only { \ | |
266 | VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_DWN, \ | |
267 | FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } } | |
268 | ||
269 | #define proto_hint_esp { \ | |
270 | VIRTCHNL_PROTO_HDR_ESP, \ | |
271 | VIRTCHNL_PROTO_HDR_ESP_SPI, {BUFF_NOUSED } } | |
272 | ||
273 | #define proto_hint_ah { \ | |
274 | VIRTCHNL_PROTO_HDR_AH, \ | |
275 | VIRTCHNL_PROTO_HDR_AH_SPI, {BUFF_NOUSED } } | |
276 | ||
277 | #define proto_hint_l2tpv3 { \ | |
278 | VIRTCHNL_PROTO_HDR_L2TPV3, \ | |
279 | VIRTCHNL_PROTO_HDR_L2TPV3_SESS_ID, {BUFF_NOUSED } } | |
280 | ||
281 | #define proto_hint_pfcp { \ | |
282 | VIRTCHNL_PROTO_HDR_PFCP, VIRTCHNL_PROTO_HDR_PFCP_SEID, {BUFF_NOUSED } } | |
283 | ||
284 | struct virtchnl_proto_hdrs hdrs_hint_eth_src = { | |
285 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth_src } | |
286 | }; | |
287 | ||
288 | struct virtchnl_proto_hdrs hdrs_hint_eth_dst = { | |
289 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth_dst } | |
290 | }; | |
291 | ||
292 | struct virtchnl_proto_hdrs hdrs_hint_eth = { | |
293 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth } | |
294 | }; | |
295 | ||
296 | struct virtchnl_proto_hdrs hdrs_hint_svlan = { | |
297 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_svlan } | |
298 | }; | |
299 | ||
300 | struct virtchnl_proto_hdrs hdrs_hint_cvlan = { | |
301 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_cvlan } | |
302 | }; | |
303 | ||
304 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_src = { | |
305 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_src } | |
306 | }; | |
307 | ||
308 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst = { | |
309 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_dst } | |
310 | }; | |
311 | ||
312 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = { | |
313 | TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only, | |
314 | proto_hint_ipv4_src } | |
315 | }; | |
316 | ||
317 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = { | |
318 | TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only, | |
319 | proto_hint_ipv4_dst } | |
320 | }; | |
321 | ||
322 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = { | |
323 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only, | |
324 | proto_hint_esp } | |
325 | }; | |
326 | ||
327 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = { | |
328 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only, | |
329 | proto_hint_ah } | |
330 | }; | |
331 | ||
332 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = { | |
333 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only, | |
334 | proto_hint_l2tpv3 } | |
335 | }; | |
336 | ||
337 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = { | |
338 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only, | |
339 | proto_hint_pfcp } | |
340 | }; | |
341 | ||
342 | struct virtchnl_proto_hdrs hdrs_hint_ipv4 = { | |
343 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4 } | |
344 | }; | |
345 | ||
346 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_port = { | |
347 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src, | |
348 | proto_hint_udp_src_port } | |
349 | }; | |
350 | ||
351 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_port = { | |
352 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src, | |
353 | proto_hint_udp_dst_port } | |
354 | }; | |
355 | ||
356 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_port = { | |
357 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst, | |
358 | proto_hint_udp_src_port } | |
359 | }; | |
360 | ||
361 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_port = { | |
362 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst, | |
363 | proto_hint_udp_dst_port } | |
364 | }; | |
365 | ||
366 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_port = { | |
367 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only, | |
368 | proto_hint_udp_src_port } | |
369 | }; | |
370 | ||
371 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_port = { | |
372 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only, | |
373 | proto_hint_udp_dst_port } | |
374 | }; | |
375 | ||
376 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp = { | |
377 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4, | |
378 | proto_hint_udp } | |
379 | }; | |
380 | ||
381 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_port = { | |
382 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src, | |
383 | proto_hint_tcp_src_port } | |
384 | }; | |
385 | ||
386 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_port = { | |
387 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src, | |
388 | proto_hint_tcp_dst_port } | |
389 | }; | |
390 | ||
391 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_port = { | |
392 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst, | |
393 | proto_hint_tcp_src_port } | |
394 | }; | |
395 | ||
396 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_port = { | |
397 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst, | |
398 | proto_hint_tcp_dst_port } | |
399 | }; | |
400 | ||
401 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_port = { | |
402 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only, | |
403 | proto_hint_tcp_src_port } | |
404 | }; | |
405 | ||
406 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_port = { | |
407 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only, | |
408 | proto_hint_tcp_dst_port } | |
409 | }; | |
410 | ||
411 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp = { | |
412 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4, | |
413 | proto_hint_tcp } | |
414 | }; | |
415 | ||
416 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_sctp_src_port = { | |
417 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src, | |
418 | proto_hint_sctp_src_port } | |
419 | }; | |
420 | ||
421 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_sctp_dst_port = { | |
422 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src, | |
423 | proto_hint_sctp_dst_port } | |
424 | }; | |
425 | ||
426 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_sctp_src_port = { | |
427 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst, | |
428 | proto_hint_sctp_src_port } | |
429 | }; | |
430 | ||
431 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_sctp_dst_port = { | |
432 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst, | |
433 | proto_hint_sctp_dst_port } | |
434 | }; | |
435 | ||
436 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_sctp_src_port = { | |
437 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only, | |
438 | proto_hint_sctp_src_port } | |
439 | }; | |
440 | ||
441 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_sctp_dst_port = { | |
442 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only, | |
443 | proto_hint_sctp_dst_port } | |
444 | }; | |
445 | ||
446 | struct virtchnl_proto_hdrs hdrs_hint_ipv4_sctp = { | |
447 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4, | |
448 | proto_hint_sctp } | |
449 | }; | |
450 | ||
451 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = { | |
452 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src } | |
453 | }; | |
454 | ||
455 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = { | |
456 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst } | |
457 | }; | |
458 | ||
459 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = { | |
460 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only, | |
461 | proto_hint_esp } | |
462 | }; | |
463 | ||
464 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = { | |
465 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only, | |
466 | proto_hint_ah } | |
467 | }; | |
468 | ||
469 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = { | |
470 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only, | |
471 | proto_hint_l2tpv3 } | |
472 | }; | |
473 | ||
474 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = { | |
475 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only, | |
476 | proto_hint_pfcp } | |
477 | }; | |
478 | ||
479 | struct virtchnl_proto_hdrs hdrs_hint_ipv6 = { | |
480 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6 } | |
481 | }; | |
482 | ||
483 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_src_port = { | |
484 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src, | |
485 | proto_hint_udp_src_port } | |
486 | }; | |
487 | ||
488 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_dst_port = { | |
489 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src, | |
490 | proto_hint_udp_dst_port } | |
491 | }; | |
492 | ||
493 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_src_port = { | |
494 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst, | |
495 | proto_hint_udp_src_port } | |
496 | }; | |
497 | ||
498 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_dst_port = { | |
499 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst, | |
500 | proto_hint_udp_dst_port } | |
501 | }; | |
502 | ||
503 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_src_port = { | |
504 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only, | |
505 | proto_hint_udp_src_port } | |
506 | }; | |
507 | ||
508 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_dst_port = { | |
509 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only, | |
510 | proto_hint_udp_dst_port } | |
511 | }; | |
512 | ||
513 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp = { | |
514 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6, | |
515 | proto_hint_udp } | |
516 | }; | |
517 | ||
518 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_src_port = { | |
519 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src, | |
520 | proto_hint_tcp_src_port } | |
521 | }; | |
522 | ||
523 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_dst_port = { | |
524 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src, | |
525 | proto_hint_tcp_dst_port } | |
526 | }; | |
527 | ||
528 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_src_port = { | |
529 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst, | |
530 | proto_hint_tcp_src_port } | |
531 | }; | |
532 | ||
533 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_dst_port = { | |
534 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst, | |
535 | proto_hint_tcp_dst_port } | |
536 | }; | |
537 | ||
538 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_src_port = { | |
539 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only, | |
540 | proto_hint_tcp_src_port } | |
541 | }; | |
542 | ||
543 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_dst_port = { | |
544 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only, | |
545 | proto_hint_tcp_dst_port } | |
546 | }; | |
547 | ||
548 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp = { | |
549 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6, | |
550 | proto_hint_tcp } | |
551 | }; | |
552 | ||
553 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_sctp_src_port = { | |
554 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src, | |
555 | proto_hint_sctp_src_port } | |
556 | }; | |
557 | ||
558 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_sctp_dst_port = { | |
559 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src, | |
560 | proto_hint_sctp_dst_port } | |
561 | }; | |
562 | ||
563 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_sctp_src_port = { | |
564 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst, | |
565 | proto_hint_sctp_src_port } | |
566 | }; | |
567 | ||
568 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_sctp_dst_port = { | |
569 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst, | |
570 | proto_hint_sctp_dst_port } | |
571 | }; | |
572 | ||
573 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_src_port = { | |
574 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only, | |
575 | proto_hint_sctp_src_port } | |
576 | }; | |
577 | ||
578 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_dst_port = { | |
579 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only, | |
580 | proto_hint_sctp_dst_port } | |
581 | }; | |
582 | ||
583 | struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp = { | |
584 | TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6, | |
585 | proto_hint_sctp } | |
586 | }; | |
587 | ||
588 | /** | |
589 | * The first member is pattern hint type, | |
590 | * the second member is hash type, | |
591 | * the third member is virtchnl protocol hdrs. | |
592 | */ | |
593 | struct iavf_hash_match_type iavf_hash_type_list[] = { | |
594 | /* IPV4 */ | |
595 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_SRC_ONLY, &hdrs_hint_eth_src}, | |
596 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_DST_ONLY, &hdrs_hint_eth_dst}, | |
597 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY, | |
598 | &hdrs_hint_eth_src}, | |
599 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY, | |
600 | &hdrs_hint_eth_dst}, | |
601 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH, &hdrs_hint_eth}, | |
602 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_S_VLAN, &hdrs_hint_svlan}, | |
603 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN, &hdrs_hint_cvlan}, | |
604 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src}, | |
605 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst}, | |
606 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY, | |
607 | &hdrs_hint_ipv4_src}, | |
608 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY, | |
609 | &hdrs_hint_ipv4_dst}, | |
610 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_ESP, &hdrs_hint_ipv4_esp}, | |
611 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_AH, &hdrs_hint_ipv4_ah}, | |
612 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2TPV3, &hdrs_hint_ipv4_l2tpv3}, | |
613 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4, &hdrs_hint_ipv4}, | |
614 | /* IPV4 UDP */ | |
615 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, | |
616 | &hdrs_hint_ipv4_src_udp_src_port}, | |
617 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, | |
618 | &hdrs_hint_ipv4_src_udp_dst_port}, | |
619 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU, | |
620 | &hdrs_hint_ipv4_src_gtpu_up}, | |
621 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY, | |
622 | &hdrs_hint_ipv4_src}, | |
623 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, | |
624 | &hdrs_hint_ipv4_dst_udp_src_port}, | |
625 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, | |
626 | &hdrs_hint_ipv4_dst_udp_dst_port}, | |
627 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU, | |
628 | &hdrs_hint_ipv4_dst_gtpu_dwn}, | |
629 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY, | |
630 | &hdrs_hint_ipv4_dst}, | |
631 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP | | |
632 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, | |
633 | &hdrs_hint_ipv4_src_udp_src_port}, | |
634 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP | | |
635 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, | |
636 | &hdrs_hint_ipv4_src_udp_dst_port}, | |
637 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP | | |
638 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU, | |
639 | &hdrs_hint_ipv4_src_gtpu_up}, | |
640 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP | | |
641 | ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src}, | |
642 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP | | |
643 | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, | |
644 | &hdrs_hint_ipv4_dst_udp_src_port}, | |
645 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP | | |
646 | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, | |
647 | &hdrs_hint_ipv4_dst_udp_dst_port}, | |
648 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP | | |
649 | ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU, | |
650 | &hdrs_hint_ipv4_dst_gtpu_dwn}, | |
651 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP | | |
652 | ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst}, | |
653 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_SRC_ONLY, | |
654 | &hdrs_hint_ipv4_udp_src_port}, | |
655 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_DST_ONLY, | |
656 | &hdrs_hint_ipv4_udp_dst_port}, | |
657 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_PFCP, | |
658 | &hdrs_hint_ipv4_pfcp}, | |
659 | {IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP, | |
660 | &hdrs_hint_ipv4_udp}, | |
661 | /* IPV4 TCP */ | |
662 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, | |
663 | &hdrs_hint_ipv4_src_tcp_src_port}, | |
664 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, | |
665 | &hdrs_hint_ipv4_src_tcp_dst_port}, | |
666 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY, | |
667 | &hdrs_hint_ipv4_src}, | |
668 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, | |
669 | &hdrs_hint_ipv4_dst_tcp_src_port}, | |
670 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, | |
671 | &hdrs_hint_ipv4_dst_tcp_dst_port}, | |
672 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY, | |
673 | &hdrs_hint_ipv4_dst}, | |
674 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP | | |
675 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, | |
676 | &hdrs_hint_ipv4_src_tcp_src_port}, | |
677 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP | | |
678 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, | |
679 | &hdrs_hint_ipv4_src_tcp_dst_port}, | |
680 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP | | |
681 | ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src}, | |
682 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP | | |
683 | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, | |
684 | &hdrs_hint_ipv4_dst_tcp_src_port}, | |
685 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP | | |
686 | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, | |
687 | &hdrs_hint_ipv4_dst_tcp_dst_port}, | |
688 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP | | |
689 | ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst}, | |
690 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_SRC_ONLY, | |
691 | &hdrs_hint_ipv4_tcp_src_port}, | |
692 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_DST_ONLY, | |
693 | &hdrs_hint_ipv4_tcp_dst_port}, | |
694 | {IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP, | |
695 | &hdrs_hint_ipv4_tcp}, | |
696 | /* IPV4 SCTP */ | |
697 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, | |
698 | &hdrs_hint_ipv4_src_sctp_src_port}, | |
699 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, | |
700 | &hdrs_hint_ipv4_src_sctp_dst_port}, | |
701 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY, | |
702 | &hdrs_hint_ipv4_src}, | |
703 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, | |
704 | &hdrs_hint_ipv4_dst_sctp_src_port}, | |
705 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, | |
706 | &hdrs_hint_ipv4_dst_sctp_dst_port}, | |
707 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY, | |
708 | &hdrs_hint_ipv4_dst}, | |
709 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP | | |
710 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, | |
711 | &hdrs_hint_ipv4_src_sctp_src_port}, | |
712 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP | | |
713 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, | |
714 | &hdrs_hint_ipv4_src_sctp_dst_port}, | |
715 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP | | |
716 | ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src}, | |
717 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP | | |
718 | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, | |
719 | &hdrs_hint_ipv4_dst_sctp_src_port}, | |
720 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP | | |
721 | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, | |
722 | &hdrs_hint_ipv4_dst_sctp_dst_port}, | |
723 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP | | |
724 | ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst}, | |
725 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_SRC_ONLY, | |
726 | &hdrs_hint_ipv4_sctp_src_port}, | |
727 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_DST_ONLY, | |
728 | &hdrs_hint_ipv4_sctp_dst_port}, | |
729 | {IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP, | |
730 | &hdrs_hint_ipv4_sctp}, | |
731 | /* IPV6 */ | |
732 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_SRC_ONLY, &hdrs_hint_eth_src}, | |
733 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_DST_ONLY, &hdrs_hint_eth_dst}, | |
734 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_SRC_ONLY, | |
735 | &hdrs_hint_eth_src}, | |
736 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_DST_ONLY, | |
737 | &hdrs_hint_eth_dst}, | |
738 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_ETH, &hdrs_hint_eth}, | |
739 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_S_VLAN, &hdrs_hint_svlan}, | |
740 | {IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN, &hdrs_hint_cvlan}, | |
741 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src}, | |
742 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst}, | |
743 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY, | |
744 | &hdrs_hint_ipv6_src}, | |
745 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY, | |
746 | &hdrs_hint_ipv6_dst}, | |
747 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_ESP, &hdrs_hint_ipv6_esp}, | |
748 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_AH, &hdrs_hint_ipv6_ah}, | |
749 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2TPV3, &hdrs_hint_ipv6_l2tpv3}, | |
750 | {IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6, &hdrs_hint_ipv6}, | |
751 | /* IPV6 UDP */ | |
752 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, | |
753 | &hdrs_hint_ipv6_src_udp_src_port}, | |
754 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, | |
755 | &hdrs_hint_ipv6_src_udp_dst_port}, | |
756 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY, | |
757 | &hdrs_hint_ipv6_src}, | |
758 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, | |
759 | &hdrs_hint_ipv6_dst_udp_src_port}, | |
760 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, | |
761 | &hdrs_hint_ipv6_dst_udp_dst_port}, | |
762 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY, | |
763 | &hdrs_hint_ipv6_dst}, | |
764 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP | | |
765 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, | |
766 | &hdrs_hint_ipv6_src_udp_src_port}, | |
767 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP | | |
768 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, | |
769 | &hdrs_hint_ipv6_src_udp_dst_port}, | |
770 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP | | |
771 | ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src}, | |
772 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP | | |
773 | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, | |
774 | &hdrs_hint_ipv6_dst_udp_src_port}, | |
775 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP | | |
776 | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, | |
777 | &hdrs_hint_ipv6_dst_udp_dst_port}, | |
778 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP | | |
779 | ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst}, | |
780 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_SRC_ONLY, | |
781 | &hdrs_hint_ipv6_udp_src_port}, | |
782 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_DST_ONLY, | |
783 | &hdrs_hint_ipv6_udp_dst_port}, | |
784 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_PFCP, | |
785 | &hdrs_hint_ipv6_pfcp}, | |
786 | {IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP, | |
787 | &hdrs_hint_ipv6_udp}, | |
788 | /* IPV6 TCP */ | |
789 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, | |
790 | &hdrs_hint_ipv6_src_tcp_src_port}, | |
791 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, | |
792 | &hdrs_hint_ipv6_src_tcp_dst_port}, | |
793 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY, | |
794 | &hdrs_hint_ipv6_src}, | |
795 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, | |
796 | &hdrs_hint_ipv6_dst_tcp_src_port}, | |
797 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, | |
798 | &hdrs_hint_ipv6_dst_tcp_dst_port}, | |
799 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY, | |
800 | &hdrs_hint_ipv6_dst}, | |
801 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP | | |
802 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, | |
803 | &hdrs_hint_ipv6_src_tcp_src_port}, | |
804 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP | | |
805 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, | |
806 | &hdrs_hint_ipv6_src_tcp_dst_port}, | |
807 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP | | |
808 | ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src}, | |
809 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP | | |
810 | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, | |
811 | &hdrs_hint_ipv6_dst_tcp_src_port}, | |
812 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP | | |
813 | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, | |
814 | &hdrs_hint_ipv6_dst_tcp_dst_port}, | |
815 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP | | |
816 | ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst}, | |
817 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_SRC_ONLY, | |
818 | &hdrs_hint_ipv6_tcp_src_port}, | |
819 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_DST_ONLY, | |
820 | &hdrs_hint_ipv6_tcp_dst_port}, | |
821 | {IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP, | |
822 | &hdrs_hint_ipv6_tcp}, | |
823 | /* IPV6 SCTP */ | |
824 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, | |
825 | &hdrs_hint_ipv6_src_sctp_src_port}, | |
826 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, | |
827 | &hdrs_hint_ipv6_src_sctp_dst_port}, | |
828 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY, | |
829 | &hdrs_hint_ipv6_src}, | |
830 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, | |
831 | &hdrs_hint_ipv6_dst_sctp_src_port}, | |
832 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, | |
833 | &hdrs_hint_ipv6_dst_sctp_dst_port}, | |
834 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY, | |
835 | &hdrs_hint_ipv6_dst}, | |
836 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP | | |
837 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, | |
838 | &hdrs_hint_ipv6_src_sctp_src_port}, | |
839 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP | | |
840 | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, | |
841 | &hdrs_hint_ipv6_src_sctp_dst_port}, | |
842 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP | | |
843 | ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src}, | |
844 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP | | |
845 | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, | |
846 | &hdrs_hint_ipv6_dst_sctp_src_port}, | |
847 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP | | |
848 | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, | |
849 | &hdrs_hint_ipv6_dst_sctp_dst_port}, | |
850 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP | | |
851 | ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst}, | |
852 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_SRC_ONLY, | |
853 | &hdrs_hint_ipv6_sctp_src_port}, | |
854 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_DST_ONLY, | |
855 | &hdrs_hint_ipv6_sctp_dst_port}, | |
856 | {IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP, | |
857 | &hdrs_hint_ipv6_sctp}, | |
858 | }; | |
859 | ||
860 | struct virtchnl_proto_hdrs *iavf_hash_default_hdrs[] = { | |
861 | &hdrs_hint_ipv4, | |
862 | &hdrs_hint_ipv4_udp, | |
863 | &hdrs_hint_ipv4_tcp, | |
864 | &hdrs_hint_ipv4_sctp, | |
865 | &hdrs_hint_ipv6, | |
866 | &hdrs_hint_ipv6_udp, | |
867 | &hdrs_hint_ipv6_tcp, | |
868 | &hdrs_hint_ipv6_sctp, | |
869 | }; | |
870 | ||
871 | static struct iavf_flow_engine iavf_hash_engine = { | |
872 | .init = iavf_hash_init, | |
873 | .create = iavf_hash_create, | |
874 | .destroy = iavf_hash_destroy, | |
875 | .uninit = iavf_hash_uninit, | |
876 | .free = iavf_hash_free, | |
877 | .type = IAVF_FLOW_ENGINE_HASH, | |
878 | }; | |
879 | ||
880 | /* Register parser for comms package. */ | |
881 | static struct iavf_flow_parser iavf_hash_parser = { | |
882 | .engine = &iavf_hash_engine, | |
883 | .array = iavf_hash_pattern_list, | |
884 | .array_len = RTE_DIM(iavf_hash_pattern_list), | |
885 | .parse_pattern_action = iavf_hash_parse_pattern_action, | |
886 | .stage = IAVF_FLOW_STAGE_RSS, | |
887 | }; | |
888 | ||
889 | static int | |
890 | iavf_hash_default_set(struct iavf_adapter *ad, bool add) | |
891 | { | |
892 | struct virtchnl_rss_cfg *rss_cfg; | |
893 | uint16_t i; | |
894 | int ret; | |
895 | ||
896 | rss_cfg = rte_zmalloc("iavf rss rule", | |
897 | sizeof(struct virtchnl_rss_cfg), 0); | |
898 | if (!rss_cfg) | |
899 | return -ENOMEM; | |
900 | ||
901 | for (i = 0; i < RTE_DIM(iavf_hash_default_hdrs); i++) { | |
902 | rss_cfg->proto_hdrs = *iavf_hash_default_hdrs[i]; | |
903 | rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; | |
904 | ||
905 | ret = iavf_add_del_rss_cfg(ad, rss_cfg, add); | |
906 | if (ret) { | |
907 | PMD_DRV_LOG(ERR, "fail to %s RSS configure", | |
908 | add ? "add" : "delete"); | |
909 | rte_free(rss_cfg); | |
910 | return ret; | |
911 | } | |
912 | } | |
913 | ||
914 | return ret; | |
915 | } | |
916 | ||
917 | RTE_INIT(iavf_hash_engine_init) | |
918 | { | |
919 | struct iavf_flow_engine *engine = &iavf_hash_engine; | |
920 | ||
921 | iavf_register_flow_engine(engine); | |
922 | } | |
923 | ||
924 | static int | |
925 | iavf_hash_init(struct iavf_adapter *ad) | |
926 | { | |
927 | struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad); | |
928 | struct iavf_flow_parser *parser; | |
929 | int ret; | |
930 | ||
931 | if (!vf->vf_res) | |
932 | return -EINVAL; | |
933 | ||
934 | if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF)) | |
935 | return -ENOTSUP; | |
936 | ||
937 | parser = &iavf_hash_parser; | |
938 | ||
939 | ret = iavf_register_parser(parser, ad); | |
940 | if (ret) { | |
941 | PMD_DRV_LOG(ERR, "fail to register hash parser"); | |
942 | return ret; | |
943 | } | |
944 | ||
945 | ret = iavf_hash_default_set(ad, true); | |
946 | if (ret) { | |
947 | PMD_DRV_LOG(ERR, "fail to set default RSS"); | |
948 | iavf_unregister_parser(parser, ad); | |
949 | } | |
950 | ||
951 | return ret; | |
952 | } | |
953 | ||
954 | static int | |
955 | iavf_hash_check_inset(const struct rte_flow_item pattern[], | |
956 | struct rte_flow_error *error) | |
957 | { | |
958 | const struct rte_flow_item *item = pattern; | |
959 | ||
960 | for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) { | |
961 | if (item->last) { | |
962 | rte_flow_error_set(error, EINVAL, | |
963 | RTE_FLOW_ERROR_TYPE_ITEM, item, | |
964 | "Not support range"); | |
965 | return -rte_errno; | |
966 | } | |
967 | } | |
968 | ||
969 | return 0; | |
970 | } | |
971 | ||
972 | static uint64_t | |
973 | iavf_hash_refine_type(uint64_t rss_type, const struct rte_flow_item pattern[]) | |
974 | { | |
975 | const struct rte_flow_item *item; | |
976 | ||
977 | for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) { | |
978 | if (item->type == RTE_FLOW_ITEM_TYPE_GTP_PSC) { | |
979 | const struct rte_flow_item_gtp_psc *psc = item->spec; | |
980 | ||
981 | if (psc && (psc->pdu_type == GTP_EH_PDU_LINK_UP || | |
982 | psc->pdu_type == GTP_EH_PDU_LINK_DWN)) { | |
983 | rss_type |= ETH_RSS_GTPU; | |
984 | } | |
985 | } | |
986 | } | |
987 | ||
988 | return rss_type; | |
989 | } | |
990 | ||
991 | static int | |
992 | iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item, | |
993 | const struct rte_flow_item pattern[], | |
994 | const struct rte_flow_action actions[], | |
995 | void **meta, struct rte_flow_error *error) | |
996 | { | |
997 | struct iavf_rss_meta *rss_meta = (struct iavf_rss_meta *)*meta; | |
998 | uint32_t type_list_len = RTE_DIM(iavf_hash_type_list); | |
999 | struct iavf_hash_match_type *type_match_item; | |
1000 | enum rte_flow_action_type action_type; | |
1001 | const struct rte_flow_action_rss *rss; | |
1002 | const struct rte_flow_action *action; | |
1003 | bool item_found = false; | |
1004 | uint64_t rss_type; | |
1005 | uint16_t i; | |
1006 | ||
1007 | struct iavf_pattern_match_type *tt = (struct iavf_pattern_match_type *) | |
1008 | (pattern_match_item->meta); | |
1009 | ||
1010 | /* Supported action is RSS. */ | |
1011 | for (action = actions; action->type != | |
1012 | RTE_FLOW_ACTION_TYPE_END; action++) { | |
1013 | action_type = action->type; | |
1014 | switch (action_type) { | |
1015 | case RTE_FLOW_ACTION_TYPE_RSS: | |
1016 | rss = action->conf; | |
1017 | rss_type = rss->types; | |
1018 | ||
1019 | /** | |
1020 | * Check simultaneous use of SRC_ONLY and DST_ONLY | |
1021 | * of the same level. | |
1022 | */ | |
1023 | rss_type = rte_eth_rss_hf_refine(rss_type); | |
1024 | ||
1025 | /** | |
1026 | * Refine the hash type base on some specific item of | |
1027 | * the pattern, such as identify the gtpu hash. | |
1028 | */ | |
1029 | rss_type = iavf_hash_refine_type(rss_type, pattern); | |
1030 | ||
1031 | /* Check if pattern is empty. */ | |
1032 | if (pattern_match_item->pattern_list != | |
1033 | iavf_pattern_empty && rss->func == | |
1034 | RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) | |
1035 | return rte_flow_error_set(error, ENOTSUP, | |
1036 | RTE_FLOW_ERROR_TYPE_ACTION, action, | |
1037 | "Not supported flow"); | |
1038 | ||
1039 | if (rss->level) | |
1040 | return rte_flow_error_set(error, ENOTSUP, | |
1041 | RTE_FLOW_ERROR_TYPE_ACTION, action, | |
1042 | "a nonzero RSS encapsulation level is not supported"); | |
1043 | ||
1044 | if (rss->key_len) | |
1045 | return rte_flow_error_set(error, ENOTSUP, | |
1046 | RTE_FLOW_ERROR_TYPE_ACTION, action, | |
1047 | "a nonzero RSS key_len is not supported"); | |
1048 | ||
1049 | if (rss->queue_num) | |
1050 | return rte_flow_error_set(error, ENOTSUP, | |
1051 | RTE_FLOW_ERROR_TYPE_ACTION, action, | |
1052 | "a non-NULL RSS queue is not supported"); | |
1053 | ||
1054 | /* Check hash function and save it to rss_meta. */ | |
1055 | if (rss->func == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) | |
1056 | rss_meta->rss_algorithm = | |
1057 | VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC; | |
1058 | else if (rss->func == | |
1059 | RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) | |
1060 | rss_meta->rss_algorithm = | |
1061 | VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC; | |
1062 | else | |
1063 | rss_meta->rss_algorithm = | |
1064 | VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; | |
1065 | ||
1066 | type_match_item = | |
1067 | rte_zmalloc("iavf_type_match_item", | |
1068 | sizeof(struct iavf_hash_match_type), 0); | |
1069 | if (!type_match_item) { | |
1070 | rte_flow_error_set(error, EINVAL, | |
1071 | RTE_FLOW_ERROR_TYPE_HANDLE, | |
1072 | NULL, | |
1073 | "No memory for type_match_item"); | |
1074 | return -ENOMEM; | |
1075 | } | |
1076 | ||
1077 | /* Find matched proto hdrs according to hash type. */ | |
1078 | for (i = 0; i < type_list_len; i++) { | |
1079 | struct iavf_hash_match_type *ht_map = | |
1080 | &iavf_hash_type_list[i]; | |
1081 | if (rss_type == ht_map->hash_type && | |
1082 | tt->phint_type == ht_map->phint_type) { | |
1083 | type_match_item->hash_type = | |
1084 | ht_map->hash_type; | |
1085 | type_match_item->proto_hdrs = | |
1086 | ht_map->proto_hdrs; | |
1087 | rss_meta->proto_hdrs = | |
1088 | type_match_item->proto_hdrs; | |
1089 | item_found = true; | |
1090 | } | |
1091 | } | |
1092 | ||
1093 | rte_free(type_match_item); | |
1094 | ||
1095 | if (!item_found) | |
1096 | return rte_flow_error_set(error, ENOTSUP, | |
1097 | RTE_FLOW_ERROR_TYPE_ACTION, action, | |
1098 | "Not supported flow"); | |
1099 | break; | |
1100 | ||
1101 | case RTE_FLOW_ACTION_TYPE_END: | |
1102 | break; | |
1103 | ||
1104 | default: | |
1105 | rte_flow_error_set(error, EINVAL, | |
1106 | RTE_FLOW_ERROR_TYPE_ACTION, action, | |
1107 | "Invalid action."); | |
1108 | return -rte_errno; | |
1109 | } | |
1110 | } | |
1111 | ||
1112 | return 0; | |
1113 | } | |
1114 | ||
1115 | static int | |
1116 | iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad, | |
1117 | struct iavf_pattern_match_item *array, | |
1118 | uint32_t array_len, | |
1119 | const struct rte_flow_item pattern[], | |
1120 | const struct rte_flow_action actions[], | |
1121 | void **meta, | |
1122 | struct rte_flow_error *error) | |
1123 | { | |
1124 | struct iavf_pattern_match_item *pattern_match_item; | |
1125 | struct iavf_rss_meta *rss_meta_ptr; | |
1126 | int ret = 0; | |
1127 | ||
1128 | rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0); | |
1129 | if (!rss_meta_ptr) { | |
1130 | rte_flow_error_set(error, EINVAL, | |
1131 | RTE_FLOW_ERROR_TYPE_HANDLE, NULL, | |
1132 | "No memory for rss_meta_ptr"); | |
1133 | return -ENOMEM; | |
1134 | } | |
1135 | ||
1136 | /* Check rss supported pattern and find matched pattern. */ | |
1137 | pattern_match_item = | |
1138 | iavf_search_pattern_match_item(pattern, array, array_len, | |
1139 | error); | |
1140 | if (!pattern_match_item) { | |
1141 | ret = -rte_errno; | |
1142 | goto error; | |
1143 | } | |
1144 | ||
1145 | ret = iavf_hash_check_inset(pattern, error); | |
1146 | if (ret) | |
1147 | goto error; | |
1148 | ||
1149 | /* Check rss action. */ | |
1150 | ret = iavf_hash_parse_action(pattern_match_item, pattern, actions, | |
1151 | (void **)&rss_meta_ptr, error); | |
1152 | ||
1153 | error: | |
1154 | if (!ret && meta) | |
1155 | *meta = rss_meta_ptr; | |
1156 | else | |
1157 | rte_free(rss_meta_ptr); | |
1158 | ||
1159 | rte_free(pattern_match_item); | |
1160 | ||
1161 | return ret; | |
1162 | } | |
1163 | ||
1164 | static int | |
1165 | iavf_hash_create(__rte_unused struct iavf_adapter *ad, | |
1166 | __rte_unused struct rte_flow *flow, void *meta, | |
1167 | __rte_unused struct rte_flow_error *error) | |
1168 | { | |
1169 | struct iavf_rss_meta *rss_meta = (struct iavf_rss_meta *)meta; | |
1170 | struct virtchnl_rss_cfg *rss_cfg; | |
1171 | int ret = 0; | |
1172 | ||
1173 | rss_cfg = rte_zmalloc("iavf rss rule", | |
1174 | sizeof(struct virtchnl_rss_cfg), 0); | |
1175 | if (!rss_cfg) { | |
1176 | rte_flow_error_set(error, EINVAL, | |
1177 | RTE_FLOW_ERROR_TYPE_HANDLE, NULL, | |
1178 | "No memory for rss rule"); | |
1179 | return -ENOMEM; | |
1180 | } | |
1181 | ||
1182 | rss_cfg->proto_hdrs = *rss_meta->proto_hdrs; | |
1183 | rss_cfg->rss_algorithm = rss_meta->rss_algorithm; | |
1184 | ||
1185 | ret = iavf_add_del_rss_cfg(ad, rss_cfg, true); | |
1186 | if (!ret) { | |
1187 | flow->rule = rss_cfg; | |
1188 | } else { | |
1189 | PMD_DRV_LOG(ERR, "fail to add RSS configure"); | |
1190 | rte_flow_error_set(error, -ret, | |
1191 | RTE_FLOW_ERROR_TYPE_HANDLE, NULL, | |
1192 | "Failed to add rss rule."); | |
1193 | rte_free(rss_cfg); | |
1194 | return -rte_errno; | |
1195 | } | |
1196 | ||
1197 | rte_free(meta); | |
1198 | ||
1199 | return ret; | |
1200 | } | |
1201 | ||
1202 | static int | |
1203 | iavf_hash_destroy(__rte_unused struct iavf_adapter *ad, | |
1204 | struct rte_flow *flow, | |
1205 | __rte_unused struct rte_flow_error *error) | |
1206 | { | |
1207 | struct virtchnl_rss_cfg *rss_cfg; | |
1208 | int ret = 0; | |
1209 | ||
1210 | rss_cfg = (struct virtchnl_rss_cfg *)flow->rule; | |
1211 | ||
1212 | ret = iavf_add_del_rss_cfg(ad, rss_cfg, false); | |
1213 | if (ret) { | |
1214 | PMD_DRV_LOG(ERR, "fail to del RSS configure"); | |
1215 | rte_flow_error_set(error, -ret, | |
1216 | RTE_FLOW_ERROR_TYPE_HANDLE, NULL, | |
1217 | "Failed to delete rss rule."); | |
1218 | return -rte_errno; | |
1219 | } | |
1220 | return ret; | |
1221 | } | |
1222 | ||
1223 | static void | |
1224 | iavf_hash_uninit(struct iavf_adapter *ad) | |
1225 | { | |
1226 | if (iavf_hash_default_set(ad, false)) | |
1227 | PMD_DRV_LOG(ERR, "fail to delete default RSS"); | |
1228 | ||
1229 | iavf_unregister_parser(&iavf_hash_parser, ad); | |
1230 | } | |
1231 | ||
1232 | static void | |
1233 | iavf_hash_free(struct rte_flow *flow) | |
1234 | { | |
1235 | rte_free(flow->rule); | |
1236 | } |