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 <stdalign.h> 984c406e7SOri Kam #include <stdint.h> 1084c406e7SOri Kam #include <string.h> 1189813a52SDmitry Kozlyuk #include <sys/queue.h> 1284c406e7SOri Kam 13f15db67dSMatan Azrad #include <rte_alarm.h> 143bd26b23SSuanming Mou #include <rte_mtr.h> 15f15db67dSMatan Azrad 169d60f545SOphir Munk #include <mlx5_glue.h> 177b4f1e6bSMatan Azrad #include <mlx5_prm.h> 187b4f1e6bSMatan Azrad 19f5bf91deSMoti Haimovsky #include "mlx5.h" 20f5bf91deSMoti Haimovsky 2170d84dc7SOri Kam /* Private rte flow items. */ 2270d84dc7SOri Kam enum mlx5_rte_flow_item_type { 2370d84dc7SOri Kam MLX5_RTE_FLOW_ITEM_TYPE_END = INT_MIN, 2470d84dc7SOri Kam MLX5_RTE_FLOW_ITEM_TYPE_TAG, 253c84f34eSOri Kam MLX5_RTE_FLOW_ITEM_TYPE_TX_QUEUE, 2650f576d6SSuanming Mou MLX5_RTE_FLOW_ITEM_TYPE_VLAN, 274ec6360dSGregory Etelson MLX5_RTE_FLOW_ITEM_TYPE_TUNNEL, 2870d84dc7SOri Kam }; 2970d84dc7SOri Kam 30baf516beSViacheslav Ovsiienko /* Private (internal) rte flow actions. */ 3170d84dc7SOri Kam enum mlx5_rte_flow_action_type { 3270d84dc7SOri Kam MLX5_RTE_FLOW_ACTION_TYPE_END = INT_MIN, 3370d84dc7SOri Kam MLX5_RTE_FLOW_ACTION_TYPE_TAG, 34dd3c774fSViacheslav Ovsiienko MLX5_RTE_FLOW_ACTION_TYPE_MARK, 35baf516beSViacheslav Ovsiienko MLX5_RTE_FLOW_ACTION_TYPE_COPY_MREG, 363c78124fSShiri Kuzin MLX5_RTE_FLOW_ACTION_TYPE_DEFAULT_MISS, 374ec6360dSGregory Etelson MLX5_RTE_FLOW_ACTION_TYPE_TUNNEL_SET, 3881073e1fSMatan Azrad MLX5_RTE_FLOW_ACTION_TYPE_AGE, 3951ec04dcSShun Hao MLX5_RTE_FLOW_ACTION_TYPE_COUNT, 40f3191849SMichael Baum MLX5_RTE_FLOW_ACTION_TYPE_JUMP, 4170d84dc7SOri Kam }; 4270d84dc7SOri Kam 434b61b877SBing Zhao #define MLX5_INDIRECT_ACTION_TYPE_OFFSET 30 444a42ac1fSMatan Azrad 454a42ac1fSMatan Azrad enum { 464b61b877SBing Zhao MLX5_INDIRECT_ACTION_TYPE_RSS, 474b61b877SBing Zhao MLX5_INDIRECT_ACTION_TYPE_AGE, 48f3191849SMichael Baum MLX5_INDIRECT_ACTION_TYPE_COUNT, 492db75e8bSBing Zhao MLX5_INDIRECT_ACTION_TYPE_CT, 504a42ac1fSMatan Azrad }; 514a42ac1fSMatan Azrad 524f74cb68SBing Zhao /* Now, the maximal ports will be supported is 256, action number is 4M. */ 534f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_MAX_PORT 0x100 544f74cb68SBing Zhao 554f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_OWNER_SHIFT 22 564f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_OWNER_MASK (MLX5_INDIRECT_ACT_CT_MAX_PORT - 1) 574f74cb68SBing Zhao 584f74cb68SBing Zhao /* 30-31: type, 22-29: owner port, 0-21: index. */ 594f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_GEN_IDX(owner, index) \ 604f74cb68SBing Zhao ((MLX5_INDIRECT_ACTION_TYPE_CT << MLX5_INDIRECT_ACTION_TYPE_OFFSET) | \ 614f74cb68SBing Zhao (((owner) & MLX5_INDIRECT_ACT_CT_OWNER_MASK) << \ 624f74cb68SBing Zhao MLX5_INDIRECT_ACT_CT_OWNER_SHIFT) | (index)) 634f74cb68SBing Zhao 644f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_GET_OWNER(index) \ 654f74cb68SBing Zhao (((index) >> MLX5_INDIRECT_ACT_CT_OWNER_SHIFT) & \ 664f74cb68SBing Zhao MLX5_INDIRECT_ACT_CT_OWNER_MASK) 674f74cb68SBing Zhao 684f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_GET_IDX(index) \ 694f74cb68SBing Zhao ((index) & ((1 << MLX5_INDIRECT_ACT_CT_OWNER_SHIFT) - 1)) 704f74cb68SBing Zhao 7170d84dc7SOri Kam /* Matches on selected register. */ 7270d84dc7SOri Kam struct mlx5_rte_flow_item_tag { 73baf516beSViacheslav Ovsiienko enum modify_reg id; 74cff811c7SViacheslav Ovsiienko uint32_t data; 7570d84dc7SOri Kam }; 7670d84dc7SOri Kam 7770d84dc7SOri Kam /* Modify selected register. */ 7870d84dc7SOri Kam struct mlx5_rte_flow_action_set_tag { 79baf516beSViacheslav Ovsiienko enum modify_reg id; 80a597ef33SShun Hao uint8_t offset; 81a597ef33SShun Hao uint8_t length; 82cff811c7SViacheslav Ovsiienko uint32_t data; 8370d84dc7SOri Kam }; 8470d84dc7SOri Kam 85baf516beSViacheslav Ovsiienko struct mlx5_flow_action_copy_mreg { 86baf516beSViacheslav Ovsiienko enum modify_reg dst; 87baf516beSViacheslav Ovsiienko enum modify_reg src; 88baf516beSViacheslav Ovsiienko }; 89baf516beSViacheslav Ovsiienko 903c84f34eSOri Kam /* Matches on source queue. */ 913c84f34eSOri Kam struct mlx5_rte_flow_item_tx_queue { 923c84f34eSOri Kam uint32_t queue; 933c84f34eSOri Kam }; 943c84f34eSOri Kam 953e8edd0eSViacheslav Ovsiienko /* Feature name to allocate metadata register. */ 963e8edd0eSViacheslav Ovsiienko enum mlx5_feature_name { 973e8edd0eSViacheslav Ovsiienko MLX5_HAIRPIN_RX, 983e8edd0eSViacheslav Ovsiienko MLX5_HAIRPIN_TX, 993e8edd0eSViacheslav Ovsiienko MLX5_METADATA_RX, 1003e8edd0eSViacheslav Ovsiienko MLX5_METADATA_TX, 1013e8edd0eSViacheslav Ovsiienko MLX5_METADATA_FDB, 1023e8edd0eSViacheslav Ovsiienko MLX5_FLOW_MARK, 1033e8edd0eSViacheslav Ovsiienko MLX5_APP_TAG, 1043e8edd0eSViacheslav Ovsiienko MLX5_COPY_MARK, 10527efd5deSSuanming Mou MLX5_MTR_COLOR, 10683306d6cSShun Hao MLX5_MTR_ID, 10731ef2982SDekel Peled MLX5_ASO_FLOW_HIT, 1088ebbc01fSBing Zhao MLX5_ASO_CONNTRACK, 1093e8edd0eSViacheslav Ovsiienko }; 1103e8edd0eSViacheslav Ovsiienko 1118bb81f26SXueming Li /* Default queue number. */ 1128bb81f26SXueming Li #define MLX5_RSSQ_DEFAULT_NUM 16 1138bb81f26SXueming Li 11484c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L2 (1u << 0) 11584c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3_IPV4 (1u << 1) 11684c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3_IPV6 (1u << 2) 11784c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4_UDP (1u << 3) 11884c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4_TCP (1u << 4) 11984c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_VLAN (1u << 5) 12084c406e7SOri Kam 12184c406e7SOri Kam /* Pattern inner Layer bits. */ 12284c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L2 (1u << 6) 12384c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3_IPV4 (1u << 7) 12484c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3_IPV6 (1u << 8) 12584c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4_UDP (1u << 9) 12684c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4_TCP (1u << 10) 12784c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_VLAN (1u << 11) 12884c406e7SOri Kam 12984c406e7SOri Kam /* Pattern tunnel Layer bits. */ 13084c406e7SOri Kam #define MLX5_FLOW_LAYER_VXLAN (1u << 12) 13184c406e7SOri Kam #define MLX5_FLOW_LAYER_VXLAN_GPE (1u << 13) 13284c406e7SOri Kam #define MLX5_FLOW_LAYER_GRE (1u << 14) 13384c406e7SOri Kam #define MLX5_FLOW_LAYER_MPLS (1u << 15) 134ea81c1b8SDekel Peled /* List of tunnel Layer bits continued below. */ 13584c406e7SOri Kam 1366bd7fbd0SDekel Peled /* General pattern items bits. */ 1376bd7fbd0SDekel Peled #define MLX5_FLOW_ITEM_METADATA (1u << 16) 1382e4c987aSOri Kam #define MLX5_FLOW_ITEM_PORT_ID (1u << 17) 13970d84dc7SOri Kam #define MLX5_FLOW_ITEM_TAG (1u << 18) 14055deee17SViacheslav Ovsiienko #define MLX5_FLOW_ITEM_MARK (1u << 19) 1416bd7fbd0SDekel Peled 142d53aa89aSXiaoyu Min /* Pattern MISC bits. */ 14320ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_ICMP (1u << 20) 14420ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_ICMP6 (1u << 21) 14520ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_GRE_KEY (1u << 22) 146d53aa89aSXiaoyu Min 147ea81c1b8SDekel Peled /* Pattern tunnel Layer bits (continued). */ 14820ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_IPIP (1u << 23) 14920ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_IPV6_ENCAP (1u << 24) 15020ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_NVGRE (1u << 25) 15120ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_GENEVE (1u << 26) 1525e33bebdSXiaoyu Min 1533c84f34eSOri Kam /* Queue items. */ 15420ac7966SXiaoyu Min #define MLX5_FLOW_ITEM_TX_QUEUE (1u << 27) 1553c84f34eSOri Kam 156f31d7a01SDekel Peled /* Pattern tunnel Layer bits (continued). */ 157f31d7a01SDekel Peled #define MLX5_FLOW_LAYER_GTP (1u << 28) 158f31d7a01SDekel Peled 159c7eca236SBing Zhao /* Pattern eCPRI Layer bit. */ 160c7eca236SBing Zhao #define MLX5_FLOW_LAYER_ECPRI (UINT64_C(1) << 29) 161c7eca236SBing Zhao 1620e5a0d8fSDekel Peled /* IPv6 Fragment Extension Header bit. */ 1630e5a0d8fSDekel Peled #define MLX5_FLOW_LAYER_OUTER_L3_IPV6_FRAG_EXT (1u << 30) 1640e5a0d8fSDekel Peled #define MLX5_FLOW_LAYER_INNER_L3_IPV6_FRAG_EXT (1u << 31) 1650e5a0d8fSDekel Peled 1662c9f9617SShiri Kuzin /* Pattern tunnel Layer bits (continued). */ 167f7239fceSShiri Kuzin #define MLX5_FLOW_LAYER_GENEVE_OPT (UINT64_C(1) << 32) 1682c9f9617SShiri Kuzin #define MLX5_FLOW_LAYER_GTP_PSC (UINT64_C(1) << 33) 1692c9f9617SShiri Kuzin 17079f89527SGregory Etelson /* INTEGRITY item bit */ 17179f89527SGregory Etelson #define MLX5_FLOW_ITEM_INTEGRITY (UINT64_C(1) << 34) 17279f89527SGregory Etelson 173aca19061SBing Zhao /* Conntrack item. */ 174aca19061SBing Zhao #define MLX5_FLOW_LAYER_ASO_CT (UINT64_C(1) << 35) 175aca19061SBing Zhao 17684c406e7SOri Kam /* Outer Masks. */ 17784c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3 \ 17884c406e7SOri Kam (MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L3_IPV6) 17984c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4 \ 18084c406e7SOri Kam (MLX5_FLOW_LAYER_OUTER_L4_UDP | MLX5_FLOW_LAYER_OUTER_L4_TCP) 18184c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER \ 18284c406e7SOri Kam (MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_OUTER_L3 | \ 18384c406e7SOri Kam MLX5_FLOW_LAYER_OUTER_L4) 18484c406e7SOri Kam 18584c406e7SOri Kam /* Tunnel Masks. */ 18684c406e7SOri Kam #define MLX5_FLOW_LAYER_TUNNEL \ 18784c406e7SOri Kam (MLX5_FLOW_LAYER_VXLAN | MLX5_FLOW_LAYER_VXLAN_GPE | \ 188ea81c1b8SDekel Peled MLX5_FLOW_LAYER_GRE | MLX5_FLOW_LAYER_NVGRE | MLX5_FLOW_LAYER_MPLS | \ 189e59a5dbcSMoti Haimovsky MLX5_FLOW_LAYER_IPIP | MLX5_FLOW_LAYER_IPV6_ENCAP | \ 190f31d7a01SDekel Peled MLX5_FLOW_LAYER_GENEVE | MLX5_FLOW_LAYER_GTP) 19184c406e7SOri Kam 19284c406e7SOri Kam /* Inner Masks. */ 19384c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3 \ 19484c406e7SOri Kam (MLX5_FLOW_LAYER_INNER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV6) 19584c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4 \ 19684c406e7SOri Kam (MLX5_FLOW_LAYER_INNER_L4_UDP | MLX5_FLOW_LAYER_INNER_L4_TCP) 19784c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER \ 19884c406e7SOri Kam (MLX5_FLOW_LAYER_INNER_L2 | MLX5_FLOW_LAYER_INNER_L3 | \ 19984c406e7SOri Kam MLX5_FLOW_LAYER_INNER_L4) 20084c406e7SOri Kam 2014bb14c83SDekel Peled /* Layer Masks. */ 2024bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L2 \ 2034bb14c83SDekel Peled (MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_INNER_L2) 2044bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV4 \ 2054bb14c83SDekel Peled (MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV4) 2064bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV6 \ 2074bb14c83SDekel Peled (MLX5_FLOW_LAYER_OUTER_L3_IPV6 | MLX5_FLOW_LAYER_INNER_L3_IPV6) 2084bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3 \ 2094bb14c83SDekel Peled (MLX5_FLOW_LAYER_L3_IPV4 | MLX5_FLOW_LAYER_L3_IPV6) 2104bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L4 \ 2114bb14c83SDekel Peled (MLX5_FLOW_LAYER_OUTER_L4 | MLX5_FLOW_LAYER_INNER_L4) 2124bb14c83SDekel Peled 21384c406e7SOri Kam /* Actions */ 21484c406e7SOri Kam #define MLX5_FLOW_ACTION_DROP (1u << 0) 21584c406e7SOri Kam #define MLX5_FLOW_ACTION_QUEUE (1u << 1) 21684c406e7SOri Kam #define MLX5_FLOW_ACTION_RSS (1u << 2) 21784c406e7SOri Kam #define MLX5_FLOW_ACTION_FLAG (1u << 3) 21884c406e7SOri Kam #define MLX5_FLOW_ACTION_MARK (1u << 4) 21984c406e7SOri Kam #define MLX5_FLOW_ACTION_COUNT (1u << 5) 22057123c00SYongseok Koh #define MLX5_FLOW_ACTION_PORT_ID (1u << 6) 22157123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_POP_VLAN (1u << 7) 22257123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_PUSH_VLAN (1u << 8) 22357123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_SET_VLAN_VID (1u << 9) 22457123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_SET_VLAN_PCP (1u << 10) 2252ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV4_SRC (1u << 11) 2262ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV4_DST (1u << 12) 2272ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV6_SRC (1u << 13) 2282ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV6_DST (1u << 14) 2292ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TP_SRC (1u << 15) 2302ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TP_DST (1u << 16) 23131fda518SYongseok Koh #define MLX5_FLOW_ACTION_JUMP (1u << 17) 232a7cb5bcdSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TTL (1u << 18) 233a7cb5bcdSXiaoyu Min #define MLX5_FLOW_ACTION_DEC_TTL (1u << 19) 23476046778SXiaoyu Min #define MLX5_FLOW_ACTION_SET_MAC_SRC (1u << 20) 23576046778SXiaoyu Min #define MLX5_FLOW_ACTION_SET_MAC_DST (1u << 21) 23606387be8SMatan Azrad #define MLX5_FLOW_ACTION_ENCAP (1u << 22) 23706387be8SMatan Azrad #define MLX5_FLOW_ACTION_DECAP (1u << 23) 23806387be8SMatan Azrad #define MLX5_FLOW_ACTION_INC_TCP_SEQ (1u << 24) 23906387be8SMatan Azrad #define MLX5_FLOW_ACTION_DEC_TCP_SEQ (1u << 25) 24006387be8SMatan Azrad #define MLX5_FLOW_ACTION_INC_TCP_ACK (1u << 26) 24106387be8SMatan Azrad #define MLX5_FLOW_ACTION_DEC_TCP_ACK (1u << 27) 24206387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_TAG (1ull << 28) 24306387be8SMatan Azrad #define MLX5_FLOW_ACTION_MARK_EXT (1ull << 29) 24406387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_META (1ull << 30) 24506387be8SMatan Azrad #define MLX5_FLOW_ACTION_METER (1ull << 31) 24606387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_IPV4_DSCP (1ull << 32) 24706387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_IPV6_DSCP (1ull << 33) 248fa2d01c8SDong Zhou #define MLX5_FLOW_ACTION_AGE (1ull << 34) 2493c78124fSShiri Kuzin #define MLX5_FLOW_ACTION_DEFAULT_MISS (1ull << 35) 25096b1f027SJiawei Wang #define MLX5_FLOW_ACTION_SAMPLE (1ull << 36) 2514ec6360dSGregory Etelson #define MLX5_FLOW_ACTION_TUNNEL_SET (1ull << 37) 2524ec6360dSGregory Etelson #define MLX5_FLOW_ACTION_TUNNEL_MATCH (1ull << 38) 253641dbe4fSAlexander Kozyrev #define MLX5_FLOW_ACTION_MODIFY_FIELD (1ull << 39) 25444432018SLi Zhang #define MLX5_FLOW_ACTION_METER_WITH_TERMINATED_POLICY (1ull << 40) 2552d084f69SBing Zhao #define MLX5_FLOW_ACTION_CT (1ull << 41) 25684c406e7SOri Kam 25784c406e7SOri Kam #define MLX5_FLOW_FATE_ACTIONS \ 258684b9a1bSOri Kam (MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | \ 2593c78124fSShiri Kuzin MLX5_FLOW_ACTION_RSS | MLX5_FLOW_ACTION_JUMP | \ 26044432018SLi Zhang MLX5_FLOW_ACTION_DEFAULT_MISS | \ 26144432018SLi Zhang MLX5_FLOW_ACTION_METER_WITH_TERMINATED_POLICY) 26284c406e7SOri Kam 2632e4c987aSOri Kam #define MLX5_FLOW_FATE_ESWITCH_ACTIONS \ 2642e4c987aSOri Kam (MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_PORT_ID | \ 26544432018SLi Zhang MLX5_FLOW_ACTION_JUMP | MLX5_FLOW_ACTION_METER_WITH_TERMINATED_POLICY) 2664b8727f0SDekel Peled 2674bb14c83SDekel Peled #define MLX5_FLOW_MODIFY_HDR_ACTIONS (MLX5_FLOW_ACTION_SET_IPV4_SRC | \ 2684bb14c83SDekel Peled MLX5_FLOW_ACTION_SET_IPV4_DST | \ 2694bb14c83SDekel Peled MLX5_FLOW_ACTION_SET_IPV6_SRC | \ 2704bb14c83SDekel Peled MLX5_FLOW_ACTION_SET_IPV6_DST | \ 2714bb14c83SDekel Peled MLX5_FLOW_ACTION_SET_TP_SRC | \ 2724bb14c83SDekel Peled MLX5_FLOW_ACTION_SET_TP_DST | \ 2734bb14c83SDekel Peled MLX5_FLOW_ACTION_SET_TTL | \ 2744bb14c83SDekel Peled MLX5_FLOW_ACTION_DEC_TTL | \ 2754bb14c83SDekel Peled MLX5_FLOW_ACTION_SET_MAC_SRC | \ 276585b99fbSDekel Peled MLX5_FLOW_ACTION_SET_MAC_DST | \ 277585b99fbSDekel Peled MLX5_FLOW_ACTION_INC_TCP_SEQ | \ 278585b99fbSDekel Peled MLX5_FLOW_ACTION_DEC_TCP_SEQ | \ 279585b99fbSDekel Peled MLX5_FLOW_ACTION_INC_TCP_ACK | \ 2805f163d52SMoti Haimovsky MLX5_FLOW_ACTION_DEC_TCP_ACK | \ 28170d84dc7SOri Kam MLX5_FLOW_ACTION_OF_SET_VLAN_VID | \ 28255deee17SViacheslav Ovsiienko MLX5_FLOW_ACTION_SET_TAG | \ 283fcc8d2f7SViacheslav Ovsiienko MLX5_FLOW_ACTION_MARK_EXT | \ 2846f26e604SSuanming Mou MLX5_FLOW_ACTION_SET_META | \ 2856f26e604SSuanming Mou MLX5_FLOW_ACTION_SET_IPV4_DSCP | \ 286641dbe4fSAlexander Kozyrev MLX5_FLOW_ACTION_SET_IPV6_DSCP | \ 287641dbe4fSAlexander Kozyrev MLX5_FLOW_ACTION_MODIFY_FIELD) 2884bb14c83SDekel Peled 2899aee7a84SMoti Haimovsky #define MLX5_FLOW_VLAN_ACTIONS (MLX5_FLOW_ACTION_OF_POP_VLAN | \ 2909aee7a84SMoti Haimovsky MLX5_FLOW_ACTION_OF_PUSH_VLAN) 29106387be8SMatan Azrad 29206387be8SMatan Azrad #define MLX5_FLOW_XCAP_ACTIONS (MLX5_FLOW_ACTION_ENCAP | MLX5_FLOW_ACTION_DECAP) 29306387be8SMatan Azrad 29484c406e7SOri Kam #ifndef IPPROTO_MPLS 29584c406e7SOri Kam #define IPPROTO_MPLS 137 29684c406e7SOri Kam #endif 29784c406e7SOri Kam 298d1abe664SDekel Peled /* UDP port number for MPLS */ 299d1abe664SDekel Peled #define MLX5_UDP_PORT_MPLS 6635 300d1abe664SDekel Peled 301fc2c498cSOri Kam /* UDP port numbers for VxLAN. */ 302fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN 4789 303fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN_GPE 4790 304fc2c498cSOri Kam 305e59a5dbcSMoti Haimovsky /* UDP port numbers for GENEVE. */ 306e59a5dbcSMoti Haimovsky #define MLX5_UDP_PORT_GENEVE 6081 307e59a5dbcSMoti Haimovsky 3085f8ae44dSDong Zhou /* Lowest priority indicator. */ 3095f8ae44dSDong Zhou #define MLX5_FLOW_LOWEST_PRIO_INDICATOR ((uint32_t)-1) 3105f8ae44dSDong Zhou 3115f8ae44dSDong Zhou /* 3125f8ae44dSDong Zhou * Max priority for ingress\egress flow groups 3135f8ae44dSDong Zhou * greater than 0 and for any transfer flow group. 3145f8ae44dSDong Zhou * From user configation: 0 - 21843. 3155f8ae44dSDong Zhou */ 3165f8ae44dSDong Zhou #define MLX5_NON_ROOT_FLOW_MAX_PRIO (21843 + 1) 31784c406e7SOri Kam 31884c406e7SOri Kam /* 31984c406e7SOri Kam * Number of sub priorities. 32084c406e7SOri Kam * For each kind of pattern matching i.e. L2, L3, L4 to have a correct 32184c406e7SOri Kam * matching on the NIC (firmware dependent) L4 most have the higher priority 32284c406e7SOri Kam * followed by L3 and ending with L2. 32384c406e7SOri Kam */ 32484c406e7SOri Kam #define MLX5_PRIORITY_MAP_L2 2 32584c406e7SOri Kam #define MLX5_PRIORITY_MAP_L3 1 32684c406e7SOri Kam #define MLX5_PRIORITY_MAP_L4 0 32784c406e7SOri Kam #define MLX5_PRIORITY_MAP_MAX 3 32884c406e7SOri Kam 329fc2c498cSOri Kam /* Valid layer type for IPV4 RSS. */ 330fc2c498cSOri Kam #define MLX5_IPV4_LAYER_TYPES \ 331fc2c498cSOri Kam (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \ 332fc2c498cSOri Kam ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV4_UDP | \ 333fc2c498cSOri Kam ETH_RSS_NONFRAG_IPV4_OTHER) 334fc2c498cSOri Kam 335fc2c498cSOri Kam /* IBV hash source bits for IPV4. */ 336fc2c498cSOri Kam #define MLX5_IPV4_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4) 337fc2c498cSOri Kam 338fc2c498cSOri Kam /* Valid layer type for IPV6 RSS. */ 339fc2c498cSOri Kam #define MLX5_IPV6_LAYER_TYPES \ 340fc2c498cSOri Kam (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | ETH_RSS_NONFRAG_IPV6_TCP | \ 341fc2c498cSOri Kam ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_IPV6_EX | ETH_RSS_IPV6_TCP_EX | \ 342fc2c498cSOri Kam ETH_RSS_IPV6_UDP_EX | ETH_RSS_NONFRAG_IPV6_OTHER) 343fc2c498cSOri Kam 344fc2c498cSOri Kam /* IBV hash source bits for IPV6. */ 345fc2c498cSOri Kam #define MLX5_IPV6_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6) 346fc2c498cSOri Kam 347c3e33304SDekel Peled /* IBV hash bits for L3 SRC. */ 348c3e33304SDekel Peled #define MLX5_L3_SRC_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_SRC_IPV6) 349c3e33304SDekel Peled 350c3e33304SDekel Peled /* IBV hash bits for L3 DST. */ 351c3e33304SDekel Peled #define MLX5_L3_DST_IBV_RX_HASH (IBV_RX_HASH_DST_IPV4 | IBV_RX_HASH_DST_IPV6) 352c3e33304SDekel Peled 353c3e33304SDekel Peled /* IBV hash bits for TCP. */ 354c3e33304SDekel Peled #define MLX5_TCP_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_TCP | \ 355c3e33304SDekel Peled IBV_RX_HASH_DST_PORT_TCP) 356c3e33304SDekel Peled 357c3e33304SDekel Peled /* IBV hash bits for UDP. */ 358c3e33304SDekel Peled #define MLX5_UDP_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_UDP | \ 359c3e33304SDekel Peled IBV_RX_HASH_DST_PORT_UDP) 360c3e33304SDekel Peled 361c3e33304SDekel Peled /* IBV hash bits for L4 SRC. */ 362c3e33304SDekel Peled #define MLX5_L4_SRC_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_TCP | \ 363c3e33304SDekel Peled IBV_RX_HASH_SRC_PORT_UDP) 364c3e33304SDekel Peled 365c3e33304SDekel Peled /* IBV hash bits for L4 DST. */ 366c3e33304SDekel Peled #define MLX5_L4_DST_IBV_RX_HASH (IBV_RX_HASH_DST_PORT_TCP | \ 367c3e33304SDekel Peled IBV_RX_HASH_DST_PORT_UDP) 368e59a5dbcSMoti Haimovsky 369e59a5dbcSMoti Haimovsky /* Geneve header first 16Bit */ 370e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_MASK 0x3 371e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_SHIFT 14 372e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_VAL(a) \ 373e59a5dbcSMoti Haimovsky (((a) >> (MLX5_GENEVE_VER_SHIFT)) & (MLX5_GENEVE_VER_MASK)) 374e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_MASK 0x3F 375e440d6cfSShiri Kuzin #define MLX5_GENEVE_OPTLEN_SHIFT 8 376e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_VAL(a) \ 377e59a5dbcSMoti Haimovsky (((a) >> (MLX5_GENEVE_OPTLEN_SHIFT)) & (MLX5_GENEVE_OPTLEN_MASK)) 378e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_MASK 0x1 379e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_SHIFT 7 380e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_VAL(a) \ 381e59a5dbcSMoti Haimovsky (((a) >> (MLX5_GENEVE_OAMF_SHIFT)) & (MLX5_GENEVE_OAMF_MASK)) 382e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_MASK 0x1 383e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_SHIFT 6 384e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_VAL(a) \ 385e59a5dbcSMoti Haimovsky (((a) >> (MLX5_GENEVE_CRITO_SHIFT)) & (MLX5_GENEVE_CRITO_MASK)) 386e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_MASK 0x3F 387e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_VAL(a) ((a) & (MLX5_GENEVE_RSVD_MASK)) 388e59a5dbcSMoti Haimovsky /* 389e59a5dbcSMoti Haimovsky * The length of the Geneve options fields, expressed in four byte multiples, 390e59a5dbcSMoti Haimovsky * not including the eight byte fixed tunnel. 391e59a5dbcSMoti Haimovsky */ 392e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_0 14 393e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_1 63 394e59a5dbcSMoti Haimovsky 395f9210259SViacheslav Ovsiienko #define MLX5_ENCAPSULATION_DECISION_SIZE (sizeof(struct rte_ether_hdr) + \ 396f9210259SViacheslav Ovsiienko sizeof(struct rte_ipv4_hdr)) 3972c9f9617SShiri Kuzin /* GTP extension header flag. */ 3982c9f9617SShiri Kuzin #define MLX5_GTP_EXT_HEADER_FLAG 4 3992c9f9617SShiri Kuzin 4002c9f9617SShiri Kuzin /* GTP extension header max PDU type value. */ 4012c9f9617SShiri Kuzin #define MLX5_GTP_EXT_MAX_PDU_TYPE 15 40250f576d6SSuanming Mou 40306cd4cf6SShiri Kuzin /* GTP extension header PDU type shift. */ 40406cd4cf6SShiri Kuzin #define MLX5_GTP_PDU_TYPE_SHIFT(a) ((a) << 4) 40506cd4cf6SShiri Kuzin 4066859e67eSDekel Peled /* IPv4 fragment_offset field contains relevant data in bits 2 to 15. */ 4076859e67eSDekel Peled #define MLX5_IPV4_FRAG_OFFSET_MASK \ 4086859e67eSDekel Peled (RTE_IPV4_HDR_OFFSET_MASK | RTE_IPV4_HDR_MF_FLAG) 4096859e67eSDekel Peled 4106859e67eSDekel Peled /* Specific item's fields can accept a range of values (using spec and last). */ 4116859e67eSDekel Peled #define MLX5_ITEM_RANGE_NOT_ACCEPTED false 4126859e67eSDekel Peled #define MLX5_ITEM_RANGE_ACCEPTED true 4136859e67eSDekel Peled 41472a944dbSBing Zhao /* Software header modify action numbers of a flow. */ 41572a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_IPV4 1 41672a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_IPV6 4 41772a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_MAC 2 41872a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_VID 1 41972a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_PORT 2 42072a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_TTL 1 42172a944dbSBing Zhao #define MLX5_ACT_NUM_DEC_TTL MLX5_ACT_NUM_MDF_TTL 42272a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_TCPSEQ 1 42372a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_TCPACK 1 42472a944dbSBing Zhao #define MLX5_ACT_NUM_SET_REG 1 42572a944dbSBing Zhao #define MLX5_ACT_NUM_SET_TAG 1 42672a944dbSBing Zhao #define MLX5_ACT_NUM_CPY_MREG MLX5_ACT_NUM_SET_TAG 42772a944dbSBing Zhao #define MLX5_ACT_NUM_SET_MARK MLX5_ACT_NUM_SET_TAG 42872a944dbSBing Zhao #define MLX5_ACT_NUM_SET_META MLX5_ACT_NUM_SET_TAG 42972a944dbSBing Zhao #define MLX5_ACT_NUM_SET_DSCP 1 43072a944dbSBing Zhao 431641dbe4fSAlexander Kozyrev /* Maximum number of fields to modify in MODIFY_FIELD */ 432641dbe4fSAlexander Kozyrev #define MLX5_ACT_MAX_MOD_FIELDS 5 433641dbe4fSAlexander Kozyrev 4345cac1a5cSBing Zhao /* Syndrome bits definition for connection tracking. */ 4355cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_VALID (0x0 << 6) 4365cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_INVALID (0x1 << 6) 4375cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_TRAP (0x2 << 6) 4385cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_STATE_CHANGE (0x1 << 1) 4395cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_BAD_PACKET (0x1 << 0) 4405cac1a5cSBing Zhao 4410c76d1c9SYongseok Koh enum mlx5_flow_drv_type { 4420c76d1c9SYongseok Koh MLX5_FLOW_TYPE_MIN, 4430c76d1c9SYongseok Koh MLX5_FLOW_TYPE_DV, 4440c76d1c9SYongseok Koh MLX5_FLOW_TYPE_VERBS, 4450c76d1c9SYongseok Koh MLX5_FLOW_TYPE_MAX, 4460c76d1c9SYongseok Koh }; 4470c76d1c9SYongseok Koh 448488d13abSSuanming Mou /* Fate action type. */ 449488d13abSSuanming Mou enum mlx5_flow_fate_type { 450488d13abSSuanming Mou MLX5_FLOW_FATE_NONE, /* Egress flow. */ 451488d13abSSuanming Mou MLX5_FLOW_FATE_QUEUE, 452488d13abSSuanming Mou MLX5_FLOW_FATE_JUMP, 453488d13abSSuanming Mou MLX5_FLOW_FATE_PORT_ID, 454488d13abSSuanming Mou MLX5_FLOW_FATE_DROP, 4553c78124fSShiri Kuzin MLX5_FLOW_FATE_DEFAULT_MISS, 456fabf8a37SSuanming Mou MLX5_FLOW_FATE_SHARED_RSS, 45750cc92ddSShun Hao MLX5_FLOW_FATE_MTR, 458488d13abSSuanming Mou MLX5_FLOW_FATE_MAX, 459488d13abSSuanming Mou }; 460488d13abSSuanming Mou 461865a0c15SOri Kam /* Matcher PRM representation */ 462865a0c15SOri Kam struct mlx5_flow_dv_match_params { 463865a0c15SOri Kam size_t size; 464865a0c15SOri Kam /**< Size of match value. Do NOT split size and key! */ 465865a0c15SOri Kam uint32_t buf[MLX5_ST_SZ_DW(fte_match_param)]; 466865a0c15SOri Kam /**< Matcher value. This value is used as the mask or as a key. */ 467865a0c15SOri Kam }; 468865a0c15SOri Kam 469865a0c15SOri Kam /* Matcher structure. */ 470865a0c15SOri Kam struct mlx5_flow_dv_matcher { 471e78e5408SMatan Azrad struct mlx5_list_entry entry; /**< Pointer to the next element. */ 472e9e36e52SBing Zhao struct mlx5_flow_tbl_resource *tbl; 473e9e36e52SBing Zhao /**< Pointer to the table(group) the matcher associated with. */ 474865a0c15SOri Kam void *matcher_object; /**< Pointer to DV matcher */ 475865a0c15SOri Kam uint16_t crc; /**< CRC of key. */ 476865a0c15SOri Kam uint16_t priority; /**< Priority of matcher. */ 477865a0c15SOri Kam struct mlx5_flow_dv_match_params mask; /**< Matcher mask. */ 478865a0c15SOri Kam }; 479865a0c15SOri Kam 4804bb14c83SDekel Peled #define MLX5_ENCAP_MAX_LEN 132 4814bb14c83SDekel Peled 482c513f05cSDekel Peled /* Encap/decap resource structure. */ 483c513f05cSDekel Peled struct mlx5_flow_dv_encap_decap_resource { 484961b6774SMatan Azrad struct mlx5_list_entry entry; 485c513f05cSDekel Peled /* Pointer to next element. */ 486cf7d1995SAlexander Kozyrev uint32_t refcnt; /**< Reference counter. */ 4876ad7cfaaSDekel Peled void *action; 4886ad7cfaaSDekel Peled /**< Encap/decap action object. */ 489c513f05cSDekel Peled uint8_t buf[MLX5_ENCAP_MAX_LEN]; 490c513f05cSDekel Peled size_t size; 491c513f05cSDekel Peled uint8_t reformat_type; 492c513f05cSDekel Peled uint8_t ft_type; 4934f84a197SOri Kam uint64_t flags; /**< Flags for RDMA API. */ 494bf615b07SSuanming Mou uint32_t idx; /**< Index for the index memory pool. */ 495c513f05cSDekel Peled }; 496c513f05cSDekel Peled 497cbb66daaSOri Kam /* Tag resource structure. */ 498cbb66daaSOri Kam struct mlx5_flow_dv_tag_resource { 499961b6774SMatan Azrad struct mlx5_list_entry entry; 500e484e403SBing Zhao /**< hash list entry for tag resource, tag value as the key. */ 501cbb66daaSOri Kam void *action; 5026ad7cfaaSDekel Peled /**< Tag action object. */ 503cf7d1995SAlexander Kozyrev uint32_t refcnt; /**< Reference counter. */ 5045f114269SSuanming Mou uint32_t idx; /**< Index for the index memory pool. */ 505f5b0aed2SSuanming Mou uint32_t tag_id; /**< Tag ID. */ 506cbb66daaSOri Kam }; 507cbb66daaSOri Kam 5084bb14c83SDekel Peled /* Modify resource structure */ 5094bb14c83SDekel Peled struct mlx5_flow_dv_modify_hdr_resource { 510961b6774SMatan Azrad struct mlx5_list_entry entry; 51116a7dbc4SXueming Li void *action; /**< Modify header action object. */ 5124f3d8d0eSMatan Azrad uint32_t idx; 51316a7dbc4SXueming Li /* Key area for hash list matching: */ 5144bb14c83SDekel Peled uint8_t ft_type; /**< Flow table type, Rx or Tx. */ 515e681eb05SMatan Azrad uint8_t actions_num; /**< Number of modification actions. */ 516e681eb05SMatan Azrad bool root; /**< Whether action is in root table. */ 517024e9575SBing Zhao struct mlx5_modification_cmd actions[]; 518024e9575SBing Zhao /**< Modification actions. */ 519e681eb05SMatan Azrad } __rte_packed; 5204bb14c83SDekel Peled 5213fe88961SSuanming Mou /* Modify resource key of the hash organization. */ 5223fe88961SSuanming Mou union mlx5_flow_modify_hdr_key { 5233fe88961SSuanming Mou struct { 5243fe88961SSuanming Mou uint32_t ft_type:8; /**< Flow table type, Rx or Tx. */ 5253fe88961SSuanming Mou uint32_t actions_num:5; /**< Number of modification actions. */ 5263fe88961SSuanming Mou uint32_t group:19; /**< Flow group id. */ 5273fe88961SSuanming Mou uint32_t cksum; /**< Actions check sum. */ 5283fe88961SSuanming Mou }; 5293fe88961SSuanming Mou uint64_t v64; /**< full 64bits value of key */ 5303fe88961SSuanming Mou }; 5313fe88961SSuanming Mou 532684b9a1bSOri Kam /* Jump action resource structure. */ 533684b9a1bSOri Kam struct mlx5_flow_dv_jump_tbl_resource { 5346c1d9a64SBing Zhao void *action; /**< Pointer to the rdma core action. */ 535684b9a1bSOri Kam }; 536684b9a1bSOri Kam 537c269b517SOri Kam /* Port ID resource structure. */ 538c269b517SOri Kam struct mlx5_flow_dv_port_id_action_resource { 539e78e5408SMatan Azrad struct mlx5_list_entry entry; 5400fd5f82aSXueming Li void *action; /**< Action object. */ 541c269b517SOri Kam uint32_t port_id; /**< Port ID value. */ 5420fd5f82aSXueming Li uint32_t idx; /**< Indexed pool memory index. */ 543c269b517SOri Kam }; 544c269b517SOri Kam 5459aee7a84SMoti Haimovsky /* Push VLAN action resource structure */ 5469aee7a84SMoti Haimovsky struct mlx5_flow_dv_push_vlan_action_resource { 547e78e5408SMatan Azrad struct mlx5_list_entry entry; /* Cache entry. */ 5486ad7cfaaSDekel Peled void *action; /**< Action object. */ 5499aee7a84SMoti Haimovsky uint8_t ft_type; /**< Flow table type, Rx, Tx or FDB. */ 5509aee7a84SMoti Haimovsky rte_be32_t vlan_tag; /**< VLAN tag value. */ 5513422af2aSXueming Li uint32_t idx; /**< Indexed pool memory index. */ 5529aee7a84SMoti Haimovsky }; 5539aee7a84SMoti Haimovsky 554dd3c774fSViacheslav Ovsiienko /* Metadata register copy table entry. */ 555dd3c774fSViacheslav Ovsiienko struct mlx5_flow_mreg_copy_resource { 556dd3c774fSViacheslav Ovsiienko /* 557dd3c774fSViacheslav Ovsiienko * Hash list entry for copy table. 558dd3c774fSViacheslav Ovsiienko * - Key is 32/64-bit MARK action ID. 559dd3c774fSViacheslav Ovsiienko * - MUST be the first entry. 560dd3c774fSViacheslav Ovsiienko */ 561961b6774SMatan Azrad struct mlx5_list_entry hlist_ent; 562dd3c774fSViacheslav Ovsiienko LIST_ENTRY(mlx5_flow_mreg_copy_resource) next; 563dd3c774fSViacheslav Ovsiienko /* List entry for device flows. */ 56490e6053aSSuanming Mou uint32_t idx; 565ab612adcSSuanming Mou uint32_t rix_flow; /* Built flow for copy. */ 566f5b0aed2SSuanming Mou uint32_t mark_id; 567dd3c774fSViacheslav Ovsiienko }; 568dd3c774fSViacheslav Ovsiienko 569afd7a625SXueming Li /* Table tunnel parameter. */ 570afd7a625SXueming Li struct mlx5_flow_tbl_tunnel_prm { 571afd7a625SXueming Li const struct mlx5_flow_tunnel *tunnel; 572afd7a625SXueming Li uint32_t group_id; 573afd7a625SXueming Li bool external; 574afd7a625SXueming Li }; 575afd7a625SXueming Li 576860897d2SBing Zhao /* Table data structure of the hash organization. */ 577860897d2SBing Zhao struct mlx5_flow_tbl_data_entry { 578961b6774SMatan Azrad struct mlx5_list_entry entry; 579e9e36e52SBing Zhao /**< hash list entry, 64-bits key inside. */ 580860897d2SBing Zhao struct mlx5_flow_tbl_resource tbl; 581e9e36e52SBing Zhao /**< flow table resource. */ 582679f46c7SMatan Azrad struct mlx5_list *matchers; 583e9e36e52SBing Zhao /**< matchers' header associated with the flow table. */ 5846c1d9a64SBing Zhao struct mlx5_flow_dv_jump_tbl_resource jump; 5856c1d9a64SBing Zhao /**< jump resource, at most one for each table created. */ 5867ac99475SSuanming Mou uint32_t idx; /**< index for the indexed mempool. */ 5874ec6360dSGregory Etelson /**< tunnel offload */ 5884ec6360dSGregory Etelson const struct mlx5_flow_tunnel *tunnel; 5894ec6360dSGregory Etelson uint32_t group_id; 590f5b0aed2SSuanming Mou uint32_t external:1; 591f5b0aed2SSuanming Mou uint32_t tunnel_offload:1; /* Tunnel offlod table or not. */ 592f5b0aed2SSuanming Mou uint32_t is_egress:1; /**< Egress table. */ 593f5b0aed2SSuanming Mou uint32_t is_transfer:1; /**< Transfer table. */ 594f5b0aed2SSuanming Mou uint32_t dummy:1; /**< DR table. */ 5952d2cef5dSLi Zhang uint32_t id:22; /**< Table ID. */ 5962d2cef5dSLi Zhang uint32_t reserve:5; /**< Reserved to future using. */ 5972d2cef5dSLi Zhang uint32_t level; /**< Table level. */ 598860897d2SBing Zhao }; 599860897d2SBing Zhao 600b4c0ddbfSJiawei Wang /* Sub rdma-core actions list. */ 601b4c0ddbfSJiawei Wang struct mlx5_flow_sub_actions_list { 602b4c0ddbfSJiawei Wang uint32_t actions_num; /**< Number of sample actions. */ 603b4c0ddbfSJiawei Wang uint64_t action_flags; 604b4c0ddbfSJiawei Wang void *dr_queue_action; 605b4c0ddbfSJiawei Wang void *dr_tag_action; 606b4c0ddbfSJiawei Wang void *dr_cnt_action; 60700c10c22SJiawei Wang void *dr_port_id_action; 60800c10c22SJiawei Wang void *dr_encap_action; 6096a951567SJiawei Wang void *dr_jump_action; 610b4c0ddbfSJiawei Wang }; 611b4c0ddbfSJiawei Wang 612b4c0ddbfSJiawei Wang /* Sample sub-actions resource list. */ 613b4c0ddbfSJiawei Wang struct mlx5_flow_sub_actions_idx { 614b4c0ddbfSJiawei Wang uint32_t rix_hrxq; /**< Hash Rx queue object index. */ 615b4c0ddbfSJiawei Wang uint32_t rix_tag; /**< Index to the tag action. */ 61600c10c22SJiawei Wang uint32_t rix_port_id_action; /**< Index to port ID action resource. */ 61700c10c22SJiawei Wang uint32_t rix_encap_decap; /**< Index to encap/decap resource. */ 6186a951567SJiawei Wang uint32_t rix_jump; /**< Index to the jump action resource. */ 619b4c0ddbfSJiawei Wang }; 620b4c0ddbfSJiawei Wang 621b4c0ddbfSJiawei Wang /* Sample action resource structure. */ 622b4c0ddbfSJiawei Wang struct mlx5_flow_dv_sample_resource { 623e78e5408SMatan Azrad struct mlx5_list_entry entry; /**< Cache entry. */ 62419784141SSuanming Mou union { 625b4c0ddbfSJiawei Wang void *verbs_action; /**< Verbs sample action object. */ 62619784141SSuanming Mou void **sub_actions; /**< Sample sub-action array. */ 62719784141SSuanming Mou }; 62801c05ee0SSuanming Mou struct rte_eth_dev *dev; /**< Device registers the action. */ 62919784141SSuanming Mou uint32_t idx; /** Sample object index. */ 630b4c0ddbfSJiawei Wang uint8_t ft_type; /** Flow Table Type */ 631b4c0ddbfSJiawei Wang uint32_t ft_id; /** Flow Table Level */ 632b4c0ddbfSJiawei Wang uint32_t ratio; /** Sample Ratio */ 633b4c0ddbfSJiawei Wang uint64_t set_action; /** Restore reg_c0 value */ 634b4c0ddbfSJiawei Wang void *normal_path_tbl; /** Flow Table pointer */ 635b4c0ddbfSJiawei Wang struct mlx5_flow_sub_actions_idx sample_idx; 636b4c0ddbfSJiawei Wang /**< Action index resources. */ 637b4c0ddbfSJiawei Wang struct mlx5_flow_sub_actions_list sample_act; 638b4c0ddbfSJiawei Wang /**< Action resources. */ 639b4c0ddbfSJiawei Wang }; 640b4c0ddbfSJiawei Wang 64100c10c22SJiawei Wang #define MLX5_MAX_DEST_NUM 2 64200c10c22SJiawei Wang 64300c10c22SJiawei Wang /* Destination array action resource structure. */ 64400c10c22SJiawei Wang struct mlx5_flow_dv_dest_array_resource { 645e78e5408SMatan Azrad struct mlx5_list_entry entry; /**< Cache entry. */ 64619784141SSuanming Mou uint32_t idx; /** Destination array action object index. */ 64700c10c22SJiawei Wang uint8_t ft_type; /** Flow Table Type */ 64800c10c22SJiawei Wang uint8_t num_of_dest; /**< Number of destination actions. */ 64901c05ee0SSuanming Mou struct rte_eth_dev *dev; /**< Device registers the action. */ 65000c10c22SJiawei Wang void *action; /**< Pointer to the rdma core action. */ 65100c10c22SJiawei Wang struct mlx5_flow_sub_actions_idx sample_idx[MLX5_MAX_DEST_NUM]; 65200c10c22SJiawei Wang /**< Action index resources. */ 65300c10c22SJiawei Wang struct mlx5_flow_sub_actions_list sample_act[MLX5_MAX_DEST_NUM]; 65400c10c22SJiawei Wang /**< Action resources. */ 65500c10c22SJiawei Wang }; 65600c10c22SJiawei Wang 657750ff30aSGregory Etelson /* PMD flow priority for tunnel */ 658750ff30aSGregory Etelson #define MLX5_TUNNEL_PRIO_GET(rss_desc) \ 659750ff30aSGregory Etelson ((rss_desc)->level >= 2 ? MLX5_PRIORITY_MAP_L2 : MLX5_PRIORITY_MAP_L4) 660750ff30aSGregory Etelson 661e745f900SSuanming Mou 662c42f44bdSBing Zhao /** Device flow handle structure for DV mode only. */ 663c42f44bdSBing Zhao struct mlx5_flow_handle_dv { 664c42f44bdSBing Zhao /* Flow DV api: */ 665c42f44bdSBing Zhao struct mlx5_flow_dv_matcher *matcher; /**< Cache to matcher. */ 666c42f44bdSBing Zhao struct mlx5_flow_dv_modify_hdr_resource *modify_hdr; 667c42f44bdSBing Zhao /**< Pointer to modify header resource in cache. */ 66877749adaSSuanming Mou uint32_t rix_encap_decap; 66977749adaSSuanming Mou /**< Index to encap/decap resource in cache. */ 67077749adaSSuanming Mou uint32_t rix_push_vlan; 6718acf8ac9SSuanming Mou /**< Index to push VLAN action resource in cache. */ 67277749adaSSuanming Mou uint32_t rix_tag; 6735f114269SSuanming Mou /**< Index to the tag action. */ 674b4c0ddbfSJiawei Wang uint32_t rix_sample; 675b4c0ddbfSJiawei Wang /**< Index to sample action resource in cache. */ 67600c10c22SJiawei Wang uint32_t rix_dest_array; 67700c10c22SJiawei Wang /**< Index to destination array resource in cache. */ 67877749adaSSuanming Mou } __rte_packed; 679c42f44bdSBing Zhao 680c42f44bdSBing Zhao /** Device flow handle structure: used both for creating & destroying. */ 681c42f44bdSBing Zhao struct mlx5_flow_handle { 682b88341caSSuanming Mou SILIST_ENTRY(uint32_t)next; 68377749adaSSuanming Mou struct mlx5_vf_vlan vf_vlan; /**< Structure for VF VLAN workaround. */ 684b88341caSSuanming Mou /**< Index to next device flow handle. */ 6850ddd1143SYongseok Koh uint64_t layers; 68624663641SYongseok Koh /**< Bit-fields of present layers, see MLX5_FLOW_LAYER_*. */ 687341c8941SDekel Peled void *drv_flow; /**< pointer to driver flow object. */ 68883306d6cSShun Hao uint32_t split_flow_id:27; /**< Sub flow unique match flow id. */ 68983306d6cSShun Hao uint32_t is_meter_flow_id:1; /**< Indate if flow_id is for meter. */ 690488d13abSSuanming Mou uint32_t mark:1; /**< Metadate rxq mark flag. */ 691488d13abSSuanming Mou uint32_t fate_action:3; /**< Fate action type. */ 6926fc18392SSuanming Mou union { 69377749adaSSuanming Mou uint32_t rix_hrxq; /**< Hash Rx queue object index. */ 69477749adaSSuanming Mou uint32_t rix_jump; /**< Index to the jump action resource. */ 69577749adaSSuanming Mou uint32_t rix_port_id_action; 6966fc18392SSuanming Mou /**< Index to port ID action resource. */ 69777749adaSSuanming Mou uint32_t rix_fate; 698488d13abSSuanming Mou /**< Generic value indicates the fate action. */ 6993c78124fSShiri Kuzin uint32_t rix_default_fate; 7003c78124fSShiri Kuzin /**< Indicates default miss fate action. */ 701fabf8a37SSuanming Mou uint32_t rix_srss; 702fabf8a37SSuanming Mou /**< Indicates shared RSS fate action. */ 7036fc18392SSuanming Mou }; 704f1ae0b35SOphir Munk #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H) 705c42f44bdSBing Zhao struct mlx5_flow_handle_dv dvh; 706c42f44bdSBing Zhao #endif 70777749adaSSuanming Mou } __rte_packed; 708c42f44bdSBing Zhao 709c42f44bdSBing Zhao /* 710e7bfa359SBing Zhao * Size for Verbs device flow handle structure only. Do not use the DV only 711e7bfa359SBing Zhao * structure in Verbs. No DV flows attributes will be accessed. 712e7bfa359SBing Zhao * Macro offsetof() could also be used here. 713e7bfa359SBing Zhao */ 714f1ae0b35SOphir Munk #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H) 715e7bfa359SBing Zhao #define MLX5_FLOW_HANDLE_VERBS_SIZE \ 716e7bfa359SBing Zhao (sizeof(struct mlx5_flow_handle) - sizeof(struct mlx5_flow_handle_dv)) 717e7bfa359SBing Zhao #else 718e7bfa359SBing Zhao #define MLX5_FLOW_HANDLE_VERBS_SIZE (sizeof(struct mlx5_flow_handle)) 719e7bfa359SBing Zhao #endif 720e7bfa359SBing Zhao 721c42f44bdSBing Zhao /** Device flow structure only for DV flow creation. */ 722e7bfa359SBing Zhao struct mlx5_flow_dv_workspace { 723c42f44bdSBing Zhao uint32_t group; /**< The group index. */ 7242d2cef5dSLi Zhang uint32_t table_id; /**< Flow table identifier. */ 725c42f44bdSBing Zhao uint8_t transfer; /**< 1 if the flow is E-Switch flow. */ 726c42f44bdSBing Zhao int actions_n; /**< number of actions. */ 727c42f44bdSBing Zhao void *actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS]; /**< Action list. */ 728014d1cbeSSuanming Mou struct mlx5_flow_dv_encap_decap_resource *encap_decap; 729014d1cbeSSuanming Mou /**< Pointer to encap/decap resource in cache. */ 7308acf8ac9SSuanming Mou struct mlx5_flow_dv_push_vlan_action_resource *push_vlan_res; 7318acf8ac9SSuanming Mou /**< Pointer to push VLAN action resource in cache. */ 7325f114269SSuanming Mou struct mlx5_flow_dv_tag_resource *tag_resource; 7337ac99475SSuanming Mou /**< pointer to the tag action. */ 734f3faf9eaSSuanming Mou struct mlx5_flow_dv_port_id_action_resource *port_id_action; 735f3faf9eaSSuanming Mou /**< Pointer to port ID action resource. */ 7367ac99475SSuanming Mou struct mlx5_flow_dv_jump_tbl_resource *jump; 7377ac99475SSuanming Mou /**< Pointer to the jump action resource. */ 738c42f44bdSBing Zhao struct mlx5_flow_dv_match_params value; 739c42f44bdSBing Zhao /**< Holds the value that the packet is compared to. */ 740b4c0ddbfSJiawei Wang struct mlx5_flow_dv_sample_resource *sample_res; 741b4c0ddbfSJiawei Wang /**< Pointer to the sample action resource. */ 74200c10c22SJiawei Wang struct mlx5_flow_dv_dest_array_resource *dest_array_res; 74300c10c22SJiawei Wang /**< Pointer to the destination array resource. */ 744c42f44bdSBing Zhao }; 745c42f44bdSBing Zhao 746f1ae0b35SOphir Munk #ifdef HAVE_INFINIBAND_VERBS_H 747e7bfa359SBing Zhao /* 748e7bfa359SBing Zhao * Maximal Verbs flow specifications & actions size. 749e7bfa359SBing Zhao * Some elements are mutually exclusive, but enough space should be allocated. 750e7bfa359SBing Zhao * Tunnel cases: 1. Max 2 Ethernet + IP(v6 len > v4 len) + TCP/UDP headers. 751e7bfa359SBing Zhao * 2. One tunnel header (exception: GRE + MPLS), 752e7bfa359SBing Zhao * SPEC length: GRE == tunnel. 753e7bfa359SBing Zhao * Actions: 1. 1 Mark OR Flag. 754e7bfa359SBing Zhao * 2. 1 Drop (if any). 755e7bfa359SBing Zhao * 3. No limitation for counters, but it makes no sense to support too 756e7bfa359SBing Zhao * many counters in a single device flow. 757e7bfa359SBing Zhao */ 758e7bfa359SBing Zhao #ifdef HAVE_IBV_DEVICE_MPLS_SUPPORT 759e7bfa359SBing Zhao #define MLX5_VERBS_MAX_SPEC_SIZE \ 760e7bfa359SBing Zhao ( \ 761e7bfa359SBing Zhao (2 * (sizeof(struct ibv_flow_spec_eth) + \ 762e7bfa359SBing Zhao sizeof(struct ibv_flow_spec_ipv6) + \ 763e7bfa359SBing Zhao sizeof(struct ibv_flow_spec_tcp_udp)) + \ 764e7bfa359SBing Zhao sizeof(struct ibv_flow_spec_gre) + \ 765e7bfa359SBing Zhao sizeof(struct ibv_flow_spec_mpls)) \ 766e7bfa359SBing Zhao ) 767e7bfa359SBing Zhao #else 768e7bfa359SBing Zhao #define MLX5_VERBS_MAX_SPEC_SIZE \ 769e7bfa359SBing Zhao ( \ 770e7bfa359SBing Zhao (2 * (sizeof(struct ibv_flow_spec_eth) + \ 771e7bfa359SBing Zhao sizeof(struct ibv_flow_spec_ipv6) + \ 772e7bfa359SBing Zhao sizeof(struct ibv_flow_spec_tcp_udp)) + \ 773e7bfa359SBing Zhao sizeof(struct ibv_flow_spec_tunnel)) \ 774e7bfa359SBing Zhao ) 775e7bfa359SBing Zhao #endif 776e7bfa359SBing Zhao 777e7bfa359SBing Zhao #if defined(HAVE_IBV_DEVICE_COUNTERS_SET_V42) || \ 778e7bfa359SBing Zhao defined(HAVE_IBV_DEVICE_COUNTERS_SET_V45) 779e7bfa359SBing Zhao #define MLX5_VERBS_MAX_ACT_SIZE \ 780e7bfa359SBing Zhao ( \ 781e7bfa359SBing Zhao sizeof(struct ibv_flow_spec_action_tag) + \ 782e7bfa359SBing Zhao sizeof(struct ibv_flow_spec_action_drop) + \ 783e7bfa359SBing Zhao sizeof(struct ibv_flow_spec_counter_action) * 4 \ 784e7bfa359SBing Zhao ) 785e7bfa359SBing Zhao #else 786e7bfa359SBing Zhao #define MLX5_VERBS_MAX_ACT_SIZE \ 787e7bfa359SBing Zhao ( \ 788e7bfa359SBing Zhao sizeof(struct ibv_flow_spec_action_tag) + \ 789e7bfa359SBing Zhao sizeof(struct ibv_flow_spec_action_drop) \ 790e7bfa359SBing Zhao ) 791e7bfa359SBing Zhao #endif 792e7bfa359SBing Zhao 793e7bfa359SBing Zhao #define MLX5_VERBS_MAX_SPEC_ACT_SIZE \ 794e7bfa359SBing Zhao (MLX5_VERBS_MAX_SPEC_SIZE + MLX5_VERBS_MAX_ACT_SIZE) 795e7bfa359SBing Zhao 796c42f44bdSBing Zhao /** Device flow structure only for Verbs flow creation. */ 797e7bfa359SBing Zhao struct mlx5_flow_verbs_workspace { 798c42f44bdSBing Zhao unsigned int size; /**< Size of the attribute. */ 799e7bfa359SBing Zhao struct ibv_flow_attr attr; /**< Verbs flow attribute buffer. */ 800e7bfa359SBing Zhao uint8_t specs[MLX5_VERBS_MAX_SPEC_ACT_SIZE]; 801e7bfa359SBing Zhao /**< Specifications & actions buffer of verbs flow. */ 802c42f44bdSBing Zhao }; 803f1ae0b35SOphir Munk #endif /* HAVE_INFINIBAND_VERBS_H */ 804c42f44bdSBing Zhao 805ae2927cdSJiawei Wang #define MLX5_SCALE_FLOW_GROUP_BIT 0 806ae2927cdSJiawei Wang #define MLX5_SCALE_JUMP_FLOW_GROUP_BIT 1 807ae2927cdSJiawei Wang 808e7bfa359SBing Zhao /** Maximal number of device sub-flows supported. */ 809e7bfa359SBing Zhao #define MLX5_NUM_MAX_DEV_FLOWS 32 810e7bfa359SBing Zhao 8118c5a231bSGregory Etelson /** 8128c5a231bSGregory Etelson * tunnel offload rules type 8138c5a231bSGregory Etelson */ 8148c5a231bSGregory Etelson enum mlx5_tof_rule_type { 8158c5a231bSGregory Etelson MLX5_TUNNEL_OFFLOAD_NONE = 0, 8168c5a231bSGregory Etelson MLX5_TUNNEL_OFFLOAD_SET_RULE, 8178c5a231bSGregory Etelson MLX5_TUNNEL_OFFLOAD_MATCH_RULE, 8188c5a231bSGregory Etelson MLX5_TUNNEL_OFFLOAD_MISS_RULE, 8198c5a231bSGregory Etelson }; 8208c5a231bSGregory Etelson 821c42f44bdSBing Zhao /** Device flow structure. */ 8229ade91dfSJiawei Wang __extension__ 823c42f44bdSBing Zhao struct mlx5_flow { 824c42f44bdSBing Zhao struct rte_flow *flow; /**< Pointer to the main flow. */ 825fa2d01c8SDong Zhou uint32_t flow_idx; /**< The memory pool index to the main flow. */ 8266ad7cfaaSDekel Peled uint64_t hash_fields; /**< Hash Rx queue hash fields. */ 827488d13abSSuanming Mou uint64_t act_flags; 828488d13abSSuanming Mou /**< Bit-fields of detected actions, see MLX5_FLOW_ACTION_*. */ 829b67b4ecbSDekel Peled bool external; /**< true if the flow is created external to PMD. */ 8309ade91dfSJiawei Wang uint8_t ingress:1; /**< 1 if the flow is ingress. */ 831ae2927cdSJiawei Wang uint8_t skip_scale:2; 832ae2927cdSJiawei Wang /** 833ae2927cdSJiawei Wang * Each Bit be set to 1 if Skip the scale the flow group with factor. 834ae2927cdSJiawei Wang * If bit0 be set to 1, then skip the scale the original flow group; 835ae2927cdSJiawei Wang * If bit1 be set to 1, then skip the scale the jump flow group if 836ae2927cdSJiawei Wang * having jump action. 837ae2927cdSJiawei Wang * 00: Enable scale in a flow, default value. 838ae2927cdSJiawei Wang * 01: Skip scale the flow group with factor, enable scale the group 839ae2927cdSJiawei Wang * of jump action. 840ae2927cdSJiawei Wang * 10: Enable scale the group with factor, skip scale the group of 841ae2927cdSJiawei Wang * jump action. 842ae2927cdSJiawei Wang * 11: Skip scale the table with factor both for flow group and jump 843ae2927cdSJiawei Wang * group. 844ae2927cdSJiawei Wang */ 845c42f44bdSBing Zhao union { 846f1ae0b35SOphir Munk #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H) 847e7bfa359SBing Zhao struct mlx5_flow_dv_workspace dv; 848c42f44bdSBing Zhao #endif 849f1ae0b35SOphir Munk #ifdef HAVE_INFINIBAND_VERBS_H 850e7bfa359SBing Zhao struct mlx5_flow_verbs_workspace verbs; 851f1ae0b35SOphir Munk #endif 852c42f44bdSBing Zhao }; 853e7bfa359SBing Zhao struct mlx5_flow_handle *handle; 854b88341caSSuanming Mou uint32_t handle_idx; /* Index of the mlx5 flow handle memory. */ 8554ec6360dSGregory Etelson const struct mlx5_flow_tunnel *tunnel; 8568c5a231bSGregory Etelson enum mlx5_tof_rule_type tof_type; 85784c406e7SOri Kam }; 85884c406e7SOri Kam 85933e01809SSuanming Mou /* Flow meter state. */ 86033e01809SSuanming Mou #define MLX5_FLOW_METER_DISABLE 0 86133e01809SSuanming Mou #define MLX5_FLOW_METER_ENABLE 1 86233e01809SSuanming Mou 86329efa63aSLi Zhang #define MLX5_ASO_WQE_CQE_RESPONSE_DELAY 10u 86429efa63aSLi Zhang #define MLX5_MTR_POLL_WQE_CQE_TIMES 100000u 865e6100c7bSLi Zhang 866ebaf1b31SBing Zhao #define MLX5_CT_POLL_WQE_CQE_TIMES MLX5_MTR_POLL_WQE_CQE_TIMES 867ebaf1b31SBing Zhao 8683bd26b23SSuanming Mou #define MLX5_MAN_WIDTH 8 869e6100c7bSLi Zhang /* Legacy Meter parameter structure. */ 870e6100c7bSLi Zhang struct mlx5_legacy_flow_meter { 871e6100c7bSLi Zhang struct mlx5_flow_meter_info fm; 872e6100c7bSLi Zhang /* Must be the first in struct. */ 873e6100c7bSLi Zhang TAILQ_ENTRY(mlx5_legacy_flow_meter) next; 8743f373f35SSuanming Mou /**< Pointer to the next flow meter structure. */ 87544432018SLi Zhang uint32_t idx; 87644432018SLi Zhang /* Index to meter object. */ 8773bd26b23SSuanming Mou }; 8783bd26b23SSuanming Mou 8794ec6360dSGregory Etelson #define MLX5_MAX_TUNNELS 256 8804ec6360dSGregory Etelson #define MLX5_TNL_MISS_RULE_PRIORITY 3 8814ec6360dSGregory Etelson #define MLX5_TNL_MISS_FDB_JUMP_GRP 0x1234faac 8824ec6360dSGregory Etelson 8834ec6360dSGregory Etelson /* 8844ec6360dSGregory Etelson * When tunnel offload is active, all JUMP group ids are converted 8854ec6360dSGregory Etelson * using the same method. That conversion is applied both to tunnel and 8864ec6360dSGregory Etelson * regular rule types. 8874ec6360dSGregory Etelson * Group ids used in tunnel rules are relative to it's tunnel (!). 8884ec6360dSGregory Etelson * Application can create number of steer rules, using the same 8894ec6360dSGregory Etelson * tunnel, with different group id in each rule. 8904ec6360dSGregory Etelson * Each tunnel stores its groups internally in PMD tunnel object. 8914ec6360dSGregory Etelson * Groups used in regular rules do not belong to any tunnel and are stored 8924ec6360dSGregory Etelson * in tunnel hub. 8934ec6360dSGregory Etelson */ 8944ec6360dSGregory Etelson 8954ec6360dSGregory Etelson struct mlx5_flow_tunnel { 8964ec6360dSGregory Etelson LIST_ENTRY(mlx5_flow_tunnel) chain; 8974ec6360dSGregory Etelson struct rte_flow_tunnel app_tunnel; /** app tunnel copy */ 8984ec6360dSGregory Etelson uint32_t tunnel_id; /** unique tunnel ID */ 8994ec6360dSGregory Etelson uint32_t refctn; 9004ec6360dSGregory Etelson struct rte_flow_action action; 9014ec6360dSGregory Etelson struct rte_flow_item item; 9024ec6360dSGregory Etelson struct mlx5_hlist *groups; /** tunnel groups */ 9034ec6360dSGregory Etelson }; 9044ec6360dSGregory Etelson 9054ec6360dSGregory Etelson /** PMD tunnel related context */ 9064ec6360dSGregory Etelson struct mlx5_flow_tunnel_hub { 907868d2e34SGregory Etelson /* Tunnels list 908868d2e34SGregory Etelson * Access to the list MUST be MT protected 909868d2e34SGregory Etelson */ 9104ec6360dSGregory Etelson LIST_HEAD(, mlx5_flow_tunnel) tunnels; 911868d2e34SGregory Etelson /* protect access to the tunnels list */ 912868d2e34SGregory Etelson rte_spinlock_t sl; 9134ec6360dSGregory Etelson struct mlx5_hlist *groups; /** non tunnel groups */ 9144ec6360dSGregory Etelson }; 9154ec6360dSGregory Etelson 9164ec6360dSGregory Etelson /* convert jump group to flow table ID in tunnel rules */ 9174ec6360dSGregory Etelson struct tunnel_tbl_entry { 918961b6774SMatan Azrad struct mlx5_list_entry hash; 9194ec6360dSGregory Etelson uint32_t flow_table; 920f5b0aed2SSuanming Mou uint32_t tunnel_id; 921f5b0aed2SSuanming Mou uint32_t group; 9224ec6360dSGregory Etelson }; 9234ec6360dSGregory Etelson 9244ec6360dSGregory Etelson static inline uint32_t 9254ec6360dSGregory Etelson tunnel_id_to_flow_tbl(uint32_t id) 9264ec6360dSGregory Etelson { 9274ec6360dSGregory Etelson return id | (1u << 16); 9284ec6360dSGregory Etelson } 9294ec6360dSGregory Etelson 9304ec6360dSGregory Etelson static inline uint32_t 9314ec6360dSGregory Etelson tunnel_flow_tbl_to_id(uint32_t flow_tbl) 9324ec6360dSGregory Etelson { 9334ec6360dSGregory Etelson return flow_tbl & ~(1u << 16); 9344ec6360dSGregory Etelson } 9354ec6360dSGregory Etelson 9364ec6360dSGregory Etelson union tunnel_tbl_key { 9374ec6360dSGregory Etelson uint64_t val; 9384ec6360dSGregory Etelson struct { 9394ec6360dSGregory Etelson uint32_t tunnel_id; 9404ec6360dSGregory Etelson uint32_t group; 9414ec6360dSGregory Etelson }; 9424ec6360dSGregory Etelson }; 9434ec6360dSGregory Etelson 9444ec6360dSGregory Etelson static inline struct mlx5_flow_tunnel_hub * 9454ec6360dSGregory Etelson mlx5_tunnel_hub(struct rte_eth_dev *dev) 9464ec6360dSGregory Etelson { 9474ec6360dSGregory Etelson struct mlx5_priv *priv = dev->data->dev_private; 9484ec6360dSGregory Etelson return priv->sh->tunnel_hub; 9494ec6360dSGregory Etelson } 9504ec6360dSGregory Etelson 9514ec6360dSGregory Etelson static inline bool 9528c5a231bSGregory Etelson is_tunnel_offload_active(const struct rte_eth_dev *dev) 9534ec6360dSGregory Etelson { 954bc1d90a3SGregory Etelson #ifdef HAVE_IBV_FLOW_DV_SUPPORT 9558c5a231bSGregory Etelson const struct mlx5_priv *priv = dev->data->dev_private; 9564ec6360dSGregory Etelson return !!priv->config.dv_miss_info; 957bc1d90a3SGregory Etelson #else 958bc1d90a3SGregory Etelson RTE_SET_USED(dev); 959bc1d90a3SGregory Etelson return false; 960bc1d90a3SGregory Etelson #endif 9614ec6360dSGregory Etelson } 9624ec6360dSGregory Etelson 9634ec6360dSGregory Etelson static inline bool 9648c5a231bSGregory Etelson is_flow_tunnel_match_rule(enum mlx5_tof_rule_type tof_rule_type) 9654ec6360dSGregory Etelson { 9668c5a231bSGregory Etelson return tof_rule_type == MLX5_TUNNEL_OFFLOAD_MATCH_RULE; 9674ec6360dSGregory Etelson } 9684ec6360dSGregory Etelson 9694ec6360dSGregory Etelson static inline bool 9708c5a231bSGregory Etelson is_flow_tunnel_steer_rule(enum mlx5_tof_rule_type tof_rule_type) 9714ec6360dSGregory Etelson { 9728c5a231bSGregory Etelson return tof_rule_type == MLX5_TUNNEL_OFFLOAD_SET_RULE; 9734ec6360dSGregory Etelson } 9744ec6360dSGregory Etelson 9754ec6360dSGregory Etelson static inline const struct mlx5_flow_tunnel * 9764ec6360dSGregory Etelson flow_actions_to_tunnel(const struct rte_flow_action actions[]) 9774ec6360dSGregory Etelson { 9784ec6360dSGregory Etelson return actions[0].conf; 9794ec6360dSGregory Etelson } 9804ec6360dSGregory Etelson 9814ec6360dSGregory Etelson static inline const struct mlx5_flow_tunnel * 9824ec6360dSGregory Etelson flow_items_to_tunnel(const struct rte_flow_item items[]) 9834ec6360dSGregory Etelson { 9844ec6360dSGregory Etelson return items[0].spec; 9854ec6360dSGregory Etelson } 9864ec6360dSGregory Etelson 98784c406e7SOri Kam /* Flow structure. */ 98884c406e7SOri Kam struct rte_flow { 989b88341caSSuanming Mou uint32_t dev_handles; 990e7bfa359SBing Zhao /**< Device flow handles that are part of the flow. */ 991b4edeaf3SSuanming Mou uint32_t type:2; 9920136df99SSuanming Mou uint32_t drv_type:2; /**< Driver type. */ 9934ec6360dSGregory Etelson uint32_t tunnel:1; 994e6100c7bSLi Zhang uint32_t meter:24; /**< Holds flow meter id. */ 9952d084f69SBing Zhao uint32_t indirect_type:2; /**< Indirect action type. */ 9960136df99SSuanming Mou uint32_t rix_mreg_copy; 9970136df99SSuanming Mou /**< Index to metadata register copy table resource. */ 9980136df99SSuanming Mou uint32_t counter; /**< Holds flow counter. */ 9994ec6360dSGregory Etelson uint32_t tunnel_id; /**< Tunnel id */ 10002d084f69SBing Zhao union { 1001f935ed4bSDekel Peled uint32_t age; /**< Holds ASO age bit index. */ 10022d084f69SBing Zhao uint32_t ct; /**< Holds ASO CT index. */ 10032d084f69SBing Zhao }; 1004f15f0c38SShiri Kuzin uint32_t geneve_tlv_option; /**< Holds Geneve TLV option id. > */ 10050136df99SSuanming Mou } __rte_packed; 10062720f833SYongseok Koh 1007d7cfcdddSAndrey Vesnovaty /* 1008d7cfcdddSAndrey Vesnovaty * Define list of valid combinations of RX Hash fields 1009d7cfcdddSAndrey Vesnovaty * (see enum ibv_rx_hash_fields). 1010d7cfcdddSAndrey Vesnovaty */ 1011d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV4 (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4) 1012d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV4_TCP \ 1013d7cfcdddSAndrey Vesnovaty (MLX5_RSS_HASH_IPV4 | \ 1014c83456cdSDekel Peled IBV_RX_HASH_SRC_PORT_TCP | IBV_RX_HASH_DST_PORT_TCP) 1015d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV4_UDP \ 1016d7cfcdddSAndrey Vesnovaty (MLX5_RSS_HASH_IPV4 | \ 1017c83456cdSDekel Peled IBV_RX_HASH_SRC_PORT_UDP | IBV_RX_HASH_DST_PORT_UDP) 1018d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV6 (IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6) 1019d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV6_TCP \ 1020d7cfcdddSAndrey Vesnovaty (MLX5_RSS_HASH_IPV6 | \ 1021c83456cdSDekel Peled IBV_RX_HASH_SRC_PORT_TCP | IBV_RX_HASH_DST_PORT_TCP) 1022d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV6_UDP \ 1023d7cfcdddSAndrey Vesnovaty (MLX5_RSS_HASH_IPV6 | \ 1024c83456cdSDekel Peled IBV_RX_HASH_SRC_PORT_UDP | IBV_RX_HASH_DST_PORT_UDP) 1025212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_SRC_ONLY IBV_RX_HASH_SRC_IPV4 1026212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_DST_ONLY IBV_RX_HASH_DST_IPV4 1027212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_SRC_ONLY IBV_RX_HASH_SRC_IPV6 1028212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_DST_ONLY IBV_RX_HASH_DST_IPV6 1029212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_UDP_SRC_ONLY \ 1030212d17b6SXiaoyu Min (MLX5_RSS_HASH_IPV4 | IBV_RX_HASH_SRC_PORT_UDP) 1031212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_UDP_DST_ONLY \ 1032212d17b6SXiaoyu Min (MLX5_RSS_HASH_IPV4 | IBV_RX_HASH_DST_PORT_UDP) 1033212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_UDP_SRC_ONLY \ 1034212d17b6SXiaoyu Min (MLX5_RSS_HASH_IPV6 | IBV_RX_HASH_SRC_PORT_UDP) 1035212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_UDP_DST_ONLY \ 1036212d17b6SXiaoyu Min (MLX5_RSS_HASH_IPV6 | IBV_RX_HASH_DST_PORT_UDP) 1037212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_TCP_SRC_ONLY \ 1038212d17b6SXiaoyu Min (MLX5_RSS_HASH_IPV4 | IBV_RX_HASH_SRC_PORT_TCP) 1039212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_TCP_DST_ONLY \ 1040212d17b6SXiaoyu Min (MLX5_RSS_HASH_IPV4 | IBV_RX_HASH_DST_PORT_TCP) 1041212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_TCP_SRC_ONLY \ 1042212d17b6SXiaoyu Min (MLX5_RSS_HASH_IPV6 | IBV_RX_HASH_SRC_PORT_TCP) 1043212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_TCP_DST_ONLY \ 1044212d17b6SXiaoyu Min (MLX5_RSS_HASH_IPV6 | IBV_RX_HASH_DST_PORT_TCP) 1045d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_NONE 0ULL 1046d7cfcdddSAndrey Vesnovaty 104779f89527SGregory Etelson 104879f89527SGregory Etelson /* extract next protocol type from Ethernet & VLAN headers */ 104979f89527SGregory Etelson #define MLX5_ETHER_TYPE_FROM_HEADER(_s, _m, _itm, _prt) do { \ 105079f89527SGregory Etelson (_prt) = ((const struct _s *)(_itm)->mask)->_m; \ 105179f89527SGregory Etelson (_prt) &= ((const struct _s *)(_itm)->spec)->_m; \ 105279f89527SGregory Etelson (_prt) = rte_be_to_cpu_16((_prt)); \ 105379f89527SGregory Etelson } while (0) 105479f89527SGregory Etelson 1055d7cfcdddSAndrey Vesnovaty /* array of valid combinations of RX Hash fields for RSS */ 1056d7cfcdddSAndrey Vesnovaty static const uint64_t mlx5_rss_hash_fields[] = { 1057d7cfcdddSAndrey Vesnovaty MLX5_RSS_HASH_IPV4, 1058d7cfcdddSAndrey Vesnovaty MLX5_RSS_HASH_IPV4_TCP, 1059d7cfcdddSAndrey Vesnovaty MLX5_RSS_HASH_IPV4_UDP, 1060d7cfcdddSAndrey Vesnovaty MLX5_RSS_HASH_IPV6, 1061d7cfcdddSAndrey Vesnovaty MLX5_RSS_HASH_IPV6_TCP, 1062d7cfcdddSAndrey Vesnovaty MLX5_RSS_HASH_IPV6_UDP, 1063d7cfcdddSAndrey Vesnovaty MLX5_RSS_HASH_NONE, 1064d7cfcdddSAndrey Vesnovaty }; 1065d7cfcdddSAndrey Vesnovaty 1066d7cfcdddSAndrey Vesnovaty /* Shared RSS action structure */ 1067d7cfcdddSAndrey Vesnovaty struct mlx5_shared_action_rss { 10684a42ac1fSMatan Azrad ILIST_ENTRY(uint32_t)next; /**< Index to the next RSS structure. */ 10694a42ac1fSMatan Azrad uint32_t refcnt; /**< Atomically accessed refcnt. */ 1070d7cfcdddSAndrey Vesnovaty struct rte_flow_action_rss origin; /**< Original rte RSS action. */ 1071d7cfcdddSAndrey Vesnovaty uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */ 1072fa7ad49eSAndrey Vesnovaty struct mlx5_ind_table_obj *ind_tbl; 1073fa7ad49eSAndrey Vesnovaty /**< Hash RX queues (hrxq, hrxq_tunnel fields) indirection table. */ 1074d7cfcdddSAndrey Vesnovaty uint32_t hrxq[MLX5_RSS_HASH_FIELDS_LEN]; 1075d7cfcdddSAndrey Vesnovaty /**< Hash RX queue indexes mapped to mlx5_rss_hash_fields */ 1076fa7ad49eSAndrey Vesnovaty rte_spinlock_t action_rss_sl; /**< Shared RSS action spinlock. */ 1077d7cfcdddSAndrey Vesnovaty }; 1078d7cfcdddSAndrey Vesnovaty 10794b61b877SBing Zhao struct rte_flow_action_handle { 10804a42ac1fSMatan Azrad uint32_t id; 1081d7cfcdddSAndrey Vesnovaty }; 1082d7cfcdddSAndrey Vesnovaty 10838bb81f26SXueming Li /* Thread specific flow workspace intermediate data. */ 10848bb81f26SXueming Li struct mlx5_flow_workspace { 10850064bf43SXueming Li /* If creating another flow in same thread, push new as stack. */ 10860064bf43SXueming Li struct mlx5_flow_workspace *prev; 10870064bf43SXueming Li struct mlx5_flow_workspace *next; 10880064bf43SXueming Li uint32_t inuse; /* can't create new flow with current. */ 10898bb81f26SXueming Li struct mlx5_flow flows[MLX5_NUM_MAX_DEV_FLOWS]; 10900064bf43SXueming Li struct mlx5_flow_rss_desc rss_desc; 10910064bf43SXueming Li uint32_t rssq_num; /* Allocated queue num in rss_desc. */ 109238c6dc20SXueming Li uint32_t flow_idx; /* Intermediate device flow index. */ 1093e6100c7bSLi Zhang struct mlx5_flow_meter_info *fm; /* Pointer to the meter in flow. */ 109450cc92ddSShun Hao struct mlx5_flow_meter_policy *policy; 109550cc92ddSShun Hao /* The meter policy used by meter in flow. */ 109650cc92ddSShun Hao struct mlx5_flow_meter_policy *final_policy; 109750cc92ddSShun Hao /* The final policy when meter policy is hierarchy. */ 109851ec04dcSShun Hao uint32_t skip_matcher_reg:1; 109951ec04dcSShun Hao /* Indicates if need to skip matcher register in translate. */ 11008bb81f26SXueming Li }; 11018bb81f26SXueming Li 11029ade91dfSJiawei Wang struct mlx5_flow_split_info { 11039ade91dfSJiawei Wang bool external; 11049ade91dfSJiawei Wang /**< True if flow is created by request external to PMD. */ 11059ade91dfSJiawei Wang uint8_t skip_scale; /**< Skip the scale the table with factor. */ 11069ade91dfSJiawei Wang uint32_t flow_idx; /**< This memory pool index to the flow. */ 11079ade91dfSJiawei Wang uint32_t prefix_mark; /**< Prefix subflow mark flag. */ 11089ade91dfSJiawei Wang uint64_t prefix_layers; /**< Prefix subflow layers. */ 11092d2cef5dSLi Zhang uint32_t table_id; /**< Flow table identifier. */ 11109ade91dfSJiawei Wang }; 11119ade91dfSJiawei Wang 111284c406e7SOri Kam typedef int (*mlx5_flow_validate_t)(struct rte_eth_dev *dev, 111384c406e7SOri Kam const struct rte_flow_attr *attr, 111484c406e7SOri Kam const struct rte_flow_item items[], 111584c406e7SOri Kam const struct rte_flow_action actions[], 1116b67b4ecbSDekel Peled bool external, 111772a944dbSBing Zhao int hairpin, 111884c406e7SOri Kam struct rte_flow_error *error); 111984c406e7SOri Kam typedef struct mlx5_flow *(*mlx5_flow_prepare_t) 1120e7bfa359SBing Zhao (struct rte_eth_dev *dev, const struct rte_flow_attr *attr, 1121e7bfa359SBing Zhao const struct rte_flow_item items[], 1122c1cfb132SYongseok Koh const struct rte_flow_action actions[], struct rte_flow_error *error); 112384c406e7SOri Kam typedef int (*mlx5_flow_translate_t)(struct rte_eth_dev *dev, 112484c406e7SOri Kam struct mlx5_flow *dev_flow, 112584c406e7SOri Kam const struct rte_flow_attr *attr, 112684c406e7SOri Kam const struct rte_flow_item items[], 112784c406e7SOri Kam const struct rte_flow_action actions[], 112884c406e7SOri Kam struct rte_flow_error *error); 112984c406e7SOri Kam typedef int (*mlx5_flow_apply_t)(struct rte_eth_dev *dev, struct rte_flow *flow, 113084c406e7SOri Kam struct rte_flow_error *error); 113184c406e7SOri Kam typedef void (*mlx5_flow_remove_t)(struct rte_eth_dev *dev, 113284c406e7SOri Kam struct rte_flow *flow); 113384c406e7SOri Kam typedef void (*mlx5_flow_destroy_t)(struct rte_eth_dev *dev, 113484c406e7SOri Kam struct rte_flow *flow); 1135684dafe7SMoti Haimovsky typedef int (*mlx5_flow_query_t)(struct rte_eth_dev *dev, 1136684dafe7SMoti Haimovsky struct rte_flow *flow, 1137684dafe7SMoti Haimovsky const struct rte_flow_action *actions, 1138684dafe7SMoti Haimovsky void *data, 1139684dafe7SMoti Haimovsky struct rte_flow_error *error); 114044432018SLi Zhang typedef int (*mlx5_flow_create_mtr_tbls_t)(struct rte_eth_dev *dev, 114144432018SLi Zhang struct mlx5_flow_meter_info *fm, 114244432018SLi Zhang uint32_t mtr_idx, 114344432018SLi Zhang uint8_t domain_bitmap); 114444432018SLi Zhang typedef void (*mlx5_flow_destroy_mtr_tbls_t)(struct rte_eth_dev *dev, 114544432018SLi Zhang struct mlx5_flow_meter_info *fm); 1146afb4aa4fSLi Zhang typedef void (*mlx5_flow_destroy_mtr_drop_tbls_t)(struct rte_eth_dev *dev); 1147fc6ce56bSLi Zhang typedef struct mlx5_flow_meter_sub_policy * 1148fc6ce56bSLi Zhang (*mlx5_flow_meter_sub_policy_rss_prepare_t) 1149fc6ce56bSLi Zhang (struct rte_eth_dev *dev, 1150fc6ce56bSLi Zhang struct mlx5_flow_meter_policy *mtr_policy, 1151fc6ce56bSLi Zhang struct mlx5_flow_rss_desc *rss_desc[MLX5_MTR_RTE_COLORS]); 11528e5c9feaSShun Hao typedef int (*mlx5_flow_meter_hierarchy_rule_create_t) 11538e5c9feaSShun Hao (struct rte_eth_dev *dev, 11548e5c9feaSShun Hao struct mlx5_flow_meter_info *fm, 11558e5c9feaSShun Hao int32_t src_port, 11568e5c9feaSShun Hao const struct rte_flow_item *item, 11578e5c9feaSShun Hao struct rte_flow_error *error); 1158ec962badSLi Zhang typedef void (*mlx5_flow_destroy_sub_policy_with_rxq_t) 1159ec962badSLi Zhang (struct rte_eth_dev *dev, 1160ec962badSLi Zhang struct mlx5_flow_meter_policy *mtr_policy); 1161e6100c7bSLi Zhang typedef uint32_t (*mlx5_flow_mtr_alloc_t) 1162e6100c7bSLi Zhang (struct rte_eth_dev *dev); 1163e6100c7bSLi Zhang typedef void (*mlx5_flow_mtr_free_t)(struct rte_eth_dev *dev, 1164e6100c7bSLi Zhang uint32_t mtr_idx); 1165956d5c74SSuanming Mou typedef uint32_t (*mlx5_flow_counter_alloc_t) 1166e189f55cSSuanming Mou (struct rte_eth_dev *dev); 1167e189f55cSSuanming Mou typedef void (*mlx5_flow_counter_free_t)(struct rte_eth_dev *dev, 1168956d5c74SSuanming Mou uint32_t cnt); 1169e189f55cSSuanming Mou typedef int (*mlx5_flow_counter_query_t)(struct rte_eth_dev *dev, 1170956d5c74SSuanming Mou uint32_t cnt, 1171e189f55cSSuanming Mou bool clear, uint64_t *pkts, 1172e189f55cSSuanming Mou uint64_t *bytes); 1173fa2d01c8SDong Zhou typedef int (*mlx5_flow_get_aged_flows_t) 1174fa2d01c8SDong Zhou (struct rte_eth_dev *dev, 1175fa2d01c8SDong Zhou void **context, 1176fa2d01c8SDong Zhou uint32_t nb_contexts, 1177fa2d01c8SDong Zhou struct rte_flow_error *error); 1178d7cfcdddSAndrey Vesnovaty typedef int (*mlx5_flow_action_validate_t) 1179d7cfcdddSAndrey Vesnovaty (struct rte_eth_dev *dev, 11804b61b877SBing Zhao const struct rte_flow_indir_action_conf *conf, 1181d7cfcdddSAndrey Vesnovaty const struct rte_flow_action *action, 1182d7cfcdddSAndrey Vesnovaty struct rte_flow_error *error); 11834b61b877SBing Zhao typedef struct rte_flow_action_handle *(*mlx5_flow_action_create_t) 1184d7cfcdddSAndrey Vesnovaty (struct rte_eth_dev *dev, 11854b61b877SBing Zhao const struct rte_flow_indir_action_conf *conf, 1186d7cfcdddSAndrey Vesnovaty const struct rte_flow_action *action, 1187d7cfcdddSAndrey Vesnovaty struct rte_flow_error *error); 1188d7cfcdddSAndrey Vesnovaty typedef int (*mlx5_flow_action_destroy_t) 1189d7cfcdddSAndrey Vesnovaty (struct rte_eth_dev *dev, 11904b61b877SBing Zhao struct rte_flow_action_handle *action, 1191d7cfcdddSAndrey Vesnovaty struct rte_flow_error *error); 1192d7cfcdddSAndrey Vesnovaty typedef int (*mlx5_flow_action_update_t) 1193d7cfcdddSAndrey Vesnovaty (struct rte_eth_dev *dev, 11944b61b877SBing Zhao struct rte_flow_action_handle *action, 11954b61b877SBing Zhao const void *update, 1196d7cfcdddSAndrey Vesnovaty struct rte_flow_error *error); 119781073e1fSMatan Azrad typedef int (*mlx5_flow_action_query_t) 119881073e1fSMatan Azrad (struct rte_eth_dev *dev, 11994b61b877SBing Zhao const struct rte_flow_action_handle *action, 120081073e1fSMatan Azrad void *data, 120181073e1fSMatan Azrad struct rte_flow_error *error); 120223f627e0SBing Zhao typedef int (*mlx5_flow_sync_domain_t) 120323f627e0SBing Zhao (struct rte_eth_dev *dev, 120423f627e0SBing Zhao uint32_t domains, 120523f627e0SBing Zhao uint32_t flags); 1206afb4aa4fSLi Zhang typedef int (*mlx5_flow_validate_mtr_acts_t) 1207afb4aa4fSLi Zhang (struct rte_eth_dev *dev, 1208afb4aa4fSLi Zhang const struct rte_flow_action *actions[RTE_COLORS], 1209afb4aa4fSLi Zhang struct rte_flow_attr *attr, 1210afb4aa4fSLi Zhang bool *is_rss, 1211afb4aa4fSLi Zhang uint8_t *domain_bitmap, 12124b7bf3ffSBing Zhao uint8_t *policy_mode, 1213afb4aa4fSLi Zhang struct rte_mtr_error *error); 1214afb4aa4fSLi Zhang typedef int (*mlx5_flow_create_mtr_acts_t) 1215afb4aa4fSLi Zhang (struct rte_eth_dev *dev, 1216afb4aa4fSLi Zhang struct mlx5_flow_meter_policy *mtr_policy, 1217afb4aa4fSLi Zhang const struct rte_flow_action *actions[RTE_COLORS], 1218afb4aa4fSLi Zhang struct rte_mtr_error *error); 1219afb4aa4fSLi Zhang typedef void (*mlx5_flow_destroy_mtr_acts_t) 1220afb4aa4fSLi Zhang (struct rte_eth_dev *dev, 1221afb4aa4fSLi Zhang struct mlx5_flow_meter_policy *mtr_policy); 1222afb4aa4fSLi Zhang typedef int (*mlx5_flow_create_policy_rules_t) 1223afb4aa4fSLi Zhang (struct rte_eth_dev *dev, 1224afb4aa4fSLi Zhang struct mlx5_flow_meter_policy *mtr_policy); 1225afb4aa4fSLi Zhang typedef void (*mlx5_flow_destroy_policy_rules_t) 1226afb4aa4fSLi Zhang (struct rte_eth_dev *dev, 1227afb4aa4fSLi Zhang struct mlx5_flow_meter_policy *mtr_policy); 1228afb4aa4fSLi Zhang typedef int (*mlx5_flow_create_def_policy_t) 1229afb4aa4fSLi Zhang (struct rte_eth_dev *dev); 1230afb4aa4fSLi Zhang typedef void (*mlx5_flow_destroy_def_policy_t) 1231afb4aa4fSLi Zhang (struct rte_eth_dev *dev); 123281073e1fSMatan Azrad 123384c406e7SOri Kam struct mlx5_flow_driver_ops { 123484c406e7SOri Kam mlx5_flow_validate_t validate; 123584c406e7SOri Kam mlx5_flow_prepare_t prepare; 123684c406e7SOri Kam mlx5_flow_translate_t translate; 123784c406e7SOri Kam mlx5_flow_apply_t apply; 123884c406e7SOri Kam mlx5_flow_remove_t remove; 123984c406e7SOri Kam mlx5_flow_destroy_t destroy; 1240684dafe7SMoti Haimovsky mlx5_flow_query_t query; 124146a5e6bcSSuanming Mou mlx5_flow_create_mtr_tbls_t create_mtr_tbls; 124246a5e6bcSSuanming Mou mlx5_flow_destroy_mtr_tbls_t destroy_mtr_tbls; 1243afb4aa4fSLi Zhang mlx5_flow_destroy_mtr_drop_tbls_t destroy_mtr_drop_tbls; 1244e6100c7bSLi Zhang mlx5_flow_mtr_alloc_t create_meter; 1245e6100c7bSLi Zhang mlx5_flow_mtr_free_t free_meter; 1246afb4aa4fSLi Zhang mlx5_flow_validate_mtr_acts_t validate_mtr_acts; 1247afb4aa4fSLi Zhang mlx5_flow_create_mtr_acts_t create_mtr_acts; 1248afb4aa4fSLi Zhang mlx5_flow_destroy_mtr_acts_t destroy_mtr_acts; 1249afb4aa4fSLi Zhang mlx5_flow_create_policy_rules_t create_policy_rules; 1250afb4aa4fSLi Zhang mlx5_flow_destroy_policy_rules_t destroy_policy_rules; 1251afb4aa4fSLi Zhang mlx5_flow_create_def_policy_t create_def_policy; 1252afb4aa4fSLi Zhang mlx5_flow_destroy_def_policy_t destroy_def_policy; 1253fc6ce56bSLi Zhang mlx5_flow_meter_sub_policy_rss_prepare_t meter_sub_policy_rss_prepare; 12548e5c9feaSShun Hao mlx5_flow_meter_hierarchy_rule_create_t meter_hierarchy_rule_create; 1255ec962badSLi Zhang mlx5_flow_destroy_sub_policy_with_rxq_t destroy_sub_policy_with_rxq; 1256e189f55cSSuanming Mou mlx5_flow_counter_alloc_t counter_alloc; 1257e189f55cSSuanming Mou mlx5_flow_counter_free_t counter_free; 1258e189f55cSSuanming Mou mlx5_flow_counter_query_t counter_query; 1259fa2d01c8SDong Zhou mlx5_flow_get_aged_flows_t get_aged_flows; 1260d7cfcdddSAndrey Vesnovaty mlx5_flow_action_validate_t action_validate; 1261d7cfcdddSAndrey Vesnovaty mlx5_flow_action_create_t action_create; 1262d7cfcdddSAndrey Vesnovaty mlx5_flow_action_destroy_t action_destroy; 1263d7cfcdddSAndrey Vesnovaty mlx5_flow_action_update_t action_update; 126481073e1fSMatan Azrad mlx5_flow_action_query_t action_query; 126523f627e0SBing Zhao mlx5_flow_sync_domain_t sync_domain; 126684c406e7SOri Kam }; 126784c406e7SOri Kam 126884c406e7SOri Kam /* mlx5_flow.c */ 126984c406e7SOri Kam 12708bb81f26SXueming Li struct mlx5_flow_workspace *mlx5_flow_get_thread_workspace(void); 12714ec6360dSGregory Etelson __extension__ 12724ec6360dSGregory Etelson struct flow_grp_info { 12734ec6360dSGregory Etelson uint64_t external:1; 12744ec6360dSGregory Etelson uint64_t transfer:1; 12754ec6360dSGregory Etelson uint64_t fdb_def_rule:1; 12764ec6360dSGregory Etelson /* force standard group translation */ 12774ec6360dSGregory Etelson uint64_t std_tbl_fix:1; 1278ae2927cdSJiawei Wang uint64_t skip_scale:2; 12794ec6360dSGregory Etelson }; 12804ec6360dSGregory Etelson 12814ec6360dSGregory Etelson static inline bool 12824ec6360dSGregory Etelson tunnel_use_standard_attr_group_translate 12838c5a231bSGregory Etelson (const struct rte_eth_dev *dev, 12844ec6360dSGregory Etelson const struct rte_flow_attr *attr, 12858c5a231bSGregory Etelson const struct mlx5_flow_tunnel *tunnel, 12868c5a231bSGregory Etelson enum mlx5_tof_rule_type tof_rule_type) 12874ec6360dSGregory Etelson { 12884ec6360dSGregory Etelson bool verdict; 12894ec6360dSGregory Etelson 12904ec6360dSGregory Etelson if (!is_tunnel_offload_active(dev)) 12914ec6360dSGregory Etelson /* no tunnel offload API */ 12924ec6360dSGregory Etelson verdict = true; 12934ec6360dSGregory Etelson else if (tunnel) { 12944ec6360dSGregory Etelson /* 12954ec6360dSGregory Etelson * OvS will use jump to group 0 in tunnel steer rule. 12964ec6360dSGregory Etelson * If tunnel steer rule starts from group 0 (attr.group == 0) 12974ec6360dSGregory Etelson * that 0 group must be translated with standard method. 12984ec6360dSGregory Etelson * attr.group == 0 in tunnel match rule translated with tunnel 12994ec6360dSGregory Etelson * method 13004ec6360dSGregory Etelson */ 13014ec6360dSGregory Etelson verdict = !attr->group && 13028c5a231bSGregory Etelson is_flow_tunnel_steer_rule(tof_rule_type); 13034ec6360dSGregory Etelson } else { 13044ec6360dSGregory Etelson /* 13054ec6360dSGregory Etelson * non-tunnel group translation uses standard method for 13064ec6360dSGregory Etelson * root group only: attr.group == 0 13074ec6360dSGregory Etelson */ 13084ec6360dSGregory Etelson verdict = !attr->group; 13094ec6360dSGregory Etelson } 13104ec6360dSGregory Etelson 13114ec6360dSGregory Etelson return verdict; 13124ec6360dSGregory Etelson } 13134ec6360dSGregory Etelson 1314e6100c7bSLi Zhang /** 1315e6100c7bSLi Zhang * Get DV flow aso meter by index. 1316e6100c7bSLi Zhang * 1317e6100c7bSLi Zhang * @param[in] dev 1318e6100c7bSLi Zhang * Pointer to the Ethernet device structure. 1319e6100c7bSLi Zhang * @param[in] idx 1320e6100c7bSLi Zhang * mlx5 flow aso meter index in the container. 1321e6100c7bSLi Zhang * @param[out] ppool 1322e6100c7bSLi Zhang * mlx5 flow aso meter pool in the container, 1323e6100c7bSLi Zhang * 1324e6100c7bSLi Zhang * @return 1325e6100c7bSLi Zhang * Pointer to the aso meter, NULL otherwise. 1326e6100c7bSLi Zhang */ 1327e6100c7bSLi Zhang static inline struct mlx5_aso_mtr * 1328e6100c7bSLi Zhang mlx5_aso_meter_by_idx(struct mlx5_priv *priv, uint32_t idx) 1329e6100c7bSLi Zhang { 1330e6100c7bSLi Zhang struct mlx5_aso_mtr_pool *pool; 1331afb4aa4fSLi Zhang struct mlx5_aso_mtr_pools_mng *pools_mng = 1332afb4aa4fSLi Zhang &priv->sh->mtrmng->pools_mng; 1333e6100c7bSLi Zhang 1334e6100c7bSLi Zhang /* Decrease to original index. */ 1335e6100c7bSLi Zhang idx--; 1336afb4aa4fSLi Zhang MLX5_ASSERT(idx / MLX5_ASO_MTRS_PER_POOL < pools_mng->n); 1337afb4aa4fSLi Zhang pool = pools_mng->pools[idx / MLX5_ASO_MTRS_PER_POOL]; 1338e6100c7bSLi Zhang return &pool->mtrs[idx % MLX5_ASO_MTRS_PER_POOL]; 1339e6100c7bSLi Zhang } 1340e6100c7bSLi Zhang 134179f89527SGregory Etelson static __rte_always_inline const struct rte_flow_item * 134279f89527SGregory Etelson mlx5_find_end_item(const struct rte_flow_item *item) 134379f89527SGregory Etelson { 134479f89527SGregory Etelson for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++); 134579f89527SGregory Etelson return item; 134679f89527SGregory Etelson } 134779f89527SGregory Etelson 134879f89527SGregory Etelson static __rte_always_inline bool 134979f89527SGregory Etelson mlx5_validate_integrity_item(const struct rte_flow_item_integrity *item) 135079f89527SGregory Etelson { 135179f89527SGregory Etelson struct rte_flow_item_integrity test = *item; 135279f89527SGregory Etelson test.l3_ok = 0; 135379f89527SGregory Etelson test.l4_ok = 0; 135479f89527SGregory Etelson test.ipv4_csum_ok = 0; 135579f89527SGregory Etelson test.l4_csum_ok = 0; 135679f89527SGregory Etelson return (test.value == 0); 135779f89527SGregory Etelson } 135879f89527SGregory Etelson 13592db75e8bSBing Zhao /* 13604f74cb68SBing Zhao * Get ASO CT action by device and index. 13612db75e8bSBing Zhao * 13622db75e8bSBing Zhao * @param[in] dev 13632db75e8bSBing Zhao * Pointer to the Ethernet device structure. 13642db75e8bSBing Zhao * @param[in] idx 13652db75e8bSBing Zhao * Index to the ASO CT action. 13662db75e8bSBing Zhao * 13672db75e8bSBing Zhao * @return 13682db75e8bSBing Zhao * The specified ASO CT action pointer. 13692db75e8bSBing Zhao */ 13702db75e8bSBing Zhao static inline struct mlx5_aso_ct_action * 13714f74cb68SBing Zhao flow_aso_ct_get_by_dev_idx(struct rte_eth_dev *dev, uint32_t idx) 13722db75e8bSBing Zhao { 13732db75e8bSBing Zhao struct mlx5_priv *priv = dev->data->dev_private; 13742db75e8bSBing Zhao struct mlx5_aso_ct_pools_mng *mng = priv->sh->ct_mng; 13752db75e8bSBing Zhao struct mlx5_aso_ct_pool *pool; 13762db75e8bSBing Zhao 13772db75e8bSBing Zhao idx--; 13782db75e8bSBing Zhao MLX5_ASSERT((idx / MLX5_ASO_CT_ACTIONS_PER_POOL) < mng->n); 13792db75e8bSBing Zhao /* Bit operation AND could be used. */ 13802db75e8bSBing Zhao rte_rwlock_read_lock(&mng->resize_rwl); 13812db75e8bSBing Zhao pool = mng->pools[idx / MLX5_ASO_CT_ACTIONS_PER_POOL]; 13822db75e8bSBing Zhao rte_rwlock_read_unlock(&mng->resize_rwl); 13832db75e8bSBing Zhao return &pool->actions[idx % MLX5_ASO_CT_ACTIONS_PER_POOL]; 13842db75e8bSBing Zhao } 13852db75e8bSBing Zhao 13864f74cb68SBing Zhao /* 13874f74cb68SBing Zhao * Get ASO CT action by owner & index. 13884f74cb68SBing Zhao * 13894f74cb68SBing Zhao * @param[in] dev 13904f74cb68SBing Zhao * Pointer to the Ethernet device structure. 13914f74cb68SBing Zhao * @param[in] idx 13924f74cb68SBing Zhao * Index to the ASO CT action and owner port combination. 13934f74cb68SBing Zhao * 13944f74cb68SBing Zhao * @return 13954f74cb68SBing Zhao * The specified ASO CT action pointer. 13964f74cb68SBing Zhao */ 13974f74cb68SBing Zhao static inline struct mlx5_aso_ct_action * 13984f74cb68SBing Zhao flow_aso_ct_get_by_idx(struct rte_eth_dev *dev, uint32_t own_idx) 13994f74cb68SBing Zhao { 14004f74cb68SBing Zhao struct mlx5_priv *priv = dev->data->dev_private; 14014f74cb68SBing Zhao struct mlx5_aso_ct_action *ct; 14024f74cb68SBing Zhao uint16_t owner = (uint16_t)MLX5_INDIRECT_ACT_CT_GET_OWNER(own_idx); 14034f74cb68SBing Zhao uint32_t idx = MLX5_INDIRECT_ACT_CT_GET_IDX(own_idx); 14044f74cb68SBing Zhao 14054f74cb68SBing Zhao if (owner == PORT_ID(priv)) { 14064f74cb68SBing Zhao ct = flow_aso_ct_get_by_dev_idx(dev, idx); 14074f74cb68SBing Zhao } else { 14084f74cb68SBing Zhao struct rte_eth_dev *owndev = &rte_eth_devices[owner]; 14094f74cb68SBing Zhao 14104f74cb68SBing Zhao MLX5_ASSERT(owner < RTE_MAX_ETHPORTS); 14114f74cb68SBing Zhao if (dev->data->dev_started != 1) 14124f74cb68SBing Zhao return NULL; 14134f74cb68SBing Zhao ct = flow_aso_ct_get_by_dev_idx(owndev, idx); 14144f74cb68SBing Zhao if (ct->peer != PORT_ID(priv)) 14154f74cb68SBing Zhao return NULL; 14164f74cb68SBing Zhao } 14174f74cb68SBing Zhao return ct; 14184f74cb68SBing Zhao } 14194f74cb68SBing Zhao 14204ec6360dSGregory Etelson int mlx5_flow_group_to_table(struct rte_eth_dev *dev, 14214ec6360dSGregory Etelson const struct mlx5_flow_tunnel *tunnel, 14224ec6360dSGregory Etelson uint32_t group, uint32_t *table, 1423eab3ca48SGregory Etelson const struct flow_grp_info *flags, 14244ec6360dSGregory Etelson struct rte_flow_error *error); 1425e745f900SSuanming Mou uint64_t mlx5_flow_hashfields_adjust(struct mlx5_flow_rss_desc *rss_desc, 1426e745f900SSuanming Mou int tunnel, uint64_t layer_types, 1427fc2c498cSOri Kam uint64_t hash_fields); 14283eca5f8aSOphir Munk int mlx5_flow_discover_priorities(struct rte_eth_dev *dev); 142984c406e7SOri Kam uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority, 143084c406e7SOri Kam uint32_t subpriority); 14315f8ae44dSDong Zhou uint32_t mlx5_get_lowest_priority(struct rte_eth_dev *dev, 14325f8ae44dSDong Zhou const struct rte_flow_attr *attr); 14335f8ae44dSDong Zhou uint16_t mlx5_get_matcher_priority(struct rte_eth_dev *dev, 14345f8ae44dSDong Zhou const struct rte_flow_attr *attr, 14355f8ae44dSDong Zhou uint32_t subpriority); 143699d49f47SMatan Azrad int mlx5_flow_get_reg_id(struct rte_eth_dev *dev, 14373e8edd0eSViacheslav Ovsiienko enum mlx5_feature_name feature, 14383e8edd0eSViacheslav Ovsiienko uint32_t id, 14393e8edd0eSViacheslav Ovsiienko struct rte_flow_error *error); 1440e4fcdcd6SMoti Haimovsky const struct rte_flow_action *mlx5_flow_find_action 1441e4fcdcd6SMoti Haimovsky (const struct rte_flow_action *actions, 1442e4fcdcd6SMoti Haimovsky enum rte_flow_action_type action); 1443d7cfcdddSAndrey Vesnovaty int mlx5_validate_action_rss(struct rte_eth_dev *dev, 1444d7cfcdddSAndrey Vesnovaty const struct rte_flow_action *action, 1445d7cfcdddSAndrey Vesnovaty struct rte_flow_error *error); 144684c406e7SOri Kam int mlx5_flow_validate_action_count(struct rte_eth_dev *dev, 14473e9fa079SDekel Peled const struct rte_flow_attr *attr, 144884c406e7SOri Kam struct rte_flow_error *error); 144984c406e7SOri Kam int mlx5_flow_validate_action_drop(uint64_t action_flags, 14503e9fa079SDekel Peled const struct rte_flow_attr *attr, 145184c406e7SOri Kam struct rte_flow_error *error); 145284c406e7SOri Kam int mlx5_flow_validate_action_flag(uint64_t action_flags, 14533e9fa079SDekel Peled const struct rte_flow_attr *attr, 145484c406e7SOri Kam struct rte_flow_error *error); 145584c406e7SOri Kam int mlx5_flow_validate_action_mark(const struct rte_flow_action *action, 145684c406e7SOri Kam uint64_t action_flags, 14573e9fa079SDekel Peled const struct rte_flow_attr *attr, 145884c406e7SOri Kam struct rte_flow_error *error); 145984c406e7SOri Kam int mlx5_flow_validate_action_queue(const struct rte_flow_action *action, 146084c406e7SOri Kam uint64_t action_flags, 146184c406e7SOri Kam struct rte_eth_dev *dev, 14623e9fa079SDekel Peled const struct rte_flow_attr *attr, 146384c406e7SOri Kam struct rte_flow_error *error); 146484c406e7SOri Kam int mlx5_flow_validate_action_rss(const struct rte_flow_action *action, 146584c406e7SOri Kam uint64_t action_flags, 146684c406e7SOri Kam struct rte_eth_dev *dev, 14673e9fa079SDekel Peled const struct rte_flow_attr *attr, 14681183f12fSOri Kam uint64_t item_flags, 146984c406e7SOri Kam struct rte_flow_error *error); 14703c78124fSShiri Kuzin int mlx5_flow_validate_action_default_miss(uint64_t action_flags, 14713c78124fSShiri Kuzin const struct rte_flow_attr *attr, 14723c78124fSShiri Kuzin struct rte_flow_error *error); 147384c406e7SOri Kam int mlx5_flow_validate_attributes(struct rte_eth_dev *dev, 147484c406e7SOri Kam const struct rte_flow_attr *attributes, 147584c406e7SOri Kam struct rte_flow_error *error); 14766bd7fbd0SDekel Peled int mlx5_flow_item_acceptable(const struct rte_flow_item *item, 14776bd7fbd0SDekel Peled const uint8_t *mask, 14786bd7fbd0SDekel Peled const uint8_t *nic_mask, 14796bd7fbd0SDekel Peled unsigned int size, 14806859e67eSDekel Peled bool range_accepted, 14816bd7fbd0SDekel Peled struct rte_flow_error *error); 148284c406e7SOri Kam int mlx5_flow_validate_item_eth(const struct rte_flow_item *item, 148386b59a1aSMatan Azrad uint64_t item_flags, bool ext_vlan_sup, 148484c406e7SOri Kam struct rte_flow_error *error); 148584c406e7SOri Kam int mlx5_flow_validate_item_gre(const struct rte_flow_item *item, 148684c406e7SOri Kam uint64_t item_flags, 148784c406e7SOri Kam uint8_t target_protocol, 148884c406e7SOri Kam struct rte_flow_error *error); 1489a7a03655SXiaoyu Min int mlx5_flow_validate_item_gre_key(const struct rte_flow_item *item, 1490a7a03655SXiaoyu Min uint64_t item_flags, 1491a7a03655SXiaoyu Min const struct rte_flow_item *gre_item, 1492a7a03655SXiaoyu Min struct rte_flow_error *error); 149384c406e7SOri Kam int mlx5_flow_validate_item_ipv4(const struct rte_flow_item *item, 1494ed4c5247SShahaf Shuler uint64_t item_flags, 1495fba32130SXiaoyu Min uint64_t last_item, 1496fba32130SXiaoyu Min uint16_t ether_type, 149755c61fa7SViacheslav Ovsiienko const struct rte_flow_item_ipv4 *acc_mask, 14986859e67eSDekel Peled bool range_accepted, 149984c406e7SOri Kam struct rte_flow_error *error); 150084c406e7SOri Kam int mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item, 150184c406e7SOri Kam uint64_t item_flags, 1502fba32130SXiaoyu Min uint64_t last_item, 1503fba32130SXiaoyu Min uint16_t ether_type, 150455c61fa7SViacheslav Ovsiienko const struct rte_flow_item_ipv6 *acc_mask, 150584c406e7SOri Kam struct rte_flow_error *error); 150638f7efaaSDekel Peled int mlx5_flow_validate_item_mpls(struct rte_eth_dev *dev, 150738f7efaaSDekel Peled const struct rte_flow_item *item, 150884c406e7SOri Kam uint64_t item_flags, 150938f7efaaSDekel Peled uint64_t prev_layer, 151084c406e7SOri Kam struct rte_flow_error *error); 151184c406e7SOri Kam int mlx5_flow_validate_item_tcp(const struct rte_flow_item *item, 151284c406e7SOri Kam uint64_t item_flags, 151384c406e7SOri Kam uint8_t target_protocol, 151492378c2bSMoti Haimovsky const struct rte_flow_item_tcp *flow_mask, 151584c406e7SOri Kam struct rte_flow_error *error); 151684c406e7SOri Kam int mlx5_flow_validate_item_udp(const struct rte_flow_item *item, 151784c406e7SOri Kam uint64_t item_flags, 151884c406e7SOri Kam uint8_t target_protocol, 151984c406e7SOri Kam struct rte_flow_error *error); 152084c406e7SOri Kam int mlx5_flow_validate_item_vlan(const struct rte_flow_item *item, 1521ed4c5247SShahaf Shuler uint64_t item_flags, 1522dfedf3e3SViacheslav Ovsiienko struct rte_eth_dev *dev, 152384c406e7SOri Kam struct rte_flow_error *error); 1524630a587bSRongwei Liu int mlx5_flow_validate_item_vxlan(struct rte_eth_dev *dev, 1525a1fd0c82SRongwei Liu uint16_t udp_dport, 1526630a587bSRongwei Liu const struct rte_flow_item *item, 152784c406e7SOri Kam uint64_t item_flags, 1528630a587bSRongwei Liu const struct rte_flow_attr *attr, 152984c406e7SOri Kam struct rte_flow_error *error); 153084c406e7SOri Kam int mlx5_flow_validate_item_vxlan_gpe(const struct rte_flow_item *item, 153184c406e7SOri Kam uint64_t item_flags, 153284c406e7SOri Kam struct rte_eth_dev *dev, 153384c406e7SOri Kam struct rte_flow_error *error); 1534d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp(const struct rte_flow_item *item, 1535d53aa89aSXiaoyu Min uint64_t item_flags, 1536d53aa89aSXiaoyu Min uint8_t target_protocol, 1537d53aa89aSXiaoyu Min struct rte_flow_error *error); 1538d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp6(const struct rte_flow_item *item, 1539d53aa89aSXiaoyu Min uint64_t item_flags, 1540d53aa89aSXiaoyu Min uint8_t target_protocol, 1541d53aa89aSXiaoyu Min struct rte_flow_error *error); 1542ea81c1b8SDekel Peled int mlx5_flow_validate_item_nvgre(const struct rte_flow_item *item, 1543ea81c1b8SDekel Peled uint64_t item_flags, 1544ea81c1b8SDekel Peled uint8_t target_protocol, 1545ea81c1b8SDekel Peled struct rte_flow_error *error); 1546e59a5dbcSMoti Haimovsky int mlx5_flow_validate_item_geneve(const struct rte_flow_item *item, 1547e59a5dbcSMoti Haimovsky uint64_t item_flags, 1548e59a5dbcSMoti Haimovsky struct rte_eth_dev *dev, 1549e59a5dbcSMoti Haimovsky struct rte_flow_error *error); 1550f7239fceSShiri Kuzin int mlx5_flow_validate_item_geneve_opt(const struct rte_flow_item *item, 1551f7239fceSShiri Kuzin uint64_t last_item, 1552f7239fceSShiri Kuzin const struct rte_flow_item *geneve_item, 1553f7239fceSShiri Kuzin struct rte_eth_dev *dev, 1554f7239fceSShiri Kuzin struct rte_flow_error *error); 1555c7eca236SBing Zhao int mlx5_flow_validate_item_ecpri(const struct rte_flow_item *item, 1556c7eca236SBing Zhao uint64_t item_flags, 1557c7eca236SBing Zhao uint64_t last_item, 1558c7eca236SBing Zhao uint16_t ether_type, 1559c7eca236SBing Zhao const struct rte_flow_item_ecpri *acc_mask, 1560c7eca236SBing Zhao struct rte_flow_error *error); 156144432018SLi Zhang int mlx5_flow_create_mtr_tbls(struct rte_eth_dev *dev, 156244432018SLi Zhang struct mlx5_flow_meter_info *fm, 156344432018SLi Zhang uint32_t mtr_idx, 156444432018SLi Zhang uint8_t domain_bitmap); 156544432018SLi Zhang void mlx5_flow_destroy_mtr_tbls(struct rte_eth_dev *dev, 156644432018SLi Zhang struct mlx5_flow_meter_info *fm); 1567afb4aa4fSLi Zhang void mlx5_flow_destroy_mtr_drop_tbls(struct rte_eth_dev *dev); 1568fc6ce56bSLi Zhang struct mlx5_flow_meter_sub_policy *mlx5_flow_meter_sub_policy_rss_prepare 1569fc6ce56bSLi Zhang (struct rte_eth_dev *dev, 1570fc6ce56bSLi Zhang struct mlx5_flow_meter_policy *mtr_policy, 1571fc6ce56bSLi Zhang struct mlx5_flow_rss_desc *rss_desc[MLX5_MTR_RTE_COLORS]); 1572ec962badSLi Zhang void mlx5_flow_destroy_sub_policy_with_rxq(struct rte_eth_dev *dev, 1573ec962badSLi Zhang struct mlx5_flow_meter_policy *mtr_policy); 1574994829e6SSuanming Mou int mlx5_flow_dv_discover_counter_offset_support(struct rte_eth_dev *dev); 1575*45633c46SSuanming Mou int mlx5_flow_discover_dr_action_support(struct rte_eth_dev *dev); 15764b61b877SBing Zhao int mlx5_action_handle_flush(struct rte_eth_dev *dev); 15774ec6360dSGregory Etelson void mlx5_release_tunnel_hub(struct mlx5_dev_ctx_shared *sh, uint16_t port_id); 15784ec6360dSGregory Etelson int mlx5_alloc_tunnel_hub(struct mlx5_dev_ctx_shared *sh); 1579afd7a625SXueming Li 1580961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_tbl_create_cb(void *tool_ctx, void *entry_ctx); 1581961b6774SMatan Azrad int flow_dv_tbl_match_cb(void *tool_ctx, struct mlx5_list_entry *entry, 1582f5b0aed2SSuanming Mou void *cb_ctx); 1583961b6774SMatan Azrad void flow_dv_tbl_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry); 1584961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_tbl_clone_cb(void *tool_ctx, 1585961b6774SMatan Azrad struct mlx5_list_entry *oentry, 1586961b6774SMatan Azrad void *entry_ctx); 1587961b6774SMatan Azrad void flow_dv_tbl_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry); 1588afd7a625SXueming Li struct mlx5_flow_tbl_resource *flow_dv_tbl_resource_get(struct rte_eth_dev *dev, 15892d2cef5dSLi Zhang uint32_t table_level, uint8_t egress, uint8_t transfer, 1590afd7a625SXueming Li bool external, const struct mlx5_flow_tunnel *tunnel, 15912d2cef5dSLi Zhang uint32_t group_id, uint8_t dummy, 15922d2cef5dSLi Zhang uint32_t table_id, struct rte_flow_error *error); 1593afd7a625SXueming Li 1594961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_tag_create_cb(void *tool_ctx, void *cb_ctx); 1595961b6774SMatan Azrad int flow_dv_tag_match_cb(void *tool_ctx, struct mlx5_list_entry *entry, 1596f5b0aed2SSuanming Mou void *cb_ctx); 1597961b6774SMatan Azrad void flow_dv_tag_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry); 1598961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_tag_clone_cb(void *tool_ctx, 1599961b6774SMatan Azrad struct mlx5_list_entry *oentry, 1600f5b0aed2SSuanming Mou void *cb_ctx); 1601961b6774SMatan Azrad void flow_dv_tag_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry); 1602f7f73ac1SXueming Li 1603961b6774SMatan Azrad int flow_dv_modify_match_cb(void *tool_ctx, struct mlx5_list_entry *entry, 1604961b6774SMatan Azrad void *cb_ctx); 1605961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_modify_create_cb(void *tool_ctx, void *ctx); 1606961b6774SMatan Azrad void flow_dv_modify_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry); 1607961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_modify_clone_cb(void *tool_ctx, 1608961b6774SMatan Azrad struct mlx5_list_entry *oentry, 1609961b6774SMatan Azrad void *ctx); 1610961b6774SMatan Azrad void flow_dv_modify_clone_free_cb(void *tool_ctx, 1611961b6774SMatan Azrad struct mlx5_list_entry *entry); 1612961b6774SMatan Azrad 1613961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_mreg_create_cb(void *tool_ctx, void *ctx); 1614961b6774SMatan Azrad int flow_dv_mreg_match_cb(void *tool_ctx, struct mlx5_list_entry *entry, 1615961b6774SMatan Azrad void *cb_ctx); 1616961b6774SMatan Azrad void flow_dv_mreg_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry); 1617961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_mreg_clone_cb(void *tool_ctx, 1618961b6774SMatan Azrad struct mlx5_list_entry *entry, 1619961b6774SMatan Azrad void *ctx); 1620961b6774SMatan Azrad void flow_dv_mreg_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry); 1621961b6774SMatan Azrad 1622961b6774SMatan Azrad int flow_dv_encap_decap_match_cb(void *tool_ctx, struct mlx5_list_entry *entry, 1623961b6774SMatan Azrad void *cb_ctx); 1624961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_encap_decap_create_cb(void *tool_ctx, 1625961b6774SMatan Azrad void *cb_ctx); 1626961b6774SMatan Azrad void flow_dv_encap_decap_remove_cb(void *tool_ctx, 1627961b6774SMatan Azrad struct mlx5_list_entry *entry); 1628961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_encap_decap_clone_cb(void *tool_ctx, 1629961b6774SMatan Azrad struct mlx5_list_entry *entry, 1630961b6774SMatan Azrad void *cb_ctx); 1631961b6774SMatan Azrad void flow_dv_encap_decap_clone_free_cb(void *tool_ctx, 1632961b6774SMatan Azrad struct mlx5_list_entry *entry); 163318726355SXueming Li 16346507c9f5SSuanming Mou int flow_dv_matcher_match_cb(void *tool_ctx, struct mlx5_list_entry *entry, 1635e78e5408SMatan Azrad void *ctx); 16366507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_matcher_create_cb(void *tool_ctx, void *ctx); 16376507c9f5SSuanming Mou void flow_dv_matcher_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry); 16386507c9f5SSuanming Mou 16396507c9f5SSuanming Mou int flow_dv_port_id_match_cb(void *tool_ctx, struct mlx5_list_entry *entry, 16406507c9f5SSuanming Mou void *cb_ctx); 16416507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_port_id_create_cb(void *tool_ctx, void *cb_ctx); 16426507c9f5SSuanming Mou void flow_dv_port_id_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry); 16436507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_port_id_clone_cb(void *tool_ctx, 16446507c9f5SSuanming Mou struct mlx5_list_entry *entry, void *cb_ctx); 16456507c9f5SSuanming Mou void flow_dv_port_id_clone_free_cb(void *tool_ctx, 1646e78e5408SMatan Azrad struct mlx5_list_entry *entry); 164718726355SXueming Li 16486507c9f5SSuanming Mou int flow_dv_push_vlan_match_cb(void *tool_ctx, struct mlx5_list_entry *entry, 1649e78e5408SMatan Azrad void *cb_ctx); 16506507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_push_vlan_create_cb(void *tool_ctx, 1651491b7137SMatan Azrad void *cb_ctx); 16526507c9f5SSuanming Mou void flow_dv_push_vlan_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry); 16536507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_push_vlan_clone_cb(void *tool_ctx, 1654e78e5408SMatan Azrad struct mlx5_list_entry *entry, void *cb_ctx); 16556507c9f5SSuanming Mou void flow_dv_push_vlan_clone_free_cb(void *tool_ctx, 1656491b7137SMatan Azrad struct mlx5_list_entry *entry); 16573422af2aSXueming Li 16586507c9f5SSuanming Mou int flow_dv_sample_match_cb(void *tool_ctx, struct mlx5_list_entry *entry, 1659e78e5408SMatan Azrad void *cb_ctx); 16606507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_sample_create_cb(void *tool_ctx, void *cb_ctx); 16616507c9f5SSuanming Mou void flow_dv_sample_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry); 16626507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_sample_clone_cb(void *tool_ctx, 1663491b7137SMatan Azrad struct mlx5_list_entry *entry, void *cb_ctx); 16646507c9f5SSuanming Mou void flow_dv_sample_clone_free_cb(void *tool_ctx, 1665491b7137SMatan Azrad struct mlx5_list_entry *entry); 166619784141SSuanming Mou 16676507c9f5SSuanming Mou int flow_dv_dest_array_match_cb(void *tool_ctx, struct mlx5_list_entry *entry, 1668e78e5408SMatan Azrad void *cb_ctx); 16696507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_dest_array_create_cb(void *tool_ctx, 16706507c9f5SSuanming Mou void *cb_ctx); 16716507c9f5SSuanming Mou void flow_dv_dest_array_remove_cb(void *tool_ctx, 1672e78e5408SMatan Azrad struct mlx5_list_entry *entry); 16736507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_dest_array_clone_cb(void *tool_ctx, 1674491b7137SMatan Azrad struct mlx5_list_entry *entry, void *cb_ctx); 16756507c9f5SSuanming Mou void flow_dv_dest_array_clone_free_cb(void *tool_ctx, 1676491b7137SMatan Azrad struct mlx5_list_entry *entry); 16776507c9f5SSuanming Mou 167881073e1fSMatan Azrad struct mlx5_aso_age_action *flow_aso_age_get_by_idx(struct rte_eth_dev *dev, 167981073e1fSMatan Azrad uint32_t age_idx); 1680f15f0c38SShiri Kuzin int flow_dev_geneve_tlv_option_resource_register(struct rte_eth_dev *dev, 1681f15f0c38SShiri Kuzin const struct rte_flow_item *item, 1682f15f0c38SShiri Kuzin struct rte_flow_error *error); 16835d55a494STal Shnaiderman void flow_release_workspace(void *data); 16845d55a494STal Shnaiderman int mlx5_flow_os_init_workspace_once(void); 16855d55a494STal Shnaiderman void *mlx5_flow_os_get_specific_workspace(void); 16865d55a494STal Shnaiderman int mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data); 16875d55a494STal Shnaiderman void mlx5_flow_os_release_workspace(void); 1688e6100c7bSLi Zhang uint32_t mlx5_flow_mtr_alloc(struct rte_eth_dev *dev); 1689e6100c7bSLi Zhang void mlx5_flow_mtr_free(struct rte_eth_dev *dev, uint32_t mtr_idx); 1690afb4aa4fSLi Zhang int mlx5_flow_validate_mtr_acts(struct rte_eth_dev *dev, 1691afb4aa4fSLi Zhang const struct rte_flow_action *actions[RTE_COLORS], 1692afb4aa4fSLi Zhang struct rte_flow_attr *attr, 1693afb4aa4fSLi Zhang bool *is_rss, 1694afb4aa4fSLi Zhang uint8_t *domain_bitmap, 16954b7bf3ffSBing Zhao uint8_t *policy_mode, 1696afb4aa4fSLi Zhang struct rte_mtr_error *error); 1697afb4aa4fSLi Zhang void mlx5_flow_destroy_mtr_acts(struct rte_eth_dev *dev, 1698afb4aa4fSLi Zhang struct mlx5_flow_meter_policy *mtr_policy); 1699afb4aa4fSLi Zhang int mlx5_flow_create_mtr_acts(struct rte_eth_dev *dev, 1700afb4aa4fSLi Zhang struct mlx5_flow_meter_policy *mtr_policy, 1701afb4aa4fSLi Zhang const struct rte_flow_action *actions[RTE_COLORS], 1702afb4aa4fSLi Zhang struct rte_mtr_error *error); 1703afb4aa4fSLi Zhang int mlx5_flow_create_policy_rules(struct rte_eth_dev *dev, 1704afb4aa4fSLi Zhang struct mlx5_flow_meter_policy *mtr_policy); 1705afb4aa4fSLi Zhang void mlx5_flow_destroy_policy_rules(struct rte_eth_dev *dev, 1706afb4aa4fSLi Zhang struct mlx5_flow_meter_policy *mtr_policy); 1707afb4aa4fSLi Zhang int mlx5_flow_create_def_policy(struct rte_eth_dev *dev); 1708afb4aa4fSLi Zhang void mlx5_flow_destroy_def_policy(struct rte_eth_dev *dev); 1709afb4aa4fSLi Zhang void flow_drv_rxq_flags_set(struct rte_eth_dev *dev, 1710afb4aa4fSLi Zhang struct mlx5_flow_handle *dev_handle); 17118c5a231bSGregory Etelson const struct mlx5_flow_tunnel * 17128c5a231bSGregory Etelson mlx5_get_tof(const struct rte_flow_item *items, 17138c5a231bSGregory Etelson const struct rte_flow_action *actions, 17148c5a231bSGregory Etelson enum mlx5_tof_rule_type *rule_type); 17158c5a231bSGregory Etelson 17168c5a231bSGregory Etelson 171784c406e7SOri Kam #endif /* RTE_PMD_MLX5_FLOW_H_ */ 1718