summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaveen Rawat <naveenrawat@codeaurora.org>2016-06-22 11:02:50 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-07-06 13:29:41 -0700
commit9801ac0282172b7321e1807a74a9fab3813da44c (patch)
tree5d62111903ac387d5cafe09f87fdfad215414e55
parent6de46458642422eec635d31f1a1746ca306ddd3f (diff)
qcacld-3.0: Handle peer kickout event for STA role
This is qcacld-2.0 to qcacld-3.0 propagation Till now kickout event was only handled for SAP role. The patch handles wmi event for peer kickout due to inactivity in STA role. Change-Id: I437dc3e07737bb653e969406b64cd9dad56fbbcd CRs-Fixed: 861917
-rw-r--r--core/mac/src/pe/lim/lim_link_monitoring_algo.c28
-rw-r--r--core/wma/inc/wma_if.h2
-rw-r--r--core/wma/src/wma_mgmt.c9
3 files changed, 33 insertions, 6 deletions
diff --git a/core/mac/src/pe/lim/lim_link_monitoring_algo.c b/core/mac/src/pe/lim/lim_link_monitoring_algo.c
index 8809210ac503..908ff896c06f 100644
--- a/core/mac/src/pe/lim/lim_link_monitoring_algo.c
+++ b/core/mac/src/pe/lim/lim_link_monitoring_algo.c
@@ -216,23 +216,41 @@ void lim_delete_sta_context(tpAniSirGlobal mac_ctx, tpSirMsgQ lim_msg)
{
tpDeleteStaContext msg = (tpDeleteStaContext) lim_msg->bodyptr;
tpPESession session_entry;
- uint8_t session_id;
+ tpDphHashNode sta_ds;
if (NULL == msg) {
lim_log(mac_ctx, LOGE, FL("Invalid body pointer in message"));
return;
}
- session_entry = pe_find_session_by_bssid(mac_ctx, msg->bssId,
- &session_id);
+ session_entry = pe_find_session_by_sme_session_id(mac_ctx, msg->vdev_id);
if (NULL == session_entry) {
- lim_log(mac_ctx, LOGE, FL("session does not exist"));
+ lim_log(mac_ctx, LOGE,
+ FL("session not found for given sme session"));
qdf_mem_free(msg);
return;
}
switch (msg->reasonCode) {
case HAL_DEL_STA_REASON_CODE_KEEP_ALIVE:
- case HAL_DEL_STA_REASON_CODE_TIM_BASED:
+ if (LIM_IS_STA_ROLE(session_entry) && !msg->is_tdls) {
+ sta_ds = dph_get_hash_entry(mac_ctx,
+ DPH_STA_HASH_INDEX_PEER,
+ &session_entry->dph.dphHashTable);
+ if (NULL == sta_ds) {
+ lim_log(mac_ctx, LOGE,
+ FL("Dph entry not found."));
+ qdf_mem_free(msg);
+ return;
+ }
+ lim_send_deauth_mgmt_frame(mac_ctx,
+ eSIR_MAC_DISASSOC_DUE_TO_INACTIVITY_REASON,
+ msg->addr2, session_entry, false);
+ lim_tear_down_link_with_ap(mac_ctx,
+ session_entry->peSessionId,
+ eSIR_MAC_UNSPEC_FAILURE_REASON);
+ /* only break for STA role (non TDLS) */
+ break;
+ }
lim_delete_sta_util(mac_ctx, msg, session_entry);
break;
diff --git a/core/wma/inc/wma_if.h b/core/wma/inc/wma_if.h
index 8d3050b34fdd..39aab20b6312 100644
--- a/core/wma/inc/wma_if.h
+++ b/core/wma/inc/wma_if.h
@@ -595,6 +595,8 @@ typedef enum eSmpsModeValue {
* @rssi: rssi value during disconnection
*/
typedef struct {
+ bool is_tdls;
+ uint8_t vdev_id;
uint16_t assocId;
uint16_t staId;
tSirMacAddr bssId;
diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c
index 302c17eabf56..e0539cdc2ae6 100644
--- a/core/wma/src/wma_mgmt.c
+++ b/core/wma/src/wma_mgmt.c
@@ -346,6 +346,8 @@ int wma_peer_sta_kickout_event_handler(void *handle, u8 *event, u32 len)
return -ENOMEM;
}
+ del_sta_ctx->is_tdls = true;
+ del_sta_ctx->vdev_id = vdev_id;
del_sta_ctx->staId = peer_id;
qdf_mem_copy(del_sta_ctx->addr2, macaddr, IEEE80211_ADDR_LEN);
qdf_mem_copy(del_sta_ctx->bssId, wma->interfaces[vdev_id].bssid,
@@ -407,7 +409,10 @@ int wma_peer_sta_kickout_event_handler(void *handle, u8 *event, u32 len)
break;
case WMI_PEER_STA_KICKOUT_REASON_INACTIVITY:
- /* Handle SA query kickout is same as inactivity kickout */
+ /*
+ * Handle SA query kickout is same as inactivity kickout.
+ * This could be for STA or SAP role
+ */
case WMI_PEER_STA_KICKOUT_REASON_SA_QUERY_TIMEOUT:
default:
break;
@@ -423,6 +428,8 @@ int wma_peer_sta_kickout_event_handler(void *handle, u8 *event, u32 len)
return -ENOMEM;
}
+ del_sta_ctx->is_tdls = false;
+ del_sta_ctx->vdev_id = vdev_id;
del_sta_ctx->staId = peer_id;
qdf_mem_copy(del_sta_ctx->addr2, macaddr, IEEE80211_ADDR_LEN);
qdf_mem_copy(del_sta_ctx->bssId, wma->interfaces[vdev_id].addr,