qcacld-3.0: Do not trigger del sta if it is already in progress

qcacld-2.0 to qcacld-3.0 propagation

If SAP receive auth from an already connected STA, it post
eWNI_SME_DISASSOC_IND msg to SME to delete the STA context and
return. STA may try to send auth again as it didnt receive auth
resp.

Now many frames (probe req, auth etc) may get accumulated in PE
message queue and unless PE queue is fully processed SME queue will
not be processed and thus del sta will get delayed. This may again
cause STA to send more auth req and every time MC thread process an
auth req before the sta is deleted, eWNI_SME_DISASSOC_IND msg is
posted in SME message queue.

And if PE keeps on getting auth before the sta is deleted,
SME queue will pile up leading to crash.

To fix this do not trigger del sta if it is already in progress.

Change-Id: Icff3778d35ef7ea646463fe49c4335e260e9e156
CRs-Fixed: 982329
This commit is contained in:
Abhishek Singh
2016-08-09 15:31:40 +05:30
committed by Gerrit - the friendly Code Review server
parent c994160fb0
commit 440450989a
3 changed files with 10 additions and 4 deletions

View File

@@ -282,6 +282,7 @@ tpDphHashNode dph_init_sta_state(tpAniSirGlobal pMac, tSirMacAddr staAddr,
#ifdef WLAN_FEATURE_11W
pStaDs->last_assoc_received_time = 0;
#endif
pStaDs->sta_deletion_in_progress = false;
pStaDs->valid = 1;
return pStaDs;
}
@@ -424,6 +425,7 @@ tSirRetStatus dph_delete_hash_entry(tpAniSirGlobal pMac, tSirMacAddr staAddr,
#ifdef WLAN_FEATURE_11W
ptr->last_assoc_received_time = 0;
#endif
ptr->sta_deletion_in_progress = false;
ptr->next = 0;
} else {
/* / Entry not present */

View File

@@ -241,6 +241,7 @@ typedef struct sDphHashNode {
uint8_t nss;
int8_t del_sta_ctx_rssi;
bool sta_deletion_in_progress;
/*
* When a station with already an existing dph entry tries to

View File

@@ -290,13 +290,16 @@ lim_trigger_sta_deletion(tpAniSirGlobal mac_ctx, tpDphHashNode sta_ds,
if ((sta_ds->mlmStaContext.mlmState == eLIM_MLM_WT_DEL_STA_RSP_STATE) ||
(sta_ds->mlmStaContext.mlmState ==
eLIM_MLM_WT_DEL_BSS_RSP_STATE)) {
eLIM_MLM_WT_DEL_BSS_RSP_STATE) ||
sta_ds->sta_deletion_in_progress) {
/* Already in the process of deleting context for the peer */
lim_log(mac_ctx, LOGE,
FL("Deletion is in progress for peer:%pM"),
sta_ds->staAddr);
lim_log(mac_ctx, LOG1,
FL("Deletion is in progress (%d) for peer:%p in mlmState %d"),
sta_ds->sta_deletion_in_progress, sta_ds->staAddr,
sta_ds->mlmStaContext.mlmState);
return;
}
sta_ds->sta_deletion_in_progress = true;
sta_ds->mlmStaContext.disassocReason =
eSIR_MAC_DISASSOC_DUE_TO_INACTIVITY_REASON;