Prechádzať zdrojové kódy

qcacld-3.0: Don't send sta keepalive time greater than configured val

currently if bss_max_idle_period is greater than default configured
value of sta_keep_alive then same value will be sent to FW. If any
AP sets bss_max_idle_period to greater than sta_keep_alive then reset
is not done on vdev stop due to which same value will be set for
new connection.

Fix is to not to send bss_max_idle_period as time period limit because
same value is updated in bss_max_idle_period of interface. So, default
configured value of sta_keep_alive_timer is required to be passed for
threshold validation. value reset is required once vdev stop happens
to avoid same keep alive even if bss_max_idle_period is not advertised
by AP.

CRs-Fixed: 3861815
Change-Id: I457a436a4c8a561600e93b3d5deaa0399fbd2c7d
Sheenam Monga 1 rok pred
rodič
commit
35c8eefa9e

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

@@ -5002,4 +5002,27 @@ void wlan_mlme_set_keepalive_period(struct wlan_objmgr_vdev *vdev,
  * Return: Keep alive period.
  */
 uint16_t wlan_mlme_get_keepalive_period(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * wlan_mlme_reset_sta_keepalive_period() - Reset keep alive period to default
+ * cfg whether it is set by userspace or via assoc rsp
+ * @psoc: pointer to psoc object
+ * @vdev: VDEV object
+ *
+ * Return: None
+ */
+void wlan_mlme_reset_sta_keepalive_period(struct wlan_objmgr_psoc *psoc,
+					  struct wlan_objmgr_vdev *vdev);
+
+/**
+ * wlan_mlme_get_sta_keep_alive_period() - get keep alive period
+ * @psoc: pointer to psoc object
+ * @keep_alive_period: keep alive period
+ *
+ * Return: QDF STATUS
+ */
+QDF_STATUS
+wlan_mlme_get_sta_keep_alive_period(struct wlan_objmgr_psoc *psoc,
+				    uint32_t *keep_alive_period);
+
 #endif /* _WLAN_MLME_API_H_ */

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

@@ -8432,3 +8432,44 @@ uint16_t wlan_mlme_get_keepalive_period(struct wlan_objmgr_vdev *vdev)
 
 	return mlme_priv->keep_alive_period;
 }
+
+void wlan_mlme_reset_sta_keepalive_period(struct wlan_objmgr_psoc *psoc,
+					  struct wlan_objmgr_vdev *vdev)
+{
+       struct mlme_legacy_priv *mlme_priv;
+       struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+       mlme_obj = mlme_get_psoc_ext_obj(psoc);
+       if (!mlme_obj) {
+	       mlme_err("invalid mlem object");
+	       return;
+       }
+       mlme_obj->cfg.sta.sta_keep_alive_period =
+		cfg_default(CFG_INFRA_STA_KEEP_ALIVE_PERIOD);
+       mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
+       if (!mlme_priv) {
+               mlme_err("vdev legacy private object is NULL");
+               return;
+       }
+
+       mlme_priv->keep_alive_period =
+                       cfg_default(CFG_INFRA_STA_KEEP_ALIVE_PERIOD);
+}
+
+QDF_STATUS
+wlan_mlme_get_sta_keep_alive_period(struct wlan_objmgr_psoc *psoc,
+                                    uint32_t *keep_alive_period)
+{
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj) {
+		*keep_alive_period =
+				cfg_default(CFG_INFRA_STA_KEEP_ALIVE_PERIOD);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	*keep_alive_period = mlme_obj->cfg.sta.sta_keep_alive_period;
+
+        return QDF_STATUS_SUCCESS;
+}

+ 1 - 11
components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c

@@ -251,17 +251,7 @@ QDF_STATUS
 ucfg_mlme_get_sta_keep_alive_period(struct wlan_objmgr_psoc *psoc,
 				    uint32_t *val)
 {
-	struct wlan_mlme_psoc_ext_obj *mlme_obj;
-
-	mlme_obj = mlme_get_psoc_ext_obj(psoc);
-	if (!mlme_obj) {
-		*val = cfg_default(CFG_INFRA_STA_KEEP_ALIVE_PERIOD);
-		return QDF_STATUS_E_INVAL;
-	}
-
-	*val = mlme_obj->cfg.sta.sta_keep_alive_period;
-
-	return QDF_STATUS_SUCCESS;
+	return wlan_mlme_get_sta_keep_alive_period(psoc, val);
 }
 
 QDF_STATUS

+ 9 - 11
core/wma/src/wma_dev_if.c

@@ -4142,7 +4142,6 @@ void wma_remove_req(tp_wma_handle wma, uint8_t vdev_id,
  * @shortSlotTimeSupported: short slot time
  * @llbCoexist: llbCoexist
  * @maxTxPower: max tx power
- * @bss_max_idle_period: BSS max idle period
  *
  * Return: QDF_STATUS
  */
@@ -4150,14 +4149,14 @@ static QDF_STATUS
 wma_vdev_set_bss_params(tp_wma_handle wma, int vdev_id,
 			tSirMacBeaconInterval beaconInterval,
 			uint8_t dtimPeriod, uint8_t shortSlotTimeSupported,
-			uint8_t llbCoexist, int8_t maxTxPower,
-			uint16_t bss_max_idle_period)
+			uint8_t llbCoexist, int8_t maxTxPower)
 {
 	uint32_t slot_time;
 	struct wma_txrx_node *intr = wma->interfaces;
 	struct dev_set_param setparam[MAX_VDEV_SET_BSS_PARAMS];
 	uint8_t index = 0;
 	enum ieee80211_protmode prot_mode;
+	uint32_t keep_alive_period;
 	QDF_STATUS ret;
 
 	ret = QDF_STATUS_E_FAILURE;
@@ -4235,11 +4234,12 @@ wma_vdev_set_bss_params(tp_wma_handle wma, int vdev_id,
 		goto error;
 	}
 	mlme_set_max_reg_power(intr[vdev_id].vdev, maxTxPower);
-	if (bss_max_idle_period)
-		wma_set_sta_keep_alive(
+	wlan_mlme_get_sta_keep_alive_period(wma->psoc,
+					    &keep_alive_period);
+	wma_set_sta_keep_alive(
 				wma, vdev_id,
 				SIR_KEEP_ALIVE_NULL_PKT,
-				bss_max_idle_period,
+				keep_alive_period,
 				NULL, NULL, NULL);
 error:
 	return ret;
@@ -4394,7 +4394,7 @@ QDF_STATUS wma_post_vdev_start_setup(uint8_t vdev_id)
 				    mlme_obj->proto.generic.dtim_period,
 				    mlme_obj->proto.generic.slot_time,
 				    mlme_obj->proto.generic.protection_mode,
-				    bss_power, 0)) {
+				    bss_power)) {
 		wma_err("Failed to set wma_vdev_set_bss_params");
 	}
 
@@ -4711,8 +4711,7 @@ QDF_STATUS wma_send_peer_assoc_req(struct bss_params *add_bss)
 				    add_bss->dtimPeriod,
 				    add_bss->shortSlotTimeSupported,
 				    add_bss->llbCoexist,
-				    add_bss->maxTxPower,
-				    add_bss->bss_max_idle_period)) {
+				    add_bss->maxTxPower)) {
 		wma_err("Failed to set bss params");
 	}
 
@@ -5414,8 +5413,7 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params)
 	if (wma_vdev_set_bss_params(wma, params->smesessionId,
 				    iface->beaconInterval, iface->dtimPeriod,
 				    iface->shortSlotTimeSupported,
-				    iface->llbCoexist, maxTxPower,
-				    iface->bss_max_idle_period)) {
+				    iface->llbCoexist, maxTxPower)) {
 		wma_err("Failed to bss params");
 	}
 

+ 3 - 1
core/wma/src/wma_utils.c

@@ -4081,12 +4081,14 @@ QDF_STATUS wma_send_vdev_stop_to_fw(t_wma_handle *wma, uint8_t vdev_id)
 		return status;
 	}
 
+	wlan_mlme_reset_sta_keepalive_period(wma->psoc, iface->vdev);
+	iface->bss_max_idle_period = 0;
+
 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(iface->vdev);
 	if (!vdev_mlme) {
 		wma_err("Failed to get vdev mlme obj for vdev id %d", vdev_id);
 		return status;
 	}
-
 	/*
 	 * Reset the dynamic nss chains config to the ini values, as when the
 	 * vdev gets its started again, this would be a fresh connection,