1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright 2018 Mellanox Technologies, Ltd 3 */ 4 5 #ifndef RTE_PMD_MLX5_FLOW_H_ 6 #define RTE_PMD_MLX5_FLOW_H_ 7 8 #include <netinet/in.h> 9 #include <sys/queue.h> 10 #include <stdalign.h> 11 #include <stdint.h> 12 #include <string.h> 13 14 /* Verbs header. */ 15 /* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */ 16 #ifdef PEDANTIC 17 #pragma GCC diagnostic ignored "-Wpedantic" 18 #endif 19 #include <infiniband/verbs.h> 20 #ifdef PEDANTIC 21 #pragma GCC diagnostic error "-Wpedantic" 22 #endif 23 24 /* Pattern outer Layer bits. */ 25 #define MLX5_FLOW_LAYER_OUTER_L2 (1u << 0) 26 #define MLX5_FLOW_LAYER_OUTER_L3_IPV4 (1u << 1) 27 #define MLX5_FLOW_LAYER_OUTER_L3_IPV6 (1u << 2) 28 #define MLX5_FLOW_LAYER_OUTER_L4_UDP (1u << 3) 29 #define MLX5_FLOW_LAYER_OUTER_L4_TCP (1u << 4) 30 #define MLX5_FLOW_LAYER_OUTER_VLAN (1u << 5) 31 32 /* Pattern inner Layer bits. */ 33 #define MLX5_FLOW_LAYER_INNER_L2 (1u << 6) 34 #define MLX5_FLOW_LAYER_INNER_L3_IPV4 (1u << 7) 35 #define MLX5_FLOW_LAYER_INNER_L3_IPV6 (1u << 8) 36 #define MLX5_FLOW_LAYER_INNER_L4_UDP (1u << 9) 37 #define MLX5_FLOW_LAYER_INNER_L4_TCP (1u << 10) 38 #define MLX5_FLOW_LAYER_INNER_VLAN (1u << 11) 39 40 /* Pattern tunnel Layer bits. */ 41 #define MLX5_FLOW_LAYER_VXLAN (1u << 12) 42 #define MLX5_FLOW_LAYER_VXLAN_GPE (1u << 13) 43 #define MLX5_FLOW_LAYER_GRE (1u << 14) 44 #define MLX5_FLOW_LAYER_MPLS (1u << 15) 45 46 /* Outer Masks. */ 47 #define MLX5_FLOW_LAYER_OUTER_L3 \ 48 (MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L3_IPV6) 49 #define MLX5_FLOW_LAYER_OUTER_L4 \ 50 (MLX5_FLOW_LAYER_OUTER_L4_UDP | MLX5_FLOW_LAYER_OUTER_L4_TCP) 51 #define MLX5_FLOW_LAYER_OUTER \ 52 (MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_OUTER_L3 | \ 53 MLX5_FLOW_LAYER_OUTER_L4) 54 55 /* Tunnel Masks. */ 56 #define MLX5_FLOW_LAYER_TUNNEL \ 57 (MLX5_FLOW_LAYER_VXLAN | MLX5_FLOW_LAYER_VXLAN_GPE | \ 58 MLX5_FLOW_LAYER_GRE | MLX5_FLOW_LAYER_MPLS) 59 60 /* Inner Masks. */ 61 #define MLX5_FLOW_LAYER_INNER_L3 \ 62 (MLX5_FLOW_LAYER_INNER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV6) 63 #define MLX5_FLOW_LAYER_INNER_L4 \ 64 (MLX5_FLOW_LAYER_INNER_L4_UDP | MLX5_FLOW_LAYER_INNER_L4_TCP) 65 #define MLX5_FLOW_LAYER_INNER \ 66 (MLX5_FLOW_LAYER_INNER_L2 | MLX5_FLOW_LAYER_INNER_L3 | \ 67 MLX5_FLOW_LAYER_INNER_L4) 68 69 /* Actions */ 70 #define MLX5_FLOW_ACTION_DROP (1u << 0) 71 #define MLX5_FLOW_ACTION_QUEUE (1u << 1) 72 #define MLX5_FLOW_ACTION_RSS (1u << 2) 73 #define MLX5_FLOW_ACTION_FLAG (1u << 3) 74 #define MLX5_FLOW_ACTION_MARK (1u << 4) 75 #define MLX5_FLOW_ACTION_COUNT (1u << 5) 76 #define MLX5_FLOW_ACTION_PORT_ID (1u << 6) 77 #define MLX5_FLOW_ACTION_OF_POP_VLAN (1u << 7) 78 #define MLX5_FLOW_ACTION_OF_PUSH_VLAN (1u << 8) 79 #define MLX5_FLOW_ACTION_OF_SET_VLAN_VID (1u << 9) 80 #define MLX5_FLOW_ACTION_OF_SET_VLAN_PCP (1u << 10) 81 #define MLX5_FLOW_ACTION_SET_IPV4_SRC (1u << 11) 82 #define MLX5_FLOW_ACTION_SET_IPV4_DST (1u << 12) 83 #define MLX5_FLOW_ACTION_SET_IPV6_SRC (1u << 13) 84 #define MLX5_FLOW_ACTION_SET_IPV6_DST (1u << 14) 85 #define MLX5_FLOW_ACTION_SET_TP_SRC (1u << 15) 86 #define MLX5_FLOW_ACTION_SET_TP_DST (1u << 16) 87 #define MLX5_FLOW_ACTION_JUMP (1u << 17) 88 #define MLX5_FLOW_ACTION_SET_TTL (1u << 18) 89 #define MLX5_FLOW_ACTION_DEC_TTL (1u << 19) 90 91 #define MLX5_FLOW_FATE_ACTIONS \ 92 (MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | MLX5_FLOW_ACTION_RSS) 93 94 #ifndef IPPROTO_MPLS 95 #define IPPROTO_MPLS 137 96 #endif 97 98 /* UDP port numbers for VxLAN. */ 99 #define MLX5_UDP_PORT_VXLAN 4789 100 #define MLX5_UDP_PORT_VXLAN_GPE 4790 101 102 /* Priority reserved for default flows. */ 103 #define MLX5_FLOW_PRIO_RSVD ((uint32_t)-1) 104 105 /* 106 * Number of sub priorities. 107 * For each kind of pattern matching i.e. L2, L3, L4 to have a correct 108 * matching on the NIC (firmware dependent) L4 most have the higher priority 109 * followed by L3 and ending with L2. 110 */ 111 #define MLX5_PRIORITY_MAP_L2 2 112 #define MLX5_PRIORITY_MAP_L3 1 113 #define MLX5_PRIORITY_MAP_L4 0 114 #define MLX5_PRIORITY_MAP_MAX 3 115 116 /* Valid layer type for IPV4 RSS. */ 117 #define MLX5_IPV4_LAYER_TYPES \ 118 (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \ 119 ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV4_UDP | \ 120 ETH_RSS_NONFRAG_IPV4_OTHER) 121 122 /* IBV hash source bits for IPV4. */ 123 #define MLX5_IPV4_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4) 124 125 /* Valid layer type for IPV6 RSS. */ 126 #define MLX5_IPV6_LAYER_TYPES \ 127 (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | ETH_RSS_NONFRAG_IPV6_TCP | \ 128 ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_IPV6_EX | ETH_RSS_IPV6_TCP_EX | \ 129 ETH_RSS_IPV6_UDP_EX | ETH_RSS_NONFRAG_IPV6_OTHER) 130 131 /* IBV hash source bits for IPV6. */ 132 #define MLX5_IPV6_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6) 133 134 /* Max number of actions per DV flow. */ 135 #define MLX5_DV_MAX_NUMBER_OF_ACTIONS 8 136 137 enum mlx5_flow_drv_type { 138 MLX5_FLOW_TYPE_MIN, 139 MLX5_FLOW_TYPE_DV, 140 MLX5_FLOW_TYPE_TCF, 141 MLX5_FLOW_TYPE_VERBS, 142 MLX5_FLOW_TYPE_MAX, 143 }; 144 145 /* Matcher PRM representation */ 146 struct mlx5_flow_dv_match_params { 147 size_t size; 148 /**< Size of match value. Do NOT split size and key! */ 149 uint32_t buf[MLX5_ST_SZ_DW(fte_match_param)]; 150 /**< Matcher value. This value is used as the mask or as a key. */ 151 }; 152 153 #define MLX5_DV_MAX_NUMBER_OF_ACTIONS 8 154 155 /* Matcher structure. */ 156 struct mlx5_flow_dv_matcher { 157 LIST_ENTRY(mlx5_flow_dv_matcher) next; 158 /* Pointer to the next element. */ 159 rte_atomic32_t refcnt; /**< Reference counter. */ 160 void *matcher_object; /**< Pointer to DV matcher */ 161 uint16_t crc; /**< CRC of key. */ 162 uint16_t priority; /**< Priority of matcher. */ 163 uint8_t egress; /**< Egress matcher. */ 164 struct mlx5_flow_dv_match_params mask; /**< Matcher mask. */ 165 }; 166 167 /* DV flows structure. */ 168 struct mlx5_flow_dv { 169 uint64_t hash_fields; /**< Fields that participate in the hash. */ 170 struct mlx5_hrxq *hrxq; /**< Hash Rx queues. */ 171 /* Flow DV api: */ 172 struct mlx5_flow_dv_matcher *matcher; /**< Cache to matcher. */ 173 struct mlx5_flow_dv_match_params value; 174 /**< Holds the value that the packet is compared to. */ 175 struct ibv_flow *flow; /**< Installed flow. */ 176 #ifdef HAVE_IBV_FLOW_DV_SUPPORT 177 struct mlx5dv_flow_action_attr actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS]; 178 /**< Action list. */ 179 #endif 180 int actions_n; /**< number of actions. */ 181 }; 182 183 /** Linux TC flower driver for E-Switch flow. */ 184 struct mlx5_flow_tcf { 185 struct nlmsghdr *nlh; 186 struct tcmsg *tcm; 187 }; 188 189 /* Verbs specification header. */ 190 struct ibv_spec_header { 191 enum ibv_flow_spec_type type; 192 uint16_t size; 193 }; 194 195 /** Handles information leading to a drop fate. */ 196 struct mlx5_flow_verbs { 197 LIST_ENTRY(mlx5_flow_verbs) next; 198 unsigned int size; /**< Size of the attribute. */ 199 struct { 200 struct ibv_flow_attr *attr; 201 /**< Pointer to the Specification buffer. */ 202 uint8_t *specs; /**< Pointer to the specifications. */ 203 }; 204 struct ibv_flow *flow; /**< Verbs flow pointer. */ 205 struct mlx5_hrxq *hrxq; /**< Hash Rx queue object. */ 206 uint64_t hash_fields; /**< Verbs hash Rx queue hash fields. */ 207 }; 208 209 /** Device flow structure. */ 210 struct mlx5_flow { 211 LIST_ENTRY(mlx5_flow) next; 212 struct rte_flow *flow; /**< Pointer to the main flow. */ 213 uint32_t layers; /**< Bit-fields that holds the detected layers. */ 214 union { 215 #ifdef HAVE_IBV_FLOW_DV_SUPPORT 216 struct mlx5_flow_dv dv; 217 #endif 218 struct mlx5_flow_tcf tcf; 219 struct mlx5_flow_verbs verbs; 220 }; 221 }; 222 223 /* Counters information. */ 224 struct mlx5_flow_counter { 225 LIST_ENTRY(mlx5_flow_counter) next; /**< Pointer to the next counter. */ 226 uint32_t shared:1; /**< Share counter ID with other flow rules. */ 227 uint32_t ref_cnt:31; /**< Reference counter. */ 228 uint32_t id; /**< Counter ID. */ 229 struct ibv_counter_set *cs; /**< Holds the counters for the rule. */ 230 uint64_t hits; /**< Number of packets matched by the rule. */ 231 uint64_t bytes; /**< Number of bytes matched by the rule. */ 232 }; 233 234 /* Flow structure. */ 235 struct rte_flow { 236 TAILQ_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. */ 237 enum mlx5_flow_drv_type drv_type; /**< Drvier type. */ 238 uint32_t layers; 239 /**< Bit-fields of present layers see MLX5_FLOW_LAYER_*. */ 240 struct mlx5_flow_counter *counter; /**< Holds flow counter. */ 241 struct rte_flow_action_rss rss;/**< RSS context. */ 242 uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */ 243 uint16_t (*queue)[]; /**< Destination queues to redirect traffic to. */ 244 void *nl_flow; /**< Netlink flow buffer if relevant. */ 245 LIST_HEAD(dev_flows, mlx5_flow) dev_flows; 246 /**< Device flows that are part of the flow. */ 247 uint32_t actions; /**< Bit-fields which mark all detected actions. */ 248 }; 249 typedef int (*mlx5_flow_validate_t)(struct rte_eth_dev *dev, 250 const struct rte_flow_attr *attr, 251 const struct rte_flow_item items[], 252 const struct rte_flow_action actions[], 253 struct rte_flow_error *error); 254 typedef struct mlx5_flow *(*mlx5_flow_prepare_t) 255 (const struct rte_flow_attr *attr, const struct rte_flow_item items[], 256 const struct rte_flow_action actions[], uint64_t *item_flags, 257 uint64_t *action_flags, struct rte_flow_error *error); 258 typedef int (*mlx5_flow_translate_t)(struct rte_eth_dev *dev, 259 struct mlx5_flow *dev_flow, 260 const struct rte_flow_attr *attr, 261 const struct rte_flow_item items[], 262 const struct rte_flow_action actions[], 263 struct rte_flow_error *error); 264 typedef int (*mlx5_flow_apply_t)(struct rte_eth_dev *dev, struct rte_flow *flow, 265 struct rte_flow_error *error); 266 typedef void (*mlx5_flow_remove_t)(struct rte_eth_dev *dev, 267 struct rte_flow *flow); 268 typedef void (*mlx5_flow_destroy_t)(struct rte_eth_dev *dev, 269 struct rte_flow *flow); 270 struct mlx5_flow_driver_ops { 271 mlx5_flow_validate_t validate; 272 mlx5_flow_prepare_t prepare; 273 mlx5_flow_translate_t translate; 274 mlx5_flow_apply_t apply; 275 mlx5_flow_remove_t remove; 276 mlx5_flow_destroy_t destroy; 277 }; 278 279 /* mlx5_flow.c */ 280 281 uint64_t mlx5_flow_hashfields_adjust(struct mlx5_flow *dev_flow, int tunnel, 282 uint32_t layer_types, 283 uint64_t hash_fields); 284 uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority, 285 uint32_t subpriority); 286 int mlx5_flow_validate_action_count(struct rte_eth_dev *dev, 287 const struct rte_flow_attr *attr, 288 struct rte_flow_error *error); 289 int mlx5_flow_validate_action_drop(uint64_t action_flags, 290 const struct rte_flow_attr *attr, 291 struct rte_flow_error *error); 292 int mlx5_flow_validate_action_flag(uint64_t action_flags, 293 const struct rte_flow_attr *attr, 294 struct rte_flow_error *error); 295 int mlx5_flow_validate_action_mark(const struct rte_flow_action *action, 296 uint64_t action_flags, 297 const struct rte_flow_attr *attr, 298 struct rte_flow_error *error); 299 int mlx5_flow_validate_action_queue(const struct rte_flow_action *action, 300 uint64_t action_flags, 301 struct rte_eth_dev *dev, 302 const struct rte_flow_attr *attr, 303 struct rte_flow_error *error); 304 int mlx5_flow_validate_action_rss(const struct rte_flow_action *action, 305 uint64_t action_flags, 306 struct rte_eth_dev *dev, 307 const struct rte_flow_attr *attr, 308 struct rte_flow_error *error); 309 int mlx5_flow_validate_attributes(struct rte_eth_dev *dev, 310 const struct rte_flow_attr *attributes, 311 struct rte_flow_error *error); 312 int mlx5_flow_validate_item_eth(const struct rte_flow_item *item, 313 uint64_t item_flags, 314 struct rte_flow_error *error); 315 int mlx5_flow_validate_item_gre(const struct rte_flow_item *item, 316 uint64_t item_flags, 317 uint8_t target_protocol, 318 struct rte_flow_error *error); 319 int mlx5_flow_validate_item_ipv4(const struct rte_flow_item *item, 320 int64_t item_flags, 321 struct rte_flow_error *error); 322 int mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item, 323 uint64_t item_flags, 324 struct rte_flow_error *error); 325 int mlx5_flow_validate_item_mpls(const struct rte_flow_item *item, 326 uint64_t item_flags, 327 uint8_t target_protocol, 328 struct rte_flow_error *error); 329 int mlx5_flow_validate_item_tcp(const struct rte_flow_item *item, 330 uint64_t item_flags, 331 uint8_t target_protocol, 332 const struct rte_flow_item_tcp *flow_mask, 333 struct rte_flow_error *error); 334 int mlx5_flow_validate_item_udp(const struct rte_flow_item *item, 335 uint64_t item_flags, 336 uint8_t target_protocol, 337 struct rte_flow_error *error); 338 int mlx5_flow_validate_item_vlan(const struct rte_flow_item *item, 339 int64_t item_flags, 340 struct rte_flow_error *error); 341 int mlx5_flow_validate_item_vxlan(const struct rte_flow_item *item, 342 uint64_t item_flags, 343 struct rte_flow_error *error); 344 int mlx5_flow_validate_item_vxlan_gpe(const struct rte_flow_item *item, 345 uint64_t item_flags, 346 struct rte_eth_dev *dev, 347 struct rte_flow_error *error); 348 349 /* mlx5_flow_tcf.c */ 350 351 int mlx5_flow_tcf_init(struct mnl_socket *nl, unsigned int ifindex, 352 struct rte_flow_error *error); 353 struct mnl_socket *mlx5_flow_tcf_socket_create(void); 354 void mlx5_flow_tcf_socket_destroy(struct mnl_socket *nl); 355 356 #endif /* RTE_PMD_MLX5_FLOW_H_ */ 357