From fd621e86a0bc220ca5d36a63fe5aa2b301154ea8 Mon Sep 17 00:00:00 2001 From: Ashish Kumar Dhanotiya Date: Mon, 27 Jan 2020 18:07:44 +0530 Subject: [PATCH] qcacld-3.0: Query sta stats on disconnect in case of SAP Currently for big data logging in case of sap, query for rssi, txrate and rxrate happens when station issues disconnect to SAP but these stats are not queried when SAP issues disconnect to the connected station. To address above issue, add a logic to issue stats request to FW when SAP disconnects the connected station. Change-Id: I40db82d7b57fd0894ffbe95f52d27b4931227690 CRs-Fixed: 2626857 --- core/hdd/src/wlan_hdd_hostapd.c | 5 ++ core/sme/src/csr/csr_api_roam.c | 111 +++++++++++++++++++------------- 2 files changed, 70 insertions(+), 46 deletions(-) diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index e5cd8eec0f1d..9f19decc20f6 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -2319,6 +2319,11 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, disassoc_comp->rx_mc_bc_cnt; cache_stainfo->reason_code = disassoc_comp->reason_code; cache_stainfo->disassoc_ts = qdf_system_ticks(); + hdd_debug("Cache_stainfo rssi %d txrate %d rxrate %d reason_code %d", + cache_stainfo->rssi, + cache_stainfo->tx_rate, + cache_stainfo->rx_rate, + cache_stainfo->reason_code); } hdd_nofl_info("SAP disassociated " QDF_MAC_ADDR_STR, QDF_MAC_ADDR_ARRAY(wrqu.addr.sa_data)); diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 7fd034af5a24..863272bc0e66 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -6363,11 +6363,62 @@ bool csr_allow_concurrent_sta_connections(struct mac_context *mac, return false; } +static void csr_get_peer_rssi_cb(struct stats_event *ev, void *cookie) +{ + struct mac_context *mac = (struct mac_context *)cookie; + + if (!mac) + return; + if (!ev->peer_stats) { + sme_debug("%s no peer stats\n", __func__); + return; + } + mac->peer_rssi = ev->peer_stats->peer_rssi; + mac->peer_txrate = ev->peer_stats->tx_rate; + mac->peer_rxrate = ev->peer_stats->rx_rate; + if (!ev->peer_extended_stats) { + sme_debug("%s no peer extended stats\n", __func__); + return; + } + mac->rx_mc_bc_cnt = ev->peer_extended_stats->rx_mc_bc_cnt; +} + +static void csr_get_peer_rssi(struct mac_context *mac, uint32_t session_id, + struct qdf_mac_addr peer_mac) +{ + struct wlan_objmgr_vdev *vdev; + struct request_info info = {0}; + QDF_STATUS status; + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc( + mac->psoc, + session_id, + WLAN_LEGACY_SME_ID); + if (vdev) { + info.cookie = mac; + info.u.get_peer_rssi_cb = csr_get_peer_rssi_cb; + info.vdev_id = wlan_vdev_get_id(vdev); + info.pdev_id = wlan_objmgr_pdev_get_pdev_id( + wlan_vdev_get_pdev(vdev)); + qdf_mem_copy(info.peer_mac_addr, &peer_mac, QDF_MAC_ADDR_SIZE); + status = ucfg_mc_cp_stats_send_stats_request( + vdev, + TYPE_PEER_STATS, + &info); + sme_debug("peer_mac" QDF_MAC_ADDR_STR, + QDF_MAC_ADDR_ARRAY(peer_mac.bytes)); + if (QDF_IS_STATUS_ERROR(status)) + sme_err("stats req failed: %d", status); + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID); + } +} + QDF_STATUS csr_roam_process_command(struct mac_context *mac, tSmeCmd *pCommand) { QDF_STATUS lock_status, status = QDF_STATUS_SUCCESS; uint32_t sessionId = pCommand->vdev_id; struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId); + struct qdf_mac_addr peer_mac; if (!pSession) { sme_err("session %d not found", sessionId); @@ -6455,6 +6506,11 @@ QDF_STATUS csr_roam_process_command(struct mac_context *mac, tSmeCmd *pCommand) sessionId); sme_debug("Disassociate issued with reason: %d", pCommand->u.roamCmd.reason); + + qdf_mem_copy(&peer_mac, &pCommand->u.roamCmd.peerMac, + QDF_MAC_ADDR_SIZE); + csr_get_peer_rssi(mac, sessionId, peer_mac); + status = csr_send_mb_disassoc_req_msg(mac, sessionId, pCommand->u.roamCmd.peerMac, pCommand->u.roamCmd.reason); @@ -6465,6 +6521,13 @@ QDF_STATUS csr_roam_process_command(struct mac_context *mac, tSmeCmd *pCommand) sessionId); csr_roam_substate_change(mac, eCSR_ROAM_SUBSTATE_DEAUTH_REQ, sessionId); + sme_debug("Deauth issued with reason: %d", + pCommand->u.roamCmd.reason); + + qdf_mem_copy(&peer_mac, &pCommand->u.roamCmd.peerMac, + QDF_MAC_ADDR_SIZE); + csr_get_peer_rssi(mac, sessionId, peer_mac); + status = csr_send_mb_deauth_req_msg(mac, sessionId, pCommand->u.roamCmd.peerMac, pCommand->u.roamCmd.reason); @@ -13176,26 +13239,6 @@ void csr_roam_completion(struct mac_context *mac, uint32_t vdev_id, } } -static void csr_get_peer_rssi_cb(struct stats_event *ev, void *cookie) -{ - struct mac_context *mac = (struct mac_context *)cookie; - - if (!mac) - return; - if (!ev->peer_stats) { - sme_debug("%s no peer stats\n", __func__); - return; - } - mac->peer_rssi = ev->peer_stats->peer_rssi; - mac->peer_txrate = ev->peer_stats->tx_rate; - mac->peer_rxrate = ev->peer_stats->rx_rate; - if (!ev->peer_extended_stats) { - sme_debug("%s no peer extended stats\n", __func__); - return; - } - mac->rx_mc_bc_cnt = ev->peer_extended_stats->rx_mc_bc_cnt; -} - static QDF_STATUS csr_roam_lost_link(struct mac_context *mac, uint32_t sessionId, uint32_t type, tSirSmeRsp *pSirMsg) @@ -13243,33 +13286,9 @@ QDF_STATUS csr_roam_lost_link(struct mac_context *mac, uint32_t sessionId, mlme_set_discon_reason_n_from_ap(mac->psoc, sessionId, from_ap, pSession->joinFailStatusCode.reasonCode); - if (type == eWNI_SME_DISASSOC_IND || type == eWNI_SME_DEAUTH_IND) { - struct wlan_objmgr_vdev *vdev; - struct request_info info = {0}; + if (type == eWNI_SME_DISASSOC_IND || type == eWNI_SME_DEAUTH_IND) + csr_get_peer_rssi(mac, sessionId, roam_info->peerMac); - vdev = wlan_objmgr_get_vdev_by_id_from_psoc( - mac->psoc, - sessionId, - WLAN_LEGACY_SME_ID); - if (!vdev) { - sme_err("Invalid vdev"); - } else { - info.cookie = mac; - info.u.get_peer_rssi_cb = csr_get_peer_rssi_cb; - info.vdev_id = wlan_vdev_get_id(vdev); - info.pdev_id = wlan_objmgr_pdev_get_pdev_id( - wlan_vdev_get_pdev(vdev)); - qdf_mem_copy(info.peer_mac_addr, &roam_info->peerMac, - QDF_MAC_ADDR_SIZE); - status = ucfg_mc_cp_stats_send_stats_request( - vdev, - TYPE_PEER_STATS, - &info); - if (QDF_IS_STATUS_ERROR(status)) - sme_err("stats req failed: %d", status); - wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID); - } - } csr_roam_call_callback(mac, sessionId, NULL, 0, eCSR_ROAM_LOSTLINK_DETECTED, result);