Browse Source

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
Naveen Rawat 8 years ago
parent
commit
9801ac0282
3 changed files with 33 additions and 6 deletions
  1. 23 5
      core/mac/src/pe/lim/lim_link_monitoring_algo.c
  2. 2 0
      core/wma/inc/wma_if.h
  3. 8 1
      core/wma/src/wma_mgmt.c

+ 23 - 5
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;
 

+ 2 - 0
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;

+ 8 - 1
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,