diff options
| author | Deepak Dhamdhere <ddhamdhe@qca.qualcomm.com> | 2014-03-19 23:54:43 -0700 |
|---|---|---|
| committer | Akash Patel <c_akashp@qca.qualcomm.com> | 2014-03-20 22:15:17 -0700 |
| commit | 0486d930ba42b8f0dd6447d17faa30f4d747507b (patch) | |
| tree | cbefecf3123ebdef5ec3e4d071c8b41722d91ee9 | |
| parent | 110f81610ef12645b4040222be59f71a008f81e0 (diff) | |
qcacld: Allow PTK to be set prior to reassociation in 11r
Supplicant provides PTK to driver prior to reassociation in case of
11r roaming. That functionality is now enabled for Rome by reverting
https://review-android.quicinc.com/#/c/534840.
Added support in WMA to remember the PTK that came with roaming
ADD_BSS request and use it later after sending peer_assoc command.
This optimization will improve roaming latency in 11r.
Change-Id: I29211f727887ceb4da1e229adde1d7681ec4b4db
CRs-Fixed: 634581
| -rw-r--r-- | CORE/MAC/src/pe/lim/limFT.c | 2 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 47 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.h | 3 | ||||
| -rw-r--r-- | CORE/SME/src/sme_common/sme_FTApi.c | 4 |
4 files changed, 49 insertions, 7 deletions
diff --git a/CORE/MAC/src/pe/lim/limFT.c b/CORE/MAC/src/pe/lim/limFT.c index 9ba936035fda..791d6c213369 100644 --- a/CORE/MAC/src/pe/lim/limFT.c +++ b/CORE/MAC/src/pe/lim/limFT.c @@ -1430,6 +1430,8 @@ tANI_BOOLEAN limProcessFTUpdateKey(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf ) PELOG1(limLog(pMac, LOG1, FL("BSSID = "MAC_ADDRESS_STR), MAC_ADDR_ARRAY(pKeyInfo->bssId));) + sirCopyMacAddr(pAddBssParams->extSetStaKeyParam.peerMacAddr, pKeyInfo->bssId); + if(pAddBssParams->extSetStaKeyParam.key[0].keyLength == 16) { PELOG1(limLog(pMac, LOG1, diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 024240242e78..d413ff62ab1b 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -227,6 +227,9 @@ void wma_set_dfs_regdomain(tp_wma_handle wma); static VOS_STATUS wma_set_thermal_mgmt(tp_wma_handle wma_handle, t_thermal_cmd_params thermal_info); +static void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info, + v_BOOL_t sendResp); + static void *wma_find_vdev_by_addr(tp_wma_handle wma, u_int8_t *addr, u_int8_t *vdev_id) { @@ -3052,6 +3055,11 @@ void wma_vdev_detach_callback(void *ctx) } if(iface->addBssStaContext) adf_os_mem_free(iface->addBssStaContext); + +#if defined WLAN_FEATURE_VOWIFI_11R + if (iface->staKeyParams) + adf_os_mem_free(iface->staKeyParams); +#endif vos_mem_zero(iface, sizeof(*iface)); param->status = VOS_STATUS_SUCCESS; @@ -3150,6 +3158,10 @@ static VOS_STATUS wma_vdev_detach(tp_wma_handle wma_handle, out: if(iface->addBssStaContext) adf_os_mem_free(iface->addBssStaContext); +#if defined WLAN_FEATURE_VOWIFI_11R + if (iface->staKeyParams) + adf_os_mem_free(iface->staKeyParams); +#endif vos_mem_zero(iface, sizeof(*iface)); pdel_sta_self_req_param->status = status; if (generateRsp) @@ -6068,6 +6080,10 @@ void wma_vdev_resp_timer(void *data) (void *)iface->del_staself_req, 0); if(iface->addBssStaContext) adf_os_mem_free(iface->addBssStaContext); +#if defined WLAN_FEATURE_VOWIFI_11R + if (iface->staKeyParams) + adf_os_mem_free(iface->staKeyParams); +#endif vos_mem_zero(iface, sizeof(*iface)); } else if (tgt_req->msg_type == WDA_ADD_BSS_REQ) { tpAddBssParams params = (tpAddBssParams)tgt_req->user_data; @@ -8279,6 +8295,22 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss) } adf_os_mem_copy(iface->addBssStaContext, &add_bss->staContext, sizeof(tAddStaParams)); + +#if defined WLAN_FEATURE_VOWIFI_11R + if (iface->staKeyParams) { + adf_os_mem_free(iface->staKeyParams); + iface->staKeyParams = NULL; + } + if (add_bss->extSetStaKeyParamValid) { + iface->staKeyParams = adf_os_mem_alloc(NULL, sizeof(tSetStaKeyParams)); + if (!iface->staKeyParams) { + WMA_LOGE("%s Failed to allocat memory", __func__); + goto send_fail_resp; + } + adf_os_mem_copy(iface->staKeyParams, &add_bss->extSetStaKeyParam, + sizeof(tSetStaKeyParams)); + } +#endif // Save parameters later needed by WDA_ADD_STA_REQ iface->rmfEnabled = add_bss->rmfEnabled; iface->beaconInterval = add_bss->beaconInterval; @@ -9004,6 +9036,14 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params) } } #endif /* WLAN_FEATURE_11W */ +#if defined WLAN_FEATURE_VOWIFI_11R + /* + * Set the PTK in 11r mode because we already have it. + */ + if (iface->staKeyParams) { + wma_set_stakey(wma, (tpSetStaKeyParams) iface->staKeyParams, FALSE); + } +#endif } #if defined WLAN_FEATURE_VOWIFI maxTxPower = params->maxTxPower; @@ -9473,7 +9513,7 @@ static void wma_set_ibsskey_helper(tp_wma_handle wma_handle, tpSetBssKeyParams k } } -static void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info) +static void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info, v_BOOL_t sendResp) { wmi_buf_t buf; int32_t status, i; @@ -9581,7 +9621,8 @@ static void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info) /* TODO: Should we wait till we get HTT_T2H_MSG_TYPE_SEC_IND? */ key_info->status = eHAL_STATUS_SUCCESS; out: - wma_send_msg(wma_handle, WDA_SET_STAKEY_RSP, (void *) key_info, 0); + if (sendResp) + wma_send_msg(wma_handle, WDA_SET_STAKEY_RSP, (void *) key_info, 0); } static void wma_delete_sta_req_ap_mode(tp_wma_handle wma, @@ -15282,7 +15323,7 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg) break; case WDA_SET_STAKEY_REQ: wma_set_stakey(wma_handle, - (tpSetStaKeyParams)msg->bodyptr); + (tpSetStaKeyParams)msg->bodyptr, TRUE); break; case WDA_DELETE_STA_REQ: wma_delete_sta(wma_handle, diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h index f1e7e74ba9a2..7f7edd21d52e 100644 --- a/CORE/SERVICES/WMA/wma.h +++ b/CORE/SERVICES/WMA/wma.h @@ -460,6 +460,9 @@ struct wma_txrx_node { tPowerdBm tx_power; /* TX power in dBm */ tPowerdBm max_tx_power; /* max Tx power in dBm */ u_int32_t nwType; +#if defined WLAN_FEATURE_VOWIFI_11R + void *staKeyParams; +#endif }; #if defined(QCA_WIFI_FTM) && !defined(QCA_WIFI_ISOC) diff --git a/CORE/SME/src/sme_common/sme_FTApi.c b/CORE/SME/src/sme_common/sme_FTApi.c index 6501391ff91b..9f3d3526142c 100644 --- a/CORE/SME/src/sme_common/sme_FTApi.c +++ b/CORE/SME/src/sme_common/sme_FTApi.c @@ -374,7 +374,6 @@ eHalStatus sme_FTUpdateKey( tHalHandle hHal, tCsrRoamSetKey * pFTKeyInfo ) switch(pMac->ft.ftSmeContext.FTState) { case eFT_SET_KEY_WAIT: -#ifdef QCA_WIFI_ISOC if (sme_GetFTPreAuthState (hHal) == TRUE) { status = sme_FTSendUpdateKeyInd(pMac, pFTKeyInfo); @@ -393,9 +392,6 @@ eHalStatus sme_FTUpdateKey( tHalHandle hHal, tCsrRoamSetKey * pFTKeyInfo ) } sme_SetFTPreAuthState(hHal, FALSE); } -#else - status = eHAL_STATUS_FT_PREAUTH_KEY_FAILED; -#endif /* QCA_WIFI_ISOC */ pMac->ft.ftSmeContext.FTState = eFT_START_READY; #ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG |
