qca-wifi: Add mac filtering support for connection manager

Implement mac filtering APIS that will be used by connection manager.
The mac filter will hold the list of bssid that needs to
excluded in candidate selection.

Change-Id: Id72cdfe67703aca1dd77ad5705c5bf57b641ac26
Bu işleme şunda yer alıyor:
Santosh Anbu
2020-08-01 19:57:08 +05:30
ebeveyn ad2999e347
işleme ad3055cf23
3 değiştirilmiş dosya ile 256 ekleme ve 0 silme

Dosyayı Görüntüle

@@ -0,0 +1,127 @@
/*
* Copyright (c) 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 above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: Implement APIs related to the Blacklist manager
*/
#include <wlan_objmgr_cmn.h>
#include <wlan_objmgr_pdev_obj.h>
#include <wlan_scan_utils_api.h>
#include <wlan_cm_bss_score_param.h>
#include <wlan_cm_blm.h>
#include "wlan_cm_blm_main.h"
static void blm_filter_vdev_mac_cmp(struct wlan_objmgr_pdev *pdev,
void *obj, void *args)
{
struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)obj;
struct blm_entry_iter_obj *blm_obj = (struct blm_entry_iter_obj *)args;
uint8_t *scan_entry_mac;
if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE)
blm_obj->sta_vdev = vdev;
if (blm_obj->match)
return;
scan_entry_mac = util_scan_entry_macaddr(blm_obj->db_entry);
if (qdf_mem_cmp(scan_entry_mac,
wlan_vdev_mlme_get_macaddr(vdev),
QDF_MAC_ADDR_SIZE) == 0) {
blm_obj->match = true;
}
}
enum cm_blacklist_action
wlan_blacklist_action_on_bssid(struct wlan_objmgr_pdev *pdev,
struct scan_cache_entry *entry)
{
struct blm_entry_iter_obj blm_iter_obj = {0};
uint8_t (*exc_mac_list)[QDF_MAC_ADDR_SIZE] = NULL;
uint8_t *scan_entry_mac;
struct wlan_objmgr_vdev *sta_vdev;
enum cm_blm_exc_mac_mode exc_mac_status;
uint8_t num_exc_mac = 0;
qdf_time_t bad_ap_timeout = 0;
qdf_time_t time_diff = 0;
uint8_t idx;
/*
* Avoid scan entry with bssid matching any of the vdev mac
*/
blm_iter_obj.db_entry = entry;
blm_iter_obj.match = false;
wlan_objmgr_pdev_iterate_obj_list(
pdev, WLAN_VDEV_OP,
blm_filter_vdev_mac_cmp,
&blm_iter_obj, 0, WLAN_SCAN_ID);
if (blm_iter_obj.match) {
qdf_info("Ignore entry %pM match vdev mac", entry->bssid.bytes);
return CM_BLM_REMOVE;
}
if (!blm_iter_obj.sta_vdev)
return CM_BLM_NO_ACTION;
sta_vdev = blm_iter_obj.sta_vdev;
/*
* Skip scan entry that is marked as BAD AP
*/
bad_ap_timeout = wlan_cm_get_bad_ap_timeout(sta_vdev);
if (wlan_cm_blm_scan_mlme_get_status(entry) & AP_STATE_BAD) {
time_diff = qdf_system_ticks() -
wlan_cm_blm_scan_mlme_get_bad_ap_time(entry);
if (!bad_ap_timeout ||
(qdf_system_ticks_to_msecs(time_diff) > bad_ap_timeout)) {
wlan_cm_blm_scan_mlme_set_bad_ap_time(entry, 0);
wlan_cm_blm_scan_mlme_set_status(entry,
AP_STATE_GOOD);
} else {
qdf_info("Ignore bssid entry %pM", entry->bssid.bytes);
return CM_BLM_REMOVE;
}
}
/*
* Skip scan entries in the excluded mac address list
*/
exc_mac_status = wlan_cm_get_exc_mac_addr_list(sta_vdev,
&exc_mac_list,
&num_exc_mac);
if (exc_mac_status == CM_BLM_EXC_MAC_ALL) {
qdf_info("Ignore bssid entry %pM", entry->bssid.bytes);
return CM_BLM_REMOVE;
} else if (exc_mac_status == CM_BLM_EXC_MAC_NONE) {
return CM_BLM_NO_ACTION;
}
scan_entry_mac = util_scan_entry_macaddr(entry);
for (idx = 0; idx < num_exc_mac; idx++) {
if (qdf_mem_cmp(scan_entry_mac,
exc_mac_list[idx],
QDF_MAC_ADDR_SIZE) == 0) {
qdf_info("Ignore bssid entry %pM", entry->bssid.bytes);
return CM_BLM_REMOVE;
}
}
return CM_BLM_NO_ACTION;
}

Dosyayı Görüntüle

@@ -0,0 +1,38 @@
/*
* Copyright (c) 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 above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: Define APIs related to the Blacklist manager
*/
#ifndef _WLAN_CM_BLM_MAIN_H_
#define _WLAN_CM_BLM_MAIN_H_
#include <wlan_scan_public_structs.h>
/**
* blm_entry_iter_obj - Object of blm iter function
* @db_entry: scan entry object
* @sta_vdev: station's vdev object
* @match: Hold the operation result
*/
struct blm_entry_iter_obj {
struct scan_cache_entry *db_entry;
struct wlan_objmgr_vdev *sta_vdev;
bool match;
};
#endif

Dosyayı Görüntüle

@@ -0,0 +1,91 @@
/*
* Copyright (c) 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 above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: Define APIs related to the Blacklist manager
*/
#ifndef _WLAN_CM_BLM_H_
#define _WLAN_CM_BLM_H_
#include <wlan_scan_utils_api.h>
/*
* Flags used to set field APState
*/
#define AP_STATE_GOOD 0x00
#define AP_STATE_BAD 0x01
#define AP_STATE_RETRY 0x10
/**
* enum cm_blm_exc_mac_mode - Exclude mac list mode
* @CM_BLM_EXC_MAC_NONE - No entries in exclude mac list
* @CM_BLM_EXC_MAC_FEW - Entries available in exclude mac list
* @CM_BLM_EXC_MAC_ALL - Ignore all the mac
*/
enum cm_blm_exc_mac_mode {
CM_BLM_EXC_MAC_NONE,
CM_BLM_EXC_MAC_FEW,
CM_BLM_EXC_MAC_ALL,
};
static inline uint32_t
wlan_cm_blm_scan_mlme_get_status(struct scan_cache_entry *scan_entry)
{
return util_scan_entry_mlme_info(scan_entry)->status;
}
static inline void
wlan_cm_blm_scan_mlme_set_status(struct scan_cache_entry *scan_entry, uint32_t val)
{
util_scan_entry_mlme_info(scan_entry)->status = val;
}
static inline qdf_time_t
wlan_cm_blm_scan_mlme_get_bad_ap_time(struct scan_cache_entry *scan_entry)
{
return util_scan_entry_mlme_info(scan_entry)->bad_ap_time;
}
static inline void
wlan_cm_blm_scan_mlme_set_bad_ap_time(struct scan_cache_entry *scan_entry, qdf_time_t val)
{
util_scan_entry_mlme_info(scan_entry)->bad_ap_time = val;
}
/*
* wlan_cm_get_exc_mac_addr_list: Get excluded mac address list
* @vdev: vdev object
* @exc_mac_list: Pointer to the excluded mac address list
* @exc_mac_count: Number of entries in the excluded list
*
* Return: Status of the excluded mac addresses
*/
enum cm_blm_exc_mac_mode wlan_cm_get_exc_mac_addr_list(
struct wlan_objmgr_vdev *vdev,
uint8_t (**exc_mac_list)[QDF_MAC_ADDR_SIZE],
uint8_t *exc_mac_count);
/*
* wlan_cm_get_bad_ap_timeout: Get bad ap timeout duration
* @vdev: vdev object
*
* Return: Congfigured bad ap timeout value
*/
qdf_time_t wlan_cm_get_bad_ap_timeout(struct wlan_objmgr_vdev *vdev);
#endif