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