xref: /dpdk/drivers/net/mlx5/mlx5_flow.h (revision d85c7b5ea59f0a6950ebb8de1f599fa405c815e7)
184c406e7SOri Kam /* SPDX-License-Identifier: BSD-3-Clause
284c406e7SOri Kam  * Copyright 2018 Mellanox Technologies, Ltd
384c406e7SOri Kam  */
484c406e7SOri Kam 
584c406e7SOri Kam #ifndef RTE_PMD_MLX5_FLOW_H_
684c406e7SOri Kam #define RTE_PMD_MLX5_FLOW_H_
784c406e7SOri Kam 
884c406e7SOri Kam #include <netinet/in.h>
984c406e7SOri Kam #include <sys/queue.h>
1084c406e7SOri Kam #include <stdalign.h>
1184c406e7SOri Kam #include <stdint.h>
1284c406e7SOri Kam #include <string.h>
1384c406e7SOri Kam 
1484c406e7SOri Kam /* Verbs header. */
1584c406e7SOri Kam /* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */
1684c406e7SOri Kam #ifdef PEDANTIC
1784c406e7SOri Kam #pragma GCC diagnostic ignored "-Wpedantic"
1884c406e7SOri Kam #endif
1984c406e7SOri Kam #include <infiniband/verbs.h>
2084c406e7SOri Kam #ifdef PEDANTIC
2184c406e7SOri Kam #pragma GCC diagnostic error "-Wpedantic"
2284c406e7SOri Kam #endif
2384c406e7SOri Kam 
24f15db67dSMatan Azrad #include <rte_atomic.h>
25f15db67dSMatan Azrad #include <rte_alarm.h>
26f15db67dSMatan Azrad 
27f5bf91deSMoti Haimovsky #include "mlx5.h"
28f5bf91deSMoti Haimovsky #include "mlx5_prm.h"
29f5bf91deSMoti Haimovsky 
3070d84dc7SOri Kam enum modify_reg {
3170d84dc7SOri Kam 	REG_A,
3270d84dc7SOri Kam 	REG_B,
3370d84dc7SOri Kam 	REG_C_0,
3470d84dc7SOri Kam 	REG_C_1,
3570d84dc7SOri Kam 	REG_C_2,
3670d84dc7SOri Kam 	REG_C_3,
3770d84dc7SOri Kam 	REG_C_4,
3870d84dc7SOri Kam 	REG_C_5,
3970d84dc7SOri Kam 	REG_C_6,
4070d84dc7SOri Kam 	REG_C_7,
4170d84dc7SOri Kam };
4270d84dc7SOri Kam 
4370d84dc7SOri Kam /* Private rte flow items. */
4470d84dc7SOri Kam enum mlx5_rte_flow_item_type {
4570d84dc7SOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_END = INT_MIN,
4670d84dc7SOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_TAG,
473c84f34eSOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_TX_QUEUE,
4870d84dc7SOri Kam };
4970d84dc7SOri Kam 
5070d84dc7SOri Kam /* Private rte flow actions. */
5170d84dc7SOri Kam enum mlx5_rte_flow_action_type {
5270d84dc7SOri Kam 	MLX5_RTE_FLOW_ACTION_TYPE_END = INT_MIN,
5370d84dc7SOri Kam 	MLX5_RTE_FLOW_ACTION_TYPE_TAG,
5470d84dc7SOri Kam };
5570d84dc7SOri Kam 
5670d84dc7SOri Kam /* Matches on selected register. */
5770d84dc7SOri Kam struct mlx5_rte_flow_item_tag {
5870d84dc7SOri Kam 	uint16_t id;
5970d84dc7SOri Kam 	rte_be32_t data;
6070d84dc7SOri Kam };
6170d84dc7SOri Kam 
6270d84dc7SOri Kam /* Modify selected register. */
6370d84dc7SOri Kam struct mlx5_rte_flow_action_set_tag {
6470d84dc7SOri Kam 	uint16_t id;
6570d84dc7SOri Kam 	rte_be32_t data;
6670d84dc7SOri Kam };
6770d84dc7SOri Kam 
683c84f34eSOri Kam /* Matches on source queue. */
693c84f34eSOri Kam struct mlx5_rte_flow_item_tx_queue {
703c84f34eSOri Kam 	uint32_t queue;
713c84f34eSOri Kam };
723c84f34eSOri Kam 
7384c406e7SOri Kam /* Pattern outer Layer bits. */
7484c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L2 (1u << 0)
7584c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3_IPV4 (1u << 1)
7684c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3_IPV6 (1u << 2)
7784c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4_UDP (1u << 3)
7884c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4_TCP (1u << 4)
7984c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_VLAN (1u << 5)
8084c406e7SOri Kam 
8184c406e7SOri Kam /* Pattern inner Layer bits. */
8284c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L2 (1u << 6)
8384c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3_IPV4 (1u << 7)
8484c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3_IPV6 (1u << 8)
8584c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4_UDP (1u << 9)
8684c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4_TCP (1u << 10)
8784c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_VLAN (1u << 11)
8884c406e7SOri Kam 
8984c406e7SOri Kam /* Pattern tunnel Layer bits. */
9084c406e7SOri Kam #define MLX5_FLOW_LAYER_VXLAN (1u << 12)
9184c406e7SOri Kam #define MLX5_FLOW_LAYER_VXLAN_GPE (1u << 13)
9284c406e7SOri Kam #define MLX5_FLOW_LAYER_GRE (1u << 14)
9384c406e7SOri Kam #define MLX5_FLOW_LAYER_MPLS (1u << 15)
94ea81c1b8SDekel Peled /* List of tunnel Layer bits continued below. */
9584c406e7SOri Kam 
966bd7fbd0SDekel Peled /* General pattern items bits. */
976bd7fbd0SDekel Peled #define MLX5_FLOW_ITEM_METADATA (1u << 16)
982e4c987aSOri Kam #define MLX5_FLOW_ITEM_PORT_ID (1u << 17)
9970d84dc7SOri Kam #define MLX5_FLOW_ITEM_TAG (1u << 18)
1006bd7fbd0SDekel Peled 
101d53aa89aSXiaoyu Min /* Pattern MISC bits. */
10270d84dc7SOri Kam #define MLX5_FLOW_LAYER_ICMP (1u << 19)
10370d84dc7SOri Kam #define MLX5_FLOW_LAYER_ICMP6 (1u << 20)
10470d84dc7SOri Kam #define MLX5_FLOW_LAYER_GRE_KEY (1u << 21)
105d53aa89aSXiaoyu Min 
106ea81c1b8SDekel Peled /* Pattern tunnel Layer bits (continued). */
1075e33bebdSXiaoyu Min #define MLX5_FLOW_LAYER_IPIP (1u << 21)
1085e33bebdSXiaoyu Min #define MLX5_FLOW_LAYER_IPV6_ENCAP (1u << 22)
109ea81c1b8SDekel Peled #define MLX5_FLOW_LAYER_NVGRE (1u << 23)
110e59a5dbcSMoti Haimovsky #define MLX5_FLOW_LAYER_GENEVE (1u << 24)
1115e33bebdSXiaoyu Min 
1123c84f34eSOri Kam /* Queue items. */
1133c84f34eSOri Kam #define MLX5_FLOW_ITEM_TX_QUEUE (1u << 25)
1143c84f34eSOri Kam 
11584c406e7SOri Kam /* Outer Masks. */
11684c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3 \
11784c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L3_IPV6)
11884c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4 \
11984c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L4_UDP | MLX5_FLOW_LAYER_OUTER_L4_TCP)
12084c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER \
12184c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_OUTER_L3 | \
12284c406e7SOri Kam 	 MLX5_FLOW_LAYER_OUTER_L4)
12384c406e7SOri Kam 
124940f0a1dSDekel Peled /* LRO support mask, i.e. flow contains IPv4/IPv6 and TCP. */
125940f0a1dSDekel Peled #define MLX5_FLOW_LAYER_IPV4_LRO \
126940f0a1dSDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L4_TCP)
127940f0a1dSDekel Peled #define MLX5_FLOW_LAYER_IPV6_LRO \
128940f0a1dSDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV6 | MLX5_FLOW_LAYER_OUTER_L4_TCP)
129940f0a1dSDekel Peled 
13084c406e7SOri Kam /* Tunnel Masks. */
13184c406e7SOri Kam #define MLX5_FLOW_LAYER_TUNNEL \
13284c406e7SOri Kam 	(MLX5_FLOW_LAYER_VXLAN | MLX5_FLOW_LAYER_VXLAN_GPE | \
133ea81c1b8SDekel Peled 	 MLX5_FLOW_LAYER_GRE | MLX5_FLOW_LAYER_NVGRE | MLX5_FLOW_LAYER_MPLS | \
134e59a5dbcSMoti Haimovsky 	 MLX5_FLOW_LAYER_IPIP | MLX5_FLOW_LAYER_IPV6_ENCAP | \
135e59a5dbcSMoti Haimovsky 	 MLX5_FLOW_LAYER_GENEVE)
13684c406e7SOri Kam 
13784c406e7SOri Kam /* Inner Masks. */
13884c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3 \
13984c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV6)
14084c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4 \
14184c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L4_UDP | MLX5_FLOW_LAYER_INNER_L4_TCP)
14284c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER \
14384c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L2 | MLX5_FLOW_LAYER_INNER_L3 | \
14484c406e7SOri Kam 	 MLX5_FLOW_LAYER_INNER_L4)
14584c406e7SOri Kam 
1464bb14c83SDekel Peled /* Layer Masks. */
1474bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L2 \
1484bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_INNER_L2)
1494bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV4 \
1504bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV4)
1514bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV6 \
1524bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV6 | MLX5_FLOW_LAYER_INNER_L3_IPV6)
1534bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3 \
1544bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_L3_IPV4 | MLX5_FLOW_LAYER_L3_IPV6)
1554bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L4 \
1564bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L4 | MLX5_FLOW_LAYER_INNER_L4)
1574bb14c83SDekel Peled 
15884c406e7SOri Kam /* Actions */
15984c406e7SOri Kam #define MLX5_FLOW_ACTION_DROP (1u << 0)
16084c406e7SOri Kam #define MLX5_FLOW_ACTION_QUEUE (1u << 1)
16184c406e7SOri Kam #define MLX5_FLOW_ACTION_RSS (1u << 2)
16284c406e7SOri Kam #define MLX5_FLOW_ACTION_FLAG (1u << 3)
16384c406e7SOri Kam #define MLX5_FLOW_ACTION_MARK (1u << 4)
16484c406e7SOri Kam #define MLX5_FLOW_ACTION_COUNT (1u << 5)
16557123c00SYongseok Koh #define MLX5_FLOW_ACTION_PORT_ID (1u << 6)
16657123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_POP_VLAN (1u << 7)
16757123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_PUSH_VLAN (1u << 8)
16857123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_SET_VLAN_VID (1u << 9)
16957123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_SET_VLAN_PCP (1u << 10)
1702ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV4_SRC (1u << 11)
1712ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV4_DST (1u << 12)
1722ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV6_SRC (1u << 13)
1732ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV6_DST (1u << 14)
1742ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TP_SRC (1u << 15)
1752ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TP_DST (1u << 16)
17631fda518SYongseok Koh #define MLX5_FLOW_ACTION_JUMP (1u << 17)
177a7cb5bcdSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TTL (1u << 18)
178a7cb5bcdSXiaoyu Min #define MLX5_FLOW_ACTION_DEC_TTL (1u << 19)
17976046778SXiaoyu Min #define MLX5_FLOW_ACTION_SET_MAC_SRC (1u << 20)
18076046778SXiaoyu Min #define MLX5_FLOW_ACTION_SET_MAC_DST (1u << 21)
18134d41b7aSDekel Peled #define MLX5_FLOW_ACTION_VXLAN_ENCAP (1u << 22)
18249d6465aSDekel Peled #define MLX5_FLOW_ACTION_VXLAN_DECAP (1u << 23)
183a124cff0SDekel Peled #define MLX5_FLOW_ACTION_NVGRE_ENCAP (1u << 24)
1844b8727f0SDekel Peled #define MLX5_FLOW_ACTION_NVGRE_DECAP (1u << 25)
1858ba9eee4SDekel Peled #define MLX5_FLOW_ACTION_RAW_ENCAP (1u << 26)
1868ba9eee4SDekel Peled #define MLX5_FLOW_ACTION_RAW_DECAP (1u << 27)
187585b99fbSDekel Peled #define MLX5_FLOW_ACTION_INC_TCP_SEQ (1u << 28)
188585b99fbSDekel Peled #define MLX5_FLOW_ACTION_DEC_TCP_SEQ (1u << 29)
189585b99fbSDekel Peled #define MLX5_FLOW_ACTION_INC_TCP_ACK (1u << 30)
190585b99fbSDekel Peled #define MLX5_FLOW_ACTION_DEC_TCP_ACK (1u << 31)
19170d84dc7SOri Kam #define MLX5_FLOW_ACTION_SET_TAG (1ull << 32)
19284c406e7SOri Kam 
19384c406e7SOri Kam #define MLX5_FLOW_FATE_ACTIONS \
194684b9a1bSOri Kam 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | \
195684b9a1bSOri Kam 	 MLX5_FLOW_ACTION_RSS | MLX5_FLOW_ACTION_JUMP)
19684c406e7SOri Kam 
1972e4c987aSOri Kam #define MLX5_FLOW_FATE_ESWITCH_ACTIONS \
1982e4c987aSOri Kam 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_PORT_ID | \
1992e4c987aSOri Kam 	 MLX5_FLOW_ACTION_JUMP)
2002e4c987aSOri Kam 
2018ba9eee4SDekel Peled #define MLX5_FLOW_ENCAP_ACTIONS	(MLX5_FLOW_ACTION_VXLAN_ENCAP | \
2028ba9eee4SDekel Peled 				 MLX5_FLOW_ACTION_NVGRE_ENCAP | \
2039aee7a84SMoti Haimovsky 				 MLX5_FLOW_ACTION_RAW_ENCAP | \
2049aee7a84SMoti Haimovsky 				 MLX5_FLOW_ACTION_OF_PUSH_VLAN)
205a124cff0SDekel Peled 
2068ba9eee4SDekel Peled #define MLX5_FLOW_DECAP_ACTIONS	(MLX5_FLOW_ACTION_VXLAN_DECAP | \
2078ba9eee4SDekel Peled 				 MLX5_FLOW_ACTION_NVGRE_DECAP | \
208b41e47daSMoti Haimovsky 				 MLX5_FLOW_ACTION_RAW_DECAP | \
209b41e47daSMoti Haimovsky 				 MLX5_FLOW_ACTION_OF_POP_VLAN)
2104b8727f0SDekel Peled 
2114bb14c83SDekel Peled #define MLX5_FLOW_MODIFY_HDR_ACTIONS (MLX5_FLOW_ACTION_SET_IPV4_SRC | \
2124bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV4_DST | \
2134bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV6_SRC | \
2144bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV6_DST | \
2154bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TP_SRC | \
2164bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TP_DST | \
2174bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TTL | \
2184bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_DEC_TTL | \
2194bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_MAC_SRC | \
220585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_SET_MAC_DST | \
221585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_INC_TCP_SEQ | \
222585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_DEC_TCP_SEQ | \
223585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_INC_TCP_ACK | \
2245f163d52SMoti Haimovsky 				      MLX5_FLOW_ACTION_DEC_TCP_ACK | \
22570d84dc7SOri Kam 				      MLX5_FLOW_ACTION_OF_SET_VLAN_VID | \
22670d84dc7SOri Kam 				      MLX5_FLOW_ACTION_SET_TAG)
2274bb14c83SDekel Peled 
2289aee7a84SMoti Haimovsky #define MLX5_FLOW_VLAN_ACTIONS (MLX5_FLOW_ACTION_OF_POP_VLAN | \
2299aee7a84SMoti Haimovsky 				MLX5_FLOW_ACTION_OF_PUSH_VLAN)
230b41e47daSMoti Haimovsky 
23184c406e7SOri Kam #ifndef IPPROTO_MPLS
23284c406e7SOri Kam #define IPPROTO_MPLS 137
23384c406e7SOri Kam #endif
23484c406e7SOri Kam 
235d1abe664SDekel Peled /* UDP port number for MPLS */
236d1abe664SDekel Peled #define MLX5_UDP_PORT_MPLS 6635
237d1abe664SDekel Peled 
238fc2c498cSOri Kam /* UDP port numbers for VxLAN. */
239fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN 4789
240fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN_GPE 4790
241fc2c498cSOri Kam 
242e59a5dbcSMoti Haimovsky /* UDP port numbers for GENEVE. */
243e59a5dbcSMoti Haimovsky #define MLX5_UDP_PORT_GENEVE 6081
244e59a5dbcSMoti Haimovsky 
24584c406e7SOri Kam /* Priority reserved for default flows. */
24684c406e7SOri Kam #define MLX5_FLOW_PRIO_RSVD ((uint32_t)-1)
24784c406e7SOri Kam 
24884c406e7SOri Kam /*
24984c406e7SOri Kam  * Number of sub priorities.
25084c406e7SOri Kam  * For each kind of pattern matching i.e. L2, L3, L4 to have a correct
25184c406e7SOri Kam  * matching on the NIC (firmware dependent) L4 most have the higher priority
25284c406e7SOri Kam  * followed by L3 and ending with L2.
25384c406e7SOri Kam  */
25484c406e7SOri Kam #define MLX5_PRIORITY_MAP_L2 2
25584c406e7SOri Kam #define MLX5_PRIORITY_MAP_L3 1
25684c406e7SOri Kam #define MLX5_PRIORITY_MAP_L4 0
25784c406e7SOri Kam #define MLX5_PRIORITY_MAP_MAX 3
25884c406e7SOri Kam 
259fc2c498cSOri Kam /* Valid layer type for IPV4 RSS. */
260fc2c498cSOri Kam #define MLX5_IPV4_LAYER_TYPES \
261fc2c498cSOri Kam 	(ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
262fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV4_UDP | \
263fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV4_OTHER)
264fc2c498cSOri Kam 
265fc2c498cSOri Kam /* IBV hash source bits  for IPV4. */
266fc2c498cSOri Kam #define MLX5_IPV4_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4)
267fc2c498cSOri Kam 
268fc2c498cSOri Kam /* Valid layer type for IPV6 RSS. */
269fc2c498cSOri Kam #define MLX5_IPV6_LAYER_TYPES \
270fc2c498cSOri Kam 	(ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | ETH_RSS_NONFRAG_IPV6_TCP | \
271fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_IPV6_EX  | ETH_RSS_IPV6_TCP_EX | \
272fc2c498cSOri Kam 	 ETH_RSS_IPV6_UDP_EX | ETH_RSS_NONFRAG_IPV6_OTHER)
273fc2c498cSOri Kam 
274fc2c498cSOri Kam /* IBV hash source bits  for IPV6. */
275fc2c498cSOri Kam #define MLX5_IPV6_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6)
276fc2c498cSOri Kam 
277e59a5dbcSMoti Haimovsky 
278e59a5dbcSMoti Haimovsky /* Geneve header first 16Bit */
279e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_MASK 0x3
280e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_SHIFT 14
281e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_VAL(a) \
282e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_VER_SHIFT)) & (MLX5_GENEVE_VER_MASK))
283e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_MASK 0x3F
284e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_SHIFT 7
285e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_VAL(a) \
286e59a5dbcSMoti Haimovsky 	    (((a) >> (MLX5_GENEVE_OPTLEN_SHIFT)) & (MLX5_GENEVE_OPTLEN_MASK))
287e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_MASK 0x1
288e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_SHIFT 7
289e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_VAL(a) \
290e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_OAMF_SHIFT)) & (MLX5_GENEVE_OAMF_MASK))
291e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_MASK 0x1
292e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_SHIFT 6
293e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_VAL(a) \
294e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_CRITO_SHIFT)) & (MLX5_GENEVE_CRITO_MASK))
295e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_MASK 0x3F
296e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_VAL(a) ((a) & (MLX5_GENEVE_RSVD_MASK))
297e59a5dbcSMoti Haimovsky /*
298e59a5dbcSMoti Haimovsky  * The length of the Geneve options fields, expressed in four byte multiples,
299e59a5dbcSMoti Haimovsky  * not including the eight byte fixed tunnel.
300e59a5dbcSMoti Haimovsky  */
301e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_0 14
302e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_1 63
303e59a5dbcSMoti Haimovsky 
3040c76d1c9SYongseok Koh enum mlx5_flow_drv_type {
3050c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_MIN,
3060c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_DV,
3070c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_VERBS,
3080c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_MAX,
3090c76d1c9SYongseok Koh };
3100c76d1c9SYongseok Koh 
311865a0c15SOri Kam /* Matcher PRM representation */
312865a0c15SOri Kam struct mlx5_flow_dv_match_params {
313865a0c15SOri Kam 	size_t size;
314865a0c15SOri Kam 	/**< Size of match value. Do NOT split size and key! */
315865a0c15SOri Kam 	uint32_t buf[MLX5_ST_SZ_DW(fte_match_param)];
316865a0c15SOri Kam 	/**< Matcher value. This value is used as the mask or as a key. */
317865a0c15SOri Kam };
318865a0c15SOri Kam 
319865a0c15SOri Kam /* Matcher structure. */
320865a0c15SOri Kam struct mlx5_flow_dv_matcher {
321865a0c15SOri Kam 	LIST_ENTRY(mlx5_flow_dv_matcher) next;
322865a0c15SOri Kam 	/* Pointer to the next element. */
323865a0c15SOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
324865a0c15SOri Kam 	void *matcher_object; /**< Pointer to DV matcher */
325865a0c15SOri Kam 	uint16_t crc; /**< CRC of key. */
326865a0c15SOri Kam 	uint16_t priority; /**< Priority of matcher. */
327865a0c15SOri Kam 	uint8_t egress; /**< Egress matcher. */
328c14995c5SOri Kam 	uint8_t transfer; /**< 1 if the flow is E-Switch flow. */
3294f84a197SOri Kam 	uint32_t group; /**< The matcher group. */
330865a0c15SOri Kam 	struct mlx5_flow_dv_match_params mask; /**< Matcher mask. */
331865a0c15SOri Kam };
332865a0c15SOri Kam 
3334bb14c83SDekel Peled #define MLX5_ENCAP_MAX_LEN 132
3344bb14c83SDekel Peled 
335c513f05cSDekel Peled /* Encap/decap resource structure. */
336c513f05cSDekel Peled struct mlx5_flow_dv_encap_decap_resource {
337c513f05cSDekel Peled 	LIST_ENTRY(mlx5_flow_dv_encap_decap_resource) next;
338c513f05cSDekel Peled 	/* Pointer to next element. */
339c513f05cSDekel Peled 	rte_atomic32_t refcnt; /**< Reference counter. */
340cbb66daaSOri Kam 	void *verbs_action;
341c513f05cSDekel Peled 	/**< Verbs encap/decap action object. */
342c513f05cSDekel Peled 	uint8_t buf[MLX5_ENCAP_MAX_LEN];
343c513f05cSDekel Peled 	size_t size;
344c513f05cSDekel Peled 	uint8_t reformat_type;
345c513f05cSDekel Peled 	uint8_t ft_type;
3464f84a197SOri Kam 	uint64_t flags; /**< Flags for RDMA API. */
347c513f05cSDekel Peled };
348c513f05cSDekel Peled 
349cbb66daaSOri Kam /* Tag resource structure. */
350cbb66daaSOri Kam struct mlx5_flow_dv_tag_resource {
351cbb66daaSOri Kam 	LIST_ENTRY(mlx5_flow_dv_tag_resource) next;
352cbb66daaSOri Kam 	/* Pointer to next element. */
353cbb66daaSOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
354cbb66daaSOri Kam 	void *action;
355cbb66daaSOri Kam 	/**< Verbs tag action object. */
356cbb66daaSOri Kam 	uint32_t tag; /**< the tag value. */
357cbb66daaSOri Kam };
358cbb66daaSOri Kam 
3594bb14c83SDekel Peled /* Number of modification commands. */
3604bb14c83SDekel Peled #define MLX5_MODIFY_NUM 8
3614bb14c83SDekel Peled 
3624bb14c83SDekel Peled /* Modify resource structure */
3634bb14c83SDekel Peled struct mlx5_flow_dv_modify_hdr_resource {
3644bb14c83SDekel Peled 	LIST_ENTRY(mlx5_flow_dv_modify_hdr_resource) next;
3654bb14c83SDekel Peled 	/* Pointer to next element. */
3664bb14c83SDekel Peled 	rte_atomic32_t refcnt; /**< Reference counter. */
3674bb14c83SDekel Peled 	struct ibv_flow_action *verbs_action;
3684bb14c83SDekel Peled 	/**< Verbs modify header action object. */
3694bb14c83SDekel Peled 	uint8_t ft_type; /**< Flow table type, Rx or Tx. */
3704bb14c83SDekel Peled 	uint32_t actions_num; /**< Number of modification actions. */
3714bb14c83SDekel Peled 	struct mlx5_modification_cmd actions[MLX5_MODIFY_NUM];
3724bb14c83SDekel Peled 	/**< Modification actions. */
37379e7ba1fSOri Kam 	uint64_t flags; /**< Flags for RDMA API. */
3744bb14c83SDekel Peled };
3754bb14c83SDekel Peled 
376684b9a1bSOri Kam /* Jump action resource structure. */
377684b9a1bSOri Kam struct mlx5_flow_dv_jump_tbl_resource {
378684b9a1bSOri Kam 	LIST_ENTRY(mlx5_flow_dv_jump_tbl_resource) next;
379684b9a1bSOri Kam 	/* Pointer to next element. */
380684b9a1bSOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
381684b9a1bSOri Kam 	void *action; /**< Pointer to the rdma core action. */
382684b9a1bSOri Kam 	uint8_t ft_type; /**< Flow table type, Rx or Tx. */
383684b9a1bSOri Kam 	struct mlx5_flow_tbl_resource *tbl; /**< The target table. */
384684b9a1bSOri Kam };
385684b9a1bSOri Kam 
386c269b517SOri Kam /* Port ID resource structure. */
387c269b517SOri Kam struct mlx5_flow_dv_port_id_action_resource {
388c269b517SOri Kam 	LIST_ENTRY(mlx5_flow_dv_port_id_action_resource) next;
389c269b517SOri Kam 	/* Pointer to next element. */
390c269b517SOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
391c269b517SOri Kam 	void *action;
392c269b517SOri Kam 	/**< Verbs tag action object. */
393c269b517SOri Kam 	uint32_t port_id; /**< Port ID value. */
394c269b517SOri Kam };
395c269b517SOri Kam 
3969aee7a84SMoti Haimovsky /* Push VLAN action resource structure */
3979aee7a84SMoti Haimovsky struct mlx5_flow_dv_push_vlan_action_resource {
3989aee7a84SMoti Haimovsky 	LIST_ENTRY(mlx5_flow_dv_push_vlan_action_resource) next;
3999aee7a84SMoti Haimovsky 	/* Pointer to next element. */
4009aee7a84SMoti Haimovsky 	rte_atomic32_t refcnt; /**< Reference counter. */
4019aee7a84SMoti Haimovsky 	void *action; /**< Direct verbs action object. */
4029aee7a84SMoti Haimovsky 	uint8_t ft_type; /**< Flow table type, Rx, Tx or FDB. */
4039aee7a84SMoti Haimovsky 	rte_be32_t vlan_tag; /**< VLAN tag value. */
4049aee7a84SMoti Haimovsky };
4059aee7a84SMoti Haimovsky 
4064bb14c83SDekel Peled /*
4074bb14c83SDekel Peled  * Max number of actions per DV flow.
4084bb14c83SDekel Peled  * See CREATE_FLOW_MAX_FLOW_ACTIONS_SUPPORTED
4094bb14c83SDekel Peled  * In rdma-core file providers/mlx5/verbs.c
4104bb14c83SDekel Peled  */
4114bb14c83SDekel Peled #define MLX5_DV_MAX_NUMBER_OF_ACTIONS 8
4124bb14c83SDekel Peled 
413865a0c15SOri Kam /* DV flows structure. */
414865a0c15SOri Kam struct mlx5_flow_dv {
415865a0c15SOri Kam 	uint64_t hash_fields; /**< Fields that participate in the hash. */
416865a0c15SOri Kam 	struct mlx5_hrxq *hrxq; /**< Hash Rx queues. */
417865a0c15SOri Kam 	/* Flow DV api: */
418865a0c15SOri Kam 	struct mlx5_flow_dv_matcher *matcher; /**< Cache to matcher. */
419865a0c15SOri Kam 	struct mlx5_flow_dv_match_params value;
420865a0c15SOri Kam 	/**< Holds the value that the packet is compared to. */
421c513f05cSDekel Peled 	struct mlx5_flow_dv_encap_decap_resource *encap_decap;
422c513f05cSDekel Peled 	/**< Pointer to encap/decap resource in cache. */
4234bb14c83SDekel Peled 	struct mlx5_flow_dv_modify_hdr_resource *modify_hdr;
4244bb14c83SDekel Peled 	/**< Pointer to modify header resource in cache. */
425865a0c15SOri Kam 	struct ibv_flow *flow; /**< Installed flow. */
426684b9a1bSOri Kam 	struct mlx5_flow_dv_jump_tbl_resource *jump;
427684b9a1bSOri Kam 	/**< Pointer to the jump action resource. */
428c269b517SOri Kam 	struct mlx5_flow_dv_port_id_action_resource *port_id_action;
429c269b517SOri Kam 	/**< Pointer to port ID action resource. */
430dfedf3e3SViacheslav Ovsiienko 	struct mlx5_vf_vlan vf_vlan;
431dfedf3e3SViacheslav Ovsiienko 	/**< Structure for VF VLAN workaround. */
4329aee7a84SMoti Haimovsky 	struct mlx5_flow_dv_push_vlan_action_resource *push_vlan_res;
4339aee7a84SMoti Haimovsky 	/**< Pointer to push VLAN action resource in cache. */
434d02cb069SOri Kam #ifdef HAVE_IBV_FLOW_DV_SUPPORT
435cbb66daaSOri Kam 	void *actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS];
436d02cb069SOri Kam 	/**< Action list. */
437d02cb069SOri Kam #endif
438d02cb069SOri Kam 	int actions_n; /**< number of actions. */
439865a0c15SOri Kam };
440865a0c15SOri Kam 
44184c406e7SOri Kam /* Verbs specification header. */
44284c406e7SOri Kam struct ibv_spec_header {
44384c406e7SOri Kam 	enum ibv_flow_spec_type type;
44484c406e7SOri Kam 	uint16_t size;
44584c406e7SOri Kam };
44684c406e7SOri Kam 
44784c406e7SOri Kam /** Handles information leading to a drop fate. */
44884c406e7SOri Kam struct mlx5_flow_verbs {
44984c406e7SOri Kam 	LIST_ENTRY(mlx5_flow_verbs) next;
45084c406e7SOri Kam 	unsigned int size; /**< Size of the attribute. */
45184c406e7SOri Kam 	struct {
45284c406e7SOri Kam 		struct ibv_flow_attr *attr;
45384c406e7SOri Kam 		/**< Pointer to the Specification buffer. */
45484c406e7SOri Kam 		uint8_t *specs; /**< Pointer to the specifications. */
45584c406e7SOri Kam 	};
45684c406e7SOri Kam 	struct ibv_flow *flow; /**< Verbs flow pointer. */
45784c406e7SOri Kam 	struct mlx5_hrxq *hrxq; /**< Hash Rx queue object. */
45884c406e7SOri Kam 	uint64_t hash_fields; /**< Verbs hash Rx queue hash fields. */
459dfedf3e3SViacheslav Ovsiienko 	struct mlx5_vf_vlan vf_vlan;
460dfedf3e3SViacheslav Ovsiienko 	/**< Structure for VF VLAN workaround. */
46184c406e7SOri Kam };
46284c406e7SOri Kam 
46384c406e7SOri Kam /** Device flow structure. */
46484c406e7SOri Kam struct mlx5_flow {
46584c406e7SOri Kam 	LIST_ENTRY(mlx5_flow) next;
46684c406e7SOri Kam 	struct rte_flow *flow; /**< Pointer to the main flow. */
4670ddd1143SYongseok Koh 	uint64_t layers;
46824663641SYongseok Koh 	/**< Bit-fields of present layers, see MLX5_FLOW_LAYER_*. */
469*d85c7b5eSOri Kam 	uint64_t actions;
470*d85c7b5eSOri Kam 	/**< Bit-fields of detected actions, see MLX5_FLOW_ACTION_*. */
47184c406e7SOri Kam 	union {
472c4d9b9f7SOri Kam #ifdef HAVE_IBV_FLOW_DV_SUPPORT
473865a0c15SOri Kam 		struct mlx5_flow_dv dv;
474c4d9b9f7SOri Kam #endif
475865a0c15SOri Kam 		struct mlx5_flow_verbs verbs;
47684c406e7SOri Kam 	};
477b67b4ecbSDekel Peled 	bool external; /**< true if the flow is created external to PMD. */
47884c406e7SOri Kam };
47984c406e7SOri Kam 
48084c406e7SOri Kam /* Flow structure. */
48184c406e7SOri Kam struct rte_flow {
48284c406e7SOri Kam 	TAILQ_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. */
4834f84a197SOri Kam 	enum mlx5_flow_drv_type drv_type; /**< Driver type. */
48484c406e7SOri Kam 	struct mlx5_flow_counter *counter; /**< Holds flow counter. */
485cbb66daaSOri Kam 	struct mlx5_flow_dv_tag_resource *tag_resource;
486cbb66daaSOri Kam 	/**< pointer to the tag action. */
48784c406e7SOri Kam 	struct rte_flow_action_rss rss;/**< RSS context. */
48884c406e7SOri Kam 	uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */
48984c406e7SOri Kam 	uint16_t (*queue)[]; /**< Destination queues to redirect traffic to. */
49084c406e7SOri Kam 	LIST_HEAD(dev_flows, mlx5_flow) dev_flows;
49184c406e7SOri Kam 	/**< Device flows that are part of the flow. */
4922720f833SYongseok Koh 	struct mlx5_fdir *fdir; /**< Pointer to associated FDIR if any. */
4934f84a197SOri Kam 	uint8_t ingress; /**< 1 if the flow is ingress. */
4944f84a197SOri Kam 	uint32_t group; /**< The group index. */
495c14995c5SOri Kam 	uint8_t transfer; /**< 1 if the flow is E-Switch flow. */
496*d85c7b5eSOri Kam 	uint32_t hairpin_flow_id; /**< The flow id used for hairpin. */
49784c406e7SOri Kam };
4982720f833SYongseok Koh 
49984c406e7SOri Kam typedef int (*mlx5_flow_validate_t)(struct rte_eth_dev *dev,
50084c406e7SOri Kam 				    const struct rte_flow_attr *attr,
50184c406e7SOri Kam 				    const struct rte_flow_item items[],
50284c406e7SOri Kam 				    const struct rte_flow_action actions[],
503b67b4ecbSDekel Peled 				    bool external,
50484c406e7SOri Kam 				    struct rte_flow_error *error);
50584c406e7SOri Kam typedef struct mlx5_flow *(*mlx5_flow_prepare_t)
50684c406e7SOri Kam 	(const struct rte_flow_attr *attr, const struct rte_flow_item items[],
507c1cfb132SYongseok Koh 	 const struct rte_flow_action actions[], struct rte_flow_error *error);
50884c406e7SOri Kam typedef int (*mlx5_flow_translate_t)(struct rte_eth_dev *dev,
50984c406e7SOri Kam 				     struct mlx5_flow *dev_flow,
51084c406e7SOri Kam 				     const struct rte_flow_attr *attr,
51184c406e7SOri Kam 				     const struct rte_flow_item items[],
51284c406e7SOri Kam 				     const struct rte_flow_action actions[],
51384c406e7SOri Kam 				     struct rte_flow_error *error);
51484c406e7SOri Kam typedef int (*mlx5_flow_apply_t)(struct rte_eth_dev *dev, struct rte_flow *flow,
51584c406e7SOri Kam 				 struct rte_flow_error *error);
51684c406e7SOri Kam typedef void (*mlx5_flow_remove_t)(struct rte_eth_dev *dev,
51784c406e7SOri Kam 				   struct rte_flow *flow);
51884c406e7SOri Kam typedef void (*mlx5_flow_destroy_t)(struct rte_eth_dev *dev,
51984c406e7SOri Kam 				    struct rte_flow *flow);
520684dafe7SMoti Haimovsky typedef int (*mlx5_flow_query_t)(struct rte_eth_dev *dev,
521684dafe7SMoti Haimovsky 				 struct rte_flow *flow,
522684dafe7SMoti Haimovsky 				 const struct rte_flow_action *actions,
523684dafe7SMoti Haimovsky 				 void *data,
524684dafe7SMoti Haimovsky 				 struct rte_flow_error *error);
52584c406e7SOri Kam struct mlx5_flow_driver_ops {
52684c406e7SOri Kam 	mlx5_flow_validate_t validate;
52784c406e7SOri Kam 	mlx5_flow_prepare_t prepare;
52884c406e7SOri Kam 	mlx5_flow_translate_t translate;
52984c406e7SOri Kam 	mlx5_flow_apply_t apply;
53084c406e7SOri Kam 	mlx5_flow_remove_t remove;
53184c406e7SOri Kam 	mlx5_flow_destroy_t destroy;
532684dafe7SMoti Haimovsky 	mlx5_flow_query_t query;
53384c406e7SOri Kam };
53484c406e7SOri Kam 
535f15db67dSMatan Azrad #define MLX5_CNT_CONTAINER(sh, batch, thread) (&(sh)->cmng.ccont \
536f15db67dSMatan Azrad 	[(((sh)->cmng.mhi[batch] >> (thread)) & 0x1) * 2 + (batch)])
537f15db67dSMatan Azrad #define MLX5_CNT_CONTAINER_UNUSED(sh, batch, thread) (&(sh)->cmng.ccont \
538f15db67dSMatan Azrad 	[(~((sh)->cmng.mhi[batch] >> (thread)) & 0x1) * 2 + (batch)])
539f15db67dSMatan Azrad 
54084c406e7SOri Kam /* mlx5_flow.c */
54184c406e7SOri Kam 
542830d2091SOri Kam struct mlx5_flow_id_pool *mlx5_flow_id_pool_alloc(void);
543830d2091SOri Kam void mlx5_flow_id_pool_release(struct mlx5_flow_id_pool *pool);
544830d2091SOri Kam uint32_t mlx5_flow_id_get(struct mlx5_flow_id_pool *pool, uint32_t *id);
545830d2091SOri Kam uint32_t mlx5_flow_id_release(struct mlx5_flow_id_pool *pool,
546830d2091SOri Kam 			      uint32_t id);
547b67b4ecbSDekel Peled int mlx5_flow_group_to_table(const struct rte_flow_attr *attributes,
548b67b4ecbSDekel Peled 			     bool external, uint32_t group, uint32_t *table,
549b67b4ecbSDekel Peled 			     struct rte_flow_error *error);
550fc2c498cSOri Kam uint64_t mlx5_flow_hashfields_adjust(struct mlx5_flow *dev_flow, int tunnel,
5510ddd1143SYongseok Koh 				     uint64_t layer_types,
552fc2c498cSOri Kam 				     uint64_t hash_fields);
55384c406e7SOri Kam uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
55484c406e7SOri Kam 				   uint32_t subpriority);
555e4fcdcd6SMoti Haimovsky const struct rte_flow_action *mlx5_flow_find_action
556e4fcdcd6SMoti Haimovsky 					(const struct rte_flow_action *actions,
557e4fcdcd6SMoti Haimovsky 					 enum rte_flow_action_type action);
55884c406e7SOri Kam int mlx5_flow_validate_action_count(struct rte_eth_dev *dev,
5593e9fa079SDekel Peled 				    const struct rte_flow_attr *attr,
56084c406e7SOri Kam 				    struct rte_flow_error *error);
56184c406e7SOri Kam int mlx5_flow_validate_action_drop(uint64_t action_flags,
5623e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
56384c406e7SOri Kam 				   struct rte_flow_error *error);
56484c406e7SOri Kam int mlx5_flow_validate_action_flag(uint64_t action_flags,
5653e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
56684c406e7SOri Kam 				   struct rte_flow_error *error);
56784c406e7SOri Kam int mlx5_flow_validate_action_mark(const struct rte_flow_action *action,
56884c406e7SOri Kam 				   uint64_t action_flags,
5693e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
57084c406e7SOri Kam 				   struct rte_flow_error *error);
57184c406e7SOri Kam int mlx5_flow_validate_action_queue(const struct rte_flow_action *action,
57284c406e7SOri Kam 				    uint64_t action_flags,
57384c406e7SOri Kam 				    struct rte_eth_dev *dev,
5743e9fa079SDekel Peled 				    const struct rte_flow_attr *attr,
57584c406e7SOri Kam 				    struct rte_flow_error *error);
57684c406e7SOri Kam int mlx5_flow_validate_action_rss(const struct rte_flow_action *action,
57784c406e7SOri Kam 				  uint64_t action_flags,
57884c406e7SOri Kam 				  struct rte_eth_dev *dev,
5793e9fa079SDekel Peled 				  const struct rte_flow_attr *attr,
5801183f12fSOri Kam 				  uint64_t item_flags,
58184c406e7SOri Kam 				  struct rte_flow_error *error);
58284c406e7SOri Kam int mlx5_flow_validate_attributes(struct rte_eth_dev *dev,
58384c406e7SOri Kam 				  const struct rte_flow_attr *attributes,
58484c406e7SOri Kam 				  struct rte_flow_error *error);
5856bd7fbd0SDekel Peled int mlx5_flow_item_acceptable(const struct rte_flow_item *item,
5866bd7fbd0SDekel Peled 			      const uint8_t *mask,
5876bd7fbd0SDekel Peled 			      const uint8_t *nic_mask,
5886bd7fbd0SDekel Peled 			      unsigned int size,
5896bd7fbd0SDekel Peled 			      struct rte_flow_error *error);
59084c406e7SOri Kam int mlx5_flow_validate_item_eth(const struct rte_flow_item *item,
59184c406e7SOri Kam 				uint64_t item_flags,
59284c406e7SOri Kam 				struct rte_flow_error *error);
59384c406e7SOri Kam int mlx5_flow_validate_item_gre(const struct rte_flow_item *item,
59484c406e7SOri Kam 				uint64_t item_flags,
59584c406e7SOri Kam 				uint8_t target_protocol,
59684c406e7SOri Kam 				struct rte_flow_error *error);
597a7a03655SXiaoyu Min int mlx5_flow_validate_item_gre_key(const struct rte_flow_item *item,
598a7a03655SXiaoyu Min 				    uint64_t item_flags,
599a7a03655SXiaoyu Min 				    const struct rte_flow_item *gre_item,
600a7a03655SXiaoyu Min 				    struct rte_flow_error *error);
60184c406e7SOri Kam int mlx5_flow_validate_item_ipv4(const struct rte_flow_item *item,
602ed4c5247SShahaf Shuler 				 uint64_t item_flags,
60355c61fa7SViacheslav Ovsiienko 				 const struct rte_flow_item_ipv4 *acc_mask,
60484c406e7SOri Kam 				 struct rte_flow_error *error);
60584c406e7SOri Kam int mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item,
60684c406e7SOri Kam 				 uint64_t item_flags,
60755c61fa7SViacheslav Ovsiienko 				 const struct rte_flow_item_ipv6 *acc_mask,
60884c406e7SOri Kam 				 struct rte_flow_error *error);
60938f7efaaSDekel Peled int mlx5_flow_validate_item_mpls(struct rte_eth_dev *dev,
61038f7efaaSDekel Peled 				 const struct rte_flow_item *item,
61184c406e7SOri Kam 				 uint64_t item_flags,
61238f7efaaSDekel Peled 				 uint64_t prev_layer,
61384c406e7SOri Kam 				 struct rte_flow_error *error);
61484c406e7SOri Kam int mlx5_flow_validate_item_tcp(const struct rte_flow_item *item,
61584c406e7SOri Kam 				uint64_t item_flags,
61684c406e7SOri Kam 				uint8_t target_protocol,
61792378c2bSMoti Haimovsky 				const struct rte_flow_item_tcp *flow_mask,
61884c406e7SOri Kam 				struct rte_flow_error *error);
61984c406e7SOri Kam int mlx5_flow_validate_item_udp(const struct rte_flow_item *item,
62084c406e7SOri Kam 				uint64_t item_flags,
62184c406e7SOri Kam 				uint8_t target_protocol,
62284c406e7SOri Kam 				struct rte_flow_error *error);
62384c406e7SOri Kam int mlx5_flow_validate_item_vlan(const struct rte_flow_item *item,
624ed4c5247SShahaf Shuler 				 uint64_t item_flags,
625dfedf3e3SViacheslav Ovsiienko 				 struct rte_eth_dev *dev,
62684c406e7SOri Kam 				 struct rte_flow_error *error);
62784c406e7SOri Kam int mlx5_flow_validate_item_vxlan(const struct rte_flow_item *item,
62884c406e7SOri Kam 				  uint64_t item_flags,
62984c406e7SOri Kam 				  struct rte_flow_error *error);
63084c406e7SOri Kam int mlx5_flow_validate_item_vxlan_gpe(const struct rte_flow_item *item,
63184c406e7SOri Kam 				      uint64_t item_flags,
63284c406e7SOri Kam 				      struct rte_eth_dev *dev,
63384c406e7SOri Kam 				      struct rte_flow_error *error);
634d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp(const struct rte_flow_item *item,
635d53aa89aSXiaoyu Min 				 uint64_t item_flags,
636d53aa89aSXiaoyu Min 				 uint8_t target_protocol,
637d53aa89aSXiaoyu Min 				 struct rte_flow_error *error);
638d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp6(const struct rte_flow_item *item,
639d53aa89aSXiaoyu Min 				   uint64_t item_flags,
640d53aa89aSXiaoyu Min 				   uint8_t target_protocol,
641d53aa89aSXiaoyu Min 				   struct rte_flow_error *error);
642ea81c1b8SDekel Peled int mlx5_flow_validate_item_nvgre(const struct rte_flow_item *item,
643ea81c1b8SDekel Peled 				  uint64_t item_flags,
644ea81c1b8SDekel Peled 				  uint8_t target_protocol,
645ea81c1b8SDekel Peled 				  struct rte_flow_error *error);
646e59a5dbcSMoti Haimovsky int mlx5_flow_validate_item_geneve(const struct rte_flow_item *item,
647e59a5dbcSMoti Haimovsky 				   uint64_t item_flags,
648e59a5dbcSMoti Haimovsky 				   struct rte_eth_dev *dev,
649e59a5dbcSMoti Haimovsky 				   struct rte_flow_error *error);
65084c406e7SOri Kam #endif /* RTE_PMD_MLX5_FLOW_H_ */
651