qcacmn: Add support to get pmf bcn protect stats from fw

To get the pmf beacon stats from firmware, host sets
WMI_REQUEST_PMF_BCN_PROTECT_STAT bit in stats_id param of
WMI_REQUEST_STATS_CMDID command. Firmware supporting pmf beacon
protection stats responds host with stats in wmi_update_stats_id
event.
Hence add support to get PMF beacon protect stats from firmware.

Change-Id: I99efd94ce5367da1312f60251ce7106997dd8bc8
CRs-Fixed: 2705084
This commit is contained in:
Abhishek Ambure
2020-08-18 18:41:36 +05:30
committed by snandini
parent 62339dcb9c
commit f17e8207ac
5 changed files with 82 additions and 0 deletions

View File

@@ -3014,6 +3014,18 @@ QDF_STATUS
wmi_extract_profile_data(wmi_unified_t wmi_handle, void *evt_buf, uint8_t idx,
wmi_host_wlan_profile_t *profile_data);
/**
* wmi_extract_pmf_bcn_protect_stats() - extract pmf bcn stats from event
* @wmi_handle: wmi handle
* @evt_buf: pointer to event buffer
* @bcn_stats: Pointer to hold pmf bcn protect stats
*
* Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
*/
QDF_STATUS
wmi_extract_pmf_bcn_protect_stats(wmi_unified_t wmi_handle, void *evt_buf,
wmi_host_pmf_bcn_protect_stats *bcn_stats);
/**
* extract_unit_test() - extract unit test from event
* @wmi_handle: wmi handle

View File

@@ -796,6 +796,7 @@ typedef enum {
WMI_HOST_REQUEST_BCN_STAT_RESET = 0x1000,
WMI_HOST_REQUEST_PEER_RETRY_STAT = 0x2000,
WMI_HOST_REQUEST_PEER_ADV_STATS = 0x4000,
WMI_HOST_REQUEST_PMF_BCN_PROTECT_STAT = 0x8000,
} wmi_host_stats_id;
typedef struct {
@@ -4157,6 +4158,19 @@ typedef struct {
uint32_t mib_int_count;
} wmi_host_pdev_stats;
/**
* struct wmi_host_pmf_bcn_protect_stats - PMF bcn protect stats
* @igtk_mic_fail_cnt: MIC failure count of management packets using IGTK
* @igtk_replay_cnt: Replay detection count of management packets using IGTK
* @bcn_mic_fail_cnt: MIC failure count of beacon packets using BIGTK
* @bcn_replay_cnt: Replay detection count of beacon packets using BIGTK
*/
typedef struct {
uint32_t igtk_mic_fail_cnt;
uint32_t igtk_replay_cnt;
uint32_t bcn_mic_fail_cnt;
uint32_t bcn_replay_cnt;
} wmi_host_pmf_bcn_protect_stats;
/**
* struct wmi_unit_test_event - Structure corresponding to WMI Unit test event

View File

@@ -1731,6 +1731,9 @@ QDF_STATUS (*extract_all_stats_count)(wmi_unified_t wmi_handle, void *evt_buf,
QDF_STATUS (*extract_pdev_stats)(wmi_unified_t wmi_handle, void *evt_buf,
uint32_t index, wmi_host_pdev_stats *pdev_stats);
QDF_STATUS (*extract_pmf_bcn_protect_stats)(wmi_unified_t wmi_handle,
void *evt_buf, wmi_host_pmf_bcn_protect_stats *pmf_bcn_stats);
QDF_STATUS (*extract_unit_test)(wmi_unified_t wmi_handle, void *evt_buf,
wmi_unit_test_event *unit_test, uint32_t maxspace);

View File

@@ -2104,6 +2104,17 @@ wmi_extract_composite_phyerr(wmi_unified_t wmi_handle, void *evt_buf,
}
QDF_STATUS
wmi_extract_pmf_bcn_protect_stats(wmi_unified_t wmi_handle, void *evt_buf,
wmi_host_pmf_bcn_protect_stats *bcn_stats)
{
if (wmi_handle->ops->extract_pmf_bcn_protect_stats)
return wmi_handle->ops->extract_pmf_bcn_protect_stats(
wmi_handle, evt_buf, bcn_stats);
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_extract_unit_test(wmi_unified_t wmi_handle, void *evt_buf,
wmi_unit_test_event *unit_test, uint32_t maxspace)

View File

@@ -136,6 +136,10 @@ extract_all_stats_counts_tlv(wmi_unified_t wmi_handle, void *evt_buf,
stats_param->stats_id |= WMI_HOST_REQUEST_PEER_ADV_STATS;
break;
case WMI_REQUEST_PMF_BCN_PROTECT_STAT:
stats_param->stats_id |= WMI_HOST_REQUEST_PMF_BCN_PROTECT_STAT;
break;
default:
stats_param->stats_id = 0;
break;
@@ -451,6 +455,43 @@ extract_peer_extd_stats_tlv(wmi_unified_t wmi_handle,
}
/**
* extract_pmf_bcn_protect_stats_tlv() - extract pmf bcn stats from event
* @wmi_handle: wmi handle
* @evt_buf: pointer to event buffer
* @pmf_bcn_stats: Pointer to hold pmf bcn protect stats
*
* Return: QDF_STATUS_SUCCESS for success or error code
*/
static QDF_STATUS
extract_pmf_bcn_protect_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
wmi_host_pmf_bcn_protect_stats *pmf_bcn_stats)
{
WMI_UPDATE_STATS_EVENTID_param_tlvs *param_buf;
wmi_stats_event_fixed_param *ev_param;
param_buf = (WMI_UPDATE_STATS_EVENTID_param_tlvs *)evt_buf;
if (!param_buf)
return QDF_STATUS_E_FAILURE;
ev_param = (wmi_stats_event_fixed_param *)param_buf->fixed_param;
if ((ev_param->stats_id & WMI_REQUEST_PMF_BCN_PROTECT_STAT) &&
param_buf->pmf_bcn_protect_stats) {
pmf_bcn_stats->igtk_mic_fail_cnt =
param_buf->pmf_bcn_protect_stats->igtk_mic_fail_cnt;
pmf_bcn_stats->igtk_replay_cnt =
param_buf->pmf_bcn_protect_stats->igtk_replay_cnt;
pmf_bcn_stats->bcn_mic_fail_cnt =
param_buf->pmf_bcn_protect_stats->bcn_mic_fail_cnt;
pmf_bcn_stats->bcn_replay_cnt =
param_buf->pmf_bcn_protect_stats->bcn_replay_cnt;
}
return QDF_STATUS_SUCCESS;
}
void wmi_cp_stats_attach_tlv(wmi_unified_t wmi_handle)
{
struct wmi_ops *ops = wmi_handle->ops;
@@ -461,6 +502,7 @@ void wmi_cp_stats_attach_tlv(wmi_unified_t wmi_handle)
ops->extract_vdev_stats = extract_vdev_stats_tlv;
ops->extract_peer_stats = extract_peer_stats_tlv;
ops->extract_peer_extd_stats = extract_peer_extd_stats_tlv;
ops->extract_pmf_bcn_protect_stats = extract_pmf_bcn_protect_stats_tlv,
wmi_mc_cp_stats_attach_tlv(wmi_handle);
}