wlan: Add Per packet stats.
As part of Per packet stats, periodical stats such
as data rate, rssi, seq. number, number of retries
etc would be sent to wifi hal layer for debugging.
Change-Id: I20651f38589abf031f04392f4c93d3511bdb3403
CRs-Fixed: 915570
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index d98bf55..b5f6c73 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -2272,6 +2272,13 @@
#define CFG_WLAN_LOGGING_NUM_BUF_MIN ( 4 )
#define CFG_WLAN_LOGGING_NUM_BUF_MAX ( 64 )
#define CFG_WLAN_LOGGING_NUM_BUF_DEFAULT ( 32 )
+
+//Number of buffers to be used for WLAN logging
+#define CFG_WLAN_PKT_STATS_NUM_BUF_NAME "wlanPerPktStatsNumBuf"
+#define CFG_WLAN_PKT_STATS_NUM_BUF_MIN ( 4 )
+#define CFG_WLAN_PKT_STATS_NUM_BUF_MAX ( 64 )
+#define CFG_WLAN_PKT_STATS_NUM_BUF_DEFAULT ( 16 )
+
#endif //WLAN_LOGGING_SOCK_SVC_ENABLE
//Enable PerPKT stats Logging
@@ -3004,6 +3011,7 @@
v_U32_t wlanLoggingFEToConsole;
v_U32_t wlanLoggingNumBuf;
v_U32_t wlanPerPktStatsLogEnable;
+ v_U32_t wlanPerPktStatsNumBuf;
#endif
v_BOOL_t ignorePeerErpInfo;
v_BOOL_t initialScanSkipDFSCh;
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 834ff92..71fa450 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -3052,6 +3052,7 @@
CFG_WLAN_LOGGING_NUM_BUF_DEFAULT,
CFG_WLAN_LOGGING_NUM_BUF_MIN,
CFG_WLAN_LOGGING_NUM_BUF_MAX ),
+
REG_VARIABLE( CFG_WLAN_PKT_STATS_LOGGING_NAME, WLAN_PARAM_Integer,
hdd_config_t, wlanPerPktStatsLogEnable,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -3059,6 +3060,13 @@
CFG_WLAN_PKT_STATS_LOGGING_DISABLE,
CFG_WLAN_PKT_STATS_LOGGING_ENABLE ),
+ REG_VARIABLE( CFG_WLAN_PKT_STATS_NUM_BUF_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, wlanPerPktStatsNumBuf,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_WLAN_PKT_STATS_NUM_BUF_DEFAULT,
+ CFG_WLAN_PKT_STATS_NUM_BUF_MIN,
+ CFG_WLAN_PKT_STATS_NUM_BUF_MAX ),
+
#endif //WLAN_LOGGING_SOCK_SVC_ENABLE
REG_VARIABLE( CFG_IGNORE_PEER_ERP_INFO_NAME, WLAN_PARAM_Integer,
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index d9b3646..eac14c7 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -5822,13 +5822,15 @@
hddLog(LOG1, FL("flag=%d"), start_log.flag);
if ((RING_ID_PER_PACKET_STATS == start_log.ringId) &&
- !hdd_ctx->cfg_ini->wlanPerPktStatsLogEnable)
+ (!hdd_ctx->cfg_ini->wlanPerPktStatsLogEnable ||
+ !vos_isPktStatsEnabled()))
+
{
hddLog(LOGE, FL("per pkt stats not enabled"));
return -EINVAL;
}
- vos_set_ring_log_level(start_log.ringId, start_log.verboseLevel);
+ vos_set_ring_log_level(start_log.ringId, start_log.verboseLevel);
return 0;
}
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index d45b07d..d0d70bf 100755
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -10293,7 +10293,9 @@
{
if(wlan_logging_sock_activate_svc(
pHddCtx->cfg_ini->wlanLoggingFEToConsole,
- pHddCtx->cfg_ini->wlanLoggingNumBuf))
+ pHddCtx->cfg_ini->wlanLoggingNumBuf,
+ pHddCtx->cfg_ini->wlanPerPktStatsLogEnable,
+ pHddCtx->cfg_ini->wlanPerPktStatsNumBuf))
{
hddLog(VOS_TRACE_LEVEL_ERROR, "%s: wlan_logging_sock_activate_svc"
" failed", __func__);
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 4e676d9..2502c81 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -172,6 +172,7 @@
#endif
#define WE_SET_RTS_CTS_HTVHT 21
#define WE_SET_MONITOR_STATE 22
+#define WE_SET_PKT_STATS_ENABLE_DISABLE 23
/* Private ioctls and their sub-ioctls */
#define WLAN_PRIV_SET_NONE_GET_INT (SIOCIWFIRSTPRIV + 1)
@@ -3388,7 +3389,8 @@
hstatus = sme_GetStatistics(WLAN_HDD_GET_HAL_CTX(pAdapter),
eCSR_HDD,
SME_SUMMARY_STATS |
- SME_GLOBAL_CLASSA_STATS,
+ SME_GLOBAL_CLASSA_STATS |
+ SME_PER_PKT_STATS,
hdd_get_station_statisticsCB,
0, // not periodic
FALSE, //non-cached results
@@ -5914,6 +5916,38 @@
}
break;
}
+ case WE_SET_PKT_STATS_ENABLE_DISABLE:
+ {
+ hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ tAniWifiStartLog start_log;
+ if (!pHddCtx->cfg_ini->wlanPerPktStatsLogEnable ||
+ !vos_isPktStatsEnabled())
+ {
+ hddLog(LOGE, FL("per pkt stats not enabled"));
+ return -EINVAL;
+ }
+ hddLog(LOG1, FL("Set Pkt Stats %d"), set_value);
+
+ if (1 == set_value || 0 == set_value)
+ {
+ start_log.ringId = RING_ID_PER_PACKET_STATS;
+ start_log.flag = 0;
+ if (set_value)
+ start_log.verboseLevel = WLAN_LOG_LEVEL_ACTIVE;
+ else
+ start_log.verboseLevel = WLAN_LOG_LEVEL_OFF;
+
+ vos_set_ring_log_level(start_log.ringId, start_log.verboseLevel);
+ }
+ else
+ {
+ hddLog(LOGE,
+ FL("Invalid value %d in WE_SET_PKT_STATS_ENABLE_DISABLE IOCTL"),
+ set_value);
+ ret = -EINVAL;
+ }
+ break;
+ }
default:
{
@@ -10333,7 +10367,9 @@
{ WE_SET_RTS_CTS_HTVHT,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
0, "setRtsCtsHtVht" },
-
+ { WE_SET_PKT_STATS_ENABLE_DISABLE,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ 0, "setPktStats" },
/* handlers for main ioctl */
{ WLAN_PRIV_SET_NONE_GET_INT,
0,