diff options
| author | Nitesh Shah <niteshs@codeaurora.org> | 2017-01-31 12:22:16 +0530 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2017-03-03 16:34:53 -0800 |
| commit | ce2cc70c6231b7e679513da46b5d372d96c0e8b2 (patch) | |
| tree | abbb344c181ccb8a9a1349cfe746ef4515463a99 | |
| parent | 67abb24cbb0f4c516f44b30fe7f4f689b376cbe2 (diff) | |
qcacld-3.0: Acquire mutex before accessing tdls context
peer_list is a parameter for tdls_ctx, so every access to
peer_list should be protected with mutex lock.
This change refactors the code for wlan_hdd_set_callback(),
wlan_hdd_tdls_extctrl_config_peer() and wlan_hdd_tdls_
extctrl_deconfig_peer().
Change-Id: I07d708f5e9475c57ee473f455ee716d2b6ba7139
CRs-Fixed: 1115923
| -rw-r--r-- | core/hdd/src/wlan_hdd_tdls.c | 107 |
1 files changed, 79 insertions, 28 deletions
diff --git a/core/hdd/src/wlan_hdd_tdls.c b/core/hdd/src/wlan_hdd_tdls.c index bfc0e4ab0d7a..6a59c9abe151 100644 --- a/core/hdd/src/wlan_hdd_tdls.c +++ b/core/hdd/src/wlan_hdd_tdls.c @@ -3144,9 +3144,7 @@ int wlan_hdd_set_callback(hddTdlsPeer_t *curr_peer, pHddCtx = WLAN_HDD_GET_CTX(pAdapter); if ((NULL == pHddCtx)) return -EINVAL; - mutex_lock(&pHddCtx->tdls_lock); curr_peer->state_change_notification = callback; - mutex_unlock(&pHddCtx->tdls_lock); return 0; } @@ -4527,6 +4525,7 @@ int wlan_hdd_tdls_extctrl_config_peer(hdd_adapter_t *pAdapter, { hddTdlsPeer_t *pTdlsPeer; hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); + int status = 0; QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO, "%s : NL80211_TDLS_SETUP for " MAC_ADDRESS_STR, __func__, MAC_ADDR_ARRAY(peer)); @@ -4535,19 +4534,26 @@ int wlan_hdd_tdls_extctrl_config_peer(hdd_adapter_t *pAdapter, QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO, "%s TDLS External control or Implicit Trigger not enabled ", __func__); - return -ENOTSUPP; + status = -ENOTSUPP; + goto ret_status; } - pTdlsPeer = wlan_hdd_tdls_get_peer(pAdapter, peer, true); + + mutex_lock(&pHddCtx->tdls_lock); + pTdlsPeer = wlan_hdd_tdls_get_peer(pAdapter, peer, false); if (pTdlsPeer == NULL) { QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR, "%s: peer " MAC_ADDRESS_STR " does not exist", __func__, MAC_ADDR_ARRAY(peer)); - return -EINVAL; + status = -EINVAL; + goto rel_lock; } + mutex_unlock(&pHddCtx->tdls_lock); + if (0 != wlan_hdd_tdls_set_force_peer(pAdapter, peer, true)) { QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR, "%s TDLS Add Force Peer Failed", __func__); - return -EINVAL; + status = -EINVAL; + goto ret_status; } /* Update the peer mac to firmware, so firmware * could update the connection table @@ -4556,14 +4562,12 @@ int wlan_hdd_tdls_extctrl_config_peer(hdd_adapter_t *pAdapter, eSME_TDLS_PEER_ADD_MAC_ADDR)) { hdd_err("TDLS Peer mac update Failed " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(peer)); - return -EINVAL; + status = -EINVAL; + goto ret_status; } pHddCtx->tdls_external_peer_count++; - /* set tdls connection tracker state */ - cds_set_tdls_ct_mode(pHddCtx); - /* validate if off channel is DFS channel */ if (CDS_IS_DFS_CH(chan)) { hdd_err("Resetting TDLS off-channel from %d to %d", @@ -4577,14 +4581,36 @@ int wlan_hdd_tdls_extctrl_config_peer(hdd_adapter_t *pAdapter, QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR, "%s TDLS Set Peer's External Ctrl Parameter Failed", __func__); - return -EINVAL; + status = -EINVAL; + goto ret_status; + } + + mutex_lock(&pHddCtx->tdls_lock); + pTdlsPeer = wlan_hdd_tdls_get_peer(pAdapter, peer, false); + if (pTdlsPeer == NULL) { + QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR, + "%s: peer " MAC_ADDRESS_STR " does not exist", + __func__, MAC_ADDR_ARRAY(peer)); + status = -EINVAL; + goto rel_lock; } if (0 != wlan_hdd_set_callback(pTdlsPeer, callback)) { QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR, "%s TDLS set callback Failed", __func__); - return -EINVAL; + status = -EINVAL; + goto rel_lock; } - return 0; + + mutex_unlock(&pHddCtx->tdls_lock); + + /* set tdls connection tracker state */ + cds_set_tdls_ct_mode(pHddCtx); + + return status; +rel_lock: + mutex_unlock(&pHddCtx->tdls_lock); +ret_status: + return status; } /** @@ -4600,6 +4626,7 @@ int wlan_hdd_tdls_extctrl_deconfig_peer(hdd_adapter_t *pAdapter, { hddTdlsPeer_t *pTdlsPeer; hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); + int status = 0; QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO, "%s : NL80211_TDLS_TEARDOWN for " MAC_ADDRESS_STR, __func__, MAC_ADDR_ARRAY(peer)); @@ -4608,27 +4635,54 @@ int wlan_hdd_tdls_extctrl_deconfig_peer(hdd_adapter_t *pAdapter, QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO, "%s TDLS External control or Implicit Trigger not enabled ", __func__); - return -ENOTSUPP; + status = -ENOTSUPP; + goto ret_status; } - pTdlsPeer = wlan_hdd_tdls_find_peer(pAdapter, peer, true); + + mutex_lock(&pHddCtx->tdls_lock); + pTdlsPeer = wlan_hdd_tdls_find_peer(pAdapter, peer, false); if (NULL == pTdlsPeer) { hdd_notice("peer matching" MAC_ADDRESS_STR "not found", MAC_ADDR_ARRAY(peer)); - return -EINVAL; + status = -EINVAL; + goto rel_lock; } else { wlan_hdd_tdls_indicate_teardown(pAdapter, pTdlsPeer, eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON, - true); + false); hdd_send_wlan_tdls_teardown_event( eTDLS_TEARDOWN_EXT_CTRL, pTdlsPeer->peerMac); } + mutex_unlock(&pHddCtx->tdls_lock); + if (0 != wlan_hdd_tdls_set_force_peer(pAdapter, peer, false)) { QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR, "%s Failed", __func__); - return -EINVAL; + status = -EINVAL; + goto ret_status; + } + + if (pHddCtx->tdls_external_peer_count) + pHddCtx->tdls_external_peer_count--; + + mutex_lock(&pHddCtx->tdls_lock); + pTdlsPeer = wlan_hdd_tdls_find_peer(pAdapter, peer, false); + if (NULL == pTdlsPeer) { + hdd_notice("peer matching" MAC_ADDRESS_STR "not found", + MAC_ADDR_ARRAY(peer)); + status = -EINVAL; + goto rel_lock; + } + if (0 != wlan_hdd_set_callback(pTdlsPeer, NULL)) { + QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR, + "%s TDLS set callback Failed", __func__); + status = -EINVAL; + goto rel_lock; } + mutex_unlock(&pHddCtx->tdls_lock); + /* Update the peer mac to firmware, so firmware * could update the connection table */ @@ -4636,21 +4690,18 @@ int wlan_hdd_tdls_extctrl_deconfig_peer(hdd_adapter_t *pAdapter, eSME_TDLS_PEER_REMOVE_MAC_ADDR)) { hdd_err("TDLS Peer mac update Failed " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(peer)); - return -EINVAL; + status = -EINVAL; + goto ret_status; } - if (pHddCtx->tdls_external_peer_count) - pHddCtx->tdls_external_peer_count--; - /* set tdls connection tracker state */ cds_set_tdls_ct_mode(pHddCtx); + goto ret_status; - if (0 != wlan_hdd_set_callback(pTdlsPeer, NULL)) { - QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR, - "%s TDLS set callback Failed", __func__); - return -EINVAL; - } - return 0; +rel_lock: + mutex_unlock(&pHddCtx->tdls_lock); +ret_status: + return status; } /** |
