net/bnxt: fix freeing all VNICs during port stop
[dpdk.git] / drivers / net / bnxt / bnxt_flow.c
index bf198f8..76e9584 100644 (file)
@@ -17,7 +17,6 @@
 #include "bnxt_ring.h"
 #include "bnxt_rxq.h"
 #include "bnxt_vnic.h"
-#include "bnxt_util.h"
 #include "hsi_struct_def_dpdk.h"
 
 static int
@@ -137,6 +136,7 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,
        const struct rte_flow_item_tcp *tcp_spec, *tcp_mask;
        const struct rte_flow_item_udp *udp_spec, *udp_mask;
        const struct rte_flow_item_eth *eth_spec, *eth_mask;
+       const struct rte_ether_addr *dst, *src;
        const struct rte_flow_item_nvgre *nvgre_spec;
        const struct rte_flow_item_nvgre *nvgre_mask;
        const struct rte_flow_item_gre *gre_spec;
@@ -162,7 +162,7 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,
        PMD_DRV_LOG(DEBUG, "Use NTUPLE %d\n", use_ntuple);
 
        filter->filter_type = use_ntuple ?
-               HWRM_CFA_NTUPLE_FILTER : HWRM_CFA_EM_FILTER;
+               HWRM_CFA_NTUPLE_FILTER : HWRM_CFA_L2_FILTER;
        en_ethertype = use_ntuple ?
                NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE :
                EM_FLOW_ALLOC_INPUT_EN_ETHERTYPE;
@@ -177,14 +177,6 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,
                        return -rte_errno;
                }
 
-               if (!item->spec || !item->mask) {
-                       rte_flow_error_set(error, EINVAL,
-                                          RTE_FLOW_ERROR_TYPE_ITEM,
-                                          item,
-                                          "spec/mask is NULL");
-                       return -rte_errno;
-               }
-
                switch (item->type) {
                case RTE_FLOW_ITEM_TYPE_ANY:
                        inner =
@@ -227,12 +219,15 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,
                        }
 
                        if (rte_is_broadcast_ether_addr(&eth_mask->dst)) {
-                               if (!rte_is_unicast_ether_addr(&eth_spec->dst)) {
+                               dst = &eth_spec->dst;
+                               if (!rte_is_valid_assigned_ether_addr(dst)) {
                                        rte_flow_error_set(error,
                                                           EINVAL,
                                                           RTE_FLOW_ERROR_TYPE_ITEM,
                                                           item,
                                                           "DMAC is invalid");
+                                       PMD_DRV_LOG(ERR,
+                                                   "DMAC is invalid!\n");
                                        return -rte_errno;
                                }
                                rte_memcpy(filter->dst_macaddr,
@@ -247,14 +242,16 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp,
                                PMD_DRV_LOG(DEBUG,
                                            "Creating a priority flow\n");
                        }
-
                        if (rte_is_broadcast_ether_addr(&eth_mask->src)) {
-                               if (!rte_is_unicast_ether_addr(&eth_spec->src)) {
+                               src = &eth_spec->src;
+                               if (!rte_is_valid_assigned_ether_addr(src)) {
                                        rte_flow_error_set(error,
                                                           EINVAL,
                                                           RTE_FLOW_ERROR_TYPE_ITEM,
                                                           item,
                                                           "SMAC is invalid");
+                                       PMD_DRV_LOG(ERR,
+                                                   "SMAC is invalid!\n");
                                        return -rte_errno;
                                }
                                rte_memcpy(filter->src_macaddr,
@@ -1088,13 +1085,7 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev,
                    vnic->fw_vnic_id != INVALID_HW_RING_ID)
                        goto use_vnic;
 
-               //if (!rxq ||
-                   //bp->vnic_info[0].fw_grp_ids[act_q->index] !=
-                   //INVALID_HW_RING_ID ||
-                   //!rxq->rx_deferred_start) {
-               if (!rxq ||
-                   bp->vnic_info[0].fw_grp_ids[act_q->index] !=
-                   INVALID_HW_RING_ID) {
+               if (!rxq) {
                        PMD_DRV_LOG(ERR,
                                    "Queue invalid or used with other VNIC\n");
                        rte_flow_error_set(error,
@@ -1321,9 +1312,6 @@ use_vnic:
                        }
                        rxq = bp->rx_queues[rss->queue[i]];
 
-                       //if (bp->vnic_info[0].fw_grp_ids[rss->queue[i]] !=
-                           //INVALID_HW_RING_ID ||
-                           //!rxq->rx_deferred_start) {
                        if (bp->vnic_info[0].fw_grp_ids[rss->queue[i]] !=
                            INVALID_HW_RING_ID) {
                                PMD_DRV_LOG(ERR,
@@ -1760,7 +1748,7 @@ done:
                }
 
                STAILQ_INSERT_TAIL(&vnic->filter, filter, next);
-               PMD_DRV_LOG(ERR, "Successfully created flow.\n");
+               PMD_DRV_LOG(DEBUG, "Successfully created flow.\n");
                STAILQ_INSERT_TAIL(&vnic->flow_list, flow, next);
                bnxt_release_flow_lock(bp);
                return flow;