qcacld-3.0: Move CSR preauth related code to a separate file
Move the preauthentication related code in the CSR module into a separate file so that it is easy to maintain across different projects CRs-Fixed: 978905 Change-Id: I56e8441f08dec180f080c305ba5c6541302f107c
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
d318632e76
commit
883c4f20f9
1
Kbuild
1
Kbuild
@@ -500,6 +500,7 @@ SME_INC := -I$(WLAN_ROOT)/$(SME_INC_DIR) \
|
|||||||
-I$(WLAN_ROOT)/$(SME_SRC_DIR)/csr
|
-I$(WLAN_ROOT)/$(SME_SRC_DIR)/csr
|
||||||
|
|
||||||
SME_CSR_OBJS := $(SME_SRC_DIR)/csr/csr_api_roam.o \
|
SME_CSR_OBJS := $(SME_SRC_DIR)/csr/csr_api_roam.o \
|
||||||
|
$(SME_SRC_DIR)/csr/csr_roam_preauth.o \
|
||||||
$(SME_SRC_DIR)/csr/csr_api_scan.o \
|
$(SME_SRC_DIR)/csr/csr_api_scan.o \
|
||||||
$(SME_SRC_DIR)/csr/csr_cmd_process.o \
|
$(SME_SRC_DIR)/csr/csr_cmd_process.o \
|
||||||
$(SME_SRC_DIR)/csr/csr_link_list.o \
|
$(SME_SRC_DIR)/csr/csr_link_list.o \
|
||||||
|
@@ -298,5 +298,27 @@ void csr_roam_synch_callback(tpAniSirGlobal mac,
|
|||||||
void csr_neighbor_roam_state_transition(tpAniSirGlobal mac_ctx,
|
void csr_neighbor_roam_state_transition(tpAniSirGlobal mac_ctx,
|
||||||
uint8_t newstate, uint8_t session);
|
uint8_t newstate, uint8_t session);
|
||||||
uint8_t *csr_neighbor_roam_state_to_string(uint8_t state);
|
uint8_t *csr_neighbor_roam_state_to_string(uint8_t state);
|
||||||
|
tpCsrNeighborRoamBSSInfo csr_neighbor_roam_next_roamable_ap(
|
||||||
|
tpAniSirGlobal mac_ctx, tDblLinkList *llist,
|
||||||
|
tpCsrNeighborRoamBSSInfo neighbor_entry);
|
||||||
|
bool csr_neighbor_roam_remove_roamable_ap_list_entry(tpAniSirGlobal pMac,
|
||||||
|
tDblLinkList *pList, tpCsrNeighborRoamBSSInfo pNeighborEntry);
|
||||||
|
void csr_neighbor_roam_free_neighbor_roam_bss_node(tpAniSirGlobal pMac,
|
||||||
|
tpCsrNeighborRoamBSSInfo neighborRoamBSSNode);
|
||||||
|
QDF_STATUS csr_neighbor_roam_issue_preauth_req(tpAniSirGlobal pMac,
|
||||||
|
uint8_t sessionId);
|
||||||
|
void csr_neighbor_roam_reset_preauth_control_info(
|
||||||
|
tpAniSirGlobal mac_ctx, uint8_t session_id);
|
||||||
|
bool csr_neighbor_roam_is_preauth_candidate(tpAniSirGlobal pMac,
|
||||||
|
uint8_t sessionId, tSirMacAddr bssId);
|
||||||
|
#ifdef FEATURE_WLAN_LFR_METRICS
|
||||||
|
void csr_neighbor_roam_send_lfr_metric_event(tpAniSirGlobal mac_ctx,
|
||||||
|
uint8_t session_id, tSirMacAddr bssid, eRoamCmdStatus status);
|
||||||
|
#else
|
||||||
|
static inline void csr_neighbor_roam_send_lfr_metric_event(
|
||||||
|
tpAniSirGlobal mac_ctx, uint8_t session_id,
|
||||||
|
tSirMacAddr bssid, eRoamCmdStatus status)
|
||||||
|
{}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* CSR_NEIGHBOR_ROAM_H */
|
#endif /* CSR_NEIGHBOR_ROAM_H */
|
||||||
|
@@ -280,7 +280,6 @@ static QDF_STATUS csr_roam_get_qos_info_from_bss(tpAniSirGlobal pMac,
|
|||||||
void csr_roam_reissue_roam_command(tpAniSirGlobal pMac);
|
void csr_roam_reissue_roam_command(tpAniSirGlobal pMac);
|
||||||
static void csr_ser_des_unpack_diassoc_rsp(uint8_t *pBuf,
|
static void csr_ser_des_unpack_diassoc_rsp(uint8_t *pBuf,
|
||||||
tSirSmeDisassocRsp *pRsp);
|
tSirSmeDisassocRsp *pRsp);
|
||||||
void csr_reinit_preauth_cmd(tpAniSirGlobal pMac, tSmeCmd *pCommand);
|
|
||||||
void csr_init_operating_classes(tHalHandle hHal);
|
void csr_init_operating_classes(tHalHandle hHal);
|
||||||
|
|
||||||
/* Initialize global variables */
|
/* Initialize global variables */
|
||||||
@@ -1089,12 +1088,6 @@ static QDF_STATUS csr_roam_free_connected_info(tpAniSirGlobal pMac,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void csr_release_command_preauth(tpAniSirGlobal pMac, tSmeCmd *pCommand)
|
|
||||||
{
|
|
||||||
csr_reinit_preauth_cmd(pMac, pCommand);
|
|
||||||
csr_release_command(pMac, pCommand);
|
|
||||||
}
|
|
||||||
|
|
||||||
void csr_release_command_roam(tpAniSirGlobal pMac, tSmeCmd *pCommand)
|
void csr_release_command_roam(tpAniSirGlobal pMac, tSmeCmd *pCommand)
|
||||||
{
|
{
|
||||||
csr_reinit_roam_cmd(pMac, pCommand);
|
csr_reinit_roam_cmd(pMac, pCommand);
|
||||||
@@ -5508,14 +5501,6 @@ QDF_STATUS csr_roam_process_command(tpAniSirGlobal pMac, tSmeCmd *pCommand)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void csr_reinit_preauth_cmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
|
|
||||||
{
|
|
||||||
pCommand->u.roamCmd.pLastRoamBss = NULL;
|
|
||||||
pCommand->u.roamCmd.pRoamBssEntry = NULL;
|
|
||||||
/* Because u.roamCmd is union and share with scanCmd and StatusChange */
|
|
||||||
qdf_mem_set(&pCommand->u.roamCmd, sizeof(tRoamCmd), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void csr_reinit_roam_cmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
|
void csr_reinit_roam_cmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
|
||||||
{
|
{
|
||||||
if (pCommand->u.roamCmd.fReleaseBssList) {
|
if (pCommand->u.roamCmd.fReleaseBssList) {
|
||||||
@@ -7323,42 +7308,6 @@ QDF_STATUS csr_roam_issue_reassoc(tpAniSirGlobal pMac, uint32_t sessionId,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDF_STATUS csr_roam_enqueue_preauth(tpAniSirGlobal pMac, uint32_t sessionId,
|
|
||||||
tpSirBssDescription pBssDescription,
|
|
||||||
eCsrRoamReason reason, bool fImmediate)
|
|
||||||
{
|
|
||||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
||||||
tSmeCmd *pCommand;
|
|
||||||
|
|
||||||
pCommand = csr_get_command_buffer(pMac);
|
|
||||||
if (NULL == pCommand) {
|
|
||||||
sms_log(pMac, LOGE, FL(" fail to get command buffer"));
|
|
||||||
status = QDF_STATUS_E_RESOURCES;
|
|
||||||
} else {
|
|
||||||
if (pBssDescription) {
|
|
||||||
/* copy over the parameters we need later */
|
|
||||||
pCommand->command = eSmeCommandRoam;
|
|
||||||
pCommand->sessionId = (uint8_t) sessionId;
|
|
||||||
pCommand->u.roamCmd.roamReason = reason;
|
|
||||||
/* this is the important parameter */
|
|
||||||
/* in this case we are using this field for the "next" BSS */
|
|
||||||
pCommand->u.roamCmd.pLastRoamBss = pBssDescription;
|
|
||||||
status = csr_queue_sme_command(pMac, pCommand, fImmediate);
|
|
||||||
if (!QDF_IS_STATUS_SUCCESS(status)) {
|
|
||||||
sms_log(pMac, LOGE,
|
|
||||||
FL
|
|
||||||
(" fail to enqueue preauth command, status = %d"),
|
|
||||||
status);
|
|
||||||
csr_release_command_preauth(pMac, pCommand);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* Return failure */
|
|
||||||
status = QDF_STATUS_E_RESOURCES;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
QDF_STATUS csr_dequeue_roam_command(tpAniSirGlobal pMac, eCsrRoamReason reason)
|
QDF_STATUS csr_dequeue_roam_command(tpAniSirGlobal pMac, eCsrRoamReason reason)
|
||||||
{
|
{
|
||||||
tListElem *pEntry;
|
tListElem *pEntry;
|
||||||
@@ -17743,213 +17692,6 @@ QDF_STATUS csr_roam_update_wparsni_es(tpAniSirGlobal pMac, uint32_t sessionId,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDF_STATUS
|
|
||||||
csr_roam_issue_ft_preauth_req(tHalHandle hHal, uint32_t sessionId,
|
|
||||||
tpSirBssDescription pBssDescription)
|
|
||||||
{
|
|
||||||
tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
|
|
||||||
tpSirFTPreAuthReq pftPreAuthReq;
|
|
||||||
uint16_t auth_req_len = 0;
|
|
||||||
tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
|
|
||||||
|
|
||||||
if (NULL == pSession) {
|
|
||||||
sms_log(pMac, LOGE,
|
|
||||||
FL("Session does not exist for session id(%d)"),
|
|
||||||
sessionId);
|
|
||||||
return QDF_STATUS_E_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
auth_req_len = sizeof(tSirFTPreAuthReq);
|
|
||||||
pftPreAuthReq = (tpSirFTPreAuthReq) qdf_mem_malloc(auth_req_len);
|
|
||||||
if (NULL == pftPreAuthReq) {
|
|
||||||
sms_log(pMac, LOGE,
|
|
||||||
FL("Memory allocation for FT Preauth request failed"));
|
|
||||||
return QDF_STATUS_E_NOMEM;
|
|
||||||
}
|
|
||||||
/* Save the SME Session ID here. We need it while processing the preauth response */
|
|
||||||
pSession->ftSmeContext.smeSessionId = sessionId;
|
|
||||||
qdf_mem_zero(pftPreAuthReq, auth_req_len);
|
|
||||||
|
|
||||||
pftPreAuthReq->pbssDescription =
|
|
||||||
(tpSirBssDescription) qdf_mem_malloc(sizeof(pBssDescription->length)
|
|
||||||
+ pBssDescription->length);
|
|
||||||
if (NULL == pftPreAuthReq->pbssDescription) {
|
|
||||||
sms_log(pMac, LOGE,
|
|
||||||
FL("Memory allocation for FT Preauth request failed"));
|
|
||||||
return QDF_STATUS_E_NOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
pftPreAuthReq->messageType = eWNI_SME_FT_PRE_AUTH_REQ;
|
|
||||||
|
|
||||||
pftPreAuthReq->preAuthchannelNum = pBssDescription->channelId;
|
|
||||||
|
|
||||||
qdf_mem_copy((void *)&pftPreAuthReq->currbssId,
|
|
||||||
(void *)pSession->connectedProfile.bssid.bytes,
|
|
||||||
sizeof(tSirMacAddr));
|
|
||||||
qdf_mem_copy((void *)&pftPreAuthReq->preAuthbssId,
|
|
||||||
(void *)pBssDescription->bssId, sizeof(tSirMacAddr));
|
|
||||||
qdf_mem_copy((void *)&pftPreAuthReq->self_mac_addr,
|
|
||||||
(void *)&pSession->selfMacAddr.bytes, sizeof(tSirMacAddr));
|
|
||||||
|
|
||||||
if (csr_roam_is11r_assoc(pMac, sessionId) &&
|
|
||||||
(pMac->roam.roamSession[sessionId].connectedProfile.AuthType !=
|
|
||||||
eCSR_AUTH_TYPE_OPEN_SYSTEM)) {
|
|
||||||
pftPreAuthReq->ft_ies_length =
|
|
||||||
(uint16_t) pSession->ftSmeContext.auth_ft_ies_length;
|
|
||||||
qdf_mem_copy(pftPreAuthReq->ft_ies,
|
|
||||||
pSession->ftSmeContext.auth_ft_ies,
|
|
||||||
pSession->ftSmeContext.auth_ft_ies_length);
|
|
||||||
} else {
|
|
||||||
pftPreAuthReq->ft_ies_length = 0;
|
|
||||||
}
|
|
||||||
qdf_mem_copy(pftPreAuthReq->pbssDescription, pBssDescription,
|
|
||||||
sizeof(pBssDescription->length) + pBssDescription->length);
|
|
||||||
pftPreAuthReq->length = auth_req_len;
|
|
||||||
return cds_send_mb_message_to_mac(pftPreAuthReq);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------
|
|
||||||
* This will receive and process the FT Pre Auth Rsp from the current
|
|
||||||
* associated ap.
|
|
||||||
*
|
|
||||||
* This will invoke the hdd call back. This is so that hdd can now
|
|
||||||
* send the FTIEs from the Auth Rsp (Auth Seq 2) to the supplicant.
|
|
||||||
------------------------------------------------------------------------*/
|
|
||||||
void csr_roam_ft_pre_auth_rsp_processor(tHalHandle hHal,
|
|
||||||
tpSirFTPreAuthRsp pFTPreAuthRsp)
|
|
||||||
{
|
|
||||||
tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
|
|
||||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
||||||
tCsrRoamInfo roamInfo;
|
|
||||||
eCsrAuthType conn_Auth_type;
|
|
||||||
uint32_t sessionId = pFTPreAuthRsp->smeSessionId;
|
|
||||||
tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
|
|
||||||
|
|
||||||
if (NULL == pSession) {
|
|
||||||
sms_log(pMac, LOGE, FL("pSession is NULL"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
status = csr_neighbor_roam_preauth_rsp_handler(pMac,
|
|
||||||
pFTPreAuthRsp->smeSessionId,
|
|
||||||
pFTPreAuthRsp->status);
|
|
||||||
if (status != QDF_STATUS_SUCCESS) {
|
|
||||||
/*
|
|
||||||
* Bail out if pre-auth was not even processed.
|
|
||||||
*/
|
|
||||||
sms_log(pMac, LOGE,
|
|
||||||
FL("Preauth was not processed: %d SessionID: %d"),
|
|
||||||
status, sessionId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The below function calls/timers should be invoked only if the pre-auth is successful */
|
|
||||||
if (QDF_STATUS_SUCCESS != (QDF_STATUS) pFTPreAuthRsp->status)
|
|
||||||
return;
|
|
||||||
/* Implies a success */
|
|
||||||
pSession->ftSmeContext.FTState = eFT_AUTH_COMPLETE;
|
|
||||||
/* Indicate SME QoS module the completion of Preauth success. This will trigger the creation of RIC IEs */
|
|
||||||
pSession->ftSmeContext.psavedFTPreAuthRsp = pFTPreAuthRsp;
|
|
||||||
/* No need to notify qos module if this is a non 11r & ESE roam */
|
|
||||||
if (csr_roam_is11r_assoc(pMac, pFTPreAuthRsp->smeSessionId)
|
|
||||||
#ifdef FEATURE_WLAN_ESE
|
|
||||||
|| csr_roam_is_ese_assoc(pMac, pFTPreAuthRsp->smeSessionId)
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
sme_qos_csr_event_ind(pMac,
|
|
||||||
pSession->ftSmeContext.smeSessionId,
|
|
||||||
SME_QOS_CSR_PREAUTH_SUCCESS_IND, NULL);
|
|
||||||
}
|
|
||||||
/* Start the pre-auth reassoc interval timer with a period of 400ms. When this expires,
|
|
||||||
* actual transition from the current to handoff AP is triggered */
|
|
||||||
status =
|
|
||||||
qdf_mc_timer_start(&pSession->ftSmeContext.preAuthReassocIntvlTimer,
|
|
||||||
60);
|
|
||||||
if (QDF_STATUS_SUCCESS != status) {
|
|
||||||
sms_log(pMac, LOGE,
|
|
||||||
FL
|
|
||||||
("Preauth reassoc interval timer start failed to start with status %d"),
|
|
||||||
status);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* Save the received response */
|
|
||||||
qdf_mem_copy((void *)&pSession->ftSmeContext.preAuthbssId,
|
|
||||||
(void *)pFTPreAuthRsp->preAuthbssId, sizeof(struct qdf_mac_addr));
|
|
||||||
if (csr_roam_is11r_assoc(pMac, pFTPreAuthRsp->smeSessionId))
|
|
||||||
csr_roam_call_callback(pMac, pFTPreAuthRsp->smeSessionId, NULL, 0,
|
|
||||||
eCSR_ROAM_FT_RESPONSE,
|
|
||||||
eCSR_ROAM_RESULT_NONE);
|
|
||||||
|
|
||||||
#ifdef FEATURE_WLAN_ESE
|
|
||||||
if (csr_roam_is_ese_assoc(pMac, pFTPreAuthRsp->smeSessionId)) {
|
|
||||||
/* read TSF */
|
|
||||||
csr_roam_read_tsf(pMac, (uint8_t *) roamInfo.timestamp,
|
|
||||||
pFTPreAuthRsp->smeSessionId);
|
|
||||||
/* Save the bssid from the received response */
|
|
||||||
qdf_mem_copy((void *)&roamInfo.bssid,
|
|
||||||
(void *)pFTPreAuthRsp->preAuthbssId,
|
|
||||||
sizeof(struct qdf_mac_addr));
|
|
||||||
csr_roam_call_callback(pMac, pFTPreAuthRsp->smeSessionId,
|
|
||||||
&roamInfo, 0, eCSR_ROAM_CCKM_PREAUTH_NOTIFY,
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
#endif /* FEATURE_WLAN_ESE */
|
|
||||||
|
|
||||||
/* If Legacy Fast Roaming is enabled, signal the supplicant */
|
|
||||||
/* So he can send us a PMK-ID for this candidate AP. */
|
|
||||||
if (csr_roam_is_fast_roam_enabled(pMac, pFTPreAuthRsp->smeSessionId)) {
|
|
||||||
/* Save the bssid from the received response */
|
|
||||||
qdf_mem_copy((void *)&roamInfo.bssid,
|
|
||||||
(void *)pFTPreAuthRsp->preAuthbssId,
|
|
||||||
sizeof(struct qdf_mac_addr));
|
|
||||||
csr_roam_call_callback(pMac, pFTPreAuthRsp->smeSessionId,
|
|
||||||
&roamInfo, 0, eCSR_ROAM_PMK_NOTIFY, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If its an Open Auth, FT IEs are not provided by supplicant */
|
|
||||||
/* Hence populate them here */
|
|
||||||
conn_Auth_type =
|
|
||||||
pMac->roam.roamSession[sessionId].connectedProfile.AuthType;
|
|
||||||
|
|
||||||
pSession->ftSmeContext.addMDIE = false;
|
|
||||||
|
|
||||||
/* Done with it, init it. */
|
|
||||||
pSession->ftSmeContext.psavedFTPreAuthRsp = NULL;
|
|
||||||
|
|
||||||
if (csr_roam_is11r_assoc(pMac, pFTPreAuthRsp->smeSessionId) &&
|
|
||||||
(conn_Auth_type == eCSR_AUTH_TYPE_OPEN_SYSTEM)) {
|
|
||||||
uint16_t ft_ies_length;
|
|
||||||
ft_ies_length = pFTPreAuthRsp->ric_ies_length;
|
|
||||||
|
|
||||||
if ((pSession->ftSmeContext.reassoc_ft_ies) &&
|
|
||||||
(pSession->ftSmeContext.reassoc_ft_ies_length)) {
|
|
||||||
qdf_mem_free(pSession->ftSmeContext.reassoc_ft_ies);
|
|
||||||
pSession->ftSmeContext.reassoc_ft_ies_length = 0;
|
|
||||||
pSession->ftSmeContext.reassoc_ft_ies = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ft_ies_length)
|
|
||||||
return;
|
|
||||||
|
|
||||||
pSession->ftSmeContext.reassoc_ft_ies =
|
|
||||||
qdf_mem_malloc(ft_ies_length);
|
|
||||||
if (NULL == pSession->ftSmeContext.reassoc_ft_ies) {
|
|
||||||
sms_log(pMac, LOGE,
|
|
||||||
FL("Memory allocation failed for ft_ies"));
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
/* Copy the RIC IEs to reassoc IEs */
|
|
||||||
qdf_mem_copy(((uint8_t *) pSession->ftSmeContext.
|
|
||||||
reassoc_ft_ies),
|
|
||||||
(uint8_t *) pFTPreAuthRsp->ric_ies,
|
|
||||||
pFTPreAuthRsp->ric_ies_length);
|
|
||||||
pSession->ftSmeContext.reassoc_ft_ies_length =
|
|
||||||
ft_ies_length;
|
|
||||||
pSession->ftSmeContext.addMDIE = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
pBuf points to the beginning of the message
|
pBuf points to the beginning of the message
|
||||||
LIM packs disassoc rsp as below,
|
LIM packs disassoc rsp as below,
|
||||||
|
@@ -1058,3 +1058,4 @@ bool is_disconnect_pending(tpAniSirGlobal mac_ctx,
|
|||||||
void csr_scan_active_list_timeout_handle(void *userData);
|
void csr_scan_active_list_timeout_handle(void *userData);
|
||||||
QDF_STATUS csr_prepare_disconnect_command(tpAniSirGlobal mac,
|
QDF_STATUS csr_prepare_disconnect_command(tpAniSirGlobal mac,
|
||||||
uint32_t session_id, tSmeCmd **sme_cmd);
|
uint32_t session_id, tSmeCmd **sme_cmd);
|
||||||
|
void csr_release_command_preauth(tpAniSirGlobal mac_ctx, tSmeCmd *command);
|
||||||
|
@@ -52,15 +52,10 @@
|
|||||||
|
|
||||||
static void csr_neighbor_roam_reset_channel_info(tpCsrNeighborRoamChannelInfo
|
static void csr_neighbor_roam_reset_channel_info(tpCsrNeighborRoamChannelInfo
|
||||||
rChInfo);
|
rChInfo);
|
||||||
static void csr_neighbor_roam_reset_preauth_control_info(tpAniSirGlobal pMac,
|
|
||||||
uint8_t sessionId);
|
|
||||||
|
|
||||||
QDF_STATUS csr_roam_copy_connected_profile(tpAniSirGlobal pMac, uint32_t sessionId,
|
QDF_STATUS csr_roam_copy_connected_profile(tpAniSirGlobal pMac, uint32_t sessionId,
|
||||||
tCsrRoamProfile *pDstProfile);
|
tCsrRoamProfile *pDstProfile);
|
||||||
|
|
||||||
static QDF_STATUS csr_neighbor_roam_issue_preauth_req(tpAniSirGlobal pMac,
|
|
||||||
uint8_t sessionId);
|
|
||||||
|
|
||||||
void csr_neighbor_roam_state_transition(tpAniSirGlobal mac_ctx,
|
void csr_neighbor_roam_state_transition(tpAniSirGlobal mac_ctx,
|
||||||
uint8_t newstate, uint8_t session)
|
uint8_t newstate, uint8_t session)
|
||||||
{
|
{
|
||||||
@@ -103,7 +98,7 @@ uint8_t *csr_neighbor_roam_state_to_string(uint8_t state)
|
|||||||
* Return: void
|
* Return: void
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void csr_neighbor_roam_send_lfr_metric_event(
|
void csr_neighbor_roam_send_lfr_metric_event(
|
||||||
tpAniSirGlobal mac_ctx,
|
tpAniSirGlobal mac_ctx,
|
||||||
uint8_t session_id,
|
uint8_t session_id,
|
||||||
tSirMacAddr bssid,
|
tSirMacAddr bssid,
|
||||||
@@ -122,16 +117,6 @@ static void csr_neighbor_roam_send_lfr_metric_event(
|
|||||||
qdf_mem_free(roam_info);
|
qdf_mem_free(roam_info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
/* Empty inline function will be a no-op */
|
|
||||||
static inline void csr_neighbor_roam_send_lfr_metric_event(
|
|
||||||
tpAniSirGlobal mac_ctx,
|
|
||||||
uint8_t session_id,
|
|
||||||
tSirMacAddr bssid,
|
|
||||||
eRoamCmdStatus status)
|
|
||||||
{
|
|
||||||
;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -633,30 +618,6 @@ static void csr_neighbor_roam_reset_channel_info(tpCsrNeighborRoamChannelInfo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void csr_neighbor_roam_reset_preauth_control_info(tpAniSirGlobal pMac,
|
|
||||||
uint8_t sessionId)
|
|
||||||
{
|
|
||||||
tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
|
|
||||||
&pMac->roam.neighborRoamInfo[sessionId];
|
|
||||||
|
|
||||||
pNeighborRoamInfo->is11rAssoc = false;
|
|
||||||
/* Purge pre-auth fail list */
|
|
||||||
csr_neighbor_roam_purge_preauth_failed_list(pMac);
|
|
||||||
|
|
||||||
pNeighborRoamInfo->FTRoamInfo.preauthRspPending = false;
|
|
||||||
pNeighborRoamInfo->FTRoamInfo.numPreAuthRetries = 0;
|
|
||||||
/* Do not free up the preauth done list here */
|
|
||||||
pNeighborRoamInfo->FTRoamInfo.currentNeighborRptRetryNum = 0;
|
|
||||||
pNeighborRoamInfo->FTRoamInfo.neighborRptPending = false;
|
|
||||||
pNeighborRoamInfo->FTRoamInfo.numBssFromNeighborReport = 0;
|
|
||||||
qdf_mem_zero(pNeighborRoamInfo->FTRoamInfo.neighboReportBssInfo,
|
|
||||||
sizeof(tCsrNeighborReportBssInfo) *
|
|
||||||
MAX_BSS_IN_NEIGHBOR_RPT);
|
|
||||||
pNeighborRoamInfo->uOsRequestedHandoff = 0;
|
|
||||||
qdf_mem_zero(&pNeighborRoamInfo->handoffReqInfo,
|
|
||||||
sizeof(tCsrHandoffRequest));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* csr_neighbor_roam_reset_connected_state_control_info()
|
* csr_neighbor_roam_reset_connected_state_control_info()
|
||||||
*
|
*
|
||||||
@@ -734,384 +695,6 @@ void csr_neighbor_roam_reset_init_state_control_info(tpAniSirGlobal pMac,
|
|||||||
csr_neighbor_roam_reset_report_scan_state_control_info(pMac, sessionId);
|
csr_neighbor_roam_reset_report_scan_state_control_info(pMac, sessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
\fn csr_neighbor_roam_purge_preauth_fail_list
|
|
||||||
|
|
||||||
\brief This function empties the preauth fail list
|
|
||||||
|
|
||||||
\param pMac - The handle returned by mac_open.
|
|
||||||
|
|
||||||
\return VOID
|
|
||||||
|
|
||||||
---------------------------------------------------------------------------*/
|
|
||||||
void csr_neighbor_roam_purge_preauth_fail_list(tpAniSirGlobal pMac)
|
|
||||||
{
|
|
||||||
uint8_t i;
|
|
||||||
tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
|
|
||||||
|
|
||||||
NEIGHBOR_ROAM_DEBUG(pMac, LOGE, FL("Purging the preauth fail list"));
|
|
||||||
for (i = 0; i < CSR_ROAM_SESSION_MAX; i++) {
|
|
||||||
pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[i];
|
|
||||||
while (pNeighborRoamInfo->FTRoamInfo.preAuthFailList.
|
|
||||||
numMACAddress) {
|
|
||||||
qdf_mem_zero(pNeighborRoamInfo->FTRoamInfo.
|
|
||||||
preAuthFailList.
|
|
||||||
macAddress[pNeighborRoamInfo->FTRoamInfo.
|
|
||||||
preAuthFailList.numMACAddress -
|
|
||||||
1], sizeof(tSirMacAddr));
|
|
||||||
pNeighborRoamInfo->FTRoamInfo.preAuthFailList.
|
|
||||||
numMACAddress--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* csr_neighbor_roam_add_preauth_fail() - add bssid to preauth failed list
|
|
||||||
* @mac_ctx: The handle returned by mac_open.
|
|
||||||
* @bssid: BSSID to be added to the preauth fail list
|
|
||||||
*
|
|
||||||
* This function adds the given BSSID to the Preauth fail list
|
|
||||||
*
|
|
||||||
* Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE otherwise
|
|
||||||
*/
|
|
||||||
QDF_STATUS csr_neighbor_roam_add_preauth_fail(tpAniSirGlobal mac_ctx,
|
|
||||||
uint8_t session_id,
|
|
||||||
tSirMacAddr bssid)
|
|
||||||
{
|
|
||||||
uint8_t i = 0;
|
|
||||||
tpCsrNeighborRoamControlInfo neighbor_roam_info =
|
|
||||||
&mac_ctx->roam.neighborRoamInfo[session_id];
|
|
||||||
uint8_t num_mac_addr = neighbor_roam_info->FTRoamInfo.preAuthFailList.
|
|
||||||
numMACAddress;
|
|
||||||
|
|
||||||
NEIGHBOR_ROAM_DEBUG(mac_ctx, LOGE,
|
|
||||||
FL(" Added BSSID " MAC_ADDRESS_STR " to Preauth failed list"),
|
|
||||||
MAC_ADDR_ARRAY(bssid));
|
|
||||||
|
|
||||||
for (i = 0;
|
|
||||||
i < neighbor_roam_info->FTRoamInfo.preAuthFailList.numMACAddress;
|
|
||||||
i++) {
|
|
||||||
if (true != qdf_mem_cmp(
|
|
||||||
neighbor_roam_info->FTRoamInfo.preAuthFailList.macAddress[i],
|
|
||||||
bssid, sizeof(tSirMacAddr))) {
|
|
||||||
sms_log(mac_ctx, LOGW, FL("BSSID "MAC_ADDRESS_STR" already present in preauth fail list"),
|
|
||||||
MAC_ADDR_ARRAY(bssid));
|
|
||||||
return QDF_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((num_mac_addr + 1) > MAX_NUM_PREAUTH_FAIL_LIST_ADDRESS) {
|
|
||||||
sms_log(mac_ctx, LOGE,
|
|
||||||
FL("Cannot add, preauth fail list is full."));
|
|
||||||
return QDF_STATUS_E_FAILURE;
|
|
||||||
}
|
|
||||||
qdf_mem_copy(neighbor_roam_info->FTRoamInfo.preAuthFailList.
|
|
||||||
macAddress[num_mac_addr], bssid, sizeof(tSirMacAddr));
|
|
||||||
neighbor_roam_info->FTRoamInfo.preAuthFailList.numMACAddress++;
|
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* csr_neighbor_roam_is_preauth_candidate()
|
|
||||||
*
|
|
||||||
* @mac_ctx: Pointer to Global MAC structure
|
|
||||||
* @bssId : BSSID of the candidate
|
|
||||||
*
|
|
||||||
* This function checks whether the given MAC address is already present
|
|
||||||
* in the preauth fail list and returns true/false accordingly
|
|
||||||
*
|
|
||||||
* Return: true if preauth candidate, false otherwise
|
|
||||||
*/
|
|
||||||
bool csr_neighbor_roam_is_preauth_candidate(tpAniSirGlobal pMac,
|
|
||||||
uint8_t sessionId, tSirMacAddr bssId)
|
|
||||||
{
|
|
||||||
uint8_t i = 0;
|
|
||||||
tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
|
|
||||||
&pMac->roam.neighborRoamInfo[sessionId];
|
|
||||||
|
|
||||||
if (csr_roam_is_roam_offload_scan_enabled(pMac)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (0 == pNeighborRoamInfo->FTRoamInfo.preAuthFailList.numMACAddress)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
for (i = 0;
|
|
||||||
i < pNeighborRoamInfo->FTRoamInfo.preAuthFailList.numMACAddress;
|
|
||||||
i++) {
|
|
||||||
if (true !=
|
|
||||||
qdf_mem_cmp(pNeighborRoamInfo->FTRoamInfo.
|
|
||||||
preAuthFailList.macAddress[i], bssId,
|
|
||||||
sizeof(tSirMacAddr))) {
|
|
||||||
NEIGHBOR_ROAM_DEBUG(pMac, LOGE,
|
|
||||||
FL("BSSID " MAC_ADDRESS_STR
|
|
||||||
" already present in preauth fail list"),
|
|
||||||
MAC_ADDR_ARRAY(bssId));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* csr_neighbor_roam_issue_preauth_req() - Send preauth request to first AP
|
|
||||||
* @mac_ctx: The handle returned by mac_open.
|
|
||||||
* @session_id: Session information
|
|
||||||
*
|
|
||||||
* This function issues preauth request to PE with the 1st AP entry in the
|
|
||||||
* roamable AP list
|
|
||||||
*
|
|
||||||
* Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE otherwise
|
|
||||||
*/
|
|
||||||
static QDF_STATUS csr_neighbor_roam_issue_preauth_req(tpAniSirGlobal mac_ctx,
|
|
||||||
uint8_t session_id)
|
|
||||||
{
|
|
||||||
tpCsrNeighborRoamControlInfo neighbor_roam_info =
|
|
||||||
&mac_ctx->roam.neighborRoamInfo[session_id];
|
|
||||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
||||||
tpCsrNeighborRoamBSSInfo neighbor_bss_node;
|
|
||||||
|
|
||||||
|
|
||||||
if (false != neighbor_roam_info->FTRoamInfo.preauthRspPending) {
|
|
||||||
/* This must not be true here */
|
|
||||||
QDF_ASSERT(neighbor_roam_info->FTRoamInfo.preauthRspPending ==
|
|
||||||
false);
|
|
||||||
return QDF_STATUS_E_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Issue Preauth request to PE here.
|
|
||||||
* Need to issue the preauth request with the BSSID that is in the
|
|
||||||
* head of the roamable AP list. Parameters that should be passed are
|
|
||||||
* BSSID, Channel number and the neighborScanPeriod(probably). If
|
|
||||||
* roamableAPList gets empty, should transition to REPORT_SCAN state
|
|
||||||
*/
|
|
||||||
neighbor_bss_node = csr_neighbor_roam_next_roamable_ap(mac_ctx,
|
|
||||||
&neighbor_roam_info->roamableAPList, NULL);
|
|
||||||
|
|
||||||
if (NULL == neighbor_bss_node) {
|
|
||||||
sms_log(mac_ctx, LOGW, FL("Roamable AP list is empty.. "));
|
|
||||||
return QDF_STATUS_E_FAILURE;
|
|
||||||
} else {
|
|
||||||
csr_neighbor_roam_send_lfr_metric_event(mac_ctx, session_id,
|
|
||||||
neighbor_bss_node->pBssDescription->bssId,
|
|
||||||
eCSR_ROAM_PREAUTH_INIT_NOTIFY);
|
|
||||||
status = csr_roam_enqueue_preauth(mac_ctx, session_id,
|
|
||||||
neighbor_bss_node->pBssDescription,
|
|
||||||
eCsrPerformPreauth, true);
|
|
||||||
|
|
||||||
sms_log(mac_ctx, LOG1,
|
|
||||||
FL("Before Pre-Auth: BSSID " MAC_ADDRESS_STR ", Ch:%d"),
|
|
||||||
MAC_ADDR_ARRAY(
|
|
||||||
neighbor_bss_node->pBssDescription->bssId),
|
|
||||||
(int)neighbor_bss_node->pBssDescription->channelId);
|
|
||||||
|
|
||||||
if (QDF_STATUS_SUCCESS != status) {
|
|
||||||
sms_log(mac_ctx, LOGE,
|
|
||||||
FL("Return failed preauth request status %d"),
|
|
||||||
status);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
neighbor_roam_info->FTRoamInfo.preauthRspPending = true;
|
|
||||||
|
|
||||||
/* Increment the preauth retry count */
|
|
||||||
neighbor_roam_info->FTRoamInfo.numPreAuthRetries++;
|
|
||||||
|
|
||||||
/* Transition the state to preauthenticating */
|
|
||||||
csr_neighbor_roam_state_transition(mac_ctx,
|
|
||||||
eCSR_NEIGHBOR_ROAM_STATE_PREAUTHENTICATING, session_id);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* csr_neighbor_roam_preauth_rsp_handler() - handle preauth response
|
|
||||||
* @mac_ctx: The handle returned by mac_open.
|
|
||||||
* @session_id: SME session
|
|
||||||
* @lim_status: eSIR_SUCCESS/eSIR_FAILURE/eSIR_LIM_MAX_STA_REACHED_ERROR/
|
|
||||||
* eSIT_LIM_AUTH_RSP_TIMEOUT status from PE
|
|
||||||
*
|
|
||||||
* This function handle the Preauth response from PE
|
|
||||||
* Every preauth is allowed max 3 tries if it fails. If a bssid failed
|
|
||||||
* for more than MAX_TRIES, we will remove it from the list and try
|
|
||||||
* with the next node in the roamable AP list and add the BSSID to
|
|
||||||
* pre-auth failed list. If no more entries present in roamable AP list,
|
|
||||||
* transition to REPORT_SCAN state.
|
|
||||||
*
|
|
||||||
* Return: QDF_STATUS_SUCCESS on success (i.e. pre-auth processed),
|
|
||||||
* QDF_STATUS_E_FAILURE otherwise
|
|
||||||
*/
|
|
||||||
QDF_STATUS csr_neighbor_roam_preauth_rsp_handler(tpAniSirGlobal mac_ctx,
|
|
||||||
uint8_t session_id,
|
|
||||||
tSirRetStatus lim_status)
|
|
||||||
{
|
|
||||||
tpCsrNeighborRoamControlInfo neighbor_roam_info =
|
|
||||||
&mac_ctx->roam.neighborRoamInfo[session_id];
|
|
||||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
||||||
QDF_STATUS preauth_processed = QDF_STATUS_SUCCESS;
|
|
||||||
tpCsrNeighborRoamBSSInfo preauth_rsp_node = NULL;
|
|
||||||
|
|
||||||
if (false == neighbor_roam_info->FTRoamInfo.preauthRspPending) {
|
|
||||||
/*
|
|
||||||
* This can happen when we disconnect immediately
|
|
||||||
* after sending a pre-auth request. During processing
|
|
||||||
* of the disconnect command, we would have reset
|
|
||||||
* preauthRspPending and transitioned to INIT state.
|
|
||||||
*/
|
|
||||||
NEIGHBOR_ROAM_DEBUG(mac_ctx, LOGW,
|
|
||||||
FL("Unexpected pre-auth response in state %d"),
|
|
||||||
neighbor_roam_info->neighborRoamState);
|
|
||||||
preauth_processed = QDF_STATUS_E_FAILURE;
|
|
||||||
goto DEQ_PREAUTH;
|
|
||||||
}
|
|
||||||
/* We can receive it in these 2 states. */
|
|
||||||
if ((neighbor_roam_info->neighborRoamState !=
|
|
||||||
eCSR_NEIGHBOR_ROAM_STATE_PREAUTHENTICATING)) {
|
|
||||||
NEIGHBOR_ROAM_DEBUG(mac_ctx, LOGW,
|
|
||||||
FL("Preauth response received in state %s"),
|
|
||||||
mac_trace_get_neighbour_roam_state
|
|
||||||
(neighbor_roam_info->neighborRoamState));
|
|
||||||
preauth_processed = QDF_STATUS_E_FAILURE;
|
|
||||||
goto DEQ_PREAUTH;
|
|
||||||
}
|
|
||||||
|
|
||||||
neighbor_roam_info->FTRoamInfo.preauthRspPending = false;
|
|
||||||
|
|
||||||
if (eSIR_SUCCESS == lim_status)
|
|
||||||
preauth_rsp_node =
|
|
||||||
csr_neighbor_roam_next_roamable_ap(
|
|
||||||
mac_ctx,
|
|
||||||
&neighbor_roam_info->roamableAPList,
|
|
||||||
NULL);
|
|
||||||
if ((eSIR_SUCCESS == lim_status) && (NULL != preauth_rsp_node)) {
|
|
||||||
NEIGHBOR_ROAM_DEBUG(mac_ctx, LOG1,
|
|
||||||
FL("Preauth completed successfully after %d tries"),
|
|
||||||
neighbor_roam_info->FTRoamInfo.numPreAuthRetries);
|
|
||||||
sms_log(mac_ctx, LOG1,
|
|
||||||
FL("After Pre-Auth: BSSID " MAC_ADDRESS_STR ", Ch:%d"),
|
|
||||||
MAC_ADDR_ARRAY(
|
|
||||||
preauth_rsp_node->pBssDescription->bssId),
|
|
||||||
(int)preauth_rsp_node->pBssDescription->channelId);
|
|
||||||
|
|
||||||
csr_neighbor_roam_send_lfr_metric_event(mac_ctx, session_id,
|
|
||||||
preauth_rsp_node->pBssDescription->bssId,
|
|
||||||
eCSR_ROAM_PREAUTH_STATUS_SUCCESS);
|
|
||||||
/*
|
|
||||||
* Preauth completed successfully. Insert the preauthenticated
|
|
||||||
* node to tail of preAuthDoneList.
|
|
||||||
*/
|
|
||||||
csr_neighbor_roam_remove_roamable_ap_list_entry(mac_ctx,
|
|
||||||
&neighbor_roam_info->roamableAPList,
|
|
||||||
preauth_rsp_node);
|
|
||||||
csr_ll_insert_tail(
|
|
||||||
&neighbor_roam_info->FTRoamInfo.preAuthDoneList,
|
|
||||||
&preauth_rsp_node->List, LL_ACCESS_LOCK);
|
|
||||||
|
|
||||||
/* Pre-auth successful. Transition to PREAUTH Done state */
|
|
||||||
csr_neighbor_roam_state_transition(mac_ctx,
|
|
||||||
eCSR_NEIGHBOR_ROAM_STATE_PREAUTH_DONE, session_id);
|
|
||||||
neighbor_roam_info->FTRoamInfo.numPreAuthRetries = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The caller of this function would start a timer and by
|
|
||||||
* the time it expires, supplicant should have provided
|
|
||||||
* the updated FTIEs to SME. So, when it expires, handoff
|
|
||||||
* will be triggered then.
|
|
||||||
*/
|
|
||||||
} else {
|
|
||||||
tpCsrNeighborRoamBSSInfo neighbor_bss_node = NULL;
|
|
||||||
tListElem *entry;
|
|
||||||
bool is_dis_pending = false;
|
|
||||||
|
|
||||||
sms_log(mac_ctx, LOGE,
|
|
||||||
FL("Preauth failed retry number %d, status = 0x%x"),
|
|
||||||
neighbor_roam_info->FTRoamInfo.numPreAuthRetries,
|
|
||||||
lim_status);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Preauth failed. Add the bssId to the preAuth failed list
|
|
||||||
* of MAC Address. Also remove the AP from roamable AP list.
|
|
||||||
*/
|
|
||||||
if ((neighbor_roam_info->FTRoamInfo.numPreAuthRetries >=
|
|
||||||
CSR_NEIGHBOR_ROAM_MAX_NUM_PREAUTH_RETRIES) ||
|
|
||||||
(eSIR_LIM_MAX_STA_REACHED_ERROR == lim_status)) {
|
|
||||||
/*
|
|
||||||
* We are going to remove the node as it fails for
|
|
||||||
* more than MAX tries. Reset this count to 0
|
|
||||||
*/
|
|
||||||
neighbor_roam_info->FTRoamInfo.numPreAuthRetries = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The one in the head of the list should be one with
|
|
||||||
* which we issued pre-auth and failed
|
|
||||||
*/
|
|
||||||
entry = csr_ll_remove_head(
|
|
||||||
&neighbor_roam_info->roamableAPList,
|
|
||||||
LL_ACCESS_LOCK);
|
|
||||||
if (!entry) {
|
|
||||||
sms_log(mac_ctx, LOGE,
|
|
||||||
FL("Preauth list is empty"));
|
|
||||||
goto NEXT_PREAUTH;
|
|
||||||
}
|
|
||||||
neighbor_bss_node = GET_BASE_ADDR(entry,
|
|
||||||
tCsrNeighborRoamBSSInfo,
|
|
||||||
List);
|
|
||||||
/*
|
|
||||||
* Add the BSSID to pre-auth fail list if
|
|
||||||
* it is not requested by HDD
|
|
||||||
*/
|
|
||||||
if (!neighbor_roam_info->uOsRequestedHandoff)
|
|
||||||
status =
|
|
||||||
csr_neighbor_roam_add_preauth_fail(
|
|
||||||
mac_ctx, session_id,
|
|
||||||
neighbor_bss_node->
|
|
||||||
pBssDescription->bssId);
|
|
||||||
csr_neighbor_roam_send_lfr_metric_event(mac_ctx,
|
|
||||||
session_id,
|
|
||||||
neighbor_bss_node->pBssDescription->bssId,
|
|
||||||
eCSR_ROAM_PREAUTH_STATUS_FAILURE);
|
|
||||||
/* Now we can free this node */
|
|
||||||
csr_neighbor_roam_free_neighbor_roam_bss_node(
|
|
||||||
mac_ctx, neighbor_bss_node);
|
|
||||||
}
|
|
||||||
NEXT_PREAUTH:
|
|
||||||
is_dis_pending = is_disconnect_pending(mac_ctx, session_id);
|
|
||||||
if (is_dis_pending) {
|
|
||||||
sms_log(mac_ctx, LOGE,
|
|
||||||
FL("Disconnect in progress, Abort preauth"));
|
|
||||||
goto ABORT_PREAUTH;
|
|
||||||
}
|
|
||||||
/* Issue preauth request for the same/next entry */
|
|
||||||
if (QDF_STATUS_SUCCESS == csr_neighbor_roam_issue_preauth_req(
|
|
||||||
mac_ctx, session_id))
|
|
||||||
goto DEQ_PREAUTH;
|
|
||||||
ABORT_PREAUTH:
|
|
||||||
if (csr_roam_is_roam_offload_scan_enabled(mac_ctx)) {
|
|
||||||
if (neighbor_roam_info->uOsRequestedHandoff) {
|
|
||||||
neighbor_roam_info->uOsRequestedHandoff = 0;
|
|
||||||
csr_roam_offload_scan(mac_ctx, 0,
|
|
||||||
ROAM_SCAN_OFFLOAD_START,
|
|
||||||
REASON_PREAUTH_FAILED_FOR_ALL);
|
|
||||||
} else {
|
|
||||||
csr_roam_offload_scan(mac_ctx, 0,
|
|
||||||
ROAM_SCAN_OFFLOAD_RESTART,
|
|
||||||
REASON_PREAUTH_FAILED_FOR_ALL);
|
|
||||||
}
|
|
||||||
csr_neighbor_roam_state_transition(mac_ctx,
|
|
||||||
eCSR_NEIGHBOR_ROAM_STATE_CONNECTED, session_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DEQ_PREAUTH:
|
|
||||||
csr_dequeue_roam_command(mac_ctx, eCsrPerformPreauth);
|
|
||||||
return preauth_processed;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||||
/**
|
/**
|
||||||
* csr_neighbor_roam_offload_update_preauth_list()
|
* csr_neighbor_roam_offload_update_preauth_list()
|
||||||
@@ -2587,36 +2170,6 @@ QDF_STATUS csr_neighbor_roam_indicate_connect(
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
\fn csr_neighbor_roam_purge_preauth_failed_list
|
|
||||||
|
|
||||||
\brief This function purges all the MAC addresses in the pre-auth fail list
|
|
||||||
|
|
||||||
\param pMac - The handle returned by mac_open.
|
|
||||||
|
|
||||||
\return VOID
|
|
||||||
|
|
||||||
---------------------------------------------------------------------------*/
|
|
||||||
void csr_neighbor_roam_purge_preauth_failed_list(tpAniSirGlobal pMac)
|
|
||||||
{
|
|
||||||
uint8_t i, j;
|
|
||||||
tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
|
|
||||||
|
|
||||||
for (j = 0; j < CSR_ROAM_SESSION_MAX; j++) {
|
|
||||||
pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[j];
|
|
||||||
for (i = 0;
|
|
||||||
i <
|
|
||||||
pNeighborRoamInfo->FTRoamInfo.preAuthFailList.
|
|
||||||
numMACAddress; i++) {
|
|
||||||
qdf_mem_zero(pNeighborRoamInfo->FTRoamInfo.
|
|
||||||
preAuthFailList.macAddress[i],
|
|
||||||
sizeof(tSirMacAddr));
|
|
||||||
}
|
|
||||||
pNeighborRoamInfo->FTRoamInfo.preAuthFailList.numMACAddress = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------
|
/* ---------------------------------------------------------------------------
|
||||||
|
|
||||||
\fn csr_neighbor_roam_init11r_assoc_info
|
\fn csr_neighbor_roam_init11r_assoc_info
|
||||||
@@ -3081,58 +2634,6 @@ bool csr_neighbor_roam_get_handoff_ap_info(tpAniSirGlobal pMac,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------
|
|
||||||
\brief This function returns true if preauth is completed
|
|
||||||
|
|
||||||
\param pMac - The handle returned by mac_open.
|
|
||||||
|
|
||||||
\return bool
|
|
||||||
|
|
||||||
---------------------------------------------------------------------------*/
|
|
||||||
bool csr_neighbor_roam_state_preauth_done(tpAniSirGlobal pMac, uint8_t sessionId)
|
|
||||||
{
|
|
||||||
return pMac->roam.neighborRoamInfo[sessionId].neighborRoamState ==
|
|
||||||
eCSR_NEIGHBOR_ROAM_STATE_PREAUTH_DONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------
|
|
||||||
\brief In the event that we are associated with AP1 and we have
|
|
||||||
completed pre auth with AP2. Then we receive a deauth/disassoc from
|
|
||||||
AP1.
|
|
||||||
At this point neighbor roam is in pre auth done state, pre auth timer
|
|
||||||
is running. We now handle this case by stopping timer and clearing
|
|
||||||
the pre-auth state. We basically clear up and just go to disconnected
|
|
||||||
state.
|
|
||||||
|
|
||||||
\param pMac - The handle returned by mac_open.
|
|
||||||
|
|
||||||
\return bool
|
|
||||||
---------------------------------------------------------------------------*/
|
|
||||||
void csr_neighbor_roam_tranistion_preauth_done_to_disconnected(tpAniSirGlobal pMac,
|
|
||||||
uint8_t sessionId)
|
|
||||||
{
|
|
||||||
tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
|
|
||||||
&pMac->roam.neighborRoamInfo[sessionId];
|
|
||||||
tCsrRoamSession *session = CSR_GET_SESSION(pMac, sessionId);
|
|
||||||
|
|
||||||
if (!session) {
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
|
|
||||||
FL("session is NULL"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pNeighborRoamInfo->neighborRoamState !=
|
|
||||||
eCSR_NEIGHBOR_ROAM_STATE_PREAUTH_DONE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Stop timer */
|
|
||||||
qdf_mc_timer_stop(&session->ftSmeContext.preAuthReassocIntvlTimer);
|
|
||||||
|
|
||||||
/* Transition to init state */
|
|
||||||
csr_neighbor_roam_state_transition(pMac,
|
|
||||||
eCSR_NEIGHBOR_ROAM_STATE_INIT, sessionId);
|
|
||||||
pNeighborRoamInfo->roamChannelInfo.IAPPNeighborListReceived = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------
|
/* ---------------------------------------------------------------------------
|
||||||
\brief This function returns true if STA is in the middle of roaming states
|
\brief This function returns true if STA is in the middle of roaming states
|
||||||
|
754
core/sme/src/csr/csr_roam_preauth.c
Normal file
754
core/sme/src/csr/csr_roam_preauth.c
Normal file
@@ -0,0 +1,754 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016 The Linux Foundation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
|
* above copyright notice and this permission notice appear in all
|
||||||
|
* copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
|
||||||
|
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
||||||
|
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||||
|
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||||
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DOC: csr_roam_preauth.c
|
||||||
|
*
|
||||||
|
* Host based roaming preauthentication implementation
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wma_types.h"
|
||||||
|
#include "cds_mq.h"
|
||||||
|
#include "csr_inside_api.h"
|
||||||
|
#include "sms_debug.h"
|
||||||
|
#include "sme_qos_internal.h"
|
||||||
|
#include "sme_inside.h"
|
||||||
|
#include "host_diag_core_event.h"
|
||||||
|
#include "host_diag_core_log.h"
|
||||||
|
#include "csr_api.h"
|
||||||
|
#include "sme_api.h"
|
||||||
|
#include "csr_neighbor_roam.h"
|
||||||
|
#include "mac_trace.h"
|
||||||
|
#include "cds_concurrency.h"
|
||||||
|
|
||||||
|
static void csr_reinit_preauth_cmd(tpAniSirGlobal pMac, tSmeCmd *pCommand);
|
||||||
|
static QDF_STATUS csr_neighbor_roam_add_preauth_fail(tpAniSirGlobal mac_ctx,
|
||||||
|
uint8_t session_id, tSirMacAddr bssid);
|
||||||
|
/**
|
||||||
|
* csr_neighbor_roam_state_preauth_done() - Check if state is preauth done
|
||||||
|
* @mac_ctx: Global MAC context
|
||||||
|
* @session_id: SME session ID
|
||||||
|
*
|
||||||
|
* Return: True if the state id preauth done, false otherwise
|
||||||
|
*/
|
||||||
|
bool csr_neighbor_roam_state_preauth_done(tpAniSirGlobal mac_ctx,
|
||||||
|
uint8_t session_id)
|
||||||
|
{
|
||||||
|
return mac_ctx->roam.neighborRoamInfo[session_id].neighborRoamState ==
|
||||||
|
eCSR_NEIGHBOR_ROAM_STATE_PREAUTH_DONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* csr_neighbor_roam_tranistion_preauth_done_to_disconnected() - Transition
|
||||||
|
* the state from preauth done to disconnected
|
||||||
|
* @mac_ctx: Global MAC Context
|
||||||
|
* @session_id: SME Session ID
|
||||||
|
*
|
||||||
|
* In the event that we are associated with AP1 and we have
|
||||||
|
* completed pre auth with AP2. Then we receive a deauth/disassoc from AP1.
|
||||||
|
* At this point neighbor roam is in pre auth done state, pre auth timer
|
||||||
|
* is running. We now handle this case by stopping timer and clearing
|
||||||
|
* the pre-auth state. We basically clear up and just go to disconnected
|
||||||
|
* state
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void csr_neighbor_roam_tranistion_preauth_done_to_disconnected(
|
||||||
|
tpAniSirGlobal mac_ctx, uint8_t session_id)
|
||||||
|
{
|
||||||
|
tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
|
||||||
|
&mac_ctx->roam.neighborRoamInfo[session_id];
|
||||||
|
tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id);
|
||||||
|
|
||||||
|
if (!session) {
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
|
||||||
|
FL("session is NULL"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pNeighborRoamInfo->neighborRoamState !=
|
||||||
|
eCSR_NEIGHBOR_ROAM_STATE_PREAUTH_DONE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
qdf_mc_timer_stop(&session->ftSmeContext.preAuthReassocIntvlTimer);
|
||||||
|
csr_neighbor_middle_of_roaming(mac_ctx, session_id);
|
||||||
|
pNeighborRoamInfo->roamChannelInfo.IAPPNeighborListReceived = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* csr_reinit_preauth_cmd() - Cleanup the preauth command
|
||||||
|
* @mac_ctx: Global MAC context
|
||||||
|
* @command: Command to be cleaned up
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
static void csr_reinit_preauth_cmd(tpAniSirGlobal mac_ctx, tSmeCmd *command)
|
||||||
|
{
|
||||||
|
command->u.roamCmd.pLastRoamBss = NULL;
|
||||||
|
command->u.roamCmd.pRoamBssEntry = NULL;
|
||||||
|
qdf_mem_set(&command->u.roamCmd, sizeof(tRoamCmd), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* csr_release_command_preauth() - Release the preauth command
|
||||||
|
* @mac_ctx: Global MAC context
|
||||||
|
* @command: Command to be released
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void csr_release_command_preauth(tpAniSirGlobal mac_ctx, tSmeCmd *command)
|
||||||
|
{
|
||||||
|
csr_reinit_preauth_cmd(mac_ctx, command);
|
||||||
|
csr_release_command(mac_ctx, command);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* csr_roam_enqueue_preauth() - Put the preauth command in the queue
|
||||||
|
* @mac_ctx: Global MAC Context
|
||||||
|
* @session_id: SME Session ID
|
||||||
|
* @bss_desc: BSS descriptor
|
||||||
|
* @reason: roaming reason
|
||||||
|
* @immediate: High priority in the queue or not
|
||||||
|
*
|
||||||
|
* Return: Success if queued properly, false otherwise.
|
||||||
|
*/
|
||||||
|
QDF_STATUS csr_roam_enqueue_preauth(tpAniSirGlobal mac_ctx,
|
||||||
|
uint32_t session_id, tpSirBssDescription bss_desc,
|
||||||
|
eCsrRoamReason reason, bool immediate)
|
||||||
|
{
|
||||||
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||||
|
tSmeCmd *command;
|
||||||
|
|
||||||
|
command = csr_get_command_buffer(mac_ctx);
|
||||||
|
if (NULL == command) {
|
||||||
|
sms_log(mac_ctx, LOGE, FL(" fail to get command buffer"));
|
||||||
|
status = QDF_STATUS_E_RESOURCES;
|
||||||
|
} else {
|
||||||
|
if (bss_desc) {
|
||||||
|
command->command = eSmeCommandRoam;
|
||||||
|
command->sessionId = (uint8_t) session_id;
|
||||||
|
command->u.roamCmd.roamReason = reason;
|
||||||
|
command->u.roamCmd.pLastRoamBss = bss_desc;
|
||||||
|
status = csr_queue_sme_command(mac_ctx, command,
|
||||||
|
immediate);
|
||||||
|
if (!QDF_IS_STATUS_SUCCESS(status)) {
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL("fail to queue preauth,status=%d"),
|
||||||
|
status);
|
||||||
|
csr_release_command_preauth(mac_ctx, command);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
status = QDF_STATUS_E_RESOURCES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* csr_neighbor_roam_purge_preauth_failed_list() - Purge the preauth fail list
|
||||||
|
* @mac_ctx: Global MAC Context
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void csr_neighbor_roam_purge_preauth_failed_list(tpAniSirGlobal mac_ctx)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
uint8_t j;
|
||||||
|
uint8_t num_mac_addr;
|
||||||
|
tpCsrNeighborRoamControlInfo neigh_roam_info = NULL;
|
||||||
|
tpCsrPreauthFailListInfo fail_list;
|
||||||
|
|
||||||
|
for (j = 0; j < CSR_ROAM_SESSION_MAX; j++) {
|
||||||
|
neigh_roam_info = &mac_ctx->roam.neighborRoamInfo[j];
|
||||||
|
fail_list = &neigh_roam_info->FTRoamInfo.preAuthFailList;
|
||||||
|
num_mac_addr = fail_list->numMACAddress;
|
||||||
|
for (i = 0; i < num_mac_addr; i++)
|
||||||
|
qdf_mem_zero(fail_list->macAddress[i],
|
||||||
|
sizeof(tSirMacAddr));
|
||||||
|
fail_list->numMACAddress = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @csr_neighbor_roam_reset_preauth_control_info - Reset preauth info
|
||||||
|
* @mac_ctx: Global MAC Context
|
||||||
|
* @session_id: SME Session ID
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void csr_neighbor_roam_reset_preauth_control_info(tpAniSirGlobal mac_ctx,
|
||||||
|
uint8_t session_id)
|
||||||
|
{
|
||||||
|
tpCsrNeighborRoamControlInfo neigh_roam_info =
|
||||||
|
&mac_ctx->roam.neighborRoamInfo[session_id];
|
||||||
|
|
||||||
|
neigh_roam_info->is11rAssoc = false;
|
||||||
|
csr_neighbor_roam_purge_preauth_failed_list(mac_ctx);
|
||||||
|
|
||||||
|
neigh_roam_info->FTRoamInfo.preauthRspPending = false;
|
||||||
|
neigh_roam_info->FTRoamInfo.numPreAuthRetries = 0;
|
||||||
|
neigh_roam_info->FTRoamInfo.currentNeighborRptRetryNum = 0;
|
||||||
|
neigh_roam_info->FTRoamInfo.neighborRptPending = false;
|
||||||
|
neigh_roam_info->FTRoamInfo.numBssFromNeighborReport = 0;
|
||||||
|
qdf_mem_zero(neigh_roam_info->FTRoamInfo.neighboReportBssInfo,
|
||||||
|
sizeof(tCsrNeighborReportBssInfo) *
|
||||||
|
MAX_BSS_IN_NEIGHBOR_RPT);
|
||||||
|
neigh_roam_info->uOsRequestedHandoff = 0;
|
||||||
|
qdf_mem_zero(&neigh_roam_info->handoffReqInfo,
|
||||||
|
sizeof(tCsrHandoffRequest));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* csr_neighbor_roam_preauth_rsp_handler() - handle preauth response
|
||||||
|
* @mac_ctx: The handle returned by mac_open.
|
||||||
|
* @session_id: SME session
|
||||||
|
* @lim_status: eSIR_SUCCESS/eSIR_FAILURE/eSIR_LIM_MAX_STA_REACHED_ERROR/
|
||||||
|
* eSIT_LIM_AUTH_RSP_TIMEOUT status from PE
|
||||||
|
*
|
||||||
|
* This function handle the Preauth response from PE
|
||||||
|
* Every preauth is allowed max 3 tries if it fails. If a bssid failed
|
||||||
|
* for more than MAX_TRIES, we will remove it from the list and try
|
||||||
|
* with the next node in the roamable AP list and add the BSSID to
|
||||||
|
* pre-auth failed list. If no more entries present in roamable AP list,
|
||||||
|
* transition to REPORT_SCAN state.
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS_SUCCESS on success (i.e. pre-auth processed),
|
||||||
|
* QDF_STATUS_E_FAILURE otherwise
|
||||||
|
*/
|
||||||
|
QDF_STATUS csr_neighbor_roam_preauth_rsp_handler(tpAniSirGlobal mac_ctx,
|
||||||
|
uint8_t session_id,
|
||||||
|
tSirRetStatus lim_status)
|
||||||
|
{
|
||||||
|
tpCsrNeighborRoamControlInfo neighbor_roam_info =
|
||||||
|
&mac_ctx->roam.neighborRoamInfo[session_id];
|
||||||
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||||
|
QDF_STATUS preauth_processed = QDF_STATUS_SUCCESS;
|
||||||
|
tpCsrNeighborRoamBSSInfo preauth_rsp_node = NULL;
|
||||||
|
|
||||||
|
if (false == neighbor_roam_info->FTRoamInfo.preauthRspPending) {
|
||||||
|
/*
|
||||||
|
* This can happen when we disconnect immediately
|
||||||
|
* after sending a pre-auth request. During processing
|
||||||
|
* of the disconnect command, we would have reset
|
||||||
|
* preauthRspPending and transitioned to INIT state.
|
||||||
|
*/
|
||||||
|
sms_log(mac_ctx, LOGW,
|
||||||
|
FL("Unexpected pre-auth response in state %d"),
|
||||||
|
neighbor_roam_info->neighborRoamState);
|
||||||
|
preauth_processed = QDF_STATUS_E_FAILURE;
|
||||||
|
goto DEQ_PREAUTH;
|
||||||
|
}
|
||||||
|
/* We can receive it in these 2 states. */
|
||||||
|
if ((neighbor_roam_info->neighborRoamState !=
|
||||||
|
eCSR_NEIGHBOR_ROAM_STATE_PREAUTHENTICATING)) {
|
||||||
|
sms_log(mac_ctx, LOGW,
|
||||||
|
FL("Preauth response received in state %s"),
|
||||||
|
mac_trace_get_neighbour_roam_state
|
||||||
|
(neighbor_roam_info->neighborRoamState));
|
||||||
|
preauth_processed = QDF_STATUS_E_FAILURE;
|
||||||
|
goto DEQ_PREAUTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
neighbor_roam_info->FTRoamInfo.preauthRspPending = false;
|
||||||
|
|
||||||
|
if (eSIR_SUCCESS == lim_status)
|
||||||
|
preauth_rsp_node =
|
||||||
|
csr_neighbor_roam_next_roamable_ap(
|
||||||
|
mac_ctx, &neighbor_roam_info->roamableAPList,
|
||||||
|
NULL);
|
||||||
|
if ((eSIR_SUCCESS == lim_status) && (NULL != preauth_rsp_node)) {
|
||||||
|
sms_log(mac_ctx, LOG1,
|
||||||
|
FL("Preauth completed successfully after %d tries"),
|
||||||
|
neighbor_roam_info->FTRoamInfo.numPreAuthRetries);
|
||||||
|
sms_log(mac_ctx, LOG1,
|
||||||
|
FL("After Pre-Auth: BSSID " MAC_ADDRESS_STR ", Ch:%d"),
|
||||||
|
MAC_ADDR_ARRAY(
|
||||||
|
preauth_rsp_node->pBssDescription->bssId),
|
||||||
|
(int)preauth_rsp_node->pBssDescription->channelId);
|
||||||
|
|
||||||
|
csr_neighbor_roam_send_lfr_metric_event(mac_ctx, session_id,
|
||||||
|
preauth_rsp_node->pBssDescription->bssId,
|
||||||
|
eCSR_ROAM_PREAUTH_STATUS_SUCCESS);
|
||||||
|
/*
|
||||||
|
* Preauth completed successfully. Insert the preauthenticated
|
||||||
|
* node to tail of preAuthDoneList.
|
||||||
|
*/
|
||||||
|
csr_neighbor_roam_remove_roamable_ap_list_entry(mac_ctx,
|
||||||
|
&neighbor_roam_info->roamableAPList,
|
||||||
|
preauth_rsp_node);
|
||||||
|
csr_ll_insert_tail(
|
||||||
|
&neighbor_roam_info->FTRoamInfo.preAuthDoneList,
|
||||||
|
&preauth_rsp_node->List, LL_ACCESS_LOCK);
|
||||||
|
|
||||||
|
/* Pre-auth successful. Transition to PREAUTH Done state */
|
||||||
|
csr_neighbor_middle_of_roaming(mac_ctx, session_id);
|
||||||
|
neighbor_roam_info->FTRoamInfo.numPreAuthRetries = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The caller of this function would start a timer and by
|
||||||
|
* the time it expires, supplicant should have provided
|
||||||
|
* the updated FTIEs to SME. So, when it expires, handoff
|
||||||
|
* will be triggered then.
|
||||||
|
*/
|
||||||
|
} else {
|
||||||
|
tpCsrNeighborRoamBSSInfo neighbor_bss_node = NULL;
|
||||||
|
tListElem *entry;
|
||||||
|
bool is_dis_pending = false;
|
||||||
|
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL("Preauth failed retry number %d, status = 0x%x"),
|
||||||
|
neighbor_roam_info->FTRoamInfo.numPreAuthRetries,
|
||||||
|
lim_status);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Preauth failed. Add the bssId to the preAuth failed list
|
||||||
|
* of MAC Address. Also remove the AP from roamable AP list.
|
||||||
|
*/
|
||||||
|
if ((neighbor_roam_info->FTRoamInfo.numPreAuthRetries >=
|
||||||
|
CSR_NEIGHBOR_ROAM_MAX_NUM_PREAUTH_RETRIES) ||
|
||||||
|
(eSIR_LIM_MAX_STA_REACHED_ERROR == lim_status)) {
|
||||||
|
/*
|
||||||
|
* We are going to remove the node as it fails for
|
||||||
|
* more than MAX tries. Reset this count to 0
|
||||||
|
*/
|
||||||
|
neighbor_roam_info->FTRoamInfo.numPreAuthRetries = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The one in the head of the list should be one with
|
||||||
|
* which we issued pre-auth and failed
|
||||||
|
*/
|
||||||
|
entry = csr_ll_remove_head(
|
||||||
|
&neighbor_roam_info->roamableAPList,
|
||||||
|
LL_ACCESS_LOCK);
|
||||||
|
if (!entry) {
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL("Preauth list is empty"));
|
||||||
|
goto NEXT_PREAUTH;
|
||||||
|
}
|
||||||
|
neighbor_bss_node = GET_BASE_ADDR(entry,
|
||||||
|
tCsrNeighborRoamBSSInfo,
|
||||||
|
List);
|
||||||
|
/*
|
||||||
|
* Add the BSSID to pre-auth fail list if
|
||||||
|
* it is not requested by HDD
|
||||||
|
*/
|
||||||
|
if (!neighbor_roam_info->uOsRequestedHandoff)
|
||||||
|
status =
|
||||||
|
csr_neighbor_roam_add_preauth_fail(
|
||||||
|
mac_ctx, session_id,
|
||||||
|
neighbor_bss_node->
|
||||||
|
pBssDescription->bssId);
|
||||||
|
csr_neighbor_roam_send_lfr_metric_event(mac_ctx,
|
||||||
|
session_id,
|
||||||
|
neighbor_bss_node->pBssDescription->bssId,
|
||||||
|
eCSR_ROAM_PREAUTH_STATUS_FAILURE);
|
||||||
|
/* Now we can free this node */
|
||||||
|
csr_neighbor_roam_free_neighbor_roam_bss_node(
|
||||||
|
mac_ctx, neighbor_bss_node);
|
||||||
|
}
|
||||||
|
NEXT_PREAUTH:
|
||||||
|
is_dis_pending = is_disconnect_pending(mac_ctx, session_id);
|
||||||
|
if (is_dis_pending) {
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL("Disconnect in progress, Abort preauth"));
|
||||||
|
goto ABORT_PREAUTH;
|
||||||
|
}
|
||||||
|
/* Issue preauth request for the same/next entry */
|
||||||
|
if (QDF_STATUS_SUCCESS == csr_neighbor_roam_issue_preauth_req(
|
||||||
|
mac_ctx, session_id))
|
||||||
|
goto DEQ_PREAUTH;
|
||||||
|
ABORT_PREAUTH:
|
||||||
|
if (csr_roam_is_roam_offload_scan_enabled(mac_ctx)) {
|
||||||
|
if (neighbor_roam_info->uOsRequestedHandoff) {
|
||||||
|
neighbor_roam_info->uOsRequestedHandoff = 0;
|
||||||
|
csr_roam_offload_scan(mac_ctx, 0,
|
||||||
|
ROAM_SCAN_OFFLOAD_START,
|
||||||
|
REASON_PREAUTH_FAILED_FOR_ALL);
|
||||||
|
} else {
|
||||||
|
csr_roam_offload_scan(mac_ctx, 0,
|
||||||
|
ROAM_SCAN_OFFLOAD_RESTART,
|
||||||
|
REASON_PREAUTH_FAILED_FOR_ALL);
|
||||||
|
}
|
||||||
|
csr_neighbor_middle_of_roaming(mac_ctx, session_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DEQ_PREAUTH:
|
||||||
|
csr_dequeue_roam_command(mac_ctx, eCsrPerformPreauth);
|
||||||
|
return preauth_processed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* csr_neighbor_roam_add_preauth_fail() - add bssid to preauth failed list
|
||||||
|
* @mac_ctx: The handle returned by mac_open.
|
||||||
|
* @bssid: BSSID to be added to the preauth fail list
|
||||||
|
*
|
||||||
|
* This function adds the given BSSID to the Preauth fail list
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE otherwise
|
||||||
|
*/
|
||||||
|
static QDF_STATUS csr_neighbor_roam_add_preauth_fail(tpAniSirGlobal mac_ctx,
|
||||||
|
uint8_t session_id, tSirMacAddr bssid)
|
||||||
|
{
|
||||||
|
uint8_t i = 0;
|
||||||
|
tpCsrNeighborRoamControlInfo neighbor_roam_info =
|
||||||
|
&mac_ctx->roam.neighborRoamInfo[session_id];
|
||||||
|
uint8_t num_mac_addr = neighbor_roam_info->FTRoamInfo.preAuthFailList.
|
||||||
|
numMACAddress;
|
||||||
|
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL(" Added BSSID " MAC_ADDRESS_STR " to Preauth failed list"),
|
||||||
|
MAC_ADDR_ARRAY(bssid));
|
||||||
|
|
||||||
|
for (i = 0;
|
||||||
|
i < neighbor_roam_info->FTRoamInfo.preAuthFailList.numMACAddress;
|
||||||
|
i++) {
|
||||||
|
if (!qdf_mem_cmp(
|
||||||
|
neighbor_roam_info->FTRoamInfo.preAuthFailList.macAddress[i],
|
||||||
|
bssid, sizeof(tSirMacAddr))) {
|
||||||
|
sms_log(mac_ctx, LOGW,
|
||||||
|
FL("BSSID "MAC_ADDRESS_STR" already fail list"),
|
||||||
|
MAC_ADDR_ARRAY(bssid));
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((num_mac_addr + 1) > MAX_NUM_PREAUTH_FAIL_LIST_ADDRESS) {
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL("Cannot add, preauth fail list is full."));
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
qdf_mem_copy(neighbor_roam_info->FTRoamInfo.preAuthFailList.
|
||||||
|
macAddress[num_mac_addr], bssid, sizeof(tSirMacAddr));
|
||||||
|
neighbor_roam_info->FTRoamInfo.preAuthFailList.numMACAddress++;
|
||||||
|
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* csr_neighbor_roam_is_preauth_candidate()
|
||||||
|
*
|
||||||
|
* @mac_ctx: Pointer to Global MAC structure
|
||||||
|
* @bssId : BSSID of the candidate
|
||||||
|
*
|
||||||
|
* This function checks whether the given MAC address is already present
|
||||||
|
* in the preauth fail list and returns true/false accordingly
|
||||||
|
*
|
||||||
|
* Return: true if preauth candidate, false otherwise
|
||||||
|
*/
|
||||||
|
bool csr_neighbor_roam_is_preauth_candidate(tpAniSirGlobal pMac,
|
||||||
|
uint8_t sessionId, tSirMacAddr bssId)
|
||||||
|
{
|
||||||
|
uint8_t i = 0;
|
||||||
|
tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
|
||||||
|
&pMac->roam.neighborRoamInfo[sessionId];
|
||||||
|
|
||||||
|
if (csr_roam_is_roam_offload_scan_enabled(pMac))
|
||||||
|
return true;
|
||||||
|
if (0 == pNeighborRoamInfo->FTRoamInfo.preAuthFailList.numMACAddress)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
for (i = 0;
|
||||||
|
i < pNeighborRoamInfo->FTRoamInfo.preAuthFailList.numMACAddress;
|
||||||
|
i++) {
|
||||||
|
if (!qdf_mem_cmp(pNeighborRoamInfo->FTRoamInfo.
|
||||||
|
preAuthFailList.macAddress[i], bssId,
|
||||||
|
sizeof(tSirMacAddr))) {
|
||||||
|
sms_log(pMac, LOGE,
|
||||||
|
FL("BSSID exists in fail list" MAC_ADDRESS_STR),
|
||||||
|
MAC_ADDR_ARRAY(bssId));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* csr_roam_issue_ft_preauth_req() - Initiate Preauthentication request
|
||||||
|
* @hal: Global Handle
|
||||||
|
* @session_id: SME Session ID
|
||||||
|
* @bss_desc: BSS descriptor
|
||||||
|
*
|
||||||
|
* Return: Success or Failure
|
||||||
|
*/
|
||||||
|
QDF_STATUS csr_roam_issue_ft_preauth_req(tHalHandle hal, uint32_t session_id,
|
||||||
|
tpSirBssDescription bss_desc)
|
||||||
|
{
|
||||||
|
tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
|
||||||
|
tpSirFTPreAuthReq preauth_req;
|
||||||
|
uint16_t auth_req_len = 0;
|
||||||
|
tCsrRoamSession *csr_session = CSR_GET_SESSION(mac_ctx, session_id);
|
||||||
|
|
||||||
|
if (NULL == csr_session) {
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL("Session does not exist for session id(%d)"),
|
||||||
|
session_id);
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auth_req_len = sizeof(tSirFTPreAuthReq);
|
||||||
|
preauth_req = (tpSirFTPreAuthReq) qdf_mem_malloc(auth_req_len);
|
||||||
|
if (NULL == preauth_req) {
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL("Memory allocation for FT Preauth request failed"));
|
||||||
|
return QDF_STATUS_E_NOMEM;
|
||||||
|
}
|
||||||
|
/* Save the SME Session ID. We need it while processing preauth resp */
|
||||||
|
csr_session->ftSmeContext.smeSessionId = session_id;
|
||||||
|
qdf_mem_zero(preauth_req, auth_req_len);
|
||||||
|
|
||||||
|
preauth_req->pbssDescription =
|
||||||
|
(tpSirBssDescription) qdf_mem_malloc(sizeof(bss_desc->length)
|
||||||
|
+ bss_desc->length);
|
||||||
|
if (NULL == preauth_req->pbssDescription) {
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL("Memory allocation for FT Preauth request failed"));
|
||||||
|
return QDF_STATUS_E_NOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
preauth_req->messageType = eWNI_SME_FT_PRE_AUTH_REQ;
|
||||||
|
|
||||||
|
preauth_req->preAuthchannelNum = bss_desc->channelId;
|
||||||
|
|
||||||
|
qdf_mem_copy((void *)&preauth_req->currbssId,
|
||||||
|
(void *)csr_session->connectedProfile.bssid.bytes,
|
||||||
|
sizeof(tSirMacAddr));
|
||||||
|
qdf_mem_copy((void *)&preauth_req->preAuthbssId,
|
||||||
|
(void *)bss_desc->bssId, sizeof(tSirMacAddr));
|
||||||
|
qdf_mem_copy((void *)&preauth_req->self_mac_addr,
|
||||||
|
(void *)&csr_session->selfMacAddr.bytes, sizeof(tSirMacAddr));
|
||||||
|
|
||||||
|
if (csr_roam_is11r_assoc(mac_ctx, session_id) &&
|
||||||
|
(mac_ctx->roam.roamSession[session_id].connectedProfile.AuthType !=
|
||||||
|
eCSR_AUTH_TYPE_OPEN_SYSTEM)) {
|
||||||
|
preauth_req->ft_ies_length =
|
||||||
|
(uint16_t) csr_session->ftSmeContext.auth_ft_ies_length;
|
||||||
|
qdf_mem_copy(preauth_req->ft_ies,
|
||||||
|
csr_session->ftSmeContext.auth_ft_ies,
|
||||||
|
csr_session->ftSmeContext.auth_ft_ies_length);
|
||||||
|
} else {
|
||||||
|
preauth_req->ft_ies_length = 0;
|
||||||
|
}
|
||||||
|
qdf_mem_copy(preauth_req->pbssDescription, bss_desc,
|
||||||
|
sizeof(bss_desc->length) + bss_desc->length);
|
||||||
|
preauth_req->length = auth_req_len;
|
||||||
|
return cds_send_mb_message_to_mac(preauth_req);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* csr_roam_ft_pre_auth_rsp_processor() - Handle the preauth response
|
||||||
|
* @hal: Global Handle
|
||||||
|
* preauth_rsp: Received preauthentication response
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void csr_roam_ft_pre_auth_rsp_processor(tHalHandle hal,
|
||||||
|
tpSirFTPreAuthRsp preauth_rsp)
|
||||||
|
{
|
||||||
|
tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
|
||||||
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||||
|
tCsrRoamInfo roam_info;
|
||||||
|
eCsrAuthType conn_Auth_type;
|
||||||
|
uint32_t session_id = preauth_rsp->smeSessionId;
|
||||||
|
tCsrRoamSession *csr_session = CSR_GET_SESSION(mac_ctx, session_id);
|
||||||
|
|
||||||
|
if (NULL == csr_session) {
|
||||||
|
sms_log(mac_ctx, LOGE, FL("CSR session is NULL"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
status = csr_neighbor_roam_preauth_rsp_handler(mac_ctx,
|
||||||
|
preauth_rsp->smeSessionId, preauth_rsp->status);
|
||||||
|
if (status != QDF_STATUS_SUCCESS) {
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL("Preauth was not processed: %d SessionID: %d"),
|
||||||
|
status, session_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QDF_STATUS_SUCCESS != (QDF_STATUS) preauth_rsp->status)
|
||||||
|
return;
|
||||||
|
csr_session->ftSmeContext.FTState = eFT_AUTH_COMPLETE;
|
||||||
|
csr_session->ftSmeContext.psavedFTPreAuthRsp = preauth_rsp;
|
||||||
|
/* No need to notify qos module if this is a non 11r & ESE roam */
|
||||||
|
if (csr_roam_is11r_assoc(mac_ctx, preauth_rsp->smeSessionId)
|
||||||
|
#ifdef FEATURE_WLAN_ESE
|
||||||
|
|| csr_roam_is_ese_assoc(mac_ctx, preauth_rsp->smeSessionId)
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
sme_qos_csr_event_ind(mac_ctx,
|
||||||
|
csr_session->ftSmeContext.smeSessionId,
|
||||||
|
SME_QOS_CSR_PREAUTH_SUCCESS_IND, NULL);
|
||||||
|
}
|
||||||
|
status =
|
||||||
|
qdf_mc_timer_start(
|
||||||
|
&csr_session->ftSmeContext.preAuthReassocIntvlTimer,
|
||||||
|
60);
|
||||||
|
if (QDF_STATUS_SUCCESS != status) {
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL("PreauthReassocInterval timer failed status %d"),
|
||||||
|
status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
qdf_mem_copy((void *)&csr_session->ftSmeContext.preAuthbssId,
|
||||||
|
(void *)preauth_rsp->preAuthbssId,
|
||||||
|
sizeof(struct qdf_mac_addr));
|
||||||
|
if (csr_roam_is11r_assoc(mac_ctx, preauth_rsp->smeSessionId))
|
||||||
|
csr_roam_call_callback(mac_ctx, preauth_rsp->smeSessionId,
|
||||||
|
NULL, 0, eCSR_ROAM_FT_RESPONSE, eCSR_ROAM_RESULT_NONE);
|
||||||
|
|
||||||
|
#ifdef FEATURE_WLAN_ESE
|
||||||
|
if (csr_roam_is_ese_assoc(mac_ctx, preauth_rsp->smeSessionId)) {
|
||||||
|
csr_roam_read_tsf(mac_ctx, (uint8_t *) roam_info.timestamp,
|
||||||
|
preauth_rsp->smeSessionId);
|
||||||
|
qdf_mem_copy((void *)&roam_info.bssid,
|
||||||
|
(void *)preauth_rsp->preAuthbssId,
|
||||||
|
sizeof(struct qdf_mac_addr));
|
||||||
|
csr_roam_call_callback(mac_ctx, preauth_rsp->smeSessionId,
|
||||||
|
&roam_info, 0, eCSR_ROAM_CCKM_PREAUTH_NOTIFY,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (csr_roam_is_fast_roam_enabled(mac_ctx, preauth_rsp->smeSessionId)) {
|
||||||
|
/* Save the bssid from the received response */
|
||||||
|
qdf_mem_copy((void *)&roam_info.bssid,
|
||||||
|
(void *)preauth_rsp->preAuthbssId,
|
||||||
|
sizeof(struct qdf_mac_addr));
|
||||||
|
csr_roam_call_callback(mac_ctx, preauth_rsp->smeSessionId,
|
||||||
|
&roam_info, 0, eCSR_ROAM_PMK_NOTIFY, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If its an Open Auth, FT IEs are not provided by supplicant */
|
||||||
|
/* Hence populate them here */
|
||||||
|
conn_Auth_type =
|
||||||
|
mac_ctx->roam.roamSession[session_id].connectedProfile.AuthType;
|
||||||
|
|
||||||
|
csr_session->ftSmeContext.addMDIE = false;
|
||||||
|
|
||||||
|
/* Done with it, init it. */
|
||||||
|
csr_session->ftSmeContext.psavedFTPreAuthRsp = NULL;
|
||||||
|
|
||||||
|
if (csr_roam_is11r_assoc(mac_ctx, preauth_rsp->smeSessionId) &&
|
||||||
|
(conn_Auth_type == eCSR_AUTH_TYPE_OPEN_SYSTEM)) {
|
||||||
|
uint16_t ft_ies_length;
|
||||||
|
ft_ies_length = preauth_rsp->ric_ies_length;
|
||||||
|
|
||||||
|
if ((csr_session->ftSmeContext.reassoc_ft_ies) &&
|
||||||
|
(csr_session->ftSmeContext.reassoc_ft_ies_length)) {
|
||||||
|
qdf_mem_free(csr_session->ftSmeContext.reassoc_ft_ies);
|
||||||
|
csr_session->ftSmeContext.reassoc_ft_ies_length = 0;
|
||||||
|
csr_session->ftSmeContext.reassoc_ft_ies = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ft_ies_length)
|
||||||
|
return;
|
||||||
|
|
||||||
|
csr_session->ftSmeContext.reassoc_ft_ies =
|
||||||
|
qdf_mem_malloc(ft_ies_length);
|
||||||
|
if (NULL == csr_session->ftSmeContext.reassoc_ft_ies) {
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL("Memory allocation failed for ft_ies"));
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
/* Copy the RIC IEs to reassoc IEs */
|
||||||
|
qdf_mem_copy(((uint8_t *) csr_session->ftSmeContext.
|
||||||
|
reassoc_ft_ies),
|
||||||
|
(uint8_t *) preauth_rsp->ric_ies,
|
||||||
|
preauth_rsp->ric_ies_length);
|
||||||
|
csr_session->ftSmeContext.reassoc_ft_ies_length =
|
||||||
|
ft_ies_length;
|
||||||
|
csr_session->ftSmeContext.addMDIE = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* csr_neighbor_roam_issue_preauth_req() - Send preauth request to first AP
|
||||||
|
* @mac_ctx: The handle returned by mac_open.
|
||||||
|
* @session_id: Session information
|
||||||
|
*
|
||||||
|
* This function issues preauth request to PE with the 1st AP entry in the
|
||||||
|
* roamable AP list
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE otherwise
|
||||||
|
*/
|
||||||
|
QDF_STATUS csr_neighbor_roam_issue_preauth_req(tpAniSirGlobal mac_ctx,
|
||||||
|
uint8_t session_id)
|
||||||
|
{
|
||||||
|
tpCsrNeighborRoamControlInfo neighbor_roam_info =
|
||||||
|
&mac_ctx->roam.neighborRoamInfo[session_id];
|
||||||
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||||
|
tpCsrNeighborRoamBSSInfo neighbor_bss_node;
|
||||||
|
|
||||||
|
|
||||||
|
if (false != neighbor_roam_info->FTRoamInfo.preauthRspPending) {
|
||||||
|
/* This must not be true here */
|
||||||
|
QDF_ASSERT(neighbor_roam_info->FTRoamInfo.preauthRspPending ==
|
||||||
|
false);
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Issue Preauth request to PE here.
|
||||||
|
* Need to issue the preauth request with the BSSID that is in the
|
||||||
|
* head of the roamable AP list. Parameters that should be passed are
|
||||||
|
* BSSID, Channel number and the neighborScanPeriod(probably). If
|
||||||
|
* roamableAPList gets empty, should transition to REPORT_SCAN state
|
||||||
|
*/
|
||||||
|
neighbor_bss_node = csr_neighbor_roam_next_roamable_ap(mac_ctx,
|
||||||
|
&neighbor_roam_info->roamableAPList, NULL);
|
||||||
|
|
||||||
|
if (NULL == neighbor_bss_node) {
|
||||||
|
sms_log(mac_ctx, LOGW, FL("Roamable AP list is empty.. "));
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
} else {
|
||||||
|
csr_neighbor_roam_send_lfr_metric_event(mac_ctx, session_id,
|
||||||
|
neighbor_bss_node->pBssDescription->bssId,
|
||||||
|
eCSR_ROAM_PREAUTH_INIT_NOTIFY);
|
||||||
|
status = csr_roam_enqueue_preauth(mac_ctx, session_id,
|
||||||
|
neighbor_bss_node->pBssDescription,
|
||||||
|
eCsrPerformPreauth, true);
|
||||||
|
|
||||||
|
sms_log(mac_ctx, LOG1,
|
||||||
|
FL("Before Pre-Auth: BSSID " MAC_ADDRESS_STR ", Ch:%d"),
|
||||||
|
MAC_ADDR_ARRAY(
|
||||||
|
neighbor_bss_node->pBssDescription->bssId),
|
||||||
|
(int)neighbor_bss_node->pBssDescription->channelId);
|
||||||
|
|
||||||
|
if (QDF_STATUS_SUCCESS != status) {
|
||||||
|
sms_log(mac_ctx, LOGE,
|
||||||
|
FL("Return failed preauth request status %d"),
|
||||||
|
status);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
neighbor_roam_info->FTRoamInfo.preauthRspPending = true;
|
||||||
|
|
||||||
|
/* Increment the preauth retry count */
|
||||||
|
neighbor_roam_info->FTRoamInfo.numPreAuthRetries++;
|
||||||
|
|
||||||
|
/* Transition the state to preauthenticating */
|
||||||
|
csr_neighbor_middle_of_roaming(mac_ctx, session_id);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
Reference in New Issue
Block a user