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:

committed by
qcabuildsw

parent
fc2ed78279
commit
272fd23190
@@ -5133,8 +5133,10 @@ static struct cdp_cmn_ops ol_ops_cmn = {
|
|||||||
.txrx_pdev_attach_target = ol_txrx_pdev_attach_target,
|
.txrx_pdev_attach_target = ol_txrx_pdev_attach_target,
|
||||||
.txrx_pdev_post_attach = ol_txrx_pdev_post_attach,
|
.txrx_pdev_post_attach = ol_txrx_pdev_post_attach,
|
||||||
.txrx_pdev_detach = ol_txrx_pdev_detach,
|
.txrx_pdev_detach = ol_txrx_pdev_detach,
|
||||||
.txrx_peer_attach = ol_txrx_peer_attach,
|
.txrx_peer_create = ol_txrx_peer_attach,
|
||||||
.txrx_peer_detach = ol_txrx_peer_detach,
|
.txrx_peer_setup = NULL,
|
||||||
|
.txrx_peer_teardown = NULL,
|
||||||
|
.txrx_peer_delete = ol_txrx_peer_detach,
|
||||||
.txrx_vdev_register = ol_txrx_vdev_register,
|
.txrx_vdev_register = ol_txrx_vdev_register,
|
||||||
.txrx_soc_detach = ol_txrx_soc_detach,
|
.txrx_soc_detach = ol_txrx_soc_detach,
|
||||||
.txrx_get_vdev_mac_addr = ol_txrx_get_vdev_mac_addr,
|
.txrx_get_vdev_mac_addr = ol_txrx_get_vdev_mac_addr,
|
||||||
|
@@ -77,32 +77,6 @@
|
|||||||
#include "wma_nan_datapath.h"
|
#include "wma_nan_datapath.h"
|
||||||
#include "wlan_tgt_def_config.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_find_vdev_by_addr() - find vdev_id from mac address
|
||||||
* @wma: wma handle
|
* @wma: wma handle
|
||||||
@@ -1111,7 +1085,7 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
|
|||||||
if (roam_synch_in_progress)
|
if (roam_synch_in_progress)
|
||||||
cdp_peer_detach_force_delete(soc, peer);
|
cdp_peer_detach_force_delete(soc, peer);
|
||||||
else
|
else
|
||||||
cdp_peer_detach(soc, peer);
|
cdp_peer_delete(soc, peer);
|
||||||
}
|
}
|
||||||
peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
|
peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
|
||||||
if (peer_mac_addr == NULL) {
|
if (peer_mac_addr == NULL) {
|
||||||
@@ -1174,7 +1148,17 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, void *pdev, void *vdev,
|
|||||||
goto err;
|
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) {
|
if (roam_synch_in_progress) {
|
||||||
WMA_LOGE("%s: LFR3: Created peer %p with peer_addr %pM vdev_id %d,"
|
WMA_LOGE("%s: LFR3: Created peer %p with peer_addr %pM vdev_id %d,"
|
||||||
"peer_count - %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,
|
if (wmi_unified_peer_create_send(wma->wmi_handle,
|
||||||
¶m) != QDF_STATUS_SUCCESS) {
|
¶m) != QDF_STATUS_SUCCESS) {
|
||||||
WMA_LOGP("%s : Unable to create peer in Target", __func__);
|
WMA_LOGP("%s : Unable to create peer in Target", __func__);
|
||||||
cdp_peer_detach(soc, peer);
|
cdp_peer_delete(soc, peer);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
WMA_LOGE("%s: Created peer %p with peer_addr %pM vdev_id %d, peer_count - %d",
|
WMA_LOGE("%s: Created peer %p with peer_addr %pM vdev_id %d, peer_count - %d",
|
||||||
__func__, peer, peer_addr, vdev_id,
|
__func__, peer, peer_addr, vdev_id,
|
||||||
wma->interfaces[vdev_id].peer_count);
|
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);
|
mac_addr_raw = cdp_get_vdev_mac_addr(soc, vdev);
|
||||||
if (mac_addr_raw == NULL) {
|
if (mac_addr_raw == NULL) {
|
||||||
WMA_LOGE("%s: peer mac addr is NULL", __func__);
|
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)
|
if (peer)
|
||||||
cdp_peer_detach(soc, peer);
|
cdp_peer_delete(soc, peer);
|
||||||
iface->peer_count--;
|
iface->peer_count--;
|
||||||
WMA_LOGE("%s: Removed peer %p with peer_addr %pM vdevid %d peer_count %d",
|
WMA_LOGE("%s: Removed peer %p with peer_addr %pM vdevid %d peer_count %d",
|
||||||
__func__, peer, params->bssid, params->smesessionId,
|
__func__, peer, params->bssid, params->smesessionId,
|
||||||
|
Reference in New Issue
Block a user