qcacld-3.0: Move Reassociation utils into a separate file
Move all the reassociation related utilities to a separate file for easy maintenance across different projects CRs-Fixed: 978905 Change-Id: I86809ac48659dc91222624fec616bab6533d75dd
这个提交包含在:
提交者
Gerrit - the friendly Code Review server
父节点
c3843188c5
当前提交
99ff7f0b1a
1
Kbuild
1
Kbuild
@@ -401,6 +401,7 @@ MAC_LIM_OBJS := $(MAC_SRC_DIR)/pe/lim/lim_aid_mgmt.o \
|
||||
$(MAC_SRC_DIR)/pe/lim/lim_admit_control.o \
|
||||
$(MAC_SRC_DIR)/pe/lim/lim_api.o \
|
||||
$(MAC_SRC_DIR)/pe/lim/lim_assoc_utils.o \
|
||||
$(MAC_SRC_DIR)/pe/lim/lim_reassoc_utils.o \
|
||||
$(MAC_SRC_DIR)/pe/lim/lim_debug.o \
|
||||
$(MAC_SRC_DIR)/pe/lim/lim_ft.o \
|
||||
$(MAC_SRC_DIR)/pe/lim/lim_ft_preauth.o \
|
||||
|
@@ -1346,120 +1346,6 @@ lim_decide_short_slot(tpAniSirGlobal mac_ctx, tpDphHashNode sta_ds,
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
lim_post_reassoc_failure(tpAniSirGlobal pMac,
|
||||
tSirResultCodes resultCode,
|
||||
uint16_t protStatusCode, tpPESession psessionEntry)
|
||||
{
|
||||
tLimMlmReassocCnf mlmReassocCnf;
|
||||
|
||||
psessionEntry->limMlmState = eLIM_MLM_LINK_ESTABLISHED_STATE;
|
||||
MTRACE(mac_trace
|
||||
(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId,
|
||||
eLIM_MLM_LINK_ESTABLISHED_STATE));
|
||||
|
||||
/* 'Change' timer for future activations */
|
||||
lim_deactivate_and_change_timer(pMac, eLIM_REASSOC_FAIL_TIMER);
|
||||
|
||||
mlmReassocCnf.resultCode = resultCode;
|
||||
mlmReassocCnf.protStatusCode = protStatusCode;
|
||||
/* Update PE session Id */
|
||||
mlmReassocCnf.sessionId = psessionEntry->peSessionId;
|
||||
lim_post_sme_message(pMac,
|
||||
LIM_MLM_REASSOC_CNF, (uint32_t *) &mlmReassocCnf);
|
||||
} /*** end lim_post_reassoc_failure() ***/
|
||||
|
||||
/**
|
||||
* lim_restore_pre_reassoc_state()
|
||||
*
|
||||
***FUNCTION:
|
||||
* This function is called on STA role whenever Reasociation
|
||||
* Response with a reject code is received from AP.
|
||||
*
|
||||
***LOGIC:
|
||||
* Reassociation failure timer is stopped, Old (or current) AP's
|
||||
* context is restored both at Polaris & software
|
||||
*
|
||||
***ASSUMPTIONS:
|
||||
*
|
||||
***NOTE:
|
||||
*
|
||||
* @param pMac - Pointer to Global MAC structure
|
||||
* @param resultCode - Result code that specifies why Reassociation
|
||||
* attemp failed
|
||||
*
|
||||
* @return None
|
||||
*/
|
||||
|
||||
void
|
||||
lim_restore_pre_reassoc_state(tpAniSirGlobal pMac,
|
||||
tSirResultCodes resultCode,
|
||||
uint16_t protStatusCode, tpPESession psessionEntry)
|
||||
{
|
||||
tLimMlmReassocCnf mlmReassocCnf;
|
||||
|
||||
lim_log(pMac, LOG1,
|
||||
FL("sessionid: %d protStatusCode: %d resultCode: %d"),
|
||||
psessionEntry->smeSessionId, protStatusCode, resultCode);
|
||||
|
||||
psessionEntry->limMlmState = eLIM_MLM_LINK_ESTABLISHED_STATE;
|
||||
MTRACE(mac_trace
|
||||
(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId,
|
||||
eLIM_MLM_LINK_ESTABLISHED_STATE));
|
||||
|
||||
/* 'Change' timer for future activations */
|
||||
lim_deactivate_and_change_timer(pMac, eLIM_REASSOC_FAIL_TIMER);
|
||||
|
||||
lim_set_channel(pMac, psessionEntry->currentOperChannel,
|
||||
psessionEntry->ch_center_freq_seg0,
|
||||
psessionEntry->ch_center_freq_seg1,
|
||||
psessionEntry->ch_width,
|
||||
psessionEntry->maxTxPower,
|
||||
psessionEntry->peSessionId);
|
||||
|
||||
/** @ToDo : Need to Integrate the STOP the DataTransfer to the AP from 11H code */
|
||||
|
||||
mlmReassocCnf.resultCode = resultCode;
|
||||
mlmReassocCnf.protStatusCode = protStatusCode;
|
||||
/* Update PE session Id */
|
||||
mlmReassocCnf.sessionId = psessionEntry->peSessionId;
|
||||
lim_post_sme_message(pMac,
|
||||
LIM_MLM_REASSOC_CNF, (uint32_t *) &mlmReassocCnf);
|
||||
} /*** end lim_restore_pre_reassoc_state() ***/
|
||||
|
||||
/**
|
||||
* lim_is_reassoc_in_progress()
|
||||
*
|
||||
***FUNCTION:
|
||||
* This function is called to see if STA is in wt-reassoc-rsp state.
|
||||
*
|
||||
***LOGIC:
|
||||
*
|
||||
***ASSUMPTIONS:
|
||||
*
|
||||
***NOTE:
|
||||
*
|
||||
* @param pMac - Pointer to Global MAC structure
|
||||
*
|
||||
* @return true When STA is waiting for Reassoc response from AP \n
|
||||
* else false
|
||||
*/
|
||||
|
||||
bool lim_is_reassoc_in_progress(tpAniSirGlobal pMac, tpPESession psessionEntry)
|
||||
{
|
||||
if (psessionEntry == NULL) {
|
||||
return false;
|
||||
}
|
||||
if ((LIM_IS_STA_ROLE(psessionEntry) ||
|
||||
LIM_IS_BT_AMP_STA_ROLE(psessionEntry)) &&
|
||||
((psessionEntry->limSmeState == eLIM_SME_WT_REASSOC_STATE) ||
|
||||
(psessionEntry->limSmeState ==
|
||||
eLIM_SME_WT_REASSOC_LINK_FAIL_STATE)))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
} /*** end lim_is_reassoc_in_progress() ***/
|
||||
|
||||
/**
|
||||
* lim_populate_vht_mcs_set - function to populate vht mcs rate set
|
||||
* @mac_ctx: pointer to global mac structure
|
||||
@@ -2724,59 +2610,6 @@ lim_del_sta(tpAniSirGlobal pMac,
|
||||
return retCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* lim_add_ft_sta_self()- function to add STA once we have connected with a
|
||||
* new AP
|
||||
* @mac_ctx: pointer to global mac structure
|
||||
* @assoc_id: association id for the station connection
|
||||
* @session_entry: pe session entr
|
||||
*
|
||||
* This function is called to add a STA once we have connected with a new
|
||||
* AP, that we have performed an FT to.
|
||||
*
|
||||
* The Add STA Response is created and now after the ADD Bss Is Successful
|
||||
* we add the self sta. We update with the association id from the reassoc
|
||||
* response from the AP.
|
||||
*
|
||||
* Return: eSIR_SUCCESS on success else eSirRetStatus failure codes
|
||||
*/
|
||||
tSirRetStatus lim_add_ft_sta_self(tpAniSirGlobal mac_ctx, uint16_t assoc_id,
|
||||
tpPESession session_entry)
|
||||
{
|
||||
tpAddStaParams add_sta_params = NULL;
|
||||
tSirRetStatus ret_code = eSIR_SUCCESS;
|
||||
tSirMsgQ msg_q;
|
||||
|
||||
add_sta_params = session_entry->ftPEContext.pAddStaReq;
|
||||
add_sta_params->assocId = assoc_id;
|
||||
add_sta_params->smesessionId = session_entry->smeSessionId;
|
||||
|
||||
msg_q.type = WMA_ADD_STA_REQ;
|
||||
msg_q.reserved = 0;
|
||||
msg_q.bodyptr = add_sta_params;
|
||||
msg_q.bodyval = 0;
|
||||
|
||||
QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
|
||||
"Sending WMA_ADD_STA_REQ (aid %d)",
|
||||
add_sta_params->assocId);
|
||||
MTRACE(mac_trace_msg_tx(mac_ctx, session_entry->peSessionId,
|
||||
msg_q.type));
|
||||
|
||||
session_entry->limPrevMlmState = session_entry->limMlmState;
|
||||
MTRACE(mac_trace(mac_ctx, TRACE_CODE_MLM_STATE,
|
||||
session_entry->peSessionId, eLIM_MLM_WT_ADD_STA_RSP_STATE));
|
||||
session_entry->limMlmState = eLIM_MLM_WT_ADD_STA_RSP_STATE;
|
||||
ret_code = wma_post_ctrl_msg(mac_ctx, &msg_q);
|
||||
if (eSIR_SUCCESS != ret_code) {
|
||||
lim_log(mac_ctx, LOGE,
|
||||
FL("Posting WMA_ADD_STA_REQ to HAL failed, reason=%X"),
|
||||
ret_code);
|
||||
qdf_mem_free(add_sta_params);
|
||||
}
|
||||
|
||||
session_entry->ftPEContext.pAddStaReq = NULL;
|
||||
return ret_code;
|
||||
}
|
||||
|
||||
/**
|
||||
* lim_add_sta_self()
|
||||
|
@@ -84,6 +84,9 @@ lim_populate_matching_rate_set(tpAniSirGlobal pMac,
|
||||
uint8_t *pSupportedMCSSet,
|
||||
tpPESession psessionEntry,
|
||||
tDot11fIEVHTCaps * pVHTCaps);
|
||||
void lim_handle_del_bss_in_re_assoc_context(tpAniSirGlobal pMac,
|
||||
tpDphHashNode pStaDs, tpPESession psessionEntry);
|
||||
|
||||
#define MCSMAPMASK1x1 0x3
|
||||
#define MCSMAPMASK2x2 0xC
|
||||
|
||||
|
@@ -302,55 +302,6 @@ void lim_update_assoc_sta_datas(tpAniSirGlobal mac_ctx,
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @function : lim_update_re_assoc_globals
|
||||
*
|
||||
* @brief : This function is called to Update the Globals (LIM) during ReAssoc.
|
||||
*
|
||||
***LOGIC:
|
||||
*
|
||||
***ASSUMPTIONS:
|
||||
*
|
||||
***NOTE:
|
||||
*
|
||||
* @param pMac - Pointer to Global MAC structure
|
||||
* @param pAssocRsp - Pointer to Association Response Structure
|
||||
*
|
||||
* @return None
|
||||
*/
|
||||
|
||||
void lim_update_re_assoc_globals(tpAniSirGlobal pMac, tpSirAssocRsp pAssocRsp,
|
||||
tpPESession psessionEntry)
|
||||
{
|
||||
/* Update the current Bss Information */
|
||||
qdf_mem_copy(psessionEntry->bssId,
|
||||
psessionEntry->limReAssocbssId, sizeof(tSirMacAddr));
|
||||
psessionEntry->currentOperChannel = psessionEntry->limReassocChannelId;
|
||||
psessionEntry->htSecondaryChannelOffset =
|
||||
psessionEntry->reAssocHtSupportedChannelWidthSet;
|
||||
psessionEntry->htRecommendedTxWidthSet =
|
||||
psessionEntry->reAssocHtRecommendedTxWidthSet;
|
||||
psessionEntry->htSecondaryChannelOffset =
|
||||
psessionEntry->reAssocHtSecondaryChannelOffset;
|
||||
psessionEntry->limCurrentBssCaps = psessionEntry->limReassocBssCaps;
|
||||
psessionEntry->limCurrentBssQosCaps =
|
||||
psessionEntry->limReassocBssQosCaps;
|
||||
psessionEntry->limCurrentBssPropCap =
|
||||
psessionEntry->limReassocBssPropCap;
|
||||
|
||||
qdf_mem_copy((uint8_t *) &psessionEntry->ssId,
|
||||
(uint8_t *) &psessionEntry->limReassocSSID,
|
||||
psessionEntry->limReassocSSID.length + 1);
|
||||
|
||||
/* Store assigned AID for TIM processing */
|
||||
psessionEntry->limAID = pAssocRsp->aid & 0x3FFF;
|
||||
/** Set the State Back to ReAssoc Rsp*/
|
||||
psessionEntry->limMlmState = eLIM_MLM_WT_REASSOC_RSP_STATE;
|
||||
MTRACE(mac_trace
|
||||
(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId,
|
||||
psessionEntry->limMlmState));
|
||||
|
||||
}
|
||||
/**
|
||||
* lim_update_ric_data() - update session with ric data
|
||||
* @mac_ctx: Pointer to Global MAC structure
|
||||
@@ -398,7 +349,6 @@ static void lim_update_ric_data(tpAniSirGlobal mac_ctx,
|
||||
}
|
||||
|
||||
#ifdef FEATURE_WLAN_ESE
|
||||
|
||||
/**
|
||||
* lim_update_ese_tspec() - update session with Tspec info.
|
||||
* @mac_ctx: Pointer to Global MAC structure
|
||||
|
@@ -69,9 +69,6 @@ void lim_process_mlm_disassoc_cnf(tpAniSirGlobal, uint32_t *);
|
||||
void lim_process_mlm_deauth_ind(tpAniSirGlobal, uint32_t *);
|
||||
void lim_process_mlm_deauth_cnf(tpAniSirGlobal, uint32_t *);
|
||||
void lim_process_mlm_purge_sta_ind(tpAniSirGlobal, uint32_t *);
|
||||
static void lim_handle_del_bss_in_re_assoc_context(tpAniSirGlobal pMac,
|
||||
tpDphHashNode pStaDs,
|
||||
tpPESession psessionEntry);
|
||||
void lim_get_session_info(tpAniSirGlobal pMac, uint8_t *, uint8_t *, uint16_t *);
|
||||
static void
|
||||
lim_process_btamp_add_bss_rsp(tpAniSirGlobal pMac, tpSirMsgQ limMsgQ,
|
||||
@@ -3274,164 +3271,6 @@ void lim_process_switch_channel_rsp(tpAniSirGlobal pMac, void *body)
|
||||
qdf_mem_free(body);
|
||||
}
|
||||
|
||||
/**
|
||||
* @function : lim_handle_del_bss_in_re_assoc_context
|
||||
* @brief : While Processing the ReAssociation Response Frame in STA,
|
||||
* a. immediately after receiving the Reassoc Response the RxCleanUp is
|
||||
* being issued and the end of DelBSS the new BSS is being added.
|
||||
*
|
||||
* b .If an AP rejects the ReAssociation (Disassoc / Deauth) with some context
|
||||
* change, We need to update CSR with ReAssocCNF Response with the
|
||||
* ReAssoc Fail and the reason Code, that is also being handled in the DELBSS
|
||||
* context only
|
||||
*
|
||||
* @param : pMac - tpAniSirGlobal
|
||||
* pStaDs - Station Descriptor
|
||||
*
|
||||
* @return : none
|
||||
*/
|
||||
static void
|
||||
lim_handle_del_bss_in_re_assoc_context(tpAniSirGlobal pMac, tpDphHashNode pStaDs,
|
||||
tpPESession psessionEntry)
|
||||
{
|
||||
tLimMlmReassocCnf mlmReassocCnf;
|
||||
/*
|
||||
* Skipped the DeleteDPH Hash Entry as we need it for the new BSS
|
||||
* Set the MlmState to IDLE
|
||||
*/
|
||||
psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
|
||||
/* Update PE session Id */
|
||||
mlmReassocCnf.sessionId = psessionEntry->peSessionId;
|
||||
switch (psessionEntry->limSmeState) {
|
||||
case eLIM_SME_WT_REASSOC_STATE:
|
||||
{
|
||||
tpSirAssocRsp assocRsp;
|
||||
tpDphHashNode pStaDs;
|
||||
tSirRetStatus retStatus = eSIR_SUCCESS;
|
||||
tpSchBeaconStruct beacon_struct;
|
||||
beacon_struct = qdf_mem_malloc(sizeof(tSchBeaconStruct));
|
||||
if (NULL == beacon_struct) {
|
||||
lim_log(pMac, LOGE, FL("beaconStruct alloc failed"));
|
||||
mlmReassocCnf.resultCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
eSIR_MAC_UNSPEC_FAILURE_STATUS;
|
||||
lim_delete_dph_hash_entry(pMac, psessionEntry->bssId,
|
||||
DPH_STA_HASH_INDEX_PEER, psessionEntry);
|
||||
goto error;
|
||||
}
|
||||
/* Delete the older STA Table entry */
|
||||
lim_delete_dph_hash_entry(pMac, psessionEntry->bssId,
|
||||
DPH_STA_HASH_INDEX_PEER, psessionEntry);
|
||||
/*
|
||||
* Add an entry for AP to hash table
|
||||
* maintained by DPH module
|
||||
*/
|
||||
pStaDs = dph_add_hash_entry(pMac,
|
||||
psessionEntry->limReAssocbssId,
|
||||
DPH_STA_HASH_INDEX_PEER,
|
||||
&psessionEntry->dph.dphHashTable);
|
||||
if (pStaDs == NULL) {
|
||||
/* Could not add hash table entry */
|
||||
lim_log(pMac, LOGE,
|
||||
FL("could not add hash entry at DPH for "));
|
||||
lim_print_mac_addr(pMac,
|
||||
psessionEntry->limReAssocbssId, LOGE);
|
||||
mlmReassocCnf.resultCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
mlmReassocCnf.protStatusCode = eSIR_SME_SUCCESS;
|
||||
qdf_mem_free(beacon_struct);
|
||||
goto error;
|
||||
}
|
||||
/*
|
||||
* While Processing the ReAssoc Response Frame the ReAssocRsp Frame
|
||||
* is being stored to be used here for sending ADDBSS
|
||||
*/
|
||||
assocRsp =
|
||||
(tpSirAssocRsp) psessionEntry->limAssocResponseData;
|
||||
lim_update_assoc_sta_datas(pMac, pStaDs, assocRsp,
|
||||
psessionEntry);
|
||||
lim_update_re_assoc_globals(pMac, assocRsp, psessionEntry);
|
||||
lim_extract_ap_capabilities(pMac,
|
||||
(uint8_t *) psessionEntry->pLimReAssocReq->bssDescription.ieFields,
|
||||
lim_get_ielen_from_bss_description(
|
||||
&psessionEntry->pLimReAssocReq->bssDescription),
|
||||
beacon_struct);
|
||||
if (pMac->lim.gLimProtectionControl !=
|
||||
WNI_CFG_FORCE_POLICY_PROTECTION_DISABLE)
|
||||
lim_decide_sta_protection_on_assoc(pMac,
|
||||
beacon_struct,
|
||||
psessionEntry);
|
||||
if (beacon_struct->erpPresent) {
|
||||
if (beacon_struct->erpIEInfo.barkerPreambleMode)
|
||||
psessionEntry->beaconParams.fShortPreamble = 0;
|
||||
else
|
||||
psessionEntry->beaconParams.fShortPreamble = 1;
|
||||
}
|
||||
/*
|
||||
* updateBss flag is false, as in this case, PE is first
|
||||
* deleting the existing BSS and then adding a new one
|
||||
*/
|
||||
if (eSIR_SUCCESS !=
|
||||
lim_sta_send_add_bss(pMac, assocRsp, beacon_struct,
|
||||
&psessionEntry->pLimReAssocReq->bssDescription,
|
||||
false, psessionEntry)) {
|
||||
lim_log(pMac, LOGE,
|
||||
FL("Posting ADDBSS in the ReAssocCtx has Failed "));
|
||||
retStatus = eSIR_FAILURE;
|
||||
}
|
||||
if (retStatus != eSIR_SUCCESS) {
|
||||
mlmReassocCnf.resultCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
eSIR_MAC_UNSPEC_FAILURE_STATUS;
|
||||
qdf_mem_free(assocRsp);
|
||||
pMac->lim.gLimAssocResponseData = NULL;
|
||||
qdf_mem_free(beacon_struct);
|
||||
goto error;
|
||||
}
|
||||
qdf_mem_free(assocRsp);
|
||||
qdf_mem_free(beacon_struct);
|
||||
psessionEntry->limAssocResponseData = NULL;
|
||||
}
|
||||
break;
|
||||
case eLIM_SME_WT_REASSOC_LINK_FAIL_STATE:
|
||||
{
|
||||
/** Case wherein the DisAssoc / Deauth
|
||||
* being sent as response to ReAssoc Req*/
|
||||
/** Send the Reason code as the same received in Disassoc / Deauth Frame*/
|
||||
mlmReassocCnf.resultCode =
|
||||
pStaDs->mlmStaContext.disassocReason;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
pStaDs->mlmStaContext.cleanupTrigger;
|
||||
/** Set the SME State back to WT_Reassoc State*/
|
||||
psessionEntry->limSmeState = eLIM_SME_WT_REASSOC_STATE;
|
||||
lim_delete_dph_hash_entry(pMac, pStaDs->staAddr,
|
||||
pStaDs->assocId, psessionEntry);
|
||||
if (LIM_IS_STA_ROLE(psessionEntry) ||
|
||||
LIM_IS_BT_AMP_STA_ROLE(psessionEntry)) {
|
||||
psessionEntry->limMlmState =
|
||||
eLIM_MLM_IDLE_STATE;
|
||||
}
|
||||
lim_post_sme_message(pMac, LIM_MLM_REASSOC_CNF,
|
||||
(uint32_t *) &mlmReassocCnf);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
lim_log(pMac, LOGE,
|
||||
FL("DelBss is being invoked in the wrong system Role /unhandled SME State"));
|
||||
|
||||
mlmReassocCnf.resultCode = eSIR_SME_REFUSED;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
|
||||
goto error;
|
||||
}
|
||||
return;
|
||||
error:
|
||||
lim_post_sme_message(pMac, LIM_MLM_REASSOC_CNF,
|
||||
(uint32_t *) &mlmReassocCnf);
|
||||
}
|
||||
|
||||
/* Added For BT -AMP Support */
|
||||
static void
|
||||
lim_process_btamp_add_bss_rsp(tpAniSirGlobal pMac, tpSirMsgQ limMsgQ,
|
||||
@@ -3485,169 +3324,6 @@ end:
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @function : lim_handle_add_bss_in_re_assoc_context
|
||||
* @brief : While Processing the ReAssociation Response Frame in STA,
|
||||
* a. immediately after receiving the Reassoc Response the RxCleanUp is
|
||||
* being issued and the end of DelBSS the new BSS is being added.
|
||||
*
|
||||
* b .If an AP rejects the ReAssociation (Disassoc / Deauth) with some context
|
||||
* change, We need to update CSR with ReAssocCNF Response with the
|
||||
* ReAssoc Fail and the reason Code, that is also being handled in the DELBSS
|
||||
* context only
|
||||
*
|
||||
* @param : pMac - tpAniSirGlobal
|
||||
* pStaDs - Station Descriptor
|
||||
*
|
||||
* @return : none
|
||||
*/
|
||||
void
|
||||
lim_handle_add_bss_in_re_assoc_context(tpAniSirGlobal pMac, tpDphHashNode pStaDs,
|
||||
tpPESession psessionEntry)
|
||||
{
|
||||
tLimMlmReassocCnf mlmReassocCnf;
|
||||
/** Skipped the DeleteDPH Hash Entry as we need it for the new BSS*/
|
||||
/** Set the MlmState to IDLE*/
|
||||
psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
|
||||
MTRACE(mac_trace
|
||||
(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId,
|
||||
psessionEntry->limMlmState));
|
||||
switch (psessionEntry->limSmeState) {
|
||||
case eLIM_SME_WT_REASSOC_STATE: {
|
||||
tpSirAssocRsp assocRsp;
|
||||
tpDphHashNode pStaDs;
|
||||
tSirRetStatus retStatus = eSIR_SUCCESS;
|
||||
tSchBeaconStruct *pBeaconStruct;
|
||||
pBeaconStruct =
|
||||
qdf_mem_malloc(sizeof(tSchBeaconStruct));
|
||||
if (NULL == pBeaconStruct) {
|
||||
lim_log(pMac, LOGE,
|
||||
FL
|
||||
("Unable to allocate memory in lim_handle_add_bss_in_re_assoc_context"));
|
||||
mlmReassocCnf.resultCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
goto Error;
|
||||
}
|
||||
/* Get the AP entry from DPH hash table */
|
||||
pStaDs =
|
||||
dph_get_hash_entry(pMac, DPH_STA_HASH_INDEX_PEER,
|
||||
&psessionEntry->dph.dphHashTable);
|
||||
if (pStaDs == NULL) {
|
||||
PELOGE(lim_log
|
||||
(pMac, LOGE,
|
||||
FL
|
||||
("Fail to get STA PEER entry from hash"));
|
||||
)
|
||||
mlmReassocCnf.resultCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
mlmReassocCnf.protStatusCode = eSIR_SME_SUCCESS;
|
||||
qdf_mem_free(pBeaconStruct);
|
||||
goto Error;
|
||||
}
|
||||
/** While Processing the ReAssoc Response Frame the ReAssocRsp Frame
|
||||
* is being stored to be used here for sending ADDBSS
|
||||
*/
|
||||
assocRsp =
|
||||
(tpSirAssocRsp) psessionEntry->limAssocResponseData;
|
||||
lim_update_assoc_sta_datas(pMac, pStaDs, assocRsp,
|
||||
psessionEntry);
|
||||
lim_update_re_assoc_globals(pMac, assocRsp, psessionEntry);
|
||||
lim_extract_ap_capabilities(pMac,
|
||||
(uint8_t *) psessionEntry->
|
||||
pLimReAssocReq->bssDescription.
|
||||
ieFields,
|
||||
lim_get_ielen_from_bss_description
|
||||
(&psessionEntry->
|
||||
pLimReAssocReq->
|
||||
bssDescription),
|
||||
pBeaconStruct);
|
||||
if (pMac->lim.gLimProtectionControl !=
|
||||
WNI_CFG_FORCE_POLICY_PROTECTION_DISABLE)
|
||||
lim_decide_sta_protection_on_assoc(pMac,
|
||||
pBeaconStruct,
|
||||
psessionEntry);
|
||||
|
||||
if (pBeaconStruct->erpPresent) {
|
||||
if (pBeaconStruct->erpIEInfo.barkerPreambleMode)
|
||||
psessionEntry->beaconParams.
|
||||
fShortPreamble = 0;
|
||||
else
|
||||
psessionEntry->beaconParams.
|
||||
fShortPreamble = 1;
|
||||
}
|
||||
|
||||
psessionEntry->isNonRoamReassoc = 1;
|
||||
if (eSIR_SUCCESS !=
|
||||
lim_sta_send_add_bss(pMac, assocRsp, pBeaconStruct,
|
||||
&psessionEntry->pLimReAssocReq->
|
||||
bssDescription, true,
|
||||
psessionEntry)) {
|
||||
lim_log(pMac, LOGE,
|
||||
FL
|
||||
("Posting ADDBSS in the ReAssocContext has Failed "));
|
||||
retStatus = eSIR_FAILURE;
|
||||
}
|
||||
if (retStatus != eSIR_SUCCESS) {
|
||||
mlmReassocCnf.resultCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
eSIR_MAC_UNSPEC_FAILURE_STATUS;
|
||||
qdf_mem_free(assocRsp);
|
||||
pMac->lim.gLimAssocResponseData = NULL;
|
||||
qdf_mem_free(pBeaconStruct);
|
||||
goto Error;
|
||||
}
|
||||
qdf_mem_free(assocRsp);
|
||||
psessionEntry->limAssocResponseData = NULL;
|
||||
qdf_mem_free(pBeaconStruct);
|
||||
}
|
||||
break;
|
||||
case eLIM_SME_WT_REASSOC_LINK_FAIL_STATE: {
|
||||
/* Case wherein the DisAssoc / Deauth
|
||||
* being sent as response to ReAssoc Req
|
||||
* Send the Reason code as the same received
|
||||
* in Disassoc / Deauth Frame
|
||||
*/
|
||||
mlmReassocCnf.resultCode =
|
||||
pStaDs->mlmStaContext.disassocReason;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
pStaDs->mlmStaContext.cleanupTrigger;
|
||||
/** Set the SME State back to WT_Reassoc State*/
|
||||
psessionEntry->limSmeState = eLIM_SME_WT_REASSOC_STATE;
|
||||
lim_delete_dph_hash_entry(pMac, pStaDs->staAddr,
|
||||
pStaDs->assocId, psessionEntry);
|
||||
if (LIM_IS_STA_ROLE(psessionEntry)) {
|
||||
psessionEntry->limMlmState =
|
||||
eLIM_MLM_IDLE_STATE;
|
||||
MTRACE(mac_trace
|
||||
(pMac, TRACE_CODE_MLM_STATE,
|
||||
psessionEntry->peSessionId,
|
||||
psessionEntry->limMlmState));
|
||||
}
|
||||
|
||||
lim_post_sme_message(pMac, LIM_MLM_REASSOC_CNF,
|
||||
(uint32_t *) &mlmReassocCnf);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
PELOGE(lim_log
|
||||
(pMac, LOGE,
|
||||
FL
|
||||
("DelBss is being invoked in the wrong system Role /unhandled SME State"));
|
||||
)
|
||||
mlmReassocCnf.resultCode = eSIR_SME_REFUSED;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
|
||||
goto Error;
|
||||
}
|
||||
return;
|
||||
Error:
|
||||
lim_post_sme_message(pMac, LIM_MLM_REASSOC_CNF,
|
||||
(uint32_t *) &mlmReassocCnf);
|
||||
}
|
||||
|
||||
void lim_send_beacon_ind(tpAniSirGlobal pMac, tpPESession psessionEntry)
|
||||
{
|
||||
tBeaconGenParams *pBeaconGenParams = NULL;
|
||||
|
@@ -0,0 +1,561 @@
|
||||
/*
|
||||
* 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: lim_reassoc_utils.c
|
||||
*
|
||||
* Host based roaming re-association utilities
|
||||
*/
|
||||
|
||||
#include "cds_api.h"
|
||||
#include "ani_global.h"
|
||||
#include "wni_api.h"
|
||||
#include "sir_common.h"
|
||||
|
||||
#include "wni_cfg.h"
|
||||
#include "cfg_api.h"
|
||||
|
||||
#include "sch_api.h"
|
||||
#include "utils_api.h"
|
||||
#include "lim_utils.h"
|
||||
#include "lim_assoc_utils.h"
|
||||
#include "lim_security_utils.h"
|
||||
#include "lim_ser_des_utils.h"
|
||||
#include "lim_sta_hash_api.h"
|
||||
#include "lim_admit_control.h"
|
||||
#include "lim_send_messages.h"
|
||||
#include "lim_ibss_peer_mgmt.h"
|
||||
#include "lim_ft_defs.h"
|
||||
#include "lim_session.h"
|
||||
|
||||
#include "qdf_types.h"
|
||||
#include "wma_types.h"
|
||||
#include "lim_types.h"
|
||||
|
||||
/**
|
||||
* lim_update_re_assoc_globals() - Update reassoc global data
|
||||
* @pMac: Global MAC context
|
||||
* @pAssocRsp: Reassociation response data
|
||||
* @psessionEntry: PE Session
|
||||
*
|
||||
* This function is called to Update the Globals (LIM) during ReAssoc.
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
|
||||
void lim_update_re_assoc_globals(tpAniSirGlobal pMac, tpSirAssocRsp pAssocRsp,
|
||||
tpPESession psessionEntry)
|
||||
{
|
||||
/* Update the current Bss Information */
|
||||
qdf_mem_copy(psessionEntry->bssId,
|
||||
psessionEntry->limReAssocbssId, sizeof(tSirMacAddr));
|
||||
psessionEntry->currentOperChannel = psessionEntry->limReassocChannelId;
|
||||
psessionEntry->htSecondaryChannelOffset =
|
||||
psessionEntry->reAssocHtSupportedChannelWidthSet;
|
||||
psessionEntry->htRecommendedTxWidthSet =
|
||||
psessionEntry->reAssocHtRecommendedTxWidthSet;
|
||||
psessionEntry->htSecondaryChannelOffset =
|
||||
psessionEntry->reAssocHtSecondaryChannelOffset;
|
||||
psessionEntry->limCurrentBssCaps = psessionEntry->limReassocBssCaps;
|
||||
psessionEntry->limCurrentBssQosCaps =
|
||||
psessionEntry->limReassocBssQosCaps;
|
||||
psessionEntry->limCurrentBssPropCap =
|
||||
psessionEntry->limReassocBssPropCap;
|
||||
|
||||
qdf_mem_copy((uint8_t *) &psessionEntry->ssId,
|
||||
(uint8_t *) &psessionEntry->limReassocSSID,
|
||||
psessionEntry->limReassocSSID.length + 1);
|
||||
|
||||
/* Store assigned AID for TIM processing */
|
||||
psessionEntry->limAID = pAssocRsp->aid & 0x3FFF;
|
||||
/** Set the State Back to ReAssoc Rsp*/
|
||||
psessionEntry->limMlmState = eLIM_MLM_WT_REASSOC_RSP_STATE;
|
||||
MTRACE(mac_trace
|
||||
(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId,
|
||||
psessionEntry->limMlmState));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @lim_handle_del_bss_in_re_assoc_context() - DEL BSS during reassociation
|
||||
* @pMac: Global MAC Context
|
||||
* @pStaDs: Station Hash entry
|
||||
* @psessionEntry: PE Session
|
||||
*
|
||||
* While Processing the ReAssociation Response Frame in STA,
|
||||
* a.immediately after receiving the Reassoc Response the RxCleanUp is
|
||||
* being issued and the end of DelBSS the new BSS is being added.
|
||||
*
|
||||
* b. If an AP rejects the ReAssociation (Disassoc/Deauth) with some context
|
||||
* change, We need to update CSR with ReAssocCNF Response with the
|
||||
* ReAssoc Fail and the reason Code, that is also being handled in the
|
||||
* DELBSS context only
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void lim_handle_del_bss_in_re_assoc_context(tpAniSirGlobal pMac,
|
||||
tpDphHashNode pStaDs, tpPESession psessionEntry)
|
||||
{
|
||||
tLimMlmReassocCnf mlmReassocCnf;
|
||||
tpSirBssDescription bss_desc;
|
||||
/*
|
||||
* Skipped the DeleteDPH Hash Entry as we need it for the new BSS
|
||||
* Set the MlmState to IDLE
|
||||
*/
|
||||
psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
|
||||
/* Update PE session Id */
|
||||
mlmReassocCnf.sessionId = psessionEntry->peSessionId;
|
||||
switch (psessionEntry->limSmeState) {
|
||||
case eLIM_SME_WT_REASSOC_STATE:
|
||||
{
|
||||
tpSirAssocRsp assocRsp;
|
||||
tpDphHashNode pStaDs;
|
||||
tSirRetStatus retStatus = eSIR_SUCCESS;
|
||||
tpSchBeaconStruct beacon_struct;
|
||||
beacon_struct = qdf_mem_malloc(sizeof(tSchBeaconStruct));
|
||||
if (NULL == beacon_struct) {
|
||||
lim_log(pMac, LOGE, FL("beaconStruct alloc failed"));
|
||||
mlmReassocCnf.resultCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
eSIR_MAC_UNSPEC_FAILURE_STATUS;
|
||||
lim_delete_dph_hash_entry(pMac, psessionEntry->bssId,
|
||||
DPH_STA_HASH_INDEX_PEER, psessionEntry);
|
||||
goto error;
|
||||
}
|
||||
/* Delete the older STA Table entry */
|
||||
lim_delete_dph_hash_entry(pMac, psessionEntry->bssId,
|
||||
DPH_STA_HASH_INDEX_PEER, psessionEntry);
|
||||
/*
|
||||
* Add an entry for AP to hash table
|
||||
* maintained by DPH module
|
||||
*/
|
||||
pStaDs = dph_add_hash_entry(pMac,
|
||||
psessionEntry->limReAssocbssId,
|
||||
DPH_STA_HASH_INDEX_PEER,
|
||||
&psessionEntry->dph.dphHashTable);
|
||||
if (pStaDs == NULL) {
|
||||
/* Could not add hash table entry */
|
||||
lim_log(pMac, LOGE,
|
||||
FL("could not add hash entry at DPH for "));
|
||||
lim_print_mac_addr(pMac,
|
||||
psessionEntry->limReAssocbssId, LOGE);
|
||||
mlmReassocCnf.resultCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
mlmReassocCnf.protStatusCode = eSIR_SME_SUCCESS;
|
||||
qdf_mem_free(beacon_struct);
|
||||
goto error;
|
||||
}
|
||||
/*
|
||||
* While Processing the ReAssoc Response Frame the Rsp Frame
|
||||
* is being stored to be used here for sending ADDBSS
|
||||
*/
|
||||
assocRsp =
|
||||
(tpSirAssocRsp) psessionEntry->limAssocResponseData;
|
||||
lim_update_assoc_sta_datas(pMac, pStaDs, assocRsp,
|
||||
psessionEntry);
|
||||
lim_update_re_assoc_globals(pMac, assocRsp, psessionEntry);
|
||||
bss_desc = &psessionEntry->pLimReAssocReq->bssDescription;
|
||||
lim_extract_ap_capabilities(pMac,
|
||||
(uint8_t *) bss_desc->ieFields,
|
||||
lim_get_ielen_from_bss_description(bss_desc),
|
||||
beacon_struct);
|
||||
if (pMac->lim.gLimProtectionControl !=
|
||||
WNI_CFG_FORCE_POLICY_PROTECTION_DISABLE)
|
||||
lim_decide_sta_protection_on_assoc(pMac,
|
||||
beacon_struct,
|
||||
psessionEntry);
|
||||
if (beacon_struct->erpPresent) {
|
||||
if (beacon_struct->erpIEInfo.barkerPreambleMode)
|
||||
psessionEntry->beaconParams.fShortPreamble = 0;
|
||||
else
|
||||
psessionEntry->beaconParams.fShortPreamble = 1;
|
||||
}
|
||||
/*
|
||||
* updateBss flag is false, as in this case, PE is first
|
||||
* deleting the existing BSS and then adding a new one
|
||||
*/
|
||||
if (eSIR_SUCCESS !=
|
||||
lim_sta_send_add_bss(pMac, assocRsp, beacon_struct,
|
||||
bss_desc,
|
||||
false, psessionEntry)) {
|
||||
lim_log(pMac, LOGE,
|
||||
FL("Posting ADDBSS in the ReAssocCtx Failed "));
|
||||
retStatus = eSIR_FAILURE;
|
||||
}
|
||||
if (retStatus != eSIR_SUCCESS) {
|
||||
mlmReassocCnf.resultCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
eSIR_MAC_UNSPEC_FAILURE_STATUS;
|
||||
qdf_mem_free(assocRsp);
|
||||
pMac->lim.gLimAssocResponseData = NULL;
|
||||
qdf_mem_free(beacon_struct);
|
||||
goto error;
|
||||
}
|
||||
qdf_mem_free(assocRsp);
|
||||
qdf_mem_free(beacon_struct);
|
||||
psessionEntry->limAssocResponseData = NULL;
|
||||
}
|
||||
break;
|
||||
case eLIM_SME_WT_REASSOC_LINK_FAIL_STATE:
|
||||
{
|
||||
mlmReassocCnf.resultCode =
|
||||
pStaDs->mlmStaContext.disassocReason;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
pStaDs->mlmStaContext.cleanupTrigger;
|
||||
/** Set the SME State back to WT_Reassoc State*/
|
||||
psessionEntry->limSmeState = eLIM_SME_WT_REASSOC_STATE;
|
||||
lim_delete_dph_hash_entry(pMac, pStaDs->staAddr,
|
||||
pStaDs->assocId, psessionEntry);
|
||||
if (LIM_IS_STA_ROLE(psessionEntry) ||
|
||||
LIM_IS_BT_AMP_STA_ROLE(psessionEntry)) {
|
||||
psessionEntry->limMlmState =
|
||||
eLIM_MLM_IDLE_STATE;
|
||||
}
|
||||
lim_post_sme_message(pMac, LIM_MLM_REASSOC_CNF,
|
||||
(uint32_t *) &mlmReassocCnf);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
lim_log(pMac, LOGE,
|
||||
FL("DelBss in wrong system Role and SME State"));
|
||||
|
||||
mlmReassocCnf.resultCode = eSIR_SME_REFUSED;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
|
||||
goto error;
|
||||
}
|
||||
return;
|
||||
error:
|
||||
lim_post_sme_message(pMac, LIM_MLM_REASSOC_CNF,
|
||||
(uint32_t *) &mlmReassocCnf);
|
||||
}
|
||||
|
||||
/**
|
||||
* @lim_handle_add_bss_in_re_assoc_context() - ADD BSS during reassociation
|
||||
* @pMac: Global MAC Context
|
||||
* @pStaDs: Station Hash entry
|
||||
* @psessionEntry: PE Session
|
||||
*
|
||||
* While Processing the ReAssociation Response Frame in STA,
|
||||
* a. immediately after receiving the Reassoc Response the RxCleanUp is
|
||||
* being issued and the end of DelBSS the new BSS is being added.
|
||||
*
|
||||
* b. If an AP rejects the ReAssociation (Disassoc/Deauth) with some context
|
||||
* change, We need to update CSR with ReAssocCNF Response with the
|
||||
* ReAssoc Fail and the reason Code, that is also being handled in the
|
||||
* DELBSS context only
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void lim_handle_add_bss_in_re_assoc_context(tpAniSirGlobal pMac,
|
||||
tpDphHashNode pStaDs, tpPESession psessionEntry)
|
||||
{
|
||||
tLimMlmReassocCnf mlmReassocCnf;
|
||||
/** Skipped the DeleteDPH Hash Entry as we need it for the new BSS*/
|
||||
/** Set the MlmState to IDLE*/
|
||||
psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
|
||||
MTRACE(mac_trace
|
||||
(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId,
|
||||
psessionEntry->limMlmState));
|
||||
switch (psessionEntry->limSmeState) {
|
||||
case eLIM_SME_WT_REASSOC_STATE: {
|
||||
tpSirAssocRsp assocRsp;
|
||||
tpDphHashNode pStaDs;
|
||||
tSirRetStatus retStatus = eSIR_SUCCESS;
|
||||
tSchBeaconStruct *pBeaconStruct;
|
||||
pBeaconStruct =
|
||||
qdf_mem_malloc(sizeof(tSchBeaconStruct));
|
||||
if (NULL == pBeaconStruct) {
|
||||
lim_log(pMac, LOGE, FL("Unable to allocate memory"));
|
||||
mlmReassocCnf.resultCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
goto Error;
|
||||
}
|
||||
/* Get the AP entry from DPH hash table */
|
||||
pStaDs =
|
||||
dph_get_hash_entry(pMac, DPH_STA_HASH_INDEX_PEER,
|
||||
&psessionEntry->dph.dphHashTable);
|
||||
if (pStaDs == NULL) {
|
||||
lim_log(pMac, LOGE,
|
||||
FL("Fail to get STA PEER entry from hash"));
|
||||
mlmReassocCnf.resultCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
mlmReassocCnf.protStatusCode = eSIR_SME_SUCCESS;
|
||||
qdf_mem_free(pBeaconStruct);
|
||||
goto Error;
|
||||
}
|
||||
/*
|
||||
* While Processing the ReAssoc Response Frame the Rsp Frame
|
||||
* is being stored to be used here for sending ADDBSS
|
||||
*/
|
||||
assocRsp =
|
||||
(tpSirAssocRsp) psessionEntry->limAssocResponseData;
|
||||
lim_update_assoc_sta_datas(pMac, pStaDs, assocRsp,
|
||||
psessionEntry);
|
||||
lim_update_re_assoc_globals(pMac, assocRsp, psessionEntry);
|
||||
lim_extract_ap_capabilities(pMac,
|
||||
(uint8_t *) psessionEntry->
|
||||
pLimReAssocReq->bssDescription.
|
||||
ieFields,
|
||||
lim_get_ielen_from_bss_description
|
||||
(&psessionEntry->
|
||||
pLimReAssocReq->
|
||||
bssDescription),
|
||||
pBeaconStruct);
|
||||
if (pMac->lim.gLimProtectionControl !=
|
||||
WNI_CFG_FORCE_POLICY_PROTECTION_DISABLE)
|
||||
lim_decide_sta_protection_on_assoc(pMac,
|
||||
pBeaconStruct,
|
||||
psessionEntry);
|
||||
|
||||
if (pBeaconStruct->erpPresent) {
|
||||
if (pBeaconStruct->erpIEInfo.barkerPreambleMode)
|
||||
psessionEntry->beaconParams.
|
||||
fShortPreamble = 0;
|
||||
else
|
||||
psessionEntry->beaconParams.
|
||||
fShortPreamble = 1;
|
||||
}
|
||||
|
||||
psessionEntry->isNonRoamReassoc = 1;
|
||||
if (eSIR_SUCCESS !=
|
||||
lim_sta_send_add_bss(pMac, assocRsp, pBeaconStruct,
|
||||
&psessionEntry->pLimReAssocReq->
|
||||
bssDescription, true,
|
||||
psessionEntry)) {
|
||||
lim_log(pMac, LOGE,
|
||||
FL("Post ADDBSS in the ReAssocCtxt Failed "));
|
||||
retStatus = eSIR_FAILURE;
|
||||
}
|
||||
if (retStatus != eSIR_SUCCESS) {
|
||||
mlmReassocCnf.resultCode =
|
||||
eSIR_SME_RESOURCES_UNAVAILABLE;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
eSIR_MAC_UNSPEC_FAILURE_STATUS;
|
||||
qdf_mem_free(assocRsp);
|
||||
pMac->lim.gLimAssocResponseData = NULL;
|
||||
qdf_mem_free(pBeaconStruct);
|
||||
goto Error;
|
||||
}
|
||||
qdf_mem_free(assocRsp);
|
||||
psessionEntry->limAssocResponseData = NULL;
|
||||
qdf_mem_free(pBeaconStruct);
|
||||
}
|
||||
break;
|
||||
case eLIM_SME_WT_REASSOC_LINK_FAIL_STATE: {
|
||||
/* Case wherein the DisAssoc / Deauth
|
||||
* being sent as response to ReAssoc Req
|
||||
* Send the Reason code as the same received
|
||||
* in Disassoc / Deauth Frame
|
||||
*/
|
||||
mlmReassocCnf.resultCode =
|
||||
pStaDs->mlmStaContext.disassocReason;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
pStaDs->mlmStaContext.cleanupTrigger;
|
||||
/** Set the SME State back to WT_Reassoc State*/
|
||||
psessionEntry->limSmeState = eLIM_SME_WT_REASSOC_STATE;
|
||||
lim_delete_dph_hash_entry(pMac, pStaDs->staAddr,
|
||||
pStaDs->assocId, psessionEntry);
|
||||
if (LIM_IS_STA_ROLE(psessionEntry)) {
|
||||
psessionEntry->limMlmState =
|
||||
eLIM_MLM_IDLE_STATE;
|
||||
MTRACE(mac_trace
|
||||
(pMac, TRACE_CODE_MLM_STATE,
|
||||
psessionEntry->peSessionId,
|
||||
psessionEntry->limMlmState));
|
||||
}
|
||||
|
||||
lim_post_sme_message(pMac, LIM_MLM_REASSOC_CNF,
|
||||
(uint32_t *) &mlmReassocCnf);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
lim_log(pMac, LOGE,
|
||||
FL("DelBss in the wrong system Role and SME State"));
|
||||
mlmReassocCnf.resultCode = eSIR_SME_REFUSED;
|
||||
mlmReassocCnf.protStatusCode =
|
||||
eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
|
||||
goto Error;
|
||||
}
|
||||
return;
|
||||
Error:
|
||||
lim_post_sme_message(pMac, LIM_MLM_REASSOC_CNF,
|
||||
(uint32_t *) &mlmReassocCnf);
|
||||
}
|
||||
|
||||
/**
|
||||
* lim_is_reassoc_in_progress() - Check if reassoiciation is in progress
|
||||
* @pMac: Global MAC Context
|
||||
* @psessionEntry: PE Session
|
||||
*
|
||||
* Return: true When STA is waiting for Reassoc response from AP
|
||||
* else false
|
||||
*/
|
||||
bool lim_is_reassoc_in_progress(tpAniSirGlobal pMac, tpPESession psessionEntry)
|
||||
{
|
||||
if (psessionEntry == NULL)
|
||||
return false;
|
||||
if ((LIM_IS_STA_ROLE(psessionEntry) ||
|
||||
LIM_IS_BT_AMP_STA_ROLE(psessionEntry)) &&
|
||||
((psessionEntry->limSmeState == eLIM_SME_WT_REASSOC_STATE) ||
|
||||
(psessionEntry->limSmeState ==
|
||||
eLIM_SME_WT_REASSOC_LINK_FAIL_STATE)))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* lim_add_ft_sta_self()- function to add STA once we have connected with a
|
||||
* new AP
|
||||
* @mac_ctx: pointer to global mac structure
|
||||
* @assoc_id: association id for the station connection
|
||||
* @session_entry: pe session entr
|
||||
*
|
||||
* This function is called to add a STA once we have connected with a new
|
||||
* AP, that we have performed an FT to.
|
||||
*
|
||||
* The Add STA Response is created and now after the ADD Bss Is Successful
|
||||
* we add the self sta. We update with the association id from the reassoc
|
||||
* response from the AP.
|
||||
*
|
||||
* Return: eSIR_SUCCESS on success else eSirRetStatus failure codes
|
||||
*/
|
||||
tSirRetStatus lim_add_ft_sta_self(tpAniSirGlobal mac_ctx, uint16_t assoc_id,
|
||||
tpPESession session_entry)
|
||||
{
|
||||
tpAddStaParams add_sta_params = NULL;
|
||||
tSirRetStatus ret_code = eSIR_SUCCESS;
|
||||
tSirMsgQ msg_q;
|
||||
|
||||
add_sta_params = session_entry->ftPEContext.pAddStaReq;
|
||||
add_sta_params->assocId = assoc_id;
|
||||
add_sta_params->smesessionId = session_entry->smeSessionId;
|
||||
|
||||
msg_q.type = WMA_ADD_STA_REQ;
|
||||
msg_q.reserved = 0;
|
||||
msg_q.bodyptr = add_sta_params;
|
||||
msg_q.bodyval = 0;
|
||||
|
||||
QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
|
||||
"Sending WMA_ADD_STA_REQ (aid %d)",
|
||||
add_sta_params->assocId);
|
||||
MTRACE(mac_trace_msg_tx(mac_ctx, session_entry->peSessionId,
|
||||
msg_q.type));
|
||||
|
||||
session_entry->limPrevMlmState = session_entry->limMlmState;
|
||||
MTRACE(mac_trace(mac_ctx, TRACE_CODE_MLM_STATE,
|
||||
session_entry->peSessionId, eLIM_MLM_WT_ADD_STA_RSP_STATE));
|
||||
session_entry->limMlmState = eLIM_MLM_WT_ADD_STA_RSP_STATE;
|
||||
ret_code = wma_post_ctrl_msg(mac_ctx, &msg_q);
|
||||
if (eSIR_SUCCESS != ret_code) {
|
||||
lim_log(mac_ctx, LOGE,
|
||||
FL("Posting WMA_ADD_STA_REQ to HAL failed, reason=%X"),
|
||||
ret_code);
|
||||
qdf_mem_free(add_sta_params);
|
||||
}
|
||||
|
||||
session_entry->ftPEContext.pAddStaReq = NULL;
|
||||
return ret_code;
|
||||
}
|
||||
|
||||
/**
|
||||
* lim_restore_pre_reassoc_state() - Restore the pre-association context
|
||||
* @pMac: Global MAC Context
|
||||
* @resultCode: Assoc response result
|
||||
* @protStatusCode: Internal protocol status code
|
||||
* @psessionEntry: PE Session
|
||||
*
|
||||
* This function is called on STA role whenever Reasociation
|
||||
* Response with a reject code is received from AP.
|
||||
* Reassociation failure timer is stopped, Old (or current) AP's
|
||||
* context is restored both at Polaris & software
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
|
||||
void
|
||||
lim_restore_pre_reassoc_state(tpAniSirGlobal pMac,
|
||||
tSirResultCodes resultCode, uint16_t protStatusCode,
|
||||
tpPESession psessionEntry)
|
||||
{
|
||||
tLimMlmReassocCnf mlmReassocCnf;
|
||||
|
||||
lim_log(pMac, LOG1,
|
||||
FL("sessionid: %d protStatusCode: %d resultCode: %d"),
|
||||
psessionEntry->smeSessionId, protStatusCode, resultCode);
|
||||
|
||||
psessionEntry->limMlmState = eLIM_MLM_LINK_ESTABLISHED_STATE;
|
||||
MTRACE(mac_trace
|
||||
(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId,
|
||||
eLIM_MLM_LINK_ESTABLISHED_STATE));
|
||||
|
||||
/* 'Change' timer for future activations */
|
||||
lim_deactivate_and_change_timer(pMac, eLIM_REASSOC_FAIL_TIMER);
|
||||
|
||||
lim_set_channel(pMac, psessionEntry->currentOperChannel,
|
||||
psessionEntry->ch_center_freq_seg0,
|
||||
psessionEntry->ch_center_freq_seg1,
|
||||
psessionEntry->ch_width,
|
||||
psessionEntry->maxTxPower,
|
||||
psessionEntry->peSessionId);
|
||||
|
||||
/* @ToDo:Need to Integrate the STOP the Dataxfer to AP from 11H code */
|
||||
|
||||
mlmReassocCnf.resultCode = resultCode;
|
||||
mlmReassocCnf.protStatusCode = protStatusCode;
|
||||
mlmReassocCnf.sessionId = psessionEntry->peSessionId;
|
||||
lim_post_sme_message(pMac,
|
||||
LIM_MLM_REASSOC_CNF, (uint32_t *) &mlmReassocCnf);
|
||||
}
|
||||
|
||||
/**
|
||||
* lim_post_reassoc_failure() - Post failure message to SME
|
||||
* @pMac: Global MAC Context
|
||||
* @resultCode: Result Code
|
||||
* @protStatusCode: Protocol Status Code
|
||||
* @psessionEntry: PE Session
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void lim_post_reassoc_failure(tpAniSirGlobal pMac,
|
||||
tSirResultCodes resultCode, uint16_t protStatusCode,
|
||||
tpPESession psessionEntry)
|
||||
{
|
||||
tLimMlmReassocCnf mlmReassocCnf;
|
||||
|
||||
psessionEntry->limMlmState = eLIM_MLM_LINK_ESTABLISHED_STATE;
|
||||
MTRACE(mac_trace
|
||||
(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId,
|
||||
eLIM_MLM_LINK_ESTABLISHED_STATE));
|
||||
|
||||
lim_deactivate_and_change_timer(pMac, eLIM_REASSOC_FAIL_TIMER);
|
||||
|
||||
mlmReassocCnf.resultCode = resultCode;
|
||||
mlmReassocCnf.protStatusCode = protStatusCode;
|
||||
mlmReassocCnf.sessionId = psessionEntry->peSessionId;
|
||||
lim_post_sme_message(pMac,
|
||||
LIM_MLM_REASSOC_CNF, (uint32_t *) &mlmReassocCnf);
|
||||
}
|
||||
|
在新工单中引用
屏蔽一个用户