clear the interface stats in host for set and clear commands
Host collects the following stats to provide them to the
llstats get request.
1. mgmtRx
2. rssiData
3. rxMcast
4. rxMpdu
5. rxAmpdu
6. txMcast
Clear the same when host receives corresponding clear request.
Firmware collects txMpdu stats, host need not to collect the same.
Change-Id: Iffd06d45622b386c79da5734c97c8a600468a6bb
CRs-Fixed: 751709
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index a3bdfd8..61f999f 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -866,44 +866,40 @@
pWifiIfaceStat->mgmtRx = pWifiIfaceStat->beaconRx +
pWifiIfaceStatTL->mgmtRx;
- pWifiIfaceStat->mgmtActionRx = pWifiIfaceStatTL->mgmtActionRx;
- pWifiIfaceStat->mgmtActionTx = pWifiIfaceStatTL->mgmtActionTx;
pWifiIfaceStat->rssiData = pWifiIfaceStatTL->rssiData;
- vos_mem_copy(
- (void *) &pWifiIfaceStat->AccessclassStats[WIFI_AC_VO],
- (void *) &pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VO],
- sizeof(WLANTL_AccessCategoryStatsType));
+ pWifiIfaceStat->AccessclassStats[WIFI_AC_VO].rxMcast
+ = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VO].rxMcast;
+ pWifiIfaceStat->AccessclassStats[WIFI_AC_VI].rxMcast
+ = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VI].rxMcast;
+ pWifiIfaceStat->AccessclassStats[WIFI_AC_BE].rxMcast
+ = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BE].rxMcast;
+ pWifiIfaceStat->AccessclassStats[WIFI_AC_BK].rxMcast
+ = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BK].rxMcast;
- vos_mem_copy(
- (void *) &pWifiIfaceStat->AccessclassStats[WIFI_AC_VI],
- (void *) &pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VI],
- sizeof(WLANTL_AccessCategoryStatsType));
+ pWifiIfaceStat->AccessclassStats[WIFI_AC_VO].rxMpdu
+ = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VO].rxMpdu;
+ pWifiIfaceStat->AccessclassStats[WIFI_AC_VI].rxMpdu
+ = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VI].rxMpdu;
+ pWifiIfaceStat->AccessclassStats[WIFI_AC_BE].rxMpdu
+ = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BE].rxMpdu;
+ pWifiIfaceStat->AccessclassStats[WIFI_AC_BK].rxMpdu
+ = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BK].rxMpdu;
- vos_mem_copy(
- (void *) &pWifiIfaceStat->AccessclassStats[WIFI_AC_BE],
- (void *) &pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BE],
- sizeof(WLANTL_AccessCategoryStatsType));
-
- vos_mem_copy(
- (void *) &pWifiIfaceStat->AccessclassStats[WIFI_AC_BK],
- (void *) &pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BK],
- sizeof(WLANTL_AccessCategoryStatsType));
+ pWifiIfaceStat->AccessclassStats[WIFI_AC_VO].rxAmpdu
+ = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VO].rxAmpdu;
+ pWifiIfaceStat->AccessclassStats[WIFI_AC_VI].rxAmpdu
+ = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VI].rxAmpdu;
+ pWifiIfaceStat->AccessclassStats[WIFI_AC_BE].rxAmpdu
+ = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BE].rxAmpdu;
+ pWifiIfaceStat->AccessclassStats[WIFI_AC_BK].rxAmpdu
+ = pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_BK].rxAmpdu;
}
else
{
hddLog(VOS_TRACE_LEVEL_ERROR, FL("Error in getting stats from TL"));
}
- pWifiIfaceStat->AccessclassStats[WIFI_AC_VO].txMpdu =
- pAdapter->hdd_stats.hddTxRxStats.txFetchedAC[WLANTL_AC_VO];
- pWifiIfaceStat->AccessclassStats[WIFI_AC_VI].txMpdu =
- pAdapter->hdd_stats.hddTxRxStats.txFetchedAC[WLANTL_AC_VI];
- pWifiIfaceStat->AccessclassStats[WIFI_AC_BE].txMpdu =
- pAdapter->hdd_stats.hddTxRxStats.txFetchedAC[WLANTL_AC_BE];
- pWifiIfaceStat->AccessclassStats[WIFI_AC_BK].txMpdu =
- pAdapter->hdd_stats.hddTxRxStats.txFetchedAC[WLANTL_AC_BK];
-
pWifiIfaceStat->AccessclassStats[WIFI_AC_VO].txMcast =
pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VO];
pWifiIfaceStat->AccessclassStats[WIFI_AC_VI].txMcast =
@@ -1631,6 +1627,7 @@
struct net_device *dev = wdev->netdev;
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_context_t *pHddCtx = wiphy_priv(wiphy);
+ hdd_station_ctx_t *pHddStaCtx;
status = wlan_hdd_validate_context(pHddCtx);
if (0 != status)
@@ -1709,6 +1706,22 @@
return -EINVAL;
}
+
+ pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+ if (VOS_STATUS_SUCCESS !=
+ WLANTL_ClearInterfaceStats((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
+ pHddStaCtx->conn_info.staId[0], WIFI_STATS_IFACE))
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR, "%s:"
+ "WLANTL_ClearInterfaceStats Failed", __func__);
+ return -EINVAL;
+ }
+
+ pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VO] = 0;
+ pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VI] = 0;
+ pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_BE] = 0;
+ pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_BK] = 0;
+
if (eHAL_STATUS_SUCCESS != sme_LLStatsSetReq( pHddCtx->hHal,
&linkLayerStatsSetReq))
{
@@ -1936,6 +1949,25 @@
&linkLayerStatsClearReq))
{
struct sk_buff *temp_skbuff;
+ hdd_station_ctx_t *pHddStaCtx;
+
+ pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+ if (VOS_STATUS_SUCCESS !=
+ WLANTL_ClearInterfaceStats((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
+ pHddStaCtx->conn_info.staId[0], statsClearReqMask))
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR, "%s:"
+ "WLANTL_ClearInterfaceStats Failed", __func__);
+ return -EINVAL;
+ }
+ if ((statsClearReqMask & WIFI_STATS_IFACE_AC) ||
+ (statsClearReqMask & WIFI_STATS_IFACE)) {
+ pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VO] = 0;
+ pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VI] = 0;
+ pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_BE] = 0;
+ pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_BK] = 0;
+ }
+
temp_skbuff = cfg80211_vendor_cmd_alloc_reply_skb(wiphy,
2 * sizeof(u32) +
NLMSG_HDRLEN);