net/mlx5: add C++ include guard to public header
[dpdk.git] / drivers / net / mlx5 / mlx5_flow_dv.c
index 9979d16..af90a7f 100644 (file)
@@ -93,20 +93,6 @@ static int
 flow_dv_jump_tbl_resource_release(struct rte_eth_dev *dev,
                                  uint32_t rix_jump);
 
-static inline uint16_t
-mlx5_translate_tunnel_etypes(uint64_t pattern_flags)
-{
-       if (pattern_flags & MLX5_FLOW_LAYER_INNER_L2)
-               return RTE_ETHER_TYPE_TEB;
-       else if (pattern_flags & MLX5_FLOW_LAYER_INNER_L3_IPV4)
-               return RTE_ETHER_TYPE_IPV4;
-       else if (pattern_flags & MLX5_FLOW_LAYER_INNER_L3_IPV6)
-               return RTE_ETHER_TYPE_IPV6;
-       else if (pattern_flags & MLX5_FLOW_LAYER_MPLS)
-               return RTE_ETHER_TYPE_MPLS;
-       return 0;
-}
-
 static int16_t
 flow_dv_get_esw_manager_vport_id(struct rte_eth_dev *dev)
 {
@@ -1503,7 +1489,7 @@ mlx5_flow_field_id_to_modify_info
                        if (data->offset < 16)
                                info[idx++] = (struct field_modify_info){2, 0,
                                                MLX5_MODI_OUT_DMAC_15_0};
-                       info[idx] = (struct field_modify_info){4, 0,
+                       info[idx] = (struct field_modify_info){4, off,
                                                MLX5_MODI_OUT_DMAC_47_16};
                }
                break;
@@ -1533,7 +1519,7 @@ mlx5_flow_field_id_to_modify_info
                        if (data->offset < 16)
                                info[idx++] = (struct field_modify_info){2, 0,
                                                MLX5_MODI_OUT_SMAC_15_0};
-                       info[idx] = (struct field_modify_info){4, 0,
+                       info[idx] = (struct field_modify_info){4, off,
                                                MLX5_MODI_OUT_SMAC_47_16};
                }
                break;
@@ -2032,7 +2018,7 @@ flow_dv_validate_item_meta(struct rte_eth_dev *dev __rte_unused,
                if (reg == REG_NON)
                        return rte_flow_error_set(error, ENOTSUP,
                                        RTE_FLOW_ERROR_TYPE_ITEM, item,
-                                       "unavalable extended metadata register");
+                                       "unavailable extended metadata register");
                if (reg == REG_B)
                        return rte_flow_error_set(error, ENOTSUP,
                                          RTE_FLOW_ERROR_TYPE_ITEM, item,
@@ -3205,7 +3191,7 @@ flow_dv_validate_action_set_meta(struct rte_eth_dev *dev,
        if (reg == REG_NON)
                return rte_flow_error_set(error, ENOTSUP,
                                          RTE_FLOW_ERROR_TYPE_ACTION, action,
-                                         "unavalable extended metadata register");
+                                         "unavailable extended metadata register");
        if (reg != REG_A && reg != REG_B) {
                struct mlx5_priv *priv = dev->data->dev_private;
 
@@ -4982,7 +4968,7 @@ flow_dv_validate_action_jump(struct rte_eth_dev *dev,
                             const struct rte_flow_attr *attributes,
                             bool external, struct rte_flow_error *error)
 {
-       uint32_t target_group, table;
+       uint32_t target_group, table = 0;
        int ret = 0;
        struct flow_grp_info grp_info = {
                .external = !!external,
@@ -5013,6 +4999,10 @@ flow_dv_validate_action_jump(struct rte_eth_dev *dev,
                                          RTE_FLOW_ERROR_TYPE_ACTION, NULL,
                                          "target group must be other than"
                                          " the current flow group");
+       if (table == 0)
+               return rte_flow_error_set(error, EINVAL,
+                                         RTE_FLOW_ERROR_TYPE_ACTION_CONF,
+                                         NULL, "root table shouldn't be destination");
        return 0;
 }
 
@@ -5145,7 +5135,7 @@ flow_dv_modify_hdr_action_max(struct rte_eth_dev *dev __rte_unused,
  *   Pointer to error structure.
  *
  * @return
- *   0 on success, a negative errno value otherwise and rte_ernno is set.
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
  */
 static int
 mlx5_flow_validate_action_meter(struct rte_eth_dev *dev,
@@ -7858,7 +7848,7 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
         * - Explicit decap action is prohibited by the tunnel offload API.
         * - Drop action in tunnel steer rule is prohibited by the API.
         * - Application cannot use MARK action because it's value can mask
-        *   tunnel default miss nitification.
+        *   tunnel default miss notification.
         * - JUMP in tunnel match rule has no support in current PMD
         *   implementation.
         * - TAG & META are reserved for future uses.
@@ -8823,8 +8813,9 @@ flow_dv_translate_item_gre(void *matcher, void *key,
        protocol_v = rte_be_to_cpu_16(gre_v->protocol);
        if (!protocol_m) {
                /* Force next protocol to prevent matchers duplication */
-               protocol_m = 0xFFFF;
                protocol_v = mlx5_translate_tunnel_etypes(pattern_flags);
+               if (protocol_v)
+                       protocol_m = 0xFFFF;
        }
        MLX5_SET(fte_match_set_misc, misc_m, gre_protocol, protocol_m);
        MLX5_SET(fte_match_set_misc, misc_v, gre_protocol,
@@ -9056,7 +9047,6 @@ flow_dv_translate_item_vxlan_gpe(void *matcher, void *key,
        m_protocol = vxlan_m->protocol;
        v_protocol = vxlan_v->protocol;
        if (!m_protocol) {
-               m_protocol = 0xff;
                /* Force next protocol to ensure next headers parsing. */
                if (pattern_flags & MLX5_FLOW_LAYER_INNER_L2)
                        v_protocol = RTE_VXLAN_GPE_TYPE_ETH;
@@ -9064,6 +9054,8 @@ flow_dv_translate_item_vxlan_gpe(void *matcher, void *key,
                        v_protocol = RTE_VXLAN_GPE_TYPE_IPV4;
                else if (pattern_flags & MLX5_FLOW_LAYER_INNER_L3_IPV6)
                        v_protocol = RTE_VXLAN_GPE_TYPE_IPV6;
+               if (v_protocol)
+                       m_protocol = 0xFF;
        }
        MLX5_SET(fte_match_set_misc3, misc_m,
                 outer_vxlan_gpe_next_protocol, m_protocol);
@@ -9134,8 +9126,9 @@ flow_dv_translate_item_geneve(void *matcher, void *key,
        protocol_v = rte_be_to_cpu_16(geneve_v->protocol);
        if (!protocol_m) {
                /* Force next protocol to prevent matchers duplication */
-               protocol_m = 0xFFFF;
                protocol_v = mlx5_translate_tunnel_etypes(pattern_flags);
+               if (protocol_v)
+                       protocol_m = 0xFFFF;
        }
        MLX5_SET(fte_match_set_misc, misc_m, geneve_protocol_type, protocol_m);
        MLX5_SET(fte_match_set_misc, misc_v, geneve_protocol_type,
@@ -9181,7 +9174,7 @@ flow_dev_geneve_tlv_option_resource_register(struct rte_eth_dev *dev,
                        geneve_opt_v->option_type &&
                        geneve_opt_resource->length ==
                        geneve_opt_v->option_len) {
-                       /* We already have GENVE TLV option obj allocated. */
+                       /* We already have GENEVE TLV option obj allocated. */
                        __atomic_fetch_add(&geneve_opt_resource->refcnt, 1,
                                           __ATOMIC_RELAXED);
                } else {
@@ -10223,7 +10216,7 @@ __flow_dv_adjust_buf_size(size_t *size, uint8_t match_criteria)
         * Check flow matching criteria first, subtract misc5/4 length if flow
         * doesn't own misc5/4 parameters. In some old rdma-core releases,
         * misc5/4 are not supported, and matcher creation failure is expected
-        * w/o subtration. If misc5 is provided, misc4 must be counted in since
+        * w/o subtraction. If misc5 is provided, misc4 must be counted in since
         * misc5 is right after misc4.
         */
        if (!(match_criteria & (1 << MLX5_MATCH_CRITERIA_ENABLE_MISC5_BIT))) {
@@ -11422,7 +11415,7 @@ flow_dv_dest_array_create_cb(void *tool_ctx __rte_unused, void *cb_ctx)
                        goto error;
                }
        }
-       /* create a dest array actioin */
+       /* create a dest array action */
        ret = mlx5_os_flow_dr_create_flow_action_dest_array
                                                (domain,
                                                 resource->num_of_dest,
@@ -11657,7 +11650,7 @@ flow_dv_translate_action_sample(struct rte_eth_dev *dev,
                                (((const struct rte_flow_action_mark *)
                                (sub_actions->conf))->id);
 
-                       dev_flow->handle->mark = 1;
+                       wks->mark = 1;
                        pre_rix = dev_flow->handle->dvh.rix_tag;
                        /* Save the mark resource before sample */
                        pre_r = dev_flow->dv.tag_resource;
@@ -12817,7 +12810,7 @@ flow_dv_translate(struct rte_eth_dev *dev,
                        break;
                case RTE_FLOW_ACTION_TYPE_FLAG:
                        action_flags |= MLX5_FLOW_ACTION_FLAG;
-                       dev_flow->handle->mark = 1;
+                       wks->mark = 1;
                        if (dev_conf->dv_xmeta_en != MLX5_XMETA_MODE_LEGACY) {
                                struct rte_flow_action_mark mark = {
                                        .id = MLX5_FLOW_MARK_DEFAULT,
@@ -12846,7 +12839,7 @@ flow_dv_translate(struct rte_eth_dev *dev,
                        break;
                case RTE_FLOW_ACTION_TYPE_MARK:
                        action_flags |= MLX5_FLOW_ACTION_MARK;
-                       dev_flow->handle->mark = 1;
+                       wks->mark = 1;
                        if (dev_conf->dv_xmeta_en != MLX5_XMETA_MODE_LEGACY) {
                                const struct rte_flow_action_mark *mark =
                                        (const struct rte_flow_action_mark *)
@@ -15414,7 +15407,9 @@ __flow_dv_create_domain_policy_acts(struct rte_eth_dev *dev,
                            (MLX5_MAX_MODIFY_NUM + 1)];
        } mhdr_dummy;
        struct mlx5_flow_dv_modify_hdr_resource *mhdr_res = &mhdr_dummy.res;
+       struct mlx5_flow_workspace *wks = mlx5_flow_get_thread_workspace();
 
+       MLX5_ASSERT(wks);
        egress = (domain == MLX5_MTR_DOMAIN_EGRESS) ? 1 : 0;
        transfer = (domain == MLX5_MTR_DOMAIN_TRANSFER) ? 1 : 0;
        memset(&dh, 0, sizeof(struct mlx5_flow_handle));
@@ -15452,7 +15447,7 @@ __flow_dv_create_domain_policy_acts(struct rte_eth_dev *dev,
                                          NULL,
                                          "cannot create policy "
                                          "mark action for this color");
-                               dev_flow.handle->mark = 1;
+                               wks->mark = 1;
                                if (flow_dv_tag_resource_register(dev, tag_be,
                                                  &dev_flow, &flow_err))
                                        return -rte_mtr_error_set(error,
@@ -16877,7 +16872,9 @@ __flow_dv_meter_get_rss_sub_policy(struct rte_eth_dev *dev,
        struct mlx5_meter_policy_action_container *act_cnt;
        uint32_t domain = MLX5_MTR_DOMAIN_INGRESS;
        uint16_t sub_policy_num;
+       struct mlx5_flow_workspace *wks = mlx5_flow_get_thread_workspace();
 
+       MLX5_ASSERT(wks);
        rte_spinlock_lock(&mtr_policy->sl);
        for (i = 0; i < MLX5_MTR_RTE_COLORS; i++) {
                if (!rss_desc[i])
@@ -16951,7 +16948,7 @@ __flow_dv_meter_get_rss_sub_policy(struct rte_eth_dev *dev,
                        if (act_cnt->rix_mark || act_cnt->modify_hdr) {
                                memset(&dh, 0, sizeof(struct mlx5_flow_handle));
                                if (act_cnt->rix_mark)
-                                       dh.mark = 1;
+                                       wks->mark = 1;
                                dh.fate_action = MLX5_FLOW_FATE_QUEUE;
                                dh.rix_hrxq = hrxq_idx[i];
                                flow_drv_rxq_flags_set(dev, &dh);