wlan : Fast transition (11r)
- Set Key along with the Config BSS command to HAL
to improve the 11r roam latencies
- Move the TL state to Authenticated to allow TX Data
when set GTK is received at driver from supplicant
- Optimize the memcpy in hdd_SendFTEvent
Change-Id: Iab9f1fbcc4a11bd1a2e521885a6beaf1f6a9068a
CRs-fixed: 465419
diff --git a/CORE/HDD/inc/wlan_hdd_assoc.h b/CORE/HDD/inc/wlan_hdd_assoc.h
index f6aac61..2463690 100644
--- a/CORE/HDD/inc/wlan_hdd_assoc.h
+++ b/CORE/HDD/inc/wlan_hdd_assoc.h
@@ -140,5 +140,5 @@
int hdd_set_csr_auth_type( hdd_adapter_t *pAdapter, eCsrAuthType RSNAuthType );
VOS_STATUS hdd_roamRegisterTDLSSTA( hdd_adapter_t *pAdapter,
tANI_U8 *peerMac, tANI_U16 staId, tANI_U8 ucastSig);
-
+void hdd_PerformRoamSetKeyComplete(hdd_adapter_t *pAdapter);
#endif
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 3439334..ea514dd 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -185,6 +185,9 @@
#define GTK_OFFLOAD_DISABLE 1
#endif
+#define HDD_MAC_ADDR_LEN 6
+typedef v_U8_t tWlanHddMacAddr[HDD_MAC_ADDR_LEN];
+
typedef struct hdd_tx_rx_stats_s
{
// start_xmit stats
@@ -276,6 +279,12 @@
{
HDD_ROAM_STATE roamingState;
vos_event_t roamingEvent;
+
+ tWlanHddMacAddr bssid;
+ tWlanHddMacAddr peerMac;
+ tANI_U32 roamId;
+ eRoamCmdStatus roamStatus;
+ v_BOOL_t deferKeyComplete;
} roaming_info_t;
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index e80e603..b9e1a6f 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -127,6 +127,12 @@
tANI_U8 frameType );
#endif
+static eHalStatus hdd_RoamSetKeyCompleteHandler( hdd_adapter_t *pAdapter,
+ tCsrRoamInfo *pRoamInfo,
+ tANI_U32 roamId,
+ eRoamCmdStatus roamStatus,
+ eCsrRoamResult roamResult );
+
v_VOID_t hdd_connSetConnectionState( hdd_station_ctx_t *pHddStaCtx,
eConnectionState connState )
{
@@ -394,7 +400,6 @@
struct cfg80211_ft_event_params ftEvent;
v_U8_t ftIe[DOT11F_IE_FTINFO_MAX_LEN];
v_U8_t ricIe[DOT11F_IE_RICDESCRIPTOR_MAX_LEN];
- v_U8_t target_ap[SIR_MAC_ADDR_LENGTH];
struct net_device *dev = pAdapter->dev;
#else
char *buff;
@@ -428,9 +433,9 @@
return;
}
- vos_mem_copy(target_ap, ftIe, SIR_MAC_ADDR_LENGTH);
+ sme_SetFTPreAuthState(pHddCtx->hHal, TRUE);
- ftEvent.target_ap = target_ap;
+ ftEvent.target_ap = ftIe;
ftEvent.ies = (u8 *)(ftIe + SIR_MAC_ADDR_LENGTH);
ftEvent.ies_len = auth_resp_len - SIR_MAC_ADDR_LENGTH;
@@ -1082,6 +1087,31 @@
kfree(rspRsnIe);
}
+void hdd_PerformRoamSetKeyComplete(hdd_adapter_t *pAdapter)
+{
+ eHalStatus halStatus = eHAL_STATUS_SUCCESS;
+ hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+ tCsrRoamInfo roamInfo;
+ roamInfo.fAuthRequired = FALSE;
+ vos_mem_copy(roamInfo.bssid,
+ pHddStaCtx->roam_info.bssid,
+ WNI_CFG_BSSID_LEN);
+ vos_mem_copy(roamInfo.peerMac,
+ pHddStaCtx->roam_info.peerMac,
+ WNI_CFG_BSSID_LEN);
+
+ halStatus = hdd_RoamSetKeyCompleteHandler(pAdapter,
+ &roamInfo,
+ pHddStaCtx->roam_info.roamId,
+ pHddStaCtx->roam_info.roamStatus,
+ eCSR_ROAM_RESULT_AUTHENTICATED);
+ if (halStatus != eHAL_STATUS_SUCCESS)
+ {
+ hddLog(LOGE, "%s: Set Key complete failure", __func__);
+ }
+ pHddStaCtx->roam_info.deferKeyComplete = FALSE;
+}
+
static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
tANI_U32 roamId, eRoamCmdStatus roamStatus,
eCsrRoamResult roamResult )
@@ -1246,6 +1276,21 @@
cfg80211_roamed(dev,chan, pRoamInfo->bssid,
pFTAssocReq, assocReqlen, pFTAssocRsp, assocRsplen,
GFP_KERNEL);
+ if (sme_GetFTPTKState(WLAN_HDD_GET_HAL_CTX(pAdapter)))
+ {
+ sme_SetFTPTKState(WLAN_HDD_GET_HAL_CTX(pAdapter), FALSE);
+ pRoamInfo->fAuthRequired = FALSE;
+
+ vos_mem_copy(pHddStaCtx->roam_info.bssid,
+ pRoamInfo->bssid,
+ HDD_MAC_ADDR_LEN);
+ vos_mem_copy(pHddStaCtx->roam_info.peerMac,
+ pRoamInfo->peerMac,
+ HDD_MAC_ADDR_LEN);
+ pHddStaCtx->roam_info.roamId = roamId;
+ pHddStaCtx->roam_info.roamStatus = roamStatus;
+ pHddStaCtx->roam_info.deferKeyComplete = TRUE;
+ }
}
else
{
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 753ded5..278d455 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -3216,6 +3216,22 @@
hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
+ if (!pairwise)
+#else
+ if (!mac_addr || is_broadcast_ether_addr(mac_addr))
+#endif
+ {
+ /* set group key*/
+ if (pHddStaCtx->roam_info.deferKeyComplete)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s- %d: Perform Set key Complete",
+ __func__, __LINE__);
+ hdd_PerformRoamSetKeyComplete(pAdapter);
+ }
+ }
+
pWextState->roamProfile.Keys.KeyLength[key_index] = (u8)params->key_len;
pWextState->roamProfile.Keys.defaultIndex = key_index;
@@ -3224,6 +3240,7 @@
vos_mem_copy(&pWextState->roamProfile.Keys.KeyMaterial[key_index][0],
params->key, params->key_len);
+
pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_SETTING_KEY;
hddLog(VOS_TRACE_LEVEL_INFO_MED,
@@ -3248,11 +3265,20 @@
}
#ifdef WLAN_FEATURE_VOWIFI_11R
- /* The supplicant may attempt to set the PTK once pre-authentication is done.
- Save the key in the UMAC and include it in the ADD BSS request */
+ /* The supplicant may attempt to set the PTK once pre-authentication
+ is done. Save the key in the UMAC and include it in the ADD BSS
+ request */
halStatus = sme_FTUpdateKey( WLAN_HDD_GET_HAL_CTX(pAdapter), &setKey);
- if( halStatus == eHAL_STATUS_FT_PREAUTH_KEY_WAIT )
+ if ( halStatus == eHAL_STATUS_FT_PREAUTH_KEY_SUCCESS )
{
+ hddLog(VOS_TRACE_LEVEL_INFO_MED,
+ "%s: Update PreAuth Key success", __func__);
+ return 0;
+ }
+ else if ( halStatus == eHAL_STATUS_FT_PREAUTH_KEY_FAILED )
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Update PreAuth Key failed", __func__);
return -EINVAL;
}
#endif /* WLAN_FEATURE_VOWIFI_11R */
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index a02d390..632926b 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -3317,12 +3317,21 @@
("%s:cipher_alg:%d key_len[%d] *pEncryptionType :%d \n"),__func__,(int)ext->alg,(int)ext->key_len,setKey.encType);
#ifdef WLAN_FEATURE_VOWIFI_11R
-/* The supplicant may attempt to set the PTK once pre-authentication is done.
- Save the key in the UMAC and include it in the ADD BSS request */
+ /* The supplicant may attempt to set the PTK once pre-authentication
+ is done. Save the key in the UMAC and include it in the ADD
+ BSS request */
halStatus = sme_FTUpdateKey( WLAN_HDD_GET_HAL_CTX(pAdapter), &setKey);
- if( halStatus == eHAL_STATUS_FT_PREAUTH_KEY_WAIT )
+ if ( halStatus == eHAL_STATUS_FT_PREAUTH_KEY_SUCCESS )
{
- return -EINVAL;
+ hddLog(VOS_TRACE_LEVEL_INFO_MED,
+ "%s: Update PreAuth Key success", __func__);
+ return 0;
+ }
+ else if ( halStatus == eHAL_STATUS_FT_PREAUTH_KEY_FAILED )
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Update PreAuth Key failed", __func__);
+ return -EINVAL;
}
#endif /* WLAN_FEATURE_VOWIFI_11R */