diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 8b633a9e6de3..ed5baa4122e7 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -1383,13 +1383,6 @@ static void hdd_send_association_event(struct net_device *dev, chan_info.reg_info_2 = pCsrRoamInfo->chan_info.reg_info_2; - ret = hdd_objmgr_add_peer_object(adapter->hdd_vdev, - adapter->device_mode, - peerMacAddr.bytes, - false); - if (ret) - hdd_err("Peer object "MAC_ADDRESS_STR" add fails!", - MAC_ADDR_ARRAY(peerMacAddr.bytes)); ret = hdd_objmgr_set_peer_mlme_state(adapter->hdd_vdev, WLAN_ASSOC_STATE); if (ret) @@ -1451,11 +1444,6 @@ static void hdd_send_association_event(struct net_device *dev, adapter->session_id, NULL, adapter->device_mode); - ret = hdd_objmgr_remove_peer_object(adapter->hdd_vdev, - peerMacAddr.bytes); - if (ret) - hdd_err("Peer obj "MAC_ADDRESS_STR" delete fails", - MAC_ADDR_ARRAY(peerMacAddr.bytes)); } hdd_lpass_notify_disconnect(adapter); @@ -1592,31 +1580,6 @@ static void hdd_clear_roam_profile_ie(struct hdd_adapter *adapter) hdd_exit(); } -/** - * hdd_wlan_get_ibss_mac_addr_from_staid() - Get IBSS MAC address - * @adapter: Adapter upon which the IBSS client is active - * @staIdx: Station index of the IBSS peer - * - * Return: a pointer to the MAC address of the IBSS peer if the peer is - * found, otherwise %NULL. - */ -static struct qdf_mac_addr * -hdd_wlan_get_ibss_mac_addr_from_staid(struct hdd_adapter *adapter, - uint8_t staIdx) -{ - uint8_t idx; - struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); - - for (idx = 0; idx < MAX_PEERS; idx++) { - if (HDD_WLAN_INVALID_STA_ID != - sta_ctx->conn_info.staId[idx] && - staIdx == sta_ctx->conn_info.staId[idx]) { - return &sta_ctx->conn_info.peerMacAddress[idx]; - } - } - return NULL; -} - /** * hdd_roam_deregister_sta() - deregister station * @adapter: pointer to adapter @@ -1627,10 +1590,6 @@ hdd_wlan_get_ibss_mac_addr_from_staid(struct hdd_adapter *adapter, QDF_STATUS hdd_roam_deregister_sta(struct hdd_adapter *adapter, uint8_t staid) { QDF_STATUS qdf_status; - struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); - int ret = 0; - struct qdf_mac_addr *peer_mac = NULL; - struct qdf_mac_addr broadcastMacAddr = QDF_MAC_ADDR_BCAST_INIT; qdf_status = cdp_clear_peer(cds_get_context(QDF_MODULE_ID_SOC), (struct cdp_pdev *)cds_get_context(QDF_MODULE_ID_TXRX), @@ -1640,30 +1599,6 @@ QDF_STATUS hdd_roam_deregister_sta(struct hdd_adapter *adapter, uint8_t staid) staid, qdf_status, qdf_status); } - if (adapter->device_mode == QDF_STA_MODE) { - peer_mac = &sta_ctx->conn_info.bssId; - } else if (adapter->device_mode == QDF_IBSS_MODE || - adapter->device_mode == QDF_NDI_MODE) { - if (sta_ctx->broadcast_staid == staid) - peer_mac = &broadcastMacAddr; - else - peer_mac = - hdd_wlan_get_ibss_mac_addr_from_staid(adapter, staid); - } - - if (!peer_mac) { - hdd_err("Coudnt find peer MAC for staid %d, delete fails", - staid); - return QDF_STATUS_E_FAILURE; - } - - hdd_debug("peer_mac_addr: "MAC_ADDRESS_STR, - MAC_ADDR_ARRAY(peer_mac->bytes)); - ret = hdd_objmgr_remove_peer_object(adapter->hdd_vdev, peer_mac->bytes); - if (ret) { - hdd_err("Peer obj %pM delete fails", peer_mac); - return QDF_STATUS_E_FAILURE; - } return qdf_status; } @@ -3480,7 +3415,6 @@ static void hdd_roam_ibss_indication_handler(struct hdd_adapter *adapter, struct hdd_station_ctx *hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); struct qdf_mac_addr broadcastMacAddr = QDF_MAC_ADDR_BCAST_INIT; - int ret; if (NULL == roam_info) { QDF_ASSERT(0); @@ -3509,13 +3443,6 @@ static void hdd_roam_ibss_indication_handler(struct hdd_adapter *adapter, roam_info->staId, &broadcastMacAddr, roam_info->pBssDesc); - ret = hdd_objmgr_add_peer_object(adapter->hdd_vdev, - QDF_IBSS_MODE, - broadcastMacAddr.bytes, - false); - if (ret) - hdd_err("Peer object "MAC_ADDRESS_STR" add fails!", - MAC_ADDR_ARRAY(roam_info->peerMac.bytes)); if (roam_info->pBssDesc) { struct cfg80211_bss *bss; @@ -3812,7 +3739,6 @@ roam_roam_connect_status_update_handler(struct hdd_adapter *adapter, { struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); QDF_STATUS qdf_status; - int ret; switch (roamResult) { case eCSR_ROAM_RESULT_IBSS_NEW_PEER: @@ -3855,13 +3781,6 @@ roam_roam_connect_status_update_handler(struct hdd_adapter *adapter, hdd_err("Cannot register STA with TL for IBSS. qdf_status: %d [%08X]", qdf_status, qdf_status); } - ret = hdd_objmgr_add_peer_object(adapter->hdd_vdev, - QDF_IBSS_MODE, - roam_info->peerMac.bytes, - false); - if (ret) - hdd_err("Peer object "MAC_ADDRESS_STR" add fails!", - MAC_ADDR_ARRAY(roam_info->peerMac.bytes)); sta_ctx->ibss_sta_generation++; stainfo = qdf_mem_malloc(sizeof(*stainfo)); if (stainfo == NULL) { diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 4f1724a6e9ae..344ae2684afb 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -2164,16 +2164,6 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, adapter->device_mode); } - ret = hdd_objmgr_add_peer_object( - adapter->hdd_vdev, - adapter->device_mode, - event->staMac.bytes, - (adapter->sta_info[event->staId].sta_type - == eSTA_TYPE_P2P_CLI)); - if (ret) - hdd_err("Peer object "MAC_ADDRESS_STR" add fails!", - MAC_ADDR_ARRAY(event->staMac.bytes)); - hdd_green_ap_add_sta(hdd_ctx); break; diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 4be37484df2e..38af984fb082 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -5377,8 +5377,6 @@ QDF_STATUS hdd_reset_all_adapters(struct hdd_context *hdd_ctx) qdf_copy_macaddr(&peerMacAddr, &sta_ctx->conn_info.bssId); - hdd_objmgr_remove_peer_object(adapter->hdd_vdev, - peerMacAddr.bytes); } else if (adapter->device_mode == QDF_P2P_GO_MODE) { clear_bit(SOFTAP_BSS_STARTED, &adapter->event_flags); for (sta_id = 0; sta_id < WLAN_MAX_STA_COUNT; sta_id++) { diff --git a/core/hdd/src/wlan_hdd_nan_datapath.c b/core/hdd/src/wlan_hdd_nan_datapath.c index 6670bf5317cf..2bf8ebed2be5 100644 --- a/core/hdd/src/wlan_hdd_nan_datapath.c +++ b/core/hdd/src/wlan_hdd_nan_datapath.c @@ -645,11 +645,6 @@ void hdd_ndi_drv_ndi_create_rsp_handler(uint8_t vdev_id, hdd_roam_register_sta(adapter, &roam_info, sta_ctx->broadcast_staid, &bc_mac_addr, &tmp_bss_descp); - if (hdd_objmgr_add_peer_object(adapter->hdd_vdev, - QDF_NDI_MODE, bc_mac_addr.bytes, false)) - hdd_err("Peer object "MAC_ADDRESS_STR" add fails!", - MAC_ADDR_ARRAY(bc_mac_addr.bytes)); - hdd_ctx->sta_to_adapter[sta_ctx->broadcast_staid] = adapter; } @@ -768,10 +763,6 @@ int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id, /* this function is called for each new peer */ hdd_roam_register_sta(adapter, &roam_info, sta_id, peer_mac_addr, &tmp_bss_descp); - if (hdd_objmgr_add_peer_object(adapter->hdd_vdev, - QDF_NDI_MODE, peer_mac_addr->bytes, false)) - hdd_err("Peer object "MAC_ADDRESS_STR" add fails!", - MAC_ADDR_ARRAY(peer_mac_addr->bytes)); hdd_ctx->sta_to_adapter[sta_id] = adapter; /* perform following steps for first new peer ind */ if (fist_peer) { diff --git a/core/hdd/src/wlan_hdd_object_manager.c b/core/hdd/src/wlan_hdd_object_manager.c index 634b969fd16a..9ad3e789bb40 100644 --- a/core/hdd/src/wlan_hdd_object_manager.c +++ b/core/hdd/src/wlan_hdd_object_manager.c @@ -224,7 +224,6 @@ int hdd_objmgr_create_and_store_vdev(struct wlan_objmgr_pdev *pdev, QDF_STATUS status; int errno; struct wlan_objmgr_vdev *vdev; - struct wlan_objmgr_peer *peer; struct vdev_osif_priv *osif_priv; struct wlan_vdev_create_params vdev_params = {0}; @@ -266,23 +265,11 @@ int hdd_objmgr_create_and_store_vdev(struct wlan_objmgr_pdev *pdev, goto vdev_destroy; } - peer = wlan_objmgr_peer_obj_create(vdev, WLAN_PEER_SELF, - vdev_params.macaddr); - if (!peer) { - hdd_err("Failed to create self peer for adapter mode %d", - adapter->device_mode); - errno = -ENOMEM; - goto vdev_put_ref; - } - adapter->hdd_vdev = vdev; adapter->session_id = wlan_vdev_get_id(vdev); return 0; -vdev_put_ref: - wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR); - vdev_destroy: wlan_objmgr_vdev_obj_delete(vdev); @@ -297,7 +284,6 @@ int hdd_objmgr_release_and_destroy_vdev(struct hdd_adapter *adapter) QDF_STATUS status; struct wlan_objmgr_vdev *vdev = adapter->hdd_vdev; struct vdev_osif_priv *osif_priv; - uint8_t *self_mac_addr; adapter->hdd_vdev = NULL; adapter->session_id = HDD_SESSION_ID_INVALID; @@ -315,107 +301,12 @@ int hdd_objmgr_release_and_destroy_vdev(struct hdd_adapter *adapter) qdf_mem_free(osif_priv); } - self_mac_addr = wlan_vdev_mlme_get_macaddr(vdev); - if (hdd_objmgr_remove_peer_object(vdev, self_mac_addr)) - hdd_err("Self peer delete failed"); - status = wlan_objmgr_vdev_obj_delete(vdev); wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR); return qdf_status_to_os_return(status); } -int hdd_objmgr_add_peer_object(struct wlan_objmgr_vdev *vdev, - enum QDF_OPMODE adapter_mode, - uint8_t *mac_addr, - bool is_p2p_type) -{ - enum wlan_peer_type peer_type; - struct wlan_objmgr_peer *peer; - - if ((adapter_mode == QDF_STA_MODE) || - (adapter_mode == QDF_P2P_CLIENT_MODE)) { - peer_type = WLAN_PEER_AP; - } else if ((adapter_mode == QDF_SAP_MODE) || - (adapter_mode == QDF_P2P_GO_MODE)) { - if (is_p2p_type) { - peer_type = WLAN_PEER_P2P_CLI; - } else { - peer_type = WLAN_PEER_STA; - } - } else if (adapter_mode == QDF_IBSS_MODE) { - peer_type = WLAN_PEER_IBSS; - } else if (adapter_mode == QDF_NDI_MODE) { - peer_type = WLAN_PEER_NDP; - } else { - hdd_err("Unsupported device mode %d", adapter_mode); - return -EINVAL; - } - - if (!vdev) { - hdd_err("vdev NULL"); - QDF_ASSERT(0); - return -EFAULT; - } - - peer = wlan_objmgr_peer_obj_create(vdev, peer_type, mac_addr); - if (!peer) - return -ENOMEM; - - hdd_debug("Peer object "MAC_ADDRESS_STR" add success! Type: %d", - MAC_ADDR_ARRAY(mac_addr), peer_type); - - return 0; -} - -int hdd_objmgr_remove_peer_object(struct wlan_objmgr_vdev *vdev, - uint8_t *mac_addr) -{ - struct wlan_objmgr_psoc *psoc; - struct wlan_objmgr_pdev *pdev; - struct wlan_objmgr_peer *peer; - uint8_t pdev_id; - - if (!vdev) { - hdd_err("vdev NULL"); - QDF_ASSERT(0); - return -EINVAL; - } - - psoc = wlan_vdev_get_psoc(vdev); - if (!psoc) { - hdd_err("Psoc NUll"); - QDF_ASSERT(0); - return -EINVAL; - } - - pdev = wlan_vdev_get_pdev(vdev); - if (!pdev) { - hdd_err("pdev NULL"); - QDF_ASSERT(0); - return -EINVAL; - } - - pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); - peer = wlan_objmgr_get_peer(psoc, pdev_id, mac_addr, - WLAN_HDD_ID_OBJ_MGR); - if (peer) { - wlan_objmgr_peer_obj_delete(peer); - - /* Unref to decrement ref happened in find_peer */ - wlan_objmgr_peer_release_ref(peer, WLAN_HDD_ID_OBJ_MGR); - - hdd_info("Peer obj "MAC_ADDRESS_STR" deleted", - MAC_ADDR_ARRAY(mac_addr)); - return 0; - } - - hdd_err("Peer obj "MAC_ADDRESS_STR" not found", - MAC_ADDR_ARRAY(mac_addr)); - - return -EINVAL; -} - int hdd_objmgr_set_peer_mlme_auth_state(struct wlan_objmgr_vdev *vdev, bool is_authenticated) { diff --git a/core/hdd/src/wlan_hdd_object_manager.h b/core/hdd/src/wlan_hdd_object_manager.h index c41ec80d4977..6b2c4cff811f 100644 --- a/core/hdd/src/wlan_hdd_object_manager.h +++ b/core/hdd/src/wlan_hdd_object_manager.h @@ -132,36 +132,6 @@ int hdd_objmgr_create_and_store_vdev(struct wlan_objmgr_pdev *pdev, */ int hdd_objmgr_release_and_destroy_vdev(struct hdd_adapter *adapter); -/** - * hdd_objmgr_add_peer_object() - Create and add the peer to the vdev - * @vdev: vdev pointer - * @adapter_mode: adapter mode - * @mac_addr: Peer mac address - * @is_p2p_type: TRUE if peer is p2p type - * - * This API creates and adds the peer object to the given @vdev. The peer type - * (STA, AP, P2P or IBSS) is assigned based on adapter mode. For example, if - * adapter mode is STA, peer is AP. - * - * Return: 0 for success, negative error code for failure - */ -int hdd_objmgr_add_peer_object(struct wlan_objmgr_vdev *vdev, - enum QDF_OPMODE adapter_mode, - uint8_t *mac_addr, - bool is_p2p_type); - -/** - * hdd_objmgr_remove_peer_object() - Delete and remove the peer from vdev - * @vdev: vdev pointer - * @mac_addr: Peer Mac address - * - * This API finds the peer object from given @mac_addr and deletes the same. - * - * Return: 0 for success, negative error code for failure - */ -int hdd_objmgr_remove_peer_object(struct wlan_objmgr_vdev *vdev, - uint8_t *mac_addr); - /** * hdd_objmgr_set_peer_mlme_auth_state() - set the peer mlme auth state * @vdev: vdev pointer diff --git a/core/hdd/src/wlan_hdd_softap_tx_rx.c b/core/hdd/src/wlan_hdd_softap_tx_rx.c index 0398138dccfb..58a1a57446eb 100644 --- a/core/hdd/src/wlan_hdd_softap_tx_rx.c +++ b/core/hdd/src/wlan_hdd_softap_tx_rx.c @@ -949,7 +949,6 @@ QDF_STATUS hdd_softap_deregister_sta(struct hdd_adapter *adapter, { QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; struct hdd_context *hdd_ctx; - int ret; if (NULL == adapter) { hdd_err("NULL adapter"); @@ -974,13 +973,6 @@ QDF_STATUS hdd_softap_deregister_sta(struct hdd_adapter *adapter, staId, qdf_status, qdf_status); } - ret = hdd_objmgr_remove_peer_object(adapter->hdd_vdev, - adapter->sta_info[staId]. - sta_mac.bytes); - if (ret) - hdd_err("Peer obj %pM delete fails", - adapter->sta_info[staId].sta_mac.bytes); - if (adapter->sta_info[staId].in_use) { if (ucfg_ipa_is_enabled()) { if (ucfg_ipa_wlan_evt(hdd_ctx->hdd_pdev, adapter->dev, diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index c063763afe24..778d425728e1 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -1383,7 +1383,53 @@ QDF_STATUS wma_set_peer_param(void *wma_ctx, uint8_t *peer_addr, return err; } +/** + * wma_remove_objmgr_peer() - remove objmgr peer information from host driver + * @wma: wma handle + * @vdev_id: vdev id + * @peer: peer mac address + * + * Return: none + */ +static void wma_remove_objmgr_peer(tp_wma_handle wma, uint8_t vdev_id, + uint8_t *peer_addr) +{ + + struct wlan_objmgr_psoc *psoc = NULL; + struct wlan_objmgr_peer *obj_peer = NULL; + struct wlan_objmgr_vdev *obj_vdev = NULL; + struct wlan_objmgr_pdev *obj_pdev = NULL; + uint8_t pdev_id = 0; + + psoc = wma->psoc; + if (!psoc) { + WMA_LOGE("%s:PSOC is NULL", __func__); + return; + } + + obj_vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_LEGACY_WMA_ID); + if (!obj_vdev) { + WMA_LOGE("Obj vdev not found. Unable to remove peer"); + return; + } + obj_pdev = wlan_vdev_get_pdev(obj_vdev); + pdev_id = wlan_objmgr_pdev_get_pdev_id(obj_pdev); + obj_peer = wlan_objmgr_get_peer(psoc, pdev_id, peer_addr, + WLAN_LEGACY_WMA_ID); + if (obj_peer) { + wlan_objmgr_peer_obj_delete(obj_peer); + /* Unref to decrement ref happened in find_peer */ + wlan_objmgr_peer_release_ref(obj_peer, WLAN_LEGACY_WMA_ID); + WMA_LOGD("Peer %pM deleted", peer_addr); + } else { + WMA_LOGE("Peer %pM not found", peer_addr); + } + + wlan_objmgr_vdev_release_ref(obj_vdev, WLAN_LEGACY_WMA_ID); + +} /** * wma_remove_peer() - remove peer information from host driver and fw * @wma: wma handle @@ -1401,6 +1447,7 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid, #define PEER_ALL_TID_BITMASK 0xffffffff uint32_t peer_tid_bitmap = PEER_ALL_TID_BITMASK; uint8_t *peer_addr = bssid; + uint8_t peer_mac[QDF_MAC_ADDR_SIZE] = {0}; struct peer_flush_params param = {0}; uint8_t *peer_mac_addr; void *soc = cds_get_context(QDF_MODULE_ID_SOC); @@ -1475,13 +1522,17 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid, peer_detach: vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id); WMA_LOGD("%s: vdev %pK is detaching %pK with peer_addr %pM vdevid %d peer_count %d", - __func__, vdev, peer, peer_mac_addr, vdev_id, - wma->interfaces[vdev_id].peer_count); + __func__, vdev, peer, peer_mac_addr, vdev_id, + wma->interfaces[vdev_id].peer_count); + /* Copy peer mac to find and delete objmgr peer */ + qdf_mem_copy(peer_mac, peer_mac_addr, QDF_MAC_ADDR_SIZE); if (roam_synch_in_progress) cdp_peer_detach_force_delete(soc, peer); else cdp_peer_delete(soc, peer, bitmap); + wma_remove_objmgr_peer(wma, vdev_id, peer_mac); + wma->interfaces[vdev_id].peer_count--; #undef PEER_ALL_TID_BITMASK } @@ -1523,6 +1574,99 @@ static bool wma_find_duplicate_peer_on_other_vdev(tp_wma_handle wma, return false; } +/** + * wma_get_peer_type() - Determine the type of peer(eg. STA/AP) and return it + * @wma: wma handle + * @vdev_id: vdev id + * @peer: peer mac address + * + * Return: Peer type + */ + +static int wma_get_peer_type(tp_wma_handle wma, uint8_t vdev_id, + uint8_t *peer_addr) + +{ + uint32_t obj_peer_type = 0; + + WMA_LOGD("vdev id %d vdev type %d vdev subtype %d peer addr %pM vdev addr %pM", + vdev_id, wma->interfaces[vdev_id].type, + wma->interfaces[vdev_id].sub_type, peer_addr, + wma->interfaces[vdev_id].addr); + + if (!qdf_mem_cmp(wma->interfaces[vdev_id].addr, peer_addr, + IEEE80211_ADDR_LEN)) { + obj_peer_type = WLAN_PEER_SELF; + } else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_STA) { + if (wma->interfaces[vdev_id].sub_type == + WMI_UNIFIED_VDEV_SUBTYPE_P2P_CLIENT) + obj_peer_type = WLAN_PEER_P2P_GO; + else + obj_peer_type = WLAN_PEER_AP; + } else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_AP) { + if (wma->interfaces[vdev_id].sub_type == + WMI_UNIFIED_VDEV_SUBTYPE_P2P_GO) + obj_peer_type = WLAN_PEER_P2P_CLI; + else + obj_peer_type = WLAN_PEER_STA; + } else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_IBSS) { + obj_peer_type = WLAN_PEER_IBSS; + } else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_NDI) { + obj_peer_type = WLAN_PEER_NDP; + } else { + WMA_LOGE("Couldnt find peertype for type %d and sub type %d", + wma->interfaces[vdev_id].type, + wma->interfaces[vdev_id].sub_type); + } + + return obj_peer_type; + +} + +/** + * wma_create_objmgr_peer() - create objmgr peer information in host driver + * @wma: wma handle + * @vdev_id: vdev id + * @peer: peer mac address + * + * Return: objmgr peer pointer + */ + +static struct wlan_objmgr_peer *wma_create_objmgr_peer(tp_wma_handle wma, + uint8_t vdev_id, uint8_t *peer_addr) +{ + uint32_t obj_peer_type = 0; + struct wlan_objmgr_peer *obj_peer = NULL; + struct wlan_objmgr_vdev *obj_vdev = NULL; + struct wlan_objmgr_psoc *psoc = wma->psoc; + + obj_peer_type = wma_get_peer_type(wma, vdev_id, peer_addr); + if (!obj_peer_type) { + WMA_LOGE("Invalid obj peer type. Unable to create peer %d", + obj_peer_type); + return NULL; + } + + /* Create obj_mgr peer */ + obj_vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_LEGACY_WMA_ID); + + if (!obj_vdev) { + WMA_LOGE("Invalid obj vdev. Unable to create peer %d", + obj_peer_type); + return NULL; + } + + obj_peer = wlan_objmgr_peer_obj_create(obj_vdev, obj_peer_type, + peer_addr); + wlan_objmgr_vdev_release_ref(obj_vdev, WLAN_LEGACY_WMA_ID); + if (obj_peer) + WMA_LOGD("Peer %pM added successfully! Type: %d", peer_addr, + obj_peer_type); + + return obj_peer; + +} /** * wma_create_peer() - send peer create command to fw * @wma: wma handle @@ -1547,6 +1691,7 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev, void *dp_soc = cds_get_context(QDF_MODULE_ID_SOC); struct wlan_objmgr_psoc *psoc = wma->psoc; target_resource_config *wlan_res_cfg; + struct wlan_objmgr_peer *obj_peer = NULL; if (!psoc) { WMA_LOGE("%s: psoc is NULL", __func__); @@ -1579,6 +1724,10 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev, vdev_id, peer_addr)) goto err; + obj_peer = wma_create_objmgr_peer(wma, vdev_id, peer_addr); + if (!obj_peer) + goto err; + /* 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 @@ -1587,6 +1736,7 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev, peer = cdp_peer_create(dp_soc, vdev, peer_addr); if (!peer) { WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr); + wlan_objmgr_peer_obj_delete(obj_peer); goto err; } WMA_LOGD("%s: vdev %pK is attaching peer:%pK peer_addr %pM to vdev_id %d, peer_count - %d", @@ -1605,11 +1755,9 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev, if (wmi_unified_peer_create_send(wma->wmi_handle, ¶m) != QDF_STATUS_SUCCESS) { WMA_LOGE("%s : Unable to create peer in Target", __func__); - WMA_LOGE("%s: vdev %pK is detaching peer:%pK peer_addr %pM to vdev_id %d, peer_count - %d", - __func__, vdev, peer, peer_addr, vdev_id, - wma->interfaces[vdev_id].peer_count); cdp_peer_delete(dp_soc, peer, 1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER); + wlan_objmgr_peer_obj_delete(obj_peer); goto err; } else { qdf_atomic_inc(&wma->interfaces[vdev_id].fw_peer_count); @@ -5526,6 +5674,8 @@ void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params) __func__, txrx_vdev, peer, params->bssid, params->smesessionId, iface->peer_count); cdp_peer_delete(soc, peer, 1 << CDP_PEER_DELETE_NO_SPECIAL); + wma_remove_objmgr_peer(wma, params->smesessionId, + params->bssid); } iface->peer_count--; WMA_LOGI("%s: Removed peer %pK with peer_addr %pM vdevid %d peer_count %d",