qcacld-3.0: Use new scan API to get scan results in ACS

ACS used old csr API's to get scan results, move it to use
converged scan API.

Change-Id: Ic62ac940bb6a5cc2eb3ea0e9888807ed74974d3a
CRs-Fixed: 2450559
This commit is contained in:
Abhishek Singh 2019-05-10 11:22:21 +05:30 • committed by nshrivas
commit d1cd4aed4f
3 changed files with 131 additions and 111 deletions

View file

@ -49,6 +49,7 @@
#include <wlan_objmgr_vdev_obj.h>
#include <wlan_objmgr_pdev_obj.h>
#include "wlan_reg_services_api.h"
#include <wlan_scan_ucfg_api.h>
#include <wlan_scan_utils_api.h>
/*----------------------------------------------------------------------------
@ -175,17 +176,81 @@ static const char *acs_scan_done_status_str(eCsrScanStatus status)
}
}
#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
static void wlansap_send_acs_success_event(struct sap_context *sap_ctx,
uint32_t scan_id)
{
if (scan_id) {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
FL("Sending ACS Scan skip event"));
sap_signal_hdd_event(sap_ctx, NULL,
eSAP_ACS_SCAN_SUCCESS_EVENT,
(void *)eSAP_STATUS_SUCCESS);
} else {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
FL("ACS scanid: %d (skipped ACS SCAN)"),
scan_id);
}
}
#else
static inline void wlansap_send_acs_success_event(struct sap_context *sap_ctx,
uint32_t scan_id)
{
}
#endif
static uint8_t
wlansap_calculate_chan_from_scan_result(mac_handle_t mac_handle,
struct sap_context *sap_ctx,
uint32_t scan_id)
{
struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
qdf_list_t *list = NULL;
struct scan_filter *filter;
uint8_t oper_channel = SAP_CHANNEL_NOT_SELECTED;
filter = qdf_mem_malloc(sizeof(*filter));
if (filter)
filter->age_threshold = qdf_get_time_of_the_day_ms() -
sap_ctx->acs_req_timestamp;
list = ucfg_scan_get_result(mac_ctx->pdev, filter);
if (filter)
qdf_mem_free(filter);
if (list)
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
FL("num_entries %d"), qdf_list_size(list));
if (!list || (list && !qdf_list_size(list))) {
sme_err("get scan result failed");
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
FL("Failed to get scan results"));
if (list)
ucfg_scan_purge_results(list);
/*
* No scan results So, set the operation channel not selected
* to allow the default channel to be set when reporting to HDD
*/
return oper_channel;
}
wlansap_send_acs_success_event(sap_ctx, scan_id);
oper_channel = sap_select_channel(mac_handle, sap_ctx, list);
ucfg_scan_purge_results(list);
return oper_channel;
}
QDF_STATUS wlansap_pre_start_bss_acs_scan_callback(mac_handle_t mac_handle,
struct sap_context *sap_ctx,
uint8_t sessionid,
uint32_t scanid,
eCsrScanStatus scan_status)
{
tScanResultHandle presult = NULL;
QDF_STATUS scan_get_result_status = QDF_STATUS_E_FAILURE;
uint8_t oper_channel = 0;
QDF_STATUS status = QDF_STATUS_E_FAILURE;
tCsrScanResultFilter *filter;
uint8_t oper_channel = SAP_CHANNEL_NOT_SELECTED;
host_log_acs_scan_done(acs_scan_done_status_str(scan_status),
sessionid, scanid);
@ -206,54 +271,8 @@ QDF_STATUS wlansap_pre_start_bss_acs_scan_callback(mac_handle_t mac_handle,
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
FL("CSR scan_status = eCSR_SCAN_SUCCESS (%d)"), scan_status);
filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
if (!filter) {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
FL("Memory allocation for filter failed"));
} else {
filter->csrPersona = QDF_SAP_MODE;
filter->age_threshold = qdf_get_time_of_the_day_ms() -
sap_ctx->acs_req_timestamp;
}
/*
* Now do
* 1. Get scan results
* 2. Run channel selection algorithm
* select channel and store in sap_context->Channel
*/
scan_get_result_status = sme_scan_get_result(mac_handle,
sap_ctx->sessionId,
filter, &presult);
if (filter)
qdf_mem_free(filter);
if ((scan_get_result_status != QDF_STATUS_SUCCESS) &&
(scan_get_result_status != QDF_STATUS_E_NULL_VALUE)) {
/*
* No scan results So, set the operation channel not selected
* to allow the default channel to be set when reporting to HDD
*/
oper_channel = SAP_CHANNEL_NOT_SELECTED;
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
FL("Get scan result failed! ret = %d"),
scan_get_result_status);
} else {
#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
if (scanid != 0) {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
FL("Sending ACS Scan skip event"));
sap_signal_hdd_event(sap_ctx, NULL,
eSAP_ACS_SCAN_SUCCESS_EVENT,
(void *) eSAP_STATUS_SUCCESS);
} else {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
FL("ACS scanid: %d (skipped ACS SCAN)"),
scanid);
}
#endif
oper_channel = sap_select_channel(mac_handle, sap_ctx, presult);
sme_scan_result_purge(presult);
}
oper_channel = wlansap_calculate_chan_from_scan_result(mac_handle,
sap_ctx, scanid);
if (oper_channel == SAP_CHANNEL_NOT_SELECTED) {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
@ -286,7 +305,8 @@ close_session:
}
#endif
sap_hdd_signal_event_handler(sap_ctx);
return status;
return QDF_STATUS_SUCCESS;
}
/**

View file

@ -48,6 +48,7 @@
#include "cds_utils.h"
#include "pld_common.h"
#include "wlan_reg_services_api.h"
#include <wlan_scan_utils_api.h>
/*--------------------------------------------------------------------------
Function definitions
@ -324,36 +325,39 @@ sap_check_n_add_overlapped_chnls(struct sap_context *sap_ctx,
*/
static void sap_process_avoid_ie(mac_handle_t mac_handle,
struct sap_context *sap_ctx,
tScanResultHandle scan_result,
qdf_list_t *scan_list,
tSapChSelSpectInfo *spect_info)
{
uint32_t total_ie_len = 0;
const uint8_t *temp_ptr = NULL;
uint8_t i = 0;
struct sAvoidChannelIE *avoid_ch_ie;
tCsrScanResultInfo *node = NULL;
struct mac_context *mac_ctx = NULL;
tSapSpectChInfo *spect_ch = NULL;
qdf_list_node_t *cur_lst = NULL, *next_lst = NULL;
struct scan_cache_node *cur_node = NULL;
mac_ctx = MAC_CONTEXT(mac_handle);
spect_ch = spect_info->pSpectCh;
node = sme_scan_result_get_first(mac_handle, scan_result);
while (node) {
total_ie_len =
GET_IE_LEN_IN_BSS(node->BssDescriptor.length);
qdf_list_peek_front(scan_list, &cur_lst);
while (cur_lst) {
cur_node = qdf_container_of(cur_lst, struct scan_cache_node,
node);
temp_ptr = wlan_get_vendor_ie_ptr_from_oui(
SIR_MAC_QCOM_VENDOR_OUI,
SIR_MAC_QCOM_VENDOR_SIZE,
((uint8_t *)&node->BssDescriptor.ieFields),
total_ie_len);
util_scan_entry_ie_data(cur_node->entry),
util_scan_entry_ie_len(cur_node->entry));
if (temp_ptr) {
avoid_ch_ie = (struct sAvoidChannelIE *)temp_ptr;
if (avoid_ch_ie->type !=
QCOM_VENDOR_IE_MCC_AVOID_CH) {
node = sme_scan_result_get_next(mac_handle,
scan_result);
qdf_list_peek_next(scan_list,
cur_lst, &next_lst);
cur_lst = next_lst;
next_lst = NULL;
continue;
}
@ -386,7 +390,10 @@ static void sap_process_avoid_ie(mac_handle_t mac_handle,
break;
}
} /* if (temp_ptr) */
node = sme_scan_result_get_next(mac_handle, scan_result);
qdf_list_peek_next(scan_list, cur_lst, &next_lst);
cur_lst = next_lst;
next_lst = NULL;
}
}
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
@ -1511,13 +1518,12 @@ static bool ch_in_pcl(struct sap_context *sap_ctx, uint8_t channel)
*/
static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
mac_handle_t mac_handle,
tScanResultHandle pResult,
qdf_list_t *scan_list,
struct sap_context *sap_ctx)
{
int8_t rssi = 0;
uint8_t chn_num = 0;
uint8_t channel_id = 0;
tCsrScanResultInfo *scan_result;
tSapSpectChInfo *pSpectCh = pSpectInfoParams->pSpectCh;
uint32_t operatingBand;
uint16_t channelWidth;
@ -1527,15 +1533,16 @@ static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
bool found;
uint16_t centerFreq_2 = 0;
uint16_t vhtSupport;
uint32_t ieLen = 0;
tSirProbeRespBeacon *pBeaconStruct;
tSirProbeRespBeacon *bcn_struct;
struct mac_context *mac = MAC_CONTEXT(mac_handle);
tSapSpectChInfo *spectch_start = pSpectInfoParams->pSpectCh;
tSapSpectChInfo *spectch_end = pSpectInfoParams->pSpectCh +
pSpectInfoParams->numSpectChans;
qdf_list_node_t *cur_lst = NULL, *next_lst = NULL;
struct scan_cache_node *cur_node = NULL;
pBeaconStruct = qdf_mem_malloc(sizeof(tSirProbeRespBeacon));
if (!pBeaconStruct)
bcn_struct = qdf_mem_malloc(sizeof(tSirProbeRespBeacon));
if (!bcn_struct)
return;
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
@ -1546,9 +1553,13 @@ static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
*/
SET_ACS_BAND(operatingBand, sap_ctx);
scan_result = sme_scan_result_get_first(mac_handle, pResult);
qdf_list_peek_front(scan_list, &cur_lst);
while (cur_lst) {
uint32_t ie_len = 0;
uint8_t *ie_ptr;
while (scan_result) {
cur_node = qdf_container_of(cur_lst, struct scan_cache_node,
node);
pSpectCh = pSpectInfoParams->pSpectCh;
/* Defining the default values, so that any value will hold the default values */
channelWidth = eHT_CHANNEL_WIDTH_20MHZ;
@ -1556,19 +1567,15 @@ static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
vhtSupport = 0;
centerFreq = 0;
ie_len = util_scan_entry_ie_len(cur_node->entry);
ie_ptr = util_scan_entry_ie_data(cur_node->entry);
qdf_mem_zero((uint8_t *)bcn_struct,
sizeof(tSirProbeRespBeacon));
ieLen = GET_IE_LEN_IN_BSS(
scan_result->BssDescriptor.length);
qdf_mem_zero((uint8_t *) pBeaconStruct,
sizeof(tSirProbeRespBeacon));
if ((sir_parse_beacon_ie
(mac, pBeaconStruct, (uint8_t *)
(scan_result->BssDescriptor.ieFields),
ieLen)) == QDF_STATUS_SUCCESS)
if ((sir_parse_beacon_ie(mac, bcn_struct, ie_ptr, ie_len)) ==
QDF_STATUS_SUCCESS)
sap_upd_chan_spec_params(
pBeaconStruct,
bcn_struct,
&channelWidth,
&secondaryChannelOffset,
&vhtSupport, &centerFreq,
@ -1578,22 +1585,14 @@ static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
for (chn_num = 0; chn_num < pSpectInfoParams->numSpectChans;
chn_num++) {
/*
* If the Beacon has channel ID, use it other wise we
* will rely on the channelIdSelf
*/
if (scan_result->BssDescriptor.channelId == 0)
channel_id =
scan_result->BssDescriptor.channelIdSelf;
else
channel_id =
scan_result->BssDescriptor.channelId;
channel_id =
util_scan_entry_channel_num(cur_node->entry);
if (pSpectCh && (channel_id == pSpectCh->chNum)) {
if (pSpectCh->rssiAgr <
scan_result->BssDescriptor.rssi)
cur_node->entry->rssi_raw)
pSpectCh->rssiAgr =
scan_result->BssDescriptor.rssi;
cur_node->entry->rssi_raw;
++pSpectCh->bssCount; /* Increment the count of BSS */
@ -1639,13 +1638,11 @@ static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
QDF_TRACE(QDF_MODULE_ID_SAP,
QDF_TRACE_LEVEL_INFO_HIGH,
"In %s, bssdes.ch_self=%d, bssdes.ch_ID=%d, bssdes.rssi=%d, SpectCh.bssCount=%d, scan_result=%pK, ChannelWidth %d, secondaryChanOffset %d, center frequency %d",
"In %s, channel_id=%d, bssdes.rssi=%d, SpectCh.bssCount=%d, ChannelWidth %d, secondaryChanOffset %d, center frequency %d",
__func__,
scan_result->BssDescriptor.
channelIdSelf,
scan_result->BssDescriptor.channelId,
scan_result->BssDescriptor.rssi,
pSpectCh->bssCount, scan_result,
channel_id,
cur_node->entry->rssi_raw,
pSpectCh->bssCount,
pSpectCh->channelWidth,
secondaryChannelOffset, centerFreq);
pSpectCh++;
@ -1655,9 +1652,13 @@ static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
}
}
scan_result = sme_scan_result_get_next(mac_handle, pResult);
qdf_list_peek_next(scan_list, cur_lst, &next_lst);
cur_lst = next_lst;
next_lst = NULL;
}
qdf_mem_free(bcn_struct);
/* Calculate the weights for all channels in the spectrum pSpectCh */
pSpectCh = pSpectInfoParams->pSpectCh;
@ -1734,7 +1735,6 @@ debug_info:
pSpectCh++;
}
sap_clear_channel_status(mac);
qdf_mem_free(pBeaconStruct);
}
/*==========================================================================
@ -2623,7 +2623,7 @@ static uint8_t sap_select_channel_no_scan_result(mac_handle_t mac_handle,
uint8_t sap_select_channel(mac_handle_t mac_handle,
struct sap_context *sap_ctx,
tScanResultHandle scan_result)
qdf_list_t *scan_list)
{
/* DFS param object holding all the data req by the algo */
tSapChSelSpectInfo spect_info_obj = { NULL, 0 };
@ -2649,7 +2649,7 @@ uint8_t sap_select_channel(mac_handle_t mac_handle,
* If ACS weight is not enabled on noise_floor/channel_free/tx_power,
* then skip acs process if no bss found.
*/
if (!scan_result &&
if (!scan_list &&
!(sap_ctx->auto_channel_select_weight & 0xffff00)) {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
FL("No external AP present"));
@ -2668,11 +2668,11 @@ uint8_t sap_select_channel(mac_handle_t mac_handle,
return SAP_CHANNEL_NOT_SELECTED;
}
/* Compute the weight of the entire spectrum in the operating band */
sap_compute_spect_weight(spect_info, mac_handle, scan_result, sap_ctx);
sap_compute_spect_weight(spect_info, mac_handle, scan_list, sap_ctx);
#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
/* process avoid channel IE to collect all channels to avoid */
sap_process_avoid_ie(mac_handle, sap_ctx, scan_result, spect_info);
sap_process_avoid_ie(mac_handle, sap_ctx, scan_list, spect_info);
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
wlan_reg_read_current_country(mac_ctx->psoc, country);

View file

@ -285,7 +285,7 @@ QDF_STATUS wlansap_pre_start_bss_acs_scan_callback(mac_handle_t mac_handle,
* sap_select_channel() - select SAP channel
* @mac_handle: Opaque handle to the global MAC context
* @sap_ctx: Sap context
* @scan_result: Handle to scan results
* @scan_list: scan entry list
*
* Runs a algorithm to select the best channel to operate in based on BSS
* rssi and bss count on each channel
@ -293,7 +293,7 @@ QDF_STATUS wlansap_pre_start_bss_acs_scan_callback(mac_handle_t mac_handle,
* Returns: channel number if success, 0 otherwise
*/
uint8_t sap_select_channel(mac_handle_t mac_handle, struct sap_context *sap_ctx,
tScanResultHandle scan_result);
qdf_list_t *scan_list);
QDF_STATUS
sap_signal_hdd_event(struct sap_context *sap_ctx,