qcacld-3.0: Print BTM RSP and initial roam info in kmsg
The event WMI_ROAM_STATS_EVENTID is received after every roam, once the roam synch complete is sent by the host. This event contains details regarding the btm response. This helps in debugging/understanding the scenario when roam failure happens. Print the info received related to btm rsp and roam initial info into kmsg. Change-Id: Icb2058eed5df3265018b3c53548d123f3a4faf4f CRs-Fixed: 2728267
This commit is contained in:
@@ -2289,12 +2289,16 @@ struct wlan_mlme_sae_single_pmk {
|
||||
* @scan: Roam scan related data structure.
|
||||
* @result: Roam result parameters.
|
||||
* @data_11kv: Neighbor report/BTM parameters.
|
||||
* @btm_rsp: BTM response information
|
||||
* @roam_init_info: Roam initial info
|
||||
*/
|
||||
struct mlme_roam_debug_info {
|
||||
struct wmi_roam_trigger_info trigger;
|
||||
struct wmi_roam_scan_data scan;
|
||||
struct wmi_roam_result result;
|
||||
struct wmi_neighbor_report_data data_11kv;
|
||||
struct roam_btm_response_data btm_rsp;
|
||||
struct roam_initial_data roam_init_info;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -3599,6 +3599,8 @@ char *mlme_get_roam_trigger_str(uint32_t roam_scan_trigger)
|
||||
return "STA KICKOUT";
|
||||
case WMI_ROAM_TRIGGER_REASON_ESS_RSSI:
|
||||
return "ESS RSSI";
|
||||
case WMI_ROAM_TRIGGER_REASON_WTC_BTM:
|
||||
return "WTC BTM";
|
||||
case WMI_ROAM_TRIGGER_REASON_NONE:
|
||||
return "NONE";
|
||||
default:
|
||||
@@ -3815,6 +3817,8 @@ char *mlme_get_sub_reason_str(uint32_t sub_reason)
|
||||
return "LOW RSSI PERIODIC SCAN";
|
||||
case WMI_ROAM_TRIGGER_SUB_REASON_CU_PERIODIC:
|
||||
return "CU PERIODIC SCAN";
|
||||
case WMI_ROAM_TRIGGER_SUB_REASCON_PERIODIC_TIMER_AFTER_INACTIVITY:
|
||||
return "PERIODIC TIMER AFTER INACTIVITY";
|
||||
default:
|
||||
return "NONE";
|
||||
}
|
||||
|
@@ -29,6 +29,34 @@
|
||||
#include "wlan_mlme_api.h"
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
/**
|
||||
* wlan_cm_roam_extract_btm_response() - Extract BTM rsp stats
|
||||
* @wmi: wmi handle
|
||||
* @evt_buf: Pointer to the event buffer
|
||||
* @dst: Pointer to destination structure to fill data
|
||||
* @idx: TLV id
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS
|
||||
wlan_cm_roam_extract_btm_response(wmi_unified_t wmi, void *evt_buf,
|
||||
struct roam_btm_response_data *dst,
|
||||
uint8_t idx);
|
||||
|
||||
/**
|
||||
* wlan_cm_roam_extract_roam_initial_info() - Extract Roam Initial stats
|
||||
* @wmi: wmi handle
|
||||
* @evt_buf: Pointer to the event buffer
|
||||
* @dst: Pointer to destination structure to fill data
|
||||
* @idx: TLV id
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS
|
||||
wlan_cm_roam_extract_roam_initial_info(wmi_unified_t wmi, void *evt_buf,
|
||||
struct roam_initial_data *dst,
|
||||
uint8_t idx);
|
||||
|
||||
/**
|
||||
* wlan_cm_roam_activate_pcl_per_vdev - Set the PCL command to be sent per
|
||||
* vdev instead of pdev.
|
||||
@@ -114,5 +142,22 @@ static inline void
|
||||
wlan_cm_dual_sta_roam_update_connect_channels(struct wlan_objmgr_psoc *psoc,
|
||||
struct scan_filter *filter)
|
||||
{}
|
||||
|
||||
static inline QDF_STATUS
|
||||
wlan_cm_roam_extract_btm_response(wmi_unified_t wmi, void *evt_buf,
|
||||
struct roam_btm_response_data *dst,
|
||||
uint8_t idx)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline QDF_STATUS
|
||||
wlan_cm_roam_extract_roam_initial_info(wmi_unified_t wmi, void *evt_buf,
|
||||
struct roam_initial_data *dst,
|
||||
uint8_t idx)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* FEATURE_ROAM_OFFLOAD */
|
||||
#endif /* WLAN_CM_ROAM_API_H__ */
|
||||
|
@@ -21,9 +21,10 @@
|
||||
#ifndef CM_ROAM_PUBLIC_STRUCT_H__
|
||||
#define CM_ROAM_PUBLIC_STRUCT_H__
|
||||
|
||||
#include "wlan_policy_mgr_public_struct.h"
|
||||
#include "wlan_objmgr_cmn.h"
|
||||
#include "reg_services_public_struct.h"
|
||||
#include "wmi_unified_param.h"
|
||||
#include "wmi_unified_sta_param.h"
|
||||
|
||||
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
|
||||
/**
|
||||
@@ -49,6 +50,36 @@ enum roam_offload_state {
|
||||
WLAN_ROAM_SYNCH_IN_PROG,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct roam_btm_response_data - BTM response related data
|
||||
* @present: Flag to check if the roam btm_rsp tlv is present
|
||||
* @btm_status: Btm request status
|
||||
* @target_bssid: AP MAC address
|
||||
* @vsie_reason: Vsie_reason value
|
||||
*/
|
||||
struct roam_btm_response_data {
|
||||
bool present;
|
||||
uint32_t btm_status;
|
||||
struct qdf_mac_addr target_bssid;
|
||||
uint32_t vsie_reason;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct roam_initial_data - Roam initial related data
|
||||
* @present: Flag to check if the roam btm_rsp tlv is present
|
||||
* @roam_full_scan_count: Roam full scan count
|
||||
* @rssi_th: RSSI threhold
|
||||
* @cu_th: Channel utilization threhold
|
||||
* @fw_cancel_timer_bitmap: FW timers, which are getting cancelled
|
||||
*/
|
||||
struct roam_initial_data {
|
||||
bool present;
|
||||
uint32_t roam_full_scan_count;
|
||||
uint32_t rssi_th;
|
||||
uint32_t cu_th;
|
||||
uint32_t fw_cancel_timer_bitmap;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum wlan_cm_rso_control_requestor - Driver disabled roaming requestor that
|
||||
* will request the roam module to disable roaming based on the mlme operation
|
||||
|
@@ -24,8 +24,33 @@
|
||||
#include "wlan_vdev_mlme_api.h"
|
||||
#include "wlan_mlme_main.h"
|
||||
#include "wlan_policy_mgr_api.h"
|
||||
#include <wmi_unified_priv.h>
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
QDF_STATUS
|
||||
wlan_cm_roam_extract_btm_response(wmi_unified_t wmi, void *evt_buf,
|
||||
struct roam_btm_response_data *dst,
|
||||
uint8_t idx)
|
||||
{
|
||||
if (wmi->ops->extract_roam_btm_response_stats)
|
||||
return wmi->ops->extract_roam_btm_response_stats(wmi, evt_buf,
|
||||
dst, idx);
|
||||
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
QDF_STATUS
|
||||
wlan_cm_roam_extract_roam_initial_info(wmi_unified_t wmi, void *evt_buf,
|
||||
struct roam_initial_data *dst,
|
||||
uint8_t idx)
|
||||
{
|
||||
if (wmi->ops->extract_roam_initial_info)
|
||||
return wmi->ops->extract_roam_initial_info(wmi, evt_buf,
|
||||
dst, idx);
|
||||
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
void wlan_cm_roam_activate_pcl_per_vdev(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id, bool pcl_per_vdev)
|
||||
{
|
||||
|
@@ -22,6 +22,7 @@
|
||||
#define _WMI_UNIFIED_ROAM_API_H_
|
||||
|
||||
#include <wmi_unified_roam_param.h>
|
||||
#include <wlan_cm_roam_public_srtuct.h>
|
||||
|
||||
#ifdef FEATURE_LFR_SUBNET_DETECTION
|
||||
/**
|
||||
|
@@ -988,16 +988,107 @@ send_vdev_set_pcl_cmd_tlv(wmi_unified_t wmi_handle,
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* extract_roam_btm_response_stats_tlv() - Extract the btm rsp stats
|
||||
* from the WMI_ROAM_STATS_EVENTID
|
||||
* @wmi_handle: wmi handle
|
||||
* @evt_buf: Pointer to the event buffer
|
||||
* @dst: Pointer to destination structure to fill data
|
||||
* @idx: TLV id
|
||||
*/
|
||||
static QDF_STATUS
|
||||
extract_roam_btm_response_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
||||
struct roam_btm_response_data *dst,
|
||||
uint8_t idx)
|
||||
{
|
||||
WMI_ROAM_STATS_EVENTID_param_tlvs *param_buf;
|
||||
wmi_roam_btm_response_info *src_data = NULL;
|
||||
|
||||
param_buf = (WMI_ROAM_STATS_EVENTID_param_tlvs *)evt_buf;
|
||||
|
||||
if (!param_buf || !param_buf->roam_btm_response_info ||
|
||||
!param_buf->num_roam_btm_response_info ||
|
||||
idx >= param_buf->num_roam_btm_response_info) {
|
||||
WMI_LOGD("%s: Empty btm response param buf", __func__);
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
src_data = ¶m_buf->roam_btm_response_info[idx];
|
||||
|
||||
dst->present = true;
|
||||
dst->btm_status = src_data->btm_status;
|
||||
WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_data->target_bssid,
|
||||
dst->target_bssid.bytes);
|
||||
dst->vsie_reason = src_data->vsie_reason;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* extract_roam_initial_info_tlv() - Extract the roam initial info
|
||||
* from the WMI_ROAM_STATS_EVENTID
|
||||
* @wmi_handle: wmi handle
|
||||
* @evt_buf: Pointer to the event buffer
|
||||
* @dst: Pointer to destination structure to fill data
|
||||
* @idx: TLV id
|
||||
*/
|
||||
static QDF_STATUS
|
||||
extract_roam_initial_info_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
||||
struct roam_initial_data *dst, uint8_t idx)
|
||||
{
|
||||
WMI_ROAM_STATS_EVENTID_param_tlvs *param_buf;
|
||||
wmi_roam_initial_info *src_data = NULL;
|
||||
|
||||
param_buf = (WMI_ROAM_STATS_EVENTID_param_tlvs *)evt_buf;
|
||||
|
||||
if (!param_buf || !param_buf->roam_initial_info ||
|
||||
!param_buf->num_roam_initial_info ||
|
||||
idx >= param_buf->num_roam_initial_info) {
|
||||
WMI_LOGD("%s: Empty roam_initial_info param buf", __func__);
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
src_data = ¶m_buf->roam_initial_info[idx];
|
||||
|
||||
dst->present = true;
|
||||
dst->roam_full_scan_count = src_data->roam_full_scan_count;
|
||||
dst->rssi_th = src_data->rssi_th;
|
||||
dst->cu_th = src_data->cu_th;
|
||||
dst->fw_cancel_timer_bitmap = src_data->timer_canceled;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
void wmi_roam_offload_attach_tlv(wmi_unified_t wmi_handle)
|
||||
{
|
||||
struct wmi_ops *ops = wmi_handle->ops;
|
||||
|
||||
ops->extract_roam_btm_response_stats =
|
||||
extract_roam_btm_response_stats_tlv;
|
||||
ops->extract_roam_initial_info = extract_roam_initial_info_tlv;
|
||||
|
||||
ops->send_set_ric_req_cmd = send_set_ric_req_cmd_tlv;
|
||||
ops->send_process_roam_synch_complete_cmd =
|
||||
send_process_roam_synch_complete_cmd_tlv;
|
||||
ops->send_roam_invoke_cmd = send_roam_invoke_cmd_tlv;
|
||||
ops->send_vdev_set_pcl_cmd = send_vdev_set_pcl_cmd_tlv;
|
||||
}
|
||||
#else
|
||||
static inline QDF_STATUS
|
||||
extract_roam_btm_response_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
||||
struct roam_btm_response_data *dst,
|
||||
uint8_t idx)
|
||||
{
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
|
||||
static inline QDF_STATUS
|
||||
extract_roam_initial_info_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
||||
struct roam_initial_data *dst, uint8_t idx)
|
||||
{
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
|
||||
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
|
||||
|
||||
#if defined(WLAN_FEATURE_FILS_SK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
|
||||
|
@@ -81,7 +81,7 @@
|
||||
#include <cdp_txrx_mon.h>
|
||||
#include <cdp_txrx_ctrl.h>
|
||||
#include "wlan_blm_api.h"
|
||||
|
||||
#include "wlan_cm_roam_api.h"
|
||||
#ifdef FEATURE_WLAN_DIAG_SUPPORT /* FEATURE_WLAN_DIAG_SUPPORT */
|
||||
#include "host_diag_core_log.h"
|
||||
#endif /* FEATURE_WLAN_DIAG_SUPPORT */
|
||||
@@ -3487,6 +3487,43 @@ wma_rso_print_trigger_info(struct wmi_roam_trigger_info *data, uint8_t vdev_id)
|
||||
qdf_mem_free(buf);
|
||||
}
|
||||
|
||||
/**
|
||||
* wma_rso_print_btm_rsp_info - BTM RSP related details
|
||||
* @data: Pointer to the btm rsp data
|
||||
* @vdev_id: vdev id
|
||||
*
|
||||
* Prints the vdev, btm status, target_bssid and vsie reason
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
static void
|
||||
wma_rso_print_btm_rsp_info(struct roam_btm_response_data *data,
|
||||
uint8_t vdev_id)
|
||||
{
|
||||
wma_info("[BTM RSP]: VDEV[%d], Status: %d, VSIE reason: %d, BSSID: %pM",
|
||||
vdev_id, data->btm_status, data->vsie_reason,
|
||||
data->target_bssid.bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* wma_rso_print_roam_initial_info - Roaming related initial details
|
||||
* @data: Pointer to the btm rsp data
|
||||
* @vdev_id: vdev id
|
||||
*
|
||||
* Prints the vdev, roam_full_scan_count, channel and rssi
|
||||
* utilization threhold and timer
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
static void
|
||||
wma_rso_print_roam_initial_info(struct roam_initial_data *data,
|
||||
uint8_t vdev_id)
|
||||
{
|
||||
wma_info("[ROAM INIT INFO]: VDEV[%d], roam_full_scan_count: %d, rssi_th: %d, cu_th: %d, fw_cancel_timer_bitmap: %d",
|
||||
vdev_id, data->roam_full_scan_count, data->rssi_th,
|
||||
data->cu_th, data->fw_cancel_timer_bitmap);
|
||||
}
|
||||
|
||||
/**
|
||||
* wma_log_roam_scan_candidates - Print roam scan candidate AP info
|
||||
* @ap: Pointer to the candidate AP list
|
||||
@@ -3770,6 +3807,22 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event,
|
||||
goto err;
|
||||
}
|
||||
|
||||
rem_len -= param_buf->num_roam_neighbor_report_chan_info *
|
||||
sizeof(wmi_roam_neighbor_report_channel_info);
|
||||
if (rem_len < param_buf->num_roam_btm_response_info *
|
||||
sizeof(wmi_roam_btm_response_info)) {
|
||||
wma_err_rl("Invalid btm rsp data");
|
||||
goto err;
|
||||
}
|
||||
|
||||
rem_len -= param_buf->num_roam_btm_response_info *
|
||||
sizeof(wmi_roam_btm_response_info);
|
||||
if (rem_len < param_buf->num_roam_initial_info *
|
||||
sizeof(wmi_roam_initial_info)) {
|
||||
wma_err_rl("Invalid Initial roam info");
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!num_tlv) {
|
||||
roam_info = qdf_mem_malloc(sizeof(*roam_info));
|
||||
if (!roam_info)
|
||||
@@ -3836,6 +3889,29 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* BTM resp info */
|
||||
status = wlan_cm_roam_extract_btm_response(wma->wmi_handle,
|
||||
event,
|
||||
&roam_info->btm_rsp,
|
||||
i);
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
wma_err("%s:Roam btm rsp stats extract fail vdev %d",
|
||||
__func__, vdev_id);
|
||||
qdf_mem_free(roam_info);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Initial Roam info */
|
||||
status = wlan_cm_roam_extract_roam_initial_info(
|
||||
wma->wmi_handle, event,
|
||||
&roam_info->roam_init_info, i);
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
wma_err("%s:Initial roam stats extract fail vdev %d",
|
||||
__func__, vdev_id);
|
||||
qdf_mem_free(roam_info);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* BTM req/resp or Neighbor report/response info */
|
||||
status = wmi_unified_extract_roam_11kv_stats(
|
||||
wma->wmi_handle, event,
|
||||
@@ -3864,6 +3940,14 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event,
|
||||
if (roam_info->data_11kv.present)
|
||||
wma_rso_print_11kv_info(&roam_info->data_11kv, vdev_id);
|
||||
|
||||
if (roam_info->btm_rsp.present)
|
||||
wma_rso_print_btm_rsp_info(&roam_info->btm_rsp,
|
||||
vdev_id);
|
||||
|
||||
if (roam_info->roam_init_info.present)
|
||||
wma_rso_print_roam_initial_info(
|
||||
&roam_info->roam_init_info, vdev_id);
|
||||
|
||||
qdf_mem_free(roam_info);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user