qcacld-3.0: Fix race condition in peer attach and map

Fix a race condition where the HTT peer map event is received before
the peer object is allocated in the data path.

CRs-Fixed: 1089662
Change-Id: I3931e6dbae3ec3a68d446c245432549fa635a97e
This commit is contained in:
Dhanashri Atre
2016-11-10 16:20:46 -08:00
committed by qcabuildsw
parent fc2ed78279
commit 272fd23190
2 changed files with 24 additions and 33 deletions

View File

@@ -5133,8 +5133,10 @@ static struct cdp_cmn_ops ol_ops_cmn = {
.txrx_pdev_attach_target = ol_txrx_pdev_attach_target,
.txrx_pdev_post_attach = ol_txrx_pdev_post_attach,
.txrx_pdev_detach = ol_txrx_pdev_detach,
.txrx_peer_attach = ol_txrx_peer_attach,
.txrx_peer_detach = ol_txrx_peer_detach,
.txrx_peer_create = ol_txrx_peer_attach,
.txrx_peer_setup = NULL,
.txrx_peer_teardown = NULL,
.txrx_peer_delete = ol_txrx_peer_detach,
.txrx_vdev_register = ol_txrx_vdev_register,
.txrx_soc_detach = ol_txrx_soc_detach,
.txrx_get_vdev_mac_addr = ol_txrx_get_vdev_mac_addr,

View File

@@ -77,32 +77,6 @@
#include "wma_nan_datapath.h"
#include "wlan_tgt_def_config.h"
#ifdef QCA_WIFI_QCA8074
#define PEER_ATTACH_WIFI3(peer, soc, vdev, peer_addr) \
do { \
peer = cdp_peer_attach(soc, vdev, peer_addr); \
if (!peer) { \
WMA_LOGE("%s : Unable to attach peer %pM", \
__func__, peer_addr); \
goto err; \
} \
} while (0)
/* Do Nothing */
#define PEER_ATTACH_LEGACY(peer, soc, vdev, peer_addr) {}
#else
/* Do Nothing */
#define PEER_ATTACH_WIFI3(peer, soc, vdev, peer_addr) {}
#define PEER_ATTACH_LEGACY(peer, soc, vdev, peer_addr) \
do { \
peer = cdp_peer_attach(soc, vdev, peer_addr); \
if (!peer) { \
WMA_LOGE("%s : Unable to attach peer %pM", \
__func__, peer_addr); \
goto err; \
} \
} while (0)
#endif /* CONFIG_LITHIUM */
/**
* wma_find_vdev_by_addr() - find vdev_id from mac address
* @wma: wma handle
@@ -1111,7 +1085,7 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
if (roam_synch_in_progress)
cdp_peer_detach_force_delete(soc, peer);
else
cdp_peer_detach(soc, peer);
cdp_peer_delete(soc, peer);
}
peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
if (peer_mac_addr == NULL) {
@@ -1174,7 +1148,17 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, void *pdev, void *vdev,
goto err;
}
PEER_ATTACH_LEGACY(peer, soc, vdev, peer_addr);
/* The peer object should be created before sending the WMI peer
* create command to firmware. This is to prevent a race condition
* where the HTT peer map event is received before the peer object
* is created in the data path
*/
peer = cdp_peer_create(soc, vdev, peer_addr);
if (!peer) {
WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr);
goto err;
}
if (roam_synch_in_progress) {
WMA_LOGE("%s: LFR3: Created peer %p with peer_addr %pM vdev_id %d,"
"peer_count - %d",
@@ -1188,14 +1172,19 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, void *pdev, void *vdev,
if (wmi_unified_peer_create_send(wma->wmi_handle,
&param) != QDF_STATUS_SUCCESS) {
WMA_LOGP("%s : Unable to create peer in Target", __func__);
cdp_peer_detach(soc, peer);
cdp_peer_delete(soc, peer);
goto err;
}
WMA_LOGE("%s: Created peer %p with peer_addr %pM vdev_id %d, peer_count - %d",
__func__, peer, peer_addr, vdev_id,
wma->interfaces[vdev_id].peer_count);
PEER_ATTACH_WIFI3(peer, soc, vdev, peer_addr);
cdp_peer_setup(soc, vdev, peer);
WMA_LOGE("%s: Initialized peer with peer_addr %pM vdev_id %d",
__func__, peer_addr, vdev_id);
mac_addr_raw = cdp_get_vdev_mac_addr(soc, vdev);
if (mac_addr_raw == NULL) {
WMA_LOGE("%s: peer mac addr is NULL", __func__);
@@ -4384,7 +4373,7 @@ void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params)
}
if (peer)
cdp_peer_detach(soc, peer);
cdp_peer_delete(soc, peer);
iface->peer_count--;
WMA_LOGE("%s: Removed peer %p with peer_addr %pM vdevid %d peer_count %d",
__func__, peer, params->bssid, params->smesessionId,