Branch data Line data Source code
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 <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 : : #include "../common/flow_check.h"
26 : :
27 : : #define IAVF_PHINT_NONE 0
28 : : #define IAVF_PHINT_GTPU BIT_ULL(0)
29 : : #define IAVF_PHINT_GTPU_EH BIT_ULL(1)
30 : : #define IAVF_PHINT_GTPU_EH_DWN BIT_ULL(2)
31 : : #define IAVF_PHINT_GTPU_EH_UP BIT_ULL(3)
32 : : #define IAVF_PHINT_OUTER_IPV4 BIT_ULL(4)
33 : : #define IAVF_PHINT_OUTER_IPV6 BIT_ULL(5)
34 : : #define IAVF_PHINT_GRE BIT_ULL(6)
35 : : /* the second IP header of GTPoGRE */
36 : : #define IAVF_PHINT_MID_IPV4 BIT_ULL(7)
37 : : #define IAVF_PHINT_MID_IPV6 BIT_ULL(8)
38 : : /* L2TPv2 */
39 : : #define IAVF_PHINT_L2TPV2 BIT_ULL(9)
40 : : #define IAVF_PHINT_L2TPV2_LEN BIT_ULL(10)
41 : : /* Raw */
42 : : #define IAVF_PHINT_RAW BIT_ULL(11)
43 : :
44 : : #define IAVF_PHINT_GTPU_MSK (IAVF_PHINT_GTPU | \
45 : : IAVF_PHINT_GTPU_EH | \
46 : : IAVF_PHINT_GTPU_EH_DWN | \
47 : : IAVF_PHINT_GTPU_EH_UP)
48 : :
49 : : #define IAVF_PHINT_LAYERS_MSK (IAVF_PHINT_OUTER_IPV4 | \
50 : : IAVF_PHINT_OUTER_IPV6)
51 : :
52 : : #define IAVF_GTPU_EH_DWNLINK 0
53 : : #define IAVF_GTPU_EH_UPLINK 1
54 : :
55 : : struct iavf_hash_match_type {
56 : : uint64_t hash_type;
57 : : struct virtchnl_proto_hdrs *proto_hdrs;
58 : : uint64_t pattern_hint;
59 : : };
60 : :
61 : : struct iavf_rss_meta {
62 : : struct virtchnl_proto_hdrs proto_hdrs;
63 : : enum virtchnl_rss_algorithm rss_algorithm;
64 : : bool raw_ena;
65 : : };
66 : :
67 : : struct iavf_hash_flow_cfg {
68 : : struct virtchnl_rss_cfg *rss_cfg;
69 : : bool simple_xor;
70 : : };
71 : :
72 : : static int
73 : : iavf_hash_init(struct iavf_adapter *ad);
74 : : static int
75 : : iavf_hash_create(struct iavf_adapter *ad, struct rte_flow *flow, void *meta,
76 : : struct rte_flow_error *error);
77 : : static int
78 : : iavf_hash_destroy(struct iavf_adapter *ad, struct rte_flow *flow,
79 : : struct rte_flow_error *error);
80 : : static void
81 : : iavf_hash_uninit_parser(struct iavf_adapter *ad);
82 : : static void
83 : : iavf_hash_free(struct rte_flow *flow);
84 : : static int
85 : : iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
86 : : struct iavf_pattern_match_item *array,
87 : : uint32_t array_len,
88 : : const struct rte_flow_item pattern[],
89 : : const struct rte_flow_action actions[],
90 : : const struct rte_flow_attr *attr,
91 : : void **meta,
92 : : struct rte_flow_error *error);
93 : :
94 : : #define FIELD_SELECTOR(proto_hdr_field) \
95 : : (1UL << ((proto_hdr_field) & PROTO_HDR_FIELD_MASK))
96 : : #define BUFF_NOUSED 0
97 : :
98 : : #define proto_hdr_eth { \
99 : : VIRTCHNL_PROTO_HDR_ETH, \
100 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ETH_SRC) | \
101 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ETH_DST), {BUFF_NOUSED} }
102 : :
103 : : #define proto_hdr_svlan { \
104 : : VIRTCHNL_PROTO_HDR_S_VLAN, \
105 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_S_VLAN_ID), {BUFF_NOUSED} }
106 : :
107 : : #define proto_hdr_cvlan { \
108 : : VIRTCHNL_PROTO_HDR_C_VLAN, \
109 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_C_VLAN_ID), {BUFF_NOUSED} }
110 : :
111 : : #define proto_hdr_ipv4 { \
112 : : VIRTCHNL_PROTO_HDR_IPV4, \
113 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
114 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST), {BUFF_NOUSED} }
115 : :
116 : : #define proto_hdr_ipv4_with_prot { \
117 : : VIRTCHNL_PROTO_HDR_IPV4, \
118 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
119 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
120 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), {BUFF_NOUSED} }
121 : :
122 : : #define proto_hdr_ipv6 { \
123 : : VIRTCHNL_PROTO_HDR_IPV6, \
124 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
125 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED} }
126 : :
127 : : #define proto_hdr_ipv6_frag { \
128 : : VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG, \
129 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG_PKID), {BUFF_NOUSED} }
130 : :
131 : : #define proto_hdr_ipv6_with_prot { \
132 : : VIRTCHNL_PROTO_HDR_IPV6, \
133 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
134 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
135 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED} }
136 : :
137 : : #define proto_hdr_udp { \
138 : : VIRTCHNL_PROTO_HDR_UDP, \
139 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_UDP_SRC_PORT) | \
140 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_UDP_DST_PORT), {BUFF_NOUSED} }
141 : :
142 : : #define proto_hdr_tcp { \
143 : : VIRTCHNL_PROTO_HDR_TCP, \
144 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_TCP_SRC_PORT) | \
145 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_TCP_DST_PORT), {BUFF_NOUSED} }
146 : :
147 : : #define proto_hdr_sctp { \
148 : : VIRTCHNL_PROTO_HDR_SCTP, \
149 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_SCTP_SRC_PORT) | \
150 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_SCTP_DST_PORT), {BUFF_NOUSED} }
151 : :
152 : : #define proto_hdr_esp { \
153 : : VIRTCHNL_PROTO_HDR_ESP, \
154 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ESP_SPI), {BUFF_NOUSED} }
155 : :
156 : : #define proto_hdr_ah { \
157 : : VIRTCHNL_PROTO_HDR_AH, \
158 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_AH_SPI), {BUFF_NOUSED} }
159 : :
160 : : #define proto_hdr_l2tpv3 { \
161 : : VIRTCHNL_PROTO_HDR_L2TPV3, \
162 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV3_SESS_ID), {BUFF_NOUSED} }
163 : :
164 : : #define proto_hdr_pfcp { \
165 : : VIRTCHNL_PROTO_HDR_PFCP, \
166 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_PFCP_SEID), {BUFF_NOUSED} }
167 : :
168 : : #define proto_hdr_gtpc { \
169 : : VIRTCHNL_PROTO_HDR_GTPC, 0, {BUFF_NOUSED} }
170 : :
171 : : #define proto_hdr_ecpri { \
172 : : VIRTCHNL_PROTO_HDR_ECPRI, \
173 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ECPRI_PC_RTC_ID), {BUFF_NOUSED} }
174 : :
175 : : #define proto_hdr_l2tpv2 { \
176 : : VIRTCHNL_PROTO_HDR_L2TPV2, \
177 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV2_SESS_ID) | \
178 : : FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV2_LEN_SESS_ID), {BUFF_NOUSED} }
179 : :
180 : : #define proto_hdr_ppp { \
181 : : VIRTCHNL_PROTO_HDR_PPP, 0, {BUFF_NOUSED} }
182 : :
183 : : #define TUNNEL_LEVEL_OUTER 0
184 : : #define TUNNEL_LEVEL_INNER 1
185 : :
186 : : /* proto_hdrs template */
187 : : struct virtchnl_proto_hdrs outer_ipv4_tmplt = {
188 : : TUNNEL_LEVEL_OUTER, 4,
189 : : {{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv4}}
190 : : };
191 : :
192 : : struct virtchnl_proto_hdrs outer_ipv4_udp_tmplt = {
193 : : TUNNEL_LEVEL_OUTER, 5,
194 : : {{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
195 : : proto_hdr_ipv4_with_prot,
196 : : proto_hdr_udp}}
197 : : };
198 : :
199 : : struct virtchnl_proto_hdrs outer_ipv4_tcp_tmplt = {
200 : : TUNNEL_LEVEL_OUTER, 5,
201 : : {{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
202 : : proto_hdr_ipv4_with_prot,
203 : : proto_hdr_tcp}}
204 : : };
205 : :
206 : : struct virtchnl_proto_hdrs outer_ipv4_sctp_tmplt = {
207 : : TUNNEL_LEVEL_OUTER, 5,
208 : : {{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv4,
209 : : proto_hdr_sctp}}
210 : : };
211 : :
212 : : struct virtchnl_proto_hdrs outer_ipv6_tmplt = {
213 : : TUNNEL_LEVEL_OUTER, 4,
214 : : {{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6}}
215 : : };
216 : :
217 : : struct virtchnl_proto_hdrs outer_ipv6_frag_tmplt = {
218 : : TUNNEL_LEVEL_OUTER, 5,
219 : : {{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
220 : : proto_hdr_ipv6, proto_hdr_ipv6_frag}}
221 : : };
222 : :
223 : : struct virtchnl_proto_hdrs outer_ipv6_udp_tmplt = {
224 : : TUNNEL_LEVEL_OUTER, 5,
225 : : {{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
226 : : proto_hdr_ipv6_with_prot,
227 : : proto_hdr_udp}}
228 : : };
229 : :
230 : : struct virtchnl_proto_hdrs outer_ipv6_tcp_tmplt = {
231 : : TUNNEL_LEVEL_OUTER, 5,
232 : : {{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
233 : : proto_hdr_ipv6_with_prot,
234 : : proto_hdr_tcp}}
235 : : };
236 : :
237 : : struct virtchnl_proto_hdrs outer_ipv6_sctp_tmplt = {
238 : : TUNNEL_LEVEL_OUTER, 5,
239 : : {{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6,
240 : : proto_hdr_sctp}}
241 : : };
242 : :
243 : : struct virtchnl_proto_hdrs inner_ipv4_tmplt = {
244 : : TUNNEL_LEVEL_INNER, 1, {{proto_hdr_ipv4}}
245 : : };
246 : :
247 : : struct virtchnl_proto_hdrs inner_ipv4_udp_tmplt = {
248 : : TUNNEL_LEVEL_INNER, 2, {{proto_hdr_ipv4_with_prot, proto_hdr_udp}}
249 : : };
250 : :
251 : : struct virtchnl_proto_hdrs inner_ipv4_tcp_tmplt = {
252 : : TUNNEL_LEVEL_INNER, 2, {{proto_hdr_ipv4_with_prot, proto_hdr_tcp}}
253 : : };
254 : :
255 : : struct virtchnl_proto_hdrs second_inner_ipv4_tmplt = {
256 : : 2, 1, {{proto_hdr_ipv4}}
257 : : };
258 : :
259 : : struct virtchnl_proto_hdrs second_inner_ipv4_udp_tmplt = {
260 : : 2, 2, {{proto_hdr_ipv4_with_prot, proto_hdr_udp}}
261 : : };
262 : :
263 : : struct virtchnl_proto_hdrs second_inner_ipv4_tcp_tmplt = {
264 : : 2, 2, {{proto_hdr_ipv4_with_prot, proto_hdr_tcp}}
265 : : };
266 : :
267 : : struct virtchnl_proto_hdrs second_inner_ipv6_tmplt = {
268 : : 2, 1, {{proto_hdr_ipv6}}
269 : : };
270 : :
271 : : struct virtchnl_proto_hdrs second_inner_ipv6_udp_tmplt = {
272 : : 2, 2, {{proto_hdr_ipv6_with_prot, proto_hdr_udp}}
273 : : };
274 : :
275 : : struct virtchnl_proto_hdrs second_inner_ipv6_tcp_tmplt = {
276 : : 2, 2, {{proto_hdr_ipv6_with_prot, proto_hdr_tcp}}
277 : : };
278 : :
279 : : struct virtchnl_proto_hdrs inner_ipv4_sctp_tmplt = {
280 : : TUNNEL_LEVEL_INNER, 2, {{proto_hdr_ipv4, proto_hdr_sctp}}
281 : : };
282 : :
283 : : struct virtchnl_proto_hdrs inner_ipv6_tmplt = {
284 : : TUNNEL_LEVEL_INNER, 1, {{proto_hdr_ipv6}}
285 : : };
286 : :
287 : : struct virtchnl_proto_hdrs inner_ipv6_udp_tmplt = {
288 : : TUNNEL_LEVEL_INNER, 2, {{proto_hdr_ipv6_with_prot, proto_hdr_udp}}
289 : : };
290 : :
291 : : struct virtchnl_proto_hdrs inner_ipv6_tcp_tmplt = {
292 : : TUNNEL_LEVEL_INNER, 2, {{proto_hdr_ipv6_with_prot, proto_hdr_tcp}}
293 : : };
294 : :
295 : : struct virtchnl_proto_hdrs inner_ipv6_sctp_tmplt = {
296 : : TUNNEL_LEVEL_INNER, 2, {{proto_hdr_ipv6, proto_hdr_sctp}}
297 : : };
298 : :
299 : : struct virtchnl_proto_hdrs ipv4_esp_tmplt = {
300 : : TUNNEL_LEVEL_OUTER, 2, {{proto_hdr_ipv4, proto_hdr_esp}}
301 : : };
302 : :
303 : : struct virtchnl_proto_hdrs ipv4_udp_esp_tmplt = {
304 : : TUNNEL_LEVEL_OUTER, 3,
305 : : {{proto_hdr_ipv4, proto_hdr_udp, proto_hdr_esp}}
306 : : };
307 : :
308 : : struct virtchnl_proto_hdrs ipv4_ah_tmplt = {
309 : : TUNNEL_LEVEL_OUTER, 2, {{proto_hdr_ipv4, proto_hdr_ah}}
310 : : };
311 : :
312 : : struct virtchnl_proto_hdrs ipv6_esp_tmplt = {
313 : : TUNNEL_LEVEL_OUTER, 2, {{proto_hdr_ipv6, proto_hdr_esp}}
314 : : };
315 : :
316 : : struct virtchnl_proto_hdrs ipv6_udp_esp_tmplt = {
317 : : TUNNEL_LEVEL_OUTER, 3,
318 : : {{proto_hdr_ipv6, proto_hdr_udp, proto_hdr_esp}}
319 : : };
320 : :
321 : : struct virtchnl_proto_hdrs ipv6_ah_tmplt = {
322 : : TUNNEL_LEVEL_OUTER, 2, {{proto_hdr_ipv6, proto_hdr_ah}}
323 : : };
324 : :
325 : : struct virtchnl_proto_hdrs ipv4_l2tpv3_tmplt = {
326 : : TUNNEL_LEVEL_OUTER, 2, {{proto_hdr_ipv4, proto_hdr_l2tpv3}}
327 : : };
328 : :
329 : : struct virtchnl_proto_hdrs ipv6_l2tpv3_tmplt = {
330 : : TUNNEL_LEVEL_OUTER, 2, {{proto_hdr_ipv6, proto_hdr_l2tpv3}}
331 : : };
332 : :
333 : : struct virtchnl_proto_hdrs ipv4_pfcp_tmplt = {
334 : : TUNNEL_LEVEL_OUTER, 2, {{proto_hdr_ipv4, proto_hdr_pfcp}}
335 : : };
336 : :
337 : : struct virtchnl_proto_hdrs ipv6_pfcp_tmplt = {
338 : : TUNNEL_LEVEL_OUTER, 2, {{proto_hdr_ipv6, proto_hdr_pfcp}}
339 : : };
340 : :
341 : : struct virtchnl_proto_hdrs ipv4_udp_gtpc_tmplt = {
342 : : TUNNEL_LEVEL_OUTER, 3,
343 : : {{proto_hdr_ipv4, proto_hdr_udp, proto_hdr_gtpc}}
344 : : };
345 : :
346 : : struct virtchnl_proto_hdrs ipv6_udp_gtpc_tmplt = {
347 : : TUNNEL_LEVEL_OUTER, 3,
348 : : {{proto_hdr_ipv6, proto_hdr_udp, proto_hdr_gtpc}}
349 : : };
350 : :
351 : : struct virtchnl_proto_hdrs eth_ecpri_tmplt = {
352 : : TUNNEL_LEVEL_OUTER, 2, {{proto_hdr_eth, proto_hdr_ecpri}}
353 : : };
354 : :
355 : : struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
356 : : TUNNEL_LEVEL_OUTER, 3,
357 : : {{proto_hdr_ipv4, proto_hdr_udp, proto_hdr_ecpri}}
358 : : };
359 : :
360 : : struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv4_tmplt = {
361 : : TUNNEL_LEVEL_INNER, 3,
362 : : {{proto_hdr_l2tpv2,
363 : : proto_hdr_ppp,
364 : : proto_hdr_ipv4}}
365 : : };
366 : :
367 : : struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tmplt = {
368 : : TUNNEL_LEVEL_INNER, 3,
369 : : {{proto_hdr_l2tpv2,
370 : : proto_hdr_ppp,
371 : : proto_hdr_ipv6}}
372 : : };
373 : :
374 : : struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv4_udp_tmplt = {
375 : : TUNNEL_LEVEL_INNER, 4,
376 : : {{proto_hdr_l2tpv2,
377 : : proto_hdr_ppp,
378 : : proto_hdr_ipv4_with_prot,
379 : : proto_hdr_udp}}
380 : : };
381 : :
382 : : struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv4_tcp_tmplt = {
383 : : TUNNEL_LEVEL_INNER, 4,
384 : : {{proto_hdr_l2tpv2,
385 : : proto_hdr_ppp,
386 : : proto_hdr_ipv4_with_prot,
387 : : proto_hdr_tcp}}
388 : : };
389 : :
390 : : struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_udp_tmplt = {
391 : : TUNNEL_LEVEL_INNER, 4,
392 : : {{proto_hdr_l2tpv2,
393 : : proto_hdr_ppp,
394 : : proto_hdr_ipv6_with_prot,
395 : : proto_hdr_udp}}
396 : : };
397 : :
398 : : struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tcp_tmplt = {
399 : : TUNNEL_LEVEL_INNER, 4,
400 : : {{proto_hdr_l2tpv2,
401 : : proto_hdr_ppp,
402 : : proto_hdr_ipv6_with_prot,
403 : : proto_hdr_tcp}}
404 : :
405 : : };
406 : :
407 : : struct virtchnl_proto_hdrs ipv4_l2tpv2_tmplt = {
408 : : TUNNEL_LEVEL_OUTER, 4,
409 : : {{proto_hdr_eth,
410 : : proto_hdr_ipv4,
411 : : proto_hdr_udp,
412 : : proto_hdr_l2tpv2}}
413 : : };
414 : :
415 : : struct virtchnl_proto_hdrs ipv6_l2tpv2_tmplt = {
416 : : TUNNEL_LEVEL_OUTER, 4,
417 : : {{proto_hdr_eth,
418 : : proto_hdr_ipv6,
419 : : proto_hdr_udp,
420 : : proto_hdr_l2tpv2}}
421 : : };
422 : :
423 : : struct virtchnl_proto_hdrs ipv4_l2tpv2_ppp_tmplt = {
424 : : TUNNEL_LEVEL_OUTER, 5,
425 : : {{proto_hdr_eth,
426 : : proto_hdr_ipv4,
427 : : proto_hdr_udp,
428 : : proto_hdr_l2tpv2,
429 : : proto_hdr_ppp}}
430 : : };
431 : :
432 : : struct virtchnl_proto_hdrs ipv6_l2tpv2_ppp_tmplt = {
433 : : TUNNEL_LEVEL_OUTER, 5,
434 : : {{proto_hdr_eth,
435 : : proto_hdr_ipv6,
436 : : proto_hdr_udp,
437 : : proto_hdr_l2tpv2,
438 : : proto_hdr_ppp}}
439 : : };
440 : :
441 : : /* rss type super set */
442 : :
443 : : /* IPv4 outer */
444 : : #define IAVF_RSS_TYPE_OUTER_IPV4 (RTE_ETH_RSS_ETH | RTE_ETH_RSS_IPV4 | \
445 : : RTE_ETH_RSS_FRAG_IPV4 | \
446 : : RTE_ETH_RSS_IPV4_CHKSUM)
447 : : #define IAVF_RSS_TYPE_OUTER_IPV4_UDP (IAVF_RSS_TYPE_OUTER_IPV4 | \
448 : : RTE_ETH_RSS_NONFRAG_IPV4_UDP | \
449 : : RTE_ETH_RSS_L4_CHKSUM)
450 : : #define IAVF_RSS_TYPE_OUTER_IPV4_TCP (IAVF_RSS_TYPE_OUTER_IPV4 | \
451 : : RTE_ETH_RSS_NONFRAG_IPV4_TCP | \
452 : : RTE_ETH_RSS_L4_CHKSUM)
453 : : #define IAVF_RSS_TYPE_OUTER_IPV4_SCTP (IAVF_RSS_TYPE_OUTER_IPV4 | \
454 : : RTE_ETH_RSS_NONFRAG_IPV4_SCTP | \
455 : : RTE_ETH_RSS_L4_CHKSUM)
456 : : /* IPv6 outer */
457 : : #define IAVF_RSS_TYPE_OUTER_IPV6 (RTE_ETH_RSS_ETH | RTE_ETH_RSS_IPV6)
458 : : #define IAVF_RSS_TYPE_OUTER_IPV6_FRAG (IAVF_RSS_TYPE_OUTER_IPV6 | \
459 : : RTE_ETH_RSS_FRAG_IPV6)
460 : : #define IAVF_RSS_TYPE_OUTER_IPV6_UDP (IAVF_RSS_TYPE_OUTER_IPV6 | \
461 : : RTE_ETH_RSS_NONFRAG_IPV6_UDP | \
462 : : RTE_ETH_RSS_L4_CHKSUM)
463 : : #define IAVF_RSS_TYPE_OUTER_IPV6_TCP (IAVF_RSS_TYPE_OUTER_IPV6 | \
464 : : RTE_ETH_RSS_NONFRAG_IPV6_TCP | \
465 : : RTE_ETH_RSS_L4_CHKSUM)
466 : : #define IAVF_RSS_TYPE_OUTER_IPV6_SCTP (IAVF_RSS_TYPE_OUTER_IPV6 | \
467 : : RTE_ETH_RSS_NONFRAG_IPV6_SCTP | \
468 : : RTE_ETH_RSS_L4_CHKSUM)
469 : : /* VLAN IPV4 */
470 : : #define IAVF_RSS_TYPE_VLAN_IPV4 (IAVF_RSS_TYPE_OUTER_IPV4 | \
471 : : RTE_ETH_RSS_S_VLAN | RTE_ETH_RSS_C_VLAN)
472 : : #define IAVF_RSS_TYPE_VLAN_IPV4_UDP (IAVF_RSS_TYPE_OUTER_IPV4_UDP | \
473 : : RTE_ETH_RSS_S_VLAN | RTE_ETH_RSS_C_VLAN)
474 : : #define IAVF_RSS_TYPE_VLAN_IPV4_TCP (IAVF_RSS_TYPE_OUTER_IPV4_TCP | \
475 : : RTE_ETH_RSS_S_VLAN | RTE_ETH_RSS_C_VLAN)
476 : : #define IAVF_RSS_TYPE_VLAN_IPV4_SCTP (IAVF_RSS_TYPE_OUTER_IPV4_SCTP | \
477 : : RTE_ETH_RSS_S_VLAN | RTE_ETH_RSS_C_VLAN)
478 : : /* VLAN IPv6 */
479 : : #define IAVF_RSS_TYPE_VLAN_IPV6 (IAVF_RSS_TYPE_OUTER_IPV6 | \
480 : : RTE_ETH_RSS_S_VLAN | RTE_ETH_RSS_C_VLAN)
481 : : #define IAVF_RSS_TYPE_VLAN_IPV6_FRAG (IAVF_RSS_TYPE_OUTER_IPV6_FRAG | \
482 : : RTE_ETH_RSS_S_VLAN | RTE_ETH_RSS_C_VLAN)
483 : : #define IAVF_RSS_TYPE_VLAN_IPV6_UDP (IAVF_RSS_TYPE_OUTER_IPV6_UDP | \
484 : : RTE_ETH_RSS_S_VLAN | RTE_ETH_RSS_C_VLAN)
485 : : #define IAVF_RSS_TYPE_VLAN_IPV6_TCP (IAVF_RSS_TYPE_OUTER_IPV6_TCP | \
486 : : RTE_ETH_RSS_S_VLAN | RTE_ETH_RSS_C_VLAN)
487 : : #define IAVF_RSS_TYPE_VLAN_IPV6_SCTP (IAVF_RSS_TYPE_OUTER_IPV6_SCTP | \
488 : : RTE_ETH_RSS_S_VLAN | RTE_ETH_RSS_C_VLAN)
489 : : /* IPv4 inner */
490 : : #define IAVF_RSS_TYPE_INNER_IPV4 RTE_ETH_RSS_IPV4
491 : : #define IAVF_RSS_TYPE_INNER_IPV4_UDP (RTE_ETH_RSS_IPV4 | \
492 : : RTE_ETH_RSS_NONFRAG_IPV4_UDP)
493 : : #define IAVF_RSS_TYPE_INNER_IPV4_TCP (RTE_ETH_RSS_IPV4 | \
494 : : RTE_ETH_RSS_NONFRAG_IPV4_TCP)
495 : : #define IAVF_RSS_TYPE_INNER_IPV4_SCTP (RTE_ETH_RSS_IPV4 | \
496 : : RTE_ETH_RSS_NONFRAG_IPV4_SCTP)
497 : : /* IPv6 inner */
498 : : #define IAVF_RSS_TYPE_INNER_IPV6 RTE_ETH_RSS_IPV6
499 : : #define IAVF_RSS_TYPE_INNER_IPV6_UDP (RTE_ETH_RSS_IPV6 | \
500 : : RTE_ETH_RSS_NONFRAG_IPV6_UDP)
501 : : #define IAVF_RSS_TYPE_INNER_IPV6_TCP (RTE_ETH_RSS_IPV6 | \
502 : : RTE_ETH_RSS_NONFRAG_IPV6_TCP)
503 : : #define IAVF_RSS_TYPE_INNER_IPV6_SCTP (RTE_ETH_RSS_IPV6 | \
504 : : RTE_ETH_RSS_NONFRAG_IPV6_SCTP)
505 : : /* GTPU IPv4 */
506 : : #define IAVF_RSS_TYPE_GTPU_IPV4 (IAVF_RSS_TYPE_INNER_IPV4 | \
507 : : RTE_ETH_RSS_GTPU)
508 : : #define IAVF_RSS_TYPE_GTPU_IPV4_UDP (IAVF_RSS_TYPE_INNER_IPV4_UDP | \
509 : : RTE_ETH_RSS_GTPU)
510 : : #define IAVF_RSS_TYPE_GTPU_IPV4_TCP (IAVF_RSS_TYPE_INNER_IPV4_TCP | \
511 : : RTE_ETH_RSS_GTPU)
512 : : /* GTPU IPv6 */
513 : : #define IAVF_RSS_TYPE_GTPU_IPV6 (IAVF_RSS_TYPE_INNER_IPV6 | \
514 : : RTE_ETH_RSS_GTPU)
515 : : #define IAVF_RSS_TYPE_GTPU_IPV6_UDP (IAVF_RSS_TYPE_INNER_IPV6_UDP | \
516 : : RTE_ETH_RSS_GTPU)
517 : : #define IAVF_RSS_TYPE_GTPU_IPV6_TCP (IAVF_RSS_TYPE_INNER_IPV6_TCP | \
518 : : RTE_ETH_RSS_GTPU)
519 : : /* ESP, AH, L2TPV3 and PFCP */
520 : : #define IAVF_RSS_TYPE_IPV4_ESP (RTE_ETH_RSS_ESP | RTE_ETH_RSS_IPV4)
521 : : #define IAVF_RSS_TYPE_IPV4_AH (RTE_ETH_RSS_AH | RTE_ETH_RSS_IPV4)
522 : : #define IAVF_RSS_TYPE_IPV6_ESP (RTE_ETH_RSS_ESP | RTE_ETH_RSS_IPV6)
523 : : #define IAVF_RSS_TYPE_IPV6_AH (RTE_ETH_RSS_AH | RTE_ETH_RSS_IPV6)
524 : : #define IAVF_RSS_TYPE_IPV4_L2TPV3 (RTE_ETH_RSS_L2TPV3 | RTE_ETH_RSS_IPV4)
525 : : #define IAVF_RSS_TYPE_IPV6_L2TPV3 (RTE_ETH_RSS_L2TPV3 | RTE_ETH_RSS_IPV6)
526 : : #define IAVF_RSS_TYPE_IPV4_PFCP (RTE_ETH_RSS_PFCP | RTE_ETH_RSS_IPV4)
527 : : #define IAVF_RSS_TYPE_IPV6_PFCP (RTE_ETH_RSS_PFCP | RTE_ETH_RSS_IPV6)
528 : :
529 : : /* L2TPv2 */
530 : : #define IAVF_RSS_TYPE_ETH_L2TPV2 (RTE_ETH_RSS_ETH | RTE_ETH_RSS_L2TPV2)
531 : :
532 : : /**
533 : : * Supported pattern for hash.
534 : : * The first member is pattern item type,
535 : : * the second member is input set mask,
536 : : * the third member is virtchnl_proto_hdrs template
537 : : */
538 : : static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
539 : : /* IPv4 */
540 : : {iavf_pattern_raw, IAVF_INSET_NONE, NULL},
541 : : {iavf_pattern_eth_ipv4, IAVF_RSS_TYPE_OUTER_IPV4, &outer_ipv4_tmplt},
542 : : {iavf_pattern_eth_ipv4_udp, IAVF_RSS_TYPE_OUTER_IPV4_UDP, &outer_ipv4_udp_tmplt},
543 : : {iavf_pattern_eth_ipv4_tcp, IAVF_RSS_TYPE_OUTER_IPV4_TCP, &outer_ipv4_tcp_tmplt},
544 : : {iavf_pattern_eth_ipv4_sctp, IAVF_RSS_TYPE_OUTER_IPV4_SCTP, &outer_ipv4_sctp_tmplt},
545 : : {iavf_pattern_eth_vlan_ipv4, IAVF_RSS_TYPE_VLAN_IPV4, &outer_ipv4_tmplt},
546 : : {iavf_pattern_eth_vlan_ipv4_udp, IAVF_RSS_TYPE_VLAN_IPV4_UDP, &outer_ipv4_udp_tmplt},
547 : : {iavf_pattern_eth_vlan_ipv4_tcp, IAVF_RSS_TYPE_VLAN_IPV4_TCP, &outer_ipv4_tcp_tmplt},
548 : : {iavf_pattern_eth_vlan_ipv4_sctp, IAVF_RSS_TYPE_VLAN_IPV4_SCTP, &outer_ipv4_sctp_tmplt},
549 : : {iavf_pattern_eth_ipv4_gtpu, RTE_ETH_RSS_IPV4, &outer_ipv4_udp_tmplt},
550 : : {iavf_pattern_eth_ipv4_gtpu_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &inner_ipv4_tmplt},
551 : : {iavf_pattern_eth_ipv4_gtpu_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &inner_ipv4_udp_tmplt},
552 : : {iavf_pattern_eth_ipv4_gtpu_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &inner_ipv4_tcp_tmplt},
553 : : {iavf_pattern_eth_ipv6_gtpu_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &inner_ipv4_tmplt},
554 : : {iavf_pattern_eth_ipv6_gtpu_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &inner_ipv4_udp_tmplt},
555 : : {iavf_pattern_eth_ipv6_gtpu_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &inner_ipv4_tcp_tmplt},
556 : : {iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &inner_ipv4_tmplt},
557 : : {iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &inner_ipv4_udp_tmplt},
558 : : {iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &inner_ipv4_tcp_tmplt},
559 : : {iavf_pattern_eth_ipv6_gtpu_eh_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &inner_ipv4_tmplt},
560 : : {iavf_pattern_eth_ipv6_gtpu_eh_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &inner_ipv4_udp_tmplt},
561 : : {iavf_pattern_eth_ipv6_gtpu_eh_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &inner_ipv4_tcp_tmplt},
562 : : {iavf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &second_inner_ipv4_tmplt},
563 : : {iavf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &second_inner_ipv4_udp_tmplt},
564 : : {iavf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &second_inner_ipv4_tcp_tmplt},
565 : : {iavf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &second_inner_ipv4_tmplt},
566 : : {iavf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &second_inner_ipv4_udp_tmplt},
567 : : {iavf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &second_inner_ipv4_tcp_tmplt},
568 : : {iavf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &second_inner_ipv4_tmplt},
569 : : {iavf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &second_inner_ipv4_udp_tmplt},
570 : : {iavf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &second_inner_ipv4_tcp_tmplt},
571 : : {iavf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &second_inner_ipv4_tmplt},
572 : : {iavf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &second_inner_ipv4_udp_tmplt},
573 : : {iavf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &second_inner_ipv4_tcp_tmplt},
574 : : {iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &second_inner_ipv4_tmplt},
575 : : {iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &second_inner_ipv4_udp_tmplt},
576 : : {iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &second_inner_ipv4_tcp_tmplt},
577 : : {iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &second_inner_ipv4_tmplt},
578 : : {iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &second_inner_ipv4_udp_tmplt},
579 : : {iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &second_inner_ipv4_tcp_tmplt},
580 : : {iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &second_inner_ipv4_tmplt},
581 : : {iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &second_inner_ipv4_udp_tmplt},
582 : : {iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &second_inner_ipv4_tcp_tmplt},
583 : : {iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &second_inner_ipv4_tmplt},
584 : : {iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &second_inner_ipv4_udp_tmplt},
585 : : {iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &second_inner_ipv4_tcp_tmplt},
586 : : {iavf_pattern_eth_ipv4_esp, IAVF_RSS_TYPE_IPV4_ESP, &ipv4_esp_tmplt},
587 : : {iavf_pattern_eth_ipv4_udp_esp, IAVF_RSS_TYPE_IPV4_ESP, &ipv4_udp_esp_tmplt},
588 : : {iavf_pattern_eth_ipv4_ah, IAVF_RSS_TYPE_IPV4_AH, &ipv4_ah_tmplt},
589 : : {iavf_pattern_eth_ipv4_l2tpv3, IAVF_RSS_TYPE_IPV4_L2TPV3, &ipv4_l2tpv3_tmplt},
590 : : {iavf_pattern_eth_ipv4_pfcp, IAVF_RSS_TYPE_IPV4_PFCP, &ipv4_pfcp_tmplt},
591 : : {iavf_pattern_eth_ipv4_gtpc, RTE_ETH_RSS_IPV4, &ipv4_udp_gtpc_tmplt},
592 : : {iavf_pattern_eth_ecpri, RTE_ETH_RSS_ECPRI, ð_ecpri_tmplt},
593 : : {iavf_pattern_eth_ipv4_ecpri, RTE_ETH_RSS_ECPRI, &ipv4_ecpri_tmplt},
594 : : {iavf_pattern_eth_ipv4_gre_ipv4, IAVF_RSS_TYPE_INNER_IPV4, &inner_ipv4_tmplt},
595 : : {iavf_pattern_eth_ipv6_gre_ipv4, IAVF_RSS_TYPE_INNER_IPV4, &inner_ipv4_tmplt},
596 : : {iavf_pattern_eth_ipv4_gre_ipv4_tcp, IAVF_RSS_TYPE_INNER_IPV4_TCP, &inner_ipv4_tcp_tmplt},
597 : : {iavf_pattern_eth_ipv6_gre_ipv4_tcp, IAVF_RSS_TYPE_INNER_IPV4_TCP, &inner_ipv4_tcp_tmplt},
598 : : {iavf_pattern_eth_ipv4_gre_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &inner_ipv4_udp_tmplt},
599 : : {iavf_pattern_eth_ipv6_gre_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &inner_ipv4_udp_tmplt},
600 : : {iavf_pattern_eth_ipv4_udp_l2tpv2, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv4_l2tpv2_tmplt},
601 : : {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv4_l2tpv2_ppp_tmplt},
602 : : {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4, IAVF_RSS_TYPE_INNER_IPV4, &udp_l2tpv2_ppp_ipv4_tmplt},
603 : : {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &udp_l2tpv2_ppp_ipv4_udp_tmplt},
604 : : {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp, IAVF_RSS_TYPE_INNER_IPV4_TCP, &udp_l2tpv2_ppp_ipv4_tcp_tmplt},
605 : : {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4, IAVF_RSS_TYPE_INNER_IPV4, &udp_l2tpv2_ppp_ipv4_tmplt},
606 : : {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &udp_l2tpv2_ppp_ipv4_udp_tmplt},
607 : : {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_tcp, IAVF_RSS_TYPE_INNER_IPV4_TCP, &udp_l2tpv2_ppp_ipv4_tcp_tmplt},
608 : :
609 : : /* IPv6 */
610 : : {iavf_pattern_eth_ipv6, IAVF_RSS_TYPE_OUTER_IPV6, &outer_ipv6_tmplt},
611 : : {iavf_pattern_eth_ipv6_frag_ext, IAVF_RSS_TYPE_OUTER_IPV6_FRAG, &outer_ipv6_frag_tmplt},
612 : : {iavf_pattern_eth_ipv6_udp, IAVF_RSS_TYPE_OUTER_IPV6_UDP, &outer_ipv6_udp_tmplt},
613 : : {iavf_pattern_eth_ipv6_tcp, IAVF_RSS_TYPE_OUTER_IPV6_TCP, &outer_ipv6_tcp_tmplt},
614 : : {iavf_pattern_eth_ipv6_sctp, IAVF_RSS_TYPE_OUTER_IPV6_SCTP, &outer_ipv6_sctp_tmplt},
615 : : {iavf_pattern_eth_vlan_ipv6, IAVF_RSS_TYPE_VLAN_IPV6, &outer_ipv6_tmplt},
616 : : {iavf_pattern_eth_vlan_ipv6_frag_ext, IAVF_RSS_TYPE_OUTER_IPV6_FRAG, &outer_ipv6_frag_tmplt},
617 : : {iavf_pattern_eth_vlan_ipv6_udp, IAVF_RSS_TYPE_VLAN_IPV6_UDP, &outer_ipv6_udp_tmplt},
618 : : {iavf_pattern_eth_vlan_ipv6_tcp, IAVF_RSS_TYPE_VLAN_IPV6_TCP, &outer_ipv6_tcp_tmplt},
619 : : {iavf_pattern_eth_vlan_ipv6_sctp, IAVF_RSS_TYPE_VLAN_IPV6_SCTP, &outer_ipv6_sctp_tmplt},
620 : : {iavf_pattern_eth_ipv6_gtpu, RTE_ETH_RSS_IPV6, &outer_ipv6_udp_tmplt},
621 : : {iavf_pattern_eth_ipv4_gtpu_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &inner_ipv6_tmplt},
622 : : {iavf_pattern_eth_ipv4_gtpu_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &inner_ipv6_udp_tmplt},
623 : : {iavf_pattern_eth_ipv4_gtpu_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &inner_ipv6_tcp_tmplt},
624 : : {iavf_pattern_eth_ipv6_gtpu_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &inner_ipv6_tmplt},
625 : : {iavf_pattern_eth_ipv6_gtpu_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &inner_ipv6_udp_tmplt},
626 : : {iavf_pattern_eth_ipv6_gtpu_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &inner_ipv6_tcp_tmplt},
627 : : {iavf_pattern_eth_ipv4_gtpu_eh_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &inner_ipv6_tmplt},
628 : : {iavf_pattern_eth_ipv4_gtpu_eh_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &inner_ipv6_udp_tmplt},
629 : : {iavf_pattern_eth_ipv4_gtpu_eh_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &inner_ipv6_tcp_tmplt},
630 : : {iavf_pattern_eth_ipv6_gtpu_eh_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &inner_ipv6_tmplt},
631 : : {iavf_pattern_eth_ipv6_gtpu_eh_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &inner_ipv6_udp_tmplt},
632 : : {iavf_pattern_eth_ipv6_gtpu_eh_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &inner_ipv6_tcp_tmplt},
633 : : {iavf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &second_inner_ipv6_tmplt},
634 : : {iavf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &second_inner_ipv6_udp_tmplt},
635 : : {iavf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &second_inner_ipv6_tcp_tmplt},
636 : : {iavf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &second_inner_ipv6_tmplt},
637 : : {iavf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &second_inner_ipv6_udp_tmplt},
638 : : {iavf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &second_inner_ipv6_tcp_tmplt},
639 : : {iavf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &second_inner_ipv6_tmplt},
640 : : {iavf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &second_inner_ipv6_udp_tmplt},
641 : : {iavf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &second_inner_ipv6_tcp_tmplt},
642 : : {iavf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &second_inner_ipv6_tmplt},
643 : : {iavf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &second_inner_ipv6_udp_tmplt},
644 : : {iavf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &second_inner_ipv6_tcp_tmplt},
645 : : {iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &second_inner_ipv6_tmplt},
646 : : {iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &second_inner_ipv6_udp_tmplt},
647 : : {iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &second_inner_ipv6_tcp_tmplt},
648 : : {iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &second_inner_ipv6_tmplt},
649 : : {iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &second_inner_ipv6_udp_tmplt},
650 : : {iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &second_inner_ipv6_tcp_tmplt},
651 : : {iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &second_inner_ipv6_tmplt},
652 : : {iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &second_inner_ipv6_udp_tmplt},
653 : : {iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &second_inner_ipv6_tcp_tmplt},
654 : : {iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &second_inner_ipv6_tmplt},
655 : : {iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &second_inner_ipv6_udp_tmplt},
656 : : {iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &second_inner_ipv6_tcp_tmplt},
657 : : {iavf_pattern_eth_ipv6_esp, IAVF_RSS_TYPE_IPV6_ESP, &ipv6_esp_tmplt},
658 : : {iavf_pattern_eth_ipv6_udp_esp, IAVF_RSS_TYPE_IPV6_ESP, &ipv6_udp_esp_tmplt},
659 : : {iavf_pattern_eth_ipv6_ah, IAVF_RSS_TYPE_IPV6_AH, &ipv6_ah_tmplt},
660 : : {iavf_pattern_eth_ipv6_l2tpv3, IAVF_RSS_TYPE_IPV6_L2TPV3, &ipv6_l2tpv3_tmplt},
661 : : {iavf_pattern_eth_ipv6_pfcp, IAVF_RSS_TYPE_IPV6_PFCP, &ipv6_pfcp_tmplt},
662 : : {iavf_pattern_eth_ipv6_gtpc, RTE_ETH_RSS_IPV6, &ipv6_udp_gtpc_tmplt},
663 : : {iavf_pattern_eth_ipv4_gre_ipv6, IAVF_RSS_TYPE_INNER_IPV6, &inner_ipv6_tmplt},
664 : : {iavf_pattern_eth_ipv6_gre_ipv6, IAVF_RSS_TYPE_INNER_IPV6, &inner_ipv6_tmplt},
665 : : {iavf_pattern_eth_ipv4_gre_ipv6_tcp, IAVF_RSS_TYPE_INNER_IPV6_TCP, &inner_ipv6_tcp_tmplt},
666 : : {iavf_pattern_eth_ipv6_gre_ipv6_tcp, IAVF_RSS_TYPE_INNER_IPV6_TCP, &inner_ipv6_tcp_tmplt},
667 : : {iavf_pattern_eth_ipv4_gre_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &inner_ipv6_udp_tmplt},
668 : : {iavf_pattern_eth_ipv6_gre_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &inner_ipv6_udp_tmplt},
669 : : {iavf_pattern_eth_ipv6_udp_l2tpv2, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv6_l2tpv2_tmplt},
670 : : {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv6_l2tpv2_ppp_tmplt},
671 : : {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6, IAVF_RSS_TYPE_INNER_IPV6, &udp_l2tpv2_ppp_ipv6_tmplt},
672 : : {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &udp_l2tpv2_ppp_ipv6_udp_tmplt},
673 : : {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp, IAVF_RSS_TYPE_INNER_IPV6_TCP, &udp_l2tpv2_ppp_ipv6_tcp_tmplt},
674 : : {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6, IAVF_RSS_TYPE_INNER_IPV6, &udp_l2tpv2_ppp_ipv6_tmplt},
675 : : {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &udp_l2tpv2_ppp_ipv6_udp_tmplt},
676 : : {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_tcp, IAVF_RSS_TYPE_INNER_IPV6_TCP, &udp_l2tpv2_ppp_ipv6_tcp_tmplt},
677 : :
678 : : };
679 : :
680 : : static struct iavf_flow_engine iavf_hash_engine = {
681 : : .init = iavf_hash_init,
682 : : .create = iavf_hash_create,
683 : : .destroy = iavf_hash_destroy,
684 : : .uninit = iavf_hash_uninit_parser,
685 : : .free = iavf_hash_free,
686 : : .name = "hash",
687 : : .type = IAVF_FLOW_ENGINE_HASH,
688 : : .rule_size = sizeof(struct virtchnl_rss_cfg),
689 : : };
690 : :
691 : : /* Register parser for comms package. */
692 : : static struct iavf_flow_parser iavf_hash_parser = {
693 : : .engine = &iavf_hash_engine,
694 : : .array = iavf_hash_pattern_list,
695 : : .array_len = RTE_DIM(iavf_hash_pattern_list),
696 : : .parse_pattern_action = iavf_hash_parse_pattern_action,
697 : : };
698 : :
699 : : int
700 : 0 : iavf_rss_hash_set(struct iavf_adapter *ad, uint64_t rss_hf, bool add)
701 : : {
702 : : struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
703 : : struct virtchnl_rss_cfg rss_cfg;
704 : :
705 : : #define IAVF_RSS_HF_ALL ( \
706 : : RTE_ETH_RSS_IPV4 | \
707 : : RTE_ETH_RSS_IPV6 | \
708 : : RTE_ETH_RSS_NONFRAG_IPV4_UDP | \
709 : : RTE_ETH_RSS_NONFRAG_IPV6_UDP | \
710 : : RTE_ETH_RSS_NONFRAG_IPV4_TCP | \
711 : : RTE_ETH_RSS_NONFRAG_IPV6_TCP | \
712 : : RTE_ETH_RSS_NONFRAG_IPV4_SCTP | \
713 : : RTE_ETH_RSS_NONFRAG_IPV6_SCTP)
714 : :
715 : 0 : rss_cfg.rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
716 [ # # ]: 0 : if (rss_hf & RTE_ETH_RSS_IPV4) {
717 : 0 : rss_cfg.proto_hdrs = inner_ipv4_tmplt;
718 : 0 : iavf_add_del_rss_cfg(ad, &rss_cfg, add);
719 : : }
720 : :
721 [ # # ]: 0 : if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_UDP) {
722 : 0 : rss_cfg.proto_hdrs = inner_ipv4_udp_tmplt;
723 : 0 : iavf_add_del_rss_cfg(ad, &rss_cfg, add);
724 : : }
725 : :
726 [ # # ]: 0 : if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_TCP) {
727 : 0 : rss_cfg.proto_hdrs = inner_ipv4_tcp_tmplt;
728 : 0 : iavf_add_del_rss_cfg(ad, &rss_cfg, add);
729 : : }
730 : :
731 [ # # ]: 0 : if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_SCTP) {
732 : 0 : rss_cfg.proto_hdrs = inner_ipv4_sctp_tmplt;
733 : 0 : iavf_add_del_rss_cfg(ad, &rss_cfg, add);
734 : : }
735 : :
736 [ # # ]: 0 : if (rss_hf & RTE_ETH_RSS_IPV6) {
737 : 0 : rss_cfg.proto_hdrs = inner_ipv6_tmplt;
738 : 0 : iavf_add_del_rss_cfg(ad, &rss_cfg, add);
739 : : }
740 : :
741 [ # # ]: 0 : if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_UDP) {
742 : 0 : rss_cfg.proto_hdrs = inner_ipv6_udp_tmplt;
743 : 0 : iavf_add_del_rss_cfg(ad, &rss_cfg, add);
744 : : }
745 : :
746 [ # # ]: 0 : if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_TCP) {
747 : 0 : rss_cfg.proto_hdrs = inner_ipv6_tcp_tmplt;
748 : 0 : iavf_add_del_rss_cfg(ad, &rss_cfg, add);
749 : : }
750 : :
751 [ # # ]: 0 : if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_SCTP) {
752 : 0 : rss_cfg.proto_hdrs = inner_ipv6_sctp_tmplt;
753 : 0 : iavf_add_del_rss_cfg(ad, &rss_cfg, add);
754 : : }
755 : :
756 : 0 : vf->rss_hf = rss_hf & IAVF_RSS_HF_ALL;
757 : 0 : return 0;
758 : : }
759 : :
760 : 301 : RTE_INIT(iavf_hash_engine_init)
761 : : {
762 : : struct iavf_flow_engine *engine = &iavf_hash_engine;
763 : :
764 : 301 : iavf_register_flow_engine(engine);
765 : 301 : }
766 : :
767 : : static int
768 : 0 : iavf_hash_init(struct iavf_adapter *ad)
769 : : {
770 : : struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
771 : : struct iavf_flow_parser *parser;
772 : : int ret;
773 : :
774 [ # # ]: 0 : if (vf->vf_reset)
775 : : return -EIO;
776 : :
777 [ # # ]: 0 : if (!vf->vf_res)
778 : : return -EINVAL;
779 : :
780 [ # # ]: 0 : if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF))
781 : : return -ENOTSUP;
782 : :
783 : : parser = &iavf_hash_parser;
784 : :
785 : 0 : ret = iavf_register_parser(parser, ad);
786 [ # # ]: 0 : if (ret) {
787 : 0 : PMD_DRV_LOG(ERR, "fail to register hash parser");
788 : 0 : return ret;
789 : : }
790 : :
791 : : return ret;
792 : : }
793 : :
794 : : static int
795 : 0 : iavf_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
796 : : struct rte_flow_error *error)
797 : : {
798 : : const struct rte_flow_item *item = pattern;
799 : : const struct rte_flow_item_gtp_psc *psc;
800 : : const struct rte_flow_item_ecpri *ecpri;
801 : : struct rte_ecpri_common_hdr ecpri_common;
802 : : const struct rte_flow_item_l2tpv2 *l2tpv2;
803 : : uint16_t flags_version;
804 : :
805 [ # # ]: 0 : for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
806 [ # # ]: 0 : if (item->last) {
807 : 0 : rte_flow_error_set(error, EINVAL,
808 : : RTE_FLOW_ERROR_TYPE_ITEM, item,
809 : : "Not support range");
810 : 0 : return -rte_errno;
811 : : }
812 : :
813 [ # # # # : 0 : switch (item->type) {
# # # #
# ]
814 : 0 : case RTE_FLOW_ITEM_TYPE_RAW:
815 : 0 : *phint |= IAVF_PHINT_RAW;
816 : 0 : break;
817 : 0 : case RTE_FLOW_ITEM_TYPE_IPV4:
818 : 0 : if (!(*phint & IAVF_PHINT_GTPU_MSK) &&
819 [ # # ]: 0 : !(*phint & IAVF_PHINT_GRE) &&
820 : : !(*phint & IAVF_PHINT_L2TPV2))
821 : 0 : *phint |= IAVF_PHINT_OUTER_IPV4;
822 [ # # ]: 0 : if ((*phint & IAVF_PHINT_GRE) && !(*phint & IAVF_PHINT_GTPU_MSK))
823 : 0 : *phint |= IAVF_PHINT_MID_IPV4;
824 : : break;
825 : 0 : case RTE_FLOW_ITEM_TYPE_IPV6:
826 : 0 : if (!(*phint & IAVF_PHINT_GTPU_MSK) &&
827 [ # # ]: 0 : !(*phint & IAVF_PHINT_GRE) &&
828 : : !(*phint & IAVF_PHINT_L2TPV2))
829 : 0 : *phint |= IAVF_PHINT_OUTER_IPV6;
830 [ # # ]: 0 : if ((*phint & IAVF_PHINT_GRE) && !(*phint & IAVF_PHINT_GTPU_MSK))
831 : 0 : *phint |= IAVF_PHINT_MID_IPV6;
832 : : break;
833 : 0 : case RTE_FLOW_ITEM_TYPE_GTPU:
834 : 0 : *phint |= IAVF_PHINT_GTPU;
835 : 0 : break;
836 : 0 : case RTE_FLOW_ITEM_TYPE_GTP_PSC:
837 : 0 : *phint |= IAVF_PHINT_GTPU_EH;
838 : 0 : psc = item->spec;
839 [ # # ]: 0 : if (!psc)
840 : : break;
841 [ # # ]: 0 : else if (psc->hdr.type == IAVF_GTPU_EH_UPLINK)
842 : 0 : *phint |= IAVF_PHINT_GTPU_EH_UP;
843 [ # # ]: 0 : else if (psc->hdr.type == IAVF_GTPU_EH_DWNLINK)
844 : 0 : *phint |= IAVF_PHINT_GTPU_EH_DWN;
845 : : break;
846 : 0 : case RTE_FLOW_ITEM_TYPE_ECPRI:
847 : 0 : ecpri = item->spec;
848 [ # # ]: 0 : if (!ecpri)
849 : : break;
850 : :
851 [ # # ]: 0 : ecpri_common.u32 = rte_be_to_cpu_32(ecpri->hdr.common.u32);
852 : :
853 [ # # ]: 0 : if (ecpri_common.type !=
854 : : RTE_ECPRI_MSG_TYPE_IQ_DATA) {
855 : 0 : rte_flow_error_set(error, EINVAL,
856 : : RTE_FLOW_ERROR_TYPE_ITEM, item,
857 : : "Unsupported common type.");
858 : 0 : return -rte_errno;
859 : : }
860 : : break;
861 : 0 : case RTE_FLOW_ITEM_TYPE_GRE:
862 : 0 : *phint |= IAVF_PHINT_GRE;
863 : 0 : break;
864 : 0 : case RTE_FLOW_ITEM_TYPE_L2TPV2:
865 : 0 : l2tpv2 = item->spec;
866 : :
867 [ # # ]: 0 : if (l2tpv2) {
868 : : flags_version =
869 [ # # ]: 0 : rte_be_to_cpu_16(l2tpv2->hdr.common.flags_version);
870 [ # # ]: 0 : if (flags_version & IAVF_L2TPV2_FLAGS_LEN)
871 : 0 : *phint |= IAVF_PHINT_L2TPV2_LEN;
872 : : else
873 : 0 : *phint |= IAVF_PHINT_L2TPV2;
874 : : } else {
875 : 0 : *phint |= IAVF_PHINT_L2TPV2;
876 : : }
877 : : break;
878 : : default:
879 : : break;
880 : : }
881 : : }
882 : :
883 : : return 0;
884 : : }
885 : :
886 : : static int
887 : 0 : iavf_hash_parse_raw_pattern(const struct rte_flow_item *item,
888 : : struct rte_flow_error *error,
889 : : struct iavf_rss_meta *meta)
890 : : {
891 : : const struct rte_flow_item_raw *raw_spec, *raw_mask;
892 : : uint16_t spec_len, pkt_len;
893 : : uint8_t *pkt_buf, *msk_buf;
894 : : uint8_t tmp_val = 0;
895 : : uint8_t tmp_c = 0;
896 : : int i, j;
897 : :
898 : 0 : raw_spec = item->spec;
899 : 0 : raw_mask = item->mask;
900 : :
901 [ # # ]: 0 : if (!raw_spec || !raw_mask) {
902 : 0 : PMD_DRV_LOG(ERR, "NULL RAW spec/mask");
903 : 0 : rte_flow_error_set(error, EINVAL,
904 : : RTE_FLOW_ERROR_TYPE_ITEM,
905 : : item, "NULL RAW spec/mask");
906 : 0 : return -rte_errno;
907 : : }
908 : :
909 : 0 : spec_len = strlen((char *)(uintptr_t)raw_spec->pattern);
910 [ # # ]: 0 : if (strlen((char *)(uintptr_t)raw_mask->pattern) !=
911 : : spec_len)
912 : 0 : return -rte_errno;
913 : :
914 : 0 : pkt_len = spec_len / 2;
915 : :
916 : 0 : pkt_buf = rte_zmalloc(NULL, pkt_len, 0);
917 [ # # ]: 0 : if (!pkt_buf)
918 : : return -ENOMEM;
919 : :
920 : 0 : msk_buf = rte_zmalloc(NULL, pkt_len, 0);
921 [ # # ]: 0 : if (!msk_buf)
922 : : return -ENOMEM;
923 : :
924 : : /* convert string to int array */
925 [ # # ]: 0 : for (i = 0, j = 0; i < spec_len; i += 2, j++) {
926 : 0 : tmp_c = raw_spec->pattern[i];
927 [ # # ]: 0 : if (tmp_c >= 'a' && tmp_c <= 'f')
928 : 0 : tmp_val = tmp_c - 'a' + 10;
929 [ # # ]: 0 : if (tmp_c >= 'A' && tmp_c <= 'F')
930 : 0 : tmp_val = tmp_c - 'A' + 10;
931 [ # # ]: 0 : if (tmp_c >= '0' && tmp_c <= '9')
932 : : tmp_val = tmp_c - '0';
933 : :
934 : 0 : tmp_c = raw_spec->pattern[i + 1];
935 [ # # ]: 0 : if (tmp_c >= 'a' && tmp_c <= 'f')
936 : 0 : pkt_buf[j] = tmp_val * 16 + tmp_c - 'a' + 10;
937 [ # # ]: 0 : if (tmp_c >= 'A' && tmp_c <= 'F')
938 : 0 : pkt_buf[j] = tmp_val * 16 + tmp_c - 'A' + 10;
939 [ # # ]: 0 : if (tmp_c >= '0' && tmp_c <= '9')
940 : 0 : pkt_buf[j] = tmp_val * 16 + tmp_c - '0';
941 : :
942 : 0 : tmp_c = raw_mask->pattern[i];
943 [ # # ]: 0 : if (tmp_c >= 'a' && tmp_c <= 'f')
944 : 0 : tmp_val = tmp_c - 0x57;
945 [ # # ]: 0 : if (tmp_c >= 'A' && tmp_c <= 'F')
946 : 0 : tmp_val = tmp_c - 0x37;
947 [ # # ]: 0 : if (tmp_c >= '0' && tmp_c <= '9')
948 : : tmp_val = tmp_c - '0';
949 : :
950 : 0 : tmp_c = raw_mask->pattern[i + 1];
951 [ # # ]: 0 : if (tmp_c >= 'a' && tmp_c <= 'f')
952 : 0 : msk_buf[j] = tmp_val * 16 + tmp_c - 'a' + 10;
953 [ # # ]: 0 : if (tmp_c >= 'A' && tmp_c <= 'F')
954 : 0 : msk_buf[j] = tmp_val * 16 + tmp_c - 'A' + 10;
955 [ # # ]: 0 : if (tmp_c >= '0' && tmp_c <= '9')
956 : 0 : msk_buf[j] = tmp_val * 16 + tmp_c - '0';
957 : : }
958 : :
959 : 0 : memcpy(meta->proto_hdrs.raw.spec, pkt_buf, pkt_len);
960 : 0 : memcpy(meta->proto_hdrs.raw.mask, msk_buf, pkt_len);
961 : 0 : meta->proto_hdrs.raw.pkt_len = pkt_len;
962 : :
963 : 0 : rte_free(pkt_buf);
964 : 0 : rte_free(msk_buf);
965 : :
966 : 0 : return 0;
967 : : }
968 : :
969 : : #define REFINE_PROTO_FLD(op, fld) \
970 : : VIRTCHNL_##op##_PROTO_HDR_FIELD(hdr, VIRTCHNL_PROTO_HDR_##fld)
971 : : #define REPALCE_PROTO_FLD(fld_1, fld_2) \
972 : : do { \
973 : : REFINE_PROTO_FLD(DEL, fld_1); \
974 : : REFINE_PROTO_FLD(ADD, fld_2); \
975 : : } while (0)
976 : :
977 : : static void
978 : : iavf_hash_add_fragment_hdr(struct virtchnl_proto_hdrs *hdrs, int layer)
979 : : {
980 : : struct virtchnl_proto_hdr *hdr1;
981 : : struct virtchnl_proto_hdr *hdr2;
982 : : int i;
983 : :
984 : 0 : if (layer < 0 || layer > hdrs->count)
985 : : return;
986 : :
987 : : /* shift headers layer */
988 [ # # ]: 0 : for (i = hdrs->count; i >= layer; i--) {
989 : : hdr1 = &hdrs->proto_hdr[i];
990 : 0 : hdr2 = &hdrs->proto_hdr[i - 1];
991 : 0 : *hdr1 = *hdr2;
992 : : }
993 : :
994 : : /* adding dummy fragment header */
995 : : hdr1 = &hdrs->proto_hdr[layer];
996 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4_FRAG);
997 : 0 : hdrs->count = ++layer;
998 : : }
999 : :
1000 : : /* refine proto hdrs base on l2, l3, l4 rss type */
1001 : : static void
1002 : 0 : iavf_refine_proto_hdrs_l234(struct virtchnl_proto_hdrs *proto_hdrs,
1003 : : uint64_t rss_type)
1004 : : {
1005 : : struct virtchnl_proto_hdr *hdr;
1006 : : int i;
1007 : :
1008 [ # # ]: 0 : for (i = 0; i < proto_hdrs->count; i++) {
1009 : : hdr = &proto_hdrs->proto_hdr[i];
1010 [ # # # # : 0 : switch (hdr->type) {
# # # # #
# # # # #
# # # ]
1011 : 0 : case VIRTCHNL_PROTO_HDR_ETH:
1012 [ # # ]: 0 : if (!(rss_type & RTE_ETH_RSS_ETH))
1013 : 0 : hdr->field_selector = 0;
1014 [ # # ]: 0 : else if (rss_type & RTE_ETH_RSS_L2_SRC_ONLY)
1015 : 0 : REFINE_PROTO_FLD(DEL, ETH_DST);
1016 [ # # ]: 0 : else if (rss_type & RTE_ETH_RSS_L2_DST_ONLY)
1017 : 0 : REFINE_PROTO_FLD(DEL, ETH_SRC);
1018 : : break;
1019 : 0 : case VIRTCHNL_PROTO_HDR_IPV4:
1020 [ # # ]: 0 : if (rss_type &
1021 : : (RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_FRAG_IPV4 |
1022 : : RTE_ETH_RSS_NONFRAG_IPV4_UDP |
1023 : : RTE_ETH_RSS_NONFRAG_IPV4_TCP |
1024 : : RTE_ETH_RSS_NONFRAG_IPV4_SCTP)) {
1025 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_FRAG_IPV4) {
1026 [ # # ]: 0 : iavf_hash_add_fragment_hdr(proto_hdrs, i + 1);
1027 [ # # ]: 0 : } else if (rss_type & RTE_ETH_RSS_L3_SRC_ONLY) {
1028 : 0 : REFINE_PROTO_FLD(DEL, IPV4_DST);
1029 [ # # ]: 0 : } else if (rss_type & RTE_ETH_RSS_L3_DST_ONLY) {
1030 : 0 : REFINE_PROTO_FLD(DEL, IPV4_SRC);
1031 [ # # ]: 0 : } else if (rss_type &
1032 : : (RTE_ETH_RSS_L4_SRC_ONLY |
1033 : : RTE_ETH_RSS_L4_DST_ONLY)) {
1034 : 0 : REFINE_PROTO_FLD(DEL, IPV4_DST);
1035 : 0 : REFINE_PROTO_FLD(DEL, IPV4_SRC);
1036 : : }
1037 : : } else {
1038 : 0 : hdr->field_selector = 0;
1039 : : }
1040 : :
1041 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_IPV4_CHKSUM)
1042 : 0 : REFINE_PROTO_FLD(ADD, IPV4_CHKSUM);
1043 : :
1044 : : break;
1045 : 0 : case VIRTCHNL_PROTO_HDR_IPV4_FRAG:
1046 [ # # ]: 0 : if (rss_type &
1047 : : (RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_FRAG_IPV4 |
1048 : : RTE_ETH_RSS_NONFRAG_IPV4_UDP |
1049 : : RTE_ETH_RSS_NONFRAG_IPV4_TCP |
1050 : : RTE_ETH_RSS_NONFRAG_IPV4_SCTP)) {
1051 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_FRAG_IPV4)
1052 : 0 : REFINE_PROTO_FLD(ADD, IPV4_FRAG_PKID);
1053 : : } else {
1054 : 0 : hdr->field_selector = 0;
1055 : : }
1056 : :
1057 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_IPV4_CHKSUM)
1058 : 0 : REFINE_PROTO_FLD(ADD, IPV4_CHKSUM);
1059 : :
1060 : : break;
1061 : 0 : case VIRTCHNL_PROTO_HDR_IPV6:
1062 [ # # ]: 0 : if (rss_type &
1063 : : (RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_FRAG_IPV6 |
1064 : : RTE_ETH_RSS_NONFRAG_IPV6_UDP |
1065 : : RTE_ETH_RSS_NONFRAG_IPV6_TCP |
1066 : : RTE_ETH_RSS_NONFRAG_IPV6_SCTP)) {
1067 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_L3_SRC_ONLY) {
1068 : 0 : REFINE_PROTO_FLD(DEL, IPV6_DST);
1069 [ # # ]: 0 : } else if (rss_type & RTE_ETH_RSS_L3_DST_ONLY) {
1070 : 0 : REFINE_PROTO_FLD(DEL, IPV6_SRC);
1071 [ # # ]: 0 : } else if (rss_type &
1072 : : (RTE_ETH_RSS_L4_SRC_ONLY |
1073 : : RTE_ETH_RSS_L4_DST_ONLY)) {
1074 : 0 : REFINE_PROTO_FLD(DEL, IPV6_DST);
1075 : 0 : REFINE_PROTO_FLD(DEL, IPV6_SRC);
1076 : : }
1077 : : } else {
1078 : 0 : hdr->field_selector = 0;
1079 : : }
1080 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_L3_PRE64) {
1081 [ # # ]: 0 : if (REFINE_PROTO_FLD(TEST, IPV6_SRC))
1082 : 0 : REPALCE_PROTO_FLD(IPV6_SRC,
1083 : : IPV6_PREFIX64_SRC);
1084 [ # # ]: 0 : if (REFINE_PROTO_FLD(TEST, IPV6_DST))
1085 : 0 : REPALCE_PROTO_FLD(IPV6_DST,
1086 : : IPV6_PREFIX64_DST);
1087 : : }
1088 : : break;
1089 : 0 : case VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG:
1090 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_FRAG_IPV6)
1091 : 0 : REFINE_PROTO_FLD(ADD, IPV6_EH_FRAG_PKID);
1092 : : else
1093 : 0 : hdr->field_selector = 0;
1094 : :
1095 : : break;
1096 : 0 : case VIRTCHNL_PROTO_HDR_UDP:
1097 [ # # ]: 0 : if (rss_type &
1098 : : (RTE_ETH_RSS_NONFRAG_IPV4_UDP |
1099 : : RTE_ETH_RSS_NONFRAG_IPV6_UDP)) {
1100 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_L4_SRC_ONLY)
1101 : 0 : REFINE_PROTO_FLD(DEL, UDP_DST_PORT);
1102 [ # # ]: 0 : else if (rss_type & RTE_ETH_RSS_L4_DST_ONLY)
1103 : 0 : REFINE_PROTO_FLD(DEL, UDP_SRC_PORT);
1104 [ # # ]: 0 : else if (rss_type &
1105 : : (RTE_ETH_RSS_L3_SRC_ONLY |
1106 : : RTE_ETH_RSS_L3_DST_ONLY))
1107 : 0 : hdr->field_selector = 0;
1108 : : } else {
1109 : 0 : hdr->field_selector = 0;
1110 : : }
1111 : :
1112 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_L4_CHKSUM)
1113 : 0 : REFINE_PROTO_FLD(ADD, UDP_CHKSUM);
1114 : : break;
1115 : 0 : case VIRTCHNL_PROTO_HDR_TCP:
1116 [ # # ]: 0 : if (rss_type &
1117 : : (RTE_ETH_RSS_NONFRAG_IPV4_TCP |
1118 : : RTE_ETH_RSS_NONFRAG_IPV6_TCP)) {
1119 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_L4_SRC_ONLY)
1120 : 0 : REFINE_PROTO_FLD(DEL, TCP_DST_PORT);
1121 [ # # ]: 0 : else if (rss_type & RTE_ETH_RSS_L4_DST_ONLY)
1122 : 0 : REFINE_PROTO_FLD(DEL, TCP_SRC_PORT);
1123 [ # # ]: 0 : else if (rss_type &
1124 : : (RTE_ETH_RSS_L3_SRC_ONLY |
1125 : : RTE_ETH_RSS_L3_DST_ONLY))
1126 : 0 : hdr->field_selector = 0;
1127 : : } else {
1128 : 0 : hdr->field_selector = 0;
1129 : : }
1130 : :
1131 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_L4_CHKSUM)
1132 : 0 : REFINE_PROTO_FLD(ADD, TCP_CHKSUM);
1133 : : break;
1134 : 0 : case VIRTCHNL_PROTO_HDR_SCTP:
1135 [ # # ]: 0 : if (rss_type &
1136 : : (RTE_ETH_RSS_NONFRAG_IPV4_SCTP |
1137 : : RTE_ETH_RSS_NONFRAG_IPV6_SCTP)) {
1138 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_L4_SRC_ONLY)
1139 : 0 : REFINE_PROTO_FLD(DEL, SCTP_DST_PORT);
1140 [ # # ]: 0 : else if (rss_type & RTE_ETH_RSS_L4_DST_ONLY)
1141 : 0 : REFINE_PROTO_FLD(DEL, SCTP_SRC_PORT);
1142 [ # # ]: 0 : else if (rss_type &
1143 : : (RTE_ETH_RSS_L3_SRC_ONLY |
1144 : : RTE_ETH_RSS_L3_DST_ONLY))
1145 : 0 : hdr->field_selector = 0;
1146 : : } else {
1147 : 0 : hdr->field_selector = 0;
1148 : : }
1149 : :
1150 [ # # ]: 0 : if (rss_type & RTE_ETH_RSS_L4_CHKSUM)
1151 : 0 : REFINE_PROTO_FLD(ADD, SCTP_CHKSUM);
1152 : : break;
1153 : 0 : case VIRTCHNL_PROTO_HDR_S_VLAN:
1154 [ # # ]: 0 : if (!(rss_type & RTE_ETH_RSS_S_VLAN))
1155 : 0 : hdr->field_selector = 0;
1156 : : break;
1157 : 0 : case VIRTCHNL_PROTO_HDR_C_VLAN:
1158 [ # # ]: 0 : if (!(rss_type & RTE_ETH_RSS_C_VLAN))
1159 : 0 : hdr->field_selector = 0;
1160 : : break;
1161 : 0 : case VIRTCHNL_PROTO_HDR_L2TPV3:
1162 [ # # ]: 0 : if (!(rss_type & RTE_ETH_RSS_L2TPV3))
1163 : 0 : hdr->field_selector = 0;
1164 : : break;
1165 : 0 : case VIRTCHNL_PROTO_HDR_ESP:
1166 [ # # ]: 0 : if (!(rss_type & RTE_ETH_RSS_ESP))
1167 : 0 : hdr->field_selector = 0;
1168 : : break;
1169 : 0 : case VIRTCHNL_PROTO_HDR_AH:
1170 [ # # ]: 0 : if (!(rss_type & RTE_ETH_RSS_AH))
1171 : 0 : hdr->field_selector = 0;
1172 : : break;
1173 : 0 : case VIRTCHNL_PROTO_HDR_PFCP:
1174 [ # # ]: 0 : if (!(rss_type & RTE_ETH_RSS_PFCP))
1175 : 0 : hdr->field_selector = 0;
1176 : : break;
1177 : 0 : case VIRTCHNL_PROTO_HDR_ECPRI:
1178 [ # # ]: 0 : if (!(rss_type & RTE_ETH_RSS_ECPRI))
1179 : 0 : hdr->field_selector = 0;
1180 : : break;
1181 : 0 : case VIRTCHNL_PROTO_HDR_L2TPV2:
1182 [ # # ]: 0 : if (!(rss_type & RTE_ETH_RSS_L2TPV2))
1183 : 0 : hdr->field_selector = 0;
1184 : : break;
1185 : : default:
1186 : : break;
1187 : : }
1188 : : }
1189 : 0 : }
1190 : :
1191 : : /* refine proto hdrs base on gtpu rss type */
1192 : : static void
1193 : : iavf_refine_proto_hdrs_gtpu(struct virtchnl_proto_hdrs *proto_hdrs,
1194 : : uint64_t rss_type)
1195 : : {
1196 : : struct virtchnl_proto_hdr *hdr;
1197 : : int i;
1198 : :
1199 [ # # ]: 0 : if (!(rss_type & RTE_ETH_RSS_GTPU))
1200 : : return;
1201 : :
1202 [ # # ]: 0 : for (i = 0; i < proto_hdrs->count; i++) {
1203 : : hdr = &proto_hdrs->proto_hdr[i];
1204 [ # # ]: 0 : switch (hdr->type) {
1205 : 0 : case VIRTCHNL_PROTO_HDR_GTPU_IP:
1206 : 0 : REFINE_PROTO_FLD(ADD, GTPU_IP_TEID);
1207 : 0 : break;
1208 : : default:
1209 : : break;
1210 : : }
1211 : : }
1212 : : }
1213 : :
1214 : : static void
1215 : 0 : iavf_refine_proto_hdrs_by_pattern(struct virtchnl_proto_hdrs *proto_hdrs,
1216 : : uint64_t phint)
1217 : : {
1218 : : struct virtchnl_proto_hdr *hdr1;
1219 : : struct virtchnl_proto_hdr *hdr2;
1220 : : int i, shift_count = 1;
1221 : 0 : int tun_lvl = proto_hdrs->tunnel_level;
1222 : :
1223 [ # # ]: 0 : if (!(phint & IAVF_PHINT_GTPU_MSK) && !(phint & IAVF_PHINT_GRE))
1224 : : return;
1225 : :
1226 [ # # ]: 0 : while (tun_lvl) {
1227 [ # # ]: 0 : if (phint & IAVF_PHINT_LAYERS_MSK)
1228 : : shift_count = 2;
1229 : :
1230 : : /* shift headers layer */
1231 : 0 : for (i = proto_hdrs->count - 1 + shift_count;
1232 [ # # ]: 0 : i > shift_count - 1; i--) {
1233 : : hdr1 = &proto_hdrs->proto_hdr[i];
1234 : 0 : hdr2 = &proto_hdrs->proto_hdr[i - shift_count];
1235 : 0 : *hdr1 = *hdr2;
1236 : : }
1237 : :
1238 [ # # ]: 0 : if (shift_count == 1) {
1239 : : /* adding tunnel header at layer 0 */
1240 : 0 : hdr1 = &proto_hdrs->proto_hdr[0];
1241 : : } else {
1242 : : /* adding tunnel header and outer ip header */
1243 : 0 : hdr1 = &proto_hdrs->proto_hdr[1];
1244 : : hdr2 = &proto_hdrs->proto_hdr[0];
1245 : 0 : hdr2->field_selector = 0;
1246 : 0 : proto_hdrs->count++;
1247 : 0 : tun_lvl--;
1248 : :
1249 [ # # ]: 0 : if (tun_lvl == TUNNEL_LEVEL_OUTER) {
1250 [ # # ]: 0 : if (phint & IAVF_PHINT_OUTER_IPV4)
1251 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr2, IPV4);
1252 [ # # ]: 0 : else if (phint & IAVF_PHINT_OUTER_IPV6)
1253 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr2, IPV6);
1254 [ # # ]: 0 : } else if (tun_lvl == TUNNEL_LEVEL_INNER) {
1255 [ # # ]: 0 : if (phint & IAVF_PHINT_MID_IPV4)
1256 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr2, IPV4);
1257 [ # # ]: 0 : else if (phint & IAVF_PHINT_MID_IPV6)
1258 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr2, IPV6);
1259 : : }
1260 : : }
1261 : :
1262 : 0 : hdr1->field_selector = 0;
1263 : 0 : proto_hdrs->count++;
1264 : :
1265 [ # # ]: 0 : if (phint & IAVF_PHINT_GTPU_EH_DWN)
1266 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, GTPU_EH_PDU_DWN);
1267 [ # # ]: 0 : else if (phint & IAVF_PHINT_GTPU_EH_UP)
1268 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, GTPU_EH_PDU_UP);
1269 [ # # ]: 0 : else if (phint & IAVF_PHINT_GTPU_EH)
1270 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, GTPU_EH);
1271 [ # # ]: 0 : else if (phint & IAVF_PHINT_GTPU)
1272 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, GTPU_IP);
1273 : :
1274 [ # # ]: 0 : if (phint & IAVF_PHINT_GRE) {
1275 [ # # ]: 0 : if (phint & IAVF_PHINT_GTPU) {
1276 : : /* if GTPoGRE, add GRE header at the outer tunnel */
1277 [ # # ]: 0 : if (tun_lvl == TUNNEL_LEVEL_OUTER)
1278 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, GRE);
1279 : : } else {
1280 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, GRE);
1281 : : }
1282 : : }
1283 : : }
1284 : 0 : proto_hdrs->tunnel_level = tun_lvl;
1285 : : }
1286 : :
1287 : : static void
1288 : 0 : iavf_refine_proto_hdrs_l2tpv2(struct virtchnl_proto_hdrs *proto_hdrs,
1289 : : uint64_t phint)
1290 : : {
1291 : : struct virtchnl_proto_hdr *hdr, *hdr1;
1292 : : int i;
1293 : :
1294 [ # # ]: 0 : if (!(phint & IAVF_PHINT_L2TPV2) && !(phint & IAVF_PHINT_L2TPV2_LEN))
1295 : : return;
1296 : :
1297 [ # # ]: 0 : if (proto_hdrs->tunnel_level == TUNNEL_LEVEL_INNER) {
1298 : : /* shift headers layer */
1299 [ # # ]: 0 : for (i = proto_hdrs->count; i > 0; i--)
1300 : 0 : proto_hdrs->proto_hdr[i] = proto_hdrs->proto_hdr[i - 1];
1301 : :
1302 : : /* adding outer ip header at layer 0 */
1303 : : hdr1 = &proto_hdrs->proto_hdr[0];
1304 : 0 : hdr1->field_selector = 0;
1305 : 0 : proto_hdrs->count++;
1306 : 0 : proto_hdrs->tunnel_level = TUNNEL_LEVEL_OUTER;
1307 [ # # ]: 0 : if (phint & IAVF_PHINT_OUTER_IPV4)
1308 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4);
1309 [ # # ]: 0 : else if (phint & IAVF_PHINT_OUTER_IPV6)
1310 : 0 : VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV6);
1311 : : } else {
1312 [ # # ]: 0 : for (i = 0; i < proto_hdrs->count; i++) {
1313 : : hdr = &proto_hdrs->proto_hdr[i];
1314 [ # # ]: 0 : if (hdr->type == VIRTCHNL_PROTO_HDR_L2TPV2) {
1315 [ # # ]: 0 : if (phint & IAVF_PHINT_L2TPV2) {
1316 : 0 : REFINE_PROTO_FLD(DEL, L2TPV2_LEN_SESS_ID);
1317 [ # # ]: 0 : } else if (phint & IAVF_PHINT_L2TPV2_LEN) {
1318 : 0 : REFINE_PROTO_FLD(DEL, L2TPV2_SESS_ID);
1319 : : }
1320 : : }
1321 : : }
1322 : : }
1323 : : }
1324 : :
1325 : 0 : static void iavf_refine_proto_hdrs(struct virtchnl_proto_hdrs *proto_hdrs,
1326 : : uint64_t rss_type, uint64_t phint)
1327 : : {
1328 : 0 : iavf_refine_proto_hdrs_l234(proto_hdrs, rss_type);
1329 : 0 : iavf_refine_proto_hdrs_by_pattern(proto_hdrs, phint);
1330 : : iavf_refine_proto_hdrs_gtpu(proto_hdrs, rss_type);
1331 : 0 : iavf_refine_proto_hdrs_l2tpv2(proto_hdrs, phint);
1332 : 0 : }
1333 : :
1334 : : static uint64_t invalid_rss_comb[] = {
1335 : : RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_NONFRAG_IPV4_UDP,
1336 : : RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_NONFRAG_IPV4_TCP,
1337 : : RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_NONFRAG_IPV6_UDP,
1338 : : RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_NONFRAG_IPV6_TCP,
1339 : : RTE_ETH_RSS_L3_PRE32 | RTE_ETH_RSS_L3_PRE40 |
1340 : : RTE_ETH_RSS_L3_PRE48 | RTE_ETH_RSS_L3_PRE56 |
1341 : : RTE_ETH_RSS_L3_PRE96
1342 : : };
1343 : :
1344 : : struct rss_attr_type {
1345 : : uint64_t attr;
1346 : : uint64_t type;
1347 : : };
1348 : :
1349 : : #define VALID_RSS_IPV4_L4 (RTE_ETH_RSS_NONFRAG_IPV4_UDP | \
1350 : : RTE_ETH_RSS_NONFRAG_IPV4_TCP | \
1351 : : RTE_ETH_RSS_NONFRAG_IPV4_SCTP)
1352 : :
1353 : : #define VALID_RSS_IPV6_L4 (RTE_ETH_RSS_NONFRAG_IPV6_UDP | \
1354 : : RTE_ETH_RSS_NONFRAG_IPV6_TCP | \
1355 : : RTE_ETH_RSS_NONFRAG_IPV6_SCTP)
1356 : :
1357 : : #define VALID_RSS_IPV4 (RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_FRAG_IPV4 | \
1358 : : VALID_RSS_IPV4_L4)
1359 : : #define VALID_RSS_IPV6 (RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_FRAG_IPV6 | \
1360 : : VALID_RSS_IPV6_L4)
1361 : : #define VALID_RSS_L3 (VALID_RSS_IPV4 | VALID_RSS_IPV6)
1362 : : #define VALID_RSS_L4 (VALID_RSS_IPV4_L4 | VALID_RSS_IPV6_L4)
1363 : :
1364 : : #define VALID_RSS_ATTR (RTE_ETH_RSS_L3_SRC_ONLY | \
1365 : : RTE_ETH_RSS_L3_DST_ONLY | \
1366 : : RTE_ETH_RSS_L4_SRC_ONLY | \
1367 : : RTE_ETH_RSS_L4_DST_ONLY | \
1368 : : RTE_ETH_RSS_L2_SRC_ONLY | \
1369 : : RTE_ETH_RSS_L2_DST_ONLY | \
1370 : : RTE_ETH_RSS_L3_PRE64)
1371 : :
1372 : : #define INVALID_RSS_ATTR (RTE_ETH_RSS_L3_PRE32 | \
1373 : : RTE_ETH_RSS_L3_PRE40 | \
1374 : : RTE_ETH_RSS_L3_PRE48 | \
1375 : : RTE_ETH_RSS_L3_PRE56 | \
1376 : : RTE_ETH_RSS_L3_PRE96)
1377 : :
1378 : : static struct rss_attr_type rss_attr_to_valid_type[] = {
1379 : : {RTE_ETH_RSS_L2_SRC_ONLY | RTE_ETH_RSS_L2_DST_ONLY, RTE_ETH_RSS_ETH},
1380 : : {RTE_ETH_RSS_L3_SRC_ONLY | RTE_ETH_RSS_L3_DST_ONLY, VALID_RSS_L3},
1381 : : {RTE_ETH_RSS_L4_SRC_ONLY | RTE_ETH_RSS_L4_DST_ONLY, VALID_RSS_L4},
1382 : : /* current ipv6 prefix only supports prefix 64 bits*/
1383 : : {RTE_ETH_RSS_L3_PRE64, VALID_RSS_IPV6},
1384 : : {INVALID_RSS_ATTR, 0}
1385 : : };
1386 : :
1387 : : static bool
1388 : 0 : iavf_any_invalid_rss_type(enum rte_eth_hash_function rss_func,
1389 : : uint64_t rss_type, uint64_t allow_rss_type)
1390 : : {
1391 : : uint32_t i;
1392 : :
1393 : : /**
1394 : : * Check if l3/l4 SRC/DST_ONLY is set for SYMMETRIC_TOEPLITZ
1395 : : * hash function.
1396 : : */
1397 [ # # ]: 0 : if (rss_func == RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
1398 [ # # ]: 0 : if (rss_type & (RTE_ETH_RSS_L3_SRC_ONLY | RTE_ETH_RSS_L3_DST_ONLY |
1399 : : RTE_ETH_RSS_L4_SRC_ONLY | RTE_ETH_RSS_L4_DST_ONLY))
1400 : : return true;
1401 : :
1402 [ # # ]: 0 : if (!(rss_type &
1403 : : (RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_IPV6 |
1404 : : RTE_ETH_RSS_FRAG_IPV4 | RTE_ETH_RSS_FRAG_IPV6 |
1405 : : RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_NONFRAG_IPV6_UDP |
1406 : : RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_NONFRAG_IPV6_TCP |
1407 : : RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_NONFRAG_IPV6_SCTP)))
1408 : : return true;
1409 : : }
1410 : :
1411 : : /* check invalid combination */
1412 [ # # ]: 0 : for (i = 0; i < RTE_DIM(invalid_rss_comb); i++) {
1413 [ # # ]: 0 : if (rte_popcount64(rss_type & invalid_rss_comb[i]) > 1)
1414 : : return true;
1415 : : }
1416 : :
1417 : : /* check invalid RSS attribute */
1418 [ # # ]: 0 : for (i = 0; i < RTE_DIM(rss_attr_to_valid_type); i++) {
1419 : : struct rss_attr_type *rat = &rss_attr_to_valid_type[i];
1420 : :
1421 [ # # # # ]: 0 : if (rat->attr & rss_type && !(rat->type & rss_type))
1422 : : return true;
1423 : : }
1424 : :
1425 : : /* check not allowed RSS type */
1426 : 0 : rss_type &= ~VALID_RSS_ATTR;
1427 : :
1428 : 0 : return ((rss_type & allow_rss_type) != rss_type);
1429 : : }
1430 : :
1431 : : static int
1432 : 0 : iavf_hash_parse_rss_type(struct iavf_pattern_match_item *match_item,
1433 : : const struct rte_flow_action_rss *rss,
1434 : : uint64_t pattern_hint, struct iavf_rss_meta *rss_meta,
1435 : : struct rte_flow_error *error)
1436 : : {
1437 : : uint64_t rss_type;
1438 : :
1439 : 0 : rss_meta->rss_algorithm = rss->func == RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ ?
1440 [ # # ]: 0 : VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC :
1441 : : VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
1442 : :
1443 : : /* If pattern type is raw, no need to refine rss type */
1444 [ # # ]: 0 : if (pattern_hint == IAVF_PHINT_RAW)
1445 : : return 0;
1446 : :
1447 : : /**
1448 : : * Check simultaneous use of SRC_ONLY and DST_ONLY
1449 : : * of the same level.
1450 : : */
1451 [ # # ]: 0 : rss_type = rte_eth_rss_hf_refine(rss->types);
1452 : :
1453 [ # # ]: 0 : if (iavf_any_invalid_rss_type(rss->func, rss_type, match_item->input_set_mask)) {
1454 : 0 : return rte_flow_error_set(error, ENOTSUP,
1455 : : RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss,
1456 : : "RSS type not supported");
1457 : : }
1458 : :
1459 : 0 : memcpy(&rss_meta->proto_hdrs, match_item->meta, sizeof(struct virtchnl_proto_hdrs));
1460 : :
1461 : 0 : iavf_refine_proto_hdrs(&rss_meta->proto_hdrs, rss_type, pattern_hint);
1462 : :
1463 : 0 : return 0;
1464 : : }
1465 : :
1466 : : static int
1467 : 0 : iavf_hash_parse_action_check(const struct ci_flow_actions *actions,
1468 : : const struct ci_flow_actions_check_param *param __rte_unused,
1469 : : struct rte_flow_error *error)
1470 : : {
1471 : 0 : const struct rte_flow_action_rss *rss = actions->actions[0]->conf;
1472 : :
1473 : : /* filter out unsupported RSS functions */
1474 [ # # ]: 0 : switch (rss->func) {
1475 : 0 : case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR:
1476 : : case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ_SORT:
1477 : 0 : return rte_flow_error_set(error, ENOTSUP,
1478 : : RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss,
1479 : : "Selected RSS hash function not supported");
1480 : : default:
1481 : : break;
1482 : : }
1483 : :
1484 [ # # ]: 0 : if (rss->level != 0) {
1485 : 0 : return rte_flow_error_set(error, ENOTSUP,
1486 : : RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss,
1487 : : "Nonzero RSS encapsulation level is not supported");
1488 : : }
1489 : :
1490 [ # # ]: 0 : if (rss->key_len != 0) {
1491 : 0 : return rte_flow_error_set(error, ENOTSUP,
1492 : : RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss,
1493 : : "RSS key is not supported");
1494 : : }
1495 : :
1496 [ # # ]: 0 : if (rss->queue_num != 0) {
1497 : 0 : return rte_flow_error_set(error, ENOTSUP,
1498 : : RTE_FLOW_ERROR_TYPE_ACTION_CONF, rss,
1499 : : "RSS queue region is not supported");
1500 : : }
1501 : :
1502 : : return 0;
1503 : : }
1504 : :
1505 : : static int
1506 : 0 : iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
1507 : : struct iavf_pattern_match_item *array,
1508 : : uint32_t array_len,
1509 : : const struct rte_flow_item pattern[],
1510 : : const struct rte_flow_action actions[],
1511 : : const struct rte_flow_attr *attr,
1512 : : void **meta,
1513 : : struct rte_flow_error *error)
1514 : : {
1515 : 0 : struct ci_flow_actions parsed_actions = {0};
1516 : 0 : struct ci_flow_actions_check_param param = {
1517 : 0 : .allowed_types = (enum rte_flow_action_type[]){
1518 : : RTE_FLOW_ACTION_TYPE_RSS,
1519 : : RTE_FLOW_ACTION_TYPE_END
1520 : : },
1521 : : .max_actions = 1,
1522 : : .driver_ctx = ad,
1523 : : .check = iavf_hash_parse_action_check,
1524 : : };
1525 : : const struct rte_flow_action_rss *rss;
1526 : : struct iavf_pattern_match_item *pattern_match_item;
1527 : : struct iavf_rss_meta *rss_meta_ptr;
1528 : 0 : uint64_t phint = IAVF_PHINT_NONE;
1529 : : int ret = 0;
1530 : :
1531 : 0 : ret = ci_flow_check_attr(attr, NULL, error);
1532 [ # # ]: 0 : if (ret)
1533 : : return ret;
1534 : :
1535 : 0 : ret = ci_flow_check_actions(actions, ¶m, &parsed_actions, error);
1536 [ # # ]: 0 : if (ret)
1537 : : return ret;
1538 : :
1539 : 0 : rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0);
1540 [ # # ]: 0 : if (!rss_meta_ptr) {
1541 : 0 : rte_flow_error_set(error, EINVAL,
1542 : : RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1543 : : "No memory for rss_meta_ptr");
1544 : 0 : return -ENOMEM;
1545 : : }
1546 : :
1547 : : /* Check rss supported pattern and find matched pattern. */
1548 : : pattern_match_item =
1549 : 0 : iavf_search_pattern_match_item(pattern, array, array_len,
1550 : : error);
1551 [ # # ]: 0 : if (!pattern_match_item) {
1552 : 0 : ret = -rte_errno;
1553 : 0 : goto error;
1554 : : }
1555 : :
1556 : 0 : ret = iavf_hash_parse_pattern(pattern, &phint, error);
1557 [ # # ]: 0 : if (ret)
1558 : 0 : goto error;
1559 : :
1560 [ # # ]: 0 : if (phint == IAVF_PHINT_RAW) {
1561 : 0 : rss_meta_ptr->raw_ena = true;
1562 : 0 : ret = iavf_hash_parse_raw_pattern(pattern, error, rss_meta_ptr);
1563 [ # # ]: 0 : if (ret) {
1564 : 0 : rte_flow_error_set(error, EINVAL,
1565 : : RTE_FLOW_ERROR_TYPE_ITEM, NULL,
1566 : : "Parse raw pattern failed");
1567 : 0 : goto error;
1568 : : }
1569 : : }
1570 : :
1571 : 0 : rss = parsed_actions.actions[0]->conf;
1572 : 0 : ret = iavf_hash_parse_rss_type(pattern_match_item, rss, phint, rss_meta_ptr, error);
1573 : :
1574 : 0 : error:
1575 [ # # ]: 0 : if (!ret && meta)
1576 : 0 : *meta = rss_meta_ptr;
1577 : : else
1578 : 0 : rte_free(rss_meta_ptr);
1579 : :
1580 : 0 : rte_free(pattern_match_item);
1581 : :
1582 : 0 : return ret;
1583 : : }
1584 : :
1585 : : static int
1586 : 0 : iavf_hash_create(__rte_unused struct iavf_adapter *ad,
1587 : : __rte_unused struct rte_flow *flow, void *meta,
1588 : : __rte_unused struct rte_flow_error *error)
1589 : : {
1590 : : struct iavf_rss_meta *rss_meta = (struct iavf_rss_meta *)meta;
1591 : : struct virtchnl_rss_cfg *rss_cfg;
1592 : : int ret = 0;
1593 : :
1594 : 0 : rss_cfg = rte_zmalloc("iavf rss rule",
1595 : : sizeof(struct virtchnl_rss_cfg), 0);
1596 [ # # ]: 0 : if (!rss_cfg) {
1597 : 0 : rte_flow_error_set(error, EINVAL,
1598 : : RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1599 : : "No memory for rss rule");
1600 : 0 : return -ENOMEM;
1601 : : }
1602 : :
1603 : 0 : rss_cfg->proto_hdrs = rss_meta->proto_hdrs;
1604 : 0 : rss_cfg->rss_algorithm = rss_meta->rss_algorithm;
1605 : :
1606 : 0 : ret = iavf_add_del_rss_cfg(ad, rss_cfg, true);
1607 [ # # ]: 0 : if (!ret) {
1608 : 0 : flow->rule = rss_cfg;
1609 : : } else {
1610 : 0 : PMD_DRV_LOG(ERR, "fail to add RSS configure");
1611 : 0 : rte_flow_error_set(error, -ret,
1612 : : RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1613 : : "Failed to add rss rule.");
1614 : 0 : rte_free(rss_cfg);
1615 : 0 : return -rte_errno;
1616 : : }
1617 : :
1618 : 0 : rte_free(meta);
1619 : :
1620 : 0 : return ret;
1621 : : }
1622 : :
1623 : : static int
1624 : 0 : iavf_hash_destroy(__rte_unused struct iavf_adapter *ad,
1625 : : struct rte_flow *flow,
1626 : : __rte_unused struct rte_flow_error *error)
1627 : : {
1628 : : struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
1629 : : struct virtchnl_rss_cfg *rss_cfg;
1630 : : int ret = 0;
1631 : :
1632 [ # # ]: 0 : if (vf->vf_reset)
1633 : : return 0;
1634 : :
1635 : 0 : rss_cfg = (struct virtchnl_rss_cfg *)flow->rule;
1636 : :
1637 : 0 : ret = iavf_add_del_rss_cfg(ad, rss_cfg, false);
1638 [ # # ]: 0 : if (ret) {
1639 : 0 : PMD_DRV_LOG(ERR, "fail to del RSS configure");
1640 : 0 : rte_flow_error_set(error, -ret,
1641 : : RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1642 : : "Failed to delete rss rule.");
1643 : 0 : return -rte_errno;
1644 : : }
1645 : : return ret;
1646 : : }
1647 : :
1648 : : static void
1649 : 0 : iavf_hash_uninit_parser(struct iavf_adapter *ad)
1650 : : {
1651 : 0 : iavf_unregister_parser(&iavf_hash_parser, ad);
1652 : 0 : }
1653 : :
1654 : : void
1655 : 0 : iavf_hash_uninit(struct iavf_adapter *ad)
1656 : : {
1657 : : struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
1658 : : struct rte_eth_rss_conf *rss_conf;
1659 : :
1660 [ # # ]: 0 : if (vf->vf_reset)
1661 : : return;
1662 : :
1663 [ # # ]: 0 : if (!vf->vf_res)
1664 : : return;
1665 : :
1666 [ # # ]: 0 : if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF))
1667 : : return;
1668 : :
1669 : 0 : rss_conf = &ad->dev_data->dev_conf.rx_adv_conf.rss_conf;
1670 [ # # ]: 0 : if (iavf_rss_hash_set(ad, rss_conf->rss_hf, false))
1671 : 0 : PMD_DRV_LOG(ERR, "fail to delete default RSS");
1672 : : }
1673 : :
1674 : : static void
1675 : 0 : iavf_hash_free(struct rte_flow *flow)
1676 : : {
1677 : 0 : rte_free(flow->rule);
1678 : 0 : }
|