From e062e823521c37d6fb5588d3663a29319cc6d3cf Mon Sep 17 00:00:00 2001 From: Sandeep Puligilla Date: Wed, 28 Feb 2018 00:27:10 -0800 Subject: [PATCH] qcacmn: Never ageout connected AP scan entry Connected AP scan entry is aged out if beacon is not recieved within scan age out time. Update mlme information of the connected AP/BSSID scan entry so that scan age out hanlder will not age it out even though the last beacon recieved time is greater than the configured scan age out value. Change-Id: I14c68c28459080623ca62c0bad9052e38d7fb348 CRs-Fixed: 2183379 --- umac/scan/core/src/wlan_scan_cache_db.c | 55 ++++++++++++++++++- umac/scan/core/src/wlan_scan_cache_db.h | 12 ++++ .../dispatcher/inc/wlan_scan_public_structs.h | 6 ++ umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h | 9 +-- umac/scan/dispatcher/src/wlan_scan_ucfg_api.c | 10 ++++ 5 files changed, 87 insertions(+), 5 deletions(-) diff --git a/umac/scan/core/src/wlan_scan_cache_db.c b/umac/scan/core/src/wlan_scan_cache_db.c index 7b46afbce8dd..3687f3edd3a4 100644 --- a/umac/scan/core/src/wlan_scan_cache_db.c +++ b/umac/scan/core/src/wlan_scan_cache_db.c @@ -312,6 +312,12 @@ static void scm_check_and_age_out(struct scan_dbs *scan_db, } } +static bool scm_bss_is_connected(struct scan_cache_entry *entry) +{ + if (entry->mlme_info.assoc_state == SCAN_ENTRY_CON_STATE_ASSOC) + return true; + return false; +} void scm_age_out_entries(struct wlan_objmgr_psoc *psoc, struct scan_dbs *scan_db) { @@ -330,7 +336,8 @@ void scm_age_out_entries(struct wlan_objmgr_psoc *psoc, cur_node = scm_get_next_node(scan_db, &scan_db->scan_hash_tbl[i], NULL); while (cur_node) { - scm_check_and_age_out(scan_db, cur_node, + if (!scm_bss_is_connected(cur_node->entry)) + scm_check_and_age_out(scan_db, cur_node, def_param->scan_cache_aging_time); next_node = scm_get_next_node(scan_db, &scan_db->scan_hash_tbl[i], cur_node); @@ -1397,3 +1404,49 @@ QDF_STATUS scm_update_scan_mlme_info(struct wlan_objmgr_pdev *pdev, return QDF_STATUS_E_INVAL; } + +QDF_STATUS scm_scan_update_mlme_by_bssinfo(struct wlan_objmgr_pdev *pdev, + struct bss_info *bss_info, struct mlme_info *mlme) +{ + uint8_t hash_idx; + struct scan_dbs *scan_db; + struct scan_cache_node *cur_node; + struct scan_cache_node *next_node = NULL; + struct wlan_objmgr_psoc *psoc; + struct scan_cache_entry *entry; + + psoc = wlan_pdev_get_psoc(pdev); + if (!psoc) { + scm_err("psoc is NULL"); + return QDF_STATUS_E_INVAL; + } + scan_db = wlan_pdev_get_scan_db(psoc, pdev); + if (!scan_db) { + scm_err("scan_db is NULL"); + return QDF_STATUS_E_INVAL; + } + + hash_idx = SCAN_GET_HASH(bss_info->bssid.bytes); + cur_node = scm_get_next_node(scan_db, + &scan_db->scan_hash_tbl[hash_idx], NULL); + while (cur_node) { + entry = cur_node->entry; + if (qdf_is_macaddr_equal(&bss_info->bssid, &entry->bssid) && + (util_is_ssid_match(&bss_info->ssid, &entry->ssid)) && + (bss_info->chan == entry->channel.chan_idx)) { + /* Acquire db lock to prevent simultaneous update */ + qdf_spin_lock_bh(&scan_db->scan_db_lock); + qdf_mem_copy(&entry->mlme_info, mlme, + sizeof(struct mlme_info)); + scm_scan_entry_put_ref(scan_db, + cur_node, false); + qdf_spin_unlock_bh(&scan_db->scan_db_lock); + return QDF_STATUS_SUCCESS; + } + next_node = scm_get_next_node(scan_db, + &scan_db->scan_hash_tbl[hash_idx], cur_node); + cur_node = next_node; + } + + return QDF_STATUS_E_INVAL; +} diff --git a/umac/scan/core/src/wlan_scan_cache_db.h b/umac/scan/core/src/wlan_scan_cache_db.h index 38f5ee417453..6955beee39fe 100644 --- a/umac/scan/core/src/wlan_scan_cache_db.h +++ b/umac/scan/core/src/wlan_scan_cache_db.h @@ -195,4 +195,16 @@ QDF_STATUS scm_db_deinit(struct wlan_objmgr_psoc *psoc); */ void scm_validate_scoring_config( struct scoring_config *score_cfg); + +/** + * scm_scan_update_mlme_by_bssinfo() - updates scan entry with mlme data + * @pdev: pdev object + * @bss_info: BSS information + * + * This function updates scan db with scan_entry->mlme_info + * + * Return: QDF_STATUS + */ +QDF_STATUS scm_scan_update_mlme_by_bssinfo(struct wlan_objmgr_pdev *pdev, + struct bss_info *bss_info, struct mlme_info *mlme); #endif diff --git a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h index f4b8be4033ae..b85410bf0634 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h +++ b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h @@ -198,6 +198,12 @@ struct ie_list { uint8_t *mbo_oce; }; +enum scan_entry_connection_state { + SCAN_ENTRY_CON_STATE_NONE, + SCAN_ENTRY_CON_STATE_AUTH, + SCAN_ENTRY_CON_STATE_ASSOC +}; + /** * struct mlme_info - mlme specific info * temporarily maintained in scan cache for backward compatibility. diff --git a/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h b/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h index 7944fc6247b9..3a88265386a3 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h +++ b/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h @@ -331,10 +331,10 @@ ucfg_scan_db_iterate(struct wlan_objmgr_pdev *pdev, scan_iterator_func func, void *arg); /** - * ucfg_scan_update_mlme_info() - The Public API to update mlme + * ucfg_scan_update_mlme_by_bssinfo() - The Public API to update mlme * info in the scan entry - * @vdev: vdev object - * @bss: bss info to find the matching scan entry + * @pdev: pdev object + * @bssid: bssid info to find the matching scan entry * @mlme_info: mlme info to be updated. * * The Public API to update mlme info in the scan entry. @@ -343,7 +343,8 @@ ucfg_scan_db_iterate(struct wlan_objmgr_pdev *pdev, * Return: 0 for success or error code. */ QDF_STATUS -ucfg_scan_update_mlme_info(struct wlan_objmgr_vdev *vdev, struct bss_info *bss, +ucfg_scan_update_mlme_by_bssinfo(struct wlan_objmgr_pdev *pdev, + struct bss_info *bss_info, struct mlme_info *mlme_info); /** diff --git a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c index 90384fd68bd8..876764d26322 100644 --- a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c @@ -2166,6 +2166,16 @@ ucfg_scan_set_global_config(struct wlan_objmgr_psoc *psoc, return status; } +QDF_STATUS ucfg_scan_update_mlme_by_bssinfo(struct wlan_objmgr_pdev *pdev, + struct bss_info *bss_info, struct mlme_info *mlme) +{ + QDF_STATUS status; + + status = scm_scan_update_mlme_by_bssinfo(pdev, bss_info, mlme); + + return status; +} + QDF_STATUS ucfg_scan_get_global_config(struct wlan_objmgr_psoc *psoc, enum scan_config config, uint32_t *val)