net/bnxt: switch CFA code to dynamic mbuf field
[dpdk.git] / drivers / net / bnxt / bnxt_flow.c
index 19bc66a..127d51c 100644 (file)
@@ -554,7 +554,7 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,
                        }
 
                        /* Check if VNI is masked. */
-                       if (vxlan_spec && vxlan_mask) {
+                       if (vxlan_mask != NULL) {
                                vni_masked =
                                        !!memcmp(vxlan_mask->vni, vni_mask,
                                                 RTE_DIM(vni_mask));
@@ -1365,6 +1365,8 @@ use_vnic:
                if (vnic->rx_queue_cnt > 1) {
                        vnic->hash_type =
                                bnxt_rte_to_hwrm_hash_types(rss->types);
+                       vnic->hash_mode =
+                       bnxt_rte_to_hwrm_hash_level(bp, rss->types, rss->level);
 
                        if (!rss->key_len) {
                                /* If hash key has not been specified,
@@ -1786,12 +1788,24 @@ bnxt_flow_create(struct rte_eth_dev *dev,
                filter->enables |=
                        HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_L2_FILTER_ID;
                ret = bnxt_hwrm_set_em_filter(bp, filter->dst_id, filter);
+               if (ret != 0) {
+                       rte_flow_error_set(error, -ret,
+                                          RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
+                                          "Failed to create EM filter");
+                       goto free_filter;
+               }
        }
 
        if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER) {
                filter->enables |=
                        HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_L2_FILTER_ID;
                ret = bnxt_hwrm_set_ntuple_filter(bp, filter->dst_id, filter);
+               if (ret != 0) {
+                       rte_flow_error_set(error, -ret,
+                                          RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
+                                          "Failed to create ntuple filter");
+                       goto free_filter;
+               }
        }
 
        vnic = find_matching_vnic(bp, filter);
@@ -1804,9 +1818,6 @@ done:
                        goto free_flow;
                }
 
-               STAILQ_INSERT_TAIL(&vnic->filter, filter, next);
-               PMD_DRV_LOG(DEBUG, "Successfully created flow.\n");
-               STAILQ_INSERT_TAIL(&vnic->flow_list, flow, next);
                if (filter->valid_flags & BNXT_FLOW_MARK_FLAG) {
                        PMD_DRV_LOG(DEBUG,
                                    "Mark action: mark id 0x%x, flow id 0x%x\n",
@@ -1817,19 +1828,25 @@ done:
                         */
                        flow_id = filter->flow_id & BNXT_FLOW_ID_MASK;
                        if (bp->mark_table[flow_id].valid) {
-                               PMD_DRV_LOG(ERR,
-                                           "Entry for Mark id 0x%x occupied"
-                                           " flow id 0x%x\n",
-                                           filter->mark, filter->flow_id);
+                               rte_flow_error_set(error, EEXIST,
+                                                  RTE_FLOW_ERROR_TYPE_HANDLE,
+                                                  NULL,
+                                                  "Flow with mark id exists");
+                               bnxt_clear_one_vnic_filter(bp, filter);
                                goto free_filter;
                        }
                        bp->mark_table[flow_id].valid = true;
                        bp->mark_table[flow_id].mark_id = filter->mark;
                }
+
+               STAILQ_INSERT_TAIL(&vnic->filter, filter, next);
+               STAILQ_INSERT_TAIL(&vnic->flow_list, flow, next);
+
                if (BNXT_FLOW_XSTATS_EN(bp))
                        bp->flow_stat->flow_count++;
                bnxt_release_flow_lock(bp);
                bnxt_setup_flow_counter(bp);
+               PMD_DRV_LOG(DEBUG, "Successfully created flow.\n");
                return flow;
        }
 
@@ -1928,11 +1945,7 @@ _bnxt_flow_destroy(struct bnxt *bp,
                filter->flow_id = 0;
        }
 
-       if (filter->filter_type == HWRM_CFA_EM_FILTER)
-               ret = bnxt_hwrm_clear_em_filter(bp, filter);
-       if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER)
-               ret = bnxt_hwrm_clear_ntuple_filter(bp, filter);
-       ret = bnxt_hwrm_clear_l2_filter(bp, filter);
+       ret = bnxt_clear_one_vnic_filter(bp, filter);
 
 done:
        if (!ret) {