qcacld-3.0: Add support to parse roam frame info TLV

Add support to parse roam frame info TLV.
Add changes to send the BTM request logging event.

Change-Id: I24fab5fc0ec204fce74cf822742b5a44b0e7774f
CRs-Fixed: 3013489
Цей коміт міститься в:
Pragaspathi Thilagaraj
2021-09-07 13:07:35 +05:30
зафіксовано Madan Koyyalamudi
джерело 1b47a5b316
коміт db383df8c9
8 змінених файлів з 637 додано та 14 видалено

Переглянути файл

@@ -67,6 +67,7 @@
#include "wlan_reg_services_api.h"
#include "wlan_roam_debug.h"
#include "wlan_mlme_public_struct.h"
#include "wlan_mgmt_txrx_utils_api.h"
/* This is temporary, should be removed */
#include "ol_htt_api.h"
@@ -1566,7 +1567,8 @@ int wma_roam_scan_chan_list_event_handler(WMA_HANDLE handle,
* Return: None
*/
static void
wma_get_trigger_detail_str(struct wmi_roam_trigger_info *roam_info, char *buf)
wma_get_trigger_detail_str(struct wmi_roam_trigger_info *roam_info, char *buf,
uint8_t vdev_id)
{
uint16_t buf_cons, buf_left = MAX_ROAM_DEBUG_BUF_SIZE;
char *temp = buf;
@@ -1597,6 +1599,9 @@ wma_get_trigger_detail_str(struct wmi_roam_trigger_info *roam_info, char *buf)
case WMI_ROAM_TRIGGER_REASON_BTC:
return;
case WMI_ROAM_TRIGGER_REASON_BTM:
roam_info->btm_trig_data.timestamp = roam_info->timestamp;
cm_roam_btm_req_event(&roam_info->btm_trig_data, vdev_id);
buf_cons = qdf_snprint(temp, buf_left,
"Req_mode: %d Disassoc_timer: %d",
roam_info->btm_trig_data.btm_request_mode,
@@ -1696,7 +1701,7 @@ wma_rso_print_trigger_info(struct wmi_roam_trigger_info *data, uint8_t vdev_id)
if (!buf)
return;
wma_get_trigger_detail_str(data, buf);
wma_get_trigger_detail_str(data, buf, vdev_id);
mlme_get_converted_timestamp(data->timestamp, time);
wma_nofl_info("%s [ROAM_TRIGGER]: VDEV[%d] %s", time, vdev_id, buf);
@@ -1707,6 +1712,7 @@ wma_rso_print_trigger_info(struct wmi_roam_trigger_info *data, uint8_t vdev_id)
* wma_rso_print_btm_rsp_info - BTM RSP related details
* @data: Pointer to the btm rsp data
* @vdev_id: vdev id
* @is_wtc: is wtc or btm response frame
*
* Prints the vdev, btm status, target_bssid and vsie reason
*
@@ -1714,7 +1720,7 @@ wma_rso_print_trigger_info(struct wmi_roam_trigger_info *data, uint8_t vdev_id)
*/
static void
wma_rso_print_btm_rsp_info(struct roam_btm_response_data *data,
uint8_t vdev_id)
uint8_t vdev_id, uint8_t is_wtc)
{
char time[TIME_STRING_LEN];
@@ -1722,6 +1728,7 @@ wma_rso_print_btm_rsp_info(struct roam_btm_response_data *data,
wma_nofl_info("%s [BTM RSP]: VDEV[%d], Status: %d, VSIE reason: %d, BSSID: " QDF_MAC_ADDR_FMT,
time, vdev_id, data->btm_status, data->vsie_reason,
QDF_MAC_ADDR_REF(data->target_bssid.bytes));
cm_roam_btm_resp_event(data, vdev_id, is_wtc);
}
/**
@@ -1955,6 +1962,8 @@ wma_rso_print_11kv_info(struct wmi_neighbor_report_data *neigh_rpt,
mlme_get_converted_timestamp(neigh_rpt->req_time, time);
wma_nofl_info("%s [%s] VDEV[%d]", time,
(type == 1) ? "BTM_QUERY" : "NEIGH_RPT_REQ", vdev_id);
if (type == 1)
cm_roam_btm_query_event(neigh_rpt, vdev_id);
if (neigh_rpt->resp_time) {
mlme_get_converted_timestamp(neigh_rpt->resp_time, time1);
@@ -1969,6 +1978,47 @@ wma_rso_print_11kv_info(struct wmi_neighbor_report_data *neigh_rpt,
qdf_mem_free(buf);
}
static char *
wma_get_frame_subtype_str(enum mgmt_subtype frame_subtype)
{
switch (frame_subtype) {
case MGMT_SUBTYPE_ASSOC_REQ:
return "ASSOC";
case MGMT_SUBTYPE_ASSOC_RESP:
return "ASSOC";
case MGMT_SUBTYPE_REASSOC_REQ:
return "REASSOC";
case MGMT_SUBTYPE_REASSOC_RESP:
return "REASSOC";
case MGMT_SUBTYPE_DISASSOC:
return "DISASSOC";
case MGMT_SUBTYPE_AUTH:
return "AUTH";
case MGMT_SUBTYPE_DEAUTH:
return "DEAUTH";
default:
break;
}
return "Invalid frm";
}
static void
wma_rso_print_frame_info(struct roam_frame_info *frame_data, uint8_t vdev_id)
{
char time[TIME_STRING_LEN];
if (!frame_data->present)
return;
mlme_get_converted_timestamp(frame_data->timestamp, time);
wma_nofl_info("%s [%s %s] VDEV[%d] status:%d seq_num:%d", time,
wma_get_frame_subtype_str(frame_data->subtype),
frame_data->is_req ? "REQ" : "RESP", vdev_id,
frame_data->status_code, frame_data->seq_num);
cm_roam_mgmt_frame_event(frame_data, vdev_id);
}
int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event,
uint32_t len)
{
@@ -1976,8 +2026,9 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event,
WMI_ROAM_STATS_EVENTID_param_tlvs *param_buf;
wmi_roam_stats_event_fixed_param *fixed_param;
struct mlme_roam_debug_info *roam_info = NULL;
uint8_t vdev_id, i;
uint8_t vdev_id, i, k;
uint8_t num_tlv = 0, num_chan = 0, num_ap = 0, num_rpt = 0, rem_tlv = 0;
uint8_t num_frames = 0, num_btm = 0;
uint32_t rem_len;
QDF_STATUS status;
@@ -2079,6 +2130,14 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event,
goto err;
}
rem_len -= param_buf->num_roam_msg_info *
sizeof(wmi_roam_msg_info);
if (rem_len < param_buf->num_roam_frame_info *
sizeof(wmi_roam_frame_info)) {
wma_err_rl("Invalid roam frm info");
goto err;
}
for (i = 0; i < num_tlv; i++) {
roam_info = qdf_mem_malloc(sizeof(*roam_info));
if (!roam_info)
@@ -2090,7 +2149,8 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event,
*/
status = wmi_unified_extract_roam_trigger_stats(
wma->wmi_handle, event,
&roam_info->trigger, i);
&roam_info->trigger, i,
num_btm);
if (QDF_IS_STATUS_ERROR(status)) {
wma_debug_rl("Extract roam trigger stats failed vdev %d at %d iteration",
vdev_id, i);
@@ -2098,6 +2158,10 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event,
return -EINVAL;
}
if (roam_info->trigger.trigger_reason ==
WMI_ROAM_TRIGGER_REASON_BTM)
num_btm += roam_info->trigger.btm_trig_data.candidate_list_count;
if (roam_info->trigger.present) {
wma_rso_print_trigger_info(&roam_info->trigger,
vdev_id);
@@ -2141,6 +2205,26 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event,
roam_info->result.fail_reason,
ROAM_FAIL_REASON);
}
status = wlan_cm_roam_extract_frame_info(
wma->wmi_handle, event,
roam_info->frame_info, num_frames,
roam_info->scan.frame_info_count);
if (QDF_IS_STATUS_ERROR(status)) {
wma_debug_rl("Roam frame extract failed vdev %d at %d iteration",
vdev_id, i);
qdf_mem_free(roam_info);
return -EINVAL;
}
num_frames += roam_info->scan.frame_info_count;
if (roam_info->scan.frame_info_count) {
for (k = 0; k <= roam_info->scan.frame_info_count; k++)
wma_rso_print_frame_info(
&roam_info->frame_info[k],
vdev_id);
}
/* BTM resp info */
status = wlan_cm_roam_extract_btm_response(wma->wmi_handle,
event,
@@ -2163,9 +2247,13 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event,
(roam_info->trigger.trigger_reason ==
WMI_ROAM_TRIGGER_REASON_WTC_BTM ||
roam_info->trigger.trigger_reason ==
WMI_ROAM_TRIGGER_REASON_BTM)))
WMI_ROAM_TRIGGER_REASON_BTM))) {
bool is_wtc =
(roam_info->trigger.trigger_reason ==
ROAM_TRIGGER_REASON_WTC_BTM);
wma_rso_print_btm_rsp_info(&roam_info->btm_rsp,
vdev_id);
vdev_id, is_wtc);
}
/* Initial Roam info */
status = wlan_cm_roam_extract_roam_initial_info(
@@ -2234,7 +2322,7 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event,
status = wmi_unified_extract_roam_trigger_stats(
wma->wmi_handle, event,
&roam_info->trigger, 0);
&roam_info->trigger, 0, 0);
if (QDF_IS_STATUS_ERROR(status)) {
wma_debug_rl("Extract roam trigger stats failed vdev %d",
vdev_id);
@@ -2273,9 +2361,14 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event,
return -EINVAL;
}
if (roam_info->btm_rsp.present)
if (roam_info->btm_rsp.present) {
bool is_wtc =
(roam_info->trigger.present &&
roam_info->trigger.trigger_reason ==
ROAM_TRIGGER_REASON_WTC_BTM);
wma_rso_print_btm_rsp_info(&roam_info->btm_rsp,
vdev_id);
vdev_id, is_wtc);
}
qdf_mem_free(roam_info);
}