diff --git a/core/hdd/src/wlan_hdd_nan_datapath.c b/core/hdd/src/wlan_hdd_nan_datapath.c index 3c95d1636ebc..9bfd5c8f443c 100644 --- a/core/hdd/src/wlan_hdd_nan_datapath.c +++ b/core/hdd/src/wlan_hdd_nan_datapath.c @@ -865,13 +865,19 @@ static void hdd_ndp_iface_create_rsp_handler(hdd_adapter_t *adapter, uint32_t create_reason = NDP_NAN_DATA_IFACE_CREATE_FAILED; hdd_station_ctx_t *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); struct qdf_mac_addr bc_mac_addr = QDF_MAC_ADDR_BROADCAST_INITIALIZER; - tCsrRoamInfo roam_info = {0}; + tCsrRoamInfo *roam_info; tSirBssDescription tmp_bss_descp = {0}; ENTER(); + roam_info = qdf_mem_malloc(sizeof(*roam_info)); + if (!roam_info) { + hdd_err("failed to allocate memory"); + return; + } if (wlan_hdd_validate_context(hdd_ctx)) /* No way the driver can send response back to user space */ + qdf_mem_free(roam_info); return; if (ndi_rsp) { @@ -968,11 +974,12 @@ static void hdd_ndp_iface_create_rsp_handler(hdd_adapter_t *adapter, sta_ctx->broadcast_staid = ndi_rsp->sta_id; hdd_save_peer(sta_ctx, sta_ctx->broadcast_staid, &bc_mac_addr); - hdd_roam_register_sta(adapter, &roam_info, + hdd_roam_register_sta(adapter, roam_info, sta_ctx->broadcast_staid, &bc_mac_addr, &tmp_bss_descp); hdd_ctx->sta_to_adapter[sta_ctx->broadcast_staid] = adapter; + qdf_mem_free(roam_info); EXIT(); return; @@ -981,6 +988,7 @@ nla_put_failure: kfree_skb(vendor_event); close_ndi: hdd_close_ndi(adapter); + qdf_mem_free(roam_info); return; } @@ -1219,15 +1227,21 @@ static void hdd_ndp_new_peer_ind_handler(hdd_adapter_t *adapter, struct sme_ndp_peer_ind *new_peer_ind = ind_params; hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter); tSirBssDescription tmp_bss_descp = {0}; - tCsrRoamInfo roam_info = {0}; + tCsrRoamInfo *roam_info; struct nan_datapath_ctx *ndp_ctx = WLAN_HDD_GET_NDP_CTX_PTR(adapter); hdd_station_ctx_t *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); ENTER(); + roam_info = qdf_mem_malloc(sizeof(*roam_info)); + if (!roam_info) { + hdd_err("failed to allocate memory"); + return; + } + if (NULL == ind_params) { hdd_err("Invalid new NDP peer params"); - return; + goto free; } hdd_info("session_id: %d, peer_mac: %pM, sta_id: %d", new_peer_ind->session_id, new_peer_ind->peer_mac_addr.bytes, @@ -1236,8 +1250,8 @@ static void hdd_ndp_new_peer_ind_handler(hdd_adapter_t *adapter, /* save peer in ndp ctx */ if (false == hdd_save_peer(sta_ctx, new_peer_ind->sta_id, &new_peer_ind->peer_mac_addr)) { - hdd_err("Ndp peer table full. cannot save new peer"); - return; + hdd_warn("Ndp peer table full. cannot save new peer"); + goto free; } /* this function is called for each new peer */ @@ -1245,17 +1259,19 @@ static void hdd_ndp_new_peer_ind_handler(hdd_adapter_t *adapter, hdd_info("vdev_id: %d, num_peers: %d", adapter->sessionId, ndp_ctx->active_ndp_peers); - hdd_roam_register_sta(adapter, &roam_info, new_peer_ind->sta_id, + hdd_roam_register_sta(adapter, roam_info, new_peer_ind->sta_id, &new_peer_ind->peer_mac_addr, &tmp_bss_descp); hdd_ctx->sta_to_adapter[new_peer_ind->sta_id] = adapter; /* perform following steps for first new peer ind */ if (ndp_ctx->active_ndp_peers == 1) { hdd_conn_set_connection_state(adapter, eConnectionState_NdiConnected); - hdd_wmm_connect(adapter, &roam_info, eCSR_BSS_TYPE_NDI); + hdd_wmm_connect(adapter, roam_info, eCSR_BSS_TYPE_NDI); wlan_hdd_netif_queue_control(adapter, WLAN_WAKE_ALL_NETIF_QUEUE, WLAN_CONTROL_PATH); } +free: + qdf_mem_free(roam_info); EXIT(); } diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index dcf38e73e871..9904d5f2dd6e 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -5652,7 +5652,7 @@ static eCsrJoinState csr_roam_join_next_bss(tpAniSirGlobal mac_ctx, tScanResultList *bss_list = (tScanResultList *) cmd->u.roamCmd.hBSSList; bool done = false; - tCsrRoamInfo roam_info, *roam_info_ptr = NULL; + tCsrRoamInfo *roam_info = NULL; uint32_t session_id = cmd->sessionId; tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id); tCsrRoamProfile *profile = &cmd->u.roamCmd.roamProfile; @@ -5664,8 +5664,12 @@ static eCsrJoinState csr_roam_join_next_bss(tpAniSirGlobal mac_ctx, return eCsrStopRoaming; } - qdf_mem_set(&roam_info, sizeof(roam_info), 0); - qdf_mem_copy(&roam_info.bssid, &session->joinFailStatusCode.bssId, + roam_info = qdf_mem_malloc(sizeof (*roam_info)); + if (!roam_info) { + sme_err("failed to allocate memory"); + return eCsrStopRoaming; + } + qdf_mem_copy(&roam_info->bssid, &session->joinFailStatusCode.bssId, sizeof(tSirMacAddr)); /* * When handling AP's capability change, continue to associate @@ -5696,11 +5700,10 @@ static eCsrJoinState csr_roam_join_next_bss(tpAniSirGlobal mac_ctx, * We need to indicate to HDD that we * are done with this one. */ - roam_info.pBssDesc = cmd->u.roamCmd.pLastRoamBss; + roam_info->pBssDesc = cmd->u.roamCmd.pLastRoamBss; join_status = &session->joinFailStatusCode; - roam_info.statusCode = join_status->statusCode; - roam_info.reasonCode = join_status->reasonCode; - roam_info_ptr = &roam_info; + roam_info->statusCode = join_status->statusCode; + roam_info->reasonCode = join_status->reasonCode; } done = csr_roam_select_bss(mac_ctx, cmd->u.roamCmd.pRoamBssEntry, &result, @@ -5709,11 +5712,9 @@ static eCsrJoinState csr_roam_join_next_bss(tpAniSirGlobal mac_ctx, if (done) goto end; } - if (!roam_info_ptr) - roam_info_ptr = &roam_info; - roam_info_ptr->u.pConnectedProfile = &session->connectedProfile; + roam_info->u.pConnectedProfile = &session->connectedProfile; - csr_roam_join_handle_profile(mac_ctx, session_id, cmd, roam_info_ptr, + csr_roam_join_handle_profile(mac_ctx, session_id, cmd, roam_info, &roam_state, result, scan_result); end: if ((eCsrStopRoaming == roam_state) && CSR_IS_INFRASTRUCTURE(profile) && @@ -5727,13 +5728,13 @@ end: * Complete the last assoc attempte as a * new one is about to be tried */ - roam_info_ptr = &roam_info; - roam_info_ptr->pProfile = profile; + roam_info->pProfile = profile; csr_roam_call_callback(mac_ctx, session_id, - roam_info_ptr, cmd->u.roamCmd.roamId, + roam_info, cmd->u.roamCmd.roamId, eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_NOT_ASSOCIATED); } + qdf_mem_free(roam_info); return roam_state; } @@ -9534,7 +9535,7 @@ void csr_roam_roaming_state_disassoc_rsp_processor(tpAniSirGlobal pMac, tSirSmeDisassocRsp *pSmeRsp) { tScanResultHandle hBSSList; - tCsrRoamInfo roamInfo; + tCsrRoamInfo *roamInfo; tCsrScanResultFilter *pScanFilter = NULL; uint32_t roamId = 0; tCsrRoamProfile *pCurRoamProfile = NULL; @@ -9560,6 +9561,13 @@ void csr_roam_roaming_state_disassoc_rsp_processor(tpAniSirGlobal pMac, return; } + roamInfo = qdf_mem_malloc(sizeof(*roamInfo)); + + if (!roamInfo) { + sme_err("failed to allocate memory"); + return; + } + if (CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN(pMac, sessionId)) { sme_debug("***eCsrNothingToJoin***"); csr_roam_complete(pMac, eCsrNothingToJoin, NULL, sessionId); @@ -9593,12 +9601,12 @@ void csr_roam_roaming_state_disassoc_rsp_processor(tpAniSirGlobal pMac, csr_dequeue_command(pMac); /* notify HDD about handoff and provide the BSSID too */ - roamInfo.reasonCode = eCsrRoamReasonBetterAP; + roamInfo->reasonCode = eCsrRoamReasonBetterAP; - qdf_copy_macaddr(&roamInfo.bssid, + qdf_copy_macaddr(&roamInfo->bssid, pNeighborRoamInfo->csrNeighborRoamProfile.BSSIDs.bssid); - csr_roam_call_callback(pMac, sessionId, &roamInfo, 0, + csr_roam_call_callback(pMac, sessionId, roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE); @@ -9631,12 +9639,13 @@ void csr_roam_roaming_state_disassoc_rsp_processor(tpAniSirGlobal pMac, qdf_mem_free(pCurRoamProfile); csr_free_scan_filter(pMac, pScanFilter); qdf_mem_free(pScanFilter); + qdf_mem_free(roamInfo); return; } csr_scan_result_purge(pMac, hBSSList); POST_ROAM_FAILURE: - csr_post_roam_failure(pMac, sessionId, &roamInfo, + csr_post_roam_failure(pMac, sessionId, roamInfo, pScanFilter, pCurRoamProfile); } /* else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac ) ) */ else if (CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL(pMac, sessionId)) { @@ -9665,6 +9674,7 @@ POST_ROAM_FAILURE: /* We are not done yet. Get the data and continue roaming */ csr_roam_reissue_roam_command(pMac, sessionId); } + qdf_mem_free(roamInfo); } static void csr_roam_roaming_state_deauth_rsp_processor(tpAniSirGlobal pMac, diff --git a/core/sme/src/csr/csr_tdls_process.c b/core/sme/src/csr/csr_tdls_process.c index e11fac065138..9ee2dad46069 100644 --- a/core/sme/src/csr/csr_tdls_process.c +++ b/core/sme/src/csr/csr_tdls_process.c @@ -665,7 +665,7 @@ QDF_STATUS csr_tdls_process_link_establish(tpAniSirGlobal pMac, tSmeCmd *cmd) QDF_STATUS tdls_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, void *pMsgBuf) { - tCsrRoamInfo roamInfo = { 0 }; + tCsrRoamInfo *roamInfo; eCsrRoamResult roamResult; tSirSmeRsp *sme_rsp = pMsgBuf; tSirTdlsAddStaRsp *addStaRsp = (tSirTdlsAddStaRsp *) pMsgBuf; @@ -679,6 +679,11 @@ QDF_STATUS tdls_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, (tSirTdlsLinkEstablishReqRsp *) pMsgBuf; tSirTdlsEventnotify *tevent = (tSirTdlsEventnotify *) pMsgBuf; + roamInfo = qdf_mem_malloc(sizeof(*roamInfo)); + if (!roamInfo) { + sme_err("failed to allocate memory"); + return QDF_STATUS_E_FAILURE; + } switch (msgType) { case eWNI_SME_TDLS_SEND_MGMT_RSP: { @@ -695,7 +700,7 @@ QDF_STATUS tdls_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, if (eSIR_SME_SUCCESS != msg->statusCode) { /* Tx failed, so there wont be any ack confirmation*/ /* Indicate ack failure to upper layer */ - roamInfo.reasonCode = 0; + roamInfo->reasonCode = 0; csr_roam_call_callback(pMac, msg->sessionId, &roam_info, 0, eCSR_ROAM_RESULT_MGMT_TX_COMPLETE_IND, @@ -704,11 +709,11 @@ QDF_STATUS tdls_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, break; } case eWNI_SME_TDLS_ADD_STA_RSP: - qdf_copy_macaddr(&roamInfo.peerMac, &addStaRsp->peermac); - roamInfo.staId = addStaRsp->staId; - roamInfo.ucastSig = addStaRsp->ucastSig; - roamInfo.bcastSig = addStaRsp->bcastSig; - roamInfo.statusCode = addStaRsp->statusCode; + qdf_copy_macaddr(&roamInfo->peerMac, &addStaRsp->peermac); + roamInfo->staId = addStaRsp->staId; + roamInfo->ucastSig = addStaRsp->ucastSig; + roamInfo->bcastSig = addStaRsp->bcastSig; + roamInfo->statusCode = addStaRsp->statusCode; /* * register peer with TL, we have to go through HDD as * this is the only way to register any STA with TL. @@ -718,7 +723,7 @@ QDF_STATUS tdls_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, else /* addStaRsp->tdlsAddOper must be TDLS_OPER_UPDATE */ roamResult = eCSR_ROAM_RESULT_UPDATE_TDLS_PEER; csr_roam_call_callback(pMac, addStaRsp->sessionId, - &roamInfo, 0, eCSR_ROAM_TDLS_STATUS_UPDATE, + roamInfo, 0, eCSR_ROAM_TDLS_STATUS_UPDATE, roamResult); /* remove pending eSmeCommandTdlsDiscovery command */ @@ -726,15 +731,15 @@ QDF_STATUS tdls_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, addStaRsp->sessionId); break; case eWNI_SME_TDLS_DEL_STA_RSP: - qdf_copy_macaddr(&roamInfo.peerMac, &delStaRsp->peermac); - roamInfo.staId = delStaRsp->staId; - roamInfo.statusCode = delStaRsp->statusCode; + qdf_copy_macaddr(&roamInfo->peerMac, &delStaRsp->peermac); + roamInfo->staId = delStaRsp->staId; + roamInfo->statusCode = delStaRsp->statusCode; /* * register peer with TL, we have to go through HDD as * this is the only way to register any STA with TL. */ csr_roam_call_callback(pMac, delStaRsp->sessionId, - &roamInfo, 0, + roamInfo, 0, eCSR_ROAM_TDLS_STATUS_UPDATE, eCSR_ROAM_RESULT_DELETE_TDLS_PEER); @@ -742,14 +747,14 @@ QDF_STATUS tdls_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, delStaRsp->sessionId); break; case eWNI_SME_TDLS_DEL_STA_IND: - qdf_copy_macaddr(&roamInfo.peerMac, + qdf_copy_macaddr(&roamInfo->peerMac, &pSirTdlsDelStaInd->peermac); - roamInfo.staId = pSirTdlsDelStaInd->staId; - roamInfo.reasonCode = pSirTdlsDelStaInd->reasonCode; + roamInfo->staId = pSirTdlsDelStaInd->staId; + roamInfo->reasonCode = pSirTdlsDelStaInd->reasonCode; /* Sending the TEARDOWN indication to HDD. */ csr_roam_call_callback(pMac, - pSirTdlsDelStaInd->sessionId, &roamInfo, + pSirTdlsDelStaInd->sessionId, roamInfo, 0, eCSR_ROAM_TDLS_STATUS_UPDATE, eCSR_ROAM_RESULT_TEARDOWN_TDLS_PEER_IND); break; @@ -757,24 +762,24 @@ QDF_STATUS tdls_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, /* Sending the TEARDOWN indication to HDD. */ csr_roam_call_callback(pMac, pSirTdlsDelAllPeerInd->sessionId, - &roamInfo, 0, + roamInfo, 0, eCSR_ROAM_TDLS_STATUS_UPDATE, eCSR_ROAM_RESULT_DELETE_ALL_TDLS_PEER_IND); break; case eWNI_SME_MGMT_FRM_TX_COMPLETION_IND: - roamInfo.reasonCode = + roamInfo->reasonCode = tdls_tx_comp_ind->txCompleteStatus; csr_roam_call_callback(pMac, tdls_tx_comp_ind->sessionId, - &roamInfo, 0, + roamInfo, 0, eCSR_ROAM_RESULT_MGMT_TX_COMPLETE_IND, 0); break; case eWNI_SME_TDLS_LINK_ESTABLISH_RSP: csr_roam_call_callback(pMac, linkEstablishReqRsp->sessionId, - &roamInfo, 0, + roamInfo, 0, eCSR_ROAM_TDLS_STATUS_UPDATE, eCSR_ROAM_RESULT_LINK_ESTABLISH_REQ_RSP); /* remove pending eSmeCommandTdlsLinkEstablish command */ @@ -782,56 +787,57 @@ QDF_STATUS tdls_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, linkEstablishReqRsp->sessionId); break; case eWNI_SME_TDLS_SHOULD_DISCOVER: - qdf_copy_macaddr(&roamInfo.peerMac, &tevent->peermac); - roamInfo.reasonCode = tevent->peer_reason; + qdf_copy_macaddr(&roamInfo->peerMac, &tevent->peermac); + roamInfo->reasonCode = tevent->peer_reason; QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, "%s: eWNI_SME_TDLS_SHOULD_DISCOVER for peer mac: " MAC_ADDRESS_STR " peer_reason: %d", __func__, MAC_ADDR_ARRAY(tevent->peermac.bytes), tevent->peer_reason); - csr_roam_call_callback(pMac, tevent->sessionId, &roamInfo, + csr_roam_call_callback(pMac, tevent->sessionId, roamInfo, 0, eCSR_ROAM_TDLS_STATUS_UPDATE, eCSR_ROAM_RESULT_TDLS_SHOULD_DISCOVER); break; case eWNI_SME_TDLS_SHOULD_TEARDOWN: - qdf_copy_macaddr(&roamInfo.peerMac, &tevent->peermac); - roamInfo.reasonCode = tevent->peer_reason; + qdf_copy_macaddr(&roamInfo->peerMac, &tevent->peermac); + roamInfo->reasonCode = tevent->peer_reason; QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, "%s: eWNI_SME_TDLS_SHOULD_TEARDOWN for peer mac: " MAC_ADDRESS_STR " peer_reason: %d", __func__, MAC_ADDR_ARRAY(tevent->peermac.bytes), tevent->peer_reason); - csr_roam_call_callback(pMac, tevent->sessionId, &roamInfo, + csr_roam_call_callback(pMac, tevent->sessionId, roamInfo, 0, eCSR_ROAM_TDLS_STATUS_UPDATE, eCSR_ROAM_RESULT_TDLS_SHOULD_TEARDOWN); break; case eWNI_SME_TDLS_PEER_DISCONNECTED: - qdf_copy_macaddr(&roamInfo.peerMac, &tevent->peermac); - roamInfo.reasonCode = tevent->peer_reason; + qdf_copy_macaddr(&roamInfo->peerMac, &tevent->peermac); + roamInfo->reasonCode = tevent->peer_reason; QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, "%s: eWNI_SME_TDLS_PEER_DISCONNECTED for peer mac: " MAC_ADDRESS_STR " peer_reason: %d", __func__, MAC_ADDR_ARRAY(tevent->peermac.bytes), tevent->peer_reason); - csr_roam_call_callback(pMac, tevent->sessionId, &roamInfo, + csr_roam_call_callback(pMac, tevent->sessionId, roamInfo, 0, eCSR_ROAM_TDLS_STATUS_UPDATE, eCSR_ROAM_RESULT_TDLS_SHOULD_PEER_DISCONNECTED); break; case eWNI_SME_TDLS_CONNECTION_TRACKER_NOTIFICATION: - qdf_copy_macaddr(&roamInfo.peerMac, &tevent->peermac); - roamInfo.reasonCode = tevent->peer_reason; + qdf_copy_macaddr(&roamInfo->peerMac, &tevent->peermac); + roamInfo->reasonCode = tevent->peer_reason; QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, "%s: eWNI_SME_TDLS_CONNECTION_TRACKER_NOTIFICATION for peer mac: " MAC_ADDRESS_STR " peer_reason: %d", __func__, MAC_ADDR_ARRAY(tevent->peermac.bytes), tevent->peer_reason); - csr_roam_call_callback(pMac, tevent->sessionId, &roamInfo, + csr_roam_call_callback(pMac, tevent->sessionId, roamInfo, 0, eCSR_ROAM_TDLS_STATUS_UPDATE, eCSR_ROAM_RESULT_TDLS_CONNECTION_TRACKER_NOTIFICATION); break; default: break; } + qdf_mem_free(roamInfo); return QDF_STATUS_SUCCESS; }