diff --git a/Kbuild b/Kbuild index e9ecebd936c6..80f7d4413c14 100644 --- a/Kbuild +++ b/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 diff --git a/components/cfg/cfg_all.h b/components/cfg/cfg_all.h index 0570b71e9d2d..1933595347a2 100644 --- a/components/cfg/cfg_all.h +++ b/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 \ diff --git a/configs/default_defconfig b/configs/default_defconfig index a9e296c84c49..98dbff8e15b6 100644 --- a/configs/default_defconfig +++ b/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 diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 894dfe779b39..a547be723f97 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/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 diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index ac655ee6ccfc..49fca0f1a7b5 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -169,6 +169,7 @@ #include #include #include +#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); } diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index e2c26ab2508b..9402d8187b59 100644 --- a/core/mac/inc/sir_api.h +++ b/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; diff --git a/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c b/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c index 4f98d3fff38a..29c83b9a33c1 100644 --- a/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c +++ b/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) { /* diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c index c309d48b56c6..905e7c40f2f4 100644 --- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c +++ b/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; + 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); - - 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); } } diff --git a/core/mac/src/pe/lim/lim_types.h b/core/mac/src/pe/lim/lim_types.h index 036326e3e12b..db89259a04cf 100644 --- a/core/mac/src/pe/lim/lim_types.h +++ b/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 diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index c2353f93df9d..44f3950a8e8c 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -68,6 +68,7 @@ #include "qdf_util.h" #include "wlan_qct_sys.h" #include +#include #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; + struct reject_ap_info ap_info; - entry = qdf_mem_malloc(sizeof(*entry)); - if (!entry) - return; + 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; - 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"); - } - - 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); - - 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) diff --git a/core/mac/src/pe/lim/lim_utils.h b/core/mac/src/pe/lim/lim_utils.h index 6b97633e184a..1d1d1c8bfd8d 100644 --- a/core/mac/src/pe/lim/lim_utils.h +++ b/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 diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h index 504b695a5b7d..839930b4e56e 100644 --- a/core/sme/inc/csr_internal.h +++ b/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; }; diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 98325eb0fc14..48a2bbdd45ae 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -62,6 +62,7 @@ #include "wlan_mlme_public_struct.h" #include #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); + struct reject_ap_config_params *reject_list; - roam_params->num_rssi_rejection_ap = qdf_list_size(list); - - if (!qdf_list_size(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); } /* diff --git a/core/sme/src/csr/csr_api_scan.c b/core/sme/src/csr/csr_api_scan.c index 8f1ac88dece8..4eabeacaccc4 100644 --- a/core/sme/src/csr/csr_api_scan.c +++ b/core/sme/src/csr/csr_api_scan.c @@ -49,6 +49,7 @@ #include #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); diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 64a491656195..7296c2b607bf 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/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