Browse Source

qcacld-3.0: Move rso related process to connection manager [PART 3]

Add new code to implement below functions for connection manager
roam part:

Propagate 'Change-Id: I49d64671f74b86c516d286c4b2aad69eda744b52'
Filling below WMI cmd parameters related process:
WMI_ROAM_AP_PROFILE
WMI_ROAM_FILTER_CMDID

Change-Id: I4870c69a0e0ca1e8cad734a591f09e402b7a32fa
CRs-Fixed: 2745468
hqu 4 years ago
parent
commit
bc1e6476b7

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

@@ -2505,6 +2505,17 @@ wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,
  * Return: Roaming triggers value
  */
 uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc);
+
+/**
+ * wlan_mlme_get_roaming_offload() - Get roaming offload setting
+ * @psoc: pointer to psoc object
+ * @val:  Pointer to enable/disable roaming offload
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc,
+			      bool *val);
 #else
 static inline QDF_STATUS
 wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,
@@ -2525,6 +2536,15 @@ uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc)
 {
 	return 0xFFFF;
 }
+
+static inline QDF_STATUS
+wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc,
+			      bool *val)
+{
+	*val = false;
+
+	return QDF_STATUS_SUCCESS;
+}
 #endif
 
 /**

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

@@ -3915,6 +3915,23 @@ uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc)
 
 	return mlme_obj->cfg.lfr.roam_trigger_bitmap;
 }
+
+QDF_STATUS
+wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc,
+			      bool *val)
+{
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj) {
+		*val = cfg_default(CFG_LFR3_ROAMING_OFFLOAD);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	*val = mlme_obj->cfg.lfr.lfr3_roaming_offload;
+
+	return QDF_STATUS_SUCCESS;
+}
 #endif
 
 QDF_STATUS

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

@@ -773,17 +773,7 @@ QDF_STATUS
 ucfg_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc,
 			      bool *val)
 {
-	struct wlan_mlme_psoc_ext_obj *mlme_obj;
-
-	mlme_obj = mlme_get_psoc_ext_obj(psoc);
-	if (!mlme_obj) {
-		*val = cfg_default(CFG_LFR3_ROAMING_OFFLOAD);
-		return QDF_STATUS_E_INVAL;
-	}
-
-	*val = mlme_obj->cfg.lfr.lfr3_roaming_offload;
-
-	return QDF_STATUS_SUCCESS;
+	return wlan_mlme_get_roaming_offload(psoc, val);
 }
 
 QDF_STATUS

+ 218 - 1
components/target_if/connection_mgr/src/target_if_cm_roam_offload.c

@@ -23,6 +23,8 @@
 #include "target_if.h"
 #include "wmi_unified_sta_api.h"
 #include "wlan_mlme_dbg.h"
+#include "wlan_mlme_api.h"
+#include "wlan_crypto_global_api.h"
 
 #if defined(WLAN_FEATURE_ROAM_OFFLOAD) || defined(ROAM_OFFLOAD_V1)
 static struct wmi_unified
@@ -210,6 +212,36 @@ target_if_cm_roam_triggers(wmi_unified_t wmi_handle,
 
 	return wmi_unified_set_roam_triggers(wmi_handle, req);
 }
+
+/**
+ * target_if_cm_roam_scan_get_cckm_mode() - Get the CCKM auth mode
+ * @vdev: vdev object
+ * @auth_mode: Auth mode to be converted
+ *
+ * Based on LFR2.0 or LFR3.0, return the proper auth type
+ *
+ * Return: if LFR2.0, then return WMI_AUTH_CCKM for backward compatibility
+ *         if LFR3.0 then return the appropriate auth type
+ */
+static uint32_t
+target_if_cm_roam_scan_get_cckm_mode(struct wlan_objmgr_vdev *vdev,
+				     uint32_t auth_mode)
+{
+	struct wlan_objmgr_psoc *psoc;
+	bool roam_offload_enable;
+
+	psoc = wlan_vdev_get_psoc(vdev);
+	if (!psoc) {
+		target_if_err("psoc handle is NULL");
+		return WMI_AUTH_CCKM;
+	}
+
+	wlan_mlme_get_roaming_offload(psoc, &roam_offload_enable);
+	if (roam_offload_enable)
+		return auth_mode;
+	else
+		return WMI_AUTH_CCKM;
+}
 #else
 static void
 target_if_cm_roam_reason_vsie(wmi_unified_t wmi_handle,
@@ -223,8 +255,14 @@ target_if_cm_roam_triggers(wmi_unified_t wmi_handle,
 {
 	return QDF_STATUS_E_NOSUPPORT;
 }
-#endif
 
+static uint32_t
+target_if_cm_roam_scan_get_cckm_mode(struct wlan_objmgr_vdev *vdev,
+				     uint32_t auth_mode)
+{
+	return WMI_AUTH_CCKM;
+}
+#endif
 /**
  * target_if_cm_roam_scan_offload_rssi_thresh() - Send roam scan rssi threshold
  * commands to wmi
@@ -362,6 +400,171 @@ target_if_cm_roam_scan_offload_scan_period(
 	return wmi_unified_roam_scan_offload_scan_period(wmi_handle, req);
 }
 
+#ifdef WLAN_FEATURE_11W
+/**
+ * target_if_roam_fill_11w_params() - Fill the 11w related parameters
+ * for ap profile
+ * @vdev: vdev object
+ * @req: roam ap profile parameters
+ *
+ * Return: None
+ */
+static void
+target_if_cm_roam_fill_11w_params(struct wlan_objmgr_vdev *vdev,
+				  struct ap_profile_params *req)
+{
+	uint32_t group_mgmt_cipher;
+	uint16_t rsn_caps;
+	bool peer_rmf_capable = false;
+	uint32_t keymgmt;
+
+	if (!vdev) {
+		target_if_err("Invalid vdev");
+		return;
+	}
+
+	rsn_caps = (uint16_t)wlan_crypto_get_param(vdev,
+						   WLAN_CRYPTO_PARAM_RSN_CAP);
+	if (wlan_crypto_vdev_has_mgmtcipher(
+					vdev,
+					(1 << WLAN_CRYPTO_CIPHER_AES_GMAC) |
+					(1 << WLAN_CRYPTO_CIPHER_AES_GMAC_256) |
+					(1 << WLAN_CRYPTO_CIPHER_AES_CMAC)) &&
+					(rsn_caps &
+					 WLAN_CRYPTO_RSN_CAP_MFP_ENABLED))
+		peer_rmf_capable = true;
+
+	keymgmt = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_MGMT_CIPHER);
+
+	if (keymgmt & (1 << WLAN_CRYPTO_CIPHER_AES_CMAC))
+		group_mgmt_cipher = WMI_CIPHER_AES_CMAC;
+	else if (keymgmt & (1 << WLAN_CRYPTO_CIPHER_AES_GMAC))
+		group_mgmt_cipher = WMI_CIPHER_AES_GMAC;
+	else if (keymgmt & (1 << WLAN_CRYPTO_CIPHER_AES_GMAC_256))
+		group_mgmt_cipher = WMI_CIPHER_BIP_GMAC_256;
+	 else
+		group_mgmt_cipher = WMI_CIPHER_NONE;
+
+	if (peer_rmf_capable) {
+		req->profile.rsn_mcastmgmtcipherset = group_mgmt_cipher;
+		req->profile.flags |= WMI_AP_PROFILE_FLAG_PMF;
+	} else {
+		req->profile.rsn_mcastmgmtcipherset = WMI_CIPHER_NONE;
+	}
+}
+#else
+static inline
+void target_if_cm_roam_fill_11w_params(struct wlan_objmgr_vdev *vdev,
+				       struct ap_profile_params *req)
+{}
+#endif
+
+/**
+ * target_if_cm_roam_scan_offload_ap_profile() - send roam ap profile to
+ * firmware
+ * @vdev: vdev object
+ * @wmi_handle: wmi handle
+ * @req: roam ap profile parameters
+ *
+ * Send WMI_ROAM_AP_PROFILE parameters to firmware
+ *
+ * Return: QDF status
+ */
+static QDF_STATUS
+target_if_cm_roam_scan_offload_ap_profile(
+				struct wlan_objmgr_vdev *vdev,
+				wmi_unified_t wmi_handle,
+				struct ap_profile_params *req)
+{
+	uint32_t rsn_authmode;
+	bool db2dbm_enabled;
+
+	if (!target_if_is_vdev_valid(req->vdev_id)) {
+		target_if_err("Invalid vdev id:%d", req->vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	rsn_authmode = req->profile.rsn_authmode;
+	if (rsn_authmode == WMI_AUTH_CCKM_WPA ||
+	    rsn_authmode == WMI_AUTH_CCKM_RSNA)
+		req->profile.rsn_authmode =
+		target_if_cm_roam_scan_get_cckm_mode(vdev, rsn_authmode);
+
+	target_if_cm_roam_fill_11w_params(vdev, req);
+
+	db2dbm_enabled = wmi_service_enabled(wmi_handle,
+					     wmi_service_hw_db2dbm_support);
+	if (!req->profile.rssi_abs_thresh) {
+		if (db2dbm_enabled)
+			req->profile.rssi_abs_thresh = RSSI_MIN_VALUE;
+	} else {
+		if (!db2dbm_enabled)
+			req->profile.rssi_abs_thresh -=
+						NOISE_FLOOR_DBM_DEFAULT;
+	}
+
+	if (!db2dbm_enabled) {
+		req->min_rssi_params[DEAUTH_MIN_RSSI].min_rssi -=
+						NOISE_FLOOR_DBM_DEFAULT;
+		req->min_rssi_params[DEAUTH_MIN_RSSI].min_rssi &= 0x000000ff;
+
+		req->min_rssi_params[BMISS_MIN_RSSI].min_rssi -=
+						NOISE_FLOOR_DBM_DEFAULT;
+		req->min_rssi_params[BMISS_MIN_RSSI].min_rssi &= 0x000000ff;
+	}
+
+	return wmi_unified_send_roam_scan_offload_ap_cmd(wmi_handle, req);
+}
+
+/**
+ * target_if_cm_roam_scan_filter() - send roam scan filter to firmware
+ * @wmi_handle: wmi handle
+ * @command: rso command
+ * @req: roam scan filter parameters
+ *
+ * Send WMI_ROAM_FILTER_CMDID parameters to firmware
+ *
+ * Return: QDF status
+ */
+static QDF_STATUS
+target_if_cm_roam_scan_filter(wmi_unified_t wmi_handle, uint8_t command,
+			      struct wlan_roam_scan_filter_params *req)
+{
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+
+	if (!target_if_is_vdev_valid(req->filter_params.vdev_id)) {
+		target_if_err("Invalid vdev id:%d",
+			      req->filter_params.vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (command != ROAM_SCAN_OFFLOAD_STOP) {
+		switch (req->reason) {
+		case REASON_ROAM_SET_BLACKLIST_BSSID:
+		case REASON_ROAM_SET_SSID_ALLOWED:
+		case REASON_ROAM_SET_FAVORED_BSSID:
+			break;
+		case REASON_CTX_INIT:
+			if (command == ROAM_SCAN_OFFLOAD_START) {
+				req->filter_params.op_bitmap |=
+				ROAM_FILTER_OP_BITMAP_LCA_DISALLOW |
+				ROAM_FILTER_OP_BITMAP_RSSI_REJECTION_OCE;
+			} else {
+				target_if_debug("Roam Filter need not be sent");
+				return QDF_STATUS_SUCCESS;
+			}
+			break;
+		default:
+			target_if_debug("Roam Filter need not be sent");
+			return QDF_STATUS_SUCCESS;
+		}
+	}
+
+	status = wmi_unified_roam_scan_filter_cmd(wmi_handle,
+						  &req->filter_params);
+	return status;
+}
+
 /**
  * target_if_cm_roam_send_roam_start() - Send roam start related commands
  * to wmi
@@ -414,6 +617,20 @@ target_if_cm_roam_send_roam_start(struct wlan_objmgr_vdev *vdev,
 			goto end;
 	}
 
+	status = target_if_cm_roam_scan_offload_ap_profile(
+							vdev, wmi_handle,
+							&req->profile_params);
+	if (QDF_IS_STATUS_ERROR(status))
+		goto end;
+
+	status = target_if_cm_roam_scan_filter(wmi_handle,
+					       ROAM_SCAN_OFFLOAD_START,
+					       &req->scan_filter_params);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		target_if_err("Sending start for roam scan filter failed");
+		goto end;
+	}
+
 	/* add other wmi commands */
 end:
 	return status;

+ 22 - 5
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

@@ -188,11 +188,9 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc,
  * process directly, generate a new function wlan_cm_roam_send_rso_cmd
  * for external usage.
  */
-QDF_STATUS
-cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
-		     uint8_t vdev_id,
-		     uint8_t rso_command,
-		     uint8_t reason)
+QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
+				uint8_t vdev_id, uint8_t rso_command,
+				uint8_t reason)
 {
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 
@@ -279,6 +277,21 @@ cm_roam_switch_to_rso_stop(struct wlan_objmgr_pdev *pdev,
 	return QDF_STATUS_SUCCESS;
 }
 
+static void cm_roam_roam_invoke_in_progress(struct wlan_objmgr_psoc *psoc,
+					    uint8_t vdev_id, bool set)
+{
+	struct wlan_objmgr_vdev *vdev;
+	struct mlme_roam_after_data_stall *vdev_roam_params;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+						    WLAN_MLME_NB_ID);
+	if (!vdev)
+		return;
+	vdev_roam_params = mlme_get_roam_invoke_params(vdev);
+	if (vdev_roam_params)
+		vdev_roam_params->roam_invoke_in_progress = set;
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
+}
 /**
  * cm_roam_switch_to_deinit() - roam state handling for roam deinit
  * @pdev: pdev pointer
@@ -298,6 +311,8 @@ cm_roam_switch_to_deinit(struct wlan_objmgr_pdev *pdev,
 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
 	enum roam_offload_state cur_state = mlme_get_roam_state(psoc, vdev_id);
 
+	cm_roam_roam_invoke_in_progress(psoc, vdev_id, false);
+
 	switch (cur_state) {
 	/*
 	 * If RSO stop is not done already, send RSO stop first and
@@ -356,6 +371,8 @@ cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
 	QDF_STATUS status;
 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
 
+	cm_roam_roam_invoke_in_progress(psoc, vdev_id, false);
+
 	dual_sta_roam_active =
 		wlan_mlme_get_dual_sta_roaming_enabled(psoc);
 

+ 17 - 15
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h

@@ -28,38 +28,40 @@
 #include "wlan_cm_roam_public_srtuct.h"
 
 #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
+
 /**
- * cm_roam_send_rso_cmd() - Send rso command
- * @psoc: psoc pointer
+ * cm_roam_state_change() - Post roam state change to roam state machine
+ * @pdev: pdev pointer
  * @vdev_id: vdev id
- * @rso_command: roam scan offload command
+ * @requested_state: roam state to be set
  * @reason: reason for changing roam state for the requested vdev id
  *
- * This function is used to send rso command
+ * This function posts roam state change to roam state machine handling
  *
  * Return: QDF_STATUS
  */
 QDF_STATUS
-cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
+cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
 		     uint8_t vdev_id,
-		     uint8_t rso_command,
+		     enum roam_offload_state requested_state,
 		     uint8_t reason);
 
 /**
- * cm_roam_state_change() - Post roam state change to roam state machine
- * @pdev: pdev pointer
+ * cm_roam_send_rso_cmd() - send rso command
+ * @psoc: psoc pointer
  * @vdev_id: vdev id
- * @requested_state: roam state to be set
+ * @rso_command: roam command to send
  * @reason: reason for changing roam state for the requested vdev id
  *
- * This function posts roam state change to roam state machine handling
+ * similar to csr_roam_offload_scan, will be used from many legacy
+ * process directly, generate a new function wlan_cm_roam_send_rso_cmd
+ * for external usage.
  *
  * Return: QDF_STATUS
  */
-QDF_STATUS
-cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
-		     uint8_t vdev_id,
-		     enum roam_offload_state requested_state,
-		     uint8_t reason);
+QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
+				uint8_t vdev_id, uint8_t rso_command,
+				uint8_t reason);
+
 #endif
 #endif

+ 71 - 48
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h

@@ -45,21 +45,6 @@ QDF_STATUS
 wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
 					uint8_t vdev_id);
 
-/**
- * wlan_cm_start_roaming() - start roaming
- * @pdev: pdev pointer
- * @vdev_id: vdev id
- * @reason: reason to roam
- *
- * This function gets called to start roaming
- *
- * Return: QDF_STATUS
- */
-QDF_STATUS
-wlan_cm_start_roaming(struct wlan_objmgr_pdev *pdev,
-		      uint8_t vdev_id,
-		      uint8_t reason);
-
 /**
  * wlan_cm_roam_cmd_allowed() - check roam cmd is allowed or not
  * @psoc: pointer to psoc object
@@ -93,22 +78,6 @@ wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc,
 			    uint8_t vdev_id,
 			    struct wlan_roam_start_config *req,
 			    uint8_t reason);
-
-/**
- * wlan_cm_roam_send_rso_cmd() - Send rso command
- * @psoc: psoc pointer
- * @vdev_id: vdev id
- * @rso_command: roam scan offload command
- * @reason: reason for changing roam state for the requested vdev id
- *
- * This function is used to send rso command
- *
- * Return: QDF_STATUS
- */
-QDF_STATUS wlan_cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
-				     uint8_t vdev_id,
-				     uint8_t rso_command,
-				     uint8_t reason);
 #else
 static inline QDF_STATUS
 wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
@@ -116,23 +85,6 @@ wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
 {
 	return QDF_STATUS_E_NOSUPPORT;
 }
-
-static inline QDF_STATUS
-wlan_cm_start_roaming(struct wlan_objmgr_pdev *pdev,
-		      uint8_t vdev_id,
-		      uint8_t reason)
-{
-	return QDF_STATUS_E_NOSUPPORT;
-}
-
-static inline QDF_STATUS
-wlan_cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
-			  uint8_t vdev_id,
-			  uint8_t rso_command,
-			  uint8_t reason);
-{
-	return QDF_STATUS_E_NOSUPPORT;
-}
 #endif
 
 /**
@@ -157,6 +109,77 @@ QDF_STATUS cm_roam_release_lock(void);
  */
 char
 *cm_roam_get_requestor_string(enum wlan_cm_rso_control_requestor requestor);
+
+/**
+ * ucfg_cm_rso_init_deinit  - Init or Deinit roaming module at firmware
+ * @pdev: Pointer to pdev
+ * @vdev_id: vdev id
+ * @enable: true: Send RSO init and RSO enable
+ *          false: Send RSO stop
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev,
+				   uint8_t vdev_id, bool enable);
+
+/**
+ * wlan_cm_disable_rso  - Disable roam scan offload to firmware
+ * @pdev: Pointer to pdev
+ * @vdev_id: vdev id
+ * @requestor: RSO disable requestor
+ * @reason: Reason for RSO disable
+ *
+ * Return:  QDF_STATUS
+ */
+QDF_STATUS wlan_cm_disable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id,
+			       enum wlan_cm_rso_control_requestor requestor,
+			       uint8_t reason);
+
+/**
+ * ucfg_cm_enable_rso  - Enable roam scan offload to firmware
+ * @pdev: Pointer to pdev
+ * @vdev_id: vdev id
+ * @requestor: RSO disable requestor
+ * @reason: Reason for RSO disable
+ *
+ * Return:  QDF_STATUS
+ */
+QDF_STATUS wlan_cm_enable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id,
+			      enum wlan_cm_rso_control_requestor requestor,
+			      uint8_t reason);
+
+/**
+ * wlan_cm_roam_state_change() - Post roam state change to roam state machine
+ * @pdev: pdev pointer
+ * @vdev_id: vdev id
+ * @requested_state: roam state to be set
+ * @reason: reason for changing roam state for the requested vdev id
+ *
+ * This function posts roam state change to roam state machine handling
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
+				     uint8_t vdev_id,
+				     enum roam_offload_state requested_state,
+				     uint8_t reason);
+
+/**
+ * wlan_cm_roam_send_rso_cmd() - send rso command
+ * @psoc: psoc pointer
+ * @vdev_id: vdev id
+ * @rso_command: roam command to send
+ * @reason: reason for changing roam state for the requested vdev id
+ *
+ * similar to csr_roam_offload_scan, will be used from many legacy
+ * process directly, generate a new function wlan_cm_roam_send_rso_cmd
+ * for external usage.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
+				     uint8_t vdev_id, uint8_t rso_command,
+				     uint8_t reason);
 #endif
 
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD

+ 276 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_srtuct.h

@@ -23,6 +23,8 @@
 
 #include "wlan_objmgr_cmn.h"
 #include "reg_services_public_struct.h"
+#include "wlan_cm_bss_score_param.h"
+#include "wlan_blm_public_struct.h"
 #include "wmi_unified_param.h"
 #include "wmi_unified_sta_param.h"
 
@@ -117,6 +119,276 @@ struct wlan_roam_triggers {
 	struct wlan_cm_roam_vendor_btm_params vendor_btm_param;
 };
 
+/**
+ * struct ap_profile - Structure ap profile to match candidate
+ * @flags: flags
+ * @rssi_threshold: the value of the the candidate AP should higher by this
+ *                  threshold than the rssi of the currrently associated AP
+ * @ssid: ssid vlaue to be matched
+ * @rsn_authmode: security params to be matched
+ * @rsn_ucastcipherset: unicast cipher set
+ * @rsn_mcastcipherset: mcast/group cipher set
+ * @rsn_mcastmgmtcipherset: mcast/group management frames cipher set
+ * @rssi_abs_thresh: the value of the candidate AP should higher than this
+ *                   absolute RSSI threshold. Zero means no absolute minimum
+ *                   RSSI is required. units are the offset from the noise
+ *                   floor in dB
+ */
+struct ap_profile {
+	uint32_t flags;
+	uint32_t rssi_threshold;
+	struct wlan_ssid  ssid;
+	uint32_t rsn_authmode;
+	uint32_t rsn_ucastcipherset;
+	uint32_t rsn_mcastcipherset;
+	uint32_t rsn_mcastmgmtcipherset;
+	uint32_t rssi_abs_thresh;
+};
+
+/**
+ * struct scoring_param - scoring param to sortlist selected AP
+ * @disable_bitmap: Each bit will be either allow(0)/disallow(1) to
+ *                 considered the roam score param.
+ * @rssi_weightage: RSSI weightage out of total score in %
+ * @ht_weightage: HT weightage out of total score in %.
+ * @vht_weightage: VHT weightage out of total score in %.
+ * @he_weightaget: 11ax weightage out of total score in %.
+ * @bw_weightage: Bandwidth weightage out of total score in %.
+ * @band_weightage: Band(2G/5G) weightage out of total score in %.
+ * @nss_weightage: NSS(1x1 / 2x2)weightage out of total score in %.
+ * @esp_qbss_weightage: ESP/QBSS weightage out of total score in %.
+ * @beamforming_weightage: Beamforming weightage out of total score in %.
+ * @pcl_weightage: PCL weightage out of total score in %.
+ * @oce_wan_weightage OCE WAN metrics weightage out of total score in %.
+ * @oce_ap_tx_pwr_weightage: OCE AP TX power score in %
+ * @oce_subnet_id_weightage: OCE subnet id score in %
+ * @bw_index_score: channel BW scoring percentage information.
+ *                 BITS 0-7   :- It contains scoring percentage of 20MHz   BW
+ *                 BITS 8-15  :- It contains scoring percentage of 40MHz   BW
+ *                 BITS 16-23 :- It contains scoring percentage of 80MHz   BW
+ *                 BITS 24-31 :- It contains scoring percentage of 1600MHz BW
+ *                 The value of each index must be 0-100
+ * @band_index_score: band scording percentage information.
+ *                   BITS 0-7   :- It contains scoring percentage of 2G
+ *                   BITS 8-15  :- It contains scoring percentage of 5G
+ *                   BITS 16-23 :- reserved
+ *                   BITS 24-31 :- reserved
+ *                   The value of each index must be 0-100
+ * @nss_index_score: NSS scoring percentage information.
+ *                  BITS 0-7   :- It contains scoring percentage of 1x1
+ *                  BITS 8-15  :- It contains scoring percentage of 2x2
+ *                  BITS 16-23 :- It contains scoring percentage of 3x3
+ *                  BITS 24-31 :- It contains scoring percentage of 4x4
+ *                  The value of each index must be 0-100
+ * @roam_score_delta: delta value expected over the roam score of the candidate
+ * ap over the roam score of the current ap
+ * @roam_trigger_bitmap: bitmap of roam triggers on which roam_score_delta
+ * will be applied
+ * @vendor_roam_score_algorithm: Preferred algorithm for roam candidate selection
+ * @cand_min_roam_score_delta: candidate min roam score delta value
+ * @rssi_scoring: RSSI scoring information.
+ * @esp_qbss_scoring: ESP/QBSS scoring percentage information
+ * @oce_wan_scoring: OCE WAN metrics percentage information
+ */
+struct scoring_param {
+	uint32_t disable_bitmap;
+	int32_t rssi_weightage;
+	int32_t ht_weightage;
+	int32_t vht_weightage;
+	int32_t he_weightage;
+	int32_t bw_weightage;
+	int32_t band_weightage;
+	int32_t nss_weightage;
+	int32_t esp_qbss_weightage;
+	int32_t beamforming_weightage;
+	int32_t pcl_weightage;
+	int32_t oce_wan_weightage;
+	uint32_t oce_ap_tx_pwr_weightage;
+	uint32_t oce_subnet_id_weightage;
+	uint32_t bw_index_score;
+	uint32_t band_index_score;
+	uint32_t nss_index_score;
+	uint32_t roam_score_delta;
+	uint32_t roam_trigger_bitmap;
+	uint32_t vendor_roam_score_algorithm;
+	uint32_t cand_min_roam_score_delta;
+	struct rssi_config_score rssi_scoring;
+	struct per_slot_score esp_qbss_scoring;
+	struct per_slot_score oce_wan_scoring;
+};
+
+/*
+ * Currently roam score delta value and min rssi values are sent
+ * for 2 triggers
+ */
+#define NUM_OF_ROAM_TRIGGERS 2
+#define IDLE_ROAM_TRIGGER 0
+#define BTM_ROAM_TRIGGER  1
+
+#define DEAUTH_MIN_RSSI 0
+#define BMISS_MIN_RSSI  1
+
+/**
+ * enum roam_trigger_reason - Reason for triggering roam
+ * ROAM_TRIGGER_REASON_NONE: Roam trigger reason none
+ * ROAM_TRIGGER_REASON_PER:  Roam triggered due to packet error
+ * ROAM_TRIGGER_REASON_BMISS: Roam triggered due to beacon miss
+ * ROAM_TRIGGER_REASON_LOW_RSSI: Roam triggered due to low RSSI of current
+ * connected AP.
+ * ROAM_TRIGGER_REASON_HIGH_RSSI: Roam triggered because sta is connected to
+ * a AP in 2.4GHz band and a better 5GHz AP is available
+ * ROAM_TRIGGER_REASON_PERIODIC: Roam triggered as better AP was found during
+ * periodic roam scan.
+ * ROAM_TRIGGER_REASON_MAWC: Motion Aided WiFi Connectivity triggered roam.
+ * ROAM_TRIGGER_REASON_DENSE: Roaming triggered due to dense environment
+ * detected.
+ * ROAM_TRIGGER_REASON_BACKGROUND: Roam triggered due to current AP having
+ * poor rssi and scan candidate found in scan results provided by other
+ * scan clients.
+ * ROAM_TRIGGER_REASON_FORCED: Forced roam trigger.
+ * ROAM_TRIGGER_REASON_BTM: Roam triggered due to AP sent BTM query with
+ * Disassoc imminent bit set.
+ * ROAM_TRIGGER_REASON_UNIT_TEST: Roam triggered due to unit test command.
+ * ROAM_TRIGGER_REASON_BSS_LOAD: Roam triggered due to high channel utilization
+ * in the current connected channel
+ * ROAM_TRIGGER_REASON_DEAUTH: Roam triggered due to deauth received from the
+ * current connected AP.
+ * ROAM_TRIGGER_REASON_IDLE: Roam triggered due to inactivity of the device.
+ * ROAM_TRIGGER_REASON_STA_KICKOUT: Roam triggered due to sta kickout event.
+ * ROAM_TRIGGER_REASON_ESS_RSSI: Roam triggered due to ess rssi
+ * ROAM_TRIGGER_REASON_WTC_BTM: Roam triggered due to WTC BTM
+ * ROAM_TRIGGER_REASON_MAX: Maximum number of roam triggers
+ */
+enum roam_trigger_reason {
+	ROAM_TRIGGER_REASON_NONE = 0,
+	ROAM_TRIGGER_REASON_PER,
+	ROAM_TRIGGER_REASON_BMISS,
+	ROAM_TRIGGER_REASON_LOW_RSSI,
+	ROAM_TRIGGER_REASON_HIGH_RSSI,
+	ROAM_TRIGGER_REASON_PERIODIC,
+	ROAM_TRIGGER_REASON_MAWC,
+	ROAM_TRIGGER_REASON_DENSE,
+	ROAM_TRIGGER_REASON_BACKGROUND,
+	ROAM_TRIGGER_REASON_FORCED,
+	ROAM_TRIGGER_REASON_BTM,
+	ROAM_TRIGGER_REASON_UNIT_TEST,
+	ROAM_TRIGGER_REASON_BSS_LOAD,
+	ROAM_TRIGGER_REASON_DEAUTH,
+	ROAM_TRIGGER_REASON_IDLE,
+	ROAM_TRIGGER_REASON_STA_KICKOUT,
+	ROAM_TRIGGER_REASON_ESS_RSSI,
+	ROAM_TRIGGER_REASON_WTC_BTM,
+	ROAM_TRIGGER_REASON_MAX,
+};
+
+/**
+ * struct roam_trigger_min_rssi - structure to hold minimum rssi value of
+ * candidate APs for each roam trigger
+ * @min_rssi: minimum RSSI of candidate AP for the trigger reason specified in
+ * trigger_id
+ * @trigger_reason: Roam trigger reason
+ */
+struct roam_trigger_min_rssi {
+	int32_t  min_rssi;
+	enum roam_trigger_reason trigger_reason;
+};
+
+/**
+ * struct roam_trigger_score_delta - structure to hold roam score delta value of
+ * candidate APs for each roam trigger
+ * @roam_score_delta: delta value in score of the candidate AP for the roam
+ * trigger mentioned in the trigger_id.
+ * @trigger_reason: Roam trigger reason
+ */
+struct roam_trigger_score_delta {
+	uint32_t roam_score_delta;
+	enum roam_trigger_reason trigger_reason;
+};
+
+/**
+ * struct ap_profile_params - ap profile params
+ * @vdev_id: vdev id
+ * @profile: ap profile to match candidate
+ * @param: scoring params to short candidate
+ * @min_rssi_params: Min RSSI values for different roam triggers
+ * @score_delta_params: Roam score delta values for different triggers
+ */
+struct ap_profile_params {
+	uint8_t vdev_id;
+	struct ap_profile profile;
+	struct scoring_param param;
+	struct roam_trigger_min_rssi min_rssi_params[NUM_OF_ROAM_TRIGGERS];
+	struct roam_trigger_score_delta score_delta_param[NUM_OF_ROAM_TRIGGERS];
+};
+
+#define MAX_SSID_ALLOWED_LIST    4
+#define MAX_BSSID_AVOID_LIST     16
+#define MAX_BSSID_FAVORED      16
+
+/**
+ * struct roam_scan_filter_params - Structure holding roaming scan
+ *                                  parameters
+ * @op_bitmap: bitmap to determine reason of roaming
+ * @vdev_id: vdev id
+ * @num_bssid_black_list: The number of BSSID's that we should avoid
+ *                        connecting to. It is like a blacklist of BSSID's.
+ * @num_ssid_white_list: The number of SSID profiles that are in the
+ *                       Whitelist. When roaming, we consider the BSSID's with
+ *                       this SSID also for roaming apart from the connected
+ *                       one's
+ * @num_bssid_preferred_list: Number of BSSID's which have a preference over
+ *                            others
+ * @bssid_avoid_list: Blacklist SSID's
+ * @ssid_allowed_list: Whitelist SSID's
+ * @bssid_favored: Favorable BSSID's
+ * @bssid_favored_factor: RSSI to be added to this BSSID to prefer it
+ * @lca_disallow_config_present: LCA [Last Connected AP] disallow config
+ *                               present
+ * @disallow_duration: How long LCA AP will be disallowed before it can be a
+ *                     roaming candidate again, in seconds
+ * @rssi_channel_penalization: How much RSSI will be penalized if candidate(s)
+ *                             are found in the same channel as disallowed
+ *                             AP's, in units of db
+ * @num_disallowed_aps: How many APs the target should maintain in its LCA
+ *                      list
+ * @delta_rssi: (dB units) when AB in RSSI blacklist improved by at least
+ *              delta_rssi,it will be removed from blacklist
+ *
+ * This structure holds all the key parameters related to
+ * initial connection and roaming connections.
+ */
+
+struct roam_scan_filter_params {
+	uint32_t op_bitmap;
+	uint8_t vdev_id;
+	uint32_t num_bssid_black_list;
+	uint32_t num_ssid_white_list;
+	uint32_t num_bssid_preferred_list;
+	struct qdf_mac_addr bssid_avoid_list[MAX_BSSID_AVOID_LIST];
+	struct wlan_ssid ssid_allowed_list[MAX_SSID_ALLOWED_LIST];
+	struct qdf_mac_addr bssid_favored[MAX_BSSID_FAVORED];
+	uint8_t bssid_favored_factor[MAX_BSSID_FAVORED];
+	uint8_t lca_disallow_config_present;
+	uint32_t disallow_duration;
+	uint32_t rssi_channel_penalization;
+	uint32_t num_disallowed_aps;
+	uint32_t num_rssi_rejection_ap;
+	struct reject_ap_config_params
+				rssi_rejection_ap[MAX_RSSI_AVOID_BSSID_LIST];
+	uint32_t delta_rssi;
+};
+
+/**
+ * struct wlan_roam_scan_filter_params - structure containing parameters for
+ * roam scan offload filter
+ * @reason: reason for changing roam state for the requested vdev id
+ * @filter_params: roam scan filter parameters
+ */
+struct wlan_roam_scan_filter_params {
+	uint8_t reason;
+	struct roam_scan_filter_params filter_params;
+};
+
 #ifdef ROAM_OFFLOAD_V1
 #define NOISE_FLOOR_DBM_DEFAULT          (-96)
 #define RSSI_MIN_VALUE                   (-128)
@@ -240,6 +512,8 @@ struct wlan_roam_scan_period_params {
  * @reason_vsie_enable: roam reason vsie enable parameters
  * @roam_triggers: roam triggers parameters
  * @scan_period_params: roam scan period parameters
+ * @profile_params: ap profile parameters
+ * @scan_filter_params: roam scan filter parameters
  */
 struct wlan_roam_start_config {
 	struct wlan_roam_offload_scan_rssi_params rssi_params;
@@ -247,6 +521,8 @@ struct wlan_roam_start_config {
 	struct wlan_roam_reason_vsie_enable reason_vsie_enable;
 	struct wlan_roam_triggers roam_triggers;
 	struct wlan_roam_scan_period_params scan_period_params;
+	struct ap_profile_params profile_params;
+	struct wlan_roam_scan_filter_params scan_filter_params;
 	/* other wmi cmd structures */
 };
 

+ 30 - 5
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h

@@ -23,7 +23,10 @@
 #ifndef _WLAN_CM_ROAM_UCFG_API_H_
 #define _WLAN_CM_ROAM_UCFG_API_H_
 
+#include "wlan_cm_roam_api.h"
+
 #ifdef ROAM_OFFLOAD_V1
+
 /**
  * ucfg_user_space_enable_disable_rso  - Enable/Disable Roam Scan offload
  * to firmware.
@@ -40,6 +43,17 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev,
 				   uint8_t vdev_id,
 				   const bool is_fast_roam_enabled);
 
+/*
+ * ucfg_cm_abort_roam_scan() -abort current roam scan cycle by roam scan
+ * offload module.
+ * @pdev: Pointer to pdev
+ * vdev_id - vdev Identifier
+ *
+ * Return QDF_STATUS
+ */
+QDF_STATUS ucfg_cm_abort_roam_scan(struct wlan_objmgr_pdev *pdev,
+				   uint8_t vdev_id);
+
 /**
  * ucfg_cm_rso_init_deinit  - Init or Deinit roaming module at firmware
  * @pdev: Pointer to pdev
@@ -49,9 +63,12 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev,
  *
  * Return: QDF_STATUS
  */
-QDF_STATUS
-ucfg_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev,
-			uint8_t vdev_id, bool enable);
+static inline QDF_STATUS
+ucfg_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
+			bool enable)
+{
+	return wlan_cm_rso_init_deinit(pdev, vdev_id, enable);
+}
 
 /**
  * ucfg_cm_disable_rso  - Disable roam scan offload to firmware
@@ -62,9 +79,13 @@ ucfg_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev,
  *
  * Return:  QDF_STATUS
  */
+static inline
 QDF_STATUS ucfg_cm_disable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id,
 			       enum wlan_cm_rso_control_requestor requestor,
-			       uint8_t reason);
+			       uint8_t reason)
+{
+	return wlan_cm_disable_rso(pdev, vdev_id, requestor, reason);
+}
 
 /**
  * ucfg_cm_enable_rso  - Enable roam scan offload to firmware
@@ -75,8 +96,12 @@ QDF_STATUS ucfg_cm_disable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id,
  *
  * Return:  QDF_STATUS
  */
+static inline
 QDF_STATUS ucfg_cm_enable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id,
 			      enum wlan_cm_rso_control_requestor requestor,
-			      uint8_t reason);
+			      uint8_t reason)
+{
+	return wlan_cm_enable_rso(pdev, vdev_id, requestor, reason);
+}
 #endif
 #endif

+ 102 - 33
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c

@@ -75,23 +75,115 @@ wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
 				    WLAN_ROAM_RSO_ENABLED,
 				    REASON_CTX_INIT);
 }
+#endif
 
-QDF_STATUS wlan_cm_start_roaming(struct wlan_objmgr_pdev *pdev,
-				 uint8_t vdev_id, uint8_t reason)
+char *cm_roam_get_requestor_string(enum wlan_cm_rso_control_requestor requestor)
 {
-	return cm_roam_state_change(pdev, vdev_id,
-				    WLAN_ROAM_RSO_ENABLED, reason);
+	switch (requestor) {
+	case RSO_INVALID_REQUESTOR:
+	default:
+		return "No requestor";
+	case RSO_START_BSS:
+		return "SAP start";
+	case RSO_CHANNEL_SWITCH:
+		return "CSA";
+	case RSO_CONNECT_START:
+		return "STA connection";
+	case RSO_SAP_CHANNEL_CHANGE:
+		return "SAP Ch switch";
+	case RSO_NDP_CON_ON_NDI:
+		return "NDP connection";
+	case RSO_SET_PCL:
+		return "Set PCL";
+	}
 }
 
-QDF_STATUS wlan_cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
+QDF_STATUS
+wlan_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
+			bool enable)
+{
+	uint8_t reason = REASON_SUPPLICANT_DE_INIT_ROAMING;
+	QDF_STATUS status;
+
+	status = cm_roam_acquire_lock();
+	if (QDF_IS_STATUS_ERROR(status))
+		return QDF_STATUS_E_FAILURE;
+
+	if (enable)
+		reason = REASON_SUPPLICANT_INIT_ROAMING;
+
+	status = cm_roam_state_change(
+			pdev, vdev_id,
+			enable ? WLAN_ROAM_RSO_ENABLED : WLAN_ROAM_DEINIT,
+			reason);
+	cm_roam_release_lock();
+
+	return status;
+}
+
+QDF_STATUS wlan_cm_disable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id,
+			       enum wlan_cm_rso_control_requestor requestor,
+			       uint8_t reason)
+{
+	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
+	QDF_STATUS status;
+
+	status = cm_roam_acquire_lock();
+	if (QDF_IS_STATUS_ERROR(status))
+		return QDF_STATUS_E_FAILURE;
+
+	if (reason == REASON_DRIVER_DISABLED && requestor)
+		mlme_set_operations_bitmap(psoc, vdev_id, requestor, false);
+
+	mlme_debug("ROAM_CONFIG: vdev[%d] Disable roaming - requestor:%s",
+		   vdev_id, cm_roam_get_requestor_string(requestor));
+
+	status = cm_roam_state_change(pdev, vdev_id, WLAN_ROAM_RSO_STOPPED,
+				      REASON_DRIVER_DISABLED);
+	cm_roam_release_lock();
+
+	return status;
+}
+
+QDF_STATUS wlan_cm_enable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id,
+			      enum wlan_cm_rso_control_requestor requestor,
+			      uint8_t reason)
+{
+	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
+	QDF_STATUS status;
+
+	if (reason == REASON_DRIVER_DISABLED && requestor)
+		mlme_set_operations_bitmap(psoc, vdev_id, requestor, true);
+
+	status = cm_roam_acquire_lock();
+	if (QDF_IS_STATUS_ERROR(status))
+		return QDF_STATUS_E_FAILURE;
+
+	mlme_debug("ROAM_CONFIG: vdev[%d] Enable roaming - requestor:%s",
+		   vdev_id, cm_roam_get_requestor_string(requestor));
+
+	status = cm_roam_state_change(pdev, vdev_id, WLAN_ROAM_RSO_ENABLED,
+				      REASON_DRIVER_ENABLED);
+	cm_roam_release_lock();
+
+	return status;
+}
+
+QDF_STATUS wlan_cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
 				     uint8_t vdev_id,
-				     uint8_t rso_command,
+				     enum roam_offload_state requested_state,
+				     uint8_t reason)
+{
+	return cm_roam_state_change(pdev, vdev_id, requested_state, reason);
+}
+
+QDF_STATUS wlan_cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
+				     uint8_t vdev_id, uint8_t rso_command,
 				     uint8_t reason)
 {
 	return cm_roam_send_rso_cmd(psoc, vdev_id, rso_command, reason);
 }
 #endif
-#endif
 
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 QDF_STATUS
@@ -142,8 +234,8 @@ void wlan_cm_roam_activate_pcl_per_vdev(struct wlan_objmgr_psoc *psoc,
 
 	/* value - true (vdev pcl) false - pdev pcl */
 	mlme_priv->cm_roam.pcl_vdev_cmd_active = pcl_per_vdev;
-	mlme_legacy_debug("CM_ROAM: vdev[%d] SET PCL cmd level - [%s]", vdev_id,
-			  pcl_per_vdev ? "VDEV" : "PDEV");
+	mlme_debug("CM_ROAM: vdev[%d] SET PCL cmd level - [%s]", vdev_id,
+		   pcl_per_vdev ? "VDEV" : "PDEV");
 }
 
 bool wlan_cm_roam_is_pcl_per_vdev_active(struct wlan_objmgr_psoc *psoc,
@@ -227,7 +319,7 @@ wlan_cm_dual_sta_roam_update_connect_channels(struct wlan_objmgr_psoc *psoc,
 	status = policy_mgr_get_valid_chans(psoc, channel_list,
 					    &num_channels);
 	if (QDF_IS_STATUS_ERROR(status)) {
-		mlme_legacy_err("Error in getting valid channels");
+		mlme_err("Error in getting valid channels");
 		qdf_mem_free(channel_list);
 		return;
 	}
@@ -329,26 +421,3 @@ wlan_cm_roam_get_vendor_btm_params(struct wlan_objmgr_psoc *psoc,
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
 }
 #endif
-
-#ifdef ROAM_OFFLOAD_V1
-char *cm_roam_get_requestor_string(enum wlan_cm_rso_control_requestor requestor)
-{
-	switch (requestor) {
-	case RSO_INVALID_REQUESTOR:
-	default:
-		return "No requestor";
-	case RSO_START_BSS:
-		return "SAP start";
-	case RSO_CHANNEL_SWITCH:
-		return "CSA";
-	case RSO_CONNECT_START:
-		return "STA connection";
-	case RSO_SAP_CHANNEL_CHANGE:
-		return "SAP Ch switch";
-	case RSO_NDP_CON_ON_NDI:
-		return "NDP connection";
-	case RSO_SET_PCL:
-		return "Set PCL";
-	}
-}
-#endif

+ 18 - 64
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_ucfg_api.c

@@ -20,7 +20,9 @@
  * Implementation for roaming ucfg public functionality.
  */
 
+#include "wlan_mlme_ucfg_api.h"
 #include "wlan_cm_roam_ucfg_api.h"
+#include "../../core/src/wlan_cm_roam_offload.h"
 
 #ifdef ROAM_OFFLOAD_V1
 QDF_STATUS
@@ -31,6 +33,8 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev,
 	bool supplicant_disabled_roaming;
 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
 	QDF_STATUS status;
+	bool lfr_enabled;
+	enum roam_offload_state state;
 
 	/*
 	 * If the ini "FastRoamEnabled" is disabled, don't allow the
@@ -38,7 +42,8 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev,
 	 */
 	ucfg_mlme_is_lfr_enabled(psoc, &lfr_enabled);
 	if (!lfr_enabled) {
-		mlme_legacy_debug("ROAM_CONFIG: Fast roam ini is disabled");
+		mlme_debug("ROAM_CONFIG: Fast roam ini is disabled. is_fast_roam_enabled %d",
+			   is_fast_roam_enabled);
 		if (!is_fast_roam_enabled)
 			return QDF_STATUS_SUCCESS;
 
@@ -56,7 +61,7 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev,
 	supplicant_disabled_roaming =
 		mlme_get_supplicant_disabled_roaming(psoc, vdev_id);
 	if (!is_fast_roam_enabled && supplicant_disabled_roaming) {
-		mlme_legacy_debug("ROAM_CONFIG: RSO already disabled by supplicant");
+		mlme_debug("ROAM_CONFIG: RSO already disabled by supplicant");
 		return QDF_STATUS_E_ALREADY;
 	}
 
@@ -71,76 +76,25 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev,
 	return status;
 }
 
-/*
- * Driver internally invoked RSO operation/configuration APIs.
- */
-QDF_STATUS
-ucfg_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev,
-			uint8_t vdev_id, bool enable)
+QDF_STATUS ucfg_cm_abort_roam_scan(struct wlan_objmgr_pdev *pdev,
+				   uint8_t vdev_id)
 {
-	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
-	uint8_t reason = REASON_SUPPLICANT_DE_INIT_ROAMING;
 	QDF_STATUS status;
-
-	status = cm_roam_acquire_lock();
-	if (QDF_IS_STATUS_ERROR(status))
-		return QDF_STATUS_E_FAILURE;
-
-	if (enable)
-		reason = REASON_SUPPLICANT_INIT_ROAMING;
-
-	status = cm_roam_state_change(
-			pdev, vdev_id,
-			enable ? WLAN_ROAM_RSO_ENABLED : WLAN_ROAM_DEINIT,
-			reason);
-	cm_roam_release_lock();
-
-	return status;
-}
-
-QDF_STATUS ucfg_cm_disable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id,
-			       enum wlan_cm_rso_control_requestor requestor,
-			       uint8_t reason)
-{
 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
-	QDF_STATUS status;
+	bool roam_scan_offload_enabled;
 
-	status = cm_roam_acquire_lock();
-	if (QDF_IS_STATUS_ERROR(status))
-		return QDF_STATUS_E_FAILURE;
-
-	if (reason == REASON_DRIVER_DISABLED && requestor)
-		mlme_set_operations_bitmap(psoc, vdev_id, requestor, false);
-
-	mlme_legacy_debug("ROAM_CONFIG: vdev[%d] Disable roaming - requestor:%s",
-			  vdev_id, cm_roam_get_requestor_string(requestor));
-
-	status = cm_roam_state_change(pdev, vdev_id, WLAN_ROAM_RSO_STOPPED,
-				      REASON_DRIVER_DISABLED);
-	cm_roam_release_lock();
-
-	return status;
-}
-
-QDF_STATUS ucfg_cm_enable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id,
-			      enum wlan_cm_rso_control_requestor requestor,
-			      uint8_t reason)
-{
-	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
-	QDF_STATUS status;
-
-	if (reason == REASON_DRIVER_DISABLED && requestor)
-		mlme_set_operations_bitmap(mac->psoc, vdev_id, requestor, true);
+	ucfg_mlme_is_roam_scan_offload_enabled(psoc,
+					       &roam_scan_offload_enabled);
+	if (!roam_scan_offload_enabled)
+		return QDF_STATUS_SUCCESS;
 
 	status = cm_roam_acquire_lock();
 	if (QDF_IS_STATUS_ERROR(status))
-		return QDF_STATUS_E_FAILURE;
-
-	mlme_legacy_debug("ROAM_CONFIG: vdev[%d] Enable roaming - requestor:%s",
-			  vdev_id, cm_roam_get_requestor_string(requestor));
+		return status;
 
-	status = cm_roam_state_change(pdev, vdev_id, WLAN_ROAM_RSO_STARTED,
-				      REASON_DRIVER_ENABLED);
+	status = cm_roam_state_change(pdev, vdev_id,
+				      ROAM_SCAN_OFFLOAD_ABORT_SCAN,
+				      REASON_ROAM_ABORT_ROAM_SCAN);
 	cm_roam_release_lock();
 
 	return status;

+ 0 - 260
components/wmi/inc/wmi_unified_roam_param.h

@@ -171,63 +171,6 @@ struct wmi_mawc_roam_params {
 	uint8_t rssi_stationary_low_adjust;
 };
 
-#define MAX_SSID_ALLOWED_LIST    4
-#define MAX_BSSID_AVOID_LIST     16
-#define MAX_BSSID_FAVORED      16
-
-/**
- * struct roam_scan_filter_params - Structure holding roaming scan
- *                                  parameters
- * @op_bitmap: bitmap to determine reason of roaming
- * @vdev_id: vdev id
- * @num_bssid_black_list: The number of BSSID's that we should avoid
- *                        connecting to. It is like a blacklist of BSSID's.
- * @num_ssid_white_list: The number of SSID profiles that are in the
- *                       Whitelist. When roaming, we consider the BSSID's with
- *                       this SSID also for roaming apart from the connected
- *                       one's
- * @num_bssid_preferred_list: Number of BSSID's which have a preference over
- *                            others
- * @bssid_avoid_list: Blacklist SSID's
- * @ssid_allowed_list: Whitelist SSID's
- * @bssid_favored: Favorable BSSID's
- * @bssid_favored_factor: RSSI to be added to this BSSID to prefer it
- * @lca_disallow_config_present: LCA [Last Connected AP] disallow config
- *                               present
- * @disallow_duration: How long LCA AP will be disallowed before it can be a
- *                     roaming candidate again, in seconds
- * @rssi_channel_penalization: How much RSSI will be penalized if candidate(s)
- *                             are found in the same channel as disallowed
- *                             AP's, in units of db
- * @num_disallowed_aps: How many APs the target should maintain in its LCA
- *                      list
- * @delta_rssi: (dB units) when AB in RSSI blacklist improved by at least
- *              delta_rssi,it will be removed from blacklist
- *
- * This structure holds all the key parameters related to
- * initial connection and roaming connections.
- */
-
-struct roam_scan_filter_params {
-	uint32_t op_bitmap;
-	uint8_t vdev_id;
-	uint32_t num_bssid_black_list;
-	uint32_t num_ssid_white_list;
-	uint32_t num_bssid_preferred_list;
-	struct qdf_mac_addr bssid_avoid_list[MAX_BSSID_AVOID_LIST];
-	struct wlan_ssid ssid_allowed_list[MAX_SSID_ALLOWED_LIST];
-	struct qdf_mac_addr bssid_favored[MAX_BSSID_FAVORED];
-	uint8_t bssid_favored_factor[MAX_BSSID_FAVORED];
-	uint8_t lca_disallow_config_present;
-	uint32_t disallow_duration;
-	uint32_t rssi_channel_penalization;
-	uint32_t num_disallowed_aps;
-	uint32_t num_rssi_rejection_ap;
-	struct reject_ap_config_params
-				rssi_rejection_ap[MAX_RSSI_AVOID_BSSID_LIST];
-	uint32_t delta_rssi;
-};
-
 #define WMI_CFG_VALID_CHANNEL_LIST_LEN    100
 /* Occupied channel list remains static */
 #define WMI_CHANNEL_LIST_STATIC                   1
@@ -271,209 +214,6 @@ struct plm_req_params {
 	bool enable;
 };
 
-/**
- * struct ap_profile - Structure ap profile to match candidate
- * @flags: flags
- * @rssi_threshold: the value of the the candidate AP should higher by this
- *                  threshold than the rssi of the currrently associated AP
- * @ssid: ssid vlaue to be matched
- * @rsn_authmode: security params to be matched
- * @rsn_ucastcipherset: unicast cipher set
- * @rsn_mcastcipherset: mcast/group cipher set
- * @rsn_mcastmgmtcipherset: mcast/group management frames cipher set
- * @rssi_abs_thresh: the value of the candidate AP should higher than this
- *                   absolute RSSI threshold. Zero means no absolute minimum
- *                   RSSI is required. units are the offset from the noise
- *                   floor in dB
- */
-struct ap_profile {
-	uint32_t flags;
-	uint32_t rssi_threshold;
-	struct wlan_ssid  ssid;
-	uint32_t rsn_authmode;
-	uint32_t rsn_ucastcipherset;
-	uint32_t rsn_mcastcipherset;
-	uint32_t rsn_mcastmgmtcipherset;
-	uint32_t rssi_abs_thresh;
-};
-
-
-/**
- * struct scoring_param - scoring param to sortlist selected AP
- * @disable_bitmap: Each bit will be either allow(0)/disallow(1) to
- *                 considered the roam score param.
- * @rssi_weightage: RSSI weightage out of total score in %
- * @ht_weightage: HT weightage out of total score in %.
- * @vht_weightage: VHT weightage out of total score in %.
- * @he_weightaget: 11ax weightage out of total score in %.
- * @bw_weightage: Bandwidth weightage out of total score in %.
- * @band_weightage: Band(2G/5G) weightage out of total score in %.
- * @nss_weightage: NSS(1x1 / 2x2)weightage out of total score in %.
- * @esp_qbss_weightage: ESP/QBSS weightage out of total score in %.
- * @beamforming_weightage: Beamforming weightage out of total score in %.
- * @pcl_weightage: PCL weightage out of total score in %.
- * @oce_wan_weightage OCE WAN metrics weightage out of total score in %.
- * @oce_ap_tx_pwr_weightage: OCE AP TX power score in %
- * @oce_subnet_id_weightage: OCE subnet id score in %
- * @bw_index_score: channel BW scoring percentage information.
- *                 BITS 0-7   :- It contains scoring percentage of 20MHz   BW
- *                 BITS 8-15  :- It contains scoring percentage of 40MHz   BW
- *                 BITS 16-23 :- It contains scoring percentage of 80MHz   BW
- *                 BITS 24-31 :- It contains scoring percentage of 1600MHz BW
- *                 The value of each index must be 0-100
- * @band_index_score: band scording percentage information.
- *                   BITS 0-7   :- It contains scoring percentage of 2G
- *                   BITS 8-15  :- It contains scoring percentage of 5G
- *                   BITS 16-23 :- reserved
- *                   BITS 24-31 :- reserved
- *                   The value of each index must be 0-100
- * @nss_index_score: NSS scoring percentage information.
- *                  BITS 0-7   :- It contains scoring percentage of 1x1
- *                  BITS 8-15  :- It contains scoring percentage of 2x2
- *                  BITS 16-23 :- It contains scoring percentage of 3x3
- *                  BITS 24-31 :- It contains scoring percentage of 4x4
- *                  The value of each index must be 0-100
- * @roam_score_delta: delta value expected over the roam score of the candidate
- * ap over the roam score of the current ap
- * @roam_trigger_bitmap: bitmap of roam triggers on which roam_score_delta
- * will be applied
- * @vendor_roam_score_algorithm: Prefered algorithm for roam candidate selection
- * @cand_min_roam_score_delta: candidate min roam score delta value
- * @rssi_scoring: RSSI scoring information.
- * @esp_qbss_scoring: ESP/QBSS scoring percentage information
- * @oce_wan_scoring: OCE WAN metrics percentage information
- */
-struct scoring_param {
-	uint32_t disable_bitmap;
-	int32_t rssi_weightage;
-	int32_t ht_weightage;
-	int32_t vht_weightage;
-	int32_t he_weightage;
-	int32_t bw_weightage;
-	int32_t band_weightage;
-	int32_t nss_weightage;
-	int32_t esp_qbss_weightage;
-	int32_t beamforming_weightage;
-	int32_t pcl_weightage;
-	int32_t oce_wan_weightage;
-	uint32_t oce_ap_tx_pwr_weightage;
-	uint32_t oce_subnet_id_weightage;
-	uint32_t bw_index_score;
-	uint32_t band_index_score;
-	uint32_t nss_index_score;
-	uint32_t roam_score_delta;
-	uint32_t roam_trigger_bitmap;
-	uint32_t vendor_roam_score_algorithm;
-	uint32_t cand_min_roam_score_delta;
-	struct rssi_config_score rssi_scoring;
-	struct per_slot_score esp_qbss_scoring;
-	struct per_slot_score oce_wan_scoring;
-};
-
-/*
- * Currently roam score delta value and min rssi values are sent
- * for 2 triggers
- */
-#define NUM_OF_ROAM_TRIGGERS 2
-#define IDLE_ROAM_TRIGGER 0
-#define BTM_ROAM_TRIGGER  1
-
-#define DEAUTH_MIN_RSSI 0
-#define BMISS_MIN_RSSI  1
-
-/**
- * enum roam_trigger_reason - Reason for triggering roam
- * ROAM_TRIGGER_REASON_NONE: Roam trigger reason none
- * ROAM_TRIGGER_REASON_PER:  Roam triggered due to packet error
- * ROAM_TRIGGER_REASON_BMISS: Roam triggered due to beacon miss
- * ROAM_TRIGGER_REASON_LOW_RSSI: Roam triggered due to low RSSI of current
- * connected AP.
- * ROAM_TRIGGER_REASON_HIGH_RSSI: Roam triggered because sta is connected to
- * a AP in 2.4GHz band and a better 5GHz AP is available
- * ROAM_TRIGGER_REASON_PERIODIC: Roam triggered as better AP was found during
- * periodic roam scan.
- * ROAM_TRIGGER_REASON_MAWC: Motion Aided WiFi Connectivity triggered roam.
- * ROAM_TRIGGER_REASON_DENSE: Roaming triggered due to dense environment
- * detected.
- * ROAM_TRIGGER_REASON_BACKGROUND: Roam triggered due to current AP having
- * poor rssi and scan candidate found in scan results provided by other
- * scan clients.
- * ROAM_TRIGGER_REASON_FORCED: Forced roam trigger.
- * ROAM_TRIGGER_REASON_BTM: Roam triggered due to AP sent BTM query with
- * Disassoc imminent bit set.
- * ROAM_TRIGGER_REASON_UNIT_TEST: Roam triggered due to unit test command.
- * ROAM_TRIGGER_REASON_BSS_LOAD: Roam triggered due to high channel utilization
- * in the current connected channel
- * ROAM_TRIGGER_REASON_DEAUTH: Roam triggered due to deauth received from the
- * current connected AP.
- * ROAM_TRIGGER_REASON_IDLE: Roam triggered due to inactivity of the device.
- * ROAM_TRIGGER_REASON_STA_KICKOUT: Roam triggered due to sta kickout event.
- * ROAM_TRIGGER_REASON_ESS_RSSI: Roam triggered due to ess rssi
- * ROAM_TRIGGER_REASON_WTC_BTM: Roam triggered due to WTC BTM
- * ROAM_TRIGGER_REASON_MAX: Maximum number of roam triggers
- */
-enum roam_trigger_reason {
-	ROAM_TRIGGER_REASON_NONE = 0,
-	ROAM_TRIGGER_REASON_PER,
-	ROAM_TRIGGER_REASON_BMISS,
-	ROAM_TRIGGER_REASON_LOW_RSSI,
-	ROAM_TRIGGER_REASON_HIGH_RSSI,
-	ROAM_TRIGGER_REASON_PERIODIC,
-	ROAM_TRIGGER_REASON_MAWC,
-	ROAM_TRIGGER_REASON_DENSE,
-	ROAM_TRIGGER_REASON_BACKGROUND,
-	ROAM_TRIGGER_REASON_FORCED,
-	ROAM_TRIGGER_REASON_BTM,
-	ROAM_TRIGGER_REASON_UNIT_TEST,
-	ROAM_TRIGGER_REASON_BSS_LOAD,
-	ROAM_TRIGGER_REASON_DEAUTH,
-	ROAM_TRIGGER_REASON_IDLE,
-	ROAM_TRIGGER_REASON_STA_KICKOUT,
-	ROAM_TRIGGER_REASON_ESS_RSSI,
-	ROAM_TRIGGER_REASON_WTC_BTM,
-	ROAM_TRIGGER_REASON_MAX,
-};
-
-/**
- * struct roam_trigger_min_rssi - structure to hold minimum rssi value of
- * candidate APs for each roam trigger
- * @min_rssi: minimum RSSI of candidate AP for the trigger reason specified in
- * trigger_id
- * @trigger_reason: Roam trigger reason
- */
-struct roam_trigger_min_rssi {
-	int32_t  min_rssi;
-	enum roam_trigger_reason trigger_reason;
-};
-
-/**
- * struct roam_trigger_score_delta - structure to hold roam score delta value of
- * candidate APs for each roam trigger
- * @roam_score_delta: delta value in score of the candidate AP for the roam
- * trigger mentioned in the trigger_id.
- * @trigger_reason: Roam trigger reason
- */
-struct roam_trigger_score_delta {
-	uint32_t roam_score_delta;
-	enum roam_trigger_reason trigger_reason;
-};
-
-/**
- * struct ap_profile_params - ap profile params
- * @vdev_id: vdev id
- * @profile: ap profile to match candidate
- * @param: scoring params to short candidate
- * @min_rssi_params: Min RSSI values for different roam triggers
- * @score_delta_params: Roam score delta values for different triggers
- */
-struct ap_profile_params {
-	uint8_t vdev_id;
-	struct ap_profile profile;
-	struct scoring_param param;
-	struct roam_trigger_min_rssi min_rssi_params[NUM_OF_ROAM_TRIGGERS];
-	struct roam_trigger_score_delta score_delta_param[NUM_OF_ROAM_TRIGGERS];
-};
-
 /**
  * struct wmi_roam_invoke_cmd - roam invoke command
  * @vdev_id: vdev id

+ 1 - 1
core/hdd/src/wlan_hdd_cfg80211.c

@@ -154,7 +154,7 @@
 #include "wlan_hdd_apf.h"
 #include "wlan_hdd_cfr.h"
 #include "wlan_hdd_ioctl.h"
-#include "wlan_cm_roam_api.h"
+#include "wlan_cm_roam_ucfg_api.h"
 
 #define g_mode_rates_size (12)
 #define a_mode_rates_size (8)

+ 15 - 2
core/hdd/src/wlan_hdd_ioctl.c

@@ -47,6 +47,7 @@
 #include "wlan_scan_ucfg_api.h"
 #include "wlan_reg_ucfg_api.h"
 #include "qdf_func_tracker.h"
+#include "wlan_cm_roam_ucfg_api.h"
 
 #if defined(LINUX_QCMBR)
 #define SIOCIOCTLTX99 (SIOCDEVPRIVATE+13)
@@ -744,6 +745,19 @@ static int hdd_parse_reassoc(struct hdd_adapter *adapter, const char *command,
 	return ret;
 }
 
+#ifdef ROAM_OFFLOAD_V1
+static inline
+void hdd_abort_roam_scan(struct hdd_context *hdd_ctx, uint8_t vdev_id)
+{
+	ucfg_cm_abort_roam_scan(hdd_ctx->pdev, vdev_id);
+}
+#else
+static inline
+void hdd_abort_roam_scan(struct hdd_context *hdd_ctx, uint8_t vdev_id)
+{
+	sme_abort_roam_scan(hdd_ctx->mac_handle, vdev_id);
+}
+#endif
 /**
  * hdd_sendactionframe() - send a userspace-supplied action frame
  * @adapter:	Adapter upon which the command was received
@@ -839,8 +853,7 @@ hdd_sendactionframe(struct hdd_adapter *adapter, const uint8_t *bssid,
 				 * may cause long delays in sending action
 				 * frames.
 				 */
-				sme_abort_roam_scan(hdd_ctx->mac_handle,
-						    adapter->vdev_id);
+				hdd_abort_roam_scan(hdd_ctx, adapter->vdev_id);
 			} else {
 				/*
 				 * 0 is accepted as current home channel,

+ 1 - 3
core/mac/inc/sir_api.h

@@ -2025,9 +2025,7 @@ typedef enum {
 	SIR_ROAMING_DFS_CHANNEL_ENABLED_NORMAL = 1,
 	SIR_ROAMING_DFS_CHANNEL_ENABLED_ACTIVE = 2
 } eSirDFSRoamScanMode;
-#define MAX_SSID_ALLOWED_LIST 4
-#define MAX_BSSID_AVOID_LIST  16
-#define MAX_BSSID_FAVORED     16
+
 /**
  * struct roam_ext_params - Structure holding roaming parameters
  * @num_bssid_avoid_list:       The number of BSSID's that we should

+ 5 - 1
core/sme/inc/sme_api.h

@@ -981,9 +981,10 @@ QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(mac_handle_t mac_handle,
 		const bool
 		isFastRoamIniFeatureEnabled);
 
+#ifndef ROAM_OFFLOAD_V1
 QDF_STATUS sme_config_fast_roaming(mac_handle_t mac_handle, uint8_t session_id,
 				   const bool is_fast_roam_enabled);
-
+#endif
 QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t sessionId,
 			    uint8_t reason,
 			    enum wlan_cm_rso_control_requestor requestor);
@@ -1632,7 +1633,10 @@ QDF_STATUS sme_ext_scan_register_callback(mac_handle_t mac_handle,
 	return QDF_STATUS_SUCCESS;
 }
 #endif /* FEATURE_WLAN_EXTSCAN */
+
+#ifndef ROAM_OFFLOAD_V1
 QDF_STATUS sme_abort_roam_scan(mac_handle_t mac_handle, uint8_t sessionId);
+#endif
 
 /**
  * sme_get_vht_ch_width() - SME API to get the max supported FW chan width

+ 68 - 6
core/sme/src/common/sme_api.c

@@ -6210,6 +6210,7 @@ QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(mac_handle_t mac_handle,
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifndef ROAM_OFFLOAD_V1
 /**
  * sme_config_fast_roaming() - enable/disable LFR support at runtime
  * @mac_handle - The handle returned by macOpen.
@@ -6268,6 +6269,7 @@ QDF_STATUS sme_config_fast_roaming(mac_handle_t mac_handle, uint8_t session_id,
 
 	return QDF_STATUS_SUCCESS;
 }
+#endif
 
 #ifdef FEATURE_WLAN_ESE
 int sme_add_key_krk(mac_handle_t mac_handle, uint8_t session_id,
@@ -6326,6 +6328,33 @@ int sme_add_key_btk(mac_handle_t mac_handle, uint8_t session_id,
 }
 #endif
 
+#ifdef ROAM_OFFLOAD_V1
+QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t vdev_id,
+			    uint8_t reason,
+			    enum wlan_cm_rso_control_requestor requestor)
+{
+	struct mac_context *mac = MAC_CONTEXT(mac_handle);
+	struct csr_roam_session *session;
+
+	session = CSR_GET_SESSION(mac, vdev_id);
+	if (!session) {
+		sme_err("ROAM: incorrect vdev ID %d", vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return wlan_cm_disable_rso(mac->pdev, vdev_id, requestor, reason);
+}
+
+QDF_STATUS sme_start_roaming(mac_handle_t mac_handle, uint8_t vdev_id,
+			     uint8_t reason,
+			     enum wlan_cm_rso_control_requestor requestor)
+{
+	struct mac_context *mac = MAC_CONTEXT(mac_handle);
+
+	return wlan_cm_enable_rso(mac->pdev, vdev_id, requestor, reason);
+}
+
+#else
 /**
  * sme_stop_roaming() - Stop roaming for a given sessionId
  *  This is a synchronous call
@@ -6396,6 +6425,7 @@ QDF_STATUS sme_start_roaming(mac_handle_t mac_handle, uint8_t sessionId,
 
 	return status;
 }
+#endif
 
 void sme_set_pcl_for_first_connected_vdev(mac_handle_t mac_handle,
 					  uint8_t vdev_id)
@@ -9652,6 +9682,7 @@ QDF_STATUS sme_update_dsc_pto_up_mapping(mac_handle_t mac_handle,
 	return status;
 }
 
+#ifndef ROAM_OFFLOAD_V1
 /*
  * sme_abort_roam_scan() -
  * API to abort current roam scan cycle by roam scan offload module.
@@ -9680,6 +9711,7 @@ QDF_STATUS sme_abort_roam_scan(mac_handle_t mac_handle, uint8_t sessionId)
 
 	return status;
 }
+#endif
 
 QDF_STATUS sme_get_valid_channels_by_band(mac_handle_t mac_handle,
 					  uint8_t wifi_band,
@@ -15990,6 +16022,24 @@ void sme_chan_to_freq_list(
 			wlan_reg_chan_to_freq(pdev, (uint32_t)chan_list[count]);
 }
 
+#ifdef ROAM_OFFLOAD_V1
+static inline
+QDF_STATUS sme_rso_init_deinit(struct mac_context *mac,
+			       struct wlan_roam_triggers *triggers)
+{
+	QDF_STATUS status;
+
+	if (!triggers->trigger_bitmap)
+		status = wlan_cm_rso_init_deinit(mac->pdev, triggers->vdev_id,
+						 false);
+	else
+		status = wlan_cm_rso_init_deinit(mac->pdev, triggers->vdev_id,
+						 true);
+
+	return status;
+}
+#else
+
 static QDF_STATUS sme_enable_roaming(struct mac_context *mac, uint32_t vdev_id,
 				     bool enable)
 {
@@ -16019,6 +16069,23 @@ static QDF_STATUS sme_enable_roaming(struct mac_context *mac, uint32_t vdev_id,
 	return QDF_STATUS_SUCCESS;
 }
 
+static inline
+QDF_STATUS sme_rso_init_deinit(struct mac_context *mac,
+			       struct wlan_roam_triggers *triggers)
+{
+	QDF_STATUS status;
+
+	if (!triggers->trigger_bitmap)
+		status = sme_enable_roaming(mac, triggers->vdev_id,
+					    false);
+	else
+		status = sme_enable_roaming(mac, triggers->vdev_id,
+					    true);
+
+	return status;
+}
+#endif
+
 QDF_STATUS sme_set_roam_triggers(mac_handle_t mac_handle,
 				 struct wlan_roam_triggers *triggers)
 {
@@ -16029,13 +16096,8 @@ QDF_STATUS sme_set_roam_triggers(mac_handle_t mac_handle,
 
 	mlme_set_roam_trigger_bitmap(mac->psoc, triggers->vdev_id,
 				     triggers->trigger_bitmap);
-	if (!triggers->trigger_bitmap)
-		status = sme_enable_roaming(mac, triggers->vdev_id,
-					    false);
-	else
-		status = sme_enable_roaming(mac, triggers->vdev_id,
-					    true);
 
+	status = sme_rso_init_deinit(mac, triggers);
 	if (QDF_IS_STATUS_ERROR(status))
 		return status;
 

+ 289 - 75
core/sme/src/csr/csr_api_roam.c

@@ -1740,6 +1740,7 @@ QDF_STATUS csr_create_bg_scan_roam_channel_list(struct mac_context *mac,
 	return status;
 }
 
+#ifndef ROAM_OFFLOAD_V1
 #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
 /**
  * csr_check_band_freq_match() - check if passed band and ch freq match
@@ -1820,6 +1821,7 @@ is_dfs_unsafe_extra_band_chan(struct mac_context *mac_ctx, uint32_t freq,
 	return false;
 }
 #endif
+#endif
 
 #ifdef FEATURE_WLAN_ESE
 /**
@@ -2097,6 +2099,7 @@ QDF_STATUS csr_get_tsm_stats(struct mac_context *mac,
 	return status;
 }
 
+#ifndef ROAM_OFFLOAD_V1
 #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
 /**
  * csr_fetch_ch_lst_from_received_list() - fetch channel list from received list
@@ -2136,6 +2139,7 @@ csr_fetch_ch_lst_from_received_list(struct mac_context *mac_ctx,
 	req_buf->ChannelCacheType = CHANNEL_LIST_DYNAMIC;
 }
 #endif
+#endif
 
 /**
  * csr_set_cckm_ie() - set CCKM IE
@@ -2494,6 +2498,7 @@ void csr_set_11k_offload_config_param(struct csr_config *csr_config,
 		max_neighbor_report_req_cap;
 }
 
+#ifndef ROAM_OFFLOAD_V1
 static void
 csr_copy_mawc_config(struct mac_context *mac,
 		     struct mawc_params *mawc_config)
@@ -2511,6 +2516,7 @@ csr_copy_mawc_config(struct mac_context *mac,
 	mawc_config->mawc_roam_rssi_low_adjust =
 		mac->mlme_cfg->lfr.mawc_roam_rssi_low_adjust;
 }
+#endif
 
 QDF_STATUS csr_change_default_config_param(struct mac_context *mac,
 					   struct csr_config_params *pParam)
@@ -16682,6 +16688,7 @@ QDF_STATUS csr_roam_set_key_mgmt_offload(struct mac_context *mac_ctx,
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifndef ROAM_OFFLOAD_V1
 /**
  * csr_update_roam_scan_ese_params() - Update ESE related params in RSO request
  * @req_buf: Roam Scan Offload Request buffer
@@ -16911,6 +16918,7 @@ csr_update_roam_scan_offload_request(struct mac_context *mac_ctx,
 	req_buf->roaming_scan_policy =
 			mac_ctx->mlme_cfg->lfr.roaming_scan_policy;
 }
+#endif
 
 #ifdef WLAN_FEATURE_FIPS
 QDF_STATUS
@@ -16989,6 +16997,8 @@ csr_update_roam_scan_offload_request(struct mac_context *mac_ctx,
 #endif /* WLAN_FEATURE_ROAM_OFFLOAD */
 
 #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
+
+#ifndef ROAM_OFFLOAD_V1
 /**
  * csr_populate_roam_chan_list()
  * parameters
@@ -17753,52 +17763,6 @@ csr_update_11k_offload_params(struct mac_context *mac_ctx,
 			session->connectedProfile.SSID.length);
 }
 
-QDF_STATUS csr_invoke_neighbor_report_request(uint8_t session_id,
-				struct sRrmNeighborReq *neighbor_report_req,
-				bool send_resp_to_host)
-{
-	struct wmi_invoke_neighbor_report_params *invoke_params;
-	struct scheduler_msg msg = {0};
-
-	if (!neighbor_report_req) {
-		sme_err("Invalid params");
-		return QDF_STATUS_E_INVAL;
-	}
-
-	invoke_params = qdf_mem_malloc(sizeof(*invoke_params));
-	if (!invoke_params)
-		return QDF_STATUS_E_NOMEM;
-
-	invoke_params->vdev_id = session_id;
-	invoke_params->send_resp_to_host = send_resp_to_host;
-
-	if (!neighbor_report_req->no_ssid) {
-		invoke_params->ssid.length = neighbor_report_req->ssid.length;
-		qdf_mem_copy(invoke_params->ssid.ssid,
-				neighbor_report_req->ssid.ssId,
-				neighbor_report_req->ssid.length);
-	} else {
-		invoke_params->ssid.length = 0;
-	}
-
-	sme_debug("Sending SIR_HAL_INVOKE_NEIGHBOR_REPORT");
-
-	msg.type = SIR_HAL_INVOKE_NEIGHBOR_REPORT;
-	msg.reserved = 0;
-	msg.bodyptr = invoke_params;
-
-	if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
-							 QDF_MODULE_ID_WMA,
-							 QDF_MODULE_ID_WMA,
-							 &msg)) {
-		sme_err("Not able to post message to WMA");
-		qdf_mem_free(invoke_params);
-		return QDF_STATUS_E_FAILURE;
-	}
-
-	return QDF_STATUS_SUCCESS;
-}
-
 /**
  * check_allowed_ssid_list() - Check the WhiteList
  * @req_buffer:      Buffer which contains the connected profile SSID.
@@ -17888,6 +17852,54 @@ csr_add_rssi_reject_ap_list(struct mac_context *mac_ctx,
 
 	qdf_mem_free(reject_list);
 }
+#endif
+
+QDF_STATUS csr_invoke_neighbor_report_request(
+				uint8_t session_id,
+				struct sRrmNeighborReq *neighbor_report_req,
+				bool send_resp_to_host)
+{
+	struct wmi_invoke_neighbor_report_params *invoke_params;
+	struct scheduler_msg msg = {0};
+
+	if (!neighbor_report_req) {
+		sme_err("Invalid params");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	invoke_params = qdf_mem_malloc(sizeof(*invoke_params));
+	if (!invoke_params)
+		return QDF_STATUS_E_NOMEM;
+
+	invoke_params->vdev_id = session_id;
+	invoke_params->send_resp_to_host = send_resp_to_host;
+
+	if (!neighbor_report_req->no_ssid) {
+		invoke_params->ssid.length = neighbor_report_req->ssid.length;
+		qdf_mem_copy(invoke_params->ssid.ssid,
+			     neighbor_report_req->ssid.ssId,
+			     neighbor_report_req->ssid.length);
+	} else {
+		invoke_params->ssid.length = 0;
+	}
+
+	sme_debug("Sending SIR_HAL_INVOKE_NEIGHBOR_REPORT");
+
+	msg.type = SIR_HAL_INVOKE_NEIGHBOR_REPORT;
+	msg.reserved = 0;
+	msg.bodyptr = invoke_params;
+
+	if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
+							 QDF_MODULE_ID_WMA,
+							 QDF_MODULE_ID_WMA,
+							 &msg)) {
+		sme_err("Not able to post message to WMA");
+		qdf_mem_free(invoke_params);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
 
 /*
  * csr_roam_send_rso_cmd() - API to send RSO command to PE
@@ -17919,6 +17931,7 @@ csr_roam_send_rso_cmd(struct mac_context *mac_ctx,
 	return status;
 }
 
+#ifndef ROAM_OFFLOAD_V1
 /**
  * csr_append_assoc_ies() - Append specific IE to assoc IE's buffer
  * @mac_ctx: Pointer to global mac context
@@ -17998,6 +18011,7 @@ static void ese_populate_addtional_ies(struct mac_context *mac_ctx,
 {
 }
 #endif
+
 /**
  * csr_update_driver_assoc_ies() - Append driver built IE's to assoc IE's
  * @mac_ctx: Pointer to global mac structure
@@ -18177,6 +18191,7 @@ csr_roam_offload_per_scan(struct mac_context *mac_ctx, uint8_t session_id)
 	}
 	return QDF_STATUS_SUCCESS;
 }
+#endif
 
 #if defined(WLAN_FEATURE_FILS_SK)
 QDF_STATUS csr_update_fils_config(struct mac_context *mac, uint8_t session_id,
@@ -18200,6 +18215,7 @@ QDF_STATUS csr_update_fils_config(struct mac_context *mac, uint8_t session_id,
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifndef ROAM_OFFLOAD_V1
 /**
  * copy_all_before_char() - API to copy all character before a particular char
  * @str: Source string
@@ -18293,26 +18309,29 @@ static void csr_update_fils_params_rso(struct mac_context *mac,
 		  roam_fils_params->next_erp_seq_num,
 		  roam_fils_params->rrk_length, roam_fils_params->realm_len);
 }
+#endif
 #else
+
+#ifndef ROAM_OFFLOAD_V1
 static inline
 void csr_update_fils_params_rso(struct mac_context *mac,
 				struct csr_roam_session *session,
 				struct roam_offload_scan_req *req_buffer)
 {}
 #endif
+#endif
 
 /**
  * csr_update_score_params() - API to update Score params in RSO
  * @mac_ctx: Mac context
- * @req_buffer: RSO request buffer
+ * @req_score_params: request score params
  *
  * Return: None
  */
 static void csr_update_score_params(struct mac_context *mac_ctx,
-				    struct roam_offload_scan_req *req_buffer,
+				    struct scoring_param *req_score_params,
 				    tpCsrNeighborRoamControlInfo roam_info)
 {
-	struct scoring_param *req_score_params;
 	struct wlan_mlme_roam_scoring_cfg *roam_score_params;
 	struct weight_cfg *weight_config;
 	struct psoc_mlme_obj *mlme_psoc_obj;
@@ -18323,7 +18342,6 @@ static void csr_update_score_params(struct mac_context *mac_ctx,
 	if (!mlme_psoc_obj)
 		return;
 
-	req_score_params = &req_buffer->score_params;
 	score_config = &mlme_psoc_obj->psoc_cfg.score_config;
 	roam_score_params = &mac_ctx->mlme_cfg->roam_scoring;
 	weight_config = &score_config->weight_config;
@@ -18910,19 +18928,6 @@ csr_post_roam_state_change(struct mac_context *mac, uint8_t vdev_id,
 {
 	return csr_handle_roam_state_change(mac, vdev_id, state, reason);
 }
-#else
-QDF_STATUS
-csr_post_roam_state_change(struct mac_context *mac, uint8_t vdev_id,
-			   enum roam_offload_state state, uint8_t reason)
-{
-	QDF_STATUS status = QDF_STATUS_SUCCESS;
-
-	if (state == WLAN_ROAM_RSO_ENABLED)
-		status = wlan_cm_start_roaming(mac->pdev, vdev_id, reason);
-
-	return status;
-}
-#endif
 
 /**
  * csr_roam_offload_scan() - populates roam offload scan request and sends to
@@ -19172,7 +19177,9 @@ csr_roam_offload_scan(struct mac_context *mac_ctx, uint8_t session_id,
 				session->pAddIEAssoc,
 				session->nAddIEAssocLength);
 		csr_update_driver_assoc_ies(mac_ctx, session, req_buf);
-		csr_update_score_params(mac_ctx, req_buf, roam_info);
+		csr_update_score_params(mac_ctx,
+					&req_buf->score_params,
+					roam_info);
 		csr_update_fils_params_rso(mac_ctx, session, req_buf);
 	}
 
@@ -19212,8 +19219,23 @@ csr_roam_offload_scan(struct mac_context *mac_ctx, uint8_t session_id,
 	return status;
 }
 
-#ifdef ROAM_OFFLOAD_V1
-#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
+#else
+
+QDF_STATUS
+csr_post_roam_state_change(struct mac_context *mac, uint8_t vdev_id,
+			   enum roam_offload_state state, uint8_t reason)
+{
+	return wlan_cm_roam_state_change(mac->pdev, vdev_id, state, reason);
+}
+
+QDF_STATUS
+csr_roam_offload_scan(struct mac_context *mac_ctx, uint8_t session_id,
+		      uint8_t command, uint8_t reason)
+{
+	return wlan_cm_roam_send_rso_cmd(mac_ctx->psoc, session_id, command,
+					 reason);
+}
+
 QDF_STATUS
 wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc,
 			 uint8_t vdev_id,
@@ -19462,7 +19484,7 @@ wlan_cm_roam_scan_offload_rssi_thresh(
  * wlan_cm_roam_scan_offload_scan_period() - set roam offload scan period
  * parameters
  * @mac_ctx: global mac ctx
- * @session: csr roam session
+ * @vdev_id: vdev id
  * @params:  roam offload scan period related parameters
  *
  * This function is used to set roam offload scan period related parameters
@@ -19472,13 +19494,13 @@ wlan_cm_roam_scan_offload_rssi_thresh(
 static void
 wlan_cm_roam_scan_offload_scan_period(
 				struct mac_context *mac_ctx,
-				struct csr_roam_session *session,
+				uint8_t vdev_id,
 				struct wlan_roam_scan_period_params *params)
 {
 	tpCsrNeighborRoamControlInfo roam_info =
-			&mac_ctx->roam.neighborRoamInfo[session->vdev_id];
+			&mac_ctx->roam.neighborRoamInfo[vdev_id];
 
-	params->vdev_id = session->vdev_id;
+	params->vdev_id = vdev_id;
 	params->empty_scan_refresh_period =
 				roam_info->cfgParams.emptyScanRefreshPeriod;
 	params->scan_period = params->empty_scan_refresh_period;
@@ -19493,6 +19515,195 @@ wlan_cm_roam_scan_offload_scan_period(
 			roam_info->cfgParams.full_roam_scan_period;
 }
 
+/**
+ * wlan_cm_roam_scan_offload_ap_profile() - set roam ap profile parameters
+ * @mac_ctx: global mac ctx
+ * @session: sme session
+ * @params:  roam ap profile related parameters
+ *
+ * This function is used to set roam ap profile related parameters
+ *
+ * Return: None
+ */
+static void
+wlan_cm_roam_scan_offload_ap_profile(struct mac_context *mac_ctx,
+				     struct csr_roam_session *session,
+				     struct ap_profile_params *params)
+{
+	struct ap_profile *profile = &params->profile;
+	struct roam_ext_params *roam_params_src =
+			&mac_ctx->roam.configParam.roam_params;
+	tpCsrNeighborRoamControlInfo roam_info =
+			&mac_ctx->roam.neighborRoamInfo[session->vdev_id];
+
+	params->vdev_id = session->vdev_id;
+	profile->ssid.length = session->connectedProfile.SSID.length;
+	qdf_mem_copy(profile->ssid.ssid, session->connectedProfile.SSID.ssId,
+		     profile->ssid.length);
+	profile->rsn_authmode =
+		e_csr_auth_type_to_rsn_authmode(
+			session->connectedProfile.AuthType,
+			session->connectedProfile.EncryptionType);
+	/* Pairwise cipher suite */
+	profile->rsn_ucastcipherset =
+		e_csr_encryption_type_to_rsn_cipherset(
+			session->connectedProfile.EncryptionType);
+	/* Group cipher suite */
+	profile->rsn_mcastcipherset =
+		e_csr_encryption_type_to_rsn_cipherset(
+			session->connectedProfile.mcEncryptionType);
+	/* Group management cipher suite */
+
+	profile->rssi_threshold = roam_info->cfgParams.roam_rssi_diff;
+	/*
+	 * rssi_diff which is updated via framework is equivalent to the
+	 * INI RoamRssiDiff parameter and hence should be updated.
+	 */
+	if (roam_params_src->rssi_diff)
+		profile->rssi_threshold  = roam_params_src->rssi_diff;
+
+	profile->rssi_abs_thresh =
+			mac_ctx->mlme_cfg->lfr.roam_rssi_abs_threshold;
+
+	csr_update_score_params(mac_ctx, &params->param, roam_info);
+
+	params->min_rssi_params[DEAUTH_MIN_RSSI] =
+			mac_ctx->mlme_cfg->trig_min_rssi[DEAUTH_MIN_RSSI];
+	params->min_rssi_params[BMISS_MIN_RSSI] =
+			mac_ctx->mlme_cfg->trig_min_rssi[BMISS_MIN_RSSI];
+	params->score_delta_param[IDLE_ROAM_TRIGGER] =
+			mac_ctx->mlme_cfg->trig_score_delta[IDLE_ROAM_TRIGGER];
+	params->score_delta_param[BTM_ROAM_TRIGGER] =
+			mac_ctx->mlme_cfg->trig_score_delta[BTM_ROAM_TRIGGER];
+}
+
+/**
+ * wlan_cm_roam_scan_filter() - set roam scan filter parameters
+ * @mac_ctx: global mac ctx
+ * @vdev_id: vdev id
+ * @command: rso command
+ * @reason:  reason to roam
+ * @scan_filter_params:  roam scan filter related parameters
+ *
+ * There are filters such as whitelist, blacklist and preferred
+ * list that need to be applied to the scan results to form the
+ * probable candidates for roaming.
+ *
+ * Return: None
+ */
+static void
+wlan_cm_roam_scan_filter(
+		struct mac_context *mac_ctx,
+		uint8_t vdev_id,
+		uint8_t command,
+		uint8_t reason,
+		struct wlan_roam_scan_filter_params *scan_filter_params)
+{
+	int i;
+	uint32_t num_bssid_black_list = 0, num_ssid_white_list = 0,
+	   num_bssid_preferred_list = 0,  num_rssi_rejection_ap = 0;
+	uint32_t op_bitmap = 0;
+	struct roam_ext_params *roam_params;
+	struct roam_scan_filter_params *params;
+
+	scan_filter_params->reason = reason;
+	params = &scan_filter_params->filter_params;
+	roam_params = &mac_ctx->roam.configParam.roam_params;
+	if (command != ROAM_SCAN_OFFLOAD_STOP) {
+		switch (reason) {
+		case REASON_ROAM_SET_BLACKLIST_BSSID:
+			op_bitmap |= 0x1;
+			num_bssid_black_list =
+				roam_params->num_bssid_avoid_list;
+			break;
+		case REASON_ROAM_SET_SSID_ALLOWED:
+			op_bitmap |= 0x2;
+			num_ssid_white_list =
+				roam_params->num_ssid_allowed_list;
+			break;
+		case REASON_ROAM_SET_FAVORED_BSSID:
+			op_bitmap |= 0x4;
+			num_bssid_preferred_list =
+				roam_params->num_bssid_favored;
+			break;
+		case REASON_CTX_INIT:
+			if (command == ROAM_SCAN_OFFLOAD_START) {
+				params->lca_disallow_config_present = true;
+				num_rssi_rejection_ap =
+					roam_params->num_rssi_rejection_ap;
+			} else {
+				sme_debug("Roam Filter need not be sent, no need to fill parameters");
+				return;
+			}
+			break;
+		default:
+			sme_debug("Roam Filter need not be sent, no need to fill parameters");
+			return;
+		}
+	} else {
+		/* In case of STOP command, reset all the variables
+		 * except for blacklist BSSID which should be retained
+		 * across connections.
+		 */
+		op_bitmap = 0x2 | 0x4;
+		num_ssid_white_list = roam_params->num_ssid_allowed_list;
+		num_bssid_preferred_list = roam_params->num_bssid_favored;
+	}
+
+	/* fill in fixed values */
+	params->vdev_id = vdev_id;
+	params->op_bitmap = op_bitmap;
+	params->num_bssid_black_list = num_bssid_black_list;
+	params->num_ssid_white_list = num_ssid_white_list;
+	params->num_bssid_preferred_list = num_bssid_preferred_list;
+	params->num_rssi_rejection_ap = num_rssi_rejection_ap;
+	params->delta_rssi =
+		wlan_blm_get_rssi_blacklist_threshold(mac_ctx->pdev);
+	qdf_mem_copy(params->bssid_avoid_list, roam_params->bssid_avoid_list,
+		     MAX_BSSID_AVOID_LIST * sizeof(struct qdf_mac_addr));
+
+	for (i = 0; i < num_ssid_white_list; i++) {
+		qdf_mem_copy(params->ssid_allowed_list[i].ssid,
+			     roam_params->ssid_allowed_list[i].ssId,
+			     roam_params->ssid_allowed_list[i].length);
+		params->ssid_allowed_list[i].length =
+				roam_params->ssid_allowed_list[i].length;
+		sme_debug("SSID %d: %.*s", i,
+			  params->ssid_allowed_list[i].length,
+			  params->ssid_allowed_list[i].ssid);
+	}
+
+	for (i = 0; i < params->num_bssid_black_list; i++)
+		sme_debug("Blacklist bssid[%d]:" QDF_MAC_ADDR_STR, i,
+			  QDF_MAC_ADDR_ARRAY(params->bssid_avoid_list[i].bytes));
+	qdf_mem_copy(params->bssid_favored, roam_params->bssid_favored,
+		     MAX_BSSID_FAVORED * sizeof(struct qdf_mac_addr));
+	qdf_mem_copy(params->bssid_favored_factor,
+		     roam_params->bssid_favored_factor, MAX_BSSID_FAVORED);
+	qdf_mem_copy(params->rssi_rejection_ap,
+		     roam_params->rssi_reject_bssid_list,
+		     MAX_RSSI_AVOID_BSSID_LIST *
+			sizeof(struct reject_ap_config_params));
+
+	for (i = 0; i < params->num_bssid_preferred_list; i++)
+		sme_debug("Preferred Bssid[%d]:"QDF_MAC_ADDR_STR" score: %d", i,
+			  QDF_MAC_ADDR_ARRAY(params->bssid_favored[i].bytes),
+			  params->bssid_favored_factor[i]);
+
+	if (params->lca_disallow_config_present) {
+		params->disallow_duration
+				= mac_ctx->mlme_cfg->lfr.lfr3_disallow_duration;
+		params->rssi_channel_penalization
+			= mac_ctx->mlme_cfg->lfr.lfr3_rssi_channel_penalization;
+		params->num_disallowed_aps
+			= mac_ctx->mlme_cfg->lfr.lfr3_num_disallowed_aps;
+		sme_debug("disallow_dur %d rssi_chan_pen %d num_disallowed_aps %d",
+			  params->disallow_duration,
+			  params->rssi_channel_penalization,
+			  params->num_disallowed_aps);
+	}
+}
+
 QDF_STATUS
 wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc,
 			    uint8_t vdev_id,
@@ -19516,20 +19727,23 @@ wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc,
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	wlan_cm_roam_scan_offload_rssi_thresh(mac_ctx,
-					      session,
+	wlan_cm_roam_scan_offload_rssi_thresh(mac_ctx, session,
 					      &req->rssi_params);
 
-	wlan_cm_roam_scan_offload_scan_period(mac_ctx,
-					      session,
+	wlan_cm_roam_scan_offload_scan_period(mac_ctx, session->vdev_id,
 					      &req->scan_period_params);
 
+	wlan_cm_roam_scan_offload_ap_profile(mac_ctx, session,
+					     &req->profile_params);
+
+	wlan_cm_roam_scan_filter(mac_ctx, vdev_id, ROAM_SCAN_OFFLOAD_START,
+				 reason, &req->scan_filter_params);
+
 	/* fill other struct similar to wlan_roam_offload_scan_rssi_params */
 
 	return status;
 }
 #endif
-#endif
 
 QDF_STATUS
 csr_roam_offload_scan_rsp_hdlr(struct mac_context *mac,