wlan: Wait for ack and issue delsta after transmitting the disassoc/Deauth.
After transmitting the Disassoc/Deauth frames, wait for ack and then
issue delsta.
This will ensures that Disassoc/Deauth being transmitted over the air
before deleting the sta structures for corresponding session.
Change-Id: I23107cf454ad605728e7b75cc1cd3134c5d6cdd8
CR-Fixed: 414558,411684
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 432b36e..aa720e5 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -645,6 +645,9 @@
#define SIR_LIM_CCX_TSM_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x25)
#endif
+#define SIR_LIM_DISASSOC_ACK_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x26)
+#define SIR_LIM_DEAUTH_ACK_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x27)
+
#define SIR_LIM_MSG_TYPES_END (SIR_LIM_MSG_TYPES_BEGIN+0xFF)
// SCH message types
diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.c b/CORE/MAC/src/pe/lim/limAssocUtils.c
index b795d02..de509e5 100644
--- a/CORE/MAC/src/pe/lim/limAssocUtils.c
+++ b/CORE/MAC/src/pe/lim/limAssocUtils.c
@@ -2625,7 +2625,7 @@
*/
limSendDisassocMgmtFrame(pMac,
eSIR_MAC_DISASSOC_LEAVING_BSS_REASON,
- bcAddr,psessionEntry);
+ bcAddr,psessionEntry, FALSE);
} /*** end limTeardownInfraBss() ***/
diff --git a/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c b/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
index 22128c0..c8d44e3 100644
--- a/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
+++ b/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
@@ -233,7 +233,7 @@
PELOGE(limLog(pMac, LOGE, FL(" Deleting Unknown station \n"));)
limPrintMacAddr(pMac, pMsg->addr2, LOGE);
- limSendDeauthMgmtFrame( pMac, eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMsg->addr2, psessionEntry);
+ limSendDeauthMgmtFrame( pMac, eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMsg->addr2, psessionEntry, FALSE);
break;
default:
diff --git a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
index e729f6b..e318bad 100644
--- a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
@@ -837,7 +837,7 @@
limSendDeauthMgmtFrame(
pMac,
eSIR_MAC_STA_NOT_PRE_AUTHENTICATED_REASON, //=9
- pHdr->sa,psessionEntry);
+ pHdr->sa, psessionEntry, FALSE);
// Log error
if (subType == LIM_ASSOC)
diff --git a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
index 59f1113..f81311f 100644
--- a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
@@ -596,7 +596,8 @@
mlmAssocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
// Send advisory Disassociation frame to AP
- limSendDisassocMgmtFrame(pMac, eSIR_MAC_UNSPEC_FAILURE_REASON, pHdr->sa,psessionEntry);
+ limSendDisassocMgmtFrame(pMac, eSIR_MAC_UNSPEC_FAILURE_REASON,
+ pHdr->sa, psessionEntry, FALSE);
goto assocReject;
}
@@ -651,7 +652,8 @@
mlmAssocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
// Send advisory Disassociation frame to AP
- limSendDisassocMgmtFrame(pMac, eSIR_MAC_UNSPEC_FAILURE_REASON, pHdr->sa,psessionEntry);
+ limSendDisassocMgmtFrame(pMac, eSIR_MAC_UNSPEC_FAILURE_REASON,
+ pHdr->sa, psessionEntry, FALSE);
goto assocReject;
}
diff --git a/CORE/MAC/src/pe/lim/limProcessAuthFrame.c b/CORE/MAC/src/pe/lim/limProcessAuthFrame.c
index 69514f5..ad93b3a 100644
--- a/CORE/MAC/src/pe/lim/limProcessAuthFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAuthFrame.c
@@ -212,7 +212,7 @@
limPrintMacAddr(pMac, pHdr->sa, LOGE);
limSendDeauthMgmtFrame( pMac, eSIR_MAC_MIC_FAILURE_REASON,
- pHdr->sa, psessionEntry );
+ pHdr->sa, psessionEntry, FALSE );
return;
}
#endif
@@ -597,7 +597,7 @@
{
PELOGE(limLog(pMac, LOGE, FL("lim Delete Station Context (staId: %d, assocId: %d) \n"),pStaDs->staIndex, assocId);)
limSendDeauthMgmtFrame(pMac,
- eSIR_MAC_UNSPEC_FAILURE_REASON, (tANI_U8 *) pAuthNode->peerMacAddr,psessionEntry);
+ eSIR_MAC_UNSPEC_FAILURE_REASON, (tANI_U8 *) pAuthNode->peerMacAddr, psessionEntry, FALSE);
limTriggerSTAdeletion(pMac, pStaDs, psessionEntry);
return;
}
diff --git a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
index 0924945..da5ea6a 100644
--- a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
+++ b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
@@ -495,7 +495,7 @@
PELOG1(limLog(pMac, LOG1, FL("Send Disassoc Frame due to Invalid Addr2 packet"));
limPrintMacAddr(pMac, pMacHdr->addr2, LOG1);)
limSendDisassocMgmtFrame(pMac,
- eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMacHdr->addr2,psessionEntry);
+ eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMacHdr->addr2, psessionEntry, FALSE);
break;
default:
@@ -514,7 +514,7 @@
PELOG1(limLog(pMac, LOG1, FL("Send Disassoc Frame due to Invalid Addr2 packet"));
limPrintMacAddr(pMac, pMacHdr->addr2, LOG1);)
limSendDisassocMgmtFrame(pMac,
- eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMacHdr->addr2,psessionEntry);
+ eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMacHdr->addr2, psessionEntry, FALSE);
break;
default:
@@ -532,7 +532,7 @@
PELOG1(limLog(pMac, LOG1, FL("Send Disassoc Frame due to Invalid Addr2 packet"));
limPrintMacAddr(pMac, pMacHdr->addr2, LOG1);)
limSendDisassocMgmtFrame(pMac,
- eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMacHdr->addr2,psessionEntry);
+ eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMacHdr->addr2, psessionEntry, FALSE);
break;
default:
@@ -1655,6 +1655,8 @@
#ifdef WLAN_FEATURE_P2P
case SIR_LIM_REMAIN_CHN_TIMEOUT:
#endif
+ case SIR_LIM_DISASSOC_ACK_TIMEOUT:
+ case SIR_LIM_DEAUTH_ACK_TIMEOUT:
// These timeout messages are handled by MLM sub module
limProcessMlmReqMessages(pMac,
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
index f562b24..c1591f0 100644
--- a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
@@ -150,6 +150,8 @@
#ifdef WLAN_FEATURE_P2P
case SIR_LIM_REMAIN_CHN_TIMEOUT: limProcessRemainOnChnTimeout(pMac); break;
#endif
+ case SIR_LIM_DISASSOC_ACK_TIMEOUT: limProcessDisassocAckTimeout(pMac); break;
+ case SIR_LIM_DEAUTH_ACK_TIMEOUT: limProcessDeauthAckTimeout(pMac); break;
case LIM_MLM_ADDBA_REQ: limProcessMlmAddBAReq( pMac, Msg->bodyptr ); break;
case LIM_MLM_ADDBA_RSP: limProcessMlmAddBARsp( pMac, Msg->bodyptr ); break;
case LIM_MLM_DELBA_REQ: limProcessMlmDelBAReq( pMac, Msg->bodyptr ); break;
@@ -2756,63 +2758,17 @@
/// Send Disassociate frame to peer entity
if (sendDisassocFrame && (pMlmDisassocReq->reasonCode != eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON))
{
+ pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = pMlmDisassocReq;
limSendDisassocMgmtFrame(pMac,
pMlmDisassocReq->reasonCode,
- pMlmDisassocReq->peerMacAddr,psessionEntry);
+ pMlmDisassocReq->peerMacAddr,
+ psessionEntry, TRUE);
}
else
{
sendDisassocFrame = 1;
}
- /// Receive path cleanup with dummy packet
- if(eSIR_SUCCESS != limCleanupRxPath(pMac, pStaDs,psessionEntry))
- {
- mlmDisassocCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
- goto end;
- }
-
-#ifdef WLAN_FEATURE_VOWIFI_11R
- if ( (psessionEntry->limSystemRole == eLIM_STA_ROLE ) &&
- (
-#ifdef FEATURE_WLAN_CCX
- (psessionEntry->isCCXconnection ) ||
-#endif
-#ifdef FEATURE_WLAN_LFR
- (psessionEntry->isFastRoamIniFeatureEnabled ) ||
-#endif
- (psessionEntry->is11Rconnection )) &&
- (pMlmDisassocReq->reasonCode != eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON))
- {
- PELOGE(limLog(pMac, LOGE, FL("FT Preauth Session (%p,%d) Cleanup\n"),
- psessionEntry, psessionEntry->peSessionId);)
- limFTCleanup(pMac);
- }
- else
- {
- PELOGE(limLog(pMac, LOGE, FL("No FT Preauth Session Cleanup in role %d"
-#ifdef FEATURE_WLAN_CCX
- " isCCX %d"
-#endif
-#ifdef FEATURE_WLAN_LFR
- " isLFR %d"
-#endif
- " is11r %d reason %d\n"),
- psessionEntry->limSystemRole,
-#ifdef FEATURE_WLAN_CCX
- psessionEntry->isCCXconnection,
-#endif
-#ifdef FEATURE_WLAN_LFR
- psessionEntry->isFastRoamIniFeatureEnabled,
-#endif
- psessionEntry->is11Rconnection,
- pMlmDisassocReq->reasonCode);)
- }
-#endif
-
- /// Free up buffer allocated for mlmDisassocReq
- palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDisassocReq);
-
return;
end:
@@ -2833,6 +2789,11 @@
(tANI_U32 *) &mlmDisassocCnf);
}
+void limProcessDisassocAckTimeout(tpAniSirGlobal pMac)
+{
+ limSendDisassocCnf(pMac);
+}
+
/**
* limProcessMlmDisassocReq()
*
@@ -2968,7 +2929,8 @@
limSendDeauthMgmtFrame(
pMac,
pMlmDeauthReq->reasonCode,
- pMlmDeauthReq->peerMacAddr,psessionEntry);
+ pMlmDeauthReq->peerMacAddr,
+ psessionEntry, FALSE);
/// Prepare and Send LIM_MLM_DEAUTH_CNF
mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
@@ -3048,7 +3010,8 @@
/// Send Deauthentication frame to peer entity
limSendDeauthMgmtFrame(pMac,
pMlmDeauthReq->reasonCode,
- pMlmDeauthReq->peerMacAddr,psessionEntry);
+ pMlmDeauthReq->peerMacAddr,
+ psessionEntry, FALSE);
}
goto end;
@@ -3078,15 +3041,11 @@
pMlmDeauthReq->reasonCode;
pStaDs->mlmStaContext.cleanupTrigger = pMlmDeauthReq->deauthTrigger;
+ pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = pMlmDeauthReq;
/// Send Deauthentication frame to peer entity
limSendDeauthMgmtFrame(pMac, pMlmDeauthReq->reasonCode,
- pMlmDeauthReq->peerMacAddr,psessionEntry);
-
- /// Receive path cleanup with dummy packet
- limCleanupRxPath(pMac, pStaDs,psessionEntry);
-
- /// Free up buffer allocated for mlmDeauthReq
- palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDeauthReq);
+ pMlmDeauthReq->peerMacAddr,
+ psessionEntry, TRUE);
return;
@@ -3108,6 +3067,12 @@
}
+
+void limProcessDeauthAckTimeout(tpAniSirGlobal pMac)
+{
+ limSendDeauthCnf(pMac);
+}
+
/**
* limProcessMlmDeauthReq()
*
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index 93173f7..20401df 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -3246,7 +3246,7 @@
if ( (psessionEntry->limSystemRole == eLIM_AP_ROLE) || (psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE)
|| (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE) )
- limSendDisassocMgmtFrame(pMac, eSIR_MAC_MIC_FAILURE_REASON, mac, psessionEntry);
+ limSendDisassocMgmtFrame(pMac, eSIR_MAC_MIC_FAILURE_REASON, mac, psessionEntry, FALSE);
tx_thread_sleep(10);
};
@@ -3362,7 +3362,7 @@
// Send disassoc all stations associated thru TKIP
__limCounterMeasures(pMac,psessionEntry);
else
- limSendDisassocMgmtFrame(pMac, eSIR_MAC_DISASSOC_LEAVING_BSS_REASON, bcAddr,psessionEntry);
+ limSendDisassocMgmtFrame(pMac, eSIR_MAC_DISASSOC_LEAVING_BSS_REASON, bcAddr, psessionEntry, FALSE);
}
//limDelBss is also called as part of coalescing, when we send DEL BSS followed by Add Bss msg.
diff --git a/CORE/MAC/src/pe/lim/limSecurityUtils.c b/CORE/MAC/src/pe/lim/limSecurityUtils.c
index 994fcf2..3654022 100644
--- a/CORE/MAC/src/pe/lim/limSecurityUtils.c
+++ b/CORE/MAC/src/pe/lim/limSecurityUtils.c
@@ -557,10 +557,10 @@
* Send advisory Deauthentication frame
* to STA being deleted
*/
- limSendDeauthMgmtFrame(
- pMac,
- eSIR_MAC_PREV_AUTH_NOT_VALID_REASON, //=2
- pCurrNode->peerMacAddr,sessionEntry);
+ limSendDeauthMgmtFrame(pMac,
+ eSIR_MAC_PREV_AUTH_NOT_VALID_REASON, //=2
+ pCurrNode->peerMacAddr, sessionEntry,
+ FALSE);
}
limLog(pMac,
diff --git a/CORE/MAC/src/pe/lim/limSendManagementFrames.c b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
index 7753391..77f7b7c 100644
--- a/CORE/MAC/src/pe/lim/limSendManagementFrames.c
+++ b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
@@ -44,6 +44,9 @@
#include "limStaHashApi.h"
#include "schApi.h"
#include "limSendMessages.h"
+#include "limAssocUtils.h"
+#include "limFT.h"
+
#if defined WLAN_FEATURE_VOWIFI
#include "rrmApi.h"
#endif
@@ -3666,6 +3669,155 @@
return;
} /*** end limSendAuthMgmtFrame() ***/
+eHalStatus limSendDeauthCnf(tpAniSirGlobal pMac)
+{
+ tANI_U16 aid;
+ tpDphHashNode pStaDs;
+ tLimMlmDeauthReq *pMlmDeauthReq;
+ tLimMlmDeauthCnf mlmDeauthCnf;
+ tpPESession psessionEntry;
+
+ pMlmDeauthReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq;
+ if (pMlmDeauthReq)
+ {
+ if (tx_timer_running(&pMac->lim.limTimers.gLimDeauthAckTimer))
+ {
+ limDeactivateAndChangeTimer(pMac, eLIM_DEAUTH_ACK_TIMER);
+ }
+
+ if((psessionEntry = peFindSessionBySessionId(pMac, pMlmDeauthReq->sessionId))== NULL)
+ {
+
+ PELOGE(limLog(pMac, LOGE,
+ FL("session does not exist for given sessionId\n"));)
+ mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
+ goto end;
+ }
+
+ pStaDs = dphLookupHashEntry(pMac, pMlmDeauthReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
+ if (pStaDs == NULL)
+ {
+ mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
+ goto end;
+ }
+
+
+ /// Receive path cleanup with dummy packet
+ limCleanupRxPath(pMac, pStaDs,psessionEntry);
+ /// Free up buffer allocated for mlmDeauthReq
+ palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDeauthReq);
+ pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = NULL;
+ }
+ return eHAL_STATUS_SUCCESS;
+end:
+ palCopyMemory( pMac->hHdd, (tANI_U8 *) &mlmDeauthCnf.peerMacAddr,
+ (tANI_U8 *) pMlmDeauthReq->peerMacAddr,
+ sizeof(tSirMacAddr));
+ mlmDeauthCnf.deauthTrigger = pMlmDeauthReq->deauthTrigger;
+ mlmDeauthCnf.aid = pMlmDeauthReq->aid;
+ mlmDeauthCnf.sessionId = pMlmDeauthReq->sessionId;
+
+ // Free up buffer allocated
+ // for mlmDeauthReq
+ palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDeauthReq);
+
+ limPostSmeMessage(pMac,
+ LIM_MLM_DEAUTH_CNF,
+ (tANI_U32 *) &mlmDeauthCnf);
+ return eHAL_STATUS_SUCCESS;
+}
+
+eHalStatus limSendDisassocCnf(tpAniSirGlobal pMac)
+{
+ tANI_U16 aid;
+ tpDphHashNode pStaDs;
+ tLimMlmDisassocCnf mlmDisassocCnf;
+ tpPESession psessionEntry;
+ tLimMlmDisassocReq *pMlmDisassocReq;
+
+ pMlmDisassocReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq;
+ if (pMlmDisassocReq)
+ {
+ if (tx_timer_running(&pMac->lim.limTimers.gLimDisassocAckTimer))
+ {
+ limDeactivateAndChangeTimer(pMac, eLIM_DISASSOC_ACK_TIMER);
+ }
+
+ if((psessionEntry = peFindSessionBySessionId(pMac, pMlmDisassocReq->sessionId))== NULL)
+ {
+
+ PELOGE(limLog(pMac, LOGE,
+ FL("session does not exist for given sessionId\n"));)
+ mlmDisassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
+ goto end;
+ }
+
+ pStaDs = dphLookupHashEntry(pMac, pMlmDisassocReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
+ if (pStaDs == NULL)
+ {
+ mlmDisassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
+ goto end;
+ }
+
+ /// Receive path cleanup with dummy packet
+ if(eSIR_SUCCESS != limCleanupRxPath(pMac, pStaDs, psessionEntry))
+ {
+ mlmDisassocCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
+ goto end;
+ }
+
+#ifdef WLAN_FEATURE_VOWIFI_11R
+ if ( (psessionEntry->limSystemRole == eLIM_STA_ROLE ) &&
+ (
+#ifdef FEATURE_WLAN_CCX
+ (psessionEntry->isCCXconnection ) ||
+#endif
+ (psessionEntry->is11Rconnection )) &&
+ (pMlmDisassocReq->reasonCode != eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON))
+ {
+ PELOGE(limLog(pMac, LOGE, FL("FT Preauth Session Cleanup \n"));)
+ limFTCleanup(pMac);
+ }
+#endif
+
+ /// Free up buffer allocated for mlmDisassocReq
+ palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDisassocReq);
+ pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = NULL;
+ return eHAL_STATUS_SUCCESS;
+ }
+ else
+ {
+ return eHAL_STATUS_SUCCESS;
+ }
+end:
+ palCopyMemory( pMac->hHdd, (tANI_U8 *) &mlmDisassocCnf.peerMacAddr,
+ (tANI_U8 *) pMlmDisassocReq->peerMacAddr,
+ sizeof(tSirMacAddr));
+ mlmDisassocCnf.aid = pMlmDisassocReq->aid;
+ mlmDisassocCnf.disassocTrigger = pMlmDisassocReq->disassocTrigger;
+
+ /* Update PE session ID*/
+ mlmDisassocCnf.sessionId = pMlmDisassocReq->sessionId;
+
+ /// Free up buffer allocated for mlmDisassocReq
+ palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDisassocReq);
+
+ limPostSmeMessage(pMac,
+ LIM_MLM_DISASSOC_CNF,
+ (tANI_U32 *) &mlmDisassocCnf);
+ return eHAL_STATUS_SUCCESS;
+}
+
+eHalStatus limDisassocTxCompleteCnf(tpAniSirGlobal pMac, tANI_U32 txCompleteSuccess)
+{
+ return limSendDisassocCnf(pMac);
+}
+
+eHalStatus limDeauthTxCompleteCnf(tpAniSirGlobal pMac, tANI_U32 txCompleteSuccess)
+{
+ return limSendDeauthCnf(pMac);
+}
+
/**
* \brief This function is called to send Disassociate frame.
*
@@ -3684,7 +3836,9 @@
void
limSendDisassocMgmtFrame(tpAniSirGlobal pMac,
tANI_U16 nReason,
- tSirMacAddr peer,tpPESession psessionEntry)
+ tSirMacAddr peer,
+ tpPESession psessionEntry,
+ tANI_BOOLEAN waitForAck)
{
tDot11fDisassociation frm;
tANI_U8 *pFrame;
@@ -3694,7 +3848,7 @@
void *pPacket;
eHalStatus halstatus;
tANI_U8 txFlag = 0;
-
+ tANI_U32 val = 0;
if(NULL == psessionEntry)
{
return;
@@ -3784,21 +3938,52 @@
txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
}
- // Queue Disassociation frame in high priority WQ
- halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) nBytes,
- HAL_TXRX_FRM_802_11_MGMT,
- ANI_TXDIR_TODS,
- 7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
- limTxComplete, pFrame, txFlag );
- if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
+ if (waitForAck)
{
- limLog( pMac, LOGE, FL("Failed to send Disassociation "
- "(%X)!\n"),
- nSirStatus );
- //Pkt will be freed up by the callback
- return;
- }
+ // Queue Disassociation frame in high priority WQ
+ /* get the duration from the request */
+ halstatus = halTxFrameWithTxComplete( pMac, pPacket, ( tANI_U16 ) nBytes,
+ HAL_TXRX_FRM_802_11_MGMT,
+ ANI_TXDIR_TODS,
+ 7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
+ limTxComplete, pFrame, limDisassocTxCompleteCnf,
+ txFlag );
+ val = SYS_MS_TO_TICKS(LIM_DISASSOC_DEAUTH_ACK_TIMEOUT);
+ if (tx_timer_change(
+ &pMac->lim.limTimers.gLimDisassocAckTimer, val, 0)
+ != TX_SUCCESS)
+ {
+ limLog(pMac, LOGP,
+ FL("Unable to change Disassoc ack Timer val\n"));
+ return;
+ }
+ else if(TX_SUCCESS != tx_timer_activate(
+ &pMac->lim.limTimers.gLimDisassocAckTimer))
+ {
+ limLog(pMac, LOGP,
+ FL("Unable to activate Disassoc ack Timer\n"));
+ limDeactivateAndChangeTimer(pMac, eLIM_DISASSOC_ACK_TIMER);
+ return;
+ }
+ }
+ else
+ {
+ // Queue Disassociation frame in high priority WQ
+ halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) nBytes,
+ HAL_TXRX_FRM_802_11_MGMT,
+ ANI_TXDIR_TODS,
+ 7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
+ limTxComplete, pFrame, txFlag );
+ if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
+ {
+ limLog( pMac, LOGE, FL("Failed to send Disassociation "
+ "(%X)!\n"),
+ nSirStatus );
+ //Pkt will be freed up by the callback
+ return;
+ }
+ }
} // End limSendDisassocMgmtFrame.
/**
@@ -3818,7 +4003,9 @@
void
limSendDeauthMgmtFrame(tpAniSirGlobal pMac,
tANI_U16 nReason,
- tSirMacAddr peer,tpPESession psessionEntry)
+ tSirMacAddr peer,
+ tpPESession psessionEntry,
+ tANI_BOOLEAN waitForAck)
{
tDot11fDeAuth frm;
tANI_U8 *pFrame;
@@ -3828,7 +4015,7 @@
void *pPacket;
eHalStatus halstatus;
tANI_U8 txFlag = 0;
-
+ tANI_U32 val = 0;
if(NULL == psessionEntry)
{
return;
@@ -3918,19 +4105,58 @@
txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
}
- // Queue Disassociation frame in high priority WQ
- halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) nBytes,
- HAL_TXRX_FRM_802_11_MGMT,
- ANI_TXDIR_TODS,
- 7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
- limTxComplete, pFrame, txFlag );
- if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
+ if (waitForAck)
{
- limLog( pMac, LOGE, FL("Failed to send De-Authentication "
- "(%X)!\n"),
- nSirStatus );
- //Pkt will be freed up by the callback
- return;
+ // Queue Disassociation frame in high priority WQ
+ halstatus = halTxFrameWithTxComplete( pMac, pPacket, ( tANI_U16 ) nBytes,
+ HAL_TXRX_FRM_802_11_MGMT,
+ ANI_TXDIR_TODS,
+ 7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
+ limTxComplete, pFrame, limDeauthTxCompleteCnf, txFlag );
+ if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
+ {
+ limLog( pMac, LOGE, FL("Failed to send De-Authentication "
+ "(%X)!\n"),
+ nSirStatus );
+ //Pkt will be freed up by the callback
+ return;
+ }
+
+ val = SYS_MS_TO_TICKS(LIM_DISASSOC_DEAUTH_ACK_TIMEOUT);
+
+ if (tx_timer_change(
+ &pMac->lim.limTimers.gLimDeauthAckTimer, val, 0)
+ != TX_SUCCESS)
+ {
+ limLog(pMac, LOGP,
+ FL("Unable to change Deauth ack Timer val\n"));
+ return;
+ }
+ else if(TX_SUCCESS != tx_timer_activate(
+ &pMac->lim.limTimers.gLimDeauthAckTimer))
+ {
+ limLog(pMac, LOGP,
+ FL("Unable to activate Deauth ack Timer\n"));
+ limDeactivateAndChangeTimer(pMac, eLIM_DEAUTH_ACK_TIMER);
+ return;
+ }
+ }
+ else
+ {
+ // Queue Disassociation frame in high priority WQ
+ halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) nBytes,
+ HAL_TXRX_FRM_802_11_MGMT,
+ ANI_TXDIR_TODS,
+ 7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
+ limTxComplete, pFrame, txFlag );
+ if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
+ {
+ limLog( pMac, LOGE, FL("Failed to send De-Authentication "
+ "(%X)!\n"),
+ nSirStatus );
+ //Pkt will be freed up by the callback
+ return;
+ }
}
} // End limSendDeauthMgmtFrame.
diff --git a/CORE/MAC/src/pe/lim/limTimerUtils.c b/CORE/MAC/src/pe/lim/limTimerUtils.c
index c00be90..bb3ca44 100644
--- a/CORE/MAC/src/pe/lim/limTimerUtils.c
+++ b/CORE/MAC/src/pe/lim/limTimerUtils.c
@@ -672,9 +672,37 @@
}
#endif
+
+ cfgValue = 1000;
+ cfgValue = SYS_MS_TO_TICKS(cfgValue);
+ if (tx_timer_create(&pMac->lim.limTimers.gLimDisassocAckTimer,
+ "DISASSOC ACK TIMEOUT",
+ limTimerHandler, SIR_LIM_DISASSOC_ACK_TIMEOUT,
+ cfgValue, 0,
+ TX_NO_ACTIVATE) != TX_SUCCESS)
+ {
+ limLog(pMac, LOGP, FL("could not DISASSOC ACK TIMEOUT timer\n"));
+ goto err_timer;
+ }
+
+ cfgValue = 1000;
+ cfgValue = SYS_MS_TO_TICKS(cfgValue);
+ if (tx_timer_create(&pMac->lim.limTimers.gLimDeauthAckTimer,
+ "DISASSOC ACK TIMEOUT",
+ limTimerHandler, SIR_LIM_DISASSOC_ACK_TIMEOUT,
+ cfgValue, 0,
+ TX_NO_ACTIVATE) != TX_SUCCESS)
+ {
+ limLog(pMac, LOGP, FL("could not create DEAUTH ACK TIMEOUT timer\n"));
+ goto err_timer;
+ }
return TX_SUCCESS;
err_timer:
+ tx_timer_delete(&pMac->lim.limTimers.gLimDisassocAckTimer);
+#ifdef WLAN_FEATURE_P2P
+ tx_timer_delete(&pMac->lim.limTimers.gLimRemainOnChannelTimer);
+#endif
#ifdef FEATURE_WLAN_CCX
tx_timer_delete(&pMac->lim.limTimers.gLimCcxTsmTimer);
#endif
@@ -1685,7 +1713,49 @@
}
break;
#endif
+ case eLIM_DISASSOC_ACK_TIMER:
+ if (tx_timer_deactivate(&pMac->lim.limTimers.gLimDisassocAckTimer) != TX_SUCCESS)
+ {
+ /**
+ ** Could not deactivate Join Failure
+ ** timer. Log error.
+ **/
+ limLog(pMac, LOGP, FL("Unable to deactivate Disassoc ack timer\n"));
+ }
+ val = 1000;
+ val = SYS_MS_TO_TICKS(val);
+ if (tx_timer_change(&pMac->lim.limTimers.gLimDisassocAckTimer,
+ val, 0) != TX_SUCCESS)
+ {
+ /**
+ * Could not change Join Failure
+ * timer. Log error.
+ */
+ limLog(pMac, LOGP, FL("Unable to change timer\n"));
+ }
+ break;
+ case eLIM_DEAUTH_ACK_TIMER:
+ if (tx_timer_deactivate(&pMac->lim.limTimers.gLimDeauthAckTimer) != TX_SUCCESS)
+ {
+ /**
+ ** Could not deactivate Join Failure
+ ** timer. Log error.
+ **/
+ limLog(pMac, LOGP, FL("Unable to deactivate Deauth ack timer\n"));
+ }
+ val = 1000;
+ val = SYS_MS_TO_TICKS(val);
+ if (tx_timer_change(&pMac->lim.limTimers.gLimDeauthAckTimer,
+ val, 0) != TX_SUCCESS)
+ {
+ /**
+ * Could not change Join Failure
+ * timer. Log error.
+ */
+ limLog(pMac, LOGP, FL("Unable to change timer\n"));
+ }
+ break;
default:
// Invalid timerId. Log error
break;
diff --git a/CORE/MAC/src/pe/lim/limTimerUtils.h b/CORE/MAC/src/pe/lim/limTimerUtils.h
index 867b761..0969475 100644
--- a/CORE/MAC/src/pe/lim/limTimerUtils.h
+++ b/CORE/MAC/src/pe/lim/limTimerUtils.h
@@ -75,8 +75,12 @@
#ifdef FEATURE_WLAN_CCX
eLIM_TSM_TIMER,
#endif
+ eLIM_DISASSOC_ACK_TIMER,
+ eLIM_DEAUTH_ACK_TIMER,
};
+#define LIM_DISASSOC_DEAUTH_ACK_TIMEOUT 500
+
// Timer Handler functions
v_UINT_t limCreateTimers(tpAniSirGlobal);
void limTimerHandler(void *, tANI_U32);
diff --git a/CORE/MAC/src/pe/lim/limTypes.h b/CORE/MAC/src/pe/lim/limTypes.h
index 64d86f6..cad1f80 100644
--- a/CORE/MAC/src/pe/lim/limTypes.h
+++ b/CORE/MAC/src/pe/lim/limTypes.h
@@ -724,8 +724,8 @@
void limSendAssocRspMgmtFrame(tpAniSirGlobal, tANI_U16, tANI_U16, tSirMacAddr, tANI_U8, tpDphHashNode pSta,tpPESession);
void limSendNullDataFrame(tpAniSirGlobal, tpDphHashNode);
-void limSendDisassocMgmtFrame(tpAniSirGlobal, tANI_U16, tSirMacAddr,tpPESession);
-void limSendDeauthMgmtFrame(tpAniSirGlobal, tANI_U16, tSirMacAddr,tpPESession);
+void limSendDisassocMgmtFrame(tpAniSirGlobal, tANI_U16, tSirMacAddr, tpPESession, tANI_BOOLEAN waitForAck);
+void limSendDeauthMgmtFrame(tpAniSirGlobal, tANI_U16, tSirMacAddr, tpPESession, tANI_BOOLEAN waitForAck);
void limContinueChannelScan(tpAniSirGlobal);
tSirResultCodes limMlmAddBss(tpAniSirGlobal, tLimMlmStartReq *,tpPESession psessionEntry);
@@ -1083,5 +1083,9 @@
void limAbortRemainOnChan(tpAniSirGlobal pMac);
tSirRetStatus __limProcessSmeNoAUpdate(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf);
#endif
+void limProcessDisassocAckTimeout(tpAniSirGlobal pMac);
+void limProcessDeauthAckTimeout(tpAniSirGlobal pMac);
+eHalStatus limSendDisassocCnf(tpAniSirGlobal pMac);
+eHalStatus limSendDeauthCnf(tpAniSirGlobal pMac);
#endif /* __LIM_TYPES_H */
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index 08f56d0..f6581c4 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -1084,6 +1084,12 @@
tx_timer_delete(&pMac->lim.limTimers.gLimCcxTsmTimer);
#endif
+ tx_timer_deactivate(&pMac->lim.limTimers.gLimDisassocAckTimer);
+ tx_timer_delete(&pMac->lim.limTimers.gLimDisassocAckTimer);
+
+ tx_timer_deactivate(&pMac->lim.limTimers.gLimDeauthAckTimer);
+ tx_timer_delete(&pMac->lim.limTimers.gLimDeauthAckTimer);
+
pMac->lim.gLimTimersCreated = 0;
}