diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2018-09-19 18:37:23 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2018-09-19 18:37:23 +0000 |
commit | c89a7e86e87aebcae2c5ef8ff06ad806883795a4 (patch) | |
tree | 26f941eca2920e85e5b9cb43f4fb8217d21b3893 | |
parent | 47e3892341bca92b99820eef35eb19c5632a10aa (diff) | |
parent | 24ad2e523b2f6d0550a672d3adbf50399da04373 (diff) | |
download | qcom-msm-v4.9-oreo-mr1-1.2-iot-release.tar.gz |
Merge cherrypicks of [5061136, 5061195, 5061196, 5061197, 5061198, 5061199, 5062880, 5062881, 5062882] into oc-mr1-1.2-iot-releaseandroid-o-mr1-iot-release-smart-display-r3oreo-mr1-1.2-iot-release
Change-Id: I0bc9c97bd58829decdbb5ae06a9b1e4bae7fbd9a
16 files changed, 474 insertions, 408 deletions
diff --git a/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h b/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h index fa218ec8ce38..53b1b95ea2cd 100644 --- a/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h @@ -725,10 +725,10 @@ enum #define CFG_QOS_WMM_MODE_MAX (2) //HDD_WMM_NO_QOS #define CFG_QOS_WMM_MODE_DEFAULT (0) //HDD_WMM_AUTO -#define CFG_STA_LOCAL_EDCA_FOR_ETSI_NAME "gStaLocalEDCAForETSI" -#define CFG_STA_LOCAL_EDCA_FOR_ETSI_MIN (0) -#define CFG_STA_LOCAL_EDCA_FOR_ETSI_MAX (1) -#define CFG_STA_LOCAL_EDCA_FOR_ETSI_DEFAULT (0) +#define CFG_STA_LOCAL_EDCA_FOR_ETSI_NAME "gStaLocalEDCAForETSI" +#define CFG_STA_LOCAL_EDCA_FOR_ETSI_MIN (0) +#define CFG_STA_LOCAL_EDCA_FOR_ETSI_MAX (1) +#define CFG_STA_LOCAL_EDCA_FOR_ETSI_DEFAULT (0) #define CFG_QOS_WMM_80211E_ENABLED_NAME "80211eIsEnabled" #define CFG_QOS_WMM_80211E_ENABLED_MIN (0) diff --git a/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h b/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h index bcad09c68fe8..c82142be4e2a 100644 --- a/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h +++ b/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h @@ -347,7 +347,6 @@ extern spinlock_t hdd_context_lock; #define STATS_CONTEXT_MAGIC 0x53544154 //STAT #define PEER_INFO_CONTEXT_MAGIC 0x52535349 /* PEER_INFO */ #define POWER_CONTEXT_MAGIC 0x504F5752 //POWR -#define SNR_CONTEXT_MAGIC 0x534E5200 //SNR #define LINK_CONTEXT_MAGIC 0x4C494E4B //LINKSPEED #define LINK_STATUS_MAGIC 0x4C4B5354 //LINKSTATUS(LNST) #define TEMP_CONTEXT_MAGIC 0x74656d70 // TEMP (temperature) @@ -1413,7 +1412,6 @@ struct hdd_adapter_s /* State for synchronous OCB requests to WMI */ struct sir_ocb_set_config_response ocb_set_config_resp; - struct sir_ocb_get_tsf_timer_response ocb_get_tsf_timer_resp; struct dsrc_radio_chan_stats_ctxt dsrc_chan_stats; #ifdef WLAN_FEATURE_DSRC /* MAC addresses used for OCB interfaces */ diff --git a/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h b/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h index e01555f79268..5ce50fb63d61 100644 --- a/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h +++ b/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -429,7 +429,6 @@ extern void *mem_alloc_copy_from_user_helper(const void *wrqu_data, size_t len); extern VOS_STATUS wlan_hdd_get_linkspeed_for_peermac(hdd_adapter_t *pAdapter, tSirMacAddr macAddress); void hdd_clearRoamProfileIe( hdd_adapter_t *pAdapter); -void hdd_GetLink_SpeedCB(tSirLinkSpeedInfo *pLinkSpeed, void *pContext); VOS_STATUS wlan_hdd_check_ula_done(hdd_adapter_t *pAdapter); diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c index aefe48aefcf3..35f41ca44e41 100644 --- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c +++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c @@ -5228,10 +5228,19 @@ static tANI_S32 hdd_ProcessGENIE(hdd_adapter_t *pAdapter, pRsnIe = gen_ie + 2 + 4; RSNIeLen = gen_ie_len - (2 + 4); // Unpack the WPA IE - dot11fUnpackIeWPA((tpAniSirGlobal) halHandle, + status = dot11fUnpackIeWPA((tpAniSirGlobal) halHandle, pRsnIe, RSNIeLen, &dot11WPAIE); + + if (DOT11F_FAILED(status)) + { + hddLog(LOGE, + FL("Parse failure in hdd_ProcessGENIE (0x%08x)"), + status); + return -EINVAL; + } + // Copy out the encryption and authentication types hddLog(LOG1, FL("%s: WPA unicast cipher suite count: %d"), __func__, dot11WPAIE.unicast_cipher_count ); diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c index cd57b20e1e62..6b2140bc0018 100644 --- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -117,7 +117,7 @@ #define a_mode_rates_size (8) #define FREQ_BASE_80211G (2407) #define FREQ_BAND_DIFF_80211G (5) -#define MAX_SCAN_SSID 10 +#define MAX_SCAN_SSID 16 #define MAX_PENDING_LOG 5 #define MAX_HT_MCS_IDX 8 #define MAX_VHT_MCS_IDX 10 @@ -15988,13 +15988,22 @@ static bool wlan_hdd_get_sap_obss(hdd_adapter_t *pHostapdAdapter) hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pHostapdAdapter); beacon_data_t *beacon = pHostapdAdapter->sessionCtx.ap.beacon; uint8_t *ie = NULL; + uint32_t status; ie = wlan_hdd_cfg80211_get_ie_ptr(beacon->tail, beacon->tail_len, WLAN_EID_HT_CAPABILITY); if (ie && ie[1]) { vos_mem_copy(ht_cap_ie, &ie[2], DOT11F_IE_HTCAPS_MAX_LEN); - dot11fUnpackIeHTCaps((tpAniSirGlobal)hdd_ctx->hHal, ht_cap_ie, ie[1], + status = dot11fUnpackIeHTCaps((tpAniSirGlobal)hdd_ctx->hHal, ht_cap_ie, ie[1], &dot11_ht_cap_ie); + if (DOT11F_FAILED(status)) + { + hddLog(LOGE, + FL("unpack failed for HT Caps status:(0x%08x)"), + status); + return false; + } + return dot11_ht_cap_ie.supportedChannelWidthSet; } @@ -23954,6 +23963,7 @@ static int wlan_hdd_cfg80211_set_privacy_ibss( ) { int status = 0; + tANI_U32 ret; hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter); eCsrEncryptionType encryptionType = eCSR_ENCRYPT_TYPE_NONE; hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter); @@ -23992,10 +24002,18 @@ static int wlan_hdd_cfg80211_set_privacy_ibss( } // Unpack the WPA IE //Skip past the EID byte and length byte - and four byte WiFi OUI - dot11fUnpackIeWPA((tpAniSirGlobal) halHandle, + ret = dot11fUnpackIeWPA((tpAniSirGlobal) halHandle, &ie[2+4], ie[1] - 4, &dot11WPAIE); + if (DOT11F_FAILED(ret)) + { + hddLog(LOGE, + FL("unpack failed status:(0x%08x)"), + ret); + return -EINVAL; + } + /*Extract the multicast cipher, the encType for unicast cipher for wpa-none is none*/ encryptionType = diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c index 8bfba0aeea62..dfb103690bec 100644 --- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c @@ -2957,17 +2957,18 @@ int hdd_softap_unpackIE( tANI_U8 *pRsnIe; tANI_U16 RSNIeLen; + tANI_U32 status; if (NULL == halHandle) { hddLog(LOGE, FL("Error haHandle returned NULL")); - return -EINVAL; + return VOS_STATUS_E_FAILURE; } // Validity checks if ((gen_ie_len < VOS_MIN(DOT11F_IE_RSN_MIN_LEN, DOT11F_IE_WPA_MIN_LEN)) || (gen_ie_len > VOS_MAX(DOT11F_IE_RSN_MAX_LEN, DOT11F_IE_WPA_MAX_LEN)) ) - return -EINVAL; + return VOS_STATUS_E_FAILURE; // Type check if ( gen_ie[0] == DOT11F_EID_RSN) { @@ -2982,10 +2983,18 @@ int hdd_softap_unpackIE( RSNIeLen = gen_ie_len - 2; // Unpack the RSN IE memset(&dot11RSNIE, 0, sizeof(tDot11fIERSN)); - dot11fUnpackIeRSN((tpAniSirGlobal) halHandle, + status = dot11fUnpackIeRSN((tpAniSirGlobal) halHandle, pRsnIe, RSNIeLen, &dot11RSNIE); + if (DOT11F_FAILED(status)) + { + hddLog(LOGE, + FL("unpack failed for RSN IE status:(0x%08x)"), + status); + return VOS_STATUS_E_FAILURE; + } + // Copy out the encryption and authentication types hddLog(LOG1, FL("%s: pairwise cipher suite count: %d"), __func__, dot11RSNIE.pwise_cipher_suite_count ); @@ -3018,11 +3027,19 @@ int hdd_softap_unpackIE( RSNIeLen = gen_ie_len - (2 + 4); // Unpack the WPA IE memset(&dot11WPAIE, 0, sizeof(tDot11fIEWPA)); - dot11fUnpackIeWPA((tpAniSirGlobal) halHandle, + status = dot11fUnpackIeWPA((tpAniSirGlobal) halHandle, pRsnIe, RSNIeLen, &dot11WPAIE); - // Copy out the encryption and authentication types + if (DOT11F_FAILED(status)) + { + hddLog(LOGE, + FL("unpack failed for WPA IE status:(0x%08x)"), + status); + return VOS_STATUS_E_FAILURE; + } + + // Copy out the encryption and authentication types hddLog(LOG1, FL("%s: WPA unicast cipher suite count: %d"), __func__, dot11WPAIE.unicast_cipher_count ); hddLog(LOG1, FL("%s: WPA authentication suite count: %d"), @@ -6361,69 +6378,99 @@ iw_set_ap_genie(struct net_device *dev, return ret; } +struct linkspeed_priv { + tSirLinkSpeedInfo linkspeed_info; +}; + +static void +hdd_get_link_speed_cb(tSirLinkSpeedInfo *linkspeed_info, void *cookie) +{ + struct hdd_request *request; + struct linkspeed_priv *priv; + + if (NULL == linkspeed_info) + { + hddLog(VOS_TRACE_LEVEL_ERROR, + "%s: Bad param, linkspeed_info [%pK] cookie [%pK]", + __func__, linkspeed_info, cookie); + return; + } + + request = hdd_request_get(cookie); + if (!request) { + hddLog(VOS_TRACE_LEVEL_ERROR,"Obsolete request"); + return; + } + + priv = hdd_request_priv(request); + priv->linkspeed_info = *linkspeed_info; + hdd_request_complete(request); + hdd_request_put(request); +} VOS_STATUS wlan_hdd_get_linkspeed_for_peermac(hdd_adapter_t *pAdapter, tSirMacAddr macAddress) { eHalStatus hstatus; - unsigned long rc; - struct linkspeedContext context; - tSirLinkSpeedInfo *linkspeed_req; + VOS_STATUS status = VOS_STATUS_SUCCESS; + void *cookie; + tSirLinkSpeedInfo *linkspeed_info; + int ret; + struct hdd_request *request; + struct linkspeed_priv *priv; + static const struct hdd_request_params params = { + .priv_size = sizeof(*priv), + .timeout_ms = WLAN_WAIT_TIME_STATS, + }; if (NULL == pAdapter) { hddLog(VOS_TRACE_LEVEL_ERROR, "%s: pAdapter is NULL", __func__); return VOS_STATUS_E_FAULT; } - linkspeed_req = (tSirLinkSpeedInfo *)vos_mem_malloc(sizeof(*linkspeed_req)); - if (NULL == linkspeed_req) - { + + request = hdd_request_alloc(¶ms); + if (!request) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s Request Buffer Alloc Fail", __func__); return VOS_STATUS_E_INVAL; } - init_completion(&context.completion); - context.pAdapter = pAdapter; - context.magic = LINK_CONTEXT_MAGIC; - - vos_mem_copy(linkspeed_req->peer_macaddr, macAddress, sizeof(tSirMacAddr) ); - hstatus = sme_GetLinkSpeed( WLAN_HDD_GET_HAL_CTX(pAdapter), - linkspeed_req, - &context, - hdd_GetLink_SpeedCB); + cookie = hdd_request_cookie(request); + priv = hdd_request_priv(request); + + linkspeed_info = &priv->linkspeed_info; + vos_mem_copy(linkspeed_info->peer_macaddr, macAddress, sizeof(tSirMacAddr) ); + hstatus = sme_GetLinkSpeed(WLAN_HDD_GET_HAL_CTX(pAdapter), + linkspeed_info, + cookie, + hdd_get_link_speed_cb); + if (eHAL_STATUS_SUCCESS != hstatus) { hddLog(VOS_TRACE_LEVEL_ERROR, - "%s: Unable to retrieve statistics for link speed", - __func__); - vos_mem_free(linkspeed_req); + "%s: Unable to retrieve statistics for link speed, ret(%d)", + __func__, hstatus); + status = VOS_STATUS_E_INVAL; + goto cleanup; } - else - { - rc = wait_for_completion_timeout(&context.completion, - msecs_to_jiffies(WLAN_WAIT_TIME_STATS)); - if (!rc) { - hddLog(VOS_TRACE_LEVEL_ERROR, - "%s: SME timed out while retrieving link speed", - __func__); - } + ret = hdd_request_wait_for_response(request); + if (!ret) { + hddLog(VOS_TRACE_LEVEL_ERROR, + "%s: SME timed out while retrieving link speed,ret(%d)", + __func__, ret); + status = VOS_STATUS_E_INVAL; + goto cleanup; } + pAdapter->ls_stats.estLinkSpeed = linkspeed_info->estLinkSpeed; - /* either we never sent a request, we sent a request and received a - response or we sent a request and timed out. if we never sent a - request or if we sent a request and got a response, we want to - clear the magic out of paranoia. if we timed out there is a - race condition such that the callback function could be - executing at the same time we are. of primary concern is if the - callback function had already verified the "magic" but had not - yet set the completion variable when a timeout occurred. we - serialize these activities by invalidating the magic while - holding a shared spinlock which will cause us to block if the - callback is currently executing */ - spin_lock(&hdd_context_lock); - context.magic = 0; - spin_unlock(&hdd_context_lock); - return VOS_STATUS_SUCCESS; +cleanup: + /* + * either we never sent a request, we sent a request and + * received a response or we sent a request and timed out. + * regardless we are done with the request. + */ + hdd_request_put(request); + return status; } diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c index eac72d54ee33..d422846fc903 100644 --- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c +++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c @@ -3818,87 +3818,33 @@ void hdd_indicate_mgmt_frame(tSirSmeMgmtFrameInd *frame_ind) return; } -static void hdd_GetLink_statusCB(v_U8_t status, void *pContext) -{ - struct statsContext *pLinkContext; - hdd_adapter_t *pAdapter; - - if (NULL == pContext) { - hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Bad pContext [%pK]", - __func__, pContext); - return; - } - - pLinkContext = pContext; - pAdapter = pLinkContext->pAdapter; - - spin_lock(&hdd_context_lock); - - if ((NULL == pAdapter) || (LINK_STATUS_MAGIC != pLinkContext->magic)) { - /* the caller presumably timed out so there is nothing we can do */ - spin_unlock(&hdd_context_lock); - hddLog(VOS_TRACE_LEVEL_WARN, - "%s: Invalid context, pAdapter [%pK] magic [%08x]", - __func__, pAdapter, pLinkContext->magic); - return; - } - - /* context is valid so caller is still waiting */ - - /* paranoia: invalidate the magic */ - pLinkContext->magic = 0; - - /* copy over the status */ - pAdapter->linkStatus = status; - - /* notify the caller */ - complete(&pLinkContext->completion); - - /* serialization is complete */ - spin_unlock(&hdd_context_lock); -} +struct fw_state { + bool fw_active; +}; /** * hdd_get_fw_state_cb() - validates the context and notifies the caller - * @callback_context: caller context + * @cookie: cookie from the request contest * * Return: none */ -static void hdd_get_fw_state_cb(void *callback_context) +static void hdd_get_fw_state_cb(void *cookie) { - struct statsContext *context; - hdd_adapter_t *adapter; - - if (NULL == callback_context) { - hddLog(LOGE, FL("Bad pContext [%pK]"), callback_context); - return; - } - - context = callback_context; - adapter = context->pAdapter; - - spin_lock(&hdd_context_lock); + struct hdd_request *request; + struct fw_state *priv; - if ((NULL == adapter) || (FW_STATUS_MAGIC != context->magic)) { - /* the caller presumably timed out so there is - * nothing we can do - */ - spin_unlock(&hdd_context_lock); - hddLog(LOGE, FL("Invalid context, Adapter [%pK] magic [%08x]"), - adapter, context->magic); + request = hdd_request_get(cookie); + if (!request) { + hddLog(LOGE, FL("Obsolete request")); return; } - /* context is valid so caller is still waiting */ - - /* paranoia: invalidate the magic */ - context->magic = 0; + priv = hdd_request_priv(request); - /* notify the caller */ - complete(&context->completion); + priv->fw_active = true; - /* serialization is complete */ - spin_unlock(&hdd_context_lock); + hdd_request_complete(request); + hdd_request_put(request); } /** @@ -3915,42 +3861,73 @@ static void hdd_get_fw_state_cb(void *callback_context) bool wlan_hdd_get_fw_state(hdd_adapter_t *adapter) { hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter); - struct statsContext context; - eHalStatus hstatus = eHAL_STATUS_SUCCESS; - unsigned long rc; - bool fw_active = true; + eHalStatus hstatus; + int ret; + void *cookie; + struct fw_state *priv; + static const struct hdd_request_params params = { + .priv_size = sizeof(*priv), + .timeout_ms = WLAN_WAIT_TIME_LINK_STATUS, + }; + struct hdd_request *request; + bool fw_active; if (wlan_hdd_validate_context(hdd_ctx) != 0) return false; - init_completion(&context.completion); - context.pAdapter = adapter; - context.magic = FW_STATUS_MAGIC; + request = hdd_request_alloc(¶ms); + if (!request) { + hddLog(LOGE, FL("Request allocation failure")); + return false; + } + + cookie = hdd_request_cookie(request); + hstatus = sme_get_fw_state(WLAN_HDD_GET_HAL_CTX(adapter), hdd_get_fw_state_cb, - &context); - + cookie); if (eHAL_STATUS_SUCCESS != hstatus) { hddLog(LOGE, FL("Unable to retrieve firmware status")); fw_active = false; } else { /* request is sent -- wait for the response */ - rc = wait_for_completion_timeout(&context.completion, - msecs_to_jiffies(WLAN_WAIT_TIME_LINK_STATUS)); - if (!rc) { + ret = hdd_request_wait_for_response(request); + if (ret) { hddLog(LOGE, FL("SME timed out while retrieving firmware status")); fw_active = false; + } else { + priv = hdd_request_priv(request); + fw_active = priv->fw_active; } } - spin_lock(&hdd_context_lock); - context.magic = 0; - spin_unlock(&hdd_context_lock); + hdd_request_put(request); return fw_active; } +struct link_status_priv { + uint8_t link_status; +}; + +static void hdd_get_link_status_cb(uint8_t status, void *context) +{ + struct hdd_request *request; + struct link_status_priv *priv; + + request = hdd_request_get(context); + if (!request) { + hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Obsolete request", __func__); + return; + } + + priv = hdd_request_priv(request); + priv->link_status = status; + hdd_request_complete(request); + hdd_request_put(request); +} + /** * wlan_hdd_get_link_status() - get link status * @pAdapter: pointer to the adapter @@ -3965,50 +3942,68 @@ bool wlan_hdd_get_fw_state(hdd_adapter_t *adapter) */ static int wlan_hdd_get_link_status(hdd_adapter_t *pAdapter) { - hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); - hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter); - struct statsContext context; - eHalStatus hstatus; - unsigned long rc; + hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); + hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter); + eHalStatus hstatus; + int ret; + void *cookie; + struct hdd_request *request; + struct link_status_priv *priv; + static const struct hdd_request_params params = { + .priv_size = sizeof(*priv), + .timeout_ms = WLAN_WAIT_TIME_LINK_STATUS, + }; - if (pHddCtx->isLogpInProgress) { - hddLog(LOGW, FL("LOGP in Progress. Ignore!!!")); - return 0; - } + if (pHddCtx->isLogpInProgress) { + hddLog(LOGW, FL("LOGP in Progress. Ignore!!!")); + return 0; + } - if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) { - /* If not associated, then expected link status return value is 0 */ - hddLog(LOG1, FL("Not associated!")); - return 0; - } + if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) { + /* If not associated, then expected link status return value is 0 */ + hddLog(LOG1, FL("Not associated!")); + return 0; + } - init_completion(&context.completion); - context.pAdapter = pAdapter; - context.magic = LINK_STATUS_MAGIC; - hstatus = sme_getLinkStatus(WLAN_HDD_GET_HAL_CTX(pAdapter), - hdd_GetLink_statusCB, - &context, - pAdapter->sessionId); - if (eHAL_STATUS_SUCCESS != hstatus) { - hddLog(VOS_TRACE_LEVEL_ERROR, - "%s: Unable to retrieve link status", __func__); - /* return a cached value */ - } else { - /* request is sent -- wait for the response */ - rc = wait_for_completion_timeout(&context.completion, - msecs_to_jiffies(WLAN_WAIT_TIME_LINK_STATUS)); - if (!rc) { - hddLog(VOS_TRACE_LEVEL_ERROR, - FL("SME timed out while retrieving link status")); - } - } + request = hdd_request_alloc(¶ms); + if (!request) { + hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Request allocation failure", + __func__); + return 0; + } + cookie = hdd_request_cookie(request); - spin_lock(&hdd_context_lock); - context.magic = 0; - spin_unlock(&hdd_context_lock); + hstatus = sme_getLinkStatus(WLAN_HDD_GET_HAL_CTX(pAdapter), + hdd_get_link_status_cb, + cookie, + pAdapter->sessionId); + if (eHAL_STATUS_SUCCESS != hstatus) { + hddLog(VOS_TRACE_LEVEL_ERROR, + "%s: Unable to retrieve link status", __func__); + /* return a cached value */ + } else { + /* request is sent -- wait for the response */ + ret = hdd_request_wait_for_response(request); + if (ret) { + hddLog(VOS_TRACE_LEVEL_ERROR, + "%s: SME timed out while retrieving link status", + __func__); + /* return a cached value */ + } else { + /* update the adapter with the fresh results */ + priv = hdd_request_priv(request); + pAdapter->linkStatus = priv->link_status; + } + } + /* + * either we never sent a request, we sent a request and + * received a response or we sent a request and timed out. + * regardless we are done with the request. + */ + hdd_request_put(request); - /* either callback updated pAdapter stats or it has cached data */ - return pAdapter->linkStatus; + /* either callback updated adapter stats or it has cached data */ + return pAdapter->linkStatus; } #ifdef WLAN_FEATURE_ROAM_OFFLOAD diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_ocb.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_ocb.c index 51066f89cad8..508d23fa3652 100644 --- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_ocb.c +++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_ocb.c @@ -1484,6 +1484,16 @@ int wlan_hdd_cfg80211_ocb_stop_timing_advert(struct wiphy *wiphy, } /** + * hdd_ocb_get_tsf_timer_priv - private parameters for get tsf timer + * @response: response from SME + * @status: status of response + */ +struct hdd_ocb_get_tsf_timer_priv { + struct sir_ocb_get_tsf_timer_response response; + int status; +}; + +/** * hdd_ocb_get_tsf_timer_callback() - Callback to get TSF command * @context_ptr: request context * @response_ptr: response data @@ -1491,23 +1501,25 @@ int wlan_hdd_cfg80211_ocb_stop_timing_advert(struct wiphy *wiphy, static void hdd_ocb_get_tsf_timer_callback(void *context_ptr, void *response_ptr) { - struct hdd_ocb_ctxt *context = context_ptr; + struct hdd_request *hdd_request; + struct hdd_ocb_get_tsf_timer_priv *priv; struct sir_ocb_get_tsf_timer_response *response = response_ptr; - if (!context) + hdd_request = hdd_request_get(context_ptr); + if (!hdd_request) { + hddLog(LOGE, FL("Obsolete request")); return; + } - spin_lock(&hdd_context_lock); - if (context->magic == HDD_OCB_MAGIC) { - if (response) { - context->adapter->ocb_get_tsf_timer_resp = *response; - context->status = 0; - } else { - context->status = -EINVAL; - } - complete(&context->completion_evt); + priv = hdd_request_priv(hdd_request); + if (response) { + priv->response = *response; + priv->status = 0; + } else { + priv->status = -EINVAL; } - spin_unlock(&hdd_context_lock); + hdd_request_complete(hdd_request); + hdd_request_put(hdd_request); } /** @@ -1531,7 +1543,13 @@ __wlan_hdd_cfg80211_ocb_get_tsf_timer(struct wiphy *wiphy, hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev); int rc = -EINVAL; struct sir_ocb_get_tsf_timer request = {0}; - struct hdd_ocb_ctxt context = {0}; + void *cookie; + struct hdd_request *hdd_request; + struct hdd_ocb_get_tsf_timer_priv *priv; + static const struct hdd_request_params params = { + .priv_size = sizeof(*priv), + .timeout_ms = WLAN_WAIT_TIME_OCB_CMD, + }; ENTER(); @@ -1554,39 +1572,41 @@ __wlan_hdd_cfg80211_ocb_get_tsf_timer(struct wiphy *wiphy, } /* Initialize the callback context */ - init_completion(&context.completion_evt); - context.adapter = adapter; - context.magic = HDD_OCB_MAGIC; + hdd_request = hdd_request_alloc(¶ms); + if (!hdd_request) { + hddLog(LOGE, FL("Request allocation failure")); + return -ENOMEM; + } + cookie = hdd_request_cookie(hdd_request); request.vdev_id = adapter->sessionId; /* Call the SME function */ - rc = sme_ocb_get_tsf_timer(hdd_ctx->hHal, &context, + rc = sme_ocb_get_tsf_timer(hdd_ctx->hHal, cookie, hdd_ocb_get_tsf_timer_callback, &request); if (rc) { hddLog(LOGE, FL("Error calling SME function")); /* Need to convert from eHalStatus to errno. */ - return -EINVAL; + rc = -EINVAL; + goto end; } - rc = wait_for_completion_timeout(&context.completion_evt, - msecs_to_jiffies(WLAN_WAIT_TIME_OCB_CMD)); - if (rc == 0) { + rc = hdd_request_wait_for_response(hdd_request); + if (rc) { hddLog(LOGE, FL("Operation timed out")); - rc = -ETIMEDOUT; goto end; } - rc = 0; - if (context.status) { - hddLog(LOGE, FL("Operation failed: %d"), context.status); - rc = context.status; + priv = hdd_request_priv(hdd_request); + rc = priv->status; + if (rc) { + hddLog(LOGE, FL("Operation failed: %d"), rc); goto end; } /* Allocate the buffer for the response. */ nl_resp = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, - 2 * sizeof(uint32_t) + NLMSG_HDRLEN); + 2 * (NLA_HDRLEN + sizeof(uint32_t)) + NLMSG_HDRLEN); if (!nl_resp) { hddLog(LOGE, FL("cfg80211_vendor_cmd_alloc_reply_skb failed")); @@ -1595,18 +1615,18 @@ __wlan_hdd_cfg80211_ocb_get_tsf_timer(struct wiphy *wiphy, } hddLog(LOGE, FL("Got TSF timer response, high=%d, low=%d"), - adapter->ocb_get_tsf_timer_resp.timer_high, - adapter->ocb_get_tsf_timer_resp.timer_low); + priv->response.timer_high, + priv->response.timer_low); /* Populate the response. */ rc = nla_put_u32(nl_resp, QCA_WLAN_VENDOR_ATTR_OCB_GET_TSF_RESP_TIMER_HIGH, - adapter->ocb_get_tsf_timer_resp.timer_high); + priv->response.timer_high); if (rc) goto end; rc = nla_put_u32(nl_resp, QCA_WLAN_VENDOR_ATTR_OCB_GET_TSF_RESP_TIMER_LOW, - adapter->ocb_get_tsf_timer_resp.timer_low); + priv->response.timer_low); if (rc) goto end; @@ -1619,9 +1639,7 @@ __wlan_hdd_cfg80211_ocb_get_tsf_timer(struct wiphy *wiphy, } end: - spin_lock(&hdd_context_lock); - context.magic = 0; - spin_unlock(&hdd_context_lock); + hdd_request_put(hdd_request); if (nl_resp) kfree_skb(nl_resp); return rc; diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_scan.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_scan.c index 73630b9a2e5e..31b0433ac58c 100644 --- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_scan.c +++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_scan.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -211,6 +211,7 @@ static eHalStatus hdd_IndicateScanResult(hdd_scan_info_t *scanInfo, tCsrScanResu int error; char custom[MAX_CUSTOM_LEN]; char *p; + tANI_U32 status; hddLog( LOG1, "hdd_IndicateScanResult " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(descriptor->bssId)); @@ -339,12 +340,18 @@ static eHalStatus hdd_IndicateScanResult(hdd_scan_info_t *scanInfo, tCsrScanResu pDot11IEHTCaps = NULL; - dot11fUnpackBeaconIEs ((tpAniSirGlobal) + status = dot11fUnpackBeaconIEs ((tpAniSirGlobal) hHal, (tANI_U8 *) descriptor->ieFields, ie_length, &dot11BeaconIEs); + if (DOT11F_FAILED(status)) + { + hddLog(LOGE, + FL("unpack failed for Beacon IE status:(0x%08x)"), + status); + return eHAL_STATUS_FAILURE; + } pDot11SSID = &dot11BeaconIEs.SSID; - if (pDot11SSID->present ) { last_event = current_event; vos_mem_zero (&event, sizeof (struct iw_event)); diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_wext.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_wext.c index f26f08aad6b2..0467982877a3 100644 --- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_wext.c +++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_wext.c @@ -1172,64 +1172,6 @@ hdd_IsAuthTypeRSN( tHalHandle halHandle, eCsrAuthType authType) return rsnType; } -static void hdd_GetSnrCB(tANI_S8 snr, tANI_U32 staId, void *pContext) -{ - struct statsContext *pStatsContext; - hdd_adapter_t *pAdapter; - - if (ioctl_debug) - { - pr_info("%s: snr [%d] STA [%d] pContext [%pK]\n", - __func__, (int)snr, (int)staId, pContext); - } - - if (NULL == pContext) - { - hddLog(VOS_TRACE_LEVEL_ERROR, - "%s: Bad param, pContext [%pK]", - __func__, pContext); - return; - } - - pStatsContext = pContext; - pAdapter = pStatsContext->pAdapter; - - /* there is a race condition that exists between this callback - function and the caller since the caller could time out either - before or while this code is executing. we use a spinlock to - serialize these actions */ - spin_lock(&hdd_context_lock); - - if ((NULL == pAdapter) || (SNR_CONTEXT_MAGIC != pStatsContext->magic)) - { - /* the caller presumably timed out so there is nothing we can do */ - spin_unlock(&hdd_context_lock); - hddLog(VOS_TRACE_LEVEL_WARN, - "%s: Invalid context, pAdapter [%pK] magic [%08x]", - __func__, pAdapter, pStatsContext->magic); - if (ioctl_debug) - { - pr_info("%s: Invalid context, pAdapter [%pK] magic [%08x]\n", - __func__, pAdapter, pStatsContext->magic); - } - return; - } - - /* context is valid so caller is still waiting */ - - /* paranoia: invalidate the magic */ - pStatsContext->magic = 0; - - /* copy over the snr */ - pAdapter->snr = snr; - - /* notify the caller */ - complete(&pStatsContext->completion); - - /* serialization is complete */ - spin_unlock(&hdd_context_lock); -} - struct rssi_priv { v_S7_t rssi; }; @@ -1363,74 +1305,120 @@ VOS_STATUS wlan_hdd_get_rssi(hdd_adapter_t *pAdapter, v_S7_t *rssi_value) return VOS_STATUS_SUCCESS; } +struct snr_priv { + tANI_S8 snr; +}; + +/** + * hdd_get_snr_cb() - "Get SNR" callback function + * @snr: Current SNR of the station + * @sta_id: ID of the station + * @context: opaque context originally passed to SME. HDD always passes + * a cookie for the request context + * + * Return: None + */ +static void hdd_get_snr_cb(tANI_S8 snr, tANI_U32 sta_id, void *context) +{ + struct hdd_request *request; + struct snr_priv *priv; + + if (ioctl_debug) { + pr_info("%s: snr [%d] sta_id [%d] context [%pK]\n", + __func__, (int)snr, (int)sta_id, context); + } + + request = hdd_request_get(context); + if (!request) { + hddLog(VOS_TRACE_LEVEL_ERROR, + "%s: Obsolete request", __func__); + return; + } + + /* propagate response back to requesting thread */ + priv = hdd_request_priv(request); + priv->snr = snr; + hdd_request_complete(request); + hdd_request_put(request); +} + +/** + * wlan_hdd_get_snr() - Get the current SNR + * @pAdapter: adapter upon which the measurement is requested + * @snr: pointer to where the SNR should be returned + * + * Return: VOS_STATUS_SUCCESS on success, VOS_STATUS_E_** on error + */ VOS_STATUS wlan_hdd_get_snr(hdd_adapter_t *pAdapter, v_S7_t *snr) { - struct statsContext context; - hdd_context_t *pHddCtx; - hdd_station_ctx_t *pHddStaCtx; - eHalStatus hstatus; - unsigned long rc; - int valid; + hdd_context_t *pHddCtx; + hdd_station_ctx_t *pHddStaCtx; + eHalStatus hstatus; + int valid; + int ret; + void *cookie; + struct hdd_request *request; + struct snr_priv *priv; + static const struct hdd_request_params params = { + .priv_size = sizeof(*priv), + .timeout_ms = WLAN_WAIT_TIME_STATS, + }; - ENTER(); - if (NULL == pAdapter) - { - hddLog(VOS_TRACE_LEVEL_ERROR, - "%s: Invalid context, pAdapter", __func__); - return VOS_STATUS_E_FAULT; - } + ENTER(); - pHddCtx = WLAN_HDD_GET_CTX(pAdapter); - valid = wlan_hdd_validate_context(pHddCtx); - if (0 != valid) - return VOS_STATUS_E_FAULT; + if (NULL == pAdapter) { + hddLog(VOS_TRACE_LEVEL_ERROR, + "%s: Invalid context, pAdapter", __func__); + return VOS_STATUS_E_FAULT; + } - pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter); + pHddCtx = WLAN_HDD_GET_CTX(pAdapter); - init_completion(&context.completion); - context.pAdapter = pAdapter; - context.magic = SNR_CONTEXT_MAGIC; + valid = wlan_hdd_validate_context(pHddCtx); + if (0 != valid) + return VOS_STATUS_E_FAULT; - hstatus = sme_GetSnr(pHddCtx->hHal, hdd_GetSnrCB, - pHddStaCtx->conn_info.staId[ 0 ], - pHddStaCtx->conn_info.bssId, - &context); - if (eHAL_STATUS_SUCCESS != hstatus) - { - hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Unable to retrieve RSSI", - __func__); - /* we'll returned a cached value below */ - } - else - { - /* request was sent -- wait for the response */ - rc = wait_for_completion_timeout(&context.completion, - msecs_to_jiffies(WLAN_WAIT_TIME_STATS)); - if (!rc) { - hddLog(VOS_TRACE_LEVEL_ERROR, - FL("SME timed out while retrieving SNR")); - /* we'll now returned a cached value below */ - } - } + pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter); - /* either we never sent a request, we sent a request and received a - response or we sent a request and timed out. if we never sent a - request or if we sent a request and got a response, we want to - clear the magic out of paranoia. if we timed out there is a - race condition such that the callback function could be - executing at the same time we are. of primary concern is if the - callback function had already verified the "magic" but had not - yet set the completion variable when a timeout occurred. we - serialize these activities by invalidating the magic while - holding a shared spinlock which will cause us to block if the - callback is currently executing */ - spin_lock(&hdd_context_lock); - context.magic = 0; - spin_unlock(&hdd_context_lock); - - *snr = pAdapter->snr; - EXIT(); - return VOS_STATUS_SUCCESS; + request = hdd_request_alloc(¶ms); + if (!request) { + hddLog(VOS_TRACE_LEVEL_ERROR, + "%s: Request allocation failure", __func__); + return VOS_STATUS_E_FAULT; + } + cookie = hdd_request_cookie(request); + + hstatus = sme_GetSnr(pHddCtx->hHal, hdd_get_snr_cb, + pHddStaCtx->conn_info.staId[0], + pHddStaCtx->conn_info.bssId, cookie); + if (eHAL_STATUS_SUCCESS != hstatus) { + hddLog(VOS_TRACE_LEVEL_ERROR, + "%s: Unable to retrieve SNR", __func__); + /* we'll returned a cached value below */ + } else { + /* request was sent -- wait for the response */ + ret = hdd_request_wait_for_response(request); + if (ret) { + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("SME timed out while retrieving SNR")); + /* we'll now returned a cached value below */ + } else { + /* update the adapter with the fresh results */ + priv = hdd_request_priv(request); + pAdapter->snr = priv->snr; + } + } + + /* + * either we never sent a request, we sent a request and + * received a response or we sent a request and timed out. + * regardless we are done with the request. + */ + hdd_request_put(request); + + *snr = pAdapter->snr; + EXIT(); + return VOS_STATUS_SUCCESS; } void hdd_StatisticsCB( void *pStats, void *pContext ) @@ -3450,56 +3438,6 @@ void hdd_tx_per_hit_cb (void *pCallbackContext) wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, tx_fail); } -void hdd_GetLink_SpeedCB(tSirLinkSpeedInfo *pLinkSpeed, void *pContext) -{ - struct linkspeedContext *pLinkSpeedContext; - hdd_adapter_t *pAdapter; - - if ((NULL == pLinkSpeed) || (NULL == pContext)) - { - hddLog(VOS_TRACE_LEVEL_ERROR, - "%s: Bad param, pLinkSpeed [%pK] pContext [%pK]", - __func__, pLinkSpeed, pContext); - return; - } - spin_lock(&hdd_context_lock); - pLinkSpeedContext = pContext; - pAdapter = pLinkSpeedContext->pAdapter; - - /* there is a race condition that exists between this callback - function and the caller since the caller could time out either - before or while this code is executing. we use a spinlock to - serialize these actions */ - - if ((NULL == pAdapter) || (LINK_CONTEXT_MAGIC != pLinkSpeedContext->magic)) - { - /* the caller presumably timed out so there is nothing we can do */ - spin_unlock(&hdd_context_lock); - hddLog(VOS_TRACE_LEVEL_WARN, - "%s: Invalid context, pAdapter [%pK] magic [%08x]", - __func__, pAdapter, pLinkSpeedContext->magic); - if (ioctl_debug) - { - pr_info("%s: Invalid context, pAdapter [%pK] magic [%08x]\n", - __func__, pAdapter, pLinkSpeedContext->magic); - } - return; - } - /* context is valid so caller is still waiting */ - - /* paranoia: invalidate the magic */ - pLinkSpeedContext->magic = 0; - - /* copy over the stats. do so as a struct copy */ - pAdapter->ls_stats = *pLinkSpeed; - - /* notify the caller */ - complete(&pLinkSpeedContext->completion); - - /* serialization is complete */ - spin_unlock(&hdd_context_lock); -} - struct class_a_stats { tCsrGlobalClassAStatsInfo class_a_stats; }; diff --git a/techpack/qcacld-2.0/CORE/MAC/inc/sirApi.h b/techpack/qcacld-2.0/CORE/MAC/inc/sirApi.h index 5de9ca4cbbd4..fe665fa392d6 100644 --- a/techpack/qcacld-2.0/CORE/MAC/inc/sirApi.h +++ b/techpack/qcacld-2.0/CORE/MAC/inc/sirApi.h @@ -904,7 +904,7 @@ typedef enum eSirLinkTrafficCheck #define SIR_BG_SCAN_RETURN_CACHED_RESULTS 0x0 #define SIR_BG_SCAN_PURGE_RESUTLS 0x80 #define SIR_BG_SCAN_RETURN_FRESH_RESULTS 0x01 -#define SIR_SCAN_MAX_NUM_SSID 0x0A +#define SIR_SCAN_MAX_NUM_SSID 0x10 #define SIR_BG_SCAN_RETURN_LFR_CACHED_RESULTS 0x02 #define SIR_BG_SCAN_PURGE_LFR_RESULTS 0x40 diff --git a/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c b/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c index 5211d130f6a5..9d4954d6ba92 100644 --- a/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c +++ b/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c @@ -3338,17 +3338,16 @@ limProcessStaMlmAddBssRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ,tpPESession ps pStaDs->ucUcastSig = pAddBssParams->staContext.ucUcastSig; pStaDs->ucBcastSig = pAddBssParams->staContext.ucBcastSig; - //for ETSI, STA should follow AP' country code and judge the country of EU, while we have no valid AP, so need ignore country for ETSI test. - //if(pMac->roam.configParam.gStaLocalEDCAEnable && vos_is_etsi_europe_country(pMac->scan.countryCodeCurrent)) - if(pMac->roam.configParam.gStaLocalEDCAEnable) - { - - if (schGetParams(pMac, params, true /*local*/) != eSIR_SUCCESS) - { - PELOGE(limLog(pMac, LOGE, FL("schGetParams(local) failed"));) - } - else - setSchEdcaParams(pMac, params, psessionEntry); + /* + * for ETSI, STA should follow AP' country code and judge the + * country of EU, while we have no valid AP, so need ignore + * country for ETSI test. + */ + if (pMac->roam.configParam.gStaLocalEDCAEnable) { + if (schGetParams(pMac, params, true) != eSIR_SUCCESS) + PELOGE(limLog(pMac, LOGE, FL("schGetParams(local) failed"));) + else + setSchEdcaParams(pMac, params, psessionEntry); } // Downgrade the EDCA parameters if needed diff --git a/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limSmeReqUtils.c b/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limSmeReqUtils.c index c0c86a5a9b30..43c252b681d0 100644 --- a/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limSmeReqUtils.c +++ b/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limSmeReqUtils.c @@ -261,6 +261,7 @@ limSetRSNieWPAiefromSmeStartBSSReqMessage(tpAniSirGlobal pMac, { tANI_U8 wpaIndex = 0; tANI_U32 privacy, val; + tANI_U32 status; if (wlan_cfgGetInt(pMac, WNI_CFG_PRIVACY_ENABLED, &privacy) != eSIR_SUCCESS) @@ -331,9 +332,16 @@ limSetRSNieWPAiefromSmeStartBSSReqMessage(tpAniSirGlobal pMac, limLog(pMac, LOG1, FL("Only RSN IE is present")); - dot11fUnpackIeRSN(pMac,&pRSNie->rsnIEdata[2], + status = dot11fUnpackIeRSN(pMac,&pRSNie->rsnIEdata[2], pRSNie->rsnIEdata[1], &pSessionEntry->gStartBssRSNIe); + if (!DOT11F_SUCCEEDED(status)) + { + limLog(pMac, + LOGE,FL("unpack failed for RSN IE (0x%08x)"), + status); + return false; + } return true; } else if ((pRSNie->length == pRSNie->rsnIEdata[1] + 2) && @@ -343,9 +351,16 @@ limSetRSNieWPAiefromSmeStartBSSReqMessage(tpAniSirGlobal pMac, LOG1, FL("Only WPA IE is present")); - dot11fUnpackIeWPA(pMac,&pRSNie->rsnIEdata[6], + status = dot11fUnpackIeWPA(pMac,&pRSNie->rsnIEdata[6], pRSNie->rsnIEdata[1] - 4, &pSessionEntry->gStartBssWPAIe); + if (!DOT11F_SUCCEEDED(status)) + { + limLog(pMac, + LOGE,FL("unpack failed for WPA IE (0x%08x)"), + status); + return false; + } return true; } @@ -368,13 +383,26 @@ limSetRSNieWPAiefromSmeStartBSSReqMessage(tpAniSirGlobal pMac, else { /* Both RSN and WPA IEs are present */ - dot11fUnpackIeRSN(pMac,&pRSNie->rsnIEdata[2], + status = dot11fUnpackIeRSN(pMac,&pRSNie->rsnIEdata[2], pRSNie->rsnIEdata[1], &pSessionEntry->gStartBssRSNIe); + if (!DOT11F_SUCCEEDED(status)) + { + limLog(pMac, + LOGE,FL("unpack failed for RSN IE (0x%08x)"), + status); + return false; + } - dot11fUnpackIeWPA(pMac,&pRSNie->rsnIEdata[wpaIndex + 6], + status = dot11fUnpackIeWPA(pMac,&pRSNie->rsnIEdata[wpaIndex + 6], pRSNie->rsnIEdata[wpaIndex + 1]-4, &pSessionEntry->gStartBssWPAIe); - + if (!DOT11F_SUCCEEDED(status)) + { + limLog(pMac, + LOGE,FL("unpack failed for WPA IE (0x%08x)"), + status); + return false; + } } } else diff --git a/techpack/qcacld-2.0/CORE/MAC/src/pe/sch/schMessage.c b/techpack/qcacld-2.0/CORE/MAC/src/pe/sch/schMessage.c index 700825d07844..722013f3ee48 100644 --- a/techpack/qcacld-2.0/CORE/MAC/src/pe/sch/schMessage.c +++ b/techpack/qcacld-2.0/CORE/MAC/src/pe/sch/schMessage.c @@ -254,7 +254,11 @@ schGetParams( tANI_U32 etsi_b[] = {WNI_CFG_EDCA_ETSI_ACBE, WNI_CFG_EDCA_ETSI_ACBK, WNI_CFG_EDCA_ETSI_ACVI, WNI_CFG_EDCA_ETSI_ACVO}; - if ((wlan_cfgGetStr(pMac, WNI_CFG_COUNTRY_CODE, country_code_str, + if(pMac->roam.configParam.gStaLocalEDCAEnable) + { + val = WNI_CFG_EDCA_PROFILE_ETSI_EUROPE; + } + else if ((wlan_cfgGetStr(pMac, WNI_CFG_COUNTRY_CODE, country_code_str, &country_code_len) == eSIR_SUCCESS) && vos_is_etsi_europe_country(country_code_str)) { val = WNI_CFG_EDCA_PROFILE_ETSI_EUROPE; diff --git a/techpack/qcacld-2.0/CORE/SERVICES/COMMON/ieee80211_defines.h b/techpack/qcacld-2.0/CORE/SERVICES/COMMON/ieee80211_defines.h index cdd308f3bf02..60561255ce5c 100644 --- a/techpack/qcacld-2.0/CORE/SERVICES/COMMON/ieee80211_defines.h +++ b/techpack/qcacld-2.0/CORE/SERVICES/COMMON/ieee80211_defines.h @@ -306,8 +306,8 @@ typedef u_int32_t IEEE80211_SCAN_ID; #define IEEE80211_SCAN_CHAN_EVENT 0x0400 /* scan chan event for offload architectures */ #define IEEE80211_SCAN_FILTER_PROBE_REQ 0x0800 /* Filter probe requests- applicable only for offload architectures*/ -#define IEEE80211_SCAN_PARAMS_MAX_SSID 10 -#define IEEE80211_SCAN_PARAMS_MAX_BSSID 10 +#define IEEE80211_SCAN_PARAMS_MAX_SSID 16 +#define IEEE80211_SCAN_PARAMS_MAX_BSSID 16 /* flag definitions passed to scan_cancel API */ diff --git a/techpack/qcacld-2.0/CORE/SYS/legacy/src/utils/src/parserApi.c b/techpack/qcacld-2.0/CORE/SYS/legacy/src/utils/src/parserApi.c index 52f86adbced5..b9103e9182f3 100644 --- a/techpack/qcacld-2.0/CORE/SYS/legacy/src/utils/src/parserApi.c +++ b/techpack/qcacld-2.0/CORE/SYS/legacy/src/utils/src/parserApi.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -5843,16 +5843,22 @@ tSirRetStatus PopulateDot11fAssocResWscIE(tpAniSirGlobal pMac, { tDot11fIEWscAssocReq parsedWscAssocReq = { 0, }; tANI_U8 *wscIe; + tANI_U32 status; wscIe = limGetWscIEPtr(pMac, pRcvdAssocReq->addIE.addIEdata, pRcvdAssocReq->addIE.length); if(wscIe != NULL) { // retreive WSC IE from given AssocReq - dot11fUnpackIeWscAssocReq( pMac, + status = dot11fUnpackIeWscAssocReq( pMac, wscIe + 2 + 4, // EID, length, OUI wscIe[ 1 ] - 4, // length without OUI &parsedWscAssocReq ); + if (!DOT11F_SUCCEEDED(status)) + { + limLog(pMac, LOGE, FL("Unpack wsc failed status: (0x%08x)"), status); + return eSIR_HAL_INPUT_INVALID; + } pDot11f->present = 1; // version has to be 0x10 pDot11f->Version.present = 1; |