net/mlx5: fix flow mark with sampling and metering
[dpdk.git] / drivers / net / mlx5 / mlx5_flow.h
index f1a83d5..1f54649 100644 (file)
@@ -109,6 +109,7 @@ enum mlx5_feature_name {
        MLX5_MTR_ID,
        MLX5_ASO_FLOW_HIT,
        MLX5_ASO_CONNTRACK,
+       MLX5_SAMPLE_ID,
 };
 
 /* Default queue number. */
@@ -170,11 +171,19 @@ enum mlx5_feature_name {
 #define MLX5_FLOW_LAYER_GENEVE_OPT (UINT64_C(1) << 32)
 #define MLX5_FLOW_LAYER_GTP_PSC (UINT64_C(1) << 33)
 
-/* INTEGRITY item bit */
-#define MLX5_FLOW_ITEM_INTEGRITY (UINT64_C(1) << 34)
+/* INTEGRITY item bits */
+#define MLX5_FLOW_ITEM_OUTER_INTEGRITY (UINT64_C(1) << 34)
+#define MLX5_FLOW_ITEM_INNER_INTEGRITY (UINT64_C(1) << 35)
+#define MLX5_FLOW_ITEM_INTEGRITY \
+       (MLX5_FLOW_ITEM_OUTER_INTEGRITY | MLX5_FLOW_ITEM_INNER_INTEGRITY)
 
 /* Conntrack item. */
-#define MLX5_FLOW_LAYER_ASO_CT (UINT64_C(1) << 35)
+#define MLX5_FLOW_LAYER_ASO_CT (UINT64_C(1) << 36)
+
+/* Flex item */
+#define MLX5_FLOW_ITEM_OUTER_FLEX (UINT64_C(1) << 37)
+#define MLX5_FLOW_ITEM_INNER_FLEX (UINT64_C(1) << 38)
+#define MLX5_FLOW_ITEM_FLEX_TUNNEL (UINT64_C(1) << 39)
 
 /* Outer Masks. */
 #define MLX5_FLOW_LAYER_OUTER_L3 \
@@ -190,7 +199,8 @@ enum mlx5_feature_name {
        (MLX5_FLOW_LAYER_VXLAN | MLX5_FLOW_LAYER_VXLAN_GPE | \
         MLX5_FLOW_LAYER_GRE | MLX5_FLOW_LAYER_NVGRE | MLX5_FLOW_LAYER_MPLS | \
         MLX5_FLOW_LAYER_IPIP | MLX5_FLOW_LAYER_IPV6_ENCAP | \
-        MLX5_FLOW_LAYER_GENEVE | MLX5_FLOW_LAYER_GTP)
+        MLX5_FLOW_LAYER_GENEVE | MLX5_FLOW_LAYER_GTP | \
+        MLX5_FLOW_ITEM_FLEX_TUNNEL)
 
 /* Inner Masks. */
 #define MLX5_FLOW_LAYER_INNER_L3 \
@@ -331,18 +341,18 @@ enum mlx5_feature_name {
 
 /* Valid layer type for IPV4 RSS. */
 #define MLX5_IPV4_LAYER_TYPES \
-       (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
-        ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV4_UDP | \
-        ETH_RSS_NONFRAG_IPV4_OTHER)
+       (RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_FRAG_IPV4 | \
+        RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_NONFRAG_IPV4_UDP | \
+        RTE_ETH_RSS_NONFRAG_IPV4_OTHER)
 
 /* IBV hash source bits  for IPV4. */
 #define MLX5_IPV4_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4)
 
 /* Valid layer type for IPV6 RSS. */
 #define MLX5_IPV6_LAYER_TYPES \
-       (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | ETH_RSS_NONFRAG_IPV6_TCP | \
-        ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_IPV6_EX  | ETH_RSS_IPV6_TCP_EX | \
-        ETH_RSS_IPV6_UDP_EX | ETH_RSS_NONFRAG_IPV6_OTHER)
+       (RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_NONFRAG_IPV6_TCP | \
+        RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_IPV6_EX  | RTE_ETH_RSS_IPV6_TCP_EX | \
+        RTE_ETH_RSS_IPV6_UDP_EX | RTE_ETH_RSS_NONFRAG_IPV6_OTHER)
 
 /* IBV hash source bits  for IPV6. */
 #define MLX5_IPV6_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6)
@@ -689,6 +699,7 @@ struct mlx5_flow_handle {
        uint32_t is_meter_flow_id:1; /**< Indate if flow_id is for meter. */
        uint32_t mark:1; /**< Metadate rxq mark flag. */
        uint32_t fate_action:3; /**< Fate action type. */
+       uint32_t flex_item; /**< referenced Flex Item bitmask. */
        union {
                uint32_t rix_hrxq; /**< Hash Rx queue object index. */
                uint32_t rix_jump; /**< Index to the jump action resource. */
@@ -1100,13 +1111,13 @@ struct mlx5_flow_workspace {
 };
 
 struct mlx5_flow_split_info {
-       bool external;
+       uint32_t external:1;
        /**< True if flow is created by request external to PMD. */
-       uint8_t skip_scale; /**< Skip the scale the table with factor. */
+       uint32_t prefix_mark:1; /**< Prefix subflow mark flag. */
+       uint32_t skip_scale:8; /**< Skip the scale the table with factor. */
        uint32_t flow_idx; /**< This memory pool index to the flow. */
-       uint32_t prefix_mark; /**< Prefix subflow mark flag. */
-       uint64_t prefix_layers; /**< Prefix subflow layers. */
        uint32_t table_id; /**< Flow table identifier. */
+       uint64_t prefix_layers; /**< Prefix subflow layers. */
 };
 
 typedef int (*mlx5_flow_validate_t)(struct rte_eth_dev *dev,
@@ -1229,6 +1240,22 @@ typedef int (*mlx5_flow_create_def_policy_t)
                        (struct rte_eth_dev *dev);
 typedef void (*mlx5_flow_destroy_def_policy_t)
                        (struct rte_eth_dev *dev);
+typedef int (*mlx5_flow_discover_priorities_t)
+                       (struct rte_eth_dev *dev,
+                        const uint16_t *vprio, int vprio_n);
+typedef struct rte_flow_item_flex_handle *(*mlx5_flow_item_create_t)
+                       (struct rte_eth_dev *dev,
+                        const struct rte_flow_item_flex_conf *conf,
+                        struct rte_flow_error *error);
+typedef int (*mlx5_flow_item_release_t)
+                       (struct rte_eth_dev *dev,
+                        const struct rte_flow_item_flex_handle *handle,
+                        struct rte_flow_error *error);
+typedef int (*mlx5_flow_item_update_t)
+                       (struct rte_eth_dev *dev,
+                        const struct rte_flow_item_flex_handle *handle,
+                        const struct rte_flow_item_flex_conf *conf,
+                        struct rte_flow_error *error);
 
 struct mlx5_flow_driver_ops {
        mlx5_flow_validate_t validate;
@@ -1263,6 +1290,10 @@ struct mlx5_flow_driver_ops {
        mlx5_flow_action_update_t action_update;
        mlx5_flow_action_query_t action_query;
        mlx5_flow_sync_domain_t sync_domain;
+       mlx5_flow_discover_priorities_t discover_priorities;
+       mlx5_flow_item_create_t item_create;
+       mlx5_flow_item_release_t item_release;
+       mlx5_flow_item_update_t item_update;
 };
 
 /* mlx5_flow.c */
@@ -1334,7 +1365,9 @@ mlx5_aso_meter_by_idx(struct mlx5_priv *priv, uint32_t idx)
        /* Decrease to original index. */
        idx--;
        MLX5_ASSERT(idx / MLX5_ASO_MTRS_PER_POOL < pools_mng->n);
+       rte_rwlock_read_lock(&pools_mng->resize_mtrwl);
        pool = pools_mng->pools[idx / MLX5_ASO_MTRS_PER_POOL];
+       rte_rwlock_read_unlock(&pools_mng->resize_mtrwl);
        return &pool->mtrs[idx % MLX5_ASO_MTRS_PER_POOL];
 }
 
@@ -1573,6 +1606,8 @@ void mlx5_flow_destroy_sub_policy_with_rxq(struct rte_eth_dev *dev,
                struct mlx5_flow_meter_policy *mtr_policy);
 int mlx5_flow_dv_discover_counter_offset_support(struct rte_eth_dev *dev);
 int mlx5_flow_discover_dr_action_support(struct rte_eth_dev *dev);
+int mlx5_action_handle_attach(struct rte_eth_dev *dev);
+int mlx5_action_handle_detach(struct rte_eth_dev *dev);
 int mlx5_action_handle_flush(struct rte_eth_dev *dev);
 void mlx5_release_tunnel_hub(struct mlx5_dev_ctx_shared *sh, uint16_t port_id);
 int mlx5_alloc_tunnel_hub(struct mlx5_dev_ctx_shared *sh);
@@ -1674,6 +1709,11 @@ struct mlx5_list_entry *flow_dv_dest_array_clone_cb(void *tool_ctx,
                                   struct mlx5_list_entry *entry, void *cb_ctx);
 void flow_dv_dest_array_clone_free_cb(void *tool_ctx,
                                      struct mlx5_list_entry *entry);
+int flow_dv_query_count_ptr(struct rte_eth_dev *dev, uint32_t cnt_idx,
+                               void **action, struct rte_flow_error *error);
+int
+flow_dv_query_count(struct rte_eth_dev *dev, uint32_t cnt_idx, void *data,
+                   struct rte_flow_error *error);
 
 struct mlx5_aso_age_action *flow_aso_age_get_by_idx(struct rte_eth_dev *dev,
                                                    uint32_t age_idx);
@@ -1712,6 +1752,4 @@ const struct mlx5_flow_tunnel *
 mlx5_get_tof(const struct rte_flow_item *items,
             const struct rte_flow_action *actions,
             enum mlx5_tof_rule_type *rule_type);
-
-
 #endif /* RTE_PMD_MLX5_FLOW_H_ */