summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNitesh Shah <niteshs@codeaurora.org>2017-01-31 15:43:31 +0530
committerqcabuildsw <qcabuildsw@localhost>2017-03-03 16:34:54 -0800
commite0c24475aed755cf099e2c849b2f2d9e6bb884bf (patch)
tree059aca59abc8993b7964564afc184ec1efcfe72b
parentce2cc70c6231b7e679513da46b5d372d96c0e8b2 (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.c13
-rw-r--r--core/hdd/src/wlan_hdd_tdls.c33
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);