Jelajahi Sumber

qcacld-3.0: Link BLM to the legacy APIs

Link BLM exposed APIs to the following:-

1. csr_get_scan_result:- Link this API with filter bssids in
the reject ap list maintained by the blacklist mgr.

2. lim_assoc_rej_add_to_rssi_based_reject_list:- Link this API
with the the blacklist mgr add bssid to reject list to add the
OCE and BTM related assoc rejects.

3. Userspace avoid list parsing logic for the userspace to set
the BSSID as avoided.

Change-Id: Id51ffb80cea3f845fefe14db25d0f7acda6ea0f3
CRs-Fixed: 2461281
gaurank kathpalia 5 tahun lalu
induk
melakukan
3ebc17b3e5

+ 20 - 0
Kbuild

@@ -948,6 +948,18 @@ MLME_OBJS :=	$(MLME_DIR)/core/src/wlan_mlme_main.o \
 
 MLME_OBJS += $(MLME_DIR)/core/src/wlan_mlme_vdev_mgr_interface.o
 
+
+####### BLACKLIST_MGR ########
+
+BLM_DIR := components/blacklist_mgr
+BLM_INC := -I$(WLAN_ROOT)/$(BLM_DIR)/core/inc \
+                -I$(WLAN_ROOT)/$(BLM_DIR)/dispatcher/inc
+ifeq ($(CONFIG_FEATURE_BLACKLIST_MGR), y)
+BLM_OBJS :=    $(BLM_DIR)/core/src/wlan_blm_main.o \
+                $(BLM_DIR)/core/src/wlan_blm_core.o \
+                $(BLM_DIR)/dispatcher/src/wlan_blm_ucfg_api.o \
+                $(BLM_DIR)/dispatcher/src/wlan_blm_tgt_api.o
+endif
 ########## ACTION OUI ##########
 
 ACTION_OUI_DIR := components/action_oui
@@ -995,6 +1007,11 @@ CLD_TARGET_IF_INC += -I$(WLAN_ROOT)/$(CLD_TARGET_IF_DIR)/disa/inc
 CLD_TARGET_IF_OBJ += $(CLD_TARGET_IF_DIR)/disa/src/target_if_disa.o
 endif
 
+ifeq ($(CONFIG_FEATURE_BLACKLIST_MGR), y)
+CLD_TARGET_IF_INC += -I$(WLAN_ROOT)/$(CLD_TARGET_IF_DIR)/blacklist_mgr/inc
+CLD_TARGET_IF_OBJ += $(CLD_TARGET_IF_DIR)/blacklist_mgr/src/target_if_blm.o
+endif
+
 ifeq ($(CONFIG_IPA_OFFLOAD), y)
 CLD_TARGET_IF_INC += -I$(WLAN_ROOT)/$(CLD_TARGET_IF_DIR)/ipa/inc
 CLD_TARGET_IF_OBJ += $(CLD_TARGET_IF_DIR)/ipa/src/target_if_ipa.o
@@ -1828,6 +1845,7 @@ INCS +=		$(UMAC_SM_INC)
 INCS +=		$(UMAC_MLME_INC)
 INCS +=		$(MLME_INC)
 INCS +=		$(FWOL_INC)
+INCS +=		$(BLM_INC)
 
 ifeq ($(CONFIG_REMOVE_PKT_LOG), n)
 INCS +=		$(PKTLOG_INC)
@@ -1912,6 +1930,7 @@ OBJS +=		$(UMAC_SM_OBJS)
 OBJS +=		$(UMAC_MLME_OBJS)
 OBJS +=		$(MLME_OBJS)
 OBJS +=		$(FWOL_OBJS)
+OBJS +=		$(BLM_OBJS)
 
 ifeq ($(CONFIG_WLAN_FEATURE_DSRC), y)
 OBJS +=		$(OCB_OBJS)
@@ -1989,6 +2008,7 @@ cppflags-$(CONFIG_LEGACY_CHAN_ENUM) += -DCONFIG_LEGACY_CHAN_ENUM
 cppflags-$(CONFIG_WLAN_PMO_ENABLE) += -DWLAN_PMO_ENABLE
 cppflags-$(CONFIG_CONVERGED_P2P_ENABLE) += -DCONVERGED_P2P_ENABLE
 cppflags-$(CONFIG_WLAN_POLICY_MGR_ENABLE) += -DWLAN_POLICY_MGR_ENABLE
+cppflags-$(CONFIG_FEATURE_BLACKLIST_MGR) += -DFEATURE_BLACKLIST_MGR
 cppflags-$(CONFIG_SUPPORT_11AX) += -DSUPPORT_11AX
 cppflags-$(CONFIG_HDD_INIT_WITH_RTNL_LOCK) += -DCONFIG_HDD_INIT_WITH_RTNL_LOCK
 cppflags-$(CONFIG_WLAN_CONV_SPECTRAL_ENABLE) += -DWLAN_CONV_SPECTRAL_ENABLE

+ 2 - 0
components/cfg/cfg_all.h

@@ -45,9 +45,11 @@
 #include "hdd_config.h"
 #include "hdd_dp_cfg.h"
 #include "cfg_legacy_dp.h"
+#include "wlan_cfg_blm.h"
 
 /* Maintain Alphabetic order here while adding components */
 #define CFG_ALL \
+	CFG_BLACKLIST_MGR_ALL \
 	CFG_CONVERGED_ALL \
 	CFG_FWOL_ALL \
 	CFG_POLICY_MGR_ALL \

+ 1 - 0
configs/default_defconfig

@@ -676,6 +676,7 @@ CONFIG_LEGACY_CHAN_ENUM := y
 CONFIG_WLAN_PMO_ENABLE := y
 CONFIG_CONVERGED_P2P_ENABLE := y
 CONFIG_WLAN_POLICY_MGR_ENABLE := y
+CONFIG_FEATURE_BLACKLIST_MGR := y
 CONFIG_SUPPORT_11AX := y
 CONFIG_HDD_INIT_WITH_RTNL_LOCK := y
 CONFIG_WLAN_CONV_SPECTRAL_ENABLE := y

+ 29 - 3
core/hdd/src/wlan_hdd_cfg80211.c

@@ -141,6 +141,7 @@
 #include "wlan_scan_ucfg_api.h"
 #include "wlan_hdd_coex_config.h"
 #include "wlan_hdd_bcn_recv.h"
+#include "wlan_blm_ucfg_api.h"
 
 #define g_mode_rates_size (12)
 #define a_mode_rates_size (8)
@@ -3614,6 +3615,8 @@ wlan_hdd_cfg80211_get_features(struct wiphy *wiphy,
 	QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID_NUM_NETWORKS
 #define PARAM_SET_BSSID \
 	QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PARAMS_BSSID
+#define PARAM_SET_BSSID_HINT \
+		QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PARAMS_HINT
 #define PARAM_SSID_LIST QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID_LIST
 #define PARAM_LIST_SSID  QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID
 #define MAX_ROAMING_PARAM \
@@ -3666,6 +3669,7 @@ wlan_hdd_set_roam_param_policy[MAX_ROAMING_PARAM + 1] = {
 	[PARAMS_NUM_BSSID] = {.type = NLA_U32},
 	[PARAM_ROAM_BSSID] = {.type = NLA_UNSPEC, .len = QDF_MAC_ADDR_SIZE},
 	[PARAM_SET_BSSID] = {.type = NLA_UNSPEC, .len = QDF_MAC_ADDR_SIZE},
+	[PARAM_SET_BSSID_HINT] = {.type = NLA_FLAG},
 };
 
 /**
@@ -3857,6 +3861,7 @@ static int hdd_set_blacklist_bssid(struct hdd_context *hdd_ctx,
 {
 	int rem, i;
 	uint32_t count;
+	uint8_t j = 0;
 	struct nlattr *tb2[MAX_ROAMING_PARAM + 1];
 	struct nlattr *curr_attr = NULL;
 	mac_handle_t mac_handle;
@@ -3897,11 +3902,26 @@ static int hdd_set_blacklist_bssid(struct hdd_context *hdd_ctx,
 				hdd_err("attr blacklist addr failed");
 				goto fail;
 			}
-			nla_memcpy(roam_params->bssid_avoid_list[i].bytes,
+			if (tb2[PARAM_SET_BSSID_HINT]) {
+				struct reject_ap_info ap_info;
+
+				nla_memcpy(ap_info.bssid.bytes,
+					   tb2[PARAM_SET_BSSID],
+					   QDF_MAC_ADDR_SIZE);
+				ap_info.reject_ap_type = USERSPACE_AVOID_TYPE;
+				/* This BSSID is avoided and not blacklisted */
+				ucfg_blm_add_bssid_to_reject_list(hdd_ctx->pdev,
+								  &ap_info);
+				i++;
+				continue;
+			}
+			nla_memcpy(roam_params->bssid_avoid_list[j].bytes,
 				   tb2[PARAM_SET_BSSID], QDF_MAC_ADDR_SIZE);
 			hdd_debug(QDF_MAC_ADDR_STR,
-				  QDF_MAC_ADDR_ARRAY(roam_params->bssid_avoid_list[i].bytes));
+				  QDF_MAC_ADDR_ARRAY(roam_params->
+						    bssid_avoid_list[j].bytes));
 			i++;
+			j++;
 		}
 	}
 
@@ -3909,7 +3929,12 @@ static int hdd_set_blacklist_bssid(struct hdd_context *hdd_ctx,
 		hdd_warn("Num Blacklist BSSID %u less than expected %u",
 			 i, count);
 
-	roam_params->num_bssid_avoid_list = i;
+	roam_params->num_bssid_avoid_list = j;
+	/* Send the blacklist to the blacklist mgr component */
+	ucfg_blm_add_userspace_black_list(hdd_ctx->pdev,
+					  roam_params->bssid_avoid_list,
+					  roam_params->num_bssid_avoid_list);
+
 	mac_handle = hdd_ctx->mac_handle;
 	sme_update_roam_params(mac_handle, vdev_id,
 			       roam_params, REASON_ROAM_SET_BLACKLIST_BSSID);
@@ -4124,6 +4149,7 @@ fail:
 }
 #undef PARAM_NUM_NW
 #undef PARAM_SET_BSSID
+#undef PARAM_SET_BSSID_HINT
 #undef PARAM_SSID_LIST
 #undef PARAM_LIST_SSID
 #undef MAX_ROAMING_PARAM

+ 16 - 0
core/hdd/src/wlan_hdd_main.c

@@ -169,6 +169,7 @@
 #include <wlan_interop_issues_ap_ucfg_api.h>
 #include <target_type.h>
 #include <wlan_hdd_debugfs_coex.h>
+#include "wlan_blm_ucfg_api.h"
 
 #ifdef MODULE
 #define WLAN_MODULE_NAME  module_name(THIS_MODULE)
@@ -13139,8 +13140,15 @@ static QDF_STATUS hdd_component_init(void)
 	if (QDF_IS_STATUS_ERROR(status))
 		goto policy_deinit;
 
+	status = ucfg_blm_init();
+	if (QDF_IS_STATUS_ERROR(status))
+		goto tdls_deinit;
+
 	return QDF_STATUS_SUCCESS;
 
+tdls_deinit:
+	ucfg_tdls_deinit();
+
 policy_deinit:
 	policy_mgr_deinit();
 interop_issues_ap_deinit:
@@ -13181,6 +13189,7 @@ target_if_deinit:
 static void hdd_component_deinit(void)
 {
 	/* deinitialize non-converged components */
+	ucfg_blm_deinit();
 	ucfg_tdls_deinit();
 	policy_mgr_deinit();
 	ucfg_interop_issues_ap_deinit();
@@ -13208,6 +13217,10 @@ QDF_STATUS hdd_component_psoc_open(struct wlan_objmgr_psoc *psoc)
 	if (QDF_IS_STATUS_ERROR(status))
 		return status;
 
+	status = ucfg_blm_psoc_open(psoc);
+	if (QDF_IS_STATUS_ERROR(status))
+		goto err_blm;
+
 	status = ucfg_fwol_psoc_open(psoc);
 	if (QDF_IS_STATUS_ERROR(status))
 		goto err_fwol;
@@ -13239,6 +13252,8 @@ err_plcy_mgr:
 err_pmo:
 	ucfg_fwol_psoc_close(psoc);
 err_fwol:
+	ucfg_blm_psoc_close(psoc);
+err_blm:
 	ucfg_mlme_psoc_close(psoc);
 
 	return status;
@@ -13251,6 +13266,7 @@ void hdd_component_psoc_close(struct wlan_objmgr_psoc *psoc)
 	ucfg_policy_mgr_psoc_close(psoc);
 	ucfg_pmo_psoc_close(psoc);
 	ucfg_fwol_psoc_close(psoc);
+	ucfg_blm_psoc_close(psoc);
 	ucfg_mlme_psoc_close(psoc);
 }
 

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

@@ -92,8 +92,6 @@ typedef uint8_t tSirVersionString[SIR_VERSION_STRING_LEN];
 	(QOS_MAP_LEN_MIN + 2 * QOS_MAP_MAX_EX)
 #define NUM_CHAINS_MAX  2
 
-#define MAX_RSSI_AVOID_BSSID_LIST    10
-
 /* Maximum number of realms present in fils indication element */
 #define SIR_MAX_REALM_COUNT 7
 /* Realm length */
@@ -2141,6 +2139,7 @@ typedef enum {
  * @rssi_diff:                  RSSI difference for the AP to be better over the
  *                              current AP to avoid ping pong effects
  * @good_rssi_roam:             Lazy Roam
+ * @rssi_reject_list:           RSSI reject list (APs rejected by OCE, BTM)
  * @bg_scan_bad_rssi_thresh:    Bad RSSI threshold to perform bg scan.
  * @bad_rssi_thresh_offset_2g:  Offset from Bad RSSI threshold for 2G to 5G Roam
  * @bg_scan_client_bitmap:      Bitmap to identify the client scans to snoop.
@@ -2172,7 +2171,8 @@ struct roam_ext_params {
 	int initial_dense_status;
 	int traffic_threshold;
 	uint8_t num_rssi_rejection_ap;
-	struct rssi_disallow_bssid rssi_rejection_ap[MAX_RSSI_AVOID_BSSID_LIST];
+	struct reject_ap_config_params
+			rssi_reject_bssid_list[MAX_RSSI_AVOID_BSSID_LIST];
 	int8_t bg_scan_bad_rssi_thresh;
 	uint8_t roam_bad_rssi_thresh_offset_2g;
 	uint32_t bg_scan_client_bitmap;

+ 3 - 7
core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c

@@ -490,15 +490,12 @@ lim_handle_assoc_reject_status(struct mac_context *mac_ctx,
 	 * which will allow the bssid to connect is retry delay.
 	 */
 	ap_info.retry_delay = timeout_value;
-	qdf_mem_copy(ap_info.bssid.bytes, source_addr,
-		     QDF_MAC_ADDR_SIZE);
+	qdf_mem_copy(ap_info.bssid.bytes, source_addr, QDF_MAC_ADDR_SIZE);
 	ap_info.expected_rssi = LIM_MIN_RSSI;
-	lim_assoc_rej_add_to_rssi_based_reject_list(mac_ctx,
-						    &ap_info);
+	lim_add_bssid_to_reject_list(mac_ctx->pdev, &ap_info);
 
 	pe_debug("ASSOC res with eSIR_MAC_TRY_AGAIN_LATER recvd. Add to time reject list(rssi reject in mac_ctx %d",
 		timeout_value);
-
 }
 #else
 static void
@@ -789,8 +786,7 @@ lim_process_assoc_rsp_frame(struct mac_context *mac_ctx,
 		qdf_mem_copy(ap_info.bssid.bytes, hdr->sa, QDF_MAC_ADDR_SIZE);
 		ap_info.expected_rssi = assoc_rsp->rssi_assoc_rej.delta_rssi +
 					WMA_GET_RX_RSSI_NORMALIZED(rx_pkt_info);
-		lim_assoc_rej_add_to_rssi_based_reject_list(mac_ctx,
-							    &ap_info);
+		lim_add_bssid_to_reject_list(mac_ctx->pdev, &ap_info);
 	}
 	if (assoc_rsp->statusCode != eSIR_MAC_SUCCESS_STATUS) {
 		/*

+ 7 - 86
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -6272,102 +6272,23 @@ void lim_continue_sta_csa_req(struct mac_context *mac_ctx, uint8_t vdev_id)
 	lim_process_channel_switch_timeout(mac_ctx);
 }
 
-void lim_remove_duplicate_bssid_node(struct sir_rssi_disallow_lst *entry,
-				     qdf_list_t *list)
-{
-	qdf_list_node_t *cur_list = NULL;
-	qdf_list_node_t *next_list = NULL;
-	struct sir_rssi_disallow_lst *cur_entry;
-	QDF_STATUS status;
-
-	qdf_list_peek_front(list, &cur_list);
-	while (cur_list) {
-		qdf_list_peek_next(list, cur_list, &next_list);
-		cur_entry = qdf_container_of(cur_list,
-					     struct sir_rssi_disallow_lst,
-					     node);
-
-		/*
-		 * Remove the node from blacklisting if the timeout is 0 and
-		 * rssi is 0 dbm i.e btm blacklisted entry
-		 */
-		if ((lim_assoc_rej_get_remaining_delta(cur_entry) == 0) &&
-		    cur_entry->expected_rssi == LIM_MIN_RSSI) {
-			status = qdf_list_remove_node(list, cur_list);
-			if (QDF_IS_STATUS_SUCCESS(status))
-				qdf_mem_free(cur_entry);
-		} else if (qdf_is_macaddr_equal(&entry->bssid,
-						&cur_entry->bssid)) {
-			/*
-			 * Remove the node if we try to add the same bssid again
-			 * Copy the old rssi value alone
-			 */
-			entry->expected_rssi = cur_entry->expected_rssi;
-			status = qdf_list_remove_node(list, cur_list);
-			if (QDF_IS_STATUS_SUCCESS(status)) {
-				qdf_mem_free(cur_entry);
-				break;
-			}
-		}
-		cur_list = next_list;
-		next_list = NULL;
-	}
-}
-
 void lim_add_roam_blacklist_ap(struct mac_context *mac_ctx,
 			       struct roam_blacklist_event *src_lst)
 {
 	uint32_t i;
-	struct sir_rssi_disallow_lst *entry;
+	struct sir_rssi_disallow_lst entry;
 	struct roam_blacklist_timeout *blacklist;
-	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	blacklist = &src_lst->roam_blacklist[0];
 	for (i = 0; i < src_lst->num_entries; i++) {
-		entry = qdf_mem_malloc(sizeof(struct sir_rssi_disallow_lst));
-		if (!entry)
-			return;
 
-		qdf_copy_macaddr(&entry->bssid, &blacklist->bssid);
-		entry->retry_delay = blacklist->timeout;
-		entry->time_during_rejection = blacklist->received_time;
+		entry.bssid = blacklist->bssid;
+		entry.retry_delay = blacklist->timeout;
+		entry.time_during_rejection = blacklist->received_time;
 		/* set 0dbm as expected rssi for btm blaclisted entries */
-		entry->expected_rssi = LIM_MIN_RSSI;
-
-		qdf_mutex_acquire(&mac_ctx->roam.rssi_disallow_bssid_lock);
-		lim_remove_duplicate_bssid_node(
-					entry,
-					&mac_ctx->roam.rssi_disallow_bssid);
+		entry.expected_rssi = LIM_MIN_RSSI;
 
-		if (qdf_list_size(&mac_ctx->roam.rssi_disallow_bssid) >=
-		    MAX_RSSI_AVOID_BSSID_LIST) {
-			status = lim_rem_blacklist_entry_with_lowest_delta(
-					&mac_ctx->roam.rssi_disallow_bssid);
-			if (QDF_IS_STATUS_ERROR(status)) {
-				qdf_mutex_release(&mac_ctx->roam.
-					rssi_disallow_bssid_lock);
-				pe_err("Failed to remove entry with lowest delta");
-				qdf_mem_free(entry);
-				return;
-			}
-		}
-
-		if (QDF_IS_STATUS_SUCCESS(status)) {
-			status = qdf_list_insert_back(
-					&mac_ctx->roam.rssi_disallow_bssid,
-					&entry->node);
-			if (QDF_IS_STATUS_ERROR(status)) {
-				qdf_mutex_release(&mac_ctx->roam.
-					rssi_disallow_bssid_lock);
-				pe_err("Failed to enqueue bssid: %pM",
-				       entry->bssid.bytes);
-				qdf_mem_free(entry);
-				return;
-			}
-			pe_debug("Added BTM blacklisted bssid: %pM",
-				 entry->bssid.bytes);
-		}
-		qdf_mutex_release(&mac_ctx->roam.rssi_disallow_bssid_lock);
-		blacklist++;
+		/* Add this bssid to the rssi reject ap type in blacklist mgr */
+		lim_add_bssid_to_reject_list(mac_ctx->pdev, &entry);
 	}
 }

+ 0 - 10
core/mac/src/pe/lim/lim_types.h

@@ -958,16 +958,6 @@ QDF_STATUS lim_process_sme_del_all_tdls_peers(struct mac_context *p_mac,
  */
 void lim_send_bcn_rsp(struct mac_context *mac_ctx, tpSendbeaconParams rsp);
 
-/**
- * lim_remove_duplicate_bssid_node() - remove duplicate bssid from the
- * @entry: entry to check for which the duplicate entry is present
- * @list:  mac_ctx->roam.rssi_disallow_bssid list
- *
- * Return: None
- */
-void lim_remove_duplicate_bssid_node(struct sir_rssi_disallow_lst *entry,
-				     qdf_list_t *list);
-
 /**
  * lim_add_roam_blacklist_ap() - handle the blacklist bssid list received from
  * firmware

+ 11 - 37
core/mac/src/pe/lim/lim_utils.c

@@ -68,6 +68,7 @@
 #include "qdf_util.h"
 #include "wlan_qct_sys.h"
 #include <wlan_scan_ucfg_api.h>
+#include <wlan_blm_api.h>
 
 #define ASCII_SPACE_CHARACTER 0x20
 
@@ -7461,46 +7462,19 @@ lim_rem_blacklist_entry_with_lowest_delta(qdf_list_t *list)
 	return QDF_STATUS_E_INVAL;
 }
 
-void lim_assoc_rej_add_to_rssi_based_reject_list(
-					struct mac_context *mac_ctx,
-					struct sir_rssi_disallow_lst *ap_info)
+void
+lim_add_bssid_to_reject_list(struct wlan_objmgr_pdev *pdev,
+			     struct sir_rssi_disallow_lst *entry)
 {
-	struct sir_rssi_disallow_lst *entry;
-	QDF_STATUS status = QDF_STATUS_SUCCESS;
-
-	entry = qdf_mem_malloc(sizeof(*entry));
-	if (!entry)
-		return;
-
-	pe_debug("%pM: assoc resp, expected rssi %d retry delay %d sec and list size %d",
-		ap_info->bssid.bytes, ap_info->expected_rssi,
-		ap_info->retry_delay,
-		qdf_list_size(&mac_ctx->roam.rssi_disallow_bssid));
-
-	*entry = *ap_info;
-	entry->time_during_rejection =
-		qdf_do_div(qdf_get_monotonic_boottime(),
-		QDF_MC_TIMER_TO_MS_UNIT);
-
-	qdf_mutex_acquire(&mac_ctx->roam.rssi_disallow_bssid_lock);
-	if (qdf_list_size(&mac_ctx->roam.rssi_disallow_bssid) >=
-		MAX_RSSI_AVOID_BSSID_LIST) {
-		status = lim_rem_blacklist_entry_with_lowest_delta(
-					&mac_ctx->roam.rssi_disallow_bssid);
-		if (QDF_IS_STATUS_ERROR(status))
-			pe_err("Failed to remove entry with lowest delta");
-	}
+	struct reject_ap_info ap_info;
 
-	if (QDF_IS_STATUS_SUCCESS(status))
-		status = qdf_list_insert_back(
-				&mac_ctx->roam.rssi_disallow_bssid,
-				&entry->node);
-	qdf_mutex_release(&mac_ctx->roam.rssi_disallow_bssid_lock);
+	ap_info.bssid = entry->bssid;
+	ap_info.reject_ap_type = DRIVER_RSSI_REJECT_TYPE;
+	ap_info.rssi_reject_params.expected_rssi = entry->expected_rssi;
+	ap_info.rssi_reject_params.retry_delay = entry->retry_delay;
 
-	if (QDF_IS_STATUS_ERROR(status)) {
-		pe_err("Failed to enqueue bssid entry");
-		qdf_mem_free(entry);
-	}
+	/* Add this ap info to the rssi reject ap type in blacklist manager */
+	wlan_blm_add_bssid_to_reject_list(pdev, &ap_info);
 }
 
 void lim_decrement_pending_mgmt_count(struct mac_context *mac_ctx)

+ 12 - 16
core/mac/src/pe/lim/lim_utils.h

@@ -824,6 +824,18 @@ lim_del_pmf_sa_query_timer(struct mac_context *mac_ctx, struct pe_session *pe_se
 }
 #endif
 
+/**
+ * lim_add_bssid_to_reject_list:- Add rssi reject Ap info to blacklist mgr.
+ * @pdev: pdev
+ * @entry: info of the BSSID to be put in rssi reject list.
+ *
+ * This API will add the passed ap info to the rssi reject list.
+ *
+ */
+void
+lim_add_bssid_to_reject_list(struct wlan_objmgr_pdev *pdev,
+			     struct sir_rssi_disallow_lst *entry);
+
 /**
  * lim_strip_op_class_update_struct - strip sup op class IE and populate
  *				  the dot11f structure
@@ -1300,22 +1312,6 @@ QDF_STATUS lim_populate_he_mcs_set(struct mac_context *mac_ctx,
 
 #endif
 
-/**
- * lim_assoc_rej_add_to_rssi_based_reject_list() - Add BSSID to the rssi based
- * rejection list
- * @mac_ctx: mac ctx
- * @ap_info: ap's info which is to be rejected.
- *
- * Add BSSID to the rssi based rejection list. Also if number
- * of entries is greater than MAX_RSSI_AVOID_BSSID_LIST
- * remove the entry with lowest time delta
- *
- * Return: void
- */
-void lim_assoc_rej_add_to_rssi_based_reject_list(
-					struct mac_context *mac_ctx,
-					struct sir_rssi_disallow_lst *ap_info);
-
 /**
  * lim_decrement_pending_mgmt_count: Decrement mgmt frame count
  * @mac_ctx: Pointer to global MAC structure

+ 0 - 2
core/sme/inc/csr_internal.h

@@ -735,8 +735,6 @@ struct csr_roamstruct {
 	uint8_t *pReassocResp;          /* reassociation response from new AP */
 	uint16_t reassocRespLen;        /* length of reassociation response */
 	qdf_mc_timer_t packetdump_timer;
-	qdf_list_t rssi_disallow_bssid;
-	qdf_mutex_t rssi_disallow_bssid_lock;
 	spinlock_t roam_state_lock;
 };
 

+ 23 - 111
core/sme/src/csr/csr_api_roam.c

@@ -62,6 +62,7 @@
 #include "wlan_mlme_public_struct.h"
 #include <wlan_crypto_global_api.h>
 #include "wlan_qct_sys.h"
+#include "wlan_blm_api.h"
 
 #define RSN_AUTH_KEY_MGMT_SAE           WLAN_RSN_SEL(WLAN_AKM_SAE)
 #define MAX_PWR_FCC_CHAN_12 8
@@ -589,68 +590,6 @@ static void csr_close_stats_ll(struct mac_context *mac_ctx)
 }
 #endif
 
-/**
- * csr_assoc_rej_free_rssi_disallow_list() - Free the rssi disallowed
- * BSSID entries and destroy the list
- * @mac_ctx: MAC context
- *
- * Return: void
- */
-static void csr_assoc_rej_free_rssi_disallow_list(struct mac_context *mac)
-{
-	QDF_STATUS status;
-	struct sir_rssi_disallow_lst *cur_node;
-	qdf_list_node_t *cur_lst = NULL, *next_lst = NULL;
-	qdf_list_t *list = &mac->roam.rssi_disallow_bssid;
-
-	qdf_mutex_acquire(&mac->roam.rssi_disallow_bssid_lock);
-	qdf_list_peek_front(list, &cur_lst);
-	while (cur_lst) {
-		qdf_list_peek_next(list, cur_lst, &next_lst);
-		cur_node = qdf_container_of(cur_lst,
-					    struct sir_rssi_disallow_lst, node);
-		status = qdf_list_remove_node(list, cur_lst);
-		if (QDF_IS_STATUS_SUCCESS(status))
-			qdf_mem_free(cur_node);
-		cur_lst = next_lst;
-		next_lst = NULL;
-	}
-	qdf_list_destroy(list);
-	qdf_mutex_release(&mac->roam.rssi_disallow_bssid_lock);
-}
-
-/**
- * csr_roam_rssi_disallow_bssid_init() - Init the rssi disallowed
- * list and mutex
- * @mac_ctx: MAC context
- *
- * Return: QDF_STATUS enumeration
- */
-static QDF_STATUS csr_roam_rssi_disallow_bssid_init(
-					     struct mac_context *mac_ctx)
-{
-	qdf_list_create(&mac_ctx->roam.rssi_disallow_bssid,
-			MAX_RSSI_AVOID_BSSID_LIST);
-	qdf_mutex_create(&mac_ctx->roam.rssi_disallow_bssid_lock);
-
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * csr_roam_rssi_disallow_bssid_deinit() - Free the rssi diallowed
- * BSSID entries and destroy the list&mutex
- * @mac_ctx: MAC context
- *
- * Return: QDF_STATUS enumeration
- */
-static QDF_STATUS csr_roam_rssi_disallow_bssid_deinit(
-					     struct mac_context *mac_ctx)
-{
-	csr_assoc_rej_free_rssi_disallow_list(mac_ctx);
-	qdf_mutex_destroy(&mac_ctx->roam.rssi_disallow_bssid_lock);
-	return QDF_STATUS_SUCCESS;
-}
-
 QDF_STATUS csr_open(struct mac_context *mac)
 {
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
@@ -682,8 +621,6 @@ QDF_STATUS csr_open(struct mac_context *mac)
 			csr_roam_free_globals();
 			break;
 		}
-
-		csr_roam_rssi_disallow_bssid_init(mac);
 	} while (0);
 
 	return status;
@@ -740,7 +677,6 @@ QDF_STATUS csr_close(struct mac_context *mac)
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	csr_roam_close(mac);
-	csr_roam_rssi_disallow_bssid_deinit(mac);
 	csr_scan_close(mac);
 	csr_close_stats_ll(mac);
 	/* DeInit Globals */
@@ -18953,61 +18889,37 @@ static void check_allowed_ssid_list(struct roam_offload_scan_req *req_buffer,
  *
  * Return: None
  */
-static void csr_add_rssi_reject_ap_list(struct mac_context *mac_ctx,
-	struct roam_ext_params *roam_params)
+static void
+csr_add_rssi_reject_ap_list(struct mac_context *mac_ctx,
+			    struct roam_ext_params *roam_params)
 {
 	int i = 0;
-	struct sir_rssi_disallow_lst *cur_node;
-	qdf_list_node_t *cur_list = NULL;
-	qdf_list_node_t *next_list = NULL;
-	struct rssi_disallow_bssid *rssi_rejection_ap;
-	qdf_list_t *list = &mac_ctx->roam.rssi_disallow_bssid;
-	qdf_time_t cur_time =
-		qdf_do_div(qdf_get_monotonic_boottime(),
-		QDF_MC_TIMER_TO_MS_UNIT);
-
-	roam_params->num_rssi_rejection_ap = qdf_list_size(list);
-
-	if (!qdf_list_size(list))
+	struct reject_ap_config_params *reject_list;
+
+	reject_list = qdf_mem_malloc(sizeof(*reject_list) *
+				     MAX_RSSI_AVOID_BSSID_LIST);
+	if (!reject_list)
 		return;
 
-	if (roam_params->num_rssi_rejection_ap > MAX_RSSI_AVOID_BSSID_LIST)
-		roam_params->num_rssi_rejection_ap = MAX_RSSI_AVOID_BSSID_LIST;
-
-	qdf_mutex_acquire(&mac_ctx->roam.rssi_disallow_bssid_lock);
-	qdf_list_peek_front(list, &cur_list);
-	while (cur_list) {
-		int32_t rem_time;
-
-		rssi_rejection_ap = &roam_params->rssi_rejection_ap[i];
-		cur_node = qdf_container_of(cur_list,
-				struct sir_rssi_disallow_lst, node);
-		rem_time = cur_node->retry_delay -
-			(cur_time - cur_node->time_during_rejection);
-
-		if (rem_time > 0) {
-			qdf_copy_macaddr(&rssi_rejection_ap->bssid,
-					&cur_node->bssid);
-			rssi_rejection_ap->expected_rssi =
-					cur_node->expected_rssi;
-			rssi_rejection_ap->remaining_duration = rem_time;
-			i++;
-		}
-		qdf_list_peek_next(list, cur_list, &next_list);
-		cur_list = next_list;
-		next_list = NULL;
-
-		if (i >= MAX_RSSI_AVOID_BSSID_LIST)
-			break;
+	roam_params->num_rssi_rejection_ap =
+		wlan_blm_get_bssid_reject_list(mac_ctx->pdev, reject_list,
+					       MAX_RSSI_AVOID_BSSID_LIST,
+					       DRIVER_RSSI_REJECT_TYPE);
+	if (!roam_params->num_rssi_rejection_ap) {
+		sme_debug("RSSI reject list NULL");
+		qdf_mem_free(reject_list);
+		return;
 	}
-	qdf_mutex_release(&mac_ctx->roam.rssi_disallow_bssid_lock);
 
 	for (i = 0; i < roam_params->num_rssi_rejection_ap; i++) {
+		roam_params->rssi_reject_bssid_list[i] = reject_list[i];
 		sme_debug("BSSID %pM expected rssi %d remaining duration %d",
-			roam_params->rssi_rejection_ap[i].bssid.bytes,
-			roam_params->rssi_rejection_ap[i].expected_rssi,
-			roam_params->rssi_rejection_ap[i].remaining_duration);
+		   roam_params->rssi_reject_bssid_list[i].bssid.bytes,
+		   roam_params->rssi_reject_bssid_list[i].expected_rssi,
+		   roam_params->rssi_reject_bssid_list[i].reject_duration);
 	}
+
+	qdf_mem_free(reject_list);
 }
 
 /*

+ 8 - 128
core/sme/src/csr/csr_api_scan.c

@@ -49,6 +49,7 @@
 #include <wlan_utility.h>
 #include "wlan_reg_services_api.h"
 #include "sch_api.h"
+#include "wlan_blm_api.h"
 
 static void csr_set_cfg_valid_channel_list(struct mac_context *mac,
 					   uint8_t *pChannelList,
@@ -2733,130 +2734,6 @@ static QDF_STATUS csr_parse_scan_list(struct mac_context *mac_ctx,
 	return status;
 }
 
-/**
- * csr_remove_ap_due_to_rssi() - check if bss is present in
- * list of BSSID which rejected Assoc due to RSSI
- * @list: rssi based rejected BSS list
- * @bss_descr: pointer to bss description
- *
- * Check if the time interval indicated in last Assoc reject
- * has expired OR rssi has improved by margin indicated
- * in last Assoc reject. If any of the condition match remove
- * the AP from the avoid list, else do not try to conenct
- * to the AP
- *
- * Return: true if connection cannot be tried with AP else false
- */
-static bool csr_remove_ap_due_to_rssi(qdf_list_t *list,
-				      struct bss_description *bss_descr)
-{
-	QDF_STATUS status;
-	struct sir_rssi_disallow_lst *cur_node = NULL;
-	qdf_list_node_t *cur_lst = NULL, *next_lst = NULL;
-	qdf_time_t cur_time;
-	uint32_t time_diff;
-
-	if (!qdf_list_size(list))
-		return false;
-
-	cur_time = qdf_do_div(qdf_get_monotonic_boottime(),
-		QDF_MC_TIMER_TO_MS_UNIT);
-
-	qdf_list_peek_front(list, &cur_lst);
-	while (cur_lst) {
-		cur_node = qdf_container_of(cur_lst,
-				struct sir_rssi_disallow_lst, node);
-
-		qdf_list_peek_next(list, cur_lst, &next_lst);
-
-		time_diff = cur_time - cur_node->time_during_rejection;
-		if ((time_diff > cur_node->retry_delay)) {
-			sme_debug("Remove %pM as time diff %d is greater retry delay %d",
-				cur_node->bssid.bytes, time_diff,
-				cur_node->retry_delay);
-			status = qdf_list_remove_node(list, cur_lst);
-			if (QDF_IS_STATUS_SUCCESS(status))
-				qdf_mem_free(cur_node);
-			cur_lst = next_lst;
-			next_lst = NULL;
-			cur_node = NULL;
-			continue;
-		}
-
-		if (!qdf_mem_cmp(cur_node->bssid.bytes,
-		    bss_descr->bssId, QDF_MAC_ADDR_SIZE))
-			break;
-		cur_lst = next_lst;
-		next_lst = NULL;
-		cur_node = NULL;
-	}
-
-	if (cur_node) {
-		time_diff = cur_time - cur_node->time_during_rejection;
-		if (!(time_diff > cur_node->retry_delay ||
-		   bss_descr->rssi_raw >= cur_node->expected_rssi)) {
-			sme_err("Don't Attempt to connect %pM (time diff %d retry delay %d rssi %d expected rssi %d)",
-				cur_node->bssid.bytes, time_diff,
-				cur_node->retry_delay, bss_descr->rssi_raw,
-				cur_node->expected_rssi);
-			return true;
-		}
-		sme_debug("Remove %pM as time diff %d is greater retry delay %d or RSSI %d is greater than expected %d",
-				cur_node->bssid.bytes, time_diff,
-				cur_node->retry_delay,
-				bss_descr->rssi_raw,
-				cur_node->expected_rssi);
-		status = qdf_list_remove_node(list, cur_lst);
-		if (QDF_IS_STATUS_SUCCESS(status))
-			qdf_mem_free(cur_node);
-	}
-
-	return false;
-}
-
-/**
- * csr_filter_ap_due_to_rssi_reject() - filter the AP who has sent
- * assoc reject due to RSSI if condition has not improved
- * @mac_ctx: mac context
- * @scan_list: candidate list for the connection
- *
- * Return: void
- */
-static void csr_filter_ap_due_to_rssi_reject(struct mac_context *mac_ctx,
-					     struct scan_result_list *scan_list)
-{
-	tListElem *cur_entry;
-	tListElem *next_entry;
-	struct tag_csrscan_result *scan_res;
-	bool remove;
-
-	if (!scan_list ||
-	   !qdf_list_size(&mac_ctx->roam.rssi_disallow_bssid))
-		return;
-
-	cur_entry = csr_ll_peek_head(&scan_list->List, LL_ACCESS_NOLOCK);
-	while (cur_entry) {
-		scan_res = GET_BASE_ADDR(cur_entry, struct tag_csrscan_result,
-					Link);
-		next_entry = csr_ll_next(&scan_list->List,
-						cur_entry, LL_ACCESS_NOLOCK);
-
-		qdf_mutex_acquire(&mac_ctx->roam.rssi_disallow_bssid_lock);
-		remove = csr_remove_ap_due_to_rssi(
-			&mac_ctx->roam.rssi_disallow_bssid,
-			&scan_res->Result.BssDescriptor);
-		qdf_mutex_release(&mac_ctx->roam.rssi_disallow_bssid_lock);
-
-		if (remove) {
-			csr_ll_remove_entry(&scan_list->List,
-				cur_entry, LL_ACCESS_NOLOCK);
-			csr_free_scan_result_entry(mac_ctx, scan_res);
-		}
-		cur_entry = next_entry;
-		next_entry = NULL;
-	}
-}
-
 /**
  * csr_remove_ap_with_assoc_disallowed() - Remove APs with assoc
  * disallowed bit set
@@ -2933,8 +2810,12 @@ QDF_STATUS csr_scan_get_result(struct mac_context *mac_ctx,
 	if (list)
 		sme_debug("num_entries %d", qdf_list_size(list));
 
+	/* Filter the scan list with the blacklist, rssi reject, avoided APs */
+	if (pFilter && pFilter->csrPersona == QDF_STA_MODE)
+		wlan_blm_filter_bssid(pdev, list);
+
 	if (!list || (list && !qdf_list_size(list))) {
-		sme_debug("get scan result failed");
+		sme_debug("scan list empty");
 		status = QDF_STATUS_E_NULL_VALUE;
 		goto error;
 	}
@@ -2956,10 +2837,9 @@ QDF_STATUS csr_scan_get_result(struct mac_context *mac_ctx,
 		/* Fail or No one wants the result. */
 		csr_scan_result_purge(mac_ctx, (tScanResultHandle) ret_list);
 	else {
-		if (pFilter && pFilter->csrPersona == QDF_STA_MODE) {
-			csr_filter_ap_due_to_rssi_reject(mac_ctx, ret_list);
+		if (pFilter && pFilter->csrPersona == QDF_STA_MODE)
 			csr_remove_ap_with_assoc_disallowed(mac_ctx, ret_list);
-		}
+
 		if (!csr_ll_count(&ret_list->List)) {
 			/* This mean that there is no match */
 			csr_ll_close(&ret_list->List);

+ 2 - 2
core/wma/src/wma_scan_roam.c

@@ -1353,9 +1353,9 @@ static QDF_STATUS wma_roam_scan_filter(tp_wma_handle wma_handle,
 	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_rejection_ap,
+		roam_params->rssi_reject_bssid_list,
 		MAX_RSSI_AVOID_BSSID_LIST *
-		sizeof(struct rssi_disallow_bssid));
+		sizeof(struct reject_ap_config_params));
 
 	if (params->lca_disallow_config_present) {
 		params->disallow_duration