qcacld-3.0: Support to configure RM enabled capability IE
qcacld-2.0 to qcacld-3.0 propagation Add support to configure RM enabled capbility information element through INI. Using the introduced INI config option(rm_capability), we can set or unset any bit in the IE. Default value for the config parameter is set based on rrmInitialize routine. Change-Id: Ia2a4352760db77ab71dad4757eb603d7539ffefa CRs-Fixed: 918667
This commit is contained in:

committed by
Prakash Dhavali

parent
c42f2dec12
commit
a7776a9fdd
@@ -818,6 +818,18 @@ typedef enum {
|
||||
#define CFG_RRM_MEAS_RANDOMIZATION_INTVL_MIN (10)
|
||||
#define CFG_RRM_MEAS_RANDOMIZATION_INTVL_MAX (100)
|
||||
#define CFG_RRM_MEAS_RANDOMIZATION_INTVL_DEFAULT (100)
|
||||
|
||||
/**
|
||||
* This INI is used to configure RM enabled capabilities IE.
|
||||
* Using this INI, we can set/unset any of the bits in 5 bytes
|
||||
* (last 4bytes are reserved). Bit details are updated as per
|
||||
* Draft version of 11mc spec. (Draft P802.11REVmc_D4.2)
|
||||
*
|
||||
* Bitwise details are defined as bit mask in rrmGlobal.h
|
||||
* Comma is used as a separator for each byte.
|
||||
*/
|
||||
#define CFG_RM_CAPABILITY_NAME "rm_capability"
|
||||
#define CFG_RM_CAPABILITY_DEFAULT "73,00,6D,00,04"
|
||||
#endif
|
||||
|
||||
#define CFG_QOS_IMPLICIT_SETUP_ENABLED_NAME "ImplicitQosIsEnabled"
|
||||
@@ -2808,6 +2820,8 @@ struct hdd_config {
|
||||
uint8_t nInChanMeasMaxDuration;
|
||||
uint8_t nOutChanMeasMaxDuration;
|
||||
uint16_t nRrmRandnIntvl;
|
||||
/* length includes separator */
|
||||
char rm_capability[3 * DOT11F_IE_RRMENABLEDCAP_MAX_LEN];
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_FEATURE_VOWIFI_11R
|
||||
@@ -3442,6 +3456,9 @@ void hdd_dfs_indicate_radar(void *context, void *param);
|
||||
|
||||
CDF_STATUS hdd_string_to_u8_array(char *str, uint8_t *intArray, uint8_t *len,
|
||||
uint8_t intArrayMaxLen);
|
||||
CDF_STATUS hdd_hex_string_to_u16_array(char *str, uint16_t *int_array,
|
||||
uint8_t *len, uint8_t int_array_max_len);
|
||||
|
||||
void hdd_cfg_print(hdd_context_t *pHddCtx);
|
||||
|
||||
CDF_STATUS hdd_update_nss(hdd_context_t *hdd_ctx, uint8_t nss);
|
||||
|
@@ -1333,6 +1333,11 @@ REG_TABLE_ENTRY g_registry_table[] = {
|
||||
CFG_RRM_MEAS_RANDOMIZATION_INTVL_DEFAULT,
|
||||
CFG_RRM_MEAS_RANDOMIZATION_INTVL_MIN,
|
||||
CFG_RRM_MEAS_RANDOMIZATION_INTVL_MAX),
|
||||
|
||||
REG_VARIABLE_STRING(CFG_RM_CAPABILITY_NAME, WLAN_PARAM_String,
|
||||
struct hdd_config, rm_capability,
|
||||
VAR_FLAGS_OPTIONAL,
|
||||
(void *) CFG_RM_CAPABILITY_DEFAULT),
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_FEATURE_VOWIFI_11R
|
||||
@@ -5403,40 +5408,85 @@ static void hdd_set_fine_time_meas_cap(hdd_context_t *hdd_ctx,
|
||||
}
|
||||
|
||||
/**
|
||||
* hdd_string_to_u8_array() - scan the string and convert to u8 array
|
||||
* @str: the pointer to the string
|
||||
* @intArray: the pointer of buffer to store the u8 value
|
||||
* @len: size of the buffer
|
||||
* hdd_convert_string_to_u8_array() - used to convert string into u8 array
|
||||
* @str: String to be converted
|
||||
* @hex_array: Array where converted value is stored
|
||||
* @len: Length of the populated array
|
||||
* @array_max_len: Maximum length of the array
|
||||
* @to_hex: true, if conversion required for hex string
|
||||
*
|
||||
* Return: CDF_STATUS_SUCCESS if the conversion is done,
|
||||
* otherwise CDF_STATUS_E_INVAL
|
||||
* This API is called to convert string (each byte separated by
|
||||
* a comma) into an u8 array
|
||||
*
|
||||
* Return: CDF_STATUS
|
||||
*/
|
||||
CDF_STATUS hdd_string_to_u8_array(char *str, uint8_t *intArray, uint8_t *len,
|
||||
uint8_t intArrayMaxLen)
|
||||
|
||||
static CDF_STATUS hdd_convert_string_to_array(char *str, uint8_t *array,
|
||||
uint8_t *len, uint8_t array_max_len, bool to_hex)
|
||||
{
|
||||
char *s = str;
|
||||
char *format, *s = str;
|
||||
|
||||
if (str == NULL || intArray == NULL || len == NULL) {
|
||||
if (str == NULL || array == NULL || len == NULL)
|
||||
return CDF_STATUS_E_INVAL;
|
||||
}
|
||||
*len = 0;
|
||||
|
||||
while ((s != NULL) && (*len < intArrayMaxLen)) {
|
||||
format = (to_hex) ? "%02x" : "%d";
|
||||
|
||||
*len = 0;
|
||||
while ((s != NULL) && (*len < array_max_len)) {
|
||||
int val;
|
||||
/* Increment length only if sscanf succesfully extracted one element.
|
||||
* Any other return value means error. Ignore it.
|
||||
*/
|
||||
if (sscanf(s, "%d", &val) == 1) {
|
||||
intArray[*len] = (uint8_t) val;
|
||||
/* Increment length only if sscanf successfully extracted
|
||||
* one element. Any other return value means error.
|
||||
* Ignore it. */
|
||||
if (sscanf(s, format, &val) == 1) {
|
||||
array[*len] = (uint8_t) val;
|
||||
*len += 1;
|
||||
}
|
||||
|
||||
s = strpbrk(s, ",");
|
||||
if (s)
|
||||
s++;
|
||||
}
|
||||
|
||||
return CDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* hdd_hex_string_to_u8_array() - used to convert hex string into u8 array
|
||||
* @str: Hexadecimal string
|
||||
* @hex_array: Array where converted value is stored
|
||||
* @len: Length of the populated array
|
||||
* @array_max_len: Maximum length of the array
|
||||
*
|
||||
* This API is called to convert hexadecimal string (each byte separated by
|
||||
* a comma) into an u8 array
|
||||
*
|
||||
* Return: CDF_STATUS
|
||||
*/
|
||||
CDF_STATUS hdd_hex_string_to_u8_array(char *str, uint8_t *hex_array,
|
||||
uint8_t *len, uint8_t array_max_len)
|
||||
{
|
||||
return hdd_convert_string_to_array(str, hex_array, len,
|
||||
array_max_len, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* hdd_string_to_u8_array() - used to convert decimal string into u8 array
|
||||
* @str: Decimal string
|
||||
* @hex_array: Array where converted value is stored
|
||||
* @len: Length of the populated array
|
||||
* @array_max_len: Maximum length of the array
|
||||
*
|
||||
* This API is called to convert decimal string (each byte separated by
|
||||
* a comma) into an u8 array
|
||||
*
|
||||
* Return: CDF_STATUS
|
||||
*/
|
||||
|
||||
CDF_STATUS hdd_string_to_u8_array(char *str, uint8_t *array,
|
||||
uint8_t *len, uint8_t array_max_len)
|
||||
{
|
||||
return hdd_convert_string_to_array(str, array, len,
|
||||
array_max_len, false);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -5636,31 +5686,6 @@ bool hdd_update_config_dat(hdd_context_t *pHddCtx)
|
||||
}
|
||||
|
||||
#if defined WLAN_FEATURE_VOWIFI
|
||||
if (sme_cfg_set_int
|
||||
(pHddCtx->hHal, WNI_CFG_RRM_ENABLED, pConfig->fRrmEnable)
|
||||
== CDF_STATUS_E_FAILURE) {
|
||||
fStatus = false;
|
||||
hddLog(LOGE,
|
||||
"Could not pass on WNI_CFG_RRM_ENABLE to CFG");
|
||||
}
|
||||
|
||||
if (sme_cfg_set_int
|
||||
(pHddCtx->hHal, WNI_CFG_RRM_OPERATING_CHAN_MAX,
|
||||
pConfig->nInChanMeasMaxDuration) == CDF_STATUS_E_FAILURE) {
|
||||
fStatus = false;
|
||||
hddLog(LOGE,
|
||||
"Could not pass on WNI_CFG_RRM_OPERATING_CHAN_MAX to CFG");
|
||||
}
|
||||
|
||||
if (sme_cfg_set_int
|
||||
(pHddCtx->hHal, WNI_CFG_RRM_NON_OPERATING_CHAN_MAX,
|
||||
pConfig->nOutChanMeasMaxDuration) ==
|
||||
CDF_STATUS_E_FAILURE) {
|
||||
fStatus = false;
|
||||
hddLog(LOGE,
|
||||
"Could not pass on WNI_CFG_RRM_OUT_CHAN_MAX to CFG");
|
||||
}
|
||||
|
||||
if (sme_cfg_set_int
|
||||
(pHddCtx->hHal, WNI_CFG_MCAST_BCAST_FILTER_SETTING,
|
||||
pConfig->mcastBcastFilterSetting) == CDF_STATUS_E_FAILURE)
|
||||
@@ -6215,6 +6240,7 @@ CDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
|
||||
{
|
||||
CDF_STATUS status = CDF_STATUS_SUCCESS;
|
||||
tSmeConfigParams *smeConfig;
|
||||
uint8_t rrm_capab_len;
|
||||
|
||||
struct hdd_config *pConfig = pHddCtx->config;
|
||||
|
||||
@@ -6299,8 +6325,11 @@ CDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
|
||||
smeConfig->csrConfig.WMMSupportMode = pConfig->WmmMode;
|
||||
|
||||
#if defined WLAN_FEATURE_VOWIFI
|
||||
smeConfig->rrmConfig.rrmEnabled = pConfig->fRrmEnable;
|
||||
smeConfig->rrmConfig.maxRandnInterval = pConfig->nRrmRandnIntvl;
|
||||
smeConfig->rrmConfig.rrm_enabled = pConfig->fRrmEnable;
|
||||
smeConfig->rrmConfig.max_randn_interval = pConfig->nRrmRandnIntvl;
|
||||
hdd_hex_string_to_u8_array(pConfig->rm_capability,
|
||||
smeConfig->rrmConfig.rm_capability, &rrm_capab_len,
|
||||
DOT11F_IE_RRMENABLEDCAP_MAX_LEN);
|
||||
#endif
|
||||
/* Remaining config params not obtained from registry
|
||||
* On RF EVB beacon using channel 1.
|
||||
|
@@ -278,6 +278,14 @@ typedef enum eSirResultCodes {
|
||||
eSIR_DONOT_USE_RESULT_CODE = SIR_MAX_ENUM_SIZE
|
||||
} tSirResultCodes;
|
||||
|
||||
#define RMENABLEDCAP_MAX_LEN 5
|
||||
|
||||
struct rrm_config_param {
|
||||
uint8_t rrm_enabled;
|
||||
uint8_t max_randn_interval;
|
||||
uint8_t rm_capability[RMENABLEDCAP_MAX_LEN];
|
||||
};
|
||||
|
||||
/* each station added has a rate mode which specifies the sta attributes */
|
||||
typedef enum eStaRateMode {
|
||||
eSTA_TAURUS = 0,
|
||||
@@ -973,6 +981,7 @@ typedef struct sSirSmeJoinReq {
|
||||
tAniBool isWMEenabled;
|
||||
tAniBool isQosEnabled;
|
||||
tAniBool isOSENConnection;
|
||||
struct rrm_config_param rrm_config;
|
||||
tAniBool spectrumMgtIndicator;
|
||||
tSirMacPowerCapInfo powerCap;
|
||||
tSirSupChnl supportedChannels;
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011-2012, 2014 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2011-2012, 2014-2015 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
|
||||
*
|
||||
@@ -38,6 +38,7 @@
|
||||
#ifndef __RRM_API_H__
|
||||
#define __RRM_API_H__
|
||||
|
||||
#ifdef WLAN_FEATURE_VOWIFI
|
||||
#define RRM_MIN_TX_PWR_CAP 13
|
||||
#define RRM_MAX_TX_PWR_CAP 19
|
||||
|
||||
@@ -86,8 +87,6 @@ extern void rrm_cache_mgmt_tx_power(tpAniSirGlobal pMac,
|
||||
extern tpRRMCaps rrm_get_capabilities(tpAniSirGlobal pMac,
|
||||
tpPESession pSessionEntry);
|
||||
|
||||
extern void rrm_update_config(tpAniSirGlobal pMac, tpPESession pSessionEntry);
|
||||
|
||||
extern void rrm_get_start_tsf(tpAniSirGlobal pMac, uint32_t *pStartTSF);
|
||||
|
||||
extern void rrm_update_start_tsf(tpAniSirGlobal pMac, uint32_t startTSF[2]);
|
||||
@@ -101,4 +100,12 @@ rrm_process_neighbor_report_req(tpAniSirGlobal pMac,
|
||||
extern tSirRetStatus
|
||||
rrm_process_beacon_report_xmit(tpAniSirGlobal pMac,
|
||||
tpSirBeaconReportXmitInd pBcnReport);
|
||||
extern void lim_update_rrm_capability(tpAniSirGlobal mac_ctx,
|
||||
tpSirSmeJoinReq join_req);
|
||||
#else
|
||||
void lim_update_rrm_capability(tpAniSirGlobal mac_ctx,
|
||||
tpSirSmeJoinReq join_req)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
@@ -225,4 +225,127 @@ typedef struct sRrmPEContext {
|
||||
#define RCPI_MAX_VALUE (220)
|
||||
#define CALCULATE_RCPI(rssi) (((rssi) + 110) * 2)
|
||||
|
||||
/* Bit mask are defined as per Draft P802.11REVmc_D4.2 */
|
||||
|
||||
/**
|
||||
* enum mask_rm_capability_byte1 - mask for supported capability
|
||||
* @RM_CAP_LINK_MEASUREMENT: Link Measurement capability
|
||||
* @RM_CAP_NEIGHBOR_REPORT: Neighbor report capability
|
||||
* @RM_CAP_PARALLEL_MEASUREMENT: Parallel Measurement capability
|
||||
* @RM_CAP_REPEATED_MEASUREMENT: Repeated Measurement capability
|
||||
* @RM_CAP_BCN_PASSIVE_MEASUREMENT: Beacon passive measurement capability
|
||||
* @RM_CAP_BCN_ACTIVE_MEASUREMENT: Beacon active measurement capability
|
||||
* @RM_CAP_BCN_TABLE_MEASUREMENT: Beacon table measurement capability
|
||||
* @RM_CAP_BCN_MEAS_REPORTING_COND: Beacon measurement reporting conditions
|
||||
*/
|
||||
enum mask_rm_capability_byte1 {
|
||||
RM_CAP_LINK_MEASUREMENT = (1 << (0)),
|
||||
RM_CAP_NEIGHBOR_REPORT = (1 << (1)),
|
||||
RM_CAP_PARALLEL_MEASUREMENT = (1 << (2)),
|
||||
RM_CAP_REPEATED_MEASUREMENT = (1 << (3)),
|
||||
RM_CAP_BCN_PASSIVE_MEASUREMENT = (1 << (4)),
|
||||
RM_CAP_BCN_ACTIVE_MEASUREMENT = (1 << (5)),
|
||||
RM_CAP_BCN_TABLE_MEASUREMENT = (1 << (6)),
|
||||
RM_CAP_BCN_MEAS_REPORTING_COND = (1 << (7)),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mask_rm_capability_byte2 - mask for supported capability
|
||||
* @RM_CAP_FRAME_MEASUREMENT: Frame Measurement capability
|
||||
* @RM_CAP_CHAN_LOAD_MEASUREMENT: Channel load measurement capability
|
||||
* @RM_CAP_NOISE_HIST_MEASUREMENT: Noise Histogram Measurement capability
|
||||
* @RM_CAP_STATISTICS_MEASUREMENT: Statistics Measurement capability
|
||||
* @RM_CAP_LCI_MEASUREMENT: LCI measurement capability
|
||||
* @RM_CAP_LCI_AZIMUTH: LCI Azimuth capability
|
||||
* @RM_CAP_TX_CATEGORY_MEASUREMENT: Transmit category measurement capability
|
||||
* @RM_CAP_TRIG_TX_CATEGORY_MEASUREMENT:
|
||||
* Triggered Transmit category measurement capability
|
||||
*/
|
||||
enum mask_rm_capability_byte2 {
|
||||
RM_CAP_FRAME_MEASUREMENT = (1 << (0)),
|
||||
RM_CAP_CHAN_LOAD_MEASUREMENT = (1 << (1)),
|
||||
RM_CAP_NOISE_HIST_MEASUREMENT = (1 << (2)),
|
||||
RM_CAP_STATISTICS_MEASUREMENT = (1 << (3)),
|
||||
RM_CAP_LCI_MEASUREMENT = (1 << (4)),
|
||||
RM_CAP_LCI_AZIMUTH = (1 << (5)),
|
||||
RM_CAP_TX_CATEGORY_MEASUREMENT = (1 << (6)),
|
||||
RM_CAP_TRIG_TX_CATEGORY_MEASUREMENT = (1 << (7)),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mask_rm_capability_byte3 - mask for supported capability
|
||||
* @RM_CAP_AP_CHAN_REPORT: AP channel report capability
|
||||
* @RM_CAP_RM_MIB: RM MIB capability
|
||||
* @RM_CAP_OPER_CHAN_MAX_DURATION_1: OPER_CHAN_MAX_DURATION bit1
|
||||
* @RM_CAP_OPER_CHAN_MAX_DURATION_2: OPER_CHAN_MAX_DURATION bit2
|
||||
* @RM_CAP_OPER_CHAN_MAX_DURATION_3: OPER_CHAN_MAX_DURATION bit3
|
||||
* @RM_CAP_NONOPER_CHAN_MAX_DURATION_1: NONOPER_CHAN_MAX bit1
|
||||
* @RM_CAP_NONOPER_CHAN_MAX_DURATION_2: NONOPER_CHAN_MAX bit2
|
||||
* @RM_CAP_NONOPER_CHAN_MAX_DURATION_3: NONOPER_CHAN_MAX bit3
|
||||
* @RM_CAP_OPER_CHAN_MAX_DURATION: Operating Channel Max Measurement Duration
|
||||
* @RM_CAP_NONOPER_CHAN_MAX_DURATION:
|
||||
* Nonoperating Channel Max Measurement Duration
|
||||
*/
|
||||
|
||||
enum mask_rm_capability_byte3 {
|
||||
RM_CAP_AP_CHAN_REPORT = (1 << (0)),
|
||||
RM_CAP_RM_MIB = (1 << (1)),
|
||||
RM_CAP_OPER_CHAN_MAX_DURATION_1 = (1 << (2)),
|
||||
RM_CAP_OPER_CHAN_MAX_DURATION_2 = (1 << (3)),
|
||||
RM_CAP_OPER_CHAN_MAX_DURATION_3 = (1 << (4)),
|
||||
RM_CAP_NONOPER_CHAN_MAX_DURATION_1 = (1 << (5)),
|
||||
RM_CAP_NONOPER_CHAN_MAX_DURATION_2 = (1 << (6)),
|
||||
RM_CAP_NONOPER_CHAN_MAX_DURATION_3 = (1 << (7)),
|
||||
RM_CAP_OPER_CHAN_MAX_DURATION = (RM_CAP_OPER_CHAN_MAX_DURATION_1 ||
|
||||
RM_CAP_OPER_CHAN_MAX_DURATION_2 ||
|
||||
RM_CAP_OPER_CHAN_MAX_DURATION_3),
|
||||
RM_CAP_NONOPER_CHAN_MAX_DURATION =
|
||||
(RM_CAP_NONOPER_CHAN_MAX_DURATION_1 ||
|
||||
RM_CAP_NONOPER_CHAN_MAX_DURATION_2 ||
|
||||
RM_CAP_NONOPER_CHAN_MAX_DURATION_3),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mask_rm_capability_byte4 - mask for supported capability
|
||||
* @RM_CAP_MEASUREMENT_PILOT_1: MEASUREMENT_PILOT bit1
|
||||
* @RM_CAP_MEASUREMENT_PILOT_2: MEASUREMENT_PILOT bit2
|
||||
* @RM_CAP_MEASUREMENT_PILOT_3: MEASUREMENT_PILOT bit3
|
||||
* @RM_CAP_MEAS_PILOT_TX_INFO: Measurement Pilot Transmission Capability
|
||||
* @RM_CAP_NEIGHBOR_RPT_TSF_OFFSET: Neighbor Report TSF Offset Capability
|
||||
* @RM_CAP_RCPI_MEASUREMENT: RCPI Measurement Capability
|
||||
* @RM_CAP_RSNI_MEASUREMENT: RSNI Measurement Capability
|
||||
* @RM_CAP_BSS_AVG_ACCESS_DELAY: BSS Average Access Delay Capability
|
||||
* @RM_CAP_MEASUREMENT_PILOT: Measurement pilot capability
|
||||
*/
|
||||
|
||||
enum mask_rm_capability_byte4 {
|
||||
RM_CAP_MEASUREMENT_PILOT_1 = (1 << (0)),
|
||||
RM_CAP_MEASUREMENT_PILOT_2 = (1 << (1)),
|
||||
RM_CAP_MEASUREMENT_PILOT_3 = (1 << (2)),
|
||||
RM_CAP_MEAS_PILOT_TX_INFO = (1 << (3)),
|
||||
RM_CAP_NEIGHBOR_RPT_TSF_OFFSET = (1 << (4)),
|
||||
RM_CAP_RCPI_MEASUREMENT1 = (1 << (5)),
|
||||
RM_CAP_RSNI_MEASUREMENT = (1 << (6)),
|
||||
RM_CAP_BSS_AVG_ACCESS_DELAY = (1 << (7)),
|
||||
RM_CAP_MEASUREMENT_PILOT = (RM_CAP_MEASUREMENT_PILOT_1 ||
|
||||
RM_CAP_MEASUREMENT_PILOT_2 ||
|
||||
RM_CAP_MEASUREMENT_PILOT_3),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mask_rm_capability_byte5 - mask for supported capability
|
||||
* @RM_CAP_BSS_AVAIL_ADMISSION: BSS Available Admission Capacity Capability
|
||||
* @RM_CAP_ANTENNA: Antenna Capability
|
||||
* @RM_CAP_FTM_RANGE_REPORT: FTM Range Report Capability
|
||||
* @RM_CAP_CIVIC_LOC_MEASUREMENT: Civic Location Measurement capability
|
||||
*
|
||||
* 4 bits are reserved
|
||||
*/
|
||||
enum mask_rm_capability_byte5 {
|
||||
RM_CAP_BSS_AVAIL_ADMISSION = (1 << (0)),
|
||||
RM_CAP_ANTENNA = (1 << (1)),
|
||||
RM_CAP_FTM_RANGE_REPORT = (1 << (2)),
|
||||
RM_CAP_CIVIC_LOC_MEASUREMENT = (1 << (3)),
|
||||
};
|
||||
|
||||
#endif /* #if defined __RRMGLOBAL_H */
|
||||
|
@@ -641,8 +641,5 @@ static void lim_update_config(tpAniSirGlobal pMac, tpPESession psessionEntry)
|
||||
}
|
||||
pMac->lim.gLimAssocStaLimit = (uint16_t) val;
|
||||
|
||||
#if defined WLAN_FEATURE_VOWIFI
|
||||
rrm_update_config(pMac, psessionEntry);
|
||||
#endif
|
||||
PELOG1(lim_log(pMac, LOG1, FL("Updated Lim shadow state based on CFG"));)
|
||||
}
|
||||
|
@@ -56,12 +56,10 @@
|
||||
#include "lim_api.h"
|
||||
#include "wmm_apsd.h"
|
||||
#include "sir_mac_prot_def.h"
|
||||
#include "rrm_api.h"
|
||||
|
||||
#include "sap_api.h"
|
||||
|
||||
#if defined WLAN_FEATURE_VOWIFI
|
||||
#include "rrm_api.h"
|
||||
#endif
|
||||
|
||||
#if defined WLAN_FEATURE_VOWIFI_11R
|
||||
#include <lim_ft.h>
|
||||
@@ -1575,23 +1573,6 @@ __lim_process_sme_join_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
|
||||
#endif /* FEATURE_WLAN_DIAG_SUPPORT */
|
||||
|
||||
lim_log(mac_ctx, LOG1, FL("Received SME_JOIN_REQ"));
|
||||
#ifdef WLAN_FEATURE_VOWIFI
|
||||
/*
|
||||
* Need to read the CFG here itself as this is
|
||||
* used in limExtractAPCapability() below.
|
||||
* This CFG is actually read in rrm_update_config()
|
||||
* which is called later. Because this is not
|
||||
* read, RRM related path before calling rrm_update_config()
|
||||
* is not getting executed causing issues
|
||||
* like not honoring power constraint on 1st association
|
||||
* after driver loading.
|
||||
*/
|
||||
if (wlan_cfg_get_int(mac_ctx, WNI_CFG_RRM_ENABLED, &val) !=
|
||||
eSIR_SUCCESS)
|
||||
lim_log(mac_ctx, LOGP, FL("cfg get rrm enabled failed"));
|
||||
mac_ctx->rrm.rrmPEContext.rrmEnable = (val) ? 1 : 0;
|
||||
val = 0;
|
||||
#endif /* WLAN_FEATURE_VOWIFI */
|
||||
|
||||
/*
|
||||
* Expect Join request in idle state.
|
||||
@@ -1624,9 +1605,16 @@ __lim_process_sme_join_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
|
||||
goto end;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update the capability here itself as this is used in
|
||||
* lim_extract_ap_capability() below. If not updated issues
|
||||
* like not honoring power constraint on 1st association after
|
||||
* driver loading might occur.
|
||||
*/
|
||||
lim_update_rrm_capability(mac_ctx, sme_join_req);
|
||||
|
||||
bss_desc = sme_join_req->bssDescription;
|
||||
/* check for the existence of start BSS session */
|
||||
|
||||
session = pe_find_session_by_bssid(mac_ctx, bss_desc.bssId,
|
||||
&session_id);
|
||||
|
||||
@@ -4497,10 +4485,10 @@ void __lim_process_report_message(tpAniSirGlobal pMac, tpSirMsgQ pMsg)
|
||||
rrm_process_neighbor_report_req(pMac, pMsg->bodyptr);
|
||||
break;
|
||||
case eWNI_SME_BEACON_REPORT_RESP_XMIT_IND:
|
||||
{
|
||||
rrm_process_beacon_report_xmit(pMac, pMsg->bodyptr);
|
||||
}
|
||||
break;
|
||||
break;
|
||||
default:
|
||||
lim_log(pMac, LOGE, FL("Invalid msg type:%d"), pMsg->type);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@@ -1334,57 +1334,6 @@ tpRRMCaps rrm_get_capabilities(tpAniSirGlobal pMac, tpPESession pSessionEntry)
|
||||
return &pMac->rrm.rrmPEContext.rrmEnabledCaps;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/**
|
||||
* rrm_update_config
|
||||
*
|
||||
* FUNCTION:
|
||||
* Update the configuration. This is called from lim_update_config.
|
||||
*
|
||||
* LOGIC:
|
||||
*
|
||||
* ASSUMPTIONS:
|
||||
*
|
||||
* NOTE:
|
||||
*
|
||||
* @param pSessionEntry
|
||||
* @return pointer to tRRMCaps
|
||||
*/
|
||||
void rrm_update_config(tpAniSirGlobal pMac, tpPESession pSessionEntry)
|
||||
{
|
||||
uint32_t val;
|
||||
tpRRMCaps pRRMCaps = &pMac->rrm.rrmPEContext.rrmEnabledCaps;
|
||||
|
||||
if (wlan_cfg_get_int(pMac, WNI_CFG_RRM_ENABLED, &val) != eSIR_SUCCESS) {
|
||||
lim_log(pMac, LOGP, FL("cfg get rrm enabled failed"));
|
||||
return;
|
||||
}
|
||||
pMac->rrm.rrmPEContext.rrmEnable = (val) ? 1 : 0;
|
||||
|
||||
if (wlan_cfg_get_int(pMac, WNI_CFG_RRM_OPERATING_CHAN_MAX, &val) !=
|
||||
eSIR_SUCCESS) {
|
||||
lim_log(pMac, LOGP,
|
||||
FL
|
||||
("cfg get rrm operating channel max measurement duration failed"));
|
||||
return;
|
||||
}
|
||||
pRRMCaps->operatingChanMax = (uint8_t) val;
|
||||
|
||||
if (wlan_cfg_get_int(pMac, WNI_CFG_RRM_NON_OPERATING_CHAN_MAX, &val) !=
|
||||
eSIR_SUCCESS) {
|
||||
lim_log(pMac, LOGP,
|
||||
FL
|
||||
("cfg get rrm non-operating channel max measurement duration failed"));
|
||||
return;
|
||||
}
|
||||
pRRMCaps->nonOperatingChanMax = (uint8_t) val;
|
||||
|
||||
lim_log(pMac, LOG1,
|
||||
"RRM enabled = %d OperatingChanMax = %d NonOperatingMax = %d",
|
||||
pMac->rrm.rrmPEContext.rrmEnable,
|
||||
pRRMCaps->operatingChanMax, pRRMCaps->nonOperatingChanMax);
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/**
|
||||
* rrm_initialize
|
||||
@@ -1488,8 +1437,30 @@ void rrm_process_message(tpAniSirGlobal pMac, tpSirMsgQ pMsg)
|
||||
case eWNI_SME_BEACON_REPORT_RESP_XMIT_IND:
|
||||
rrm_process_beacon_report_xmit(pMac, pMsg->bodyptr);
|
||||
break;
|
||||
default:
|
||||
lim_log(pMac, LOGE, FL("Invalid msg type:%d"), pMsg->type);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* lim_update_rrm_capability() - Update PE context's rrm capability
|
||||
* @mac_ctx: Global pointer to MAC context
|
||||
* @join_req: Pointer to SME join request.
|
||||
*
|
||||
* Update PE context's rrm capability based on SME join request.
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void lim_update_rrm_capability(tpAniSirGlobal mac_ctx,
|
||||
tpSirSmeJoinReq join_req)
|
||||
{
|
||||
mac_ctx->rrm.rrmPEContext.rrmEnable = join_req->rrm_config.rrm_enabled;
|
||||
cdf_mem_copy(&mac_ctx->rrm.rrmPEContext.rrmEnabledCaps,
|
||||
&join_req->rrm_config.rm_capability,
|
||||
RMENABLEDCAP_MAX_LEN);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -5492,6 +5492,7 @@ tSirRetStatus populate_dot11f_rrm_ie(tpAniSirGlobal pMac,
|
||||
tpPESession psessionEntry)
|
||||
{
|
||||
tpRRMCaps pRrmCaps;
|
||||
uint8_t *bytes;
|
||||
|
||||
pRrmCaps = rrm_get_capabilities(pMac, psessionEntry);
|
||||
|
||||
@@ -5527,6 +5528,10 @@ tSirRetStatus populate_dot11f_rrm_ie(tpAniSirGlobal pMac,
|
||||
pDot11f->lci_capability = pRrmCaps->lci_capability;
|
||||
pDot11f->reserved = pRrmCaps->reserved;
|
||||
|
||||
bytes = (uint8_t *) pDot11f + 1; /* ignore present field */
|
||||
lim_log(pMac, LOG1, FL("RRM Enabled Cap IE: %02x %02x %02x %02x %02x"),
|
||||
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4]);
|
||||
|
||||
pDot11f->present = 1;
|
||||
return eSIR_SUCCESS;
|
||||
}
|
||||
|
@@ -95,7 +95,7 @@ typedef void (*hdd_ftm_msg_processor)(void *);
|
||||
typedef struct _smeConfigParams {
|
||||
tCsrConfigParam csrConfig;
|
||||
#if defined WLAN_FEATURE_VOWIFI
|
||||
tRrmConfigParam rrmConfig;
|
||||
struct rrm_config_param rrmConfig;
|
||||
#endif
|
||||
#if defined FEATURE_WLAN_LFR
|
||||
uint8_t isFastRoamIniFeatureEnabled;
|
||||
|
@@ -52,7 +52,7 @@ CDF_STATUS rrm_close(tpAniSirGlobal pMac);
|
||||
CDF_STATUS rrm_ready(tpAniSirGlobal pMac);
|
||||
CDF_STATUS rrm_open(tpAniSirGlobal pMac);
|
||||
CDF_STATUS rrm_change_default_config_param(tpAniSirGlobal pMac,
|
||||
tpRrmConfigParam pRrmConfig);
|
||||
struct rrm_config_param *rrm_config);
|
||||
CDF_STATUS sme_rrm_neighbor_report_request(tpAniSirGlobal pMac,
|
||||
uint8_t sessionId, tpRrmNeighborReq pNeighborReq,
|
||||
tpRrmNeighborRspCallbackInfo callbackInfo);
|
||||
|
@@ -46,11 +46,6 @@
|
||||
/*--------------------------------------------------------------------------
|
||||
Type declarations
|
||||
------------------------------------------------------------------------*/
|
||||
typedef struct sRrmConfigParam {
|
||||
uint8_t rrmEnabled;
|
||||
uint8_t maxRandnInterval;
|
||||
} tRrmConfigParam, *tpRrmConfigParam;
|
||||
|
||||
typedef struct sRrmNeighborReportDesc {
|
||||
tListElem List;
|
||||
tSirNeighborBssDescription *pNeighborBssDescription;
|
||||
@@ -88,7 +83,7 @@ typedef struct sRrmSMEContext {
|
||||
uint16_t randnIntvl;
|
||||
uint16_t duration[SIR_ESE_MAX_MEAS_IE_REQS];
|
||||
uint8_t measMode[SIR_ESE_MAX_MEAS_IE_REQS];
|
||||
tRrmConfigParam rrmConfig;
|
||||
struct rrm_config_param rrmConfig;
|
||||
cdf_mc_timer_t IterMeasTimer;
|
||||
tDblLinkList neighborReportCache;
|
||||
tRrmNeighborRequestControlInfo neighborReqControlInfo;
|
||||
|
@@ -13976,6 +13976,11 @@ CDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId,
|
||||
else
|
||||
csr_join_req->isOSENConnection = false;
|
||||
|
||||
/* Fill rrm config parameters */
|
||||
cdf_mem_copy(&csr_join_req->rrm_config,
|
||||
&pMac->rrm.rrmSmeContext.rrmConfig,
|
||||
sizeof(struct rrm_config_param));
|
||||
|
||||
pAP_capabilityInfo =
|
||||
(tSirMacCapabilityInfo *)
|
||||
&pBssDescription->capabilityInfo;
|
||||
|
@@ -906,7 +906,7 @@ CDF_STATUS sme_rrm_process_beacon_report_req_ind(tpAniSirGlobal pMac, void *pMsg
|
||||
pSmeRrmContext->regClass = pBeaconReq->channelInfo.regulatoryClass;
|
||||
pSmeRrmContext->randnIntvl =
|
||||
CDF_MAX(pBeaconReq->randomizationInterval,
|
||||
pSmeRrmContext->rrmConfig.maxRandnInterval);
|
||||
pSmeRrmContext->rrmConfig.max_randn_interval);
|
||||
pSmeRrmContext->currentIndex = 0;
|
||||
pSmeRrmContext->msgSource = pBeaconReq->msgSource;
|
||||
cdf_mem_copy((uint8_t *) &pSmeRrmContext->measMode,
|
||||
@@ -1357,7 +1357,7 @@ CDF_STATUS rrm_open(tpAniSirGlobal pMac)
|
||||
tpRrmSMEContext pSmeRrmContext = &pMac->rrm.rrmSmeContext;
|
||||
CDF_STATUS cdf_ret_status = CDF_STATUS_SUCCESS;
|
||||
|
||||
pSmeRrmContext->rrmConfig.maxRandnInterval = 50; /* ms */
|
||||
pSmeRrmContext->rrmConfig.max_randn_interval = 50; /* ms */
|
||||
|
||||
cdf_status = cdf_mc_timer_init(&pSmeRrmContext->IterMeasTimer,
|
||||
CDF_TIMER_TYPE_SW,
|
||||
@@ -1491,10 +1491,10 @@ CDF_STATUS rrm_ready(tpAniSirGlobal pMac)
|
||||
|
||||
---------------------------------------------------------------------------*/
|
||||
CDF_STATUS rrm_change_default_config_param(tpAniSirGlobal pMac,
|
||||
tpRrmConfigParam pRrmConfig)
|
||||
struct rrm_config_param *rrm_config)
|
||||
{
|
||||
cdf_mem_copy(&pMac->rrm.rrmSmeContext.rrmConfig, pRrmConfig,
|
||||
sizeof(tRrmConfigParam));
|
||||
cdf_mem_copy(&pMac->rrm.rrmSmeContext.rrmConfig, rrm_config,
|
||||
sizeof(struct rrm_config_param));
|
||||
|
||||
return CDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
Reference in New Issue
Block a user