Browse Source

qcacld-3.0: Add self bss roam check for connnect cmd

Add self bss roam check in roam invoke cmd handler,
If ini enable_self_bss_roam is 0, don't permit to roam
to current connected bss, just keep current connection.

Change-Id: I7fe724e26d15bcc008957829e4e3384c60b58773
CRs-Fixed: 3069587
Jianmin Zhu 3 years ago
parent
commit
22dd408968

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

@@ -2790,6 +2790,17 @@ wlan_mlme_get_idle_roam_min_rssi(struct wlan_objmgr_psoc *psoc, uint32_t *val);
  */
 QDF_STATUS
 wlan_mlme_get_idle_roam_band(struct wlan_objmgr_psoc *psoc, uint32_t *val);
+
+/**
+ * wlan_mlme_get_self_bss_roam() - Get self bss roam enable status
+ * @psoc: pointer to psoc object
+ * @enable_self_bss_roam:  Pointer to self bss roam enable status
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+wlan_mlme_get_self_bss_roam(struct wlan_objmgr_psoc *psoc,
+			    uint8_t *enable_self_bss_roam);
 #else
 static inline QDF_STATUS
 wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,

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

@@ -4462,6 +4462,25 @@ wlan_mlme_get_idle_roam_band(struct wlan_objmgr_psoc *psoc, uint32_t *val)
 
 	return QDF_STATUS_SUCCESS;
 }
+
+QDF_STATUS
+wlan_mlme_get_self_bss_roam(struct wlan_objmgr_psoc *psoc,
+			    uint8_t *enable_self_bss_roam)
+{
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+
+	if (!mlme_obj) {
+		*enable_self_bss_roam =
+			cfg_get(psoc, CFG_LFR3_ENABLE_SELF_BSS_ROAM);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	*enable_self_bss_roam = mlme_obj->cfg.lfr.enable_self_bss_roam;
+
+	return QDF_STATUS_SUCCESS;
+}
 #endif
 
 QDF_STATUS

+ 9 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

@@ -5072,6 +5072,7 @@ cm_send_roam_invoke_req(struct cnx_mgr *cm_ctx, struct cm_req *req)
 	struct roam_invoke_req *roam_invoke_req = NULL;
 	wlan_cm_id cm_id;
 	uint8_t vdev_id;
+	uint8_t enable_self_bss_roam = false;
 
 	if (!req)
 		return QDF_STATUS_E_FAILURE;
@@ -5097,6 +5098,14 @@ cm_send_roam_invoke_req(struct cnx_mgr *cm_ctx, struct cm_req *req)
 	}
 
 	wlan_vdev_get_bss_peer_mac(cm_ctx->vdev, &connected_bssid);
+	wlan_mlme_get_self_bss_roam(psoc, &enable_self_bss_roam);
+	if (!enable_self_bss_roam &&
+	    qdf_is_macaddr_equal(&roam_req->req.bssid, &connected_bssid)) {
+		mlme_err(CM_PREFIX_FMT "self bss roam disabled",
+			 CM_PREFIX_REF(vdev_id, cm_id));
+		status = QDF_STATUS_E_FAILURE;
+		goto roam_err;
+	}
 
 	roam_invoke_req = qdf_mem_malloc(sizeof(*roam_invoke_req));
 	if (!roam_invoke_req) {