qcacld-3.0: Add debugfs support for connect info

Add debugfs entry to get connect info (bssid, ssid, freq etc.,)
for STA interface.

Change-Id: Id5c350dbb4ca9b9f6b203459adee59b2d5e94f67
CRs-Fixed: 2203654
This commit is contained in:
Rajeev Kumar Sirasanagandla
2018-03-12 08:44:51 +05:30
committed by nshrivas
parent 197d417733
commit 4c8edc0e69
7 changed files with 542 additions and 4 deletions

1
Kbuild
View File

@@ -71,6 +71,7 @@ HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_debugfs.o
ifeq ($(CONFIG_WLAN_FEATURE_LINK_LAYER_STATS), y)
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_debugfs_llstat.o
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_debugfs_csr.o
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_debugfs_connect.o
endif
endif

View File

@@ -170,6 +170,9 @@ struct hdd_conn_flag {
* @congestion: holds congestion percentage
* @last_ssid: holds last ssid
* @last_auth_type: holds last auth type
* @auth_time: last authentication established time
* @connect_time: last association established time
* @ch_width: channel width of operating channel
*/
struct hdd_connection_info {
eConnectionState connState;
@@ -204,6 +207,9 @@ struct hdd_connection_info {
uint32_t cca;
tCsrSSIDInfo last_ssid;
eCsrAuthType last_auth_type;
char auth_time[HDD_TIME_STRING_LEN];
char connect_time[HDD_TIME_STRING_LEN];
enum phy_ch_width ch_width;
};
/* Forward declarations */

View File

@@ -39,6 +39,8 @@
#ifdef WLAN_DEBUGFS
#define DEBUGFS_CONNECT_INFO_BUF_SIZE (4 * 1024)
/**
* struct wlan_hdd_debugfs_buffer_info - Debugfs buffer info
* @length: current length of the debugfs buffer
@@ -84,6 +86,19 @@ void wlan_hdd_debugfs_csr_deinit(struct hdd_adapter *adapter);
ssize_t
wlan_hdd_current_time_info_debugfs(uint8_t *buf, ssize_t buf_avail_len);
/**
* wlan_hdd_debugfs_update_connect_info() - API to get connect info
* into user buffer
* @buf: output buffer to hold connect info
* @buf_avail_len: available buffer length
*
* Return: No.of bytes copied
*/
ssize_t
wlan_hdd_debugfs_update_connect_info(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter,
uint8_t *buf, ssize_t buf_avail_len);
#else
/**
* wlan_hdd_debugfs_csr_init() - Create wifi diagnostic debugfs files
@@ -118,6 +133,22 @@ wlan_hdd_current_time_info_debugfs(uint8_t *buf, ssize_t buf_avail_len)
return 0;
}
/**
* wlan_hdd_debugfs_update_connect_info() - API to get connect info
* into user buffer
* @buf: output buffer to hold connect info
* @buf_avail_len: available buffer length
*
* Return: No.of bytes copied
*/
static inline ssize_t
wlan_hdd_debugfs_update_connect_info(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter,
uint8_t *buf, ssize_t buf_avail_len)
{
return 0;
}
#endif
#endif /* _WLAN_HDD_DEBUGFS_CSR_H */

View File

@@ -211,7 +211,7 @@ static inline void wlan_hdd_sae_callback(struct hdd_adapter *adapter,
/**
* hdd_conn_set_authenticated() - set authentication state
* @adapter: pointer to the adapter
* @authState: authentication state
* @auth_state: authentication state
*
* This function updates the global HDD station context
* authentication state.
@@ -219,14 +219,26 @@ static inline void wlan_hdd_sae_callback(struct hdd_adapter *adapter,
* Return: none
*/
static void
hdd_conn_set_authenticated(struct hdd_adapter *adapter, uint8_t authState)
hdd_conn_set_authenticated(struct hdd_adapter *adapter, uint8_t auth_state)
{
struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
char *auth_time;
uint32_t time_buffer_size;
/* save the new connection state */
hdd_debug("Authenticated state Changed from oldState:%d to State:%d",
sta_ctx->conn_info.uIsAuthenticated, authState);
sta_ctx->conn_info.uIsAuthenticated = authState;
sta_ctx->conn_info.uIsAuthenticated, auth_state);
sta_ctx->conn_info.uIsAuthenticated = auth_state;
auth_time = sta_ctx->conn_info.auth_time;
time_buffer_size = sizeof(sta_ctx->conn_info.auth_time);
if (auth_state)
qdf_get_time_of_the_day_in_hr_min_sec_usec(auth_time,
time_buffer_size);
else
qdf_mem_set(auth_time, 0x00, time_buffer_size);
}
/**
@@ -243,6 +255,8 @@ void hdd_conn_set_connection_state(struct hdd_adapter *adapter,
{
struct hdd_station_ctx *hdd_sta_ctx =
WLAN_HDD_GET_STATION_CTX_PTR(adapter);
char *connect_time;
uint32_t time_buffer_size;
/* save the new connection state */
hdd_debug("Changed conn state from old:%d to new:%d for dev %s",
@@ -253,6 +267,15 @@ void hdd_conn_set_connection_state(struct hdd_adapter *adapter,
hdd_sta_ctx->conn_info.connState,
conn_state);
hdd_sta_ctx->conn_info.connState = conn_state;
connect_time = hdd_sta_ctx->conn_info.connect_time;
time_buffer_size = sizeof(hdd_sta_ctx->conn_info.connect_time);
if (conn_state == eConnectionState_Associated)
qdf_get_time_of_the_day_in_hr_min_sec_usec(connect_time,
time_buffer_size);
else
qdf_mem_set(connect_time, 0x00, time_buffer_size);
}
/**
@@ -997,6 +1020,9 @@ hdd_conn_save_connect_info(struct hdd_adapter *adapter,
sta_ctx->conn_info.rate_flags =
roam_info->chan_info.rate_flags;
sta_ctx->conn_info.ch_width =
roam_info->chan_info.ch_width;
}
hdd_save_bss_info(adapter, roam_info);
}

View File

@@ -0,0 +1,452 @@
/*
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: wlan_hdd_debugfs_connect.c
*
* WLAN Host Device Driver implementation to update
* debugfs with connect information
*/
#include <wlan_hdd_debugfs_csr.h>
#include <wlan_hdd_main.h>
#include <cds_sched.h>
#include <wma_api.h>
#include "qwlan_version.h"
#include "wmi_unified_param.h"
/**
* wlan_hdd_version_info_debugfs() - Populate driver, FW and HW version
* @hdd_ctx: pointer to hdd context
* @buf: output buffer to hold version info
* @buf_avail_len: available buffer length
*
* Return: No.of bytes populated by this function in buffer
*/
static ssize_t
wlan_hdd_version_info_debugfs(struct hdd_context *hdd_ctx, uint8_t *buf,
ssize_t buf_avail_len)
{
uint32_t major_spid = 0, minor_spid = 0, siid = 0, crmid = 0, sub_id;
ssize_t length = 0;
int ret_val;
hdd_get_fw_version(hdd_ctx, &major_spid, &minor_spid, &siid, &crmid);
sub_id = (hdd_ctx->target_fw_vers_ext & 0xf0000000) >> 28;
ret_val = scnprintf(buf, buf_avail_len,
"\nVERSION DETAILS\n");
if (ret_val <= 0)
return length;
length += ret_val;
if (length >= buf_avail_len) {
hdd_err("No sufficient buf_avail_len");
return buf_avail_len;
}
ret_val = scnprintf(buf + length, buf_avail_len - length,
"Host Driver Version: %s\n"
"Firmware Version: %d.%d.%d.%d.%d\n"
"Hardware Version: %s\n",
QWLAN_VERSIONSTR,
major_spid, minor_spid, siid, crmid, sub_id,
hdd_ctx->target_hw_name);
if (ret_val <= 0)
return length;
length += ret_val;
return length;
}
/**
* wlan_hdd_add_nss_info() - Populate NSS info
* @conn_info: station connection information
* @buf: output buffer to hold version info
* @buf_avail_len: available buffer length
*
* Return: No.of bytes populated by this function in buffer
*/
static ssize_t
wlan_hdd_add_nss_info(struct hdd_connection_info *conn_info,
uint8_t *buf, ssize_t buf_avail_len)
{
ssize_t length = 0;
int ret_val;
if (!conn_info->conn_flag.ht_present &&
!conn_info->conn_flag.vht_present)
return length;
ret_val = scnprintf(buf, buf_avail_len,
"nss = %u\n",
conn_info->txrate.nss);
if (ret_val <= 0)
return length;
length = ret_val;
return length;
}
/**
* wlan_hdd_add_ht_cap_info() - Populate HT info
* @conn_info: station connection information
* @buf: output buffer to hold version info
* @buf_avail_len: available buffer length
*
* Return: No.of bytes populated by this function in buffer
*/
static ssize_t
wlan_hdd_add_ht_cap_info(struct hdd_connection_info *conn_info,
uint8_t *buf, ssize_t buf_avail_len)
{
struct ieee80211_ht_cap *ht_caps;
ssize_t length = 0;
int ret;
if (!conn_info->conn_flag.ht_present)
return length;
ht_caps = &conn_info->ht_caps;
ret = scnprintf(buf, buf_avail_len,
"ht_cap_info = %x\n"
"ampdu_params_info = %x\n"
"extended_ht_cap_info = %x\n"
"tx_BF_cap_info = %x\n"
"antenna_selection_info = %x\n"
"ht_rx_higest = %x\n"
"ht_tx_params = %x\n",
ht_caps->cap_info,
ht_caps->ampdu_params_info,
ht_caps->extended_ht_cap_info,
ht_caps->tx_BF_cap_info,
ht_caps->antenna_selection_info,
ht_caps->mcs.rx_highest,
ht_caps->mcs.tx_params);
if (ret <= 0)
return length;
length = ret;
return length;
}
/**
* wlan_hdd_add_vht_cap_info() - Populate VHT info
* @conn_info: station connection information
* @buf: output buffer to hold version info
* @buf_avail_len: available buffer length
*
* Return: No.of bytes populated by this function in buffer
*/
static ssize_t
wlan_hdd_add_vht_cap_info(struct hdd_connection_info *conn_info,
uint8_t *buf, ssize_t buf_avail_len)
{
struct ieee80211_vht_cap *vht_caps;
ssize_t length = 0;
int ret;
if (!conn_info->conn_flag.vht_present)
return length;
vht_caps = &conn_info->vht_caps;
ret = scnprintf(buf, buf_avail_len,
"vht_cap_info = %x\n"
"rx_mcs_map = %x\n"
"rx_highest = %x\n"
"tx_mcs_map = %x\n"
"tx_highest = %x\n",
vht_caps->vht_cap_info,
vht_caps->supp_mcs.rx_mcs_map,
vht_caps->supp_mcs.rx_highest,
vht_caps->supp_mcs.tx_mcs_map,
vht_caps->supp_mcs.tx_highest);
if (ret <= 0)
return length;
length = ret;
return length;
}
/**
* hdd_auth_type_str() - Get string for enum csr auth type
* @auth_type: authentication id
*
* Return: Meaningful string for enum csr auth type
*/
static
uint8_t *hdd_auth_type_str(uint32_t auth_type)
{
switch (auth_type) {
case eCSR_AUTH_TYPE_OPEN_SYSTEM:
return "OPEN SYSTEM";
case eCSR_AUTH_TYPE_SHARED_KEY:
return "SHARED KEY";
case eCSR_AUTH_TYPE_WPA:
return "WPA";
case eCSR_AUTH_TYPE_WPA_PSK:
return "WPA PSK";
case eCSR_AUTH_TYPE_AUTOSWITCH:
return "AUTO SWITCH";
case eCSR_AUTH_TYPE_WPA_NONE:
return "WPA NONE";
case eCSR_AUTH_TYPE_RSN:
return "RSN";
case eCSR_AUTH_TYPE_RSN_PSK:
return "RSN PSK";
case eCSR_AUTH_TYPE_FT_RSN:
return "FT RSN";
case eCSR_AUTH_TYPE_FT_RSN_PSK:
return "FT RSN PSK";
case eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE:
return "WAPI WAI CERTIFICATE";
case eCSR_AUTH_TYPE_WAPI_WAI_PSK:
return "WAPI WAI PSK";
case eCSR_AUTH_TYPE_CCKM_WPA:
return "CCKM WPA";
case eCSR_AUTH_TYPE_CCKM_RSN:
return "CCKM RSN";
case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
return "RSN PSK SHA256";
case eCSR_AUTH_TYPE_RSN_8021X_SHA256:
return "RSN 8021X SHA256";
case eCSR_NUM_OF_SUPPORT_AUTH_TYPE:
return "NUM OF SUPPORT AUTH TYPE";
case eCSR_AUTH_TYPE_FAILED:
return "FAILED";
case eCSR_AUTH_TYPE_NONE:
return "NONE";
}
return "UNKNOWN";
}
/**
* hdd_dot11_mode_str() - Get string for enum csr dot11 mode
* @dot11mode: dot11 mode ID
*
* Return: Meaningful string for enum csr dot11 mode
*/
static
uint8_t *hdd_dot11_mode_str(uint32_t dot11mode)
{
switch (dot11mode) {
case eCSR_CFG_DOT11_MODE_11A:
return "DOT11 MODE 11A";
case eCSR_CFG_DOT11_MODE_11B:
return "DOT11 MODE 11B";
case eCSR_CFG_DOT11_MODE_11G:
return "DOT11 MODE 11G";
case eCSR_CFG_DOT11_MODE_11N:
return "DOT11 MODE 11N";
case eCSR_CFG_DOT11_MODE_11AC:
return "DOT11 MODE 11AC";
case eCSR_CFG_DOT11_MODE_AUTO:
return "DOT11 MODE AUTO";
case eCSR_CFG_DOT11_MODE_ABG:
return "DOT11 MODE 11ABG";
}
return "UNKNOWN";
}
/**
* hdd_ch_width_str() - Get string for channel width
* @ch_width: channel width from connect info
*
* Return: User readable string for channel width
*/
static
uint8_t *hdd_ch_width_str(enum phy_ch_width ch_width)
{
switch (ch_width) {
case CH_WIDTH_20MHZ:
return "20MHz";
case CH_WIDTH_40MHZ:
return "40MHz";
case CH_WIDTH_80MHZ:
return "80MHz";
case CH_WIDTH_160MHZ:
return "160MHz";
case CH_WIDTH_80P80MHZ:
return "(80 + 80)MHz";
case CH_WIDTH_5MHZ:
return "5MHz";
case CH_WIDTH_10MHZ:
return "10MHz";
case CH_WIDTH_INVALID:
/* Fallthrough */
case CH_WIDTH_MAX:
/* Fallthrough */
default:
return "UNKNOWN";
}
}
/**
* wlan_hdd_connect_info_debugfs() - Populate connect info
* @adapter: pointer to sta adapter for which connect info is required
* @buf: output buffer to hold version info
* @buf_avail_len: available buffer length
*
* Return: No.of bytes populated by this function in buffer
*/
static ssize_t
wlan_hdd_connect_info_debugfs(struct hdd_adapter *adapter, uint8_t *buf,
ssize_t buf_avail_len)
{
ssize_t length = 0;
struct hdd_station_ctx *hdd_sta_ctx;
struct hdd_connection_info *conn_info;
uint32_t bit_rate;
int ret_val;
hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
if (hdd_sta_ctx->conn_info.connState != eConnectionState_Associated) {
ret_val = scnprintf(buf, buf_avail_len,
"\nSTA is not connected\n");
if (ret_val >= 0)
length = ret_val;
return length;
}
ret_val = scnprintf(buf, buf_avail_len,
"\nCONNECTION DETAILS\n");
if (ret_val <= 0)
return length;
length += ret_val;
if (length >= buf_avail_len) {
hdd_err("No sufficient buf_avail_len");
return buf_avail_len;
}
if (hdd_sta_ctx->hdd_reassoc_scenario) {
ret_val = scnprintf(buf + length, buf_avail_len - length,
"Roaming is in progress");
if (ret_val <= 0)
return length;
length += ret_val;
}
conn_info = &hdd_sta_ctx->conn_info;
bit_rate = cfg80211_calculate_bitrate(&conn_info->txrate);
if (length >= buf_avail_len) {
hdd_err("No sufficient buf_avail_len");
return buf_avail_len;
}
ret_val = scnprintf(buf + length, buf_avail_len - length,
"ssid = %s\n"
"bssid = " MAC_ADDRESS_STR "\n"
"connect_time = %s\n"
"auth_time = %s\n"
"freq = %u\n"
"ch_width = %s\n"
"signal = %ddBm\n"
"bit_rate = %u\n"
"last_auth_type = %s\n"
"dot11Mode = %s\n",
conn_info->last_ssid.SSID.ssId,
MAC_ADDR_ARRAY(conn_info->bssId.bytes),
conn_info->connect_time,
conn_info->auth_time,
conn_info->freq,
hdd_ch_width_str(conn_info->ch_width),
conn_info->signal,
bit_rate,
hdd_auth_type_str(conn_info->last_auth_type),
hdd_dot11_mode_str(conn_info->dot11Mode));
if (ret_val <= 0)
return length;
length += ret_val;
if (length >= buf_avail_len) {
hdd_err("No sufficient buf_avail_len");
return buf_avail_len;
}
length += wlan_hdd_add_nss_info(conn_info, buf + length,
buf_avail_len - length);
if (length >= buf_avail_len) {
hdd_err("No sufficient buf_avail_len");
return buf_avail_len;
}
length += wlan_hdd_add_ht_cap_info(conn_info, buf + length,
buf_avail_len - length);
if (length >= buf_avail_len) {
hdd_err("No sufficient buf_avail_len");
return buf_avail_len;
}
length += wlan_hdd_add_vht_cap_info(conn_info, buf + length,
buf_avail_len - length);
return length;
}
ssize_t
wlan_hdd_debugfs_update_connect_info(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter,
uint8_t *buf, ssize_t buf_avail_len)
{
ssize_t len;
int ret_val;
hdd_enter();
len = wlan_hdd_current_time_info_debugfs(buf, buf_avail_len);
if (len >= buf_avail_len) {
hdd_err("No sufficient buf_avail_len");
return buf_avail_len;
}
if (adapter->device_mode != QDF_STA_MODE) {
ret_val = scnprintf(buf + len, buf_avail_len - len,
"Interface is not operating STA Mode\n");
if (ret_val <= 0)
return len;
len += ret_val;
return len;
}
if (len >= buf_avail_len) {
hdd_err("No sufficient buf_avail_len");
return buf_avail_len;
}
len += wlan_hdd_version_info_debugfs(hdd_ctx, buf + len,
buf_avail_len - len);
if (len >= buf_avail_len) {
hdd_err("No sufficient buf_avail_len");
return buf_avail_len;
}
len += wlan_hdd_connect_info_debugfs(adapter, buf + len,
buf_avail_len - len);
hdd_exit();
return len;
}

View File

@@ -76,6 +76,8 @@ wlan_hdd_debugfs_update_csr(struct hdd_context *hdd_ctx,
switch (id) {
case HDD_DEBUFS_FILE_ID_CONNECT_INFO:
/* populate connect info */
len = wlan_hdd_debugfs_update_connect_info(hdd_ctx, adapter,
buf, buf_avail_len);
break;
case HDD_DEBUFS_FILE_ID_ROAM_SCAN_STATS_INFO:
/* populate roam scan stats info */
@@ -317,10 +319,26 @@ static const struct file_operations fops_csr_debugfs = {
void wlan_hdd_debugfs_csr_init(struct hdd_adapter *adapter)
{
struct hdd_debugfs_file_info *csr;
const uint32_t max_len = HDD_DEBUGFS_FILE_NAME_MAX;
/*
* Create debufs diagnostic files for connect, offload info
* and roam info and store in csr_file member of adapter
*/
csr = &adapter->csr_file[HDD_DEBUFS_FILE_ID_CONNECT_INFO];
if (!csr->entry) {
strlcpy(csr->name, "connect_info", max_len);
csr->id = HDD_DEBUFS_FILE_ID_CONNECT_INFO;
csr->buf_max_size = DEBUGFS_CONNECT_INFO_BUF_SIZE;
csr->entry = debugfs_create_file(csr->name, 0444,
adapter->debugfs_phy,
csr, &fops_csr_debugfs);
if (!csr->entry)
hdd_err("Failed to create debugfs file: %s",
csr->name);
}
}
void wlan_hdd_debugfs_csr_deinit(struct hdd_adapter *adapter)

View File

@@ -7960,6 +7960,8 @@ static void csr_roam_process_join_res(tpAniSirGlobal mac_ctx,
roam_info.chan_info.nss = join_rsp->nss;
roam_info.chan_info.rate_flags =
join_rsp->max_rate_flags;
roam_info.chan_info.ch_width =
join_rsp->vht_channel_width;
#ifdef FEATURE_WLAN_TDLS
roam_info.tdls_prohibited = join_rsp->tdls_prohibited;
roam_info.tdls_chan_swit_prohibited =
@@ -22181,6 +22183,8 @@ static QDF_STATUS csr_process_roam_sync_callback(tpAniSirGlobal mac_ctx,
roam_info->chan_info.nss = roam_synch_data->join_rsp->nss;
roam_info->chan_info.rate_flags =
roam_synch_data->join_rsp->max_rate_flags;
roam_info->chan_info.ch_width =
roam_synch_data->join_rsp->vht_channel_width;
csr_roam_fill_tdls_info(mac_ctx, roam_info, roam_synch_data->join_rsp);
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
src_profile = &roam_synch_data->join_rsp->HTProfile;