xref: /dpdk/drivers/net/mlx5/mlx5_flow.h (revision 99d49f47b38e9caee4886797f6c6db5e4023b213)
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 
28f5bf91deSMoti Haimovsky #include "mlx5.h"
29f5bf91deSMoti Haimovsky #include "mlx5_prm.h"
30f5bf91deSMoti Haimovsky 
3170d84dc7SOri Kam /* Private rte flow items. */
3270d84dc7SOri Kam enum mlx5_rte_flow_item_type {
3370d84dc7SOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_END = INT_MIN,
3470d84dc7SOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_TAG,
353c84f34eSOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_TX_QUEUE,
3670d84dc7SOri Kam };
3770d84dc7SOri Kam 
38baf516beSViacheslav Ovsiienko /* Private (internal) rte flow actions. */
3970d84dc7SOri Kam enum mlx5_rte_flow_action_type {
4070d84dc7SOri Kam 	MLX5_RTE_FLOW_ACTION_TYPE_END = INT_MIN,
4170d84dc7SOri Kam 	MLX5_RTE_FLOW_ACTION_TYPE_TAG,
42dd3c774fSViacheslav Ovsiienko 	MLX5_RTE_FLOW_ACTION_TYPE_MARK,
43baf516beSViacheslav Ovsiienko 	MLX5_RTE_FLOW_ACTION_TYPE_COPY_MREG,
4470d84dc7SOri Kam };
4570d84dc7SOri Kam 
4670d84dc7SOri Kam /* Matches on selected register. */
4770d84dc7SOri Kam struct mlx5_rte_flow_item_tag {
48baf516beSViacheslav Ovsiienko 	enum modify_reg id;
49cff811c7SViacheslav Ovsiienko 	uint32_t data;
5070d84dc7SOri Kam };
5170d84dc7SOri Kam 
5270d84dc7SOri Kam /* Modify selected register. */
5370d84dc7SOri Kam struct mlx5_rte_flow_action_set_tag {
54baf516beSViacheslav Ovsiienko 	enum modify_reg id;
55cff811c7SViacheslav Ovsiienko 	uint32_t data;
5670d84dc7SOri Kam };
5770d84dc7SOri Kam 
58baf516beSViacheslav Ovsiienko struct mlx5_flow_action_copy_mreg {
59baf516beSViacheslav Ovsiienko 	enum modify_reg dst;
60baf516beSViacheslav Ovsiienko 	enum modify_reg src;
61baf516beSViacheslav Ovsiienko };
62baf516beSViacheslav Ovsiienko 
633c84f34eSOri Kam /* Matches on source queue. */
643c84f34eSOri Kam struct mlx5_rte_flow_item_tx_queue {
653c84f34eSOri Kam 	uint32_t queue;
663c84f34eSOri Kam };
673c84f34eSOri Kam 
683e8edd0eSViacheslav Ovsiienko /* Feature name to allocate metadata register. */
693e8edd0eSViacheslav Ovsiienko enum mlx5_feature_name {
703e8edd0eSViacheslav Ovsiienko 	MLX5_HAIRPIN_RX,
713e8edd0eSViacheslav Ovsiienko 	MLX5_HAIRPIN_TX,
723e8edd0eSViacheslav Ovsiienko 	MLX5_METADATA_RX,
733e8edd0eSViacheslav Ovsiienko 	MLX5_METADATA_TX,
743e8edd0eSViacheslav Ovsiienko 	MLX5_METADATA_FDB,
753e8edd0eSViacheslav Ovsiienko 	MLX5_FLOW_MARK,
763e8edd0eSViacheslav Ovsiienko 	MLX5_APP_TAG,
773e8edd0eSViacheslav Ovsiienko 	MLX5_COPY_MARK,
7827efd5deSSuanming Mou 	MLX5_MTR_COLOR,
7927efd5deSSuanming Mou 	MLX5_MTR_SFX,
803e8edd0eSViacheslav Ovsiienko };
813e8edd0eSViacheslav Ovsiienko 
8284c406e7SOri Kam /* Pattern outer Layer bits. */
8384c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L2 (1u << 0)
8484c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3_IPV4 (1u << 1)
8584c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3_IPV6 (1u << 2)
8684c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4_UDP (1u << 3)
8784c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4_TCP (1u << 4)
8884c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_VLAN (1u << 5)
8984c406e7SOri Kam 
9084c406e7SOri Kam /* Pattern inner Layer bits. */
9184c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L2 (1u << 6)
9284c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3_IPV4 (1u << 7)
9384c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3_IPV6 (1u << 8)
9484c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4_UDP (1u << 9)
9584c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4_TCP (1u << 10)
9684c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_VLAN (1u << 11)
9784c406e7SOri Kam 
9884c406e7SOri Kam /* Pattern tunnel Layer bits. */
9984c406e7SOri Kam #define MLX5_FLOW_LAYER_VXLAN (1u << 12)
10084c406e7SOri Kam #define MLX5_FLOW_LAYER_VXLAN_GPE (1u << 13)
10184c406e7SOri Kam #define MLX5_FLOW_LAYER_GRE (1u << 14)
10284c406e7SOri Kam #define MLX5_FLOW_LAYER_MPLS (1u << 15)
103ea81c1b8SDekel Peled /* List of tunnel Layer bits continued below. */
10484c406e7SOri Kam 
1056bd7fbd0SDekel Peled /* General pattern items bits. */
1066bd7fbd0SDekel Peled #define MLX5_FLOW_ITEM_METADATA (1u << 16)
1072e4c987aSOri Kam #define MLX5_FLOW_ITEM_PORT_ID (1u << 17)
10870d84dc7SOri Kam #define MLX5_FLOW_ITEM_TAG (1u << 18)
10955deee17SViacheslav Ovsiienko #define MLX5_FLOW_ITEM_MARK (1u << 19)
1106bd7fbd0SDekel Peled 
111d53aa89aSXiaoyu Min /* Pattern MISC bits. */
11220ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_ICMP (1u << 20)
11320ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_ICMP6 (1u << 21)
11420ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_GRE_KEY (1u << 22)
115d53aa89aSXiaoyu Min 
116ea81c1b8SDekel Peled /* Pattern tunnel Layer bits (continued). */
11720ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_IPIP (1u << 23)
11820ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_IPV6_ENCAP (1u << 24)
11920ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_NVGRE (1u << 25)
12020ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_GENEVE (1u << 26)
1215e33bebdSXiaoyu Min 
1223c84f34eSOri Kam /* Queue items. */
12320ac7966SXiaoyu Min #define MLX5_FLOW_ITEM_TX_QUEUE (1u << 27)
1243c84f34eSOri Kam 
125f31d7a01SDekel Peled /* Pattern tunnel Layer bits (continued). */
126f31d7a01SDekel Peled #define MLX5_FLOW_LAYER_GTP (1u << 28)
127f31d7a01SDekel Peled 
12884c406e7SOri Kam /* Outer Masks. */
12984c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3 \
13084c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L3_IPV6)
13184c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4 \
13284c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L4_UDP | MLX5_FLOW_LAYER_OUTER_L4_TCP)
13384c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER \
13484c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_OUTER_L3 | \
13584c406e7SOri Kam 	 MLX5_FLOW_LAYER_OUTER_L4)
13684c406e7SOri Kam 
13784c406e7SOri Kam /* Tunnel Masks. */
13884c406e7SOri Kam #define MLX5_FLOW_LAYER_TUNNEL \
13984c406e7SOri Kam 	(MLX5_FLOW_LAYER_VXLAN | MLX5_FLOW_LAYER_VXLAN_GPE | \
140ea81c1b8SDekel Peled 	 MLX5_FLOW_LAYER_GRE | MLX5_FLOW_LAYER_NVGRE | MLX5_FLOW_LAYER_MPLS | \
141e59a5dbcSMoti Haimovsky 	 MLX5_FLOW_LAYER_IPIP | MLX5_FLOW_LAYER_IPV6_ENCAP | \
142f31d7a01SDekel Peled 	 MLX5_FLOW_LAYER_GENEVE | MLX5_FLOW_LAYER_GTP)
14384c406e7SOri Kam 
14484c406e7SOri Kam /* Inner Masks. */
14584c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3 \
14684c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV6)
14784c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4 \
14884c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L4_UDP | MLX5_FLOW_LAYER_INNER_L4_TCP)
14984c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER \
15084c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L2 | MLX5_FLOW_LAYER_INNER_L3 | \
15184c406e7SOri Kam 	 MLX5_FLOW_LAYER_INNER_L4)
15284c406e7SOri Kam 
1534bb14c83SDekel Peled /* Layer Masks. */
1544bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L2 \
1554bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_INNER_L2)
1564bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV4 \
1574bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV4)
1584bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV6 \
1594bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV6 | MLX5_FLOW_LAYER_INNER_L3_IPV6)
1604bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3 \
1614bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_L3_IPV4 | MLX5_FLOW_LAYER_L3_IPV6)
1624bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L4 \
1634bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L4 | MLX5_FLOW_LAYER_INNER_L4)
1644bb14c83SDekel Peled 
16584c406e7SOri Kam /* Actions */
16684c406e7SOri Kam #define MLX5_FLOW_ACTION_DROP (1u << 0)
16784c406e7SOri Kam #define MLX5_FLOW_ACTION_QUEUE (1u << 1)
16884c406e7SOri Kam #define MLX5_FLOW_ACTION_RSS (1u << 2)
16984c406e7SOri Kam #define MLX5_FLOW_ACTION_FLAG (1u << 3)
17084c406e7SOri Kam #define MLX5_FLOW_ACTION_MARK (1u << 4)
17184c406e7SOri Kam #define MLX5_FLOW_ACTION_COUNT (1u << 5)
17257123c00SYongseok Koh #define MLX5_FLOW_ACTION_PORT_ID (1u << 6)
17357123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_POP_VLAN (1u << 7)
17457123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_PUSH_VLAN (1u << 8)
17557123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_SET_VLAN_VID (1u << 9)
17657123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_SET_VLAN_PCP (1u << 10)
1772ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV4_SRC (1u << 11)
1782ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV4_DST (1u << 12)
1792ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV6_SRC (1u << 13)
1802ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV6_DST (1u << 14)
1812ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TP_SRC (1u << 15)
1822ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TP_DST (1u << 16)
18331fda518SYongseok Koh #define MLX5_FLOW_ACTION_JUMP (1u << 17)
184a7cb5bcdSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TTL (1u << 18)
185a7cb5bcdSXiaoyu Min #define MLX5_FLOW_ACTION_DEC_TTL (1u << 19)
18676046778SXiaoyu Min #define MLX5_FLOW_ACTION_SET_MAC_SRC (1u << 20)
18776046778SXiaoyu Min #define MLX5_FLOW_ACTION_SET_MAC_DST (1u << 21)
18834d41b7aSDekel Peled #define MLX5_FLOW_ACTION_VXLAN_ENCAP (1u << 22)
18949d6465aSDekel Peled #define MLX5_FLOW_ACTION_VXLAN_DECAP (1u << 23)
190a124cff0SDekel Peled #define MLX5_FLOW_ACTION_NVGRE_ENCAP (1u << 24)
1914b8727f0SDekel Peled #define MLX5_FLOW_ACTION_NVGRE_DECAP (1u << 25)
1928ba9eee4SDekel Peled #define MLX5_FLOW_ACTION_RAW_ENCAP (1u << 26)
1938ba9eee4SDekel Peled #define MLX5_FLOW_ACTION_RAW_DECAP (1u << 27)
194585b99fbSDekel Peled #define MLX5_FLOW_ACTION_INC_TCP_SEQ (1u << 28)
195585b99fbSDekel Peled #define MLX5_FLOW_ACTION_DEC_TCP_SEQ (1u << 29)
196585b99fbSDekel Peled #define MLX5_FLOW_ACTION_INC_TCP_ACK (1u << 30)
197585b99fbSDekel Peled #define MLX5_FLOW_ACTION_DEC_TCP_ACK (1u << 31)
19870d84dc7SOri Kam #define MLX5_FLOW_ACTION_SET_TAG (1ull << 32)
19955deee17SViacheslav Ovsiienko #define MLX5_FLOW_ACTION_MARK_EXT (1ull << 33)
200fcc8d2f7SViacheslav Ovsiienko #define MLX5_FLOW_ACTION_SET_META (1ull << 34)
201266e9f3dSSuanming Mou #define MLX5_FLOW_ACTION_METER (1ull << 35)
2026f26e604SSuanming Mou #define MLX5_FLOW_ACTION_SET_IPV4_DSCP (1ull << 36)
2036f26e604SSuanming Mou #define MLX5_FLOW_ACTION_SET_IPV6_DSCP (1ull << 37)
20484c406e7SOri Kam 
20584c406e7SOri Kam #define MLX5_FLOW_FATE_ACTIONS \
206684b9a1bSOri Kam 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | \
207684b9a1bSOri Kam 	 MLX5_FLOW_ACTION_RSS | MLX5_FLOW_ACTION_JUMP)
20884c406e7SOri Kam 
2092e4c987aSOri Kam #define MLX5_FLOW_FATE_ESWITCH_ACTIONS \
2102e4c987aSOri Kam 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_PORT_ID | \
2112e4c987aSOri Kam 	 MLX5_FLOW_ACTION_JUMP)
2122e4c987aSOri Kam 
2138ba9eee4SDekel Peled #define MLX5_FLOW_ENCAP_ACTIONS	(MLX5_FLOW_ACTION_VXLAN_ENCAP | \
2148ba9eee4SDekel Peled 				 MLX5_FLOW_ACTION_NVGRE_ENCAP | \
21506742adaSDekel Peled 				 MLX5_FLOW_ACTION_RAW_ENCAP)
216a124cff0SDekel Peled 
2178ba9eee4SDekel Peled #define MLX5_FLOW_DECAP_ACTIONS	(MLX5_FLOW_ACTION_VXLAN_DECAP | \
2188ba9eee4SDekel Peled 				 MLX5_FLOW_ACTION_NVGRE_DECAP | \
21906742adaSDekel Peled 				 MLX5_FLOW_ACTION_RAW_DECAP)
2204b8727f0SDekel Peled 
2214bb14c83SDekel Peled #define MLX5_FLOW_MODIFY_HDR_ACTIONS (MLX5_FLOW_ACTION_SET_IPV4_SRC | \
2224bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV4_DST | \
2234bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV6_SRC | \
2244bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV6_DST | \
2254bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TP_SRC | \
2264bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TP_DST | \
2274bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TTL | \
2284bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_DEC_TTL | \
2294bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_MAC_SRC | \
230585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_SET_MAC_DST | \
231585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_INC_TCP_SEQ | \
232585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_DEC_TCP_SEQ | \
233585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_INC_TCP_ACK | \
2345f163d52SMoti Haimovsky 				      MLX5_FLOW_ACTION_DEC_TCP_ACK | \
23570d84dc7SOri Kam 				      MLX5_FLOW_ACTION_OF_SET_VLAN_VID | \
23655deee17SViacheslav Ovsiienko 				      MLX5_FLOW_ACTION_SET_TAG | \
237fcc8d2f7SViacheslav Ovsiienko 				      MLX5_FLOW_ACTION_MARK_EXT | \
2386f26e604SSuanming Mou 				      MLX5_FLOW_ACTION_SET_META | \
2396f26e604SSuanming Mou 				      MLX5_FLOW_ACTION_SET_IPV4_DSCP | \
2406f26e604SSuanming Mou 				      MLX5_FLOW_ACTION_SET_IPV6_DSCP)
2414bb14c83SDekel Peled 
2429aee7a84SMoti Haimovsky #define MLX5_FLOW_VLAN_ACTIONS (MLX5_FLOW_ACTION_OF_POP_VLAN | \
2439aee7a84SMoti Haimovsky 				MLX5_FLOW_ACTION_OF_PUSH_VLAN)
24484c406e7SOri Kam #ifndef IPPROTO_MPLS
24584c406e7SOri Kam #define IPPROTO_MPLS 137
24684c406e7SOri Kam #endif
24784c406e7SOri Kam 
248d1abe664SDekel Peled /* UDP port number for MPLS */
249d1abe664SDekel Peled #define MLX5_UDP_PORT_MPLS 6635
250d1abe664SDekel Peled 
251fc2c498cSOri Kam /* UDP port numbers for VxLAN. */
252fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN 4789
253fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN_GPE 4790
254fc2c498cSOri Kam 
255e59a5dbcSMoti Haimovsky /* UDP port numbers for GENEVE. */
256e59a5dbcSMoti Haimovsky #define MLX5_UDP_PORT_GENEVE 6081
257e59a5dbcSMoti Haimovsky 
25884c406e7SOri Kam /* Priority reserved for default flows. */
25984c406e7SOri Kam #define MLX5_FLOW_PRIO_RSVD ((uint32_t)-1)
26084c406e7SOri Kam 
26184c406e7SOri Kam /*
26284c406e7SOri Kam  * Number of sub priorities.
26384c406e7SOri Kam  * For each kind of pattern matching i.e. L2, L3, L4 to have a correct
26484c406e7SOri Kam  * matching on the NIC (firmware dependent) L4 most have the higher priority
26584c406e7SOri Kam  * followed by L3 and ending with L2.
26684c406e7SOri Kam  */
26784c406e7SOri Kam #define MLX5_PRIORITY_MAP_L2 2
26884c406e7SOri Kam #define MLX5_PRIORITY_MAP_L3 1
26984c406e7SOri Kam #define MLX5_PRIORITY_MAP_L4 0
27084c406e7SOri Kam #define MLX5_PRIORITY_MAP_MAX 3
27184c406e7SOri Kam 
272fc2c498cSOri Kam /* Valid layer type for IPV4 RSS. */
273fc2c498cSOri Kam #define MLX5_IPV4_LAYER_TYPES \
274fc2c498cSOri Kam 	(ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
275fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV4_UDP | \
276fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV4_OTHER)
277fc2c498cSOri Kam 
278fc2c498cSOri Kam /* IBV hash source bits  for IPV4. */
279fc2c498cSOri Kam #define MLX5_IPV4_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4)
280fc2c498cSOri Kam 
281fc2c498cSOri Kam /* Valid layer type for IPV6 RSS. */
282fc2c498cSOri Kam #define MLX5_IPV6_LAYER_TYPES \
283fc2c498cSOri Kam 	(ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | ETH_RSS_NONFRAG_IPV6_TCP | \
284fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_IPV6_EX  | ETH_RSS_IPV6_TCP_EX | \
285fc2c498cSOri Kam 	 ETH_RSS_IPV6_UDP_EX | ETH_RSS_NONFRAG_IPV6_OTHER)
286fc2c498cSOri Kam 
287fc2c498cSOri Kam /* IBV hash source bits  for IPV6. */
288fc2c498cSOri Kam #define MLX5_IPV6_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6)
289fc2c498cSOri Kam 
290c3e33304SDekel Peled /* IBV hash bits for L3 SRC. */
291c3e33304SDekel Peled #define MLX5_L3_SRC_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_SRC_IPV6)
292c3e33304SDekel Peled 
293c3e33304SDekel Peled /* IBV hash bits for L3 DST. */
294c3e33304SDekel Peled #define MLX5_L3_DST_IBV_RX_HASH (IBV_RX_HASH_DST_IPV4 | IBV_RX_HASH_DST_IPV6)
295c3e33304SDekel Peled 
296c3e33304SDekel Peled /* IBV hash bits for TCP. */
297c3e33304SDekel Peled #define MLX5_TCP_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_TCP | \
298c3e33304SDekel Peled 			      IBV_RX_HASH_DST_PORT_TCP)
299c3e33304SDekel Peled 
300c3e33304SDekel Peled /* IBV hash bits for UDP. */
301c3e33304SDekel Peled #define MLX5_UDP_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_UDP | \
302c3e33304SDekel Peled 			      IBV_RX_HASH_DST_PORT_UDP)
303c3e33304SDekel Peled 
304c3e33304SDekel Peled /* IBV hash bits for L4 SRC. */
305c3e33304SDekel Peled #define MLX5_L4_SRC_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_TCP | \
306c3e33304SDekel Peled 				 IBV_RX_HASH_SRC_PORT_UDP)
307c3e33304SDekel Peled 
308c3e33304SDekel Peled /* IBV hash bits for L4 DST. */
309c3e33304SDekel Peled #define MLX5_L4_DST_IBV_RX_HASH (IBV_RX_HASH_DST_PORT_TCP | \
310c3e33304SDekel Peled 				 IBV_RX_HASH_DST_PORT_UDP)
311e59a5dbcSMoti Haimovsky 
312e59a5dbcSMoti Haimovsky /* Geneve header first 16Bit */
313e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_MASK 0x3
314e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_SHIFT 14
315e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_VAL(a) \
316e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_VER_SHIFT)) & (MLX5_GENEVE_VER_MASK))
317e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_MASK 0x3F
318e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_SHIFT 7
319e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_VAL(a) \
320e59a5dbcSMoti Haimovsky 	    (((a) >> (MLX5_GENEVE_OPTLEN_SHIFT)) & (MLX5_GENEVE_OPTLEN_MASK))
321e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_MASK 0x1
322e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_SHIFT 7
323e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_VAL(a) \
324e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_OAMF_SHIFT)) & (MLX5_GENEVE_OAMF_MASK))
325e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_MASK 0x1
326e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_SHIFT 6
327e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_VAL(a) \
328e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_CRITO_SHIFT)) & (MLX5_GENEVE_CRITO_MASK))
329e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_MASK 0x3F
330e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_VAL(a) ((a) & (MLX5_GENEVE_RSVD_MASK))
331e59a5dbcSMoti Haimovsky /*
332e59a5dbcSMoti Haimovsky  * The length of the Geneve options fields, expressed in four byte multiples,
333e59a5dbcSMoti Haimovsky  * not including the eight byte fixed tunnel.
334e59a5dbcSMoti Haimovsky  */
335e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_0 14
336e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_1 63
337e59a5dbcSMoti Haimovsky 
3380c76d1c9SYongseok Koh enum mlx5_flow_drv_type {
3390c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_MIN,
3400c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_DV,
3410c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_VERBS,
3420c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_MAX,
3430c76d1c9SYongseok Koh };
3440c76d1c9SYongseok Koh 
345865a0c15SOri Kam /* Matcher PRM representation */
346865a0c15SOri Kam struct mlx5_flow_dv_match_params {
347865a0c15SOri Kam 	size_t size;
348865a0c15SOri Kam 	/**< Size of match value. Do NOT split size and key! */
349865a0c15SOri Kam 	uint32_t buf[MLX5_ST_SZ_DW(fte_match_param)];
350865a0c15SOri Kam 	/**< Matcher value. This value is used as the mask or as a key. */
351865a0c15SOri Kam };
352865a0c15SOri Kam 
353865a0c15SOri Kam /* Matcher structure. */
354865a0c15SOri Kam struct mlx5_flow_dv_matcher {
355865a0c15SOri Kam 	LIST_ENTRY(mlx5_flow_dv_matcher) next;
356e9e36e52SBing Zhao 	/**< Pointer to the next element. */
357e9e36e52SBing Zhao 	struct mlx5_flow_tbl_resource *tbl;
358e9e36e52SBing Zhao 	/**< Pointer to the table(group) the matcher associated with. */
359865a0c15SOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
360865a0c15SOri Kam 	void *matcher_object; /**< Pointer to DV matcher */
361865a0c15SOri Kam 	uint16_t crc; /**< CRC of key. */
362865a0c15SOri Kam 	uint16_t priority; /**< Priority of matcher. */
363865a0c15SOri Kam 	struct mlx5_flow_dv_match_params mask; /**< Matcher mask. */
364865a0c15SOri Kam };
365865a0c15SOri Kam 
3664bb14c83SDekel Peled #define MLX5_ENCAP_MAX_LEN 132
3674bb14c83SDekel Peled 
368c513f05cSDekel Peled /* Encap/decap resource structure. */
369c513f05cSDekel Peled struct mlx5_flow_dv_encap_decap_resource {
370c513f05cSDekel Peled 	LIST_ENTRY(mlx5_flow_dv_encap_decap_resource) next;
371c513f05cSDekel Peled 	/* Pointer to next element. */
372c513f05cSDekel Peled 	rte_atomic32_t refcnt; /**< Reference counter. */
373cbb66daaSOri Kam 	void *verbs_action;
374c513f05cSDekel Peled 	/**< Verbs encap/decap action object. */
375c513f05cSDekel Peled 	uint8_t buf[MLX5_ENCAP_MAX_LEN];
376c513f05cSDekel Peled 	size_t size;
377c513f05cSDekel Peled 	uint8_t reformat_type;
378c513f05cSDekel Peled 	uint8_t ft_type;
3794f84a197SOri Kam 	uint64_t flags; /**< Flags for RDMA API. */
380c513f05cSDekel Peled };
381c513f05cSDekel Peled 
382cbb66daaSOri Kam /* Tag resource structure. */
383cbb66daaSOri Kam struct mlx5_flow_dv_tag_resource {
384e484e403SBing Zhao 	struct mlx5_hlist_entry entry;
385e484e403SBing Zhao 	/**< hash list entry for tag resource, tag value as the key. */
386cbb66daaSOri Kam 	void *action;
387cbb66daaSOri Kam 	/**< Verbs tag action object. */
388e484e403SBing Zhao 	rte_atomic32_t refcnt; /**< Reference counter. */
389cbb66daaSOri Kam };
390cbb66daaSOri Kam 
3910e9d0002SViacheslav Ovsiienko /*
3920e9d0002SViacheslav Ovsiienko  * Number of modification commands.
393024e9575SBing Zhao  * If extensive metadata registers are supported, the maximal actions amount is
394024e9575SBing Zhao  * 16 and 8 otherwise on root table. The validation could also be done in the
395024e9575SBing Zhao  * lower driver layer.
396024e9575SBing Zhao  * On non-root table, there is no limitation, but 32 is enough right now.
3970e9d0002SViacheslav Ovsiienko  */
398024e9575SBing Zhao #define MLX5_MAX_MODIFY_NUM			32
399024e9575SBing Zhao #define MLX5_ROOT_TBL_MODIFY_NUM		16
400024e9575SBing Zhao #define MLX5_ROOT_TBL_MODIFY_NUM_NO_MREG	8
4014bb14c83SDekel Peled 
4024bb14c83SDekel Peled /* Modify resource structure */
4034bb14c83SDekel Peled struct mlx5_flow_dv_modify_hdr_resource {
4044bb14c83SDekel Peled 	LIST_ENTRY(mlx5_flow_dv_modify_hdr_resource) next;
4054bb14c83SDekel Peled 	/* Pointer to next element. */
4064bb14c83SDekel Peled 	rte_atomic32_t refcnt; /**< Reference counter. */
4074bb14c83SDekel Peled 	struct ibv_flow_action *verbs_action;
4084bb14c83SDekel Peled 	/**< Verbs modify header action object. */
4094bb14c83SDekel Peled 	uint8_t ft_type; /**< Flow table type, Rx or Tx. */
4104bb14c83SDekel Peled 	uint32_t actions_num; /**< Number of modification actions. */
41179e7ba1fSOri Kam 	uint64_t flags; /**< Flags for RDMA API. */
412024e9575SBing Zhao 	struct mlx5_modification_cmd actions[];
413024e9575SBing Zhao 	/**< Modification actions. */
4144bb14c83SDekel Peled };
4154bb14c83SDekel Peled 
416684b9a1bSOri Kam /* Jump action resource structure. */
417684b9a1bSOri Kam struct mlx5_flow_dv_jump_tbl_resource {
418684b9a1bSOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
419684b9a1bSOri Kam 	uint8_t ft_type; /**< Flow table type, Rx or Tx. */
4206c1d9a64SBing Zhao 	void *action; /**< Pointer to the rdma core action. */
421684b9a1bSOri Kam };
422684b9a1bSOri Kam 
423c269b517SOri Kam /* Port ID resource structure. */
424c269b517SOri Kam struct mlx5_flow_dv_port_id_action_resource {
425c269b517SOri Kam 	LIST_ENTRY(mlx5_flow_dv_port_id_action_resource) next;
426c269b517SOri Kam 	/* Pointer to next element. */
427c269b517SOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
428c269b517SOri Kam 	void *action;
429c269b517SOri Kam 	/**< Verbs tag action object. */
430c269b517SOri Kam 	uint32_t port_id; /**< Port ID value. */
431c269b517SOri Kam };
432c269b517SOri Kam 
4339aee7a84SMoti Haimovsky /* Push VLAN action resource structure */
4349aee7a84SMoti Haimovsky struct mlx5_flow_dv_push_vlan_action_resource {
4359aee7a84SMoti Haimovsky 	LIST_ENTRY(mlx5_flow_dv_push_vlan_action_resource) next;
4369aee7a84SMoti Haimovsky 	/* Pointer to next element. */
4379aee7a84SMoti Haimovsky 	rte_atomic32_t refcnt; /**< Reference counter. */
4389aee7a84SMoti Haimovsky 	void *action; /**< Direct verbs action object. */
4399aee7a84SMoti Haimovsky 	uint8_t ft_type; /**< Flow table type, Rx, Tx or FDB. */
4409aee7a84SMoti Haimovsky 	rte_be32_t vlan_tag; /**< VLAN tag value. */
4419aee7a84SMoti Haimovsky };
4429aee7a84SMoti Haimovsky 
443dd3c774fSViacheslav Ovsiienko /* Metadata register copy table entry. */
444dd3c774fSViacheslav Ovsiienko struct mlx5_flow_mreg_copy_resource {
445dd3c774fSViacheslav Ovsiienko 	/*
446dd3c774fSViacheslav Ovsiienko 	 * Hash list entry for copy table.
447dd3c774fSViacheslav Ovsiienko 	 *  - Key is 32/64-bit MARK action ID.
448dd3c774fSViacheslav Ovsiienko 	 *  - MUST be the first entry.
449dd3c774fSViacheslav Ovsiienko 	 */
450dd3c774fSViacheslav Ovsiienko 	struct mlx5_hlist_entry hlist_ent;
451dd3c774fSViacheslav Ovsiienko 	LIST_ENTRY(mlx5_flow_mreg_copy_resource) next;
452dd3c774fSViacheslav Ovsiienko 	/* List entry for device flows. */
453dd3c774fSViacheslav Ovsiienko 	uint32_t refcnt; /* Reference counter. */
454dd3c774fSViacheslav Ovsiienko 	uint32_t appcnt; /* Apply/Remove counter. */
455dd3c774fSViacheslav Ovsiienko 	struct rte_flow *flow; /* Built flow for copy. */
456dd3c774fSViacheslav Ovsiienko };
457dd3c774fSViacheslav Ovsiienko 
458860897d2SBing Zhao /* Table data structure of the hash organization. */
459860897d2SBing Zhao struct mlx5_flow_tbl_data_entry {
460860897d2SBing Zhao 	struct mlx5_hlist_entry entry;
461e9e36e52SBing Zhao 	/**< hash list entry, 64-bits key inside. */
462860897d2SBing Zhao 	struct mlx5_flow_tbl_resource tbl;
463e9e36e52SBing Zhao 	/**< flow table resource. */
464e9e36e52SBing Zhao 	LIST_HEAD(matchers, mlx5_flow_dv_matcher) matchers;
465e9e36e52SBing Zhao 	/**< matchers' header associated with the flow table. */
4666c1d9a64SBing Zhao 	struct mlx5_flow_dv_jump_tbl_resource jump;
4676c1d9a64SBing Zhao 	/**< jump resource, at most one for each table created. */
468860897d2SBing Zhao };
469860897d2SBing Zhao 
4704bb14c83SDekel Peled /*
4714bb14c83SDekel Peled  * Max number of actions per DV flow.
4724bb14c83SDekel Peled  * See CREATE_FLOW_MAX_FLOW_ACTIONS_SUPPORTED
4734bb14c83SDekel Peled  * In rdma-core file providers/mlx5/verbs.c
4744bb14c83SDekel Peled  */
4754bb14c83SDekel Peled #define MLX5_DV_MAX_NUMBER_OF_ACTIONS 8
4764bb14c83SDekel Peled 
477865a0c15SOri Kam /* DV flows structure. */
478865a0c15SOri Kam struct mlx5_flow_dv {
479865a0c15SOri Kam 	struct mlx5_hrxq *hrxq; /**< Hash Rx queues. */
480865a0c15SOri Kam 	/* Flow DV api: */
481865a0c15SOri Kam 	struct mlx5_flow_dv_matcher *matcher; /**< Cache to matcher. */
482865a0c15SOri Kam 	struct mlx5_flow_dv_match_params value;
483865a0c15SOri Kam 	/**< Holds the value that the packet is compared to. */
484c513f05cSDekel Peled 	struct mlx5_flow_dv_encap_decap_resource *encap_decap;
485c513f05cSDekel Peled 	/**< Pointer to encap/decap resource in cache. */
4864bb14c83SDekel Peled 	struct mlx5_flow_dv_modify_hdr_resource *modify_hdr;
4874bb14c83SDekel Peled 	/**< Pointer to modify header resource in cache. */
488865a0c15SOri Kam 	struct ibv_flow *flow; /**< Installed flow. */
489684b9a1bSOri Kam 	struct mlx5_flow_dv_jump_tbl_resource *jump;
490684b9a1bSOri Kam 	/**< Pointer to the jump action resource. */
491c269b517SOri Kam 	struct mlx5_flow_dv_port_id_action_resource *port_id_action;
492c269b517SOri Kam 	/**< Pointer to port ID action resource. */
493dfedf3e3SViacheslav Ovsiienko 	struct mlx5_vf_vlan vf_vlan;
494dfedf3e3SViacheslav Ovsiienko 	/**< Structure for VF VLAN workaround. */
4959aee7a84SMoti Haimovsky 	struct mlx5_flow_dv_push_vlan_action_resource *push_vlan_res;
4969aee7a84SMoti Haimovsky 	/**< Pointer to push VLAN action resource in cache. */
497e205c95fSViacheslav Ovsiienko 	struct mlx5_flow_dv_tag_resource *tag_resource;
498e205c95fSViacheslav Ovsiienko 	/**< pointer to the tag action. */
499d02cb069SOri Kam #ifdef HAVE_IBV_FLOW_DV_SUPPORT
500cbb66daaSOri Kam 	void *actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS];
501d02cb069SOri Kam 	/**< Action list. */
502d02cb069SOri Kam #endif
503d02cb069SOri Kam 	int actions_n; /**< number of actions. */
504865a0c15SOri Kam };
505865a0c15SOri Kam 
50684c406e7SOri Kam /* Verbs specification header. */
50784c406e7SOri Kam struct ibv_spec_header {
50884c406e7SOri Kam 	enum ibv_flow_spec_type type;
50984c406e7SOri Kam 	uint16_t size;
51084c406e7SOri Kam };
51184c406e7SOri Kam 
51284c406e7SOri Kam /** Handles information leading to a drop fate. */
51384c406e7SOri Kam struct mlx5_flow_verbs {
51484c406e7SOri Kam 	LIST_ENTRY(mlx5_flow_verbs) next;
51584c406e7SOri Kam 	unsigned int size; /**< Size of the attribute. */
51684c406e7SOri Kam 	struct {
51784c406e7SOri Kam 		struct ibv_flow_attr *attr;
51884c406e7SOri Kam 		/**< Pointer to the Specification buffer. */
51984c406e7SOri Kam 		uint8_t *specs; /**< Pointer to the specifications. */
52084c406e7SOri Kam 	};
52184c406e7SOri Kam 	struct ibv_flow *flow; /**< Verbs flow pointer. */
52284c406e7SOri Kam 	struct mlx5_hrxq *hrxq; /**< Hash Rx queue object. */
523dfedf3e3SViacheslav Ovsiienko 	struct mlx5_vf_vlan vf_vlan;
524dfedf3e3SViacheslav Ovsiienko 	/**< Structure for VF VLAN workaround. */
52584c406e7SOri Kam };
52684c406e7SOri Kam 
527e205c95fSViacheslav Ovsiienko struct mlx5_flow_rss {
528e205c95fSViacheslav Ovsiienko 	uint32_t level;
529e205c95fSViacheslav Ovsiienko 	uint32_t queue_num; /**< Number of entries in @p queue. */
530e205c95fSViacheslav Ovsiienko 	uint64_t types; /**< Specific RSS hash types (see ETH_RSS_*). */
531e205c95fSViacheslav Ovsiienko 	uint16_t (*queue)[]; /**< Destination queues to redirect traffic to. */
532e205c95fSViacheslav Ovsiienko 	uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */
533e205c95fSViacheslav Ovsiienko };
534e205c95fSViacheslav Ovsiienko 
53584c406e7SOri Kam /** Device flow structure. */
53684c406e7SOri Kam struct mlx5_flow {
53784c406e7SOri Kam 	LIST_ENTRY(mlx5_flow) next;
53884c406e7SOri Kam 	struct rte_flow *flow; /**< Pointer to the main flow. */
5390ddd1143SYongseok Koh 	uint64_t layers;
54024663641SYongseok Koh 	/**< Bit-fields of present layers, see MLX5_FLOW_LAYER_*. */
541d85c7b5eSOri Kam 	uint64_t actions;
542d85c7b5eSOri Kam 	/**< Bit-fields of detected actions, see MLX5_FLOW_ACTION_*. */
543e205c95fSViacheslav Ovsiienko 	uint64_t hash_fields; /**< Verbs hash Rx queue hash fields. */
544e205c95fSViacheslav Ovsiienko 	uint8_t ingress; /**< 1 if the flow is ingress. */
545e205c95fSViacheslav Ovsiienko 	uint32_t group; /**< The group index. */
546e205c95fSViacheslav Ovsiienko 	uint8_t transfer; /**< 1 if the flow is E-Switch flow. */
54784c406e7SOri Kam 	union {
548c4d9b9f7SOri Kam #ifdef HAVE_IBV_FLOW_DV_SUPPORT
549865a0c15SOri Kam 		struct mlx5_flow_dv dv;
550c4d9b9f7SOri Kam #endif
551865a0c15SOri Kam 		struct mlx5_flow_verbs verbs;
55284c406e7SOri Kam 	};
5538d72fa66SSuanming Mou 	union {
55471e254bcSViacheslav Ovsiienko 		uint32_t qrss_id; /**< Uniqie Q/RSS suffix subflow tag. */
5559ea9b049SSuanming Mou 		uint32_t mtr_flow_id; /**< Unique meter match flow id. */
5568d72fa66SSuanming Mou 	};
557b67b4ecbSDekel Peled 	bool external; /**< true if the flow is created external to PMD. */
55884c406e7SOri Kam };
55984c406e7SOri Kam 
56033e01809SSuanming Mou /* Flow meter state. */
56133e01809SSuanming Mou #define MLX5_FLOW_METER_DISABLE 0
56233e01809SSuanming Mou #define MLX5_FLOW_METER_ENABLE 1
56333e01809SSuanming Mou 
5643bd26b23SSuanming Mou #define MLX5_MAN_WIDTH 8
56546a5e6bcSSuanming Mou /* Modify this value if enum rte_mtr_color changes. */
56646a5e6bcSSuanming Mou #define RTE_MTR_DROPPED RTE_COLORS
56746a5e6bcSSuanming Mou 
5684dedc7c6SSuanming Mou /* Meter policer statistics */
5694dedc7c6SSuanming Mou struct mlx5_flow_policer_stats {
5704dedc7c6SSuanming Mou 	struct mlx5_flow_counter *cnt[RTE_COLORS + 1];
5714dedc7c6SSuanming Mou 	/**< Color counter, extra for drop. */
5724dedc7c6SSuanming Mou 	uint64_t stats_mask;
5734dedc7c6SSuanming Mou 	/**< Statistics mask for the colors. */
5744dedc7c6SSuanming Mou };
5754dedc7c6SSuanming Mou 
57646a5e6bcSSuanming Mou /* Meter table structure. */
57746a5e6bcSSuanming Mou struct mlx5_meter_domain_info {
57846a5e6bcSSuanming Mou 	struct mlx5_flow_tbl_resource *tbl;
57946a5e6bcSSuanming Mou 	/**< Meter table. */
58046a5e6bcSSuanming Mou 	void *any_matcher;
58146a5e6bcSSuanming Mou 	/**< Meter color not match default criteria. */
58246a5e6bcSSuanming Mou 	void *color_matcher;
58346a5e6bcSSuanming Mou 	/**< Meter color match criteria. */
58446a5e6bcSSuanming Mou 	void *jump_actn;
58546a5e6bcSSuanming Mou 	/**< Meter match action. */
58646a5e6bcSSuanming Mou 	void *policer_rules[RTE_MTR_DROPPED + 1];
58746a5e6bcSSuanming Mou 	/**< Meter policer for the match. */
58846a5e6bcSSuanming Mou };
58946a5e6bcSSuanming Mou 
59046a5e6bcSSuanming Mou /* Meter table set for TX RX FDB. */
59146a5e6bcSSuanming Mou struct mlx5_meter_domains_infos {
59246a5e6bcSSuanming Mou 	uint32_t ref_cnt;
59346a5e6bcSSuanming Mou 	/**< Table user count. */
59446a5e6bcSSuanming Mou 	struct mlx5_meter_domain_info egress;
59546a5e6bcSSuanming Mou 	/**< TX meter table. */
59646a5e6bcSSuanming Mou 	struct mlx5_meter_domain_info ingress;
59746a5e6bcSSuanming Mou 	/**< RX meter table. */
59846a5e6bcSSuanming Mou 	struct mlx5_meter_domain_info transfer;
59946a5e6bcSSuanming Mou 	/**< FDB meter table. */
60046a5e6bcSSuanming Mou 	void *drop_actn;
60146a5e6bcSSuanming Mou 	/**< Drop action as not matched. */
6024dedc7c6SSuanming Mou 	void *count_actns[RTE_MTR_DROPPED + 1];
6034dedc7c6SSuanming Mou 	/**< Counters for match and unmatched statistics. */
60433e01809SSuanming Mou 	uint32_t fmp[MLX5_ST_SZ_DW(flow_meter_parameters)];
60533e01809SSuanming Mou 	/**< Flow meter parameter. */
60633e01809SSuanming Mou 	size_t fmp_size;
60733e01809SSuanming Mou 	/**< Flow meter parameter size. */
60833e01809SSuanming Mou 	void *meter_action;
60933e01809SSuanming Mou 	/**< Flow meter action. */
61046a5e6bcSSuanming Mou };
61146a5e6bcSSuanming Mou 
61246a5e6bcSSuanming Mou /* Meter parameter structure. */
61346a5e6bcSSuanming Mou struct mlx5_flow_meter {
6143f373f35SSuanming Mou 	TAILQ_ENTRY(mlx5_flow_meter) next;
6153f373f35SSuanming Mou 	/**< Pointer to the next flow meter structure. */
61646a5e6bcSSuanming Mou 	uint32_t meter_id;
61746a5e6bcSSuanming Mou 	/**< Meter id. */
6183426add9SSuanming Mou 	struct rte_mtr_params params;
6193426add9SSuanming Mou 	/**< Meter rule parameters. */
6203f373f35SSuanming Mou 	struct mlx5_flow_meter_profile *profile;
6213f373f35SSuanming Mou 	/**< Meter profile parameters. */
622266e9f3dSSuanming Mou 	struct rte_flow_attr attr;
623266e9f3dSSuanming Mou 	/**< Flow attributes. */
62446a5e6bcSSuanming Mou 	struct mlx5_meter_domains_infos *mfts;
62546a5e6bcSSuanming Mou 	/**< Flow table created for this meter. */
6264dedc7c6SSuanming Mou 	struct mlx5_flow_policer_stats policer_stats;
6274dedc7c6SSuanming Mou 	/**< Meter policer statistics. */
62846a5e6bcSSuanming Mou 	uint32_t ref_cnt;
62946a5e6bcSSuanming Mou 	/**< Use count. */
6303f373f35SSuanming Mou 	uint32_t active_state:1;
6313f373f35SSuanming Mou 	/**< Meter state. */
6323f373f35SSuanming Mou 	uint32_t shared:1;
6333f373f35SSuanming Mou 	/**< Meter shared or not. */
63446a5e6bcSSuanming Mou };
6353bd26b23SSuanming Mou 
6363bd26b23SSuanming Mou /* RFC2697 parameter structure. */
6373bd26b23SSuanming Mou struct mlx5_flow_meter_srtcm_rfc2697_prm {
6383bd26b23SSuanming Mou 	/* green_saturation_value = cbs_mantissa * 2^cbs_exponent */
6393bd26b23SSuanming Mou 	uint32_t cbs_exponent:5;
6403bd26b23SSuanming Mou 	uint32_t cbs_mantissa:8;
6413bd26b23SSuanming Mou 	/* cir = 8G * cir_mantissa * 1/(2^cir_exponent) Bytes/Sec */
6423bd26b23SSuanming Mou 	uint32_t cir_exponent:5;
6433bd26b23SSuanming Mou 	uint32_t cir_mantissa:8;
6443bd26b23SSuanming Mou 	/* yellow _saturation_value = ebs_mantissa * 2^ebs_exponent */
6453bd26b23SSuanming Mou 	uint32_t ebs_exponent:5;
6463bd26b23SSuanming Mou 	uint32_t ebs_mantissa:8;
6473bd26b23SSuanming Mou };
6483bd26b23SSuanming Mou 
6493bd26b23SSuanming Mou /* Flow meter profile structure. */
6503bd26b23SSuanming Mou struct mlx5_flow_meter_profile {
6513bd26b23SSuanming Mou 	TAILQ_ENTRY(mlx5_flow_meter_profile) next;
6523bd26b23SSuanming Mou 	/**< Pointer to the next flow meter structure. */
6533bd26b23SSuanming Mou 	uint32_t meter_profile_id; /**< Profile id. */
6543bd26b23SSuanming Mou 	struct rte_mtr_meter_profile profile; /**< Profile detail. */
6553bd26b23SSuanming Mou 	union {
6563bd26b23SSuanming Mou 		struct mlx5_flow_meter_srtcm_rfc2697_prm srtcm_prm;
6573bd26b23SSuanming Mou 		/**< srtcm_rfc2697 struct. */
6583bd26b23SSuanming Mou 	};
6593bd26b23SSuanming Mou 	uint32_t ref_cnt; /**< Use count. */
6603bd26b23SSuanming Mou };
6613bd26b23SSuanming Mou 
66284c406e7SOri Kam /* Flow structure. */
66384c406e7SOri Kam struct rte_flow {
66484c406e7SOri Kam 	TAILQ_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. */
6654f84a197SOri Kam 	enum mlx5_flow_drv_type drv_type; /**< Driver type. */
666e205c95fSViacheslav Ovsiienko 	struct mlx5_flow_rss rss; /**< RSS context. */
66784c406e7SOri Kam 	struct mlx5_flow_counter *counter; /**< Holds flow counter. */
668dd3c774fSViacheslav Ovsiienko 	struct mlx5_flow_mreg_copy_resource *mreg_copy;
669dd3c774fSViacheslav Ovsiienko 	/**< pointer to metadata register copy table resource. */
670266e9f3dSSuanming Mou 	struct mlx5_flow_meter *meter; /**< Holds flow meter. */
67184c406e7SOri Kam 	LIST_HEAD(dev_flows, mlx5_flow) dev_flows;
67284c406e7SOri Kam 	/**< Device flows that are part of the flow. */
6732720f833SYongseok Koh 	struct mlx5_fdir *fdir; /**< Pointer to associated FDIR if any. */
674d85c7b5eSOri Kam 	uint32_t hairpin_flow_id; /**< The flow id used for hairpin. */
675dd3c774fSViacheslav Ovsiienko 	uint32_t copy_applied:1; /**< The MARK copy Flow os applied. */
67684c406e7SOri Kam };
6772720f833SYongseok Koh 
67884c406e7SOri Kam typedef int (*mlx5_flow_validate_t)(struct rte_eth_dev *dev,
67984c406e7SOri Kam 				    const struct rte_flow_attr *attr,
68084c406e7SOri Kam 				    const struct rte_flow_item items[],
68184c406e7SOri Kam 				    const struct rte_flow_action actions[],
682b67b4ecbSDekel Peled 				    bool external,
68384c406e7SOri Kam 				    struct rte_flow_error *error);
68484c406e7SOri Kam typedef struct mlx5_flow *(*mlx5_flow_prepare_t)
68584c406e7SOri Kam 	(const struct rte_flow_attr *attr, const struct rte_flow_item items[],
686c1cfb132SYongseok Koh 	 const struct rte_flow_action actions[], struct rte_flow_error *error);
68784c406e7SOri Kam typedef int (*mlx5_flow_translate_t)(struct rte_eth_dev *dev,
68884c406e7SOri Kam 				     struct mlx5_flow *dev_flow,
68984c406e7SOri Kam 				     const struct rte_flow_attr *attr,
69084c406e7SOri Kam 				     const struct rte_flow_item items[],
69184c406e7SOri Kam 				     const struct rte_flow_action actions[],
69284c406e7SOri Kam 				     struct rte_flow_error *error);
69384c406e7SOri Kam typedef int (*mlx5_flow_apply_t)(struct rte_eth_dev *dev, struct rte_flow *flow,
69484c406e7SOri Kam 				 struct rte_flow_error *error);
69584c406e7SOri Kam typedef void (*mlx5_flow_remove_t)(struct rte_eth_dev *dev,
69684c406e7SOri Kam 				   struct rte_flow *flow);
69784c406e7SOri Kam typedef void (*mlx5_flow_destroy_t)(struct rte_eth_dev *dev,
69884c406e7SOri Kam 				    struct rte_flow *flow);
699684dafe7SMoti Haimovsky typedef int (*mlx5_flow_query_t)(struct rte_eth_dev *dev,
700684dafe7SMoti Haimovsky 				 struct rte_flow *flow,
701684dafe7SMoti Haimovsky 				 const struct rte_flow_action *actions,
702684dafe7SMoti Haimovsky 				 void *data,
703684dafe7SMoti Haimovsky 				 struct rte_flow_error *error);
70446a5e6bcSSuanming Mou typedef struct mlx5_meter_domains_infos *(*mlx5_flow_create_mtr_tbls_t)
7054dedc7c6SSuanming Mou 					    (struct rte_eth_dev *dev,
7064dedc7c6SSuanming Mou 					     const struct mlx5_flow_meter *fm);
70746a5e6bcSSuanming Mou typedef int (*mlx5_flow_destroy_mtr_tbls_t)(struct rte_eth_dev *dev,
70846a5e6bcSSuanming Mou 					struct mlx5_meter_domains_infos *tbls);
7093426add9SSuanming Mou typedef int (*mlx5_flow_create_policer_rules_t)
7103426add9SSuanming Mou 					(struct rte_eth_dev *dev,
7113426add9SSuanming Mou 					 struct mlx5_flow_meter *fm,
7123426add9SSuanming Mou 					 const struct rte_flow_attr *attr);
7133426add9SSuanming Mou typedef int (*mlx5_flow_destroy_policer_rules_t)
7143426add9SSuanming Mou 					(struct rte_eth_dev *dev,
7153426add9SSuanming Mou 					 const struct mlx5_flow_meter *fm,
7163426add9SSuanming Mou 					 const struct rte_flow_attr *attr);
717e189f55cSSuanming Mou typedef struct mlx5_flow_counter * (*mlx5_flow_counter_alloc_t)
718e189f55cSSuanming Mou 				   (struct rte_eth_dev *dev);
719e189f55cSSuanming Mou typedef void (*mlx5_flow_counter_free_t)(struct rte_eth_dev *dev,
720e189f55cSSuanming Mou 					 struct mlx5_flow_counter *cnt);
721e189f55cSSuanming Mou typedef int (*mlx5_flow_counter_query_t)(struct rte_eth_dev *dev,
722e189f55cSSuanming Mou 					 struct mlx5_flow_counter *cnt,
723e189f55cSSuanming Mou 					 bool clear, uint64_t *pkts,
724e189f55cSSuanming Mou 					 uint64_t *bytes);
72584c406e7SOri Kam struct mlx5_flow_driver_ops {
72684c406e7SOri Kam 	mlx5_flow_validate_t validate;
72784c406e7SOri Kam 	mlx5_flow_prepare_t prepare;
72884c406e7SOri Kam 	mlx5_flow_translate_t translate;
72984c406e7SOri Kam 	mlx5_flow_apply_t apply;
73084c406e7SOri Kam 	mlx5_flow_remove_t remove;
73184c406e7SOri Kam 	mlx5_flow_destroy_t destroy;
732684dafe7SMoti Haimovsky 	mlx5_flow_query_t query;
73346a5e6bcSSuanming Mou 	mlx5_flow_create_mtr_tbls_t create_mtr_tbls;
73446a5e6bcSSuanming Mou 	mlx5_flow_destroy_mtr_tbls_t destroy_mtr_tbls;
7353426add9SSuanming Mou 	mlx5_flow_create_policer_rules_t create_policer_rules;
7363426add9SSuanming Mou 	mlx5_flow_destroy_policer_rules_t destroy_policer_rules;
737e189f55cSSuanming Mou 	mlx5_flow_counter_alloc_t counter_alloc;
738e189f55cSSuanming Mou 	mlx5_flow_counter_free_t counter_free;
739e189f55cSSuanming Mou 	mlx5_flow_counter_query_t counter_query;
74084c406e7SOri Kam };
74184c406e7SOri Kam 
7423e8edd0eSViacheslav Ovsiienko 
743f15db67dSMatan Azrad #define MLX5_CNT_CONTAINER(sh, batch, thread) (&(sh)->cmng.ccont \
744f15db67dSMatan Azrad 	[(((sh)->cmng.mhi[batch] >> (thread)) & 0x1) * 2 + (batch)])
745f15db67dSMatan Azrad #define MLX5_CNT_CONTAINER_UNUSED(sh, batch, thread) (&(sh)->cmng.ccont \
746f15db67dSMatan Azrad 	[(~((sh)->cmng.mhi[batch] >> (thread)) & 0x1) * 2 + (batch)])
747f15db67dSMatan Azrad 
74884c406e7SOri Kam /* mlx5_flow.c */
74984c406e7SOri Kam 
750830d2091SOri Kam struct mlx5_flow_id_pool *mlx5_flow_id_pool_alloc(void);
751830d2091SOri Kam void mlx5_flow_id_pool_release(struct mlx5_flow_id_pool *pool);
752830d2091SOri Kam uint32_t mlx5_flow_id_get(struct mlx5_flow_id_pool *pool, uint32_t *id);
753830d2091SOri Kam uint32_t mlx5_flow_id_release(struct mlx5_flow_id_pool *pool,
754830d2091SOri Kam 			      uint32_t id);
755b67b4ecbSDekel Peled int mlx5_flow_group_to_table(const struct rte_flow_attr *attributes,
756b67b4ecbSDekel Peled 			     bool external, uint32_t group, uint32_t *table,
757b67b4ecbSDekel Peled 			     struct rte_flow_error *error);
758fc2c498cSOri Kam uint64_t mlx5_flow_hashfields_adjust(struct mlx5_flow *dev_flow, int tunnel,
7590ddd1143SYongseok Koh 				     uint64_t layer_types,
760fc2c498cSOri Kam 				     uint64_t hash_fields);
76184c406e7SOri Kam uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
76284c406e7SOri Kam 				   uint32_t subpriority);
763*99d49f47SMatan Azrad int mlx5_flow_get_reg_id(struct rte_eth_dev *dev,
7643e8edd0eSViacheslav Ovsiienko 				     enum mlx5_feature_name feature,
7653e8edd0eSViacheslav Ovsiienko 				     uint32_t id,
7663e8edd0eSViacheslav Ovsiienko 				     struct rte_flow_error *error);
767e4fcdcd6SMoti Haimovsky const struct rte_flow_action *mlx5_flow_find_action
768e4fcdcd6SMoti Haimovsky 					(const struct rte_flow_action *actions,
769e4fcdcd6SMoti Haimovsky 					 enum rte_flow_action_type action);
77084c406e7SOri Kam int mlx5_flow_validate_action_count(struct rte_eth_dev *dev,
7713e9fa079SDekel Peled 				    const struct rte_flow_attr *attr,
77284c406e7SOri Kam 				    struct rte_flow_error *error);
77384c406e7SOri Kam int mlx5_flow_validate_action_drop(uint64_t action_flags,
7743e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
77584c406e7SOri Kam 				   struct rte_flow_error *error);
77684c406e7SOri Kam int mlx5_flow_validate_action_flag(uint64_t action_flags,
7773e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
77884c406e7SOri Kam 				   struct rte_flow_error *error);
77984c406e7SOri Kam int mlx5_flow_validate_action_mark(const struct rte_flow_action *action,
78084c406e7SOri Kam 				   uint64_t action_flags,
7813e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
78284c406e7SOri Kam 				   struct rte_flow_error *error);
78384c406e7SOri Kam int mlx5_flow_validate_action_queue(const struct rte_flow_action *action,
78484c406e7SOri Kam 				    uint64_t action_flags,
78584c406e7SOri Kam 				    struct rte_eth_dev *dev,
7863e9fa079SDekel Peled 				    const struct rte_flow_attr *attr,
78784c406e7SOri Kam 				    struct rte_flow_error *error);
78884c406e7SOri Kam int mlx5_flow_validate_action_rss(const struct rte_flow_action *action,
78984c406e7SOri Kam 				  uint64_t action_flags,
79084c406e7SOri Kam 				  struct rte_eth_dev *dev,
7913e9fa079SDekel Peled 				  const struct rte_flow_attr *attr,
7921183f12fSOri Kam 				  uint64_t item_flags,
79384c406e7SOri Kam 				  struct rte_flow_error *error);
79484c406e7SOri Kam int mlx5_flow_validate_attributes(struct rte_eth_dev *dev,
79584c406e7SOri Kam 				  const struct rte_flow_attr *attributes,
79684c406e7SOri Kam 				  struct rte_flow_error *error);
7976bd7fbd0SDekel Peled int mlx5_flow_item_acceptable(const struct rte_flow_item *item,
7986bd7fbd0SDekel Peled 			      const uint8_t *mask,
7996bd7fbd0SDekel Peled 			      const uint8_t *nic_mask,
8006bd7fbd0SDekel Peled 			      unsigned int size,
8016bd7fbd0SDekel Peled 			      struct rte_flow_error *error);
80284c406e7SOri Kam int mlx5_flow_validate_item_eth(const struct rte_flow_item *item,
80384c406e7SOri Kam 				uint64_t item_flags,
80484c406e7SOri Kam 				struct rte_flow_error *error);
80584c406e7SOri Kam int mlx5_flow_validate_item_gre(const struct rte_flow_item *item,
80684c406e7SOri Kam 				uint64_t item_flags,
80784c406e7SOri Kam 				uint8_t target_protocol,
80884c406e7SOri Kam 				struct rte_flow_error *error);
809a7a03655SXiaoyu Min int mlx5_flow_validate_item_gre_key(const struct rte_flow_item *item,
810a7a03655SXiaoyu Min 				    uint64_t item_flags,
811a7a03655SXiaoyu Min 				    const struct rte_flow_item *gre_item,
812a7a03655SXiaoyu Min 				    struct rte_flow_error *error);
81384c406e7SOri Kam int mlx5_flow_validate_item_ipv4(const struct rte_flow_item *item,
814ed4c5247SShahaf Shuler 				 uint64_t item_flags,
815fba32130SXiaoyu Min 				 uint64_t last_item,
816fba32130SXiaoyu Min 				 uint16_t ether_type,
81755c61fa7SViacheslav Ovsiienko 				 const struct rte_flow_item_ipv4 *acc_mask,
81884c406e7SOri Kam 				 struct rte_flow_error *error);
81984c406e7SOri Kam int mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item,
82084c406e7SOri Kam 				 uint64_t item_flags,
821fba32130SXiaoyu Min 				 uint64_t last_item,
822fba32130SXiaoyu Min 				 uint16_t ether_type,
82355c61fa7SViacheslav Ovsiienko 				 const struct rte_flow_item_ipv6 *acc_mask,
82484c406e7SOri Kam 				 struct rte_flow_error *error);
82538f7efaaSDekel Peled int mlx5_flow_validate_item_mpls(struct rte_eth_dev *dev,
82638f7efaaSDekel Peled 				 const struct rte_flow_item *item,
82784c406e7SOri Kam 				 uint64_t item_flags,
82838f7efaaSDekel Peled 				 uint64_t prev_layer,
82984c406e7SOri Kam 				 struct rte_flow_error *error);
83084c406e7SOri Kam int mlx5_flow_validate_item_tcp(const struct rte_flow_item *item,
83184c406e7SOri Kam 				uint64_t item_flags,
83284c406e7SOri Kam 				uint8_t target_protocol,
83392378c2bSMoti Haimovsky 				const struct rte_flow_item_tcp *flow_mask,
83484c406e7SOri Kam 				struct rte_flow_error *error);
83584c406e7SOri Kam int mlx5_flow_validate_item_udp(const struct rte_flow_item *item,
83684c406e7SOri Kam 				uint64_t item_flags,
83784c406e7SOri Kam 				uint8_t target_protocol,
83884c406e7SOri Kam 				struct rte_flow_error *error);
83984c406e7SOri Kam int mlx5_flow_validate_item_vlan(const struct rte_flow_item *item,
840ed4c5247SShahaf Shuler 				 uint64_t item_flags,
841dfedf3e3SViacheslav Ovsiienko 				 struct rte_eth_dev *dev,
84284c406e7SOri Kam 				 struct rte_flow_error *error);
84384c406e7SOri Kam int mlx5_flow_validate_item_vxlan(const struct rte_flow_item *item,
84484c406e7SOri Kam 				  uint64_t item_flags,
84584c406e7SOri Kam 				  struct rte_flow_error *error);
84684c406e7SOri Kam int mlx5_flow_validate_item_vxlan_gpe(const struct rte_flow_item *item,
84784c406e7SOri Kam 				      uint64_t item_flags,
84884c406e7SOri Kam 				      struct rte_eth_dev *dev,
84984c406e7SOri Kam 				      struct rte_flow_error *error);
850d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp(const struct rte_flow_item *item,
851d53aa89aSXiaoyu Min 				 uint64_t item_flags,
852d53aa89aSXiaoyu Min 				 uint8_t target_protocol,
853d53aa89aSXiaoyu Min 				 struct rte_flow_error *error);
854d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp6(const struct rte_flow_item *item,
855d53aa89aSXiaoyu Min 				   uint64_t item_flags,
856d53aa89aSXiaoyu Min 				   uint8_t target_protocol,
857d53aa89aSXiaoyu Min 				   struct rte_flow_error *error);
858ea81c1b8SDekel Peled int mlx5_flow_validate_item_nvgre(const struct rte_flow_item *item,
859ea81c1b8SDekel Peled 				  uint64_t item_flags,
860ea81c1b8SDekel Peled 				  uint8_t target_protocol,
861ea81c1b8SDekel Peled 				  struct rte_flow_error *error);
862e59a5dbcSMoti Haimovsky int mlx5_flow_validate_item_geneve(const struct rte_flow_item *item,
863e59a5dbcSMoti Haimovsky 				   uint64_t item_flags,
864e59a5dbcSMoti Haimovsky 				   struct rte_eth_dev *dev,
865e59a5dbcSMoti Haimovsky 				   struct rte_flow_error *error);
86646a5e6bcSSuanming Mou struct mlx5_meter_domains_infos *mlx5_flow_create_mtr_tbls
8674dedc7c6SSuanming Mou 					(struct rte_eth_dev *dev,
8684dedc7c6SSuanming Mou 					 const struct mlx5_flow_meter *fm);
86946a5e6bcSSuanming Mou int mlx5_flow_destroy_mtr_tbls(struct rte_eth_dev *dev,
87046a5e6bcSSuanming Mou 			       struct mlx5_meter_domains_infos *tbl);
8713426add9SSuanming Mou int mlx5_flow_create_policer_rules(struct rte_eth_dev *dev,
8723426add9SSuanming Mou 				   struct mlx5_flow_meter *fm,
8733426add9SSuanming Mou 				   const struct rte_flow_attr *attr);
8743426add9SSuanming Mou int mlx5_flow_destroy_policer_rules(struct rte_eth_dev *dev,
8753426add9SSuanming Mou 				    struct mlx5_flow_meter *fm,
8763426add9SSuanming Mou 				    const struct rte_flow_attr *attr);
87702e76468SSuanming Mou int mlx5_flow_meter_flush(struct rte_eth_dev *dev,
87802e76468SSuanming Mou 			  struct rte_mtr_error *error);
87984c406e7SOri Kam #endif /* RTE_PMD_MLX5_FLOW_H_ */
880