diff options
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.c | 1 | ||||
| -rw-r--r-- | core/sme/inc/csr_neighbor_roam.h | 1 | ||||
| -rw-r--r-- | core/sme/inc/sme_api.h | 3 | ||||
| -rw-r--r-- | core/sme/src/common/sme_api.c | 10 | ||||
| -rw-r--r-- | core/sme/src/csr/csr_api_roam.c | 83 |
5 files changed, 93 insertions, 5 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 9c9a38272c0b..bf1b6890e96a 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -3916,6 +3916,7 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy, hdd_ctx->config->fine_time_meas_cap = hdd_ctx->fine_time_meas_cap_target & ftm_capab; sme_update_fine_time_measurement_capab(hdd_ctx->hHal, + adapter->sessionId, hdd_ctx->config->fine_time_meas_cap); hdd_info("FTM capability: user value: 0x%x, target value: 0x%x, final value: 0x%x", ftm_capab, hdd_ctx->fine_time_meas_cap_target, diff --git a/core/sme/inc/csr_neighbor_roam.h b/core/sme/inc/csr_neighbor_roam.h index 260794035e84..582d0572e13b 100644 --- a/core/sme/inc/csr_neighbor_roam.h +++ b/core/sme/inc/csr_neighbor_roam.h @@ -321,6 +321,7 @@ void csr_roam_reset_roam_params(tpAniSirGlobal mac_ptr); #define REASON_ROAM_SCAN_HI_RSSI_DELTA_CHANGED 31 #define REASON_ROAM_SCAN_HI_RSSI_DELAY_CHANGED 32 #define REASON_ROAM_SCAN_HI_RSSI_UB_CHANGED 33 +#define REASON_CONNECT_IES_CHANGED 34 #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD) QDF_STATUS csr_roam_offload_scan(tpAniSirGlobal pMac, uint8_t sessionId, diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index 12eef22ae8c6..76666d901d8e 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -1176,7 +1176,8 @@ static inline QDF_STATUS sme_send_egap_conf_params(uint32_t enable, } #endif -void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val); +void sme_update_fine_time_measurement_capab(tHalHandle hal, uint8_t session_id, + uint32_t val); QDF_STATUS sme_ht40_stop_obss_scan(tHalHandle hHal, uint32_t vdev_id); QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test); QDF_STATUS sme_set_tsfcb(tHalHandle hHal, diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 7f8305846b4d..de1a97e981ba 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -1269,12 +1269,13 @@ QDF_STATUS sme_set_reg_info(tHalHandle hHal, uint8_t *apCntryCode) * * Return: None */ -void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val) +void sme_update_fine_time_measurement_capab(tHalHandle hal, uint8_t session_id, + uint32_t val) { tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); mac_ctx->fine_time_meas_cap = val; - if (val == 0) { + if (!val) { mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0; ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext. rrmConfig.rm_capability)->fine_time_meas_rpt = 0; @@ -1283,6 +1284,11 @@ void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val) ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext. rrmConfig.rm_capability)->fine_time_meas_rpt = 1; } + + /* Inform this RRM IE change to FW */ + csr_roam_offload_scan(mac_ctx, session_id, + ROAM_SCAN_OFFLOAD_UPDATE_CFG, + REASON_CONNECT_IES_CHANGED); } /*-------------------------------------------------------------------------- diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index d2f38340b053..5ee911294739 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -17264,6 +17264,82 @@ bool csr_is_RSO_cmd_allowed(tpAniSirGlobal mac_ctx, uint8_t command, } /** + * csr_append_assoc_ies() - Append specific IE to assoc IE's buffer + * @mac_ctx: Pointer to global mac context + * @req_buf: Pointer to Roam offload scan request + * @ie_id: IE ID to be appended + * @ie_len: IE length to be appended + * @ie_data: IE data to be appended + * + * Return: None + */ +static void csr_append_assoc_ies(tpAniSirGlobal mac_ctx, + tSirRoamOffloadScanReq *req_buf, uint8_t ie_id, + uint8_t ie_len, uint8_t *ie_data) +{ + tSirAddie *assoc_ie = &req_buf->assoc_ie; + if ((SIR_MAC_MAX_ADD_IE_LENGTH - assoc_ie->length) < ie_len) { + sms_log(mac_ctx, LOGE, "Appending IE(id:%d) fails", ie_id); + return; + } + + assoc_ie->addIEdata[assoc_ie->length] = ie_id; + assoc_ie->addIEdata[assoc_ie->length + 1] = ie_len; + qdf_mem_copy(&assoc_ie->addIEdata[assoc_ie->length + 2], + ie_data, ie_len); + assoc_ie->length += (ie_len + 2); +} + +/** + * csr_update_driver_assoc_ies() - Append driver built IE's to assoc IE's + * @mac_ctx: Pointer to global mac structure + * @session: pointer to CSR session + * @req_buf: Pointer to Roam offload scan request + * + * Return: None + */ +static void csr_update_driver_assoc_ies(tpAniSirGlobal mac_ctx, + tCsrRoamSession *session, + tSirRoamOffloadScanReq *req_buf) +{ + bool power_caps_populated = false; + uint32_t csr_11henable = WNI_CFG_11H_ENABLED_STADEF; + uint8_t *rrm_cap_ie_data + = (uint8_t *) &mac_ctx->rrm.rrmPEContext.rrmEnabledCaps; + uint8_t power_cap_ie_data[DOT11F_IE_POWERCAPS_MAX_LEN] + = {MIN_TX_PWR_CAP, MAX_TX_PWR_CAP}; + uint8_t max_tx_pwr_cap + = csr_get_cfg_max_tx_power(mac_ctx, + session->pConnectBssDesc->channelId); + + if (max_tx_pwr_cap) + power_cap_ie_data[1] = max_tx_pwr_cap; + + wlan_cfg_get_int(mac_ctx, WNI_CFG_11H_ENABLED, &csr_11henable); + + if (csr_11henable && csr_is11h_supported(mac_ctx)) { + /* Append power cap IE */ + csr_append_assoc_ies(mac_ctx, req_buf, IEEE80211_ELEMID_PWRCAP, + DOT11F_IE_POWERCAPS_MAX_LEN, + power_cap_ie_data); + power_caps_populated = true; + } + + if (mac_ctx->rrm.rrmPEContext.rrmEnable) { + /* Append RRM IE */ + csr_append_assoc_ies(mac_ctx, req_buf, IEEE80211_ELEMID_RRM, + DOT11F_IE_RRMENABLEDCAP_MAX_LEN, + rrm_cap_ie_data); + if (!power_caps_populated) + /* Append Power cap IE if not appended already */ + csr_append_assoc_ies(mac_ctx, req_buf, + IEEE80211_ELEMID_PWRCAP, + DOT11F_IE_POWERCAPS_MAX_LEN, + power_cap_ie_data); + } +} + +/** * csr_roam_offload_scan() - populates roam offload scan request and sends to * WMA * @@ -17457,12 +17533,15 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id, req_buf->hi_rssi_scan_delay, req_buf->hi_rssi_scan_rssi_ub); - if ((command == ROAM_SCAN_OFFLOAD_START) && - (reason == REASON_CONNECT)) { + if (((command == ROAM_SCAN_OFFLOAD_START) && + (reason == REASON_CONNECT)) || + ((command == ROAM_SCAN_OFFLOAD_UPDATE_CFG) && + (reason == REASON_CONNECT_IES_CHANGED))) { req_buf->assoc_ie.length = session->nAddIEAssocLength; qdf_mem_copy(req_buf->assoc_ie.addIEdata, session->pAddIEAssoc, session->nAddIEAssocLength); + csr_update_driver_assoc_ies(mac_ctx, session, req_buf); } else { req_buf->assoc_ie.length = 0; } |
