net/mlx5: fix flow mark with sampling and metering
[dpdk.git] / drivers / net / mlx5 / mlx5_flow.h
index 8b83fa6..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. */
@@ -179,6 +180,11 @@ enum mlx5_feature_name {
 /* Conntrack item. */
 #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 \
        (MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L3_IPV6)
@@ -193,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 \
@@ -692,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. */
@@ -1103,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,
@@ -1235,6 +1243,19 @@ typedef void (*mlx5_flow_destroy_def_policy_t)
 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;
@@ -1270,6 +1291,9 @@ struct mlx5_flow_driver_ops {
        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 */
@@ -1582,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);
@@ -1726,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_ */