From 7d845118f8c1c50eea768b38b04cac583f2a3533 Mon Sep 17 00:00:00 2001 From: Liangwei Dong Date: Tue, 27 Sep 2016 22:24:21 -0400 Subject: [PATCH] qcacld-3.0: wma: fix same peer created again issue qcacld-2.0 to qcacld-3.0 propagation This change fixes the connection issue in ap+ap mode. One peer may connect to the second ap while another ap still has the connection with this peer, so the same peer may be created twice. Change-Id: I898ec326fb8cf080e8fa0b4737c897fc790633a0 CRs-Fixed: 955241 --- core/wma/src/wma_dev_if.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 57f3ff49241c..55e33bb22839 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -3412,6 +3412,20 @@ static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta) WMA_LOGE("%s: Peer already exists, Deleted peer with peer_addr %pM", __func__, add_sta->staMac); } + /* The code above only checks the peer existence on its own vdev. + * Need to check whether the peer exists on other vDevs because firmware + * can't create the peer if the peer with same MAC address already + * exists on the pDev. As this peer belongs to other vDevs, just return + * here. + */ + peer = ol_txrx_find_peer_by_addr(pdev, add_sta->staMac, &peer_id); + if (peer) { + WMA_LOGE("%s: My vdev:%d, but Peer exists on other vdev with " + "peer_addr %pM and peer_id %d", + __func__, vdev->vdev_id, add_sta->staMac, peer_id); + add_sta->status = QDF_STATUS_E_FAILURE; + goto send_rsp; + } status = wma_create_peer(wma, pdev, vdev, add_sta->staMac, WMI_PEER_TYPE_DEFAULT, add_sta->smesessionId,