Parcourir la source

qcacld-3.0: clear rate info in mlme priv for non-support rates

When update rate info to vdev mlme_priv, if in current assocrsp
there is no extend rate or mcs rate, need to clear such info.
otherwise such info is still last connection information.
the link rate will display wrongly, test step as:
1 connect with 11g AP
2 config AP to 11b, then connect manually
3 link speed will be wrong on sta side

if extend rate or mcs rate is not present, clear ext_opr_rate_set
and mcs_rate_set.

Change-Id: I8ff1b5804dbbe463d6949d0431079174446c64ad
CRs-Fixed: 3356077
Jingxiang Ge il y a 2 ans
Parent
commit
bf0462e93e

+ 16 - 0
components/mlme/dispatcher/inc/wlan_mlme_api.h

@@ -3613,6 +3613,14 @@ qdf_size_t mlme_get_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
 QDF_STATUS mlme_set_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src,
 				 qdf_size_t len);
 
+/**
+ * mlme_clear_ext_opr_rate() - clear extended operational rate
+ * @vdev: vdev pointer
+ *
+ * Return: QDF_SUCCESS if success
+ */
+QDF_STATUS mlme_clear_ext_opr_rate(struct wlan_objmgr_vdev *vdev);
+
 /**
  * mlme_get_mcs_rate() - get MCS based rate
  * @vdev: vdev pointer
@@ -3635,6 +3643,14 @@ qdf_size_t mlme_get_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
 QDF_STATUS mlme_set_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src,
 			     qdf_size_t len);
 
+/**
+ * mlme_clear_mcs_rate() - clear MCS based rate
+ * @vdev: vdev pointer
+ *
+ * Return: QDF_SUCCESS if success
+ */
+QDF_STATUS mlme_clear_mcs_rate(struct wlan_objmgr_vdev *vdev);
+
 /**
  * wlan_mlme_is_sta_mon_conc_supported() - Check if STA + Monitor mode
  * concurrency is supported

+ 42 - 0
components/mlme/dispatcher/src/wlan_mlme_api.c

@@ -5623,6 +5623,27 @@ QDF_STATUS mlme_set_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src,
 	return QDF_STATUS_SUCCESS;
 }
 
+QDF_STATUS mlme_clear_ext_opr_rate(struct wlan_objmgr_vdev *vdev)
+{
+	struct mlme_legacy_priv *mlme_priv;
+
+	if (!vdev) {
+		mlme_legacy_err("invalid params");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
+	if (!mlme_priv) {
+		mlme_legacy_err("vdev legacy private object is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	mlme_priv->ext_opr_rate_set.len = 0;
+	qdf_mem_set(mlme_priv->ext_opr_rate_set.data, CFG_STR_DATA_LEN, 0);
+
+	return QDF_STATUS_SUCCESS;
+}
+
 qdf_size_t mlme_get_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
 			     qdf_size_t len)
 {
@@ -5679,6 +5700,27 @@ QDF_STATUS mlme_set_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src,
 	return QDF_STATUS_SUCCESS;
 }
 
+QDF_STATUS mlme_clear_mcs_rate(struct wlan_objmgr_vdev *vdev)
+{
+	struct mlme_legacy_priv *mlme_priv;
+
+	if (!vdev) {
+		mlme_legacy_err("invalid params");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
+	if (!mlme_priv) {
+		mlme_legacy_err("vdev legacy private object is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	mlme_priv->mcs_rate_set.len = 0;
+	qdf_mem_set(mlme_priv->mcs_rate_set.data, CFG_STR_DATA_LEN, 0);
+
+	return QDF_STATUS_SUCCESS;
+}
+
 static enum monitor_mode_concurrency
 wlan_mlme_get_monitor_mode_concurrency(struct wlan_objmgr_psoc *psoc)
 {

+ 4 - 0
core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c

@@ -920,9 +920,13 @@ lim_update_vdev_rate_set(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 		mlme_set_ext_opr_rate(vdev,
 				      assoc_resp->extendedRates.rate,
 				      assoc_resp->extendedRates.numRates);
+	else
+		mlme_clear_ext_opr_rate(vdev);
 
 	if (assoc_resp->HTCaps.present)
 		lim_update_mcs_rate_set(vdev, &assoc_resp->HTCaps);
+	else
+		mlme_clear_mcs_rate(vdev);
 
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
 }