net/bnxt: allow group ID 0 for RSS action
authorSomnath Kotur <somnath.kotur@broadcom.com>
Tue, 28 Jan 2020 07:29:17 +0000 (12:59 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 5 Feb 2020 08:51:20 +0000 (09:51 +0100)
Allow RSS action with group ID 0. The RSS match check will ensure if
requested RSS action configuration parameters should be allowed as per
the VNIC's RSS configuration or not and if it does match as it is
by design in OVS-DPDK use case, the default vnic can be used to create
the filter. As part of this ensure that rx_queue_cnt for the default
vnic is setup during init as this field was being set only for non-zero
vnics while handling RSS action for flow create.
Check for out of bounds error while accessing the vnic array.

Fixes: adc0f81c6552 ("net/bnxt: support RSS action")
Cc: stable@dpdk.org
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
drivers/net/bnxt/bnxt.h
drivers/net/bnxt/bnxt_ethdev.c
drivers/net/bnxt/bnxt_flow.c

index ddb2681..bca9ad4 100644 (file)
@@ -696,11 +696,23 @@ extern const struct rte_flow_ops bnxt_flow_ops;
 #define bnxt_release_flow_lock(bp) \
        pthread_mutex_unlock(&(bp)->flow_lock)
 
+#define BNXT_VALID_VNIC_OR_RET(bp, vnic_id) do { \
+       if ((vnic_id) >= (bp)->max_vnics) { \
+               rte_flow_error_set(error, \
+                               EINVAL, \
+                               RTE_FLOW_ERROR_TYPE_ATTR_GROUP, \
+                               NULL, \
+                               "Group id is invalid!"); \
+               rc = -rte_errno; \
+               goto ret; \
+       } \
+} while (0)
+
 extern int bnxt_logtype_driver;
 #define PMD_DRV_LOG_RAW(level, fmt, args...) \
        rte_log(RTE_LOG_ ## level, bnxt_logtype_driver, "%s(): " fmt, \
                __func__, ## args)
 
 #define PMD_DRV_LOG(level, fmt, args...) \
-       PMD_DRV_LOG_RAW(level, fmt, ## args)
+         PMD_DRV_LOG_RAW(level, fmt, ## args)
 #endif
index 2ef1169..fc3f1a8 100644 (file)
@@ -295,8 +295,12 @@ static int bnxt_setup_one_vnic(struct bnxt *bp, uint16_t vnic_id)
 
                if (BNXT_HAS_RING_GRPS(bp) && rxq->rx_deferred_start)
                        rxq->vnic->fw_grp_ids[j] = INVALID_HW_RING_ID;
+               else
+                       vnic->rx_queue_cnt++;
        }
 
+       PMD_DRV_LOG(DEBUG, "vnic->rx_queue_cnt = %d\n", vnic->rx_queue_cnt);
+
        rc = bnxt_vnic_rss_configure(bp, vnic);
        if (rc)
                goto err_out;
index 4b3b597..bd6c726 100644 (file)
@@ -1059,16 +1059,9 @@ start:
                        vnic_id = act_q->index;
                }
 
+               BNXT_VALID_VNIC_OR_RET(bp, vnic_id);
+
                vnic = &bp->vnic_info[vnic_id];
-               if (vnic == NULL) {
-                       rte_flow_error_set(error,
-                                          EINVAL,
-                                          RTE_FLOW_ERROR_TYPE_ACTION,
-                                          act,
-                                          "No matching VNIC found.");
-                       rc = -rte_errno;
-                       goto ret;
-               }
                if (vnic->rx_queue_cnt) {
                        if (vnic->start_grp_id != act_q->index) {
                                PMD_DRV_LOG(ERR,
@@ -1268,28 +1261,10 @@ use_vnic:
                rss = (const struct rte_flow_action_rss *)act->conf;
 
                vnic_id = attr->group;
-               if (!vnic_id) {
-                       PMD_DRV_LOG(ERR, "Group id cannot be 0\n");
-                       rte_flow_error_set(error,
-                                          EINVAL,
-                                          RTE_FLOW_ERROR_TYPE_ATTR,
-                                          NULL,
-                                          "Group id cannot be 0");
-                       rc = -rte_errno;
-                       goto ret;
-               }
+
+               BNXT_VALID_VNIC_OR_RET(bp, vnic_id);
 
                vnic = &bp->vnic_info[vnic_id];
-               if (vnic == NULL) {
-                       rte_flow_error_set(error,
-                                          EINVAL,
-                                          RTE_FLOW_ERROR_TYPE_ACTION,
-                                          act,
-                                          "No matching VNIC for RSS group.");
-                       rc = -rte_errno;
-                       goto ret;
-               }
-               PMD_DRV_LOG(DEBUG, "VNIC found\n");
 
                /* Check if requested RSS config matches RSS config of VNIC
                 * only if it is not a fresh VNIC configuration.