summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDeepak Dhamdhere <ddhamdhe@qca.qualcomm.com>2014-03-19 23:54:43 -0700
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-03-20 22:15:17 -0700
commit0486d930ba42b8f0dd6447d17faa30f4d747507b (patch)
treecbefecf3123ebdef5ec3e4d071c8b41722d91ee9
parent110f81610ef12645b4040222be59f71a008f81e0 (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.c2
-rw-r--r--CORE/SERVICES/WMA/wma.c47
-rw-r--r--CORE/SERVICES/WMA/wma.h3
-rw-r--r--CORE/SME/src/sme_common/sme_FTApi.c4
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