diff options
| author | Naveen Rawat <naveenrawat@codeaurora.org> | 2016-06-22 11:02:50 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-07-06 13:29:41 -0700 |
| commit | 9801ac0282172b7321e1807a74a9fab3813da44c (patch) | |
| tree | 5d62111903ac387d5cafe09f87fdfad215414e55 | |
| parent | 6de46458642422eec635d31f1a1746ca306ddd3f (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.c | 28 | ||||
| -rw-r--r-- | core/wma/inc/wma_if.h | 2 | ||||
| -rw-r--r-- | core/wma/src/wma_mgmt.c | 9 |
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, |
