summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajesh Chauhan <rajeshc@qca.qualcomm.com>2014-02-25 17:49:02 -0800
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-02-26 18:49:03 -0800
commit90f61998f5a4018a1f0c8ae98a2de41943e6ccee (patch)
tree8ffccc6e1a95311ef06adb8cff875b8b23b91f07
parent65e266bb9bcd99be96e35a68bdd4ed1aa9da1394 (diff)
qcacld: update TDLS teardown state in FW when STA disconnects from AP
Update FW with TDLS teardown status and remove TDLS peer in FW when STA disconnects from AP. Change-Id: Ibdb75431f4ae7b9169afcc4163430503bc7f1cd2 CRs-Fixed: 615604
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c26
-rw-r--r--CORE/SERVICES/WMA/wma.c30
2 files changed, 52 insertions, 4 deletions
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index aaa68744e1d0..0a9c2bcad2e5 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -2284,6 +2284,7 @@ eHalStatus hdd_RoamTdlsStatusUpdateHandler(hdd_adapter_t *pAdapter,
#ifdef CONFIG_TDLS_IMPLICIT
tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
#endif
+ tSmeTdlsPeerStateParams smeTdlsPeerStateParams;
#endif
eHalStatus status = eHAL_STATUS_FAILURE ;
tANI_U8 staIdx;
@@ -2466,6 +2467,31 @@ eHalStatus hdd_RoamTdlsStatusUpdateHandler(hdd_adapter_t *pAdapter,
MAC_ADDR_ARRAY(pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes));
wlan_hdd_tdls_reset_peer(pAdapter, pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes);
hdd_roamDeregisterTDLSSTA ( pAdapter, pHddCtx->tdlsConnInfo[staIdx].staId );
+#ifdef QCA_WIFI_2_0
+ vos_mem_zero(&smeTdlsPeerStateParams,
+ sizeof(smeTdlsPeerStateParams));
+ smeTdlsPeerStateParams.vdevId =
+ pHddCtx->tdlsConnInfo[staIdx].sessionId;
+ vos_mem_copy(&smeTdlsPeerStateParams.peerMacAddr,
+ &pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes,
+ VOS_MAC_ADDR_SIZE);
+ smeTdlsPeerStateParams.peerState =
+ eSME_TDLS_PEER_STATE_TEARDOWN;
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ ("hdd_tdlsStatusUpdate: calling sme_UpdateTdlsPeerState for staIdx %d " MAC_ADDRESS_STR),
+ pHddCtx->tdlsConnInfo[staIdx].staId,
+ MAC_ADDR_ARRAY(pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes));
+ status = sme_UpdateTdlsPeerState(pHddCtx->hHal,
+ &smeTdlsPeerStateParams);
+ if (eHAL_STATUS_SUCCESS != status)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: sme_UpdateTdlsPeerState failed for "
+ MAC_ADDRESS_STR, __func__,
+ MAC_ADDR_ARRAY(pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes));
+ }
+#endif
wlan_hdd_tdls_decrement_peer_count(pAdapter);
(WLAN_HDD_GET_CTX(pAdapter))->sta_to_adapter[staIdx] = NULL;
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index e9ee97d7025f..65d4a0b08d68 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -9483,10 +9483,6 @@ static void wma_del_tdls_sta(tp_wma_handle wma,
wma_update_tdls_peer_state(wma, peerStateParams);
- WMA_LOGD("%s: wma_remove_peer for peer: %pM, vdevId: %d",
- __func__, peer->mac_addr.raw, del_sta->smesessionId);
-
- wma_remove_peer(wma, peer->mac_addr.raw, del_sta->smesessionId, peer);
del_sta->status = VOS_STATUS_SUCCESS;
send_del_rsp:
@@ -18593,6 +18589,9 @@ static int wma_update_tdls_peer_state(WMA_HANDLE handle,
wmi_buf_t wmi_buf;
u_int8_t *buf_ptr;
u_int32_t i;
+ ol_txrx_pdev_handle pdev;
+ u_int8_t peer_id;
+ struct ol_txrx_peer_t *peer;
int32_t len = sizeof(wmi_tdls_peer_update_cmd_fixed_param) +
sizeof(wmi_tdls_peer_capabilities);
@@ -18663,6 +18662,29 @@ static int wma_update_tdls_peer_state(WMA_HANDLE handle,
adf_nbuf_free(wmi_buf);
return -EIO;
}
+
+ /* in case of teardown, remove peer from fw */
+ if (WDA_TDLS_PEER_STATE_TEARDOWN == peerStateParams->peerState) {
+ pdev = vos_get_context(VOS_MODULE_ID_TXRX, wma_handle->vos_context);
+ if (!pdev) {
+ WMA_LOGE("%s: Failed to find pdev", __func__);
+ return -EIO;
+ }
+
+ peer = ol_txrx_find_peer_by_addr(pdev, peerStateParams->peerMacAddr,
+ &peer_id);
+ if (!peer) {
+ WMA_LOGE("%s: Failed to get peer handle using peer mac %pM",
+ __func__, peerStateParams->peerMacAddr);
+ return -EIO;
+ }
+
+ WMA_LOGD("%s: calling wma_remove_peer for peer " MAC_ADDRESS_STR
+ " vdevId: %d", __func__,
+ MAC_ADDR_ARRAY(peer->mac_addr.raw), peerStateParams->vdevId);
+ wma_remove_peer(wma_handle, peer->mac_addr.raw,
+ peerStateParams->vdevId, peer);
+ }
return 0;
}
#endif /* FEATURE_WLAN_TDLS */