xref: /dpdk/drivers/net/mlx5/mlx5_flow.h (revision 72a944dba1639fff11f74c5ae1ab7d622bcc39fd)
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>
263bd26b23SSuanming Mou #include <rte_mtr.h>
27f15db67dSMatan Azrad 
287b4f1e6bSMatan Azrad #include <mlx5_prm.h>
297b4f1e6bSMatan Azrad 
30f5bf91deSMoti Haimovsky #include "mlx5.h"
31f5bf91deSMoti Haimovsky 
3270d84dc7SOri Kam /* Private rte flow items. */
3370d84dc7SOri Kam enum mlx5_rte_flow_item_type {
3470d84dc7SOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_END = INT_MIN,
3570d84dc7SOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_TAG,
363c84f34eSOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_TX_QUEUE,
3750f576d6SSuanming Mou 	MLX5_RTE_FLOW_ITEM_TYPE_VLAN,
3870d84dc7SOri Kam };
3970d84dc7SOri Kam 
40baf516beSViacheslav Ovsiienko /* Private (internal) rte flow actions. */
4170d84dc7SOri Kam enum mlx5_rte_flow_action_type {
4270d84dc7SOri Kam 	MLX5_RTE_FLOW_ACTION_TYPE_END = INT_MIN,
4370d84dc7SOri Kam 	MLX5_RTE_FLOW_ACTION_TYPE_TAG,
44dd3c774fSViacheslav Ovsiienko 	MLX5_RTE_FLOW_ACTION_TYPE_MARK,
45baf516beSViacheslav Ovsiienko 	MLX5_RTE_FLOW_ACTION_TYPE_COPY_MREG,
4670d84dc7SOri Kam };
4770d84dc7SOri Kam 
4870d84dc7SOri Kam /* Matches on selected register. */
4970d84dc7SOri Kam struct mlx5_rte_flow_item_tag {
50baf516beSViacheslav Ovsiienko 	enum modify_reg id;
51cff811c7SViacheslav Ovsiienko 	uint32_t data;
5270d84dc7SOri Kam };
5370d84dc7SOri Kam 
5470d84dc7SOri Kam /* Modify selected register. */
5570d84dc7SOri Kam struct mlx5_rte_flow_action_set_tag {
56baf516beSViacheslav Ovsiienko 	enum modify_reg id;
57cff811c7SViacheslav Ovsiienko 	uint32_t data;
5870d84dc7SOri Kam };
5970d84dc7SOri Kam 
60baf516beSViacheslav Ovsiienko struct mlx5_flow_action_copy_mreg {
61baf516beSViacheslav Ovsiienko 	enum modify_reg dst;
62baf516beSViacheslav Ovsiienko 	enum modify_reg src;
63baf516beSViacheslav Ovsiienko };
64baf516beSViacheslav Ovsiienko 
653c84f34eSOri Kam /* Matches on source queue. */
663c84f34eSOri Kam struct mlx5_rte_flow_item_tx_queue {
673c84f34eSOri Kam 	uint32_t queue;
683c84f34eSOri Kam };
693c84f34eSOri Kam 
703e8edd0eSViacheslav Ovsiienko /* Feature name to allocate metadata register. */
713e8edd0eSViacheslav Ovsiienko enum mlx5_feature_name {
723e8edd0eSViacheslav Ovsiienko 	MLX5_HAIRPIN_RX,
733e8edd0eSViacheslav Ovsiienko 	MLX5_HAIRPIN_TX,
743e8edd0eSViacheslav Ovsiienko 	MLX5_METADATA_RX,
753e8edd0eSViacheslav Ovsiienko 	MLX5_METADATA_TX,
763e8edd0eSViacheslav Ovsiienko 	MLX5_METADATA_FDB,
773e8edd0eSViacheslav Ovsiienko 	MLX5_FLOW_MARK,
783e8edd0eSViacheslav Ovsiienko 	MLX5_APP_TAG,
793e8edd0eSViacheslav Ovsiienko 	MLX5_COPY_MARK,
8027efd5deSSuanming Mou 	MLX5_MTR_COLOR,
8127efd5deSSuanming Mou 	MLX5_MTR_SFX,
823e8edd0eSViacheslav Ovsiienko };
833e8edd0eSViacheslav Ovsiienko 
8484c406e7SOri Kam /* Pattern outer Layer bits. */
8584c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L2 (1u << 0)
8684c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3_IPV4 (1u << 1)
8784c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3_IPV6 (1u << 2)
8884c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4_UDP (1u << 3)
8984c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4_TCP (1u << 4)
9084c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_VLAN (1u << 5)
9184c406e7SOri Kam 
9284c406e7SOri Kam /* Pattern inner Layer bits. */
9384c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L2 (1u << 6)
9484c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3_IPV4 (1u << 7)
9584c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3_IPV6 (1u << 8)
9684c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4_UDP (1u << 9)
9784c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4_TCP (1u << 10)
9884c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_VLAN (1u << 11)
9984c406e7SOri Kam 
10084c406e7SOri Kam /* Pattern tunnel Layer bits. */
10184c406e7SOri Kam #define MLX5_FLOW_LAYER_VXLAN (1u << 12)
10284c406e7SOri Kam #define MLX5_FLOW_LAYER_VXLAN_GPE (1u << 13)
10384c406e7SOri Kam #define MLX5_FLOW_LAYER_GRE (1u << 14)
10484c406e7SOri Kam #define MLX5_FLOW_LAYER_MPLS (1u << 15)
105ea81c1b8SDekel Peled /* List of tunnel Layer bits continued below. */
10684c406e7SOri Kam 
1076bd7fbd0SDekel Peled /* General pattern items bits. */
1086bd7fbd0SDekel Peled #define MLX5_FLOW_ITEM_METADATA (1u << 16)
1092e4c987aSOri Kam #define MLX5_FLOW_ITEM_PORT_ID (1u << 17)
11070d84dc7SOri Kam #define MLX5_FLOW_ITEM_TAG (1u << 18)
11155deee17SViacheslav Ovsiienko #define MLX5_FLOW_ITEM_MARK (1u << 19)
1126bd7fbd0SDekel Peled 
113d53aa89aSXiaoyu Min /* Pattern MISC bits. */
11420ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_ICMP (1u << 20)
11520ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_ICMP6 (1u << 21)
11620ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_GRE_KEY (1u << 22)
117d53aa89aSXiaoyu Min 
118ea81c1b8SDekel Peled /* Pattern tunnel Layer bits (continued). */
11920ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_IPIP (1u << 23)
12020ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_IPV6_ENCAP (1u << 24)
12120ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_NVGRE (1u << 25)
12220ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_GENEVE (1u << 26)
1235e33bebdSXiaoyu Min 
1243c84f34eSOri Kam /* Queue items. */
12520ac7966SXiaoyu Min #define MLX5_FLOW_ITEM_TX_QUEUE (1u << 27)
1263c84f34eSOri Kam 
127f31d7a01SDekel Peled /* Pattern tunnel Layer bits (continued). */
128f31d7a01SDekel Peled #define MLX5_FLOW_LAYER_GTP (1u << 28)
129f31d7a01SDekel Peled 
13084c406e7SOri Kam /* Outer Masks. */
13184c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3 \
13284c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L3_IPV6)
13384c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4 \
13484c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L4_UDP | MLX5_FLOW_LAYER_OUTER_L4_TCP)
13584c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER \
13684c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_OUTER_L3 | \
13784c406e7SOri Kam 	 MLX5_FLOW_LAYER_OUTER_L4)
13884c406e7SOri Kam 
13984c406e7SOri Kam /* Tunnel Masks. */
14084c406e7SOri Kam #define MLX5_FLOW_LAYER_TUNNEL \
14184c406e7SOri Kam 	(MLX5_FLOW_LAYER_VXLAN | MLX5_FLOW_LAYER_VXLAN_GPE | \
142ea81c1b8SDekel Peled 	 MLX5_FLOW_LAYER_GRE | MLX5_FLOW_LAYER_NVGRE | MLX5_FLOW_LAYER_MPLS | \
143e59a5dbcSMoti Haimovsky 	 MLX5_FLOW_LAYER_IPIP | MLX5_FLOW_LAYER_IPV6_ENCAP | \
144f31d7a01SDekel Peled 	 MLX5_FLOW_LAYER_GENEVE | MLX5_FLOW_LAYER_GTP)
14584c406e7SOri Kam 
14684c406e7SOri Kam /* Inner Masks. */
14784c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3 \
14884c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV6)
14984c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4 \
15084c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L4_UDP | MLX5_FLOW_LAYER_INNER_L4_TCP)
15184c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER \
15284c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L2 | MLX5_FLOW_LAYER_INNER_L3 | \
15384c406e7SOri Kam 	 MLX5_FLOW_LAYER_INNER_L4)
15484c406e7SOri Kam 
1554bb14c83SDekel Peled /* Layer Masks. */
1564bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L2 \
1574bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_INNER_L2)
1584bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV4 \
1594bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV4)
1604bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV6 \
1614bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV6 | MLX5_FLOW_LAYER_INNER_L3_IPV6)
1624bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3 \
1634bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_L3_IPV4 | MLX5_FLOW_LAYER_L3_IPV6)
1644bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L4 \
1654bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L4 | MLX5_FLOW_LAYER_INNER_L4)
1664bb14c83SDekel Peled 
16784c406e7SOri Kam /* Actions */
16884c406e7SOri Kam #define MLX5_FLOW_ACTION_DROP (1u << 0)
16984c406e7SOri Kam #define MLX5_FLOW_ACTION_QUEUE (1u << 1)
17084c406e7SOri Kam #define MLX5_FLOW_ACTION_RSS (1u << 2)
17184c406e7SOri Kam #define MLX5_FLOW_ACTION_FLAG (1u << 3)
17284c406e7SOri Kam #define MLX5_FLOW_ACTION_MARK (1u << 4)
17384c406e7SOri Kam #define MLX5_FLOW_ACTION_COUNT (1u << 5)
17457123c00SYongseok Koh #define MLX5_FLOW_ACTION_PORT_ID (1u << 6)
17557123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_POP_VLAN (1u << 7)
17657123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_PUSH_VLAN (1u << 8)
17757123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_SET_VLAN_VID (1u << 9)
17857123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_SET_VLAN_PCP (1u << 10)
1792ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV4_SRC (1u << 11)
1802ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV4_DST (1u << 12)
1812ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV6_SRC (1u << 13)
1822ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV6_DST (1u << 14)
1832ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TP_SRC (1u << 15)
1842ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TP_DST (1u << 16)
18531fda518SYongseok Koh #define MLX5_FLOW_ACTION_JUMP (1u << 17)
186a7cb5bcdSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TTL (1u << 18)
187a7cb5bcdSXiaoyu Min #define MLX5_FLOW_ACTION_DEC_TTL (1u << 19)
18876046778SXiaoyu Min #define MLX5_FLOW_ACTION_SET_MAC_SRC (1u << 20)
18976046778SXiaoyu Min #define MLX5_FLOW_ACTION_SET_MAC_DST (1u << 21)
19006387be8SMatan Azrad #define MLX5_FLOW_ACTION_ENCAP (1u << 22)
19106387be8SMatan Azrad #define MLX5_FLOW_ACTION_DECAP (1u << 23)
19206387be8SMatan Azrad #define MLX5_FLOW_ACTION_INC_TCP_SEQ (1u << 24)
19306387be8SMatan Azrad #define MLX5_FLOW_ACTION_DEC_TCP_SEQ (1u << 25)
19406387be8SMatan Azrad #define MLX5_FLOW_ACTION_INC_TCP_ACK (1u << 26)
19506387be8SMatan Azrad #define MLX5_FLOW_ACTION_DEC_TCP_ACK (1u << 27)
19606387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_TAG (1ull << 28)
19706387be8SMatan Azrad #define MLX5_FLOW_ACTION_MARK_EXT (1ull << 29)
19806387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_META (1ull << 30)
19906387be8SMatan Azrad #define MLX5_FLOW_ACTION_METER (1ull << 31)
20006387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_IPV4_DSCP (1ull << 32)
20106387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_IPV6_DSCP (1ull << 33)
20284c406e7SOri Kam 
20384c406e7SOri Kam #define MLX5_FLOW_FATE_ACTIONS \
204684b9a1bSOri Kam 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | \
205684b9a1bSOri Kam 	 MLX5_FLOW_ACTION_RSS | MLX5_FLOW_ACTION_JUMP)
20684c406e7SOri Kam 
2072e4c987aSOri Kam #define MLX5_FLOW_FATE_ESWITCH_ACTIONS \
2082e4c987aSOri Kam 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_PORT_ID | \
2092e4c987aSOri Kam 	 MLX5_FLOW_ACTION_JUMP)
2102e4c987aSOri Kam 
2114b8727f0SDekel Peled 
2124bb14c83SDekel Peled #define MLX5_FLOW_MODIFY_HDR_ACTIONS (MLX5_FLOW_ACTION_SET_IPV4_SRC | \
2134bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV4_DST | \
2144bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV6_SRC | \
2154bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV6_DST | \
2164bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TP_SRC | \
2174bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TP_DST | \
2184bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TTL | \
2194bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_DEC_TTL | \
2204bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_MAC_SRC | \
221585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_SET_MAC_DST | \
222585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_INC_TCP_SEQ | \
223585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_DEC_TCP_SEQ | \
224585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_INC_TCP_ACK | \
2255f163d52SMoti Haimovsky 				      MLX5_FLOW_ACTION_DEC_TCP_ACK | \
22670d84dc7SOri Kam 				      MLX5_FLOW_ACTION_OF_SET_VLAN_VID | \
22755deee17SViacheslav Ovsiienko 				      MLX5_FLOW_ACTION_SET_TAG | \
228fcc8d2f7SViacheslav Ovsiienko 				      MLX5_FLOW_ACTION_MARK_EXT | \
2296f26e604SSuanming Mou 				      MLX5_FLOW_ACTION_SET_META | \
2306f26e604SSuanming Mou 				      MLX5_FLOW_ACTION_SET_IPV4_DSCP | \
2316f26e604SSuanming Mou 				      MLX5_FLOW_ACTION_SET_IPV6_DSCP)
2324bb14c83SDekel Peled 
2339aee7a84SMoti Haimovsky #define MLX5_FLOW_VLAN_ACTIONS (MLX5_FLOW_ACTION_OF_POP_VLAN | \
2349aee7a84SMoti Haimovsky 				MLX5_FLOW_ACTION_OF_PUSH_VLAN)
23506387be8SMatan Azrad 
23606387be8SMatan Azrad #define MLX5_FLOW_XCAP_ACTIONS (MLX5_FLOW_ACTION_ENCAP | MLX5_FLOW_ACTION_DECAP)
23706387be8SMatan Azrad 
23884c406e7SOri Kam #ifndef IPPROTO_MPLS
23984c406e7SOri Kam #define IPPROTO_MPLS 137
24084c406e7SOri Kam #endif
24184c406e7SOri Kam 
242d1abe664SDekel Peled /* UDP port number for MPLS */
243d1abe664SDekel Peled #define MLX5_UDP_PORT_MPLS 6635
244d1abe664SDekel Peled 
245fc2c498cSOri Kam /* UDP port numbers for VxLAN. */
246fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN 4789
247fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN_GPE 4790
248fc2c498cSOri Kam 
249e59a5dbcSMoti Haimovsky /* UDP port numbers for GENEVE. */
250e59a5dbcSMoti Haimovsky #define MLX5_UDP_PORT_GENEVE 6081
251e59a5dbcSMoti Haimovsky 
25284c406e7SOri Kam /* Priority reserved for default flows. */
25384c406e7SOri Kam #define MLX5_FLOW_PRIO_RSVD ((uint32_t)-1)
25484c406e7SOri Kam 
25584c406e7SOri Kam /*
25684c406e7SOri Kam  * Number of sub priorities.
25784c406e7SOri Kam  * For each kind of pattern matching i.e. L2, L3, L4 to have a correct
25884c406e7SOri Kam  * matching on the NIC (firmware dependent) L4 most have the higher priority
25984c406e7SOri Kam  * followed by L3 and ending with L2.
26084c406e7SOri Kam  */
26184c406e7SOri Kam #define MLX5_PRIORITY_MAP_L2 2
26284c406e7SOri Kam #define MLX5_PRIORITY_MAP_L3 1
26384c406e7SOri Kam #define MLX5_PRIORITY_MAP_L4 0
26484c406e7SOri Kam #define MLX5_PRIORITY_MAP_MAX 3
26584c406e7SOri Kam 
266fc2c498cSOri Kam /* Valid layer type for IPV4 RSS. */
267fc2c498cSOri Kam #define MLX5_IPV4_LAYER_TYPES \
268fc2c498cSOri Kam 	(ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
269fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV4_UDP | \
270fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV4_OTHER)
271fc2c498cSOri Kam 
272fc2c498cSOri Kam /* IBV hash source bits  for IPV4. */
273fc2c498cSOri Kam #define MLX5_IPV4_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4)
274fc2c498cSOri Kam 
275fc2c498cSOri Kam /* Valid layer type for IPV6 RSS. */
276fc2c498cSOri Kam #define MLX5_IPV6_LAYER_TYPES \
277fc2c498cSOri Kam 	(ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | ETH_RSS_NONFRAG_IPV6_TCP | \
278fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_IPV6_EX  | ETH_RSS_IPV6_TCP_EX | \
279fc2c498cSOri Kam 	 ETH_RSS_IPV6_UDP_EX | ETH_RSS_NONFRAG_IPV6_OTHER)
280fc2c498cSOri Kam 
281fc2c498cSOri Kam /* IBV hash source bits  for IPV6. */
282fc2c498cSOri Kam #define MLX5_IPV6_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6)
283fc2c498cSOri Kam 
284c3e33304SDekel Peled /* IBV hash bits for L3 SRC. */
285c3e33304SDekel Peled #define MLX5_L3_SRC_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_SRC_IPV6)
286c3e33304SDekel Peled 
287c3e33304SDekel Peled /* IBV hash bits for L3 DST. */
288c3e33304SDekel Peled #define MLX5_L3_DST_IBV_RX_HASH (IBV_RX_HASH_DST_IPV4 | IBV_RX_HASH_DST_IPV6)
289c3e33304SDekel Peled 
290c3e33304SDekel Peled /* IBV hash bits for TCP. */
291c3e33304SDekel Peled #define MLX5_TCP_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_TCP | \
292c3e33304SDekel Peled 			      IBV_RX_HASH_DST_PORT_TCP)
293c3e33304SDekel Peled 
294c3e33304SDekel Peled /* IBV hash bits for UDP. */
295c3e33304SDekel Peled #define MLX5_UDP_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_UDP | \
296c3e33304SDekel Peled 			      IBV_RX_HASH_DST_PORT_UDP)
297c3e33304SDekel Peled 
298c3e33304SDekel Peled /* IBV hash bits for L4 SRC. */
299c3e33304SDekel Peled #define MLX5_L4_SRC_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_TCP | \
300c3e33304SDekel Peled 				 IBV_RX_HASH_SRC_PORT_UDP)
301c3e33304SDekel Peled 
302c3e33304SDekel Peled /* IBV hash bits for L4 DST. */
303c3e33304SDekel Peled #define MLX5_L4_DST_IBV_RX_HASH (IBV_RX_HASH_DST_PORT_TCP | \
304c3e33304SDekel Peled 				 IBV_RX_HASH_DST_PORT_UDP)
305e59a5dbcSMoti Haimovsky 
306e59a5dbcSMoti Haimovsky /* Geneve header first 16Bit */
307e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_MASK 0x3
308e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_SHIFT 14
309e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_VAL(a) \
310e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_VER_SHIFT)) & (MLX5_GENEVE_VER_MASK))
311e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_MASK 0x3F
312e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_SHIFT 7
313e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_VAL(a) \
314e59a5dbcSMoti Haimovsky 	    (((a) >> (MLX5_GENEVE_OPTLEN_SHIFT)) & (MLX5_GENEVE_OPTLEN_MASK))
315e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_MASK 0x1
316e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_SHIFT 7
317e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_VAL(a) \
318e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_OAMF_SHIFT)) & (MLX5_GENEVE_OAMF_MASK))
319e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_MASK 0x1
320e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_SHIFT 6
321e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_VAL(a) \
322e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_CRITO_SHIFT)) & (MLX5_GENEVE_CRITO_MASK))
323e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_MASK 0x3F
324e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_VAL(a) ((a) & (MLX5_GENEVE_RSVD_MASK))
325e59a5dbcSMoti Haimovsky /*
326e59a5dbcSMoti Haimovsky  * The length of the Geneve options fields, expressed in four byte multiples,
327e59a5dbcSMoti Haimovsky  * not including the eight byte fixed tunnel.
328e59a5dbcSMoti Haimovsky  */
329e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_0 14
330e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_1 63
331e59a5dbcSMoti Haimovsky 
33250f576d6SSuanming Mou #define MLX5_ENCAPSULATION_DECISION_SIZE (sizeof(struct rte_flow_item_eth) + \
33350f576d6SSuanming Mou 					  sizeof(struct rte_flow_item_ipv4))
33450f576d6SSuanming Mou 
335*72a944dbSBing Zhao /* Software header modify action numbers of a flow. */
336*72a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_IPV4		1
337*72a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_IPV6		4
338*72a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_MAC		2
339*72a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_VID		1
340*72a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_PORT		2
341*72a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_TTL		1
342*72a944dbSBing Zhao #define MLX5_ACT_NUM_DEC_TTL		MLX5_ACT_NUM_MDF_TTL
343*72a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_TCPSEQ		1
344*72a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_TCPACK		1
345*72a944dbSBing Zhao #define MLX5_ACT_NUM_SET_REG		1
346*72a944dbSBing Zhao #define MLX5_ACT_NUM_SET_TAG		1
347*72a944dbSBing Zhao #define MLX5_ACT_NUM_CPY_MREG		MLX5_ACT_NUM_SET_TAG
348*72a944dbSBing Zhao #define MLX5_ACT_NUM_SET_MARK		MLX5_ACT_NUM_SET_TAG
349*72a944dbSBing Zhao #define MLX5_ACT_NUM_SET_META		MLX5_ACT_NUM_SET_TAG
350*72a944dbSBing Zhao #define MLX5_ACT_NUM_SET_DSCP		1
351*72a944dbSBing Zhao 
3520c76d1c9SYongseok Koh enum mlx5_flow_drv_type {
3530c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_MIN,
3540c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_DV,
3550c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_VERBS,
3560c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_MAX,
3570c76d1c9SYongseok Koh };
3580c76d1c9SYongseok Koh 
359488d13abSSuanming Mou /* Fate action type. */
360488d13abSSuanming Mou enum mlx5_flow_fate_type {
361488d13abSSuanming Mou 	MLX5_FLOW_FATE_NONE, /* Egress flow. */
362488d13abSSuanming Mou 	MLX5_FLOW_FATE_QUEUE,
363488d13abSSuanming Mou 	MLX5_FLOW_FATE_JUMP,
364488d13abSSuanming Mou 	MLX5_FLOW_FATE_PORT_ID,
365488d13abSSuanming Mou 	MLX5_FLOW_FATE_DROP,
366488d13abSSuanming Mou 	MLX5_FLOW_FATE_MAX,
367488d13abSSuanming Mou };
368488d13abSSuanming Mou 
369865a0c15SOri Kam /* Matcher PRM representation */
370865a0c15SOri Kam struct mlx5_flow_dv_match_params {
371865a0c15SOri Kam 	size_t size;
372865a0c15SOri Kam 	/**< Size of match value. Do NOT split size and key! */
373865a0c15SOri Kam 	uint32_t buf[MLX5_ST_SZ_DW(fte_match_param)];
374865a0c15SOri Kam 	/**< Matcher value. This value is used as the mask or as a key. */
375865a0c15SOri Kam };
376865a0c15SOri Kam 
377865a0c15SOri Kam /* Matcher structure. */
378865a0c15SOri Kam struct mlx5_flow_dv_matcher {
379865a0c15SOri Kam 	LIST_ENTRY(mlx5_flow_dv_matcher) next;
380e9e36e52SBing Zhao 	/**< Pointer to the next element. */
381e9e36e52SBing Zhao 	struct mlx5_flow_tbl_resource *tbl;
382e9e36e52SBing Zhao 	/**< Pointer to the table(group) the matcher associated with. */
383865a0c15SOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
384865a0c15SOri Kam 	void *matcher_object; /**< Pointer to DV matcher */
385865a0c15SOri Kam 	uint16_t crc; /**< CRC of key. */
386865a0c15SOri Kam 	uint16_t priority; /**< Priority of matcher. */
387865a0c15SOri Kam 	struct mlx5_flow_dv_match_params mask; /**< Matcher mask. */
388865a0c15SOri Kam };
389865a0c15SOri Kam 
3904bb14c83SDekel Peled #define MLX5_ENCAP_MAX_LEN 132
3914bb14c83SDekel Peled 
392c513f05cSDekel Peled /* Encap/decap resource structure. */
393c513f05cSDekel Peled struct mlx5_flow_dv_encap_decap_resource {
394014d1cbeSSuanming Mou 	ILIST_ENTRY(uint32_t)next;
395c513f05cSDekel Peled 	/* Pointer to next element. */
396c513f05cSDekel Peled 	rte_atomic32_t refcnt; /**< Reference counter. */
397cbb66daaSOri Kam 	void *verbs_action;
398c513f05cSDekel Peled 	/**< Verbs encap/decap action object. */
399c513f05cSDekel Peled 	uint8_t buf[MLX5_ENCAP_MAX_LEN];
400c513f05cSDekel Peled 	size_t size;
401c513f05cSDekel Peled 	uint8_t reformat_type;
402c513f05cSDekel Peled 	uint8_t ft_type;
4034f84a197SOri Kam 	uint64_t flags; /**< Flags for RDMA API. */
404c513f05cSDekel Peled };
405c513f05cSDekel Peled 
406cbb66daaSOri Kam /* Tag resource structure. */
407cbb66daaSOri Kam struct mlx5_flow_dv_tag_resource {
408e484e403SBing Zhao 	struct mlx5_hlist_entry entry;
409e484e403SBing Zhao 	/**< hash list entry for tag resource, tag value as the key. */
410cbb66daaSOri Kam 	void *action;
411cbb66daaSOri Kam 	/**< Verbs tag action object. */
412e484e403SBing Zhao 	rte_atomic32_t refcnt; /**< Reference counter. */
4135f114269SSuanming Mou 	uint32_t idx; /**< Index for the index memory pool. */
414cbb66daaSOri Kam };
415cbb66daaSOri Kam 
4160e9d0002SViacheslav Ovsiienko /*
4170e9d0002SViacheslav Ovsiienko  * Number of modification commands.
418024e9575SBing Zhao  * If extensive metadata registers are supported, the maximal actions amount is
419024e9575SBing Zhao  * 16 and 8 otherwise on root table. The validation could also be done in the
420024e9575SBing Zhao  * lower driver layer.
421024e9575SBing Zhao  * On non-root table, there is no limitation, but 32 is enough right now.
4220e9d0002SViacheslav Ovsiienko  */
423024e9575SBing Zhao #define MLX5_MAX_MODIFY_NUM			32
424024e9575SBing Zhao #define MLX5_ROOT_TBL_MODIFY_NUM		16
425024e9575SBing Zhao #define MLX5_ROOT_TBL_MODIFY_NUM_NO_MREG	8
4264bb14c83SDekel Peled 
4274bb14c83SDekel Peled /* Modify resource structure */
4284bb14c83SDekel Peled struct mlx5_flow_dv_modify_hdr_resource {
4294bb14c83SDekel Peled 	LIST_ENTRY(mlx5_flow_dv_modify_hdr_resource) next;
4304bb14c83SDekel Peled 	/* Pointer to next element. */
4314bb14c83SDekel Peled 	rte_atomic32_t refcnt; /**< Reference counter. */
4324bb14c83SDekel Peled 	struct ibv_flow_action *verbs_action;
4334bb14c83SDekel Peled 	/**< Verbs modify header action object. */
4344bb14c83SDekel Peled 	uint8_t ft_type; /**< Flow table type, Rx or Tx. */
4354bb14c83SDekel Peled 	uint32_t actions_num; /**< Number of modification actions. */
43679e7ba1fSOri Kam 	uint64_t flags; /**< Flags for RDMA API. */
437024e9575SBing Zhao 	struct mlx5_modification_cmd actions[];
438024e9575SBing Zhao 	/**< Modification actions. */
4394bb14c83SDekel Peled };
4404bb14c83SDekel Peled 
441684b9a1bSOri Kam /* Jump action resource structure. */
442684b9a1bSOri Kam struct mlx5_flow_dv_jump_tbl_resource {
443684b9a1bSOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
444684b9a1bSOri Kam 	uint8_t ft_type; /**< Flow table type, Rx or Tx. */
4456c1d9a64SBing Zhao 	void *action; /**< Pointer to the rdma core action. */
446684b9a1bSOri Kam };
447684b9a1bSOri Kam 
448c269b517SOri Kam /* Port ID resource structure. */
449c269b517SOri Kam struct mlx5_flow_dv_port_id_action_resource {
450f3faf9eaSSuanming Mou 	ILIST_ENTRY(uint32_t)next;
451c269b517SOri Kam 	/* Pointer to next element. */
452c269b517SOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
453c269b517SOri Kam 	void *action;
454c269b517SOri Kam 	/**< Verbs tag action object. */
455c269b517SOri Kam 	uint32_t port_id; /**< Port ID value. */
456c269b517SOri Kam };
457c269b517SOri Kam 
4589aee7a84SMoti Haimovsky /* Push VLAN action resource structure */
4599aee7a84SMoti Haimovsky struct mlx5_flow_dv_push_vlan_action_resource {
4608acf8ac9SSuanming Mou 	ILIST_ENTRY(uint32_t)next;
4619aee7a84SMoti Haimovsky 	/* Pointer to next element. */
4629aee7a84SMoti Haimovsky 	rte_atomic32_t refcnt; /**< Reference counter. */
4639aee7a84SMoti Haimovsky 	void *action; /**< Direct verbs action object. */
4649aee7a84SMoti Haimovsky 	uint8_t ft_type; /**< Flow table type, Rx, Tx or FDB. */
4659aee7a84SMoti Haimovsky 	rte_be32_t vlan_tag; /**< VLAN tag value. */
4669aee7a84SMoti Haimovsky };
4679aee7a84SMoti Haimovsky 
468dd3c774fSViacheslav Ovsiienko /* Metadata register copy table entry. */
469dd3c774fSViacheslav Ovsiienko struct mlx5_flow_mreg_copy_resource {
470dd3c774fSViacheslav Ovsiienko 	/*
471dd3c774fSViacheslav Ovsiienko 	 * Hash list entry for copy table.
472dd3c774fSViacheslav Ovsiienko 	 *  - Key is 32/64-bit MARK action ID.
473dd3c774fSViacheslav Ovsiienko 	 *  - MUST be the first entry.
474dd3c774fSViacheslav Ovsiienko 	 */
475dd3c774fSViacheslav Ovsiienko 	struct mlx5_hlist_entry hlist_ent;
476dd3c774fSViacheslav Ovsiienko 	LIST_ENTRY(mlx5_flow_mreg_copy_resource) next;
477dd3c774fSViacheslav Ovsiienko 	/* List entry for device flows. */
478dd3c774fSViacheslav Ovsiienko 	uint32_t refcnt; /* Reference counter. */
479dd3c774fSViacheslav Ovsiienko 	uint32_t appcnt; /* Apply/Remove counter. */
48090e6053aSSuanming Mou 	uint32_t idx;
481ab612adcSSuanming Mou 	uint32_t rix_flow; /* Built flow for copy. */
482dd3c774fSViacheslav Ovsiienko };
483dd3c774fSViacheslav Ovsiienko 
484860897d2SBing Zhao /* Table data structure of the hash organization. */
485860897d2SBing Zhao struct mlx5_flow_tbl_data_entry {
486860897d2SBing Zhao 	struct mlx5_hlist_entry entry;
487e9e36e52SBing Zhao 	/**< hash list entry, 64-bits key inside. */
488860897d2SBing Zhao 	struct mlx5_flow_tbl_resource tbl;
489e9e36e52SBing Zhao 	/**< flow table resource. */
490e9e36e52SBing Zhao 	LIST_HEAD(matchers, mlx5_flow_dv_matcher) matchers;
491e9e36e52SBing Zhao 	/**< matchers' header associated with the flow table. */
4926c1d9a64SBing Zhao 	struct mlx5_flow_dv_jump_tbl_resource jump;
4936c1d9a64SBing Zhao 	/**< jump resource, at most one for each table created. */
4947ac99475SSuanming Mou 	uint32_t idx; /**< index for the indexed mempool. */
495860897d2SBing Zhao };
496860897d2SBing Zhao 
49784c406e7SOri Kam /* Verbs specification header. */
49884c406e7SOri Kam struct ibv_spec_header {
49984c406e7SOri Kam 	enum ibv_flow_spec_type type;
50084c406e7SOri Kam 	uint16_t size;
50184c406e7SOri Kam };
50284c406e7SOri Kam 
503e745f900SSuanming Mou /* RSS description. */
504e745f900SSuanming Mou struct mlx5_flow_rss_desc {
505e205c95fSViacheslav Ovsiienko 	uint32_t level;
506e205c95fSViacheslav Ovsiienko 	uint32_t queue_num; /**< Number of entries in @p queue. */
507e205c95fSViacheslav Ovsiienko 	uint64_t types; /**< Specific RSS hash types (see ETH_RSS_*). */
508e205c95fSViacheslav Ovsiienko 	uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */
509e745f900SSuanming Mou 	uint16_t queue[]; /**< Destination queues to redirect traffic to. */
510e205c95fSViacheslav Ovsiienko };
511e205c95fSViacheslav Ovsiienko 
512e745f900SSuanming Mou 
513c42f44bdSBing Zhao /** Device flow handle structure for DV mode only. */
514c42f44bdSBing Zhao struct mlx5_flow_handle_dv {
515c42f44bdSBing Zhao 	/* Flow DV api: */
516c42f44bdSBing Zhao 	struct mlx5_flow_dv_matcher *matcher; /**< Cache to matcher. */
517c42f44bdSBing Zhao 	struct mlx5_flow_dv_modify_hdr_resource *modify_hdr;
518c42f44bdSBing Zhao 	/**< Pointer to modify header resource in cache. */
51977749adaSSuanming Mou 	uint32_t rix_encap_decap;
52077749adaSSuanming Mou 	/**< Index to encap/decap resource in cache. */
52177749adaSSuanming Mou 	uint32_t rix_push_vlan;
5228acf8ac9SSuanming Mou 	/**< Index to push VLAN action resource in cache. */
52377749adaSSuanming Mou 	uint32_t rix_tag;
5245f114269SSuanming Mou 	/**< Index to the tag action. */
52577749adaSSuanming Mou } __rte_packed;
526c42f44bdSBing Zhao 
527c42f44bdSBing Zhao /** Device flow handle structure: used both for creating & destroying. */
528c42f44bdSBing Zhao struct mlx5_flow_handle {
529b88341caSSuanming Mou 	SILIST_ENTRY(uint32_t)next;
53077749adaSSuanming Mou 	struct mlx5_vf_vlan vf_vlan; /**< Structure for VF VLAN workaround. */
531b88341caSSuanming Mou 	/**< Index to next device flow handle. */
5320ddd1143SYongseok Koh 	uint64_t layers;
53324663641SYongseok Koh 	/**< Bit-fields of present layers, see MLX5_FLOW_LAYER_*. */
534c42f44bdSBing Zhao 	void *ib_flow; /**< Verbs flow pointer. */
53577749adaSSuanming Mou 	uint32_t split_flow_id:28; /**< Sub flow unique match flow id. */
536488d13abSSuanming Mou 	uint32_t mark:1; /**< Metadate rxq mark flag. */
537488d13abSSuanming Mou 	uint32_t fate_action:3; /**< Fate action type. */
5386fc18392SSuanming Mou 	union {
53977749adaSSuanming Mou 		uint32_t rix_hrxq; /**< Hash Rx queue object index. */
54077749adaSSuanming Mou 		uint32_t rix_jump; /**< Index to the jump action resource. */
54177749adaSSuanming Mou 		uint32_t rix_port_id_action;
5426fc18392SSuanming Mou 		/**< Index to port ID action resource. */
54377749adaSSuanming Mou 		uint32_t rix_fate;
544488d13abSSuanming Mou 		/**< Generic value indicates the fate action. */
5456fc18392SSuanming Mou 	};
546c42f44bdSBing Zhao #ifdef HAVE_IBV_FLOW_DV_SUPPORT
547c42f44bdSBing Zhao 	struct mlx5_flow_handle_dv dvh;
548c42f44bdSBing Zhao #endif
54977749adaSSuanming Mou } __rte_packed;
550c42f44bdSBing Zhao 
551c42f44bdSBing Zhao /*
552e7bfa359SBing Zhao  * Size for Verbs device flow handle structure only. Do not use the DV only
553e7bfa359SBing Zhao  * structure in Verbs. No DV flows attributes will be accessed.
554e7bfa359SBing Zhao  * Macro offsetof() could also be used here.
555e7bfa359SBing Zhao  */
556e7bfa359SBing Zhao #ifdef HAVE_IBV_FLOW_DV_SUPPORT
557e7bfa359SBing Zhao #define MLX5_FLOW_HANDLE_VERBS_SIZE \
558e7bfa359SBing Zhao 	(sizeof(struct mlx5_flow_handle) - sizeof(struct mlx5_flow_handle_dv))
559e7bfa359SBing Zhao #else
560e7bfa359SBing Zhao #define MLX5_FLOW_HANDLE_VERBS_SIZE (sizeof(struct mlx5_flow_handle))
561e7bfa359SBing Zhao #endif
562e7bfa359SBing Zhao 
563e7bfa359SBing Zhao /*
564c42f44bdSBing Zhao  * Max number of actions per DV flow.
565c42f44bdSBing Zhao  * See CREATE_FLOW_MAX_FLOW_ACTIONS_SUPPORTED
566c42f44bdSBing Zhao  * in rdma-core file providers/mlx5/verbs.c.
567c42f44bdSBing Zhao  */
568c42f44bdSBing Zhao #define MLX5_DV_MAX_NUMBER_OF_ACTIONS 8
569c42f44bdSBing Zhao 
570c42f44bdSBing Zhao /** Device flow structure only for DV flow creation. */
571e7bfa359SBing Zhao struct mlx5_flow_dv_workspace {
572c42f44bdSBing Zhao 	uint32_t group; /**< The group index. */
573c42f44bdSBing Zhao 	uint8_t transfer; /**< 1 if the flow is E-Switch flow. */
574c42f44bdSBing Zhao 	int actions_n; /**< number of actions. */
575c42f44bdSBing Zhao 	void *actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS]; /**< Action list. */
576014d1cbeSSuanming Mou 	struct mlx5_flow_dv_encap_decap_resource *encap_decap;
577014d1cbeSSuanming Mou 	/**< Pointer to encap/decap resource in cache. */
5788acf8ac9SSuanming Mou 	struct mlx5_flow_dv_push_vlan_action_resource *push_vlan_res;
5798acf8ac9SSuanming Mou 	/**< Pointer to push VLAN action resource in cache. */
5805f114269SSuanming Mou 	struct mlx5_flow_dv_tag_resource *tag_resource;
5817ac99475SSuanming Mou 	/**< pointer to the tag action. */
582f3faf9eaSSuanming Mou 	struct mlx5_flow_dv_port_id_action_resource *port_id_action;
583f3faf9eaSSuanming Mou 	/**< Pointer to port ID action resource. */
5847ac99475SSuanming Mou 	struct mlx5_flow_dv_jump_tbl_resource *jump;
5857ac99475SSuanming Mou 	/**< Pointer to the jump action resource. */
586c42f44bdSBing Zhao 	struct mlx5_flow_dv_match_params value;
587c42f44bdSBing Zhao 	/**< Holds the value that the packet is compared to. */
588c42f44bdSBing Zhao };
589c42f44bdSBing Zhao 
590e7bfa359SBing Zhao /*
591e7bfa359SBing Zhao  * Maximal Verbs flow specifications & actions size.
592e7bfa359SBing Zhao  * Some elements are mutually exclusive, but enough space should be allocated.
593e7bfa359SBing Zhao  * Tunnel cases: 1. Max 2 Ethernet + IP(v6 len > v4 len) + TCP/UDP headers.
594e7bfa359SBing Zhao  *               2. One tunnel header (exception: GRE + MPLS),
595e7bfa359SBing Zhao  *                  SPEC length: GRE == tunnel.
596e7bfa359SBing Zhao  * Actions: 1. 1 Mark OR Flag.
597e7bfa359SBing Zhao  *          2. 1 Drop (if any).
598e7bfa359SBing Zhao  *          3. No limitation for counters, but it makes no sense to support too
599e7bfa359SBing Zhao  *             many counters in a single device flow.
600e7bfa359SBing Zhao  */
601e7bfa359SBing Zhao #ifdef HAVE_IBV_DEVICE_MPLS_SUPPORT
602e7bfa359SBing Zhao #define MLX5_VERBS_MAX_SPEC_SIZE \
603e7bfa359SBing Zhao 		( \
604e7bfa359SBing Zhao 			(2 * (sizeof(struct ibv_flow_spec_eth) + \
605e7bfa359SBing Zhao 			      sizeof(struct ibv_flow_spec_ipv6) + \
606e7bfa359SBing Zhao 			      sizeof(struct ibv_flow_spec_tcp_udp)) + \
607e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_gre) + \
608e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_mpls)) \
609e7bfa359SBing Zhao 		)
610e7bfa359SBing Zhao #else
611e7bfa359SBing Zhao #define MLX5_VERBS_MAX_SPEC_SIZE \
612e7bfa359SBing Zhao 		( \
613e7bfa359SBing Zhao 			(2 * (sizeof(struct ibv_flow_spec_eth) + \
614e7bfa359SBing Zhao 			      sizeof(struct ibv_flow_spec_ipv6) + \
615e7bfa359SBing Zhao 			      sizeof(struct ibv_flow_spec_tcp_udp)) + \
616e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_tunnel)) \
617e7bfa359SBing Zhao 		)
618e7bfa359SBing Zhao #endif
619e7bfa359SBing Zhao 
620e7bfa359SBing Zhao #if defined(HAVE_IBV_DEVICE_COUNTERS_SET_V42) || \
621e7bfa359SBing Zhao 	defined(HAVE_IBV_DEVICE_COUNTERS_SET_V45)
622e7bfa359SBing Zhao #define MLX5_VERBS_MAX_ACT_SIZE \
623e7bfa359SBing Zhao 		( \
624e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_action_tag) + \
625e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_action_drop) + \
626e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_counter_action) * 4 \
627e7bfa359SBing Zhao 		)
628e7bfa359SBing Zhao #else
629e7bfa359SBing Zhao #define MLX5_VERBS_MAX_ACT_SIZE \
630e7bfa359SBing Zhao 		( \
631e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_action_tag) + \
632e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_action_drop) \
633e7bfa359SBing Zhao 		)
634e7bfa359SBing Zhao #endif
635e7bfa359SBing Zhao 
636e7bfa359SBing Zhao #define MLX5_VERBS_MAX_SPEC_ACT_SIZE \
637e7bfa359SBing Zhao 		(MLX5_VERBS_MAX_SPEC_SIZE + MLX5_VERBS_MAX_ACT_SIZE)
638e7bfa359SBing Zhao 
639c42f44bdSBing Zhao /** Device flow structure only for Verbs flow creation. */
640e7bfa359SBing Zhao struct mlx5_flow_verbs_workspace {
641c42f44bdSBing Zhao 	unsigned int size; /**< Size of the attribute. */
642e7bfa359SBing Zhao 	struct ibv_flow_attr attr; /**< Verbs flow attribute buffer. */
643e7bfa359SBing Zhao 	uint8_t specs[MLX5_VERBS_MAX_SPEC_ACT_SIZE];
644e7bfa359SBing Zhao 	/**< Specifications & actions buffer of verbs flow. */
645c42f44bdSBing Zhao };
646c42f44bdSBing Zhao 
647e7bfa359SBing Zhao /** Maximal number of device sub-flows supported. */
648e7bfa359SBing Zhao #define MLX5_NUM_MAX_DEV_FLOWS 32
649e7bfa359SBing Zhao 
650c42f44bdSBing Zhao /** Device flow structure. */
651c42f44bdSBing Zhao struct mlx5_flow {
652c42f44bdSBing Zhao 	struct rte_flow *flow; /**< Pointer to the main flow. */
653c42f44bdSBing Zhao 	uint64_t hash_fields; /**< Verbs hash Rx queue hash fields. */
654488d13abSSuanming Mou 	uint64_t act_flags;
655488d13abSSuanming Mou 	/**< Bit-fields of detected actions, see MLX5_FLOW_ACTION_*. */
656b67b4ecbSDekel Peled 	bool external; /**< true if the flow is created external to PMD. */
657c42f44bdSBing Zhao 	uint8_t ingress; /**< 1 if the flow is ingress. */
658c42f44bdSBing Zhao 	union {
659c42f44bdSBing Zhao #ifdef HAVE_IBV_FLOW_DV_SUPPORT
660e7bfa359SBing Zhao 		struct mlx5_flow_dv_workspace dv;
661c42f44bdSBing Zhao #endif
662e7bfa359SBing Zhao 		struct mlx5_flow_verbs_workspace verbs;
663c42f44bdSBing Zhao 	};
664e7bfa359SBing Zhao 	struct mlx5_flow_handle *handle;
665b88341caSSuanming Mou 	uint32_t handle_idx; /* Index of the mlx5 flow handle memory. */
66684c406e7SOri Kam };
66784c406e7SOri Kam 
66833e01809SSuanming Mou /* Flow meter state. */
66933e01809SSuanming Mou #define MLX5_FLOW_METER_DISABLE 0
67033e01809SSuanming Mou #define MLX5_FLOW_METER_ENABLE 1
67133e01809SSuanming Mou 
6723bd26b23SSuanming Mou #define MLX5_MAN_WIDTH 8
67346a5e6bcSSuanming Mou /* Modify this value if enum rte_mtr_color changes. */
67446a5e6bcSSuanming Mou #define RTE_MTR_DROPPED RTE_COLORS
67546a5e6bcSSuanming Mou 
6764dedc7c6SSuanming Mou /* Meter policer statistics */
6774dedc7c6SSuanming Mou struct mlx5_flow_policer_stats {
678956d5c74SSuanming Mou 	uint32_t cnt[RTE_COLORS + 1];
6794dedc7c6SSuanming Mou 	/**< Color counter, extra for drop. */
6804dedc7c6SSuanming Mou 	uint64_t stats_mask;
6814dedc7c6SSuanming Mou 	/**< Statistics mask for the colors. */
6824dedc7c6SSuanming Mou };
6834dedc7c6SSuanming Mou 
68446a5e6bcSSuanming Mou /* Meter table structure. */
68546a5e6bcSSuanming Mou struct mlx5_meter_domain_info {
68646a5e6bcSSuanming Mou 	struct mlx5_flow_tbl_resource *tbl;
68746a5e6bcSSuanming Mou 	/**< Meter table. */
6889dbaf7eeSSuanming Mou 	struct mlx5_flow_tbl_resource *sfx_tbl;
6899dbaf7eeSSuanming Mou 	/**< Meter suffix table. */
69046a5e6bcSSuanming Mou 	void *any_matcher;
69146a5e6bcSSuanming Mou 	/**< Meter color not match default criteria. */
69246a5e6bcSSuanming Mou 	void *color_matcher;
69346a5e6bcSSuanming Mou 	/**< Meter color match criteria. */
69446a5e6bcSSuanming Mou 	void *jump_actn;
69546a5e6bcSSuanming Mou 	/**< Meter match action. */
69646a5e6bcSSuanming Mou 	void *policer_rules[RTE_MTR_DROPPED + 1];
69746a5e6bcSSuanming Mou 	/**< Meter policer for the match. */
69846a5e6bcSSuanming Mou };
69946a5e6bcSSuanming Mou 
70046a5e6bcSSuanming Mou /* Meter table set for TX RX FDB. */
70146a5e6bcSSuanming Mou struct mlx5_meter_domains_infos {
70246a5e6bcSSuanming Mou 	uint32_t ref_cnt;
70346a5e6bcSSuanming Mou 	/**< Table user count. */
70446a5e6bcSSuanming Mou 	struct mlx5_meter_domain_info egress;
70546a5e6bcSSuanming Mou 	/**< TX meter table. */
70646a5e6bcSSuanming Mou 	struct mlx5_meter_domain_info ingress;
70746a5e6bcSSuanming Mou 	/**< RX meter table. */
70846a5e6bcSSuanming Mou 	struct mlx5_meter_domain_info transfer;
70946a5e6bcSSuanming Mou 	/**< FDB meter table. */
71046a5e6bcSSuanming Mou 	void *drop_actn;
71146a5e6bcSSuanming Mou 	/**< Drop action as not matched. */
7124dedc7c6SSuanming Mou 	void *count_actns[RTE_MTR_DROPPED + 1];
7134dedc7c6SSuanming Mou 	/**< Counters for match and unmatched statistics. */
71433e01809SSuanming Mou 	uint32_t fmp[MLX5_ST_SZ_DW(flow_meter_parameters)];
71533e01809SSuanming Mou 	/**< Flow meter parameter. */
71633e01809SSuanming Mou 	size_t fmp_size;
71733e01809SSuanming Mou 	/**< Flow meter parameter size. */
71833e01809SSuanming Mou 	void *meter_action;
71933e01809SSuanming Mou 	/**< Flow meter action. */
72046a5e6bcSSuanming Mou };
72146a5e6bcSSuanming Mou 
72246a5e6bcSSuanming Mou /* Meter parameter structure. */
72346a5e6bcSSuanming Mou struct mlx5_flow_meter {
7243f373f35SSuanming Mou 	TAILQ_ENTRY(mlx5_flow_meter) next;
7253f373f35SSuanming Mou 	/**< Pointer to the next flow meter structure. */
7268638e2b0SSuanming Mou 	uint32_t idx; /* Index to meter object. */
72746a5e6bcSSuanming Mou 	uint32_t meter_id;
72846a5e6bcSSuanming Mou 	/**< Meter id. */
7293f373f35SSuanming Mou 	struct mlx5_flow_meter_profile *profile;
7303f373f35SSuanming Mou 	/**< Meter profile parameters. */
73178466e08SWentao Cui 
73278466e08SWentao Cui 	/** Policer actions (per meter output color). */
73378466e08SWentao Cui 	enum rte_mtr_policer_action action[RTE_COLORS];
73478466e08SWentao Cui 
73578466e08SWentao Cui 	/** Set of stats counters to be enabled.
73678466e08SWentao Cui 	 * @see enum rte_mtr_stats_type
73778466e08SWentao Cui 	 */
73878466e08SWentao Cui 	uint64_t stats_mask;
73978466e08SWentao Cui 
74078466e08SWentao Cui 	/**< Rule applies to ingress traffic. */
74178466e08SWentao Cui 	uint32_t ingress:1;
74278466e08SWentao Cui 
74378466e08SWentao Cui 	/**< Rule applies to egress traffic. */
74478466e08SWentao Cui 	uint32_t egress:1;
74578466e08SWentao Cui 	/**
74678466e08SWentao Cui 	 * Instead of simply matching the properties of traffic as it would
74778466e08SWentao Cui 	 * appear on a given DPDK port ID, enabling this attribute transfers
74878466e08SWentao Cui 	 * a flow rule to the lowest possible level of any device endpoints
74978466e08SWentao Cui 	 * found in the pattern.
75078466e08SWentao Cui 	 *
75178466e08SWentao Cui 	 * When supported, this effectively enables an application to
75278466e08SWentao Cui 	 * re-route traffic not necessarily intended for it (e.g. coming
75378466e08SWentao Cui 	 * from or addressed to different physical ports, VFs or
75478466e08SWentao Cui 	 * applications) at the device level.
75578466e08SWentao Cui 	 *
75678466e08SWentao Cui 	 * It complements the behavior of some pattern items such as
75778466e08SWentao Cui 	 * RTE_FLOW_ITEM_TYPE_PHY_PORT and is meaningless without them.
75878466e08SWentao Cui 	 *
75978466e08SWentao Cui 	 * When transferring flow rules, ingress and egress attributes keep
76078466e08SWentao Cui 	 * their original meaning, as if processing traffic emitted or
76178466e08SWentao Cui 	 * received by the application.
76278466e08SWentao Cui 	 */
76378466e08SWentao Cui 	uint32_t transfer:1;
76446a5e6bcSSuanming Mou 	struct mlx5_meter_domains_infos *mfts;
76546a5e6bcSSuanming Mou 	/**< Flow table created for this meter. */
7664dedc7c6SSuanming Mou 	struct mlx5_flow_policer_stats policer_stats;
7674dedc7c6SSuanming Mou 	/**< Meter policer statistics. */
76846a5e6bcSSuanming Mou 	uint32_t ref_cnt;
76946a5e6bcSSuanming Mou 	/**< Use count. */
7703f373f35SSuanming Mou 	uint32_t active_state:1;
7713f373f35SSuanming Mou 	/**< Meter state. */
7723f373f35SSuanming Mou 	uint32_t shared:1;
7733f373f35SSuanming Mou 	/**< Meter shared or not. */
77446a5e6bcSSuanming Mou };
7753bd26b23SSuanming Mou 
7763bd26b23SSuanming Mou /* RFC2697 parameter structure. */
7773bd26b23SSuanming Mou struct mlx5_flow_meter_srtcm_rfc2697_prm {
7783bd26b23SSuanming Mou 	/* green_saturation_value = cbs_mantissa * 2^cbs_exponent */
7793bd26b23SSuanming Mou 	uint32_t cbs_exponent:5;
7803bd26b23SSuanming Mou 	uint32_t cbs_mantissa:8;
7813bd26b23SSuanming Mou 	/* cir = 8G * cir_mantissa * 1/(2^cir_exponent) Bytes/Sec */
7823bd26b23SSuanming Mou 	uint32_t cir_exponent:5;
7833bd26b23SSuanming Mou 	uint32_t cir_mantissa:8;
7843bd26b23SSuanming Mou 	/* yellow _saturation_value = ebs_mantissa * 2^ebs_exponent */
7853bd26b23SSuanming Mou 	uint32_t ebs_exponent:5;
7863bd26b23SSuanming Mou 	uint32_t ebs_mantissa:8;
7873bd26b23SSuanming Mou };
7883bd26b23SSuanming Mou 
7893bd26b23SSuanming Mou /* Flow meter profile structure. */
7903bd26b23SSuanming Mou struct mlx5_flow_meter_profile {
7913bd26b23SSuanming Mou 	TAILQ_ENTRY(mlx5_flow_meter_profile) next;
7923bd26b23SSuanming Mou 	/**< Pointer to the next flow meter structure. */
7933bd26b23SSuanming Mou 	uint32_t meter_profile_id; /**< Profile id. */
7943bd26b23SSuanming Mou 	struct rte_mtr_meter_profile profile; /**< Profile detail. */
7953bd26b23SSuanming Mou 	union {
7963bd26b23SSuanming Mou 		struct mlx5_flow_meter_srtcm_rfc2697_prm srtcm_prm;
7973bd26b23SSuanming Mou 		/**< srtcm_rfc2697 struct. */
7983bd26b23SSuanming Mou 	};
7993bd26b23SSuanming Mou 	uint32_t ref_cnt; /**< Use count. */
8003bd26b23SSuanming Mou };
8013bd26b23SSuanming Mou 
802c2ddde79SWentao Cui /* Fdir flow structure */
803c2ddde79SWentao Cui struct mlx5_fdir_flow {
804c2ddde79SWentao Cui 	LIST_ENTRY(mlx5_fdir_flow) next; /* Pointer to the next element. */
805c2ddde79SWentao Cui 	struct mlx5_fdir *fdir; /* Pointer to fdir. */
806ab612adcSSuanming Mou 	uint32_t rix_flow; /* Index to flow. */
807c2ddde79SWentao Cui };
808c2ddde79SWentao Cui 
8090136df99SSuanming Mou #define HAIRPIN_FLOW_ID_BITS 28
8100136df99SSuanming Mou 
81184c406e7SOri Kam /* Flow structure. */
81284c406e7SOri Kam struct rte_flow {
813ab612adcSSuanming Mou 	ILIST_ENTRY(uint32_t)next; /**< Index to the next flow structure. */
814b88341caSSuanming Mou 	uint32_t dev_handles;
815e7bfa359SBing Zhao 	/**< Device flow handles that are part of the flow. */
8160136df99SSuanming Mou 	uint32_t drv_type:2; /**< Driver type. */
817c2ddde79SWentao Cui 	uint32_t fdir:1; /**< Identifier of associated FDIR if any. */
8180136df99SSuanming Mou 	uint32_t hairpin_flow_id:HAIRPIN_FLOW_ID_BITS;
8190136df99SSuanming Mou 	/**< The flow id used for hairpin. */
820dd3c774fSViacheslav Ovsiienko 	uint32_t copy_applied:1; /**< The MARK copy Flow os applied. */
8210136df99SSuanming Mou 	uint32_t rix_mreg_copy;
8220136df99SSuanming Mou 	/**< Index to metadata register copy table resource. */
8230136df99SSuanming Mou 	uint32_t counter; /**< Holds flow counter. */
8240136df99SSuanming Mou 	uint16_t meter; /**< Holds flow meter id. */
8250136df99SSuanming Mou } __rte_packed;
8262720f833SYongseok Koh 
82784c406e7SOri Kam typedef int (*mlx5_flow_validate_t)(struct rte_eth_dev *dev,
82884c406e7SOri Kam 				    const struct rte_flow_attr *attr,
82984c406e7SOri Kam 				    const struct rte_flow_item items[],
83084c406e7SOri Kam 				    const struct rte_flow_action actions[],
831b67b4ecbSDekel Peled 				    bool external,
832*72a944dbSBing Zhao 				    int hairpin,
83384c406e7SOri Kam 				    struct rte_flow_error *error);
83484c406e7SOri Kam typedef struct mlx5_flow *(*mlx5_flow_prepare_t)
835e7bfa359SBing Zhao 	(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
836e7bfa359SBing Zhao 	 const struct rte_flow_item items[],
837c1cfb132SYongseok Koh 	 const struct rte_flow_action actions[], struct rte_flow_error *error);
83884c406e7SOri Kam typedef int (*mlx5_flow_translate_t)(struct rte_eth_dev *dev,
83984c406e7SOri Kam 				     struct mlx5_flow *dev_flow,
84084c406e7SOri Kam 				     const struct rte_flow_attr *attr,
84184c406e7SOri Kam 				     const struct rte_flow_item items[],
84284c406e7SOri Kam 				     const struct rte_flow_action actions[],
84384c406e7SOri Kam 				     struct rte_flow_error *error);
84484c406e7SOri Kam typedef int (*mlx5_flow_apply_t)(struct rte_eth_dev *dev, struct rte_flow *flow,
84584c406e7SOri Kam 				 struct rte_flow_error *error);
84684c406e7SOri Kam typedef void (*mlx5_flow_remove_t)(struct rte_eth_dev *dev,
84784c406e7SOri Kam 				   struct rte_flow *flow);
84884c406e7SOri Kam typedef void (*mlx5_flow_destroy_t)(struct rte_eth_dev *dev,
84984c406e7SOri Kam 				    struct rte_flow *flow);
850684dafe7SMoti Haimovsky typedef int (*mlx5_flow_query_t)(struct rte_eth_dev *dev,
851684dafe7SMoti Haimovsky 				 struct rte_flow *flow,
852684dafe7SMoti Haimovsky 				 const struct rte_flow_action *actions,
853684dafe7SMoti Haimovsky 				 void *data,
854684dafe7SMoti Haimovsky 				 struct rte_flow_error *error);
85546a5e6bcSSuanming Mou typedef struct mlx5_meter_domains_infos *(*mlx5_flow_create_mtr_tbls_t)
8564dedc7c6SSuanming Mou 					    (struct rte_eth_dev *dev,
8574dedc7c6SSuanming Mou 					     const struct mlx5_flow_meter *fm);
85846a5e6bcSSuanming Mou typedef int (*mlx5_flow_destroy_mtr_tbls_t)(struct rte_eth_dev *dev,
85946a5e6bcSSuanming Mou 					struct mlx5_meter_domains_infos *tbls);
8603426add9SSuanming Mou typedef int (*mlx5_flow_create_policer_rules_t)
8613426add9SSuanming Mou 					(struct rte_eth_dev *dev,
8623426add9SSuanming Mou 					 struct mlx5_flow_meter *fm,
8633426add9SSuanming Mou 					 const struct rte_flow_attr *attr);
8643426add9SSuanming Mou typedef int (*mlx5_flow_destroy_policer_rules_t)
8653426add9SSuanming Mou 					(struct rte_eth_dev *dev,
8663426add9SSuanming Mou 					 const struct mlx5_flow_meter *fm,
8673426add9SSuanming Mou 					 const struct rte_flow_attr *attr);
868956d5c74SSuanming Mou typedef uint32_t (*mlx5_flow_counter_alloc_t)
869e189f55cSSuanming Mou 				   (struct rte_eth_dev *dev);
870e189f55cSSuanming Mou typedef void (*mlx5_flow_counter_free_t)(struct rte_eth_dev *dev,
871956d5c74SSuanming Mou 					 uint32_t cnt);
872e189f55cSSuanming Mou typedef int (*mlx5_flow_counter_query_t)(struct rte_eth_dev *dev,
873956d5c74SSuanming Mou 					 uint32_t cnt,
874e189f55cSSuanming Mou 					 bool clear, uint64_t *pkts,
875e189f55cSSuanming Mou 					 uint64_t *bytes);
87684c406e7SOri Kam struct mlx5_flow_driver_ops {
87784c406e7SOri Kam 	mlx5_flow_validate_t validate;
87884c406e7SOri Kam 	mlx5_flow_prepare_t prepare;
87984c406e7SOri Kam 	mlx5_flow_translate_t translate;
88084c406e7SOri Kam 	mlx5_flow_apply_t apply;
88184c406e7SOri Kam 	mlx5_flow_remove_t remove;
88284c406e7SOri Kam 	mlx5_flow_destroy_t destroy;
883684dafe7SMoti Haimovsky 	mlx5_flow_query_t query;
88446a5e6bcSSuanming Mou 	mlx5_flow_create_mtr_tbls_t create_mtr_tbls;
88546a5e6bcSSuanming Mou 	mlx5_flow_destroy_mtr_tbls_t destroy_mtr_tbls;
8863426add9SSuanming Mou 	mlx5_flow_create_policer_rules_t create_policer_rules;
8873426add9SSuanming Mou 	mlx5_flow_destroy_policer_rules_t destroy_policer_rules;
888e189f55cSSuanming Mou 	mlx5_flow_counter_alloc_t counter_alloc;
889e189f55cSSuanming Mou 	mlx5_flow_counter_free_t counter_free;
890e189f55cSSuanming Mou 	mlx5_flow_counter_query_t counter_query;
89184c406e7SOri Kam };
89284c406e7SOri Kam 
8933e8edd0eSViacheslav Ovsiienko 
894f15db67dSMatan Azrad #define MLX5_CNT_CONTAINER(sh, batch, thread) (&(sh)->cmng.ccont \
895f15db67dSMatan Azrad 	[(((sh)->cmng.mhi[batch] >> (thread)) & 0x1) * 2 + (batch)])
896f15db67dSMatan Azrad #define MLX5_CNT_CONTAINER_UNUSED(sh, batch, thread) (&(sh)->cmng.ccont \
897f15db67dSMatan Azrad 	[(~((sh)->cmng.mhi[batch] >> (thread)) & 0x1) * 2 + (batch)])
898f15db67dSMatan Azrad 
89984c406e7SOri Kam /* mlx5_flow.c */
90084c406e7SOri Kam 
90130a3687dSSuanming Mou struct mlx5_flow_id_pool *mlx5_flow_id_pool_alloc(uint32_t max_id);
902830d2091SOri Kam void mlx5_flow_id_pool_release(struct mlx5_flow_id_pool *pool);
903830d2091SOri Kam uint32_t mlx5_flow_id_get(struct mlx5_flow_id_pool *pool, uint32_t *id);
904830d2091SOri Kam uint32_t mlx5_flow_id_release(struct mlx5_flow_id_pool *pool,
905830d2091SOri Kam 			      uint32_t id);
906b67b4ecbSDekel Peled int mlx5_flow_group_to_table(const struct rte_flow_attr *attributes,
907fbde4331SMatan Azrad 			     bool external, uint32_t group, bool fdb_def_rule,
908fbde4331SMatan Azrad 			     uint32_t *table, struct rte_flow_error *error);
909e745f900SSuanming Mou uint64_t mlx5_flow_hashfields_adjust(struct mlx5_flow_rss_desc *rss_desc,
910e745f900SSuanming Mou 				     int tunnel, uint64_t layer_types,
911fc2c498cSOri Kam 				     uint64_t hash_fields);
91284c406e7SOri Kam uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
91384c406e7SOri Kam 				   uint32_t subpriority);
91499d49f47SMatan Azrad int mlx5_flow_get_reg_id(struct rte_eth_dev *dev,
9153e8edd0eSViacheslav Ovsiienko 				     enum mlx5_feature_name feature,
9163e8edd0eSViacheslav Ovsiienko 				     uint32_t id,
9173e8edd0eSViacheslav Ovsiienko 				     struct rte_flow_error *error);
918e4fcdcd6SMoti Haimovsky const struct rte_flow_action *mlx5_flow_find_action
919e4fcdcd6SMoti Haimovsky 					(const struct rte_flow_action *actions,
920e4fcdcd6SMoti Haimovsky 					 enum rte_flow_action_type action);
92184c406e7SOri Kam int mlx5_flow_validate_action_count(struct rte_eth_dev *dev,
9223e9fa079SDekel Peled 				    const struct rte_flow_attr *attr,
92384c406e7SOri Kam 				    struct rte_flow_error *error);
92484c406e7SOri Kam int mlx5_flow_validate_action_drop(uint64_t action_flags,
9253e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
92684c406e7SOri Kam 				   struct rte_flow_error *error);
92784c406e7SOri Kam int mlx5_flow_validate_action_flag(uint64_t action_flags,
9283e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
92984c406e7SOri Kam 				   struct rte_flow_error *error);
93084c406e7SOri Kam int mlx5_flow_validate_action_mark(const struct rte_flow_action *action,
93184c406e7SOri Kam 				   uint64_t action_flags,
9323e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
93384c406e7SOri Kam 				   struct rte_flow_error *error);
93484c406e7SOri Kam int mlx5_flow_validate_action_queue(const struct rte_flow_action *action,
93584c406e7SOri Kam 				    uint64_t action_flags,
93684c406e7SOri Kam 				    struct rte_eth_dev *dev,
9373e9fa079SDekel Peled 				    const struct rte_flow_attr *attr,
93884c406e7SOri Kam 				    struct rte_flow_error *error);
93984c406e7SOri Kam int mlx5_flow_validate_action_rss(const struct rte_flow_action *action,
94084c406e7SOri Kam 				  uint64_t action_flags,
94184c406e7SOri Kam 				  struct rte_eth_dev *dev,
9423e9fa079SDekel Peled 				  const struct rte_flow_attr *attr,
9431183f12fSOri Kam 				  uint64_t item_flags,
94484c406e7SOri Kam 				  struct rte_flow_error *error);
94584c406e7SOri Kam int mlx5_flow_validate_attributes(struct rte_eth_dev *dev,
94684c406e7SOri Kam 				  const struct rte_flow_attr *attributes,
94784c406e7SOri Kam 				  struct rte_flow_error *error);
9486bd7fbd0SDekel Peled int mlx5_flow_item_acceptable(const struct rte_flow_item *item,
9496bd7fbd0SDekel Peled 			      const uint8_t *mask,
9506bd7fbd0SDekel Peled 			      const uint8_t *nic_mask,
9516bd7fbd0SDekel Peled 			      unsigned int size,
9526bd7fbd0SDekel Peled 			      struct rte_flow_error *error);
95384c406e7SOri Kam int mlx5_flow_validate_item_eth(const struct rte_flow_item *item,
95484c406e7SOri Kam 				uint64_t item_flags,
95584c406e7SOri Kam 				struct rte_flow_error *error);
95684c406e7SOri Kam int mlx5_flow_validate_item_gre(const struct rte_flow_item *item,
95784c406e7SOri Kam 				uint64_t item_flags,
95884c406e7SOri Kam 				uint8_t target_protocol,
95984c406e7SOri Kam 				struct rte_flow_error *error);
960a7a03655SXiaoyu Min int mlx5_flow_validate_item_gre_key(const struct rte_flow_item *item,
961a7a03655SXiaoyu Min 				    uint64_t item_flags,
962a7a03655SXiaoyu Min 				    const struct rte_flow_item *gre_item,
963a7a03655SXiaoyu Min 				    struct rte_flow_error *error);
96484c406e7SOri Kam int mlx5_flow_validate_item_ipv4(const struct rte_flow_item *item,
965ed4c5247SShahaf Shuler 				 uint64_t item_flags,
966fba32130SXiaoyu Min 				 uint64_t last_item,
967fba32130SXiaoyu Min 				 uint16_t ether_type,
96855c61fa7SViacheslav Ovsiienko 				 const struct rte_flow_item_ipv4 *acc_mask,
96984c406e7SOri Kam 				 struct rte_flow_error *error);
97084c406e7SOri Kam int mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item,
97184c406e7SOri Kam 				 uint64_t item_flags,
972fba32130SXiaoyu Min 				 uint64_t last_item,
973fba32130SXiaoyu Min 				 uint16_t ether_type,
97455c61fa7SViacheslav Ovsiienko 				 const struct rte_flow_item_ipv6 *acc_mask,
97584c406e7SOri Kam 				 struct rte_flow_error *error);
97638f7efaaSDekel Peled int mlx5_flow_validate_item_mpls(struct rte_eth_dev *dev,
97738f7efaaSDekel Peled 				 const struct rte_flow_item *item,
97884c406e7SOri Kam 				 uint64_t item_flags,
97938f7efaaSDekel Peled 				 uint64_t prev_layer,
98084c406e7SOri Kam 				 struct rte_flow_error *error);
98184c406e7SOri Kam int mlx5_flow_validate_item_tcp(const struct rte_flow_item *item,
98284c406e7SOri Kam 				uint64_t item_flags,
98384c406e7SOri Kam 				uint8_t target_protocol,
98492378c2bSMoti Haimovsky 				const struct rte_flow_item_tcp *flow_mask,
98584c406e7SOri Kam 				struct rte_flow_error *error);
98684c406e7SOri Kam int mlx5_flow_validate_item_udp(const struct rte_flow_item *item,
98784c406e7SOri Kam 				uint64_t item_flags,
98884c406e7SOri Kam 				uint8_t target_protocol,
98984c406e7SOri Kam 				struct rte_flow_error *error);
99084c406e7SOri Kam int mlx5_flow_validate_item_vlan(const struct rte_flow_item *item,
991ed4c5247SShahaf Shuler 				 uint64_t item_flags,
992dfedf3e3SViacheslav Ovsiienko 				 struct rte_eth_dev *dev,
99384c406e7SOri Kam 				 struct rte_flow_error *error);
99484c406e7SOri Kam int mlx5_flow_validate_item_vxlan(const struct rte_flow_item *item,
99584c406e7SOri Kam 				  uint64_t item_flags,
99684c406e7SOri Kam 				  struct rte_flow_error *error);
99784c406e7SOri Kam int mlx5_flow_validate_item_vxlan_gpe(const struct rte_flow_item *item,
99884c406e7SOri Kam 				      uint64_t item_flags,
99984c406e7SOri Kam 				      struct rte_eth_dev *dev,
100084c406e7SOri Kam 				      struct rte_flow_error *error);
1001d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp(const struct rte_flow_item *item,
1002d53aa89aSXiaoyu Min 				 uint64_t item_flags,
1003d53aa89aSXiaoyu Min 				 uint8_t target_protocol,
1004d53aa89aSXiaoyu Min 				 struct rte_flow_error *error);
1005d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp6(const struct rte_flow_item *item,
1006d53aa89aSXiaoyu Min 				   uint64_t item_flags,
1007d53aa89aSXiaoyu Min 				   uint8_t target_protocol,
1008d53aa89aSXiaoyu Min 				   struct rte_flow_error *error);
1009ea81c1b8SDekel Peled int mlx5_flow_validate_item_nvgre(const struct rte_flow_item *item,
1010ea81c1b8SDekel Peled 				  uint64_t item_flags,
1011ea81c1b8SDekel Peled 				  uint8_t target_protocol,
1012ea81c1b8SDekel Peled 				  struct rte_flow_error *error);
1013e59a5dbcSMoti Haimovsky int mlx5_flow_validate_item_geneve(const struct rte_flow_item *item,
1014e59a5dbcSMoti Haimovsky 				   uint64_t item_flags,
1015e59a5dbcSMoti Haimovsky 				   struct rte_eth_dev *dev,
1016e59a5dbcSMoti Haimovsky 				   struct rte_flow_error *error);
101746a5e6bcSSuanming Mou struct mlx5_meter_domains_infos *mlx5_flow_create_mtr_tbls
10184dedc7c6SSuanming Mou 					(struct rte_eth_dev *dev,
10194dedc7c6SSuanming Mou 					 const struct mlx5_flow_meter *fm);
102046a5e6bcSSuanming Mou int mlx5_flow_destroy_mtr_tbls(struct rte_eth_dev *dev,
102146a5e6bcSSuanming Mou 			       struct mlx5_meter_domains_infos *tbl);
10223426add9SSuanming Mou int mlx5_flow_create_policer_rules(struct rte_eth_dev *dev,
10233426add9SSuanming Mou 				   struct mlx5_flow_meter *fm,
10243426add9SSuanming Mou 				   const struct rte_flow_attr *attr);
10253426add9SSuanming Mou int mlx5_flow_destroy_policer_rules(struct rte_eth_dev *dev,
10263426add9SSuanming Mou 				    struct mlx5_flow_meter *fm,
10273426add9SSuanming Mou 				    const struct rte_flow_attr *attr);
102802e76468SSuanming Mou int mlx5_flow_meter_flush(struct rte_eth_dev *dev,
102902e76468SSuanming Mou 			  struct rte_mtr_error *error);
103084c406e7SOri Kam #endif /* RTE_PMD_MLX5_FLOW_H_ */
1031