From c4c222535f555ee4700fda777782abf28adf2d6d Mon Sep 17 00:00:00 2001 From: Mohit Khanna Date: Mon, 20 Nov 2017 11:06:33 -0800 Subject: [PATCH] qcacld-3.0: Replace cdp peer_find_by_addr by get_ref_by_addr Change the existing cdp_peer_find_by_addr by calls to cdp_peer_get_ref_by_addr and cdp_peer_release_ref. The new APIs make sure that the peer is valid as long as the peer reference is not released (call to cdp_peer_release_ref) Change-Id: Ibde9944a9721e5dcf0f7838058c229539efae7e4 CRs-Fixed: 2139801 --- core/mac/src/pe/lim/lim_process_action_frame.c | 10 ++++++++-- core/mac/src/pe/lim/lim_send_management_frames.c | 4 +++- core/wma/src/wma_mgmt.c | 9 ++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/core/mac/src/pe/lim/lim_process_action_frame.c b/core/mac/src/pe/lim/lim_process_action_frame.c index 31f1e3096503..e8e94b6e717e 100644 --- a/core/mac/src/pe/lim/lim_process_action_frame.c +++ b/core/mac/src/pe/lim/lim_process_action_frame.c @@ -1676,7 +1676,8 @@ static void lim_process_addba_req(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, status, frame_len); } - peer = cdp_peer_find_by_addr(soc, pdev, mac_hdr->sa, &peer_id); + peer = cdp_peer_get_ref_by_addr(soc, pdev, mac_hdr->sa, &peer_id, + PEER_DEBUG_ID_WMA_ADDBA_REQ); if (!peer) { pe_err("PEER [%pM] not found", mac_hdr->sa); goto error; @@ -1689,6 +1690,8 @@ static void lim_process_addba_req(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, addba_req->addba_param_set.buff_size, addba_req->ba_start_seq_ctrl.ssn); + cdp_peer_release_ref(soc, peer, PEER_DEBUG_ID_WMA_ADDBA_REQ); + if (QDF_STATUS_SUCCESS == qdf_status) { lim_send_addba_response_frame(mac_ctx, mac_hdr->sa, addba_req->addba_param_set.tid, session); @@ -1755,7 +1758,8 @@ static void lim_process_delba_req(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, status, frame_len); } - peer = cdp_peer_find_by_addr(soc, pdev, mac_hdr->sa, &peer_id); + peer = cdp_peer_get_ref_by_addr(soc, pdev, mac_hdr->sa, &peer_id, + PEER_DEBUG_ID_WMA_DELBA_REQ); if (!peer) { pe_err("PEER [%pM] not found", mac_hdr->sa); goto error; @@ -1764,6 +1768,8 @@ static void lim_process_delba_req(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, qdf_status = cdp_delba_process(soc, peer, delba_req->delba_param_set.tid, delba_req->Reason.code); + cdp_peer_release_ref(soc, peer, PEER_DEBUG_ID_WMA_DELBA_REQ); + if (QDF_STATUS_SUCCESS != qdf_status) pe_err("Failed to process delba request"); diff --git a/core/mac/src/pe/lim/lim_send_management_frames.c b/core/mac/src/pe/lim/lim_send_management_frames.c index 4305dc05dec5..ac388c0df587 100644 --- a/core/mac/src/pe/lim/lim_send_management_frames.c +++ b/core/mac/src/pe/lim/lim_send_management_frames.c @@ -4691,7 +4691,8 @@ QDF_STATUS lim_send_addba_response_frame(tpAniSirGlobal mac_ctx, return QDF_STATUS_E_FAILURE; } - peer = cdp_peer_find_by_addr(soc, pdev, peer_mac, &peer_id); + peer = cdp_peer_get_ref_by_addr(soc, pdev, peer_mac, &peer_id, + PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP); if (!peer) { pe_err("PEER [%pM] not found", peer_mac); return QDF_STATUS_E_FAILURE; @@ -4700,6 +4701,7 @@ QDF_STATUS lim_send_addba_response_frame(tpAniSirGlobal mac_ctx, cdp_addba_responsesetup(soc, peer, tid, &dialog_token, &status_code, &buff_size, &batimeout); + cdp_peer_release_ref(soc, peer, PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP); qdf_mem_set((uint8_t *) &frm, sizeof(frm), 0); frm.Category.category = SIR_MAC_ACTION_BLKACK; frm.Action.action = SIR_MAC_ADDBA_RSP; diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index 0b430ea3ecda..227d7550a811 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -3447,7 +3447,7 @@ static bool wma_is_pkt_drop_candidate(tp_wma_handle wma_handle, uint8_t *peer_addr, uint8_t *bssid, uint8_t subtype) { - void *peer; + void *peer = NULL; struct cdp_pdev *pdev_ctx; uint8_t peer_id; bool should_drop = false; @@ -3481,8 +3481,8 @@ static bool wma_is_pkt_drop_candidate(tp_wma_handle wma_handle, goto end; } - peer = cdp_peer_find_by_addr(soc, pdev_ctx, - peer_addr, &peer_id); + peer = cdp_peer_get_ref_by_addr(soc, pdev_ctx, peer_addr, &peer_id, + PEER_DEBUG_ID_WMA_PKT_DROP); if (!peer) { if (IEEE80211_FC0_SUBTYPE_ASSOC_REQ != subtype) { WMA_LOGI( @@ -3547,6 +3547,9 @@ static bool wma_is_pkt_drop_candidate(tp_wma_handle wma_handle, } end: + if (peer) + cdp_peer_release_ref(soc, peer, PEER_DEBUG_ID_WMA_PKT_DROP); + return should_drop; }