qcacmn: Release peer ref count after handle usage is complete

Race condition is observed as dp_ipa_rx_intrabss_fwd is
accessing da_peer after releasing the ref count of the peer
while that peer is deleted parallelly.
To fix this, da_peer and sa_peer are only assigned if the
peers are found in the vdev.

Change-Id: Ib03835a509d656eb11946c075b820555b04934f8
CRs-Fixed: 2723448
这个提交包含在:
Ananya Gupta
2020-07-02 14:17:34 +05:30
提交者 nshrivas
父节点 2a46481ab9
当前提交 5ecc8a6cbc

查看文件

@@ -1775,20 +1775,20 @@ bool dp_ipa_rx_intrabss_fwd(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
if (!qdf_mem_cmp(eh->h_dest, vdev->mac_addr.raw, QDF_MAC_ADDR_SIZE))
return false;
da_peer = dp_find_peer_by_addr((struct cdp_pdev *)pdev, eh->h_dest);
da_peer = dp_find_peer_by_addr_and_vdev(dp_pdev_to_cdp_pdev(pdev),
dp_vdev_to_cdp_vdev(vdev),
eh->h_dest);
if (!da_peer)
return false;
if (da_peer->vdev != vdev)
return false;
sa_peer = dp_find_peer_by_addr_and_vdev(dp_pdev_to_cdp_pdev(pdev),
dp_vdev_to_cdp_vdev(vdev),
eh->h_source);
sa_peer = dp_find_peer_by_addr((struct cdp_pdev *)pdev, eh->h_source);
if (!sa_peer)
return false;
if (sa_peer->vdev != vdev)
return false;
/*
* In intra-bss forwarding scenario, skb is allocated by IPA driver.
* Need to add skb to internal tracking table to avoid nbuf memory