Browse Source

qcacld-3.0: Reject SET_TX_ANT_CONFIG for invalid nss values

Currently when driver receives SET_TX_ANT_CONFIG command, it
doesn't check if tx/rx nss values are allowed for the
existing connection and sends chain mask configuration
command to fw.

To address this issue, reject SET_TX_ANT_CONFIG command,
if given tx/rx nss value is greater than connection's
intersected nss.

Change-Id: I58078d8dd6c9e04ccedad26b79a7dc3a040e9ef6
CRs-Fixed: 3476639
Asutosh Mohapatra 1 year ago
parent
commit
244ccb3411
2 changed files with 26 additions and 4 deletions
  1. 18 0
      core/hdd/src/wlan_hdd_cfg.c
  2. 8 4
      core/hdd/src/wlan_hdd_cfg80211.c

+ 18 - 0
core/hdd/src/wlan_hdd_cfg.c

@@ -1104,6 +1104,7 @@ hdd_set_nss_params(struct hdd_adapter *adapter,
 	struct wlan_mlme_nss_chains user_cfg;
 	mac_handle_t mac_handle;
 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
+	struct wlan_objmgr_vdev *vdev;
 
 	qdf_mem_zero(&user_cfg, sizeof(user_cfg));
 
@@ -1113,6 +1114,23 @@ hdd_set_nss_params(struct hdd_adapter *adapter,
 		return QDF_STATUS_E_INVAL;
 	}
 
+	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(hdd_ctx->pdev,
+						    adapter->deflink->vdev_id,
+						    WLAN_HDD_ID_OBJ_MGR);
+	if (!vdev) {
+		hdd_err("vdev is NULL %d", adapter->deflink->vdev_id);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	if (tx_nss > wlan_vdev_mlme_get_nss(vdev) ||
+	    rx_nss > wlan_vdev_mlme_get_nss(vdev)) {
+		hdd_err("Given tx nss/rx nss is greater than intersected nss = %d",
+			wlan_vdev_mlme_get_nss(vdev));
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
+		return QDF_STATUS_E_FAILURE;
+	}
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
+
 	for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++)
 		hdd_populate_vdev_nss(&user_cfg, tx_nss,
 				      rx_nss, band);

+ 8 - 4
core/hdd/src/wlan_hdd_cfg80211.c

@@ -8872,8 +8872,10 @@ static int hdd_config_tx_rx_nss(struct hdd_adapter *adapter,
 	struct nlattr *rx_attr =
 		tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_NSS];
 
-	if (!tx_attr && !rx_attr)
-		return 0;
+	if (!tx_attr && !rx_attr) {
+		hdd_err("Missing TX and RX attributes");
+		return -EINVAL;
+	}
 
 	/* if one is present, both must be present */
 	if (!tx_attr || !rx_attr) {
@@ -8890,11 +8892,13 @@ static int hdd_config_tx_rx_nss(struct hdd_adapter *adapter,
 	      (tx_nss == 2 && rx_nss == 2))) {
 		hdd_err("Setting tx_nss %d rx_nss %d not allowed", tx_nss,
 			rx_nss);
-		return 0;
+		return -EINVAL;
 	}
 	status = hdd_update_nss(adapter, tx_nss, rx_nss);
-	if (status != QDF_STATUS_SUCCESS)
+	if (status != QDF_STATUS_SUCCESS) {
 		hdd_debug("Can't set tx_nss %d rx_nss %d", tx_nss, rx_nss);
+		return -EINVAL;
+	}
 
 	return 0;
 }