From d7c24f8a19cda0cccabec09f07c362a29ccf0040 Mon Sep 17 00:00:00 2001 From: Amruta Kulkarni Date: Thu, 27 Feb 2020 16:49:39 -0800 Subject: [PATCH] qcacld-3.0: Add support to handle assoc reject based on rssi When AP rejects assoc request based on poor rssi host will put the AP in blacklist mgr list, only when rssi value improves by threshold value,should the STA try to connect to AP. Change-Id: I78009b89ea07afdd5f3381973a9eb7ec1f73d1b5 CRs-Fixed: 2632015 --- .../blacklist_mgr/core/inc/wlan_blm_core.h | 13 ++++++- .../blacklist_mgr/core/inc/wlan_blm_main.h | 6 ++- .../blacklist_mgr/core/src/wlan_blm_core.c | 38 ++++++++++++++++--- .../blacklist_mgr/core/src/wlan_blm_main.c | 4 +- .../dispatcher/inc/wlan_cfg_blm.h | 32 +++++++++++++++- core/mac/inc/sir_mac_prot_def.h | 2 + .../src/pe/lim/lim_process_assoc_rsp_frame.c | 11 +++++- .../src/pe/lim/lim_process_disassoc_frame.c | 11 ++++++ .../src/pe/lim/lim_process_sme_req_messages.c | 15 ++++++-- core/wma/inc/wma_if.h | 2 + core/wma/src/wma_scan_roam.c | 2 + 11 files changed, 121 insertions(+), 15 deletions(-) diff --git a/components/blacklist_mgr/core/inc/wlan_blm_core.h b/components/blacklist_mgr/core/inc/wlan_blm_core.h index 0f3a071995fb..697c56f4b518 100644 --- a/components/blacklist_mgr/core/inc/wlan_blm_core.h +++ b/components/blacklist_mgr/core/inc/wlan_blm_core.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -247,4 +247,15 @@ blm_get_bssid_reject_list(struct wlan_objmgr_pdev *pdev, struct reject_ap_config_params *reject_list, uint8_t max_bssid_to_be_filled, enum blm_reject_ap_type reject_ap_type); + +/** + * blm_get_rssi_blacklist_threshold() - Get rssi blacklist threshold value + * @pdev: pdev object + * + * This API will get the RSSI blacklist threshold info. + * + * Return: rssi theshold value + */ +int32_t +blm_get_rssi_blacklist_threshold(struct wlan_objmgr_pdev *pdev); #endif diff --git a/components/blacklist_mgr/core/inc/wlan_blm_main.h b/components/blacklist_mgr/core/inc/wlan_blm_main.h index 7f3b43267a0b..7a290c06ecab 100644 --- a/components/blacklist_mgr/core/inc/wlan_blm_main.h +++ b/components/blacklist_mgr/core/inc/wlan_blm_main.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -61,12 +61,16 @@ struct blm_pdev_priv_obj { * @bad_bssid_counter_thresh: This is the threshold count which is incremented * after every NUD fail, and after this much count, the BSSID would be moved to * blacklist. + * @delta_rssi: This is the rssi threshold, only when rssi + * improves by this value the entry for BSSID should be removed from black + * list manager list. */ struct blm_config { qdf_time_t avoid_list_exipry_time; qdf_time_t black_list_exipry_time; qdf_time_t bad_bssid_counter_reset_time; uint8_t bad_bssid_counter_thresh; + uint32_t delta_rssi; }; /** diff --git a/components/blacklist_mgr/core/src/wlan_blm_core.c b/components/blacklist_mgr/core/src/wlan_blm_core.c index f12eddd0b01b..40d28424bbc8 100644 --- a/components/blacklist_mgr/core/src/wlan_blm_core.c +++ b/components/blacklist_mgr/core/src/wlan_blm_core.c @@ -28,6 +28,7 @@ #define SECONDS_TO_MS(params) (params * 1000) #define MINUTES_TO_MS(params) (SECONDS_TO_MS(params) * 60) +#define RSSI_TIMEOUT_VALUE 60 static void blm_update_ap_info(struct blm_reject_ap *blm_entry, struct blm_config *cfg, @@ -94,7 +95,8 @@ blm_update_ap_info(struct blm_reject_ap *blm_entry, struct blm_config *cfg, qdf_time_t entry_age = cur_timestamp - blm_entry->ap_timestamp.rssi_reject_timestamp; - if ((entry_age > blm_entry->rssi_reject_params.retry_delay) || + if ((blm_entry->rssi_reject_params.retry_delay && + entry_age > blm_entry->rssi_reject_params.retry_delay) || (scan_entry && (scan_entry->rssi_raw > blm_entry-> rssi_reject_params.expected_rssi))) { /* @@ -421,7 +423,7 @@ blm_get_delta_of_bssid(enum blm_reject_ap_type list_type, struct blm_config *cfg) { qdf_time_t cur_timestamp = qdf_mc_timer_get_system_time(); - + int32_t disallowed_time; /* * For all the list types, delta would be the entry age only. Hence the * oldest entry would be removed first in case of list is full, and the @@ -451,9 +453,16 @@ blm_get_delta_of_bssid(enum blm_reject_ap_type list_type, * de-blacklisting the AP from rssi reject list. */ case DRIVER_RSSI_REJECT_TYPE: - return blm_entry->rssi_reject_params.retry_delay - - (cur_timestamp - - blm_entry->ap_timestamp.rssi_reject_timestamp); + if (blm_entry->rssi_reject_params.retry_delay) { + return blm_entry->rssi_reject_params.retry_delay - + (cur_timestamp - + blm_entry->ap_timestamp.rssi_reject_timestamp); + } else { + disallowed_time = (int32_t)(MINUTES_TO_MS(RSSI_TIMEOUT_VALUE) - + (cur_timestamp - + blm_entry->ap_timestamp.rssi_reject_timestamp)); + return ((disallowed_time < 0) ? 0 : disallowed_time); + } case DRIVER_MONITOR_TYPE: return cur_timestamp - blm_entry->ap_timestamp.driver_monitor_timestamp; @@ -1054,3 +1063,22 @@ blm_update_bssid_connect_params(struct wlan_objmgr_pdev *pdev, qdf_mutex_release(&blm_ctx->reject_ap_list_lock); } + +int32_t blm_get_rssi_blacklist_threshold(struct wlan_objmgr_pdev *pdev) +{ + struct blm_pdev_priv_obj *blm_ctx; + struct blm_psoc_priv_obj *blm_psoc_obj; + struct blm_config *cfg; + + blm_ctx = blm_get_pdev_obj(pdev); + blm_psoc_obj = blm_get_psoc_obj(wlan_pdev_get_psoc(pdev)); + + if (!blm_ctx || !blm_psoc_obj) { + blm_err("blm_ctx or blm_psoc_obj is NULL"); + return 0; + } + + cfg = &blm_psoc_obj->blm_cfg; + return cfg->delta_rssi; +} + diff --git a/components/blacklist_mgr/core/src/wlan_blm_main.c b/components/blacklist_mgr/core/src/wlan_blm_main.c index 003150b5c149..f965683c29d4 100644 --- a/components/blacklist_mgr/core/src/wlan_blm_main.c +++ b/components/blacklist_mgr/core/src/wlan_blm_main.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -167,6 +167,8 @@ blm_init_cfg(struct wlan_objmgr_psoc *psoc, struct blm_config *blm_cfg) cfg_get(psoc, CFG_BAD_BSSID_RESET_TIME); blm_cfg->bad_bssid_counter_thresh = cfg_get(psoc, CFG_BAD_BSSID_COUNTER_THRESHOLD); + blm_cfg->delta_rssi = + cfg_get(psoc, CFG_BLACKLIST_RSSI_THRESHOLD); } QDF_STATUS diff --git a/components/blacklist_mgr/dispatcher/inc/wlan_cfg_blm.h b/components/blacklist_mgr/dispatcher/inc/wlan_cfg_blm.h index bf7abac33cad..47de605e12a9 100644 --- a/components/blacklist_mgr/dispatcher/inc/wlan_cfg_blm.h +++ b/components/blacklist_mgr/dispatcher/inc/wlan_cfg_blm.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -132,11 +132,39 @@ CFG_VALUE_OR_DEFAULT, \ "bad bssid reset time") +/* + * + * delta_rssi - RSSI threshold value, only when AP rssi improves + * by threshold value entry would be removed from blacklist manager and assoc + * req would be sent by FW. + * @Min: 0 + * @Max: 10 + * @Default: 5 + * + * This ini is used to specify the rssi threshold value, after rssi improves + * by threshold the BSSID which is in the blacklist manager list should be + * removed from the respective list. + * + * Supported Feature: Customer requirement + * + * Usage: Internal/External + * + * + */ +#define CFG_BLACKLIST_RSSI_THRESHOLD CFG_INI_INT( \ + "delta_rssi", \ + 0, \ + 10, \ + 5, \ + CFG_VALUE_OR_DEFAULT, \ + "Configure delta RSSI") + #define CFG_BLACKLIST_MGR_ALL \ CFG(CFG_AVOID_LIST_EXPIRY_TIME) \ CFG(CFG_BAD_BSSID_COUNTER_THRESHOLD) \ CFG(CFG_BLACK_LIST_EXPIRY_TIME) \ - CFG(CFG_BAD_BSSID_RESET_TIME) + CFG(CFG_BAD_BSSID_RESET_TIME) \ + CFG(CFG_BLACKLIST_RSSI_THRESHOLD) #else diff --git a/core/mac/inc/sir_mac_prot_def.h b/core/mac/inc/sir_mac_prot_def.h index d2569ed4fcf2..a0efa2d71d3f 100644 --- a/core/mac/inc/sir_mac_prot_def.h +++ b/core/mac/inc/sir_mac_prot_def.h @@ -479,6 +479,8 @@ typedef enum eSirMacReasonCodes { eSIR_MAC_PEER_TIMEDOUT_REASON = 39, /* Requested from peer STA due to timeout */ eSIR_MAC_CIPHER_NOT_SUPPORTED_REASON = 45, /* Peer STA does not support the requested cipher suite */ eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON = 46, /* FT reason */ + eSIR_MAC_POOR_RSSI_CONDITIONS = 71, /* Disassociated due to poor RSSI conditions */ + /* reserved 47 - 65535. */ /* 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 6702cf756953..9e2a70172124 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 @@ -41,6 +41,7 @@ #include "lim_ser_des_utils.h" #include "lim_send_messages.h" #include "lim_process_fils.h" +#include "wlan_blm_core.h" /** * lim_update_stads_htcap() - Updates station Descriptor HT capability @@ -795,11 +796,17 @@ lim_process_assoc_rsp_frame(struct mac_context *mac_ctx, assoc_rsp->rssi_assoc_rej.present) { struct sir_rssi_disallow_lst ap_info = {{0}}; + if (!assoc_rsp->rssi_assoc_rej.retry_delay) + ap_info.expected_rssi = assoc_rsp->rssi_assoc_rej.delta_rssi + + WMA_GET_RX_RSSI_NORMALIZED(rx_pkt_info) + + blm_get_rssi_blacklist_threshold(mac_ctx->pdev); + else + ap_info.expected_rssi = assoc_rsp->rssi_assoc_rej.delta_rssi + + WMA_GET_RX_RSSI_NORMALIZED(rx_pkt_info); + ap_info.retry_delay = assoc_rsp->rssi_assoc_rej.retry_delay * QDF_MC_TIMER_TO_MS_UNIT; 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_add_bssid_to_reject_list(mac_ctx->pdev, &ap_info); } if (assoc_rsp->status_code != eSIR_MAC_SUCCESS_STATUS) { diff --git a/core/mac/src/pe/lim/lim_process_disassoc_frame.c b/core/mac/src/pe/lim/lim_process_disassoc_frame.c index d6afd50d76bf..e31088395baf 100644 --- a/core/mac/src/pe/lim/lim_process_disassoc_frame.c +++ b/core/mac/src/pe/lim/lim_process_disassoc_frame.c @@ -41,6 +41,7 @@ #include "lim_ser_des_utils.h" #include "lim_send_messages.h" #include "sch_api.h" +#include "wlan_blm_core.h" /** * lim_process_disassoc_frame @@ -246,6 +247,7 @@ lim_process_disassoc_frame(struct mac_context *mac, uint8_t *pRxPacketInfo, switch (reasonCode) { case eSIR_MAC_DEAUTH_LEAVING_BSS_REASON: case eSIR_MAC_DISASSOC_LEAVING_BSS_REASON: + case eSIR_MAC_POOR_RSSI_CONDITIONS: /* Valid reasonCode in received Disassociation frame */ /* as long as we're not about to channel switch */ if (pe_session->gLimChannelSwitch.state != @@ -299,6 +301,15 @@ lim_process_disassoc_frame(struct mac_context *mac, uint8_t *pRxPacketInfo, } /* if (sta->mlmStaContext.mlmState != eLIM_MLM_LINK_ESTABLISHED_STATE) */ + if (reasonCode == eSIR_MAC_POOR_RSSI_CONDITIONS) { + struct sir_rssi_disallow_lst ap_info = {{0}}; + + ap_info.retry_delay = 0; + ap_info.expected_rssi = frame_rssi + + blm_get_rssi_blacklist_threshold(mac->pdev); + qdf_mem_copy(ap_info.bssid.bytes, pHdr->sa, QDF_MAC_ADDR_SIZE); + lim_add_bssid_to_reject_list(mac->pdev, &ap_info); + } lim_extract_ies_from_deauth_disassoc(pe_session, (uint8_t *)pHdr, WMA_GET_RX_MPDU_LEN(pRxPacketInfo)); lim_perform_disassoc(mac, frame_rssi, reasonCode, 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 0f779744fd82..c919ebe8176e 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 @@ -6199,10 +6199,19 @@ void lim_add_roam_blacklist_ap(struct mac_context *mac_ctx, for (i = 0; i < src_lst->num_entries; i++) { 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; + /* If timeout = 0 and rssi = 0 ignore the entry */ + if (!blacklist->timeout && !blacklist->rssi) { + continue; + } else if (blacklist->timeout) { + entry.retry_delay = blacklist->timeout; + /* set 0dbm as expected rssi */ + entry.expected_rssi = LIM_MIN_RSSI; + } else { + /* blacklist timeout as 0 */ + entry.retry_delay = blacklist->timeout; + entry.expected_rssi = blacklist->rssi; + } /* 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/wma/inc/wma_if.h b/core/wma/inc/wma_if.h index 293debaf4b4e..f506eefd52b1 100644 --- a/core/wma/inc/wma_if.h +++ b/core/wma/inc/wma_if.h @@ -774,11 +774,13 @@ typedef struct sStatsExtRequest { * @bssid - bssid that is to be blacklisted * @timeout - time duration for which the bssid is blacklisted * @received_time - boot timestamp at which the firmware event was received + * @rssi - rssi value for which the bssid is blacklisted */ struct roam_blacklist_timeout { struct qdf_mac_addr bssid; uint32_t timeout; qdf_time_t received_time; + int32_t rssi; }; /* diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 80f2f98e316e..c649fc17e209 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -80,6 +80,7 @@ #include #include #include +#include "wlan_blm_core.h" #ifdef FEATURE_WLAN_DIAG_SUPPORT /* FEATURE_WLAN_DIAG_SUPPORT */ #include "host_diag_core_log.h" @@ -1426,6 +1427,7 @@ static QDF_STATUS wma_roam_scan_filter(tp_wma_handle wma_handle, 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 = blm_get_rssi_blacklist_threshold(wma_handle->pdev); qdf_mem_copy(params->bssid_avoid_list, roam_params->bssid_avoid_list, MAX_BSSID_AVOID_LIST * sizeof(struct qdf_mac_addr));