diff options
| author | Krishna Kumaar Natarajan <kknatara@qca.qualcomm.com> | 2015-05-12 10:59:10 -0700 |
|---|---|---|
| committer | AnjaneeDevi Kapparapu <c_akappa@qti.qualcomm.com> | 2015-05-18 15:39:41 +0530 |
| commit | 64d3de3e425f1f90d015905d00f63d2fe63c29f6 (patch) | |
| tree | 3bd8db2b233713199d236878d838c33f3be8efdb | |
| parent | 192bbc6905a34b45b04173ca215167d3235a8f7f (diff) | |
qcacld: Advertise fine timing meas capabilities based on interface type
Advertise fine timing measurement initiator and responder capabilities
based on interface type.
Add support for STA and SAP. STA can only be Initiator and
SAP can only be responder.
Change-Id: I4c9942b7c49b9334ccebd7a07affaceb898bb176
CRs-Fixed: 838391
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_cfg.h | 29 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg.c | 37 | ||||
| -rw-r--r-- | CORE/MAC/inc/aniGlobal.h | 1 | ||||
| -rw-r--r-- | CORE/MAC/inc/sirApi.h | 23 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c | 15 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c | 25 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limUtils.c | 46 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limUtils.h | 1 | ||||
| -rw-r--r-- | CORE/SME/inc/sme_Api.h | 1 | ||||
| -rw-r--r-- | CORE/SME/src/sme_common/sme_Api.c | 2 | ||||
| -rw-r--r-- | CORE/SYS/legacy/src/utils/src/parserApi.c | 27 |
11 files changed, 155 insertions, 52 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h index 97f28c9465bf..0883303fc0d9 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/CORE/HDD/inc/wlan_hdd_cfg.h @@ -2801,6 +2801,34 @@ enum dot11p_mode { #define CFG_MULTICAST_HOST_FW_MSGS_MAX (1) #define CFG_MULTICAST_HOST_FW_MSGS_DEFAULT (1) +/* + * fine timing measurement capability information + * + * <----- fine_time_meas_cap (in bits) -----> + *+----------+-----+-----+------+------+-------+-------+-----+-----+ + *| 9-31 | 8 | 7 | 5 | 4 | 3 | 2 | 1 | 0 | + *+----------+-----+-----+------+------+-------+-------+-----+-----+ + *| reserved | SAP | SAP |P2P-GO|P2P-GO|P2P-CLI|P2P-CLI| STA | STA | + *| |resp |init |resp |init |resp |init |resp |init | + *+----------+-----+-----+------+------+-------+-------+-----+-----+ + * + * resp - responder role; init- initiator role + * + * CFG_FINE_TIME_MEAS_CAPABILITY_MAX computed based on the table + * +-----------------+-----------------+-----------+ + * | Device Role | Initiator | Responder | + * +-----------------+-----------------+-----------+ + * | Station | Y | N | + * | P2P-CLI | Y | Y | + * | P2P-GO | Y | Y | + * | SAP | N | Y | + * +-----------------+-----------------+-----------+ + */ +#define CFG_FINE_TIME_MEAS_CAPABILITY "gfine_time_meas_cap" +#define CFG_FINE_TIME_MEAS_CAPABILITY_MIN (0x0000) +#define CFG_FINE_TIME_MEAS_CAPABILITY_MAX (0x00BD) +#define CFG_FINE_TIME_MEAS_CAPABILITY_DEFAULT (0x000D) + /*--------------------------------------------------------------------------- Type declarations -------------------------------------------------------------------------*/ @@ -3404,6 +3432,7 @@ typedef struct uint8_t inform_bss_rssi_raw; uint32_t tsf_gpio_pin; uint8_t multicast_host_fw_msgs; + uint32_t fine_time_meas_cap; } hdd_config_t; #ifdef WLAN_FEATURE_MBSSID diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index 036f622ac6b3..0edbb450cc9f 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -3645,6 +3645,12 @@ REG_TABLE_ENTRY g_registry_table[] = CFG_SET_TSF_GPIO_PIN_MIN, CFG_SET_TSF_GPIO_PIN_MAX), #endif + REG_VARIABLE(CFG_FINE_TIME_MEAS_CAPABILITY, WLAN_PARAM_HexInteger, + hdd_config_t, fine_time_meas_cap, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_FINE_TIME_MEAS_CAPABILITY_DEFAULT, + CFG_FINE_TIME_MEAS_CAPABILITY_MIN, + CFG_FINE_TIME_MEAS_CAPABILITY_MAX), }; #ifdef WLAN_FEATURE_MBSSID @@ -4306,6 +4312,9 @@ void print_hdd_cfg(hdd_context_t *pHddCtx) hddLog(LOG2, "Name = [gP2PListenDeferInterval] Value = [%u]", pHddCtx->cfg_ini->p2p_listen_defer_interval); + + hddLog(LOG2, "Name = [gfine_time_meas_cap] Value = [%u]", + pHddCtx->cfg_ini->fine_time_meas_cap); } #define CFG_VALUE_MAX_LEN 256 @@ -5020,6 +5029,33 @@ VOS_STATUS hdd_set_idle_ps_config(hdd_context_t *pHddCtx, v_U32_t val) return status; } +/** + * hdd_set_fine_time_meas_cap() - set fine timing measurement capability + * @hdd_ctx: HDD context + * @sme_config: pointer to SME config + * + * This function is used to pass fine timing measurement capability coming + * from INI to SME. This function make sure that configure INI is supported + * by the device. Use bit mask to mask out the unsupported capabilities. + * + * Return: None + */ +static void hdd_set_fine_time_meas_cap(hdd_context_t *hdd_ctx, + tSmeConfigParams *sme_config) +{ + hdd_config_t *config = hdd_ctx->cfg_ini; + uint32_t capability = config->fine_time_meas_cap; + + /* Make sure only supported capabilities are enabled in INI */ + capability &= CFG_FINE_TIME_MEAS_CAPABILITY_MAX; + sme_config->fine_time_meas_cap = capability; + + hddLog(LOG1, FL("fine time meas capability - INI: %04x Enabled: %04x"), + config->fine_time_meas_cap, sme_config->fine_time_meas_cap); + + return; +} + VOS_STATUS hdd_string_to_u8_array( char *str, tANI_U8 *intArray, tANI_U8 *len, tANI_U8 intArrayMaxLen ) { @@ -6113,6 +6149,7 @@ VOS_STATUS hdd_set_sme_config( hdd_context_t *pHddCtx ) pHddCtx->cfg_ini->prefer_non_dfs_on_radar; vos_set_multicast_logging(pHddCtx->cfg_ini->multicast_host_fw_msgs); + hdd_set_fine_time_meas_cap(pHddCtx, smeConfig); halStatus = sme_UpdateConfig( pHddCtx->hHal, smeConfig); if ( !HAL_STATUS_SUCCESS( halStatus ) ) diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h index 6f2290650d5a..633040fd257b 100644 --- a/CORE/MAC/inc/aniGlobal.h +++ b/CORE/MAC/inc/aniGlobal.h @@ -1170,6 +1170,7 @@ typedef struct sAniSirGlobal bool enable_dot11p; uint32_t f_sta_miracast_mcc_rest_time_val; uint8_t f_prefer_non_dfs_on_radar; + uint32_t fine_time_meas_cap; } tAniSirGlobal; typedef enum diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h index a6364d876e52..0f22fb1f6db2 100644 --- a/CORE/MAC/inc/sirApi.h +++ b/CORE/MAC/inc/sirApi.h @@ -5827,6 +5827,29 @@ typedef struct #define RTT_FINE_TIME_MEAS_INITIATOR_CAPABILITY 0x02 #define RTT_FINE_TIME_MEAS_RESPONDER_CAPABILITY 0x03 +/** + * enum fine_time_meas_mask - bit mask to identify device's + * fine timing measurement capability + * @FINE_TIME_MEAS_STA_INITIATOR - STA role, Initiator capability is supported + * @FINE_TIME_MEAS_STA_RESPONDER - STA role, Responder capability is supported + * @FINE_TIME_MEAS_P2PCLI_INITIATOR - P2P-CLI supports initiator capability + * @FINE_TIME_MEAS_P2PCLI_RESPONDER - P2P-CLI supports responder capability + * @FINE_TIME_MEAS_P2PGO_INITIATOR - P2P-GO supports initiator capability + * @FINE_TIME_MEAS_P2PGO_RESPONDER - P2P-GO supports responder capability + * @FINE_TIME_MEAS_SAP_INITIATOR - SAP role, Initiator capability is supported + * @FINE_TIME_MEAS_SAP_RESPONDER - SAP role, Responder capability is supported + */ +enum fine_time_meas_mask { + FINE_TIME_MEAS_STA_INITIATOR = (1 << (0)), + FINE_TIME_MEAS_STA_RESPONDER = (1 << (1)), + FINE_TIME_MEAS_P2PCLI_INITIATOR = (1 << (2)), + FINE_TIME_MEAS_P2PCLI_RESPONDER = (1 << (3)), + FINE_TIME_MEAS_P2PGO_INITIATOR = (1 << (4)), + FINE_TIME_MEAS_P2PGO_RESPONDER = (1 << (5)), + FINE_TIME_MEAS_SAP_INITIATOR = (1 << (6)), + FINE_TIME_MEAS_SAP_RESPONDER = (1 << (7)), +}; + /* number of neighbor reports that we can handle in Neighbor Report Response */ #define MAX_SUPPORTED_NEIGHBOR_RPT 15 diff --git a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c index a5c9eff7f005..5bb97d13744f 100644 --- a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c +++ b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c @@ -1378,19 +1378,8 @@ if (limPopulateMatchingRateSet(pMac, if (pAssocReq->ExtCap.present) { - struct s_ext_cap *p_ext_cap = (struct s_ext_cap *) - pAssocReq->ExtCap.bytes; - pStaDs->timingMeasCap = 0; - pStaDs->timingMeasCap |= (p_ext_cap->timingMeas)? - RTT_TIMING_MEAS_CAPABILITY: - RTT_INVALID; - pStaDs->timingMeasCap |= (p_ext_cap->fine_time_meas_initiator)? - RTT_FINE_TIME_MEAS_INITIATOR_CAPABILITY: - RTT_INVALID; - PELOG1(limLog(pMac, LOG1, - FL("ExtCap present, timingMeas: %d ftm_initiator: %d"), - p_ext_cap->timingMeas, - p_ext_cap->fine_time_meas_initiator);) + lim_set_stads_rtt_cap(pStaDs, + (struct s_ext_cap *) pAssocReq->ExtCap.bytes); } else { diff --git a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c index 85998ef99c39..f89cb58e670f 100644 --- a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c +++ b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c @@ -971,29 +971,20 @@ limProcessAssocRspFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tANI_U8 sub if (pAssocRsp->ExtCap.present) { - struct s_ext_cap *p_ext_cap = (struct s_ext_cap *) - pAssocRsp->ExtCap.bytes; - pStaDs->timingMeasCap = 0; - pStaDs->timingMeasCap |= (p_ext_cap->timingMeas)? - RTT_TIMING_MEAS_CAPABILITY: - RTT_INVALID; - pStaDs->timingMeasCap |= (p_ext_cap->fine_time_meas_initiator)? - RTT_FINE_TIME_MEAS_INITIATOR_CAPABILITY: - RTT_INVALID; - PELOG1(limLog(pMac, LOG1, - FL("ExtCap present, timingMeas: %d ftm_initiator: %d"), - p_ext_cap->timingMeas, - p_ext_cap->fine_time_meas_initiator);) + struct s_ext_cap *ext_cap = (struct s_ext_cap *) + pAssocRsp->ExtCap.bytes; + + lim_set_stads_rtt_cap(pStaDs, ext_cap); #ifdef FEATURE_WLAN_TDLS psessionEntry->tdls_prohibited = - p_ext_cap->TDLSProhibited; + ext_cap->TDLSProhibited; psessionEntry->tdls_chan_swit_prohibited = - p_ext_cap->TDLSChanSwitProhibited; + ext_cap->TDLSChanSwitProhibited; PELOG1(limLog(pMac, LOG1, FL("ExtCap: tdls_prohibited: %d, tdls_chan_swit_prohibited: %d"), - p_ext_cap->TDLSProhibited, - p_ext_cap->TDLSChanSwitProhibited);) + ext_cap->TDLSProhibited, + ext_cap->TDLSChanSwitProhibited);) #endif } else diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c index d8c145ee09cd..9b14c787b55b 100644 --- a/CORE/MAC/src/pe/lim/limUtils.c +++ b/CORE/MAC/src/pe/lim/limUtils.c @@ -7943,21 +7943,8 @@ void lim_sap_offload_add_sta(tpAniSirGlobal pmac, tpSirMsgQ lim_msgq) _sap_offload_parse_sta_qos(pmac, sta_ds, assoc_req); if (assoc_req->ExtCap.present) { - struct s_ext_cap *p_ext_cap = (struct s_ext_cap *) - assoc_req->ExtCap.bytes; - - sta_ds->timingMeasCap = 0; - sta_ds->timingMeasCap |= (p_ext_cap->timingMeas)? - RTT_TIMING_MEAS_CAPABILITY : - RTT_INVALID; - sta_ds->timingMeasCap |= (p_ext_cap->fine_time_meas_initiator)? - RTT_FINE_TIME_MEAS_INITIATOR_CAPABILITY : - RTT_INVALID; - - PELOG1(limLog(pMac, LOG1, - FL("ExtCap present, timingMeas: %d ftm_initiator: %d"), - p_ext_cap->timingMeas, - p_ext_cap->fine_time_meas_initiator);) + lim_set_stads_rtt_cap(sta_ds, + (struct s_ext_cap *) assoc_req->ExtCap.bytes); } else { sta_ds->timingMeasCap = 0; PELOG1(limLog(pmac, LOG1, FL("ExtCap not present"));) @@ -8063,3 +8050,32 @@ bool lim_validate_received_frame_a1_addr(tpAniSirGlobal mac_ctx, } return true; } + +/** + * lim_set_stads_rtt_cap() - update station node RTT capability + * @sta_ds: Station hash node + * @ext_cap: Pointer to extended capability + * + * This funciton update hash node's RTT capability based on received + * Extended capability IE. + * + * Return: None + */ +void lim_set_stads_rtt_cap(tpDphHashNode sta_ds, struct s_ext_cap *ext_cap) +{ + sta_ds->timingMeasCap = 0; + sta_ds->timingMeasCap |= (ext_cap->timingMeas)? + RTT_TIMING_MEAS_CAPABILITY : + RTT_INVALID; + sta_ds->timingMeasCap |= (ext_cap->fine_time_meas_initiator)? + RTT_FINE_TIME_MEAS_INITIATOR_CAPABILITY : + RTT_INVALID; + sta_ds->timingMeasCap |= (ext_cap->fine_time_meas_responder)? + RTT_FINE_TIME_MEAS_RESPONDER_CAPABILITY : + RTT_INVALID; + + PELOG1(limLog(pMac, LOG1, + FL("ExtCap present, timingMeas: %d Initiator: %d Responder: %d"), + ext_cap->timingMeas, ext_cap->fine_time_meas_initiator, + ext_cap->fine_time_meas_responder);) +} diff --git a/CORE/MAC/src/pe/lim/limUtils.h b/CORE/MAC/src/pe/lim/limUtils.h index 04cd5f2b5996..34114a9e8a8c 100644 --- a/CORE/MAC/src/pe/lim/limUtils.h +++ b/CORE/MAC/src/pe/lim/limUtils.h @@ -618,4 +618,5 @@ void lim_sap_offload_del_sta(tpAniSirGlobal pmac, bool lim_validate_received_frame_a1_addr(tpAniSirGlobal mac_ctx, tSirMacAddr a1, tpPESession session); +void lim_set_stads_rtt_cap(tpDphHashNode sta_ds, struct s_ext_cap *ext_cap); #endif /* __LIM_UTILS_H */ diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h index 4da03899cef2..733580fb399e 100644 --- a/CORE/SME/inc/sme_Api.h +++ b/CORE/SME/inc/sme_Api.h @@ -126,6 +126,7 @@ typedef struct _smeConfigParams bool sap_channel_avoidance; #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */ uint8_t f_prefer_non_dfs_on_radar; + uint32_t fine_time_meas_cap; } tSmeConfigParams, *tpSmeConfigParams; typedef enum diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c index 4435469b4bff..047bd7d533c6 100644 --- a/CORE/SME/src/sme_common/sme_Api.c +++ b/CORE/SME/src/sme_common/sme_Api.c @@ -1680,6 +1680,7 @@ eHalStatus sme_UpdateConfig(tHalHandle hHal, tpSmeConfigParams pSmeConfigParams) pMac->f_prefer_non_dfs_on_radar = pSmeConfigParams->f_prefer_non_dfs_on_radar; + pMac->fine_time_meas_cap = pSmeConfigParams->fine_time_meas_cap; return status; } @@ -4659,6 +4660,7 @@ eHalStatus sme_GetConfigParam(tHalHandle hHal, tSmeConfigParams *pParam) pParam->enable_bus_auto_suspend = pMac->sme.enable_bus_auto_suspend; #endif pParam->f_prefer_non_dfs_on_radar = pMac->f_prefer_non_dfs_on_radar; + pParam->fine_time_meas_cap = pMac->fine_time_meas_cap; sme_ReleaseGlobalLock( &pMac->sme ); } diff --git a/CORE/SYS/legacy/src/utils/src/parserApi.c b/CORE/SYS/legacy/src/utils/src/parserApi.c index d9d3e9d56886..4860f94ef484 100644 --- a/CORE/SYS/legacy/src/utils/src/parserApi.c +++ b/CORE/SYS/legacy/src/utils/src/parserApi.c @@ -1163,7 +1163,17 @@ PopulateDot11fExtCap(tpAniSirGlobal pMac, if (val) // If set to true then set RTTv3 { - p_ext_cap->fine_time_meas_initiator = 1; + if (LIM_IS_STA_ROLE(psessionEntry)) { + p_ext_cap->fine_time_meas_initiator = + (pMac->fine_time_meas_cap & FINE_TIME_MEAS_STA_INITIATOR) ? 1 : 0; + p_ext_cap->fine_time_meas_responder = + (pMac->fine_time_meas_cap & FINE_TIME_MEAS_STA_RESPONDER) ? 1 : 0; + } else if (LIM_IS_AP_ROLE(psessionEntry)) { + p_ext_cap->fine_time_meas_initiator = + (pMac->fine_time_meas_cap & FINE_TIME_MEAS_SAP_INITIATOR) ? 1 : 0; + p_ext_cap->fine_time_meas_responder = + (pMac->fine_time_meas_cap & FINE_TIME_MEAS_SAP_RESPONDER) ? 1 : 0; + } } #ifdef QCA_HT_2040_COEX @@ -2574,8 +2584,9 @@ sirConvertAssocReqFrame2Struct(tpAniSirGlobal pMac, p_ext_cap = (struct s_ext_cap *)&pAssocReq->ExtCap.bytes; limLog(pMac, LOG1, - FL("ExtCap is present, timingMeas: %d, ftm_initiator: %d"), - p_ext_cap->timingMeas, p_ext_cap->fine_time_meas_initiator); + FL("ExtCap present, timingMeas: %d Initiator: %d Responder: %d"), + p_ext_cap->timingMeas, p_ext_cap->fine_time_meas_initiator, + p_ext_cap->fine_time_meas_responder); } vos_mem_free(ar); return eSIR_SUCCESS; @@ -2766,8 +2777,9 @@ sirConvertAssocRespFrame2Struct(tpAniSirGlobal pMac, ar.ExtCap.num_bytes); p_ext_cap = (struct s_ext_cap *)&pAssocRsp->ExtCap.bytes; limLog(pMac, LOG1, - FL("ExtCap is present, timingMeas: %d, ftm_initiator: %d"), - p_ext_cap->timingMeas, p_ext_cap->fine_time_meas_initiator); + FL("ExtCap present, timingMeas: %d Initiator: %d Responder: %d"), + p_ext_cap->timingMeas, p_ext_cap->fine_time_meas_initiator, + p_ext_cap->fine_time_meas_responder); } if ( ar.QosMapSet.present ) @@ -2965,8 +2977,9 @@ sirConvertReassocReqFrame2Struct(tpAniSirGlobal pMac, vos_mem_copy(&pAssocReq->ExtCap.bytes, &ar.ExtCap.bytes, ar.ExtCap.num_bytes); limLog(pMac, LOG1, - FL("ExtCap is present, timingMeas: %d, ftm_initiator: %d"), - p_ext_cap->timingMeas, p_ext_cap->fine_time_meas_initiator); + FL("ExtCap present, timingMeas: %d Initiator: %d Responder: %d"), + p_ext_cap->timingMeas, p_ext_cap->fine_time_meas_initiator, + p_ext_cap->fine_time_meas_responder); } return eSIR_SUCCESS; |
