diff options
| author | Nitesh Shah <niteshs@codeaurora.org> | 2017-01-31 15:43:31 +0530 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2017-03-03 16:34:54 -0800 |
| commit | e0c24475aed755cf099e2c849b2f2d9e6bb884bf (patch) | |
| tree | 059aca59abc8993b7964564afc184ec1efcfe72b | |
| parent | ce2cc70c6231b7e679513da46b5d372d96c0e8b2 (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 hdd_roam_tdls_status
_update_handler(), wlan_hdd_tdls_ct_sampling_tx_rx() and
wlan_hdd_tdls_update_tx_pkt_cnt().
Change-Id: I7e3e74d149b3dfe527aeb01ee5b3d7a51b16fc61
CRs-Fixed: 2009223
| -rw-r--r-- | core/hdd/src/wlan_hdd_assoc.c | 13 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_tdls.c | 33 |
2 files changed, 25 insertions, 21 deletions
diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 8eebbc3f42b5..adaae0a44900 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -3870,10 +3870,20 @@ hdd_roam_tdls_status_update_handler(hdd_adapter_t *pAdapter, break; } + mutex_lock(&pHddCtx->tdls_lock); + pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter); + if (!pHddTdlsCtx) { + mutex_unlock(&pHddCtx->tdls_lock); + hdd_info("TDLS ctx is null, ignore roamResult (%d)", + roamResult); + status = QDF_STATUS_E_FAILURE; + break; + } + curr_peer = wlan_hdd_tdls_get_peer(pAdapter, pRoamInfo->peerMac.bytes, - true); + false); if (!curr_peer) { hdd_info("curr_peer is null"); status = QDF_STATUS_E_FAILURE; @@ -3907,6 +3917,7 @@ hdd_roam_tdls_status_update_handler(hdd_adapter_t *pAdapter, } status = QDF_STATUS_SUCCESS; } + mutex_unlock(&pHddCtx->tdls_lock); break; } diff --git a/core/hdd/src/wlan_hdd_tdls.c b/core/hdd/src/wlan_hdd_tdls.c index 6a59c9abe151..9784e53667ed 100644 --- a/core/hdd/src/wlan_hdd_tdls.c +++ b/core/hdd/src/wlan_hdd_tdls.c @@ -5426,7 +5426,6 @@ int hdd_set_tdls_offchannelmode(hdd_adapter_t *adapter, int offchanmode) * wlan_hdd_tdls_ct_sampling_tx_rx() - collect tx/rx traffic sample * @adapter: pointer to hdd adapter * @hdd_ctx: hdd context - * @tdls_ctx: tdls context * * Function to update data traffic information in tdls connection * tracker data structure for connection tracker operation @@ -5434,8 +5433,7 @@ int hdd_set_tdls_offchannelmode(hdd_adapter_t *adapter, int offchanmode) * Return: None */ static void wlan_hdd_tdls_ct_sampling_tx_rx(hdd_adapter_t *adapter, - hdd_context_t *hdd_ctx, - tdlsCtx_t *tdls_ctx) + hdd_context_t *hdd_ctx) { hddTdlsPeer_t *curr_peer; uint8_t mac[QDF_MAC_ADDR_SIZE]; @@ -5461,7 +5459,7 @@ static void wlan_hdd_tdls_ct_sampling_tx_rx(hdd_adapter_t *adapter, hdd_ctx->valid_mac_entries = 0; qdf_spin_unlock_bh(&hdd_ctx->tdls_ct_spinlock); - + mutex_lock(&hdd_ctx->tdls_lock); for (mac_cnt = 0; mac_cnt < valid_mac_entries; mac_cnt++) { memcpy(mac, ct_peer_mac_table[mac_cnt].mac_address.bytes, QDF_MAC_ADDR_SIZE); @@ -5473,6 +5471,7 @@ static void wlan_hdd_tdls_ct_sampling_tx_rx(hdd_adapter_t *adapter, ct_peer_mac_table[mac_cnt].rx_packet_cnt; } } + mutex_unlock(&hdd_ctx->tdls_lock); } /** @@ -5560,7 +5559,6 @@ void wlan_hdd_tdls_update_tx_pkt_cnt(hdd_adapter_t *adapter, { hdd_context_t *hdd_ctx; hdd_station_ctx_t *hdd_sta_ctx; - tdlsCtx_t *tdls_ctx; uint8_t mac_cnt; uint8_t valid_mac_entries; struct qdf_mac_addr *mac_addr; @@ -5579,8 +5577,6 @@ void wlan_hdd_tdls_update_tx_pkt_cnt(hdd_adapter_t *adapter, QDF_MAC_ADDR_SIZE) == 0) return; - tdls_ctx = adapter->sessionCtx.station.pHddTdlsCtx; - qdf_spin_lock_bh(&hdd_ctx->tdls_ct_spinlock); valid_mac_entries = hdd_ctx->valid_mac_entries; @@ -6032,25 +6028,24 @@ static void wlan_hdd_tdls_ct_handler(void *user_data) if (0 != (wlan_hdd_validate_context(hdd_ctx))) return; + /* If any concurrency is detected */ + if (!hdd_ctx->enable_tdls_connection_tracker) { + hdd_info("Connection tracker is disabled"); + return; + } + + /* Update tx rx traffic sample in tdls data structures */ + wlan_hdd_tdls_ct_sampling_tx_rx(adapter, hdd_ctx); mutex_lock(&hdd_ctx->tdls_lock); - hdd_tdls_ctx = adapter->sessionCtx.station.pHddTdlsCtx; + hdd_tdls_ctx = WLAN_HDD_GET_TDLS_CTX_PTR(adapter); if (NULL == hdd_tdls_ctx) { + mutex_unlock(&hdd_ctx->tdls_lock); hdd_err("Invalid hdd_tdls_ctx context"); return; } - /* If any concurrency is detected */ - if (!hdd_ctx->enable_tdls_connection_tracker) - goto restart_return; - - - - /* Update tx rx traffic sample in tdls data structures */ - wlan_hdd_tdls_ct_sampling_tx_rx(adapter, hdd_ctx, - hdd_tdls_ctx); - for (i = 0; i < TDLS_PEER_LIST_SIZE; i++) { head = &hdd_tdls_ctx->peer_list[i]; list_for_each(pos, head) { @@ -6062,8 +6057,6 @@ static void wlan_hdd_tdls_ct_handler(void *user_data) } } - -restart_return: wlan_hdd_tdls_timer_restart(hdd_tdls_ctx->pAdapter, &hdd_tdls_ctx->peer_update_timer, hdd_tdls_ctx->threshold_config.tx_period_t); |
