Browse Source

qcacld-3.0: Add sanity check for bmiss configuration from vendor cmd

Add sanity check for bmiss configuration from vendor cmd:
the device mode shall be station mode,
the final beacon miss value can't exceed ini max setting,
vdev_id shall correspond to the interface from vendor cmd.

Change-Id: I7ecdd40f69a8317ccd5362adbcad1159b1792ab7
CRs-Fixed: 2990863
Li Feng 3 years ago
parent
commit
39ef2d2c6d

+ 9 - 0
components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h

@@ -1198,6 +1198,15 @@ QDF_STATUS
 ucfg_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc,
 				    uint8_t *val);
 
+/**
+ * ucfg_mlme_validate_roam_bmiss_final_bcnt() - Validate roam bmiss final bcnt
+ * @bmiss_final_bcnt: Roam bmiss final bcnt
+ *
+ * Return: True if bmiss_final_bcnt is in expected range, false otherwise.
+ */
+bool
+ucfg_mlme_validate_roam_bmiss_final_bcnt(uint32_t bmiss_final_bcnt);
+
 /**
  * ucfg_mlme_get_dual_sta_roaming_enabled() - Get dual sta roaming enable flag
  * @psoc: pointer to psoc object

+ 19 - 0
components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c

@@ -816,6 +816,25 @@ ucfg_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc,
 	return wlan_mlme_get_roam_bmiss_final_bcnt(psoc, val);
 }
 
+bool
+ucfg_mlme_validate_roam_bmiss_final_bcnt(uint32_t bmiss_final_bcnt)
+{
+	bool is_valid = true;
+	uint32_t min, max;
+
+	if (!cfg_in_range(CFG_LFR_ROAM_BMISS_FINAL_BCNT,
+			  bmiss_final_bcnt)) {
+		min = (cfg_min(CFG_LFR_ROAM_BMISS_FINAL_BCNT));
+		max = (cfg_max(CFG_LFR_ROAM_BMISS_FINAL_BCNT));
+		mlme_legacy_err("bmiss final bcnt %d is out of range "
+				"(Min: %d Max: %d)",
+				bmiss_final_bcnt, min, max);
+		is_valid = false;
+	}
+
+	return is_valid;
+}
+
 bool ucfg_mlme_get_dual_sta_roaming_enabled(struct wlan_objmgr_psoc *psoc)
 {
 	return wlan_mlme_get_dual_sta_roaming_enabled(psoc);

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

@@ -8321,6 +8321,11 @@ static int hdd_config_total_beacon_miss_count(struct hdd_adapter *adapter,
 	uint8_t total_miss_count;
 	QDF_STATUS status;
 
+	if (adapter->device_mode != QDF_STA_MODE) {
+		hdd_err("Only supported in sta mode");
+		return -EINVAL;
+	}
+
 	total_miss_count = nla_get_u8(attr);
 	ucfg_mlme_get_roam_bmiss_first_bcnt(hdd_ctx->psoc,
 					    &first_miss_count);
@@ -8332,14 +8337,14 @@ static int hdd_config_total_beacon_miss_count(struct hdd_adapter *adapter,
 
 	final_miss_count = total_miss_count - first_miss_count;
 
+	if (!ucfg_mlme_validate_roam_bmiss_final_bcnt(final_miss_count))
+		return -EINVAL;
+
 	hdd_debug("First count %u, final count %u",
 		  first_miss_count, final_miss_count);
 
-	/*****
-	 * TODO: research why is 0 being passed for vdev id???
-	 */
 	status = sme_set_roam_bmiss_final_bcnt(hdd_ctx->mac_handle,
-					       0,
+					       adapter->vdev_id,
 					       final_miss_count);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		hdd_err("Failed to set final count, status %u", status);