diff options
| author | Rajesh Chauhan <rajeshc@qca.qualcomm.com> | 2014-02-25 17:49:02 -0800 |
|---|---|---|
| committer | Akash Patel <c_akashp@qca.qualcomm.com> | 2014-02-26 18:49:03 -0800 |
| commit | 90f61998f5a4018a1f0c8ae98a2de41943e6ccee (patch) | |
| tree | 8ffccc6e1a95311ef06adb8cff875b8b23b91f07 | |
| parent | 65e266bb9bcd99be96e35a68bdd4ed1aa9da1394 (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.c | 26 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 30 |
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 */ |
