xref: /dpdk/drivers/net/mlx5/mlx5_flow.h (revision e9e36e52eeb64dadce057dfd004a281fb8f8a0c2)
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. */
11270d84dc7SOri Kam #define MLX5_FLOW_LAYER_ICMP (1u << 19)
11370d84dc7SOri Kam #define MLX5_FLOW_LAYER_ICMP6 (1u << 20)
11470d84dc7SOri Kam #define MLX5_FLOW_LAYER_GRE_KEY (1u << 21)
115d53aa89aSXiaoyu Min 
116ea81c1b8SDekel Peled /* Pattern tunnel Layer bits (continued). */
1175e33bebdSXiaoyu Min #define MLX5_FLOW_LAYER_IPIP (1u << 21)
1185e33bebdSXiaoyu Min #define MLX5_FLOW_LAYER_IPV6_ENCAP (1u << 22)
119ea81c1b8SDekel Peled #define MLX5_FLOW_LAYER_NVGRE (1u << 23)
120e59a5dbcSMoti Haimovsky #define MLX5_FLOW_LAYER_GENEVE (1u << 24)
1215e33bebdSXiaoyu Min 
1223c84f34eSOri Kam /* Queue items. */
1233c84f34eSOri Kam #define MLX5_FLOW_ITEM_TX_QUEUE (1u << 25)
1243c84f34eSOri Kam 
12584c406e7SOri Kam /* Outer Masks. */
12684c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3 \
12784c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L3_IPV6)
12884c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4 \
12984c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L4_UDP | MLX5_FLOW_LAYER_OUTER_L4_TCP)
13084c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER \
13184c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_OUTER_L3 | \
13284c406e7SOri Kam 	 MLX5_FLOW_LAYER_OUTER_L4)
13384c406e7SOri Kam 
134940f0a1dSDekel Peled /* LRO support mask, i.e. flow contains IPv4/IPv6 and TCP. */
135940f0a1dSDekel Peled #define MLX5_FLOW_LAYER_IPV4_LRO \
136940f0a1dSDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L4_TCP)
137940f0a1dSDekel Peled #define MLX5_FLOW_LAYER_IPV6_LRO \
138940f0a1dSDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV6 | MLX5_FLOW_LAYER_OUTER_L4_TCP)
139940f0a1dSDekel Peled 
14084c406e7SOri Kam /* Tunnel Masks. */
14184c406e7SOri Kam #define MLX5_FLOW_LAYER_TUNNEL \
14284c406e7SOri Kam 	(MLX5_FLOW_LAYER_VXLAN | MLX5_FLOW_LAYER_VXLAN_GPE | \
143ea81c1b8SDekel Peled 	 MLX5_FLOW_LAYER_GRE | MLX5_FLOW_LAYER_NVGRE | MLX5_FLOW_LAYER_MPLS | \
144e59a5dbcSMoti Haimovsky 	 MLX5_FLOW_LAYER_IPIP | MLX5_FLOW_LAYER_IPV6_ENCAP | \
145e59a5dbcSMoti Haimovsky 	 MLX5_FLOW_LAYER_GENEVE)
14684c406e7SOri Kam 
14784c406e7SOri Kam /* Inner Masks. */
14884c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3 \
14984c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV6)
15084c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4 \
15184c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L4_UDP | MLX5_FLOW_LAYER_INNER_L4_TCP)
15284c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER \
15384c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L2 | MLX5_FLOW_LAYER_INNER_L3 | \
15484c406e7SOri Kam 	 MLX5_FLOW_LAYER_INNER_L4)
15584c406e7SOri Kam 
1564bb14c83SDekel Peled /* Layer Masks. */
1574bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L2 \
1584bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_INNER_L2)
1594bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV4 \
1604bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV4)
1614bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV6 \
1624bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV6 | MLX5_FLOW_LAYER_INNER_L3_IPV6)
1634bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3 \
1644bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_L3_IPV4 | MLX5_FLOW_LAYER_L3_IPV6)
1654bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L4 \
1664bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L4 | MLX5_FLOW_LAYER_INNER_L4)
1674bb14c83SDekel Peled 
16884c406e7SOri Kam /* Actions */
16984c406e7SOri Kam #define MLX5_FLOW_ACTION_DROP (1u << 0)
17084c406e7SOri Kam #define MLX5_FLOW_ACTION_QUEUE (1u << 1)
17184c406e7SOri Kam #define MLX5_FLOW_ACTION_RSS (1u << 2)
17284c406e7SOri Kam #define MLX5_FLOW_ACTION_FLAG (1u << 3)
17384c406e7SOri Kam #define MLX5_FLOW_ACTION_MARK (1u << 4)
17484c406e7SOri Kam #define MLX5_FLOW_ACTION_COUNT (1u << 5)
17557123c00SYongseok Koh #define MLX5_FLOW_ACTION_PORT_ID (1u << 6)
17657123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_POP_VLAN (1u << 7)
17757123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_PUSH_VLAN (1u << 8)
17857123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_SET_VLAN_VID (1u << 9)
17957123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_SET_VLAN_PCP (1u << 10)
1802ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV4_SRC (1u << 11)
1812ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV4_DST (1u << 12)
1822ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV6_SRC (1u << 13)
1832ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV6_DST (1u << 14)
1842ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TP_SRC (1u << 15)
1852ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TP_DST (1u << 16)
18631fda518SYongseok Koh #define MLX5_FLOW_ACTION_JUMP (1u << 17)
187a7cb5bcdSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TTL (1u << 18)
188a7cb5bcdSXiaoyu Min #define MLX5_FLOW_ACTION_DEC_TTL (1u << 19)
18976046778SXiaoyu Min #define MLX5_FLOW_ACTION_SET_MAC_SRC (1u << 20)
19076046778SXiaoyu Min #define MLX5_FLOW_ACTION_SET_MAC_DST (1u << 21)
19134d41b7aSDekel Peled #define MLX5_FLOW_ACTION_VXLAN_ENCAP (1u << 22)
19249d6465aSDekel Peled #define MLX5_FLOW_ACTION_VXLAN_DECAP (1u << 23)
193a124cff0SDekel Peled #define MLX5_FLOW_ACTION_NVGRE_ENCAP (1u << 24)
1944b8727f0SDekel Peled #define MLX5_FLOW_ACTION_NVGRE_DECAP (1u << 25)
1958ba9eee4SDekel Peled #define MLX5_FLOW_ACTION_RAW_ENCAP (1u << 26)
1968ba9eee4SDekel Peled #define MLX5_FLOW_ACTION_RAW_DECAP (1u << 27)
197585b99fbSDekel Peled #define MLX5_FLOW_ACTION_INC_TCP_SEQ (1u << 28)
198585b99fbSDekel Peled #define MLX5_FLOW_ACTION_DEC_TCP_SEQ (1u << 29)
199585b99fbSDekel Peled #define MLX5_FLOW_ACTION_INC_TCP_ACK (1u << 30)
200585b99fbSDekel Peled #define MLX5_FLOW_ACTION_DEC_TCP_ACK (1u << 31)
20170d84dc7SOri Kam #define MLX5_FLOW_ACTION_SET_TAG (1ull << 32)
20255deee17SViacheslav Ovsiienko #define MLX5_FLOW_ACTION_MARK_EXT (1ull << 33)
203fcc8d2f7SViacheslav Ovsiienko #define MLX5_FLOW_ACTION_SET_META (1ull << 34)
204266e9f3dSSuanming Mou #define MLX5_FLOW_ACTION_METER (1ull << 35)
20584c406e7SOri Kam 
20684c406e7SOri Kam #define MLX5_FLOW_FATE_ACTIONS \
207684b9a1bSOri Kam 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | \
208684b9a1bSOri Kam 	 MLX5_FLOW_ACTION_RSS | MLX5_FLOW_ACTION_JUMP)
20984c406e7SOri Kam 
2102e4c987aSOri Kam #define MLX5_FLOW_FATE_ESWITCH_ACTIONS \
2112e4c987aSOri Kam 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_PORT_ID | \
2122e4c987aSOri Kam 	 MLX5_FLOW_ACTION_JUMP)
2132e4c987aSOri Kam 
2148ba9eee4SDekel Peled #define MLX5_FLOW_ENCAP_ACTIONS	(MLX5_FLOW_ACTION_VXLAN_ENCAP | \
2158ba9eee4SDekel Peled 				 MLX5_FLOW_ACTION_NVGRE_ENCAP | \
2169aee7a84SMoti Haimovsky 				 MLX5_FLOW_ACTION_RAW_ENCAP | \
2179aee7a84SMoti Haimovsky 				 MLX5_FLOW_ACTION_OF_PUSH_VLAN)
218a124cff0SDekel Peled 
2198ba9eee4SDekel Peled #define MLX5_FLOW_DECAP_ACTIONS	(MLX5_FLOW_ACTION_VXLAN_DECAP | \
2208ba9eee4SDekel Peled 				 MLX5_FLOW_ACTION_NVGRE_DECAP | \
221b41e47daSMoti Haimovsky 				 MLX5_FLOW_ACTION_RAW_DECAP | \
222b41e47daSMoti Haimovsky 				 MLX5_FLOW_ACTION_OF_POP_VLAN)
2234b8727f0SDekel Peled 
2244bb14c83SDekel Peled #define MLX5_FLOW_MODIFY_HDR_ACTIONS (MLX5_FLOW_ACTION_SET_IPV4_SRC | \
2254bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV4_DST | \
2264bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV6_SRC | \
2274bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV6_DST | \
2284bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TP_SRC | \
2294bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TP_DST | \
2304bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TTL | \
2314bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_DEC_TTL | \
2324bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_MAC_SRC | \
233585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_SET_MAC_DST | \
234585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_INC_TCP_SEQ | \
235585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_DEC_TCP_SEQ | \
236585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_INC_TCP_ACK | \
2375f163d52SMoti Haimovsky 				      MLX5_FLOW_ACTION_DEC_TCP_ACK | \
23870d84dc7SOri Kam 				      MLX5_FLOW_ACTION_OF_SET_VLAN_VID | \
23955deee17SViacheslav Ovsiienko 				      MLX5_FLOW_ACTION_SET_TAG | \
240fcc8d2f7SViacheslav Ovsiienko 				      MLX5_FLOW_ACTION_MARK_EXT | \
241fcc8d2f7SViacheslav Ovsiienko 				      MLX5_FLOW_ACTION_SET_META)
2424bb14c83SDekel Peled 
2439aee7a84SMoti Haimovsky #define MLX5_FLOW_VLAN_ACTIONS (MLX5_FLOW_ACTION_OF_POP_VLAN | \
2449aee7a84SMoti Haimovsky 				MLX5_FLOW_ACTION_OF_PUSH_VLAN)
24584c406e7SOri Kam #ifndef IPPROTO_MPLS
24684c406e7SOri Kam #define IPPROTO_MPLS 137
24784c406e7SOri Kam #endif
24884c406e7SOri Kam 
249d1abe664SDekel Peled /* UDP port number for MPLS */
250d1abe664SDekel Peled #define MLX5_UDP_PORT_MPLS 6635
251d1abe664SDekel Peled 
252fc2c498cSOri Kam /* UDP port numbers for VxLAN. */
253fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN 4789
254fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN_GPE 4790
255fc2c498cSOri Kam 
256e59a5dbcSMoti Haimovsky /* UDP port numbers for GENEVE. */
257e59a5dbcSMoti Haimovsky #define MLX5_UDP_PORT_GENEVE 6081
258e59a5dbcSMoti Haimovsky 
25984c406e7SOri Kam /* Priority reserved for default flows. */
26084c406e7SOri Kam #define MLX5_FLOW_PRIO_RSVD ((uint32_t)-1)
26184c406e7SOri Kam 
26284c406e7SOri Kam /*
26384c406e7SOri Kam  * Number of sub priorities.
26484c406e7SOri Kam  * For each kind of pattern matching i.e. L2, L3, L4 to have a correct
26584c406e7SOri Kam  * matching on the NIC (firmware dependent) L4 most have the higher priority
26684c406e7SOri Kam  * followed by L3 and ending with L2.
26784c406e7SOri Kam  */
26884c406e7SOri Kam #define MLX5_PRIORITY_MAP_L2 2
26984c406e7SOri Kam #define MLX5_PRIORITY_MAP_L3 1
27084c406e7SOri Kam #define MLX5_PRIORITY_MAP_L4 0
27184c406e7SOri Kam #define MLX5_PRIORITY_MAP_MAX 3
27284c406e7SOri Kam 
273fc2c498cSOri Kam /* Valid layer type for IPV4 RSS. */
274fc2c498cSOri Kam #define MLX5_IPV4_LAYER_TYPES \
275fc2c498cSOri Kam 	(ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
276fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV4_UDP | \
277fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV4_OTHER)
278fc2c498cSOri Kam 
279fc2c498cSOri Kam /* IBV hash source bits  for IPV4. */
280fc2c498cSOri Kam #define MLX5_IPV4_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4)
281fc2c498cSOri Kam 
282fc2c498cSOri Kam /* Valid layer type for IPV6 RSS. */
283fc2c498cSOri Kam #define MLX5_IPV6_LAYER_TYPES \
284fc2c498cSOri Kam 	(ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | ETH_RSS_NONFRAG_IPV6_TCP | \
285fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_IPV6_EX  | ETH_RSS_IPV6_TCP_EX | \
286fc2c498cSOri Kam 	 ETH_RSS_IPV6_UDP_EX | ETH_RSS_NONFRAG_IPV6_OTHER)
287fc2c498cSOri Kam 
288fc2c498cSOri Kam /* IBV hash source bits  for IPV6. */
289fc2c498cSOri Kam #define MLX5_IPV6_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6)
290fc2c498cSOri Kam 
291e59a5dbcSMoti Haimovsky 
292e59a5dbcSMoti Haimovsky /* Geneve header first 16Bit */
293e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_MASK 0x3
294e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_SHIFT 14
295e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_VAL(a) \
296e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_VER_SHIFT)) & (MLX5_GENEVE_VER_MASK))
297e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_MASK 0x3F
298e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_SHIFT 7
299e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_VAL(a) \
300e59a5dbcSMoti Haimovsky 	    (((a) >> (MLX5_GENEVE_OPTLEN_SHIFT)) & (MLX5_GENEVE_OPTLEN_MASK))
301e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_MASK 0x1
302e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_SHIFT 7
303e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_VAL(a) \
304e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_OAMF_SHIFT)) & (MLX5_GENEVE_OAMF_MASK))
305e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_MASK 0x1
306e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_SHIFT 6
307e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_VAL(a) \
308e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_CRITO_SHIFT)) & (MLX5_GENEVE_CRITO_MASK))
309e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_MASK 0x3F
310e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_VAL(a) ((a) & (MLX5_GENEVE_RSVD_MASK))
311e59a5dbcSMoti Haimovsky /*
312e59a5dbcSMoti Haimovsky  * The length of the Geneve options fields, expressed in four byte multiples,
313e59a5dbcSMoti Haimovsky  * not including the eight byte fixed tunnel.
314e59a5dbcSMoti Haimovsky  */
315e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_0 14
316e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_1 63
317e59a5dbcSMoti Haimovsky 
3180c76d1c9SYongseok Koh enum mlx5_flow_drv_type {
3190c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_MIN,
3200c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_DV,
3210c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_VERBS,
3220c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_MAX,
3230c76d1c9SYongseok Koh };
3240c76d1c9SYongseok Koh 
325865a0c15SOri Kam /* Matcher PRM representation */
326865a0c15SOri Kam struct mlx5_flow_dv_match_params {
327865a0c15SOri Kam 	size_t size;
328865a0c15SOri Kam 	/**< Size of match value. Do NOT split size and key! */
329865a0c15SOri Kam 	uint32_t buf[MLX5_ST_SZ_DW(fte_match_param)];
330865a0c15SOri Kam 	/**< Matcher value. This value is used as the mask or as a key. */
331865a0c15SOri Kam };
332865a0c15SOri Kam 
333865a0c15SOri Kam /* Matcher structure. */
334865a0c15SOri Kam struct mlx5_flow_dv_matcher {
335865a0c15SOri Kam 	LIST_ENTRY(mlx5_flow_dv_matcher) next;
336*e9e36e52SBing Zhao 	/**< Pointer to the next element. */
337*e9e36e52SBing Zhao 	struct mlx5_flow_tbl_resource *tbl;
338*e9e36e52SBing Zhao 	/**< Pointer to the table(group) the matcher associated with. */
339865a0c15SOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
340865a0c15SOri Kam 	void *matcher_object; /**< Pointer to DV matcher */
341865a0c15SOri Kam 	uint16_t crc; /**< CRC of key. */
342865a0c15SOri Kam 	uint16_t priority; /**< Priority of matcher. */
343865a0c15SOri Kam 	struct mlx5_flow_dv_match_params mask; /**< Matcher mask. */
344865a0c15SOri Kam };
345865a0c15SOri Kam 
3464bb14c83SDekel Peled #define MLX5_ENCAP_MAX_LEN 132
3474bb14c83SDekel Peled 
348c513f05cSDekel Peled /* Encap/decap resource structure. */
349c513f05cSDekel Peled struct mlx5_flow_dv_encap_decap_resource {
350c513f05cSDekel Peled 	LIST_ENTRY(mlx5_flow_dv_encap_decap_resource) next;
351c513f05cSDekel Peled 	/* Pointer to next element. */
352c513f05cSDekel Peled 	rte_atomic32_t refcnt; /**< Reference counter. */
353cbb66daaSOri Kam 	void *verbs_action;
354c513f05cSDekel Peled 	/**< Verbs encap/decap action object. */
355c513f05cSDekel Peled 	uint8_t buf[MLX5_ENCAP_MAX_LEN];
356c513f05cSDekel Peled 	size_t size;
357c513f05cSDekel Peled 	uint8_t reformat_type;
358c513f05cSDekel Peled 	uint8_t ft_type;
3594f84a197SOri Kam 	uint64_t flags; /**< Flags for RDMA API. */
360c513f05cSDekel Peled };
361c513f05cSDekel Peled 
362cbb66daaSOri Kam /* Tag resource structure. */
363cbb66daaSOri Kam struct mlx5_flow_dv_tag_resource {
364cbb66daaSOri Kam 	LIST_ENTRY(mlx5_flow_dv_tag_resource) next;
365cbb66daaSOri Kam 	/* Pointer to next element. */
366cbb66daaSOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
367cbb66daaSOri Kam 	void *action;
368cbb66daaSOri Kam 	/**< Verbs tag action object. */
369cbb66daaSOri Kam 	uint32_t tag; /**< the tag value. */
370cbb66daaSOri Kam };
371cbb66daaSOri Kam 
3720e9d0002SViacheslav Ovsiienko /*
3730e9d0002SViacheslav Ovsiienko  * Number of modification commands.
3740e9d0002SViacheslav Ovsiienko  * If extensive metadata registers are supported
3750e9d0002SViacheslav Ovsiienko  * the maximal actions amount is 16 and 8 otherwise.
3760e9d0002SViacheslav Ovsiienko  */
3770e9d0002SViacheslav Ovsiienko #define MLX5_MODIFY_NUM 16
3780e9d0002SViacheslav Ovsiienko #define MLX5_MODIFY_NUM_NO_MREG 8
3794bb14c83SDekel Peled 
3804bb14c83SDekel Peled /* Modify resource structure */
3814bb14c83SDekel Peled struct mlx5_flow_dv_modify_hdr_resource {
3824bb14c83SDekel Peled 	LIST_ENTRY(mlx5_flow_dv_modify_hdr_resource) next;
3834bb14c83SDekel Peled 	/* Pointer to next element. */
3844bb14c83SDekel Peled 	rte_atomic32_t refcnt; /**< Reference counter. */
3854bb14c83SDekel Peled 	struct ibv_flow_action *verbs_action;
3864bb14c83SDekel Peled 	/**< Verbs modify header action object. */
3874bb14c83SDekel Peled 	uint8_t ft_type; /**< Flow table type, Rx or Tx. */
3884bb14c83SDekel Peled 	uint32_t actions_num; /**< Number of modification actions. */
3894bb14c83SDekel Peled 	struct mlx5_modification_cmd actions[MLX5_MODIFY_NUM];
3904bb14c83SDekel Peled 	/**< Modification actions. */
39179e7ba1fSOri Kam 	uint64_t flags; /**< Flags for RDMA API. */
3924bb14c83SDekel Peled };
3934bb14c83SDekel Peled 
394684b9a1bSOri Kam /* Jump action resource structure. */
395684b9a1bSOri Kam struct mlx5_flow_dv_jump_tbl_resource {
396684b9a1bSOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
397684b9a1bSOri Kam 	uint8_t ft_type; /**< Flow table type, Rx or Tx. */
3986c1d9a64SBing Zhao 	void *action; /**< Pointer to the rdma core action. */
399684b9a1bSOri Kam };
400684b9a1bSOri Kam 
401c269b517SOri Kam /* Port ID resource structure. */
402c269b517SOri Kam struct mlx5_flow_dv_port_id_action_resource {
403c269b517SOri Kam 	LIST_ENTRY(mlx5_flow_dv_port_id_action_resource) next;
404c269b517SOri Kam 	/* Pointer to next element. */
405c269b517SOri Kam 	rte_atomic32_t refcnt; /**< Reference counter. */
406c269b517SOri Kam 	void *action;
407c269b517SOri Kam 	/**< Verbs tag action object. */
408c269b517SOri Kam 	uint32_t port_id; /**< Port ID value. */
409c269b517SOri Kam };
410c269b517SOri Kam 
4119aee7a84SMoti Haimovsky /* Push VLAN action resource structure */
4129aee7a84SMoti Haimovsky struct mlx5_flow_dv_push_vlan_action_resource {
4139aee7a84SMoti Haimovsky 	LIST_ENTRY(mlx5_flow_dv_push_vlan_action_resource) next;
4149aee7a84SMoti Haimovsky 	/* Pointer to next element. */
4159aee7a84SMoti Haimovsky 	rte_atomic32_t refcnt; /**< Reference counter. */
4169aee7a84SMoti Haimovsky 	void *action; /**< Direct verbs action object. */
4179aee7a84SMoti Haimovsky 	uint8_t ft_type; /**< Flow table type, Rx, Tx or FDB. */
4189aee7a84SMoti Haimovsky 	rte_be32_t vlan_tag; /**< VLAN tag value. */
4199aee7a84SMoti Haimovsky };
4209aee7a84SMoti Haimovsky 
421dd3c774fSViacheslav Ovsiienko /* Metadata register copy table entry. */
422dd3c774fSViacheslav Ovsiienko struct mlx5_flow_mreg_copy_resource {
423dd3c774fSViacheslav Ovsiienko 	/*
424dd3c774fSViacheslav Ovsiienko 	 * Hash list entry for copy table.
425dd3c774fSViacheslav Ovsiienko 	 *  - Key is 32/64-bit MARK action ID.
426dd3c774fSViacheslav Ovsiienko 	 *  - MUST be the first entry.
427dd3c774fSViacheslav Ovsiienko 	 */
428dd3c774fSViacheslav Ovsiienko 	struct mlx5_hlist_entry hlist_ent;
429dd3c774fSViacheslav Ovsiienko 	LIST_ENTRY(mlx5_flow_mreg_copy_resource) next;
430dd3c774fSViacheslav Ovsiienko 	/* List entry for device flows. */
431dd3c774fSViacheslav Ovsiienko 	uint32_t refcnt; /* Reference counter. */
432dd3c774fSViacheslav Ovsiienko 	uint32_t appcnt; /* Apply/Remove counter. */
433dd3c774fSViacheslav Ovsiienko 	struct rte_flow *flow; /* Built flow for copy. */
434dd3c774fSViacheslav Ovsiienko };
435dd3c774fSViacheslav Ovsiienko 
436860897d2SBing Zhao /* Table data structure of the hash organization. */
437860897d2SBing Zhao struct mlx5_flow_tbl_data_entry {
438860897d2SBing Zhao 	struct mlx5_hlist_entry entry;
439*e9e36e52SBing Zhao 	/**< hash list entry, 64-bits key inside. */
440860897d2SBing Zhao 	struct mlx5_flow_tbl_resource tbl;
441*e9e36e52SBing Zhao 	/**< flow table resource. */
442*e9e36e52SBing Zhao 	LIST_HEAD(matchers, mlx5_flow_dv_matcher) matchers;
443*e9e36e52SBing Zhao 	/**< matchers' header associated with the flow table. */
4446c1d9a64SBing Zhao 	struct mlx5_flow_dv_jump_tbl_resource jump;
4456c1d9a64SBing Zhao 	/**< jump resource, at most one for each table created. */
446860897d2SBing Zhao };
447860897d2SBing Zhao 
4484bb14c83SDekel Peled /*
4494bb14c83SDekel Peled  * Max number of actions per DV flow.
4504bb14c83SDekel Peled  * See CREATE_FLOW_MAX_FLOW_ACTIONS_SUPPORTED
4514bb14c83SDekel Peled  * In rdma-core file providers/mlx5/verbs.c
4524bb14c83SDekel Peled  */
4534bb14c83SDekel Peled #define MLX5_DV_MAX_NUMBER_OF_ACTIONS 8
4544bb14c83SDekel Peled 
455865a0c15SOri Kam /* DV flows structure. */
456865a0c15SOri Kam struct mlx5_flow_dv {
457865a0c15SOri Kam 	struct mlx5_hrxq *hrxq; /**< Hash Rx queues. */
458865a0c15SOri Kam 	/* Flow DV api: */
459865a0c15SOri Kam 	struct mlx5_flow_dv_matcher *matcher; /**< Cache to matcher. */
460865a0c15SOri Kam 	struct mlx5_flow_dv_match_params value;
461865a0c15SOri Kam 	/**< Holds the value that the packet is compared to. */
462c513f05cSDekel Peled 	struct mlx5_flow_dv_encap_decap_resource *encap_decap;
463c513f05cSDekel Peled 	/**< Pointer to encap/decap resource in cache. */
4644bb14c83SDekel Peled 	struct mlx5_flow_dv_modify_hdr_resource *modify_hdr;
4654bb14c83SDekel Peled 	/**< Pointer to modify header resource in cache. */
466865a0c15SOri Kam 	struct ibv_flow *flow; /**< Installed flow. */
467684b9a1bSOri Kam 	struct mlx5_flow_dv_jump_tbl_resource *jump;
468684b9a1bSOri Kam 	/**< Pointer to the jump action resource. */
469c269b517SOri Kam 	struct mlx5_flow_dv_port_id_action_resource *port_id_action;
470c269b517SOri Kam 	/**< Pointer to port ID action resource. */
471dfedf3e3SViacheslav Ovsiienko 	struct mlx5_vf_vlan vf_vlan;
472dfedf3e3SViacheslav Ovsiienko 	/**< Structure for VF VLAN workaround. */
4739aee7a84SMoti Haimovsky 	struct mlx5_flow_dv_push_vlan_action_resource *push_vlan_res;
4749aee7a84SMoti Haimovsky 	/**< Pointer to push VLAN action resource in cache. */
475e205c95fSViacheslav Ovsiienko 	struct mlx5_flow_dv_tag_resource *tag_resource;
476e205c95fSViacheslav Ovsiienko 	/**< pointer to the tag action. */
477d02cb069SOri Kam #ifdef HAVE_IBV_FLOW_DV_SUPPORT
478cbb66daaSOri Kam 	void *actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS];
479d02cb069SOri Kam 	/**< Action list. */
480d02cb069SOri Kam #endif
481d02cb069SOri Kam 	int actions_n; /**< number of actions. */
482865a0c15SOri Kam };
483865a0c15SOri Kam 
48484c406e7SOri Kam /* Verbs specification header. */
48584c406e7SOri Kam struct ibv_spec_header {
48684c406e7SOri Kam 	enum ibv_flow_spec_type type;
48784c406e7SOri Kam 	uint16_t size;
48884c406e7SOri Kam };
48984c406e7SOri Kam 
49084c406e7SOri Kam /** Handles information leading to a drop fate. */
49184c406e7SOri Kam struct mlx5_flow_verbs {
49284c406e7SOri Kam 	LIST_ENTRY(mlx5_flow_verbs) next;
49384c406e7SOri Kam 	unsigned int size; /**< Size of the attribute. */
49484c406e7SOri Kam 	struct {
49584c406e7SOri Kam 		struct ibv_flow_attr *attr;
49684c406e7SOri Kam 		/**< Pointer to the Specification buffer. */
49784c406e7SOri Kam 		uint8_t *specs; /**< Pointer to the specifications. */
49884c406e7SOri Kam 	};
49984c406e7SOri Kam 	struct ibv_flow *flow; /**< Verbs flow pointer. */
50084c406e7SOri Kam 	struct mlx5_hrxq *hrxq; /**< Hash Rx queue object. */
501dfedf3e3SViacheslav Ovsiienko 	struct mlx5_vf_vlan vf_vlan;
502dfedf3e3SViacheslav Ovsiienko 	/**< Structure for VF VLAN workaround. */
50384c406e7SOri Kam };
50484c406e7SOri Kam 
505e205c95fSViacheslav Ovsiienko struct mlx5_flow_rss {
506e205c95fSViacheslav Ovsiienko 	uint32_t level;
507e205c95fSViacheslav Ovsiienko 	uint32_t queue_num; /**< Number of entries in @p queue. */
508e205c95fSViacheslav Ovsiienko 	uint64_t types; /**< Specific RSS hash types (see ETH_RSS_*). */
509e205c95fSViacheslav Ovsiienko 	uint16_t (*queue)[]; /**< Destination queues to redirect traffic to. */
510e205c95fSViacheslav Ovsiienko 	uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */
511e205c95fSViacheslav Ovsiienko };
512e205c95fSViacheslav Ovsiienko 
51384c406e7SOri Kam /** Device flow structure. */
51484c406e7SOri Kam struct mlx5_flow {
51584c406e7SOri Kam 	LIST_ENTRY(mlx5_flow) next;
51684c406e7SOri Kam 	struct rte_flow *flow; /**< Pointer to the main flow. */
5170ddd1143SYongseok Koh 	uint64_t layers;
51824663641SYongseok Koh 	/**< Bit-fields of present layers, see MLX5_FLOW_LAYER_*. */
519d85c7b5eSOri Kam 	uint64_t actions;
520d85c7b5eSOri Kam 	/**< Bit-fields of detected actions, see MLX5_FLOW_ACTION_*. */
521e205c95fSViacheslav Ovsiienko 	uint64_t hash_fields; /**< Verbs hash Rx queue hash fields. */
522e205c95fSViacheslav Ovsiienko 	uint8_t ingress; /**< 1 if the flow is ingress. */
523e205c95fSViacheslav Ovsiienko 	uint32_t group; /**< The group index. */
524e205c95fSViacheslav Ovsiienko 	uint8_t transfer; /**< 1 if the flow is E-Switch flow. */
52584c406e7SOri Kam 	union {
526c4d9b9f7SOri Kam #ifdef HAVE_IBV_FLOW_DV_SUPPORT
527865a0c15SOri Kam 		struct mlx5_flow_dv dv;
528c4d9b9f7SOri Kam #endif
529865a0c15SOri Kam 		struct mlx5_flow_verbs verbs;
53084c406e7SOri Kam 	};
5318d72fa66SSuanming Mou 	union {
53271e254bcSViacheslav Ovsiienko 		uint32_t qrss_id; /**< Uniqie Q/RSS suffix subflow tag. */
5339ea9b049SSuanming Mou 		uint32_t mtr_flow_id; /**< Unique meter match flow id. */
5348d72fa66SSuanming Mou 	};
535b67b4ecbSDekel Peled 	bool external; /**< true if the flow is created external to PMD. */
53684c406e7SOri Kam };
53784c406e7SOri Kam 
53833e01809SSuanming Mou /* Flow meter state. */
53933e01809SSuanming Mou #define MLX5_FLOW_METER_DISABLE 0
54033e01809SSuanming Mou #define MLX5_FLOW_METER_ENABLE 1
54133e01809SSuanming Mou 
5423bd26b23SSuanming Mou #define MLX5_MAN_WIDTH 8
54346a5e6bcSSuanming Mou /* Modify this value if enum rte_mtr_color changes. */
54446a5e6bcSSuanming Mou #define RTE_MTR_DROPPED RTE_COLORS
54546a5e6bcSSuanming Mou 
5464dedc7c6SSuanming Mou /* Meter policer statistics */
5474dedc7c6SSuanming Mou struct mlx5_flow_policer_stats {
5484dedc7c6SSuanming Mou 	struct mlx5_flow_counter *cnt[RTE_COLORS + 1];
5494dedc7c6SSuanming Mou 	/**< Color counter, extra for drop. */
5504dedc7c6SSuanming Mou 	uint64_t stats_mask;
5514dedc7c6SSuanming Mou 	/**< Statistics mask for the colors. */
5524dedc7c6SSuanming Mou };
5534dedc7c6SSuanming Mou 
55446a5e6bcSSuanming Mou /* Meter table structure. */
55546a5e6bcSSuanming Mou struct mlx5_meter_domain_info {
55646a5e6bcSSuanming Mou 	struct mlx5_flow_tbl_resource *tbl;
55746a5e6bcSSuanming Mou 	/**< Meter table. */
55846a5e6bcSSuanming Mou 	void *any_matcher;
55946a5e6bcSSuanming Mou 	/**< Meter color not match default criteria. */
56046a5e6bcSSuanming Mou 	void *color_matcher;
56146a5e6bcSSuanming Mou 	/**< Meter color match criteria. */
56246a5e6bcSSuanming Mou 	void *jump_actn;
56346a5e6bcSSuanming Mou 	/**< Meter match action. */
56446a5e6bcSSuanming Mou 	void *policer_rules[RTE_MTR_DROPPED + 1];
56546a5e6bcSSuanming Mou 	/**< Meter policer for the match. */
56646a5e6bcSSuanming Mou };
56746a5e6bcSSuanming Mou 
56846a5e6bcSSuanming Mou /* Meter table set for TX RX FDB. */
56946a5e6bcSSuanming Mou struct mlx5_meter_domains_infos {
57046a5e6bcSSuanming Mou 	uint32_t ref_cnt;
57146a5e6bcSSuanming Mou 	/**< Table user count. */
57246a5e6bcSSuanming Mou 	struct mlx5_meter_domain_info egress;
57346a5e6bcSSuanming Mou 	/**< TX meter table. */
57446a5e6bcSSuanming Mou 	struct mlx5_meter_domain_info ingress;
57546a5e6bcSSuanming Mou 	/**< RX meter table. */
57646a5e6bcSSuanming Mou 	struct mlx5_meter_domain_info transfer;
57746a5e6bcSSuanming Mou 	/**< FDB meter table. */
57846a5e6bcSSuanming Mou 	void *drop_actn;
57946a5e6bcSSuanming Mou 	/**< Drop action as not matched. */
5804dedc7c6SSuanming Mou 	void *count_actns[RTE_MTR_DROPPED + 1];
5814dedc7c6SSuanming Mou 	/**< Counters for match and unmatched statistics. */
58233e01809SSuanming Mou 	uint32_t fmp[MLX5_ST_SZ_DW(flow_meter_parameters)];
58333e01809SSuanming Mou 	/**< Flow meter parameter. */
58433e01809SSuanming Mou 	size_t fmp_size;
58533e01809SSuanming Mou 	/**< Flow meter parameter size. */
58633e01809SSuanming Mou 	void *meter_action;
58733e01809SSuanming Mou 	/**< Flow meter action. */
58846a5e6bcSSuanming Mou };
58946a5e6bcSSuanming Mou 
59046a5e6bcSSuanming Mou /* Meter parameter structure. */
59146a5e6bcSSuanming Mou struct mlx5_flow_meter {
5923f373f35SSuanming Mou 	TAILQ_ENTRY(mlx5_flow_meter) next;
5933f373f35SSuanming Mou 	/**< Pointer to the next flow meter structure. */
59446a5e6bcSSuanming Mou 	uint32_t meter_id;
59546a5e6bcSSuanming Mou 	/**< Meter id. */
5963426add9SSuanming Mou 	struct rte_mtr_params params;
5973426add9SSuanming Mou 	/**< Meter rule parameters. */
5983f373f35SSuanming Mou 	struct mlx5_flow_meter_profile *profile;
5993f373f35SSuanming Mou 	/**< Meter profile parameters. */
600266e9f3dSSuanming Mou 	struct rte_flow_attr attr;
601266e9f3dSSuanming Mou 	/**< Flow attributes. */
60246a5e6bcSSuanming Mou 	struct mlx5_meter_domains_infos *mfts;
60346a5e6bcSSuanming Mou 	/**< Flow table created for this meter. */
6044dedc7c6SSuanming Mou 	struct mlx5_flow_policer_stats policer_stats;
6054dedc7c6SSuanming Mou 	/**< Meter policer statistics. */
60646a5e6bcSSuanming Mou 	uint32_t ref_cnt;
60746a5e6bcSSuanming Mou 	/**< Use count. */
6083f373f35SSuanming Mou 	uint32_t active_state:1;
6093f373f35SSuanming Mou 	/**< Meter state. */
6103f373f35SSuanming Mou 	uint32_t shared:1;
6113f373f35SSuanming Mou 	/**< Meter shared or not. */
61246a5e6bcSSuanming Mou };
6133bd26b23SSuanming Mou 
6143bd26b23SSuanming Mou /* RFC2697 parameter structure. */
6153bd26b23SSuanming Mou struct mlx5_flow_meter_srtcm_rfc2697_prm {
6163bd26b23SSuanming Mou 	/* green_saturation_value = cbs_mantissa * 2^cbs_exponent */
6173bd26b23SSuanming Mou 	uint32_t cbs_exponent:5;
6183bd26b23SSuanming Mou 	uint32_t cbs_mantissa:8;
6193bd26b23SSuanming Mou 	/* cir = 8G * cir_mantissa * 1/(2^cir_exponent) Bytes/Sec */
6203bd26b23SSuanming Mou 	uint32_t cir_exponent:5;
6213bd26b23SSuanming Mou 	uint32_t cir_mantissa:8;
6223bd26b23SSuanming Mou 	/* yellow _saturation_value = ebs_mantissa * 2^ebs_exponent */
6233bd26b23SSuanming Mou 	uint32_t ebs_exponent:5;
6243bd26b23SSuanming Mou 	uint32_t ebs_mantissa:8;
6253bd26b23SSuanming Mou };
6263bd26b23SSuanming Mou 
6273bd26b23SSuanming Mou /* Flow meter profile structure. */
6283bd26b23SSuanming Mou struct mlx5_flow_meter_profile {
6293bd26b23SSuanming Mou 	TAILQ_ENTRY(mlx5_flow_meter_profile) next;
6303bd26b23SSuanming Mou 	/**< Pointer to the next flow meter structure. */
6313bd26b23SSuanming Mou 	uint32_t meter_profile_id; /**< Profile id. */
6323bd26b23SSuanming Mou 	struct rte_mtr_meter_profile profile; /**< Profile detail. */
6333bd26b23SSuanming Mou 	union {
6343bd26b23SSuanming Mou 		struct mlx5_flow_meter_srtcm_rfc2697_prm srtcm_prm;
6353bd26b23SSuanming Mou 		/**< srtcm_rfc2697 struct. */
6363bd26b23SSuanming Mou 	};
6373bd26b23SSuanming Mou 	uint32_t ref_cnt; /**< Use count. */
6383bd26b23SSuanming Mou };
6393bd26b23SSuanming Mou 
64084c406e7SOri Kam /* Flow structure. */
64184c406e7SOri Kam struct rte_flow {
64284c406e7SOri Kam 	TAILQ_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. */
6434f84a197SOri Kam 	enum mlx5_flow_drv_type drv_type; /**< Driver type. */
644e205c95fSViacheslav Ovsiienko 	struct mlx5_flow_rss rss; /**< RSS context. */
64584c406e7SOri Kam 	struct mlx5_flow_counter *counter; /**< Holds flow counter. */
646dd3c774fSViacheslav Ovsiienko 	struct mlx5_flow_mreg_copy_resource *mreg_copy;
647dd3c774fSViacheslav Ovsiienko 	/**< pointer to metadata register copy table resource. */
648266e9f3dSSuanming Mou 	struct mlx5_flow_meter *meter; /**< Holds flow meter. */
64984c406e7SOri Kam 	LIST_HEAD(dev_flows, mlx5_flow) dev_flows;
65084c406e7SOri Kam 	/**< Device flows that are part of the flow. */
6512720f833SYongseok Koh 	struct mlx5_fdir *fdir; /**< Pointer to associated FDIR if any. */
652d85c7b5eSOri Kam 	uint32_t hairpin_flow_id; /**< The flow id used for hairpin. */
653dd3c774fSViacheslav Ovsiienko 	uint32_t copy_applied:1; /**< The MARK copy Flow os applied. */
65484c406e7SOri Kam };
6552720f833SYongseok Koh 
65684c406e7SOri Kam typedef int (*mlx5_flow_validate_t)(struct rte_eth_dev *dev,
65784c406e7SOri Kam 				    const struct rte_flow_attr *attr,
65884c406e7SOri Kam 				    const struct rte_flow_item items[],
65984c406e7SOri Kam 				    const struct rte_flow_action actions[],
660b67b4ecbSDekel Peled 				    bool external,
66184c406e7SOri Kam 				    struct rte_flow_error *error);
66284c406e7SOri Kam typedef struct mlx5_flow *(*mlx5_flow_prepare_t)
66384c406e7SOri Kam 	(const struct rte_flow_attr *attr, const struct rte_flow_item items[],
664c1cfb132SYongseok Koh 	 const struct rte_flow_action actions[], struct rte_flow_error *error);
66584c406e7SOri Kam typedef int (*mlx5_flow_translate_t)(struct rte_eth_dev *dev,
66684c406e7SOri Kam 				     struct mlx5_flow *dev_flow,
66784c406e7SOri Kam 				     const struct rte_flow_attr *attr,
66884c406e7SOri Kam 				     const struct rte_flow_item items[],
66984c406e7SOri Kam 				     const struct rte_flow_action actions[],
67084c406e7SOri Kam 				     struct rte_flow_error *error);
67184c406e7SOri Kam typedef int (*mlx5_flow_apply_t)(struct rte_eth_dev *dev, struct rte_flow *flow,
67284c406e7SOri Kam 				 struct rte_flow_error *error);
67384c406e7SOri Kam typedef void (*mlx5_flow_remove_t)(struct rte_eth_dev *dev,
67484c406e7SOri Kam 				   struct rte_flow *flow);
67584c406e7SOri Kam typedef void (*mlx5_flow_destroy_t)(struct rte_eth_dev *dev,
67684c406e7SOri Kam 				    struct rte_flow *flow);
677684dafe7SMoti Haimovsky typedef int (*mlx5_flow_query_t)(struct rte_eth_dev *dev,
678684dafe7SMoti Haimovsky 				 struct rte_flow *flow,
679684dafe7SMoti Haimovsky 				 const struct rte_flow_action *actions,
680684dafe7SMoti Haimovsky 				 void *data,
681684dafe7SMoti Haimovsky 				 struct rte_flow_error *error);
68246a5e6bcSSuanming Mou typedef struct mlx5_meter_domains_infos *(*mlx5_flow_create_mtr_tbls_t)
6834dedc7c6SSuanming Mou 					    (struct rte_eth_dev *dev,
6844dedc7c6SSuanming Mou 					     const struct mlx5_flow_meter *fm);
68546a5e6bcSSuanming Mou typedef int (*mlx5_flow_destroy_mtr_tbls_t)(struct rte_eth_dev *dev,
68646a5e6bcSSuanming Mou 					struct mlx5_meter_domains_infos *tbls);
6873426add9SSuanming Mou typedef int (*mlx5_flow_create_policer_rules_t)
6883426add9SSuanming Mou 					(struct rte_eth_dev *dev,
6893426add9SSuanming Mou 					 struct mlx5_flow_meter *fm,
6903426add9SSuanming Mou 					 const struct rte_flow_attr *attr);
6913426add9SSuanming Mou typedef int (*mlx5_flow_destroy_policer_rules_t)
6923426add9SSuanming Mou 					(struct rte_eth_dev *dev,
6933426add9SSuanming Mou 					 const struct mlx5_flow_meter *fm,
6943426add9SSuanming Mou 					 const struct rte_flow_attr *attr);
695e189f55cSSuanming Mou typedef struct mlx5_flow_counter * (*mlx5_flow_counter_alloc_t)
696e189f55cSSuanming Mou 				   (struct rte_eth_dev *dev);
697e189f55cSSuanming Mou typedef void (*mlx5_flow_counter_free_t)(struct rte_eth_dev *dev,
698e189f55cSSuanming Mou 					 struct mlx5_flow_counter *cnt);
699e189f55cSSuanming Mou typedef int (*mlx5_flow_counter_query_t)(struct rte_eth_dev *dev,
700e189f55cSSuanming Mou 					 struct mlx5_flow_counter *cnt,
701e189f55cSSuanming Mou 					 bool clear, uint64_t *pkts,
702e189f55cSSuanming Mou 					 uint64_t *bytes);
70384c406e7SOri Kam struct mlx5_flow_driver_ops {
70484c406e7SOri Kam 	mlx5_flow_validate_t validate;
70584c406e7SOri Kam 	mlx5_flow_prepare_t prepare;
70684c406e7SOri Kam 	mlx5_flow_translate_t translate;
70784c406e7SOri Kam 	mlx5_flow_apply_t apply;
70884c406e7SOri Kam 	mlx5_flow_remove_t remove;
70984c406e7SOri Kam 	mlx5_flow_destroy_t destroy;
710684dafe7SMoti Haimovsky 	mlx5_flow_query_t query;
71146a5e6bcSSuanming Mou 	mlx5_flow_create_mtr_tbls_t create_mtr_tbls;
71246a5e6bcSSuanming Mou 	mlx5_flow_destroy_mtr_tbls_t destroy_mtr_tbls;
7133426add9SSuanming Mou 	mlx5_flow_create_policer_rules_t create_policer_rules;
7143426add9SSuanming Mou 	mlx5_flow_destroy_policer_rules_t destroy_policer_rules;
715e189f55cSSuanming Mou 	mlx5_flow_counter_alloc_t counter_alloc;
716e189f55cSSuanming Mou 	mlx5_flow_counter_free_t counter_free;
717e189f55cSSuanming Mou 	mlx5_flow_counter_query_t counter_query;
71884c406e7SOri Kam };
71984c406e7SOri Kam 
7203e8edd0eSViacheslav Ovsiienko 
721f15db67dSMatan Azrad #define MLX5_CNT_CONTAINER(sh, batch, thread) (&(sh)->cmng.ccont \
722f15db67dSMatan Azrad 	[(((sh)->cmng.mhi[batch] >> (thread)) & 0x1) * 2 + (batch)])
723f15db67dSMatan Azrad #define MLX5_CNT_CONTAINER_UNUSED(sh, batch, thread) (&(sh)->cmng.ccont \
724f15db67dSMatan Azrad 	[(~((sh)->cmng.mhi[batch] >> (thread)) & 0x1) * 2 + (batch)])
725f15db67dSMatan Azrad 
72684c406e7SOri Kam /* mlx5_flow.c */
72784c406e7SOri Kam 
728830d2091SOri Kam struct mlx5_flow_id_pool *mlx5_flow_id_pool_alloc(void);
729830d2091SOri Kam void mlx5_flow_id_pool_release(struct mlx5_flow_id_pool *pool);
730830d2091SOri Kam uint32_t mlx5_flow_id_get(struct mlx5_flow_id_pool *pool, uint32_t *id);
731830d2091SOri Kam uint32_t mlx5_flow_id_release(struct mlx5_flow_id_pool *pool,
732830d2091SOri Kam 			      uint32_t id);
733b67b4ecbSDekel Peled int mlx5_flow_group_to_table(const struct rte_flow_attr *attributes,
734b67b4ecbSDekel Peled 			     bool external, uint32_t group, uint32_t *table,
735b67b4ecbSDekel Peled 			     struct rte_flow_error *error);
736fc2c498cSOri Kam uint64_t mlx5_flow_hashfields_adjust(struct mlx5_flow *dev_flow, int tunnel,
7370ddd1143SYongseok Koh 				     uint64_t layer_types,
738fc2c498cSOri Kam 				     uint64_t hash_fields);
73984c406e7SOri Kam uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
74084c406e7SOri Kam 				   uint32_t subpriority);
7413e8edd0eSViacheslav Ovsiienko enum modify_reg mlx5_flow_get_reg_id(struct rte_eth_dev *dev,
7423e8edd0eSViacheslav Ovsiienko 				     enum mlx5_feature_name feature,
7433e8edd0eSViacheslav Ovsiienko 				     uint32_t id,
7443e8edd0eSViacheslav Ovsiienko 				     struct rte_flow_error *error);
745e4fcdcd6SMoti Haimovsky const struct rte_flow_action *mlx5_flow_find_action
746e4fcdcd6SMoti Haimovsky 					(const struct rte_flow_action *actions,
747e4fcdcd6SMoti Haimovsky 					 enum rte_flow_action_type action);
74884c406e7SOri Kam int mlx5_flow_validate_action_count(struct rte_eth_dev *dev,
7493e9fa079SDekel Peled 				    const struct rte_flow_attr *attr,
75084c406e7SOri Kam 				    struct rte_flow_error *error);
75184c406e7SOri Kam int mlx5_flow_validate_action_drop(uint64_t action_flags,
7523e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
75384c406e7SOri Kam 				   struct rte_flow_error *error);
75484c406e7SOri Kam int mlx5_flow_validate_action_flag(uint64_t action_flags,
7553e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
75684c406e7SOri Kam 				   struct rte_flow_error *error);
75784c406e7SOri Kam int mlx5_flow_validate_action_mark(const struct rte_flow_action *action,
75884c406e7SOri Kam 				   uint64_t action_flags,
7593e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
76084c406e7SOri Kam 				   struct rte_flow_error *error);
76184c406e7SOri Kam int mlx5_flow_validate_action_queue(const struct rte_flow_action *action,
76284c406e7SOri Kam 				    uint64_t action_flags,
76384c406e7SOri Kam 				    struct rte_eth_dev *dev,
7643e9fa079SDekel Peled 				    const struct rte_flow_attr *attr,
76584c406e7SOri Kam 				    struct rte_flow_error *error);
76684c406e7SOri Kam int mlx5_flow_validate_action_rss(const struct rte_flow_action *action,
76784c406e7SOri Kam 				  uint64_t action_flags,
76884c406e7SOri Kam 				  struct rte_eth_dev *dev,
7693e9fa079SDekel Peled 				  const struct rte_flow_attr *attr,
7701183f12fSOri Kam 				  uint64_t item_flags,
77184c406e7SOri Kam 				  struct rte_flow_error *error);
77284c406e7SOri Kam int mlx5_flow_validate_attributes(struct rte_eth_dev *dev,
77384c406e7SOri Kam 				  const struct rte_flow_attr *attributes,
77484c406e7SOri Kam 				  struct rte_flow_error *error);
7756bd7fbd0SDekel Peled int mlx5_flow_item_acceptable(const struct rte_flow_item *item,
7766bd7fbd0SDekel Peled 			      const uint8_t *mask,
7776bd7fbd0SDekel Peled 			      const uint8_t *nic_mask,
7786bd7fbd0SDekel Peled 			      unsigned int size,
7796bd7fbd0SDekel Peled 			      struct rte_flow_error *error);
78084c406e7SOri Kam int mlx5_flow_validate_item_eth(const struct rte_flow_item *item,
78184c406e7SOri Kam 				uint64_t item_flags,
78284c406e7SOri Kam 				struct rte_flow_error *error);
78384c406e7SOri Kam int mlx5_flow_validate_item_gre(const struct rte_flow_item *item,
78484c406e7SOri Kam 				uint64_t item_flags,
78584c406e7SOri Kam 				uint8_t target_protocol,
78684c406e7SOri Kam 				struct rte_flow_error *error);
787a7a03655SXiaoyu Min int mlx5_flow_validate_item_gre_key(const struct rte_flow_item *item,
788a7a03655SXiaoyu Min 				    uint64_t item_flags,
789a7a03655SXiaoyu Min 				    const struct rte_flow_item *gre_item,
790a7a03655SXiaoyu Min 				    struct rte_flow_error *error);
79184c406e7SOri Kam int mlx5_flow_validate_item_ipv4(const struct rte_flow_item *item,
792ed4c5247SShahaf Shuler 				 uint64_t item_flags,
793fba32130SXiaoyu Min 				 uint64_t last_item,
794fba32130SXiaoyu Min 				 uint16_t ether_type,
79555c61fa7SViacheslav Ovsiienko 				 const struct rte_flow_item_ipv4 *acc_mask,
79684c406e7SOri Kam 				 struct rte_flow_error *error);
79784c406e7SOri Kam int mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item,
79884c406e7SOri Kam 				 uint64_t item_flags,
799fba32130SXiaoyu Min 				 uint64_t last_item,
800fba32130SXiaoyu Min 				 uint16_t ether_type,
80155c61fa7SViacheslav Ovsiienko 				 const struct rte_flow_item_ipv6 *acc_mask,
80284c406e7SOri Kam 				 struct rte_flow_error *error);
80338f7efaaSDekel Peled int mlx5_flow_validate_item_mpls(struct rte_eth_dev *dev,
80438f7efaaSDekel Peled 				 const struct rte_flow_item *item,
80584c406e7SOri Kam 				 uint64_t item_flags,
80638f7efaaSDekel Peled 				 uint64_t prev_layer,
80784c406e7SOri Kam 				 struct rte_flow_error *error);
80884c406e7SOri Kam int mlx5_flow_validate_item_tcp(const struct rte_flow_item *item,
80984c406e7SOri Kam 				uint64_t item_flags,
81084c406e7SOri Kam 				uint8_t target_protocol,
81192378c2bSMoti Haimovsky 				const struct rte_flow_item_tcp *flow_mask,
81284c406e7SOri Kam 				struct rte_flow_error *error);
81384c406e7SOri Kam int mlx5_flow_validate_item_udp(const struct rte_flow_item *item,
81484c406e7SOri Kam 				uint64_t item_flags,
81584c406e7SOri Kam 				uint8_t target_protocol,
81684c406e7SOri Kam 				struct rte_flow_error *error);
81784c406e7SOri Kam int mlx5_flow_validate_item_vlan(const struct rte_flow_item *item,
818ed4c5247SShahaf Shuler 				 uint64_t item_flags,
819dfedf3e3SViacheslav Ovsiienko 				 struct rte_eth_dev *dev,
82084c406e7SOri Kam 				 struct rte_flow_error *error);
82184c406e7SOri Kam int mlx5_flow_validate_item_vxlan(const struct rte_flow_item *item,
82284c406e7SOri Kam 				  uint64_t item_flags,
82384c406e7SOri Kam 				  struct rte_flow_error *error);
82484c406e7SOri Kam int mlx5_flow_validate_item_vxlan_gpe(const struct rte_flow_item *item,
82584c406e7SOri Kam 				      uint64_t item_flags,
82684c406e7SOri Kam 				      struct rte_eth_dev *dev,
82784c406e7SOri Kam 				      struct rte_flow_error *error);
828d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp(const struct rte_flow_item *item,
829d53aa89aSXiaoyu Min 				 uint64_t item_flags,
830d53aa89aSXiaoyu Min 				 uint8_t target_protocol,
831d53aa89aSXiaoyu Min 				 struct rte_flow_error *error);
832d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp6(const struct rte_flow_item *item,
833d53aa89aSXiaoyu Min 				   uint64_t item_flags,
834d53aa89aSXiaoyu Min 				   uint8_t target_protocol,
835d53aa89aSXiaoyu Min 				   struct rte_flow_error *error);
836ea81c1b8SDekel Peled int mlx5_flow_validate_item_nvgre(const struct rte_flow_item *item,
837ea81c1b8SDekel Peled 				  uint64_t item_flags,
838ea81c1b8SDekel Peled 				  uint8_t target_protocol,
839ea81c1b8SDekel Peled 				  struct rte_flow_error *error);
840e59a5dbcSMoti Haimovsky int mlx5_flow_validate_item_geneve(const struct rte_flow_item *item,
841e59a5dbcSMoti Haimovsky 				   uint64_t item_flags,
842e59a5dbcSMoti Haimovsky 				   struct rte_eth_dev *dev,
843e59a5dbcSMoti Haimovsky 				   struct rte_flow_error *error);
84446a5e6bcSSuanming Mou struct mlx5_meter_domains_infos *mlx5_flow_create_mtr_tbls
8454dedc7c6SSuanming Mou 					(struct rte_eth_dev *dev,
8464dedc7c6SSuanming Mou 					 const struct mlx5_flow_meter *fm);
84746a5e6bcSSuanming Mou int mlx5_flow_destroy_mtr_tbls(struct rte_eth_dev *dev,
84846a5e6bcSSuanming Mou 			       struct mlx5_meter_domains_infos *tbl);
8493426add9SSuanming Mou int mlx5_flow_create_policer_rules(struct rte_eth_dev *dev,
8503426add9SSuanming Mou 				   struct mlx5_flow_meter *fm,
8513426add9SSuanming Mou 				   const struct rte_flow_attr *attr);
8523426add9SSuanming Mou int mlx5_flow_destroy_policer_rules(struct rte_eth_dev *dev,
8533426add9SSuanming Mou 				    struct mlx5_flow_meter *fm,
8543426add9SSuanming Mou 				    const struct rte_flow_attr *attr);
85502e76468SSuanming Mou int mlx5_flow_meter_flush(struct rte_eth_dev *dev,
85602e76468SSuanming Mou 			  struct rte_mtr_error *error);
85784c406e7SOri Kam #endif /* RTE_PMD_MLX5_FLOW_H_ */
858