qcacmn: Move Blacklist filter while scoring the BSS

While BSS are scored apply blacklist logic to remove
blacklist AP or move the avoid AP at the end.

Change-Id: I3071b63732dba6763e2f48d0613b36e86bd780d9
CRs-Fixed: 2725143
This commit is contained in:
Abhishek Singh 2020-06-29 14:45:05 +05:30 • committed by snandini
commit 09403ed7d0
2 changed files with 58 additions and 8 deletions

View file

@ -87,6 +87,7 @@
#define CM_MAX_INDEX_PER_INI 4
#define CM_BEST_CANDIDATE_MAX_BSS_SCORE (CM_BEST_CANDIDATE_MAX_WEIGHT * 100)
#define CM_AVOID_CANDIDATE_MIN_SCORE 1
#define CM_GET_SCORE_PERCENTAGE(value32, bw_index) \
QDF_GET_BITS(value32, (8 * (bw_index)), 8)
@ -970,7 +971,7 @@ static void cm_list_insert_sorted(qdf_list_t *scan_list,
qdf_list_insert_back(scan_list, &scan_entry->node);
}
void wlan_cm_calculate_bss_score(struct wlan_objmgr_psoc *psoc,
void wlan_cm_calculate_bss_score(struct wlan_objmgr_pdev *pdev,
struct pcl_freq_weight_list *pcl_lst,
qdf_list_t *scan_list,
struct qdf_mac_addr *bssid_hint)
@ -982,7 +983,15 @@ void wlan_cm_calculate_bss_score(struct wlan_objmgr_psoc *psoc,
int pcl_chan_weight;
QDF_STATUS status;
struct psoc_phy_config *config;
enum cm_blacklist_action blacklist_action;
struct wlan_objmgr_psoc *psoc;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc) {
mlme_err("psoc NULL");
return;
}
if (!scan_list) {
mlme_err("Scan list NULL");
return;
@ -1014,7 +1023,10 @@ void wlan_cm_calculate_bss_score(struct wlan_objmgr_psoc *psoc,
scan_entry = qdf_container_of(cur_node, struct scan_cache_node,
node);
if (pcl_lst && pcl_lst->num_of_pcl_channels &&
blacklist_action =
wlan_blacklist_action_on_bssid(pdev, scan_entry->entry);
if (blacklist_action == CM_BLM_NO_ACTION &&
pcl_lst && pcl_lst->num_of_pcl_channels &&
scan_entry->entry->rssi_raw > CM_PCL_RSSI_THRESHOLD &&
score_config->weight_config.pcl_weightage) {
if (cm_get_pcl_weight_of_channel(
@ -1026,8 +1038,13 @@ void wlan_cm_calculate_bss_score(struct wlan_objmgr_psoc *psoc,
}
}
cm_calculate_bss_score(psoc, scan_entry->entry, pcl_chan_weight,
bssid_hint);
if (blacklist_action == CM_BLM_NO_ACTION)
cm_calculate_bss_score(psoc, scan_entry->entry,
pcl_chan_weight, bssid_hint);
else if (blacklist_action == CM_BLM_AVOID)
/* add min score so that it is added back in the end */
scan_entry->entry->bss_score =
CM_AVOID_CANDIDATE_MIN_SCORE;
/* Remove node from current locaion to add node back shorted */
status = qdf_list_remove_node(scan_list, cur_node);
@ -1035,8 +1052,16 @@ void wlan_cm_calculate_bss_score(struct wlan_objmgr_psoc *psoc,
mlme_err("failed to remove node from scan list");
return;
}
/* Add node back shorted */
cm_list_insert_sorted(scan_list, scan_entry);
/*
* If CM_BLM_REMOVE ie blacklisted then free the entry
* else add back to the list sorted
*/
if (blacklist_action == CM_BLM_REMOVE) {
util_scan_free_cache_entry(scan_entry->entry);
qdf_mem_free(scan_entry);
} else {
cm_list_insert_sorted(scan_list, scan_entry);
}
cur_node = next_node;
next_node = NULL;
}

View file

@ -148,9 +148,34 @@ struct pcl_freq_weight_list {
uint8_t pcl_weight_list[NUM_CHANNELS];
};
/**
* enum cm_blacklist_action - action taken by blacklist manager for the bssid
* @CM_BLM_NO_ACTION: No operation to be taken for the BSSID in the scan list.
* @CM_BLM_REMOVE: Remove the BSSID from the scan list (AP is blacklisted)
* @CM_BLM_AVOID: Add the Ap at last of the scan list (AP to Avoid)
*/
enum cm_blacklist_action {
CM_BLM_NO_ACTION,
CM_BLM_REMOVE,
CM_BLM_AVOID,
};
#ifdef FEATURE_BLACKLIST_MGR
enum cm_blacklist_action
wlan_blacklist_action_on_bssid(struct wlan_objmgr_pdev *pdev,
struct scan_cache_entry *entry);
#else
static inline enum cm_blacklist_action
wlan_blacklist_action_on_bssid(struct wlan_objmgr_pdev *pdev,
struct scan_cache_entry *entry)
{
return CM_BLM_NO_ACTION;
}
#endif
/**
* wlan_cm_calculate_bss_score() - calculate bss score for the scan list
* @psoc: pointer to psoc object
* @pdev: pointer to pdev object
* @pcl_list: pcl list for scoring
* @scan_list: scan list, contains the input list and after the
* func it will have sorted list
@ -158,7 +183,7 @@ struct pcl_freq_weight_list {
*
* Return: void
*/
void wlan_cm_calculate_bss_score(struct wlan_objmgr_psoc *psoc,
void wlan_cm_calculate_bss_score(struct wlan_objmgr_pdev *pdev,
struct pcl_freq_weight_list *pcl_lst,
qdf_list_t *scan_list,
struct qdf_mac_addr *bssid_hint);