Browse Source

qcacld-3.0: Fix is_waiting_for_key usage for waking up host

Fix usage of flag is_waiting_for_key such that it programs wake
timer only for secure STA connected state.

Change-Id: I336696f15c5fc932a4eedf5534c2182bda3d2e27
CRs-Fixed: 2214809
Naveen Rawat 7 years ago
parent
commit
a600b2e226
2 changed files with 30 additions and 3 deletions
  1. 8 1
      core/wma/src/wma_dev_if.c
  2. 22 2
      core/wma/src/wma_features.c

+ 8 - 1
core/wma/src/wma_dev_if.c

@@ -2028,6 +2028,10 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
 	}
 
 	iface = &wma->interfaces[resp_event->vdev_id];
+
+	/* vdev in stopped state, no more waiting for key */
+	iface->is_waiting_for_key = false;
+
 	wma_release_wakelock(&iface->vdev_stop_wakelock);
 
 	req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
@@ -4181,7 +4185,10 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss)
 		wma_send_peer_assoc(wma, add_bss->nwType,
 					    &add_bss->staContext);
 		/* we just had peer assoc, so install key will be done later */
-		iface->is_waiting_for_key = true;
+
+		if (add_bss->staContext.encryptType != eSIR_ED_NONE)
+			iface->is_waiting_for_key = true;
+
 		peer_assoc_sent = true;
 
 		if (add_bss->rmfEnabled)

+ 22 - 2
core/wma/src/wma_features.c

@@ -2575,6 +2575,11 @@ static int wma_wake_event_piggybacked(
 	uint32_t pb_event_len;
 	uint32_t wake_reason;
 	uint32_t event_id;
+	uint8_t *bssid;
+	uint8_t peer_id;
+	void *peer, *pdev;
+	tpDeleteStaContext del_sta_ctx;
+	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 
 	/*
 	 * There are "normal" cases where a wake reason that usually contains a
@@ -2588,6 +2593,9 @@ static int wma_wake_event_piggybacked(
 		return 0;
 	}
 
+	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+	bssid = wma->interfaces[event_param->fixed_param->vdev_id].bssid;
+	peer = cdp_peer_find_by_addr(soc, pdev, bssid, &peer_id);
 	wake_reason = event_param->fixed_param->wake_reason;
 
 	/* parse piggybacked event from param buffer */
@@ -2710,8 +2718,20 @@ static int wma_wake_event_piggybacked(
 		 * programmed. So do not check for cookie.
 		 */
 		WMA_LOGE("WOW_REASON_TIMER_INTR_RECV received, indicating key exchange did not finish. Initiate disconnect");
-		errno = wma_peer_sta_kickout_event_handler(wma, pb_event,
-							   pb_event_len);
+		del_sta_ctx = (tpDeleteStaContext) qdf_mem_malloc(
+							sizeof(*del_sta_ctx));
+		if (!del_sta_ctx) {
+			WMA_LOGE("%s: mem alloc failed ", __func__);
+			break;
+		}
+		del_sta_ctx->is_tdls = false;
+		del_sta_ctx->vdev_id = event_param->fixed_param->vdev_id;
+		del_sta_ctx->staId = peer_id;
+		qdf_mem_copy(del_sta_ctx->addr2, bssid, IEEE80211_ADDR_LEN);
+		qdf_mem_copy(del_sta_ctx->bssId, bssid, IEEE80211_ADDR_LEN);
+		del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_KEEP_ALIVE;
+		wma_send_msg(wma, SIR_LIM_DELETE_STA_CONTEXT_IND, del_sta_ctx,
+			     0);
 		break;
 
 	default: