Merge "wlan: Fix to drop Assoc Request, when ACK is lost on STA side."
diff --git a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
index c18da93..f40d538 100644
--- a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
@@ -206,14 +206,14 @@
pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
framelen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
- limLog(pMac, LOG1, FL("Received %s Req Frame on sessionid: %d systemrole %d"
+ limLog(pMac, LOG1, FL("Received %s Req Frame on sessionid: %d systemrole %d"
" limMlmState %d from: "MAC_ADDRESS_STR),
(LIM_ASSOC == subType) ? "Assoc" : "ReAssoc",
psessionEntry->peSessionId, psessionEntry->limSystemRole,
psessionEntry->limMlmState, MAC_ADDR_ARRAY(pHdr->sa));
- if (psessionEntry->limSystemRole == eLIM_STA_ROLE || psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE )
- {
+ if (psessionEntry->limSystemRole == eLIM_STA_ROLE || psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE )
+ {
limLog(pMac, LOGE, FL("received unexpected ASSOC REQ on sessionid: %d "
"sys subType=%d for role=%d from: "MAC_ADDRESS_STR),
psessionEntry->peSessionId,
@@ -223,6 +223,27 @@
return;
}
+ /*
+ * If a STA is already present in DPH and it
+ * is initiating a Assoc re-transmit, do not
+ * process it. This can happen when first Assoc Req frame
+ * is received but ACK lost at STA side. The ACK for this
+ * dropped Assoc Req frame should be sent by HW. Host simply
+ * does not process it once the entry for the STA is already
+ * present in DPH.
+ */
+ pStaDs = dphLookupHashEntry(pMac, pHdr->sa, &peerIdx,
+ &psessionEntry->dph.dphHashTable);
+ if ((NULL != pStaDs) && (pHdr->fc.retry > 0))
+ {
+ limLog(pMac, LOGE,
+ FL("STA is initiating Assoc Req after ACK lost.So, do not Process"
+ "sessionid: %d sys subType=%d for role=%d from: "MAC_ADDRESS_STR),
+ psessionEntry->peSessionId, subType,
+ psessionEntry->limSystemRole, MAC_ADDR_ARRAY(pHdr->sa));
+ return;
+ }
+
// Get pointer to Re/Association Request frame body
pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);