wlan: Link Layer Stats, implementation of interface Tx/Rx statistics

LLstats Implementation for Tx/Rx statistics

Change-Id: Id31c228b7e524b05a5509584b5e047c59c02303c
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 0ddc72f..ac89e87 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -823,11 +823,15 @@
     return TRUE;
 }
 
-static v_BOOL_t put_wifi_iface_stats(tpSirWifiIfaceStat pWifiIfaceStat,
+static v_BOOL_t put_wifi_iface_stats(hdd_adapter_t *pAdapter,
+                            tpSirWifiIfaceStat pWifiIfaceStat,
                                  struct sk_buff *vendor_event)
 {
     int i = 0;
     struct nlattr *wmmInfo;
+    hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+    WLANTL_InterfaceStatsType *pWifiIfaceStatTL = NULL;
+
     if (FALSE == put_wifi_interface_info(
                                 &pWifiIfaceStat->info,
                                 vendor_event))
@@ -837,6 +841,80 @@
         return FALSE;
 
     }
+    pWifiIfaceStatTL = (WLANTL_InterfaceStatsType *)
+                             vos_mem_malloc(sizeof(WLANTL_InterfaceStatsType));
+    if (NULL == pWifiIfaceStatTL)
+    {
+        hddLog(VOS_TRACE_LEVEL_ERROR, FL("vos_mem_malloc failed"));
+        return FALSE;
+    }
+
+
+    if ( pWifiIfaceStat->info.state == WIFI_ASSOCIATED)
+    {
+        if (VOS_STATUS_SUCCESS ==
+         WLANTL_CollectInterfaceStats((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
+                    pHddStaCtx->conn_info.staId[0], pWifiIfaceStatTL))
+        {
+            /* mgmtRx, MgmtActionRx, rxMcast, rxMpdu, rxAmpdu, rssiData are
+             * obtained from TL structure
+             */
+
+            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));
+
+            vos_mem_copy(
+                  (void *) &pWifiIfaceStat->AccessclassStats[WIFI_AC_VI],
+                  (void *) &pWifiIfaceStatTL->accessCategoryStats[WLANTL_AC_VI],
+                  sizeof(WLANTL_AccessCategoryStatsType));
+
+            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));
+        }
+        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 =
+            pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VI];
+        pWifiIfaceStat->AccessclassStats[WIFI_AC_BE].txMcast =
+            pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_BE];
+        pWifiIfaceStat->AccessclassStats[WIFI_AC_BK].txMcast =
+            pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_BK];
+    }
+    else
+    {
+        hddLog(VOS_TRACE_LEVEL_INFO, FL("Interface not Associated"));
+    }
+
+
 
     if (nla_put_u32(vendor_event,
                     QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_BEACON_RX,
@@ -850,18 +928,19 @@
         nla_put_u32(vendor_event,
                     QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_MGMT_ACTION_TX,
                     pWifiIfaceStat->mgmtActionTx) ||
-        nla_put_u32(vendor_event,
+        nla_put_s32(vendor_event,
                     QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_RSSI_MGMT,
                     pWifiIfaceStat->rssiMgmt) ||
-        nla_put_u32(vendor_event,
+        nla_put_s32(vendor_event,
                     QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_RSSI_DATA,
                     pWifiIfaceStat->rssiData) ||
-        nla_put_u32(vendor_event,
+        nla_put_s32(vendor_event,
                     QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_RSSI_ACK,
                     pWifiIfaceStat->rssiAck))
     {
         hddLog(VOS_TRACE_LEVEL_ERROR,
                 FL("QCA_WLAN_VENDOR_ATTR put fail"));
+        vos_mem_free(pWifiIfaceStatTL);
         return FALSE;
     }
 
@@ -877,12 +956,14 @@
         {
             hddLog(VOS_TRACE_LEVEL_ERROR,
                     FL("QCA_WLAN_VENDOR_ATTR put Fail"));
+            vos_mem_free(pWifiIfaceStatTL);
             return FALSE;
         }
 
         nla_nest_end(vendor_event, wmmStats);
     }
     nla_nest_end(vendor_event, wmmInfo);
+    vos_mem_free(pWifiIfaceStatTL);
     return TRUE;
 }
 
@@ -1153,6 +1234,25 @@
 
     pWifiIfaceStat = (tpSirWifiIfaceStat) pData;
 
+
+    if (FALSE == hdd_get_interface_info( pAdapter,
+                                        &pWifiIfaceStat->info))
+    {
+        hddLog(VOS_TRACE_LEVEL_ERROR,
+               FL("hdd_get_interface_info get fail") );
+        kfree_skb(vendor_event);
+        return;
+    }
+
+    if (FALSE == put_wifi_iface_stats( pAdapter, pWifiIfaceStat,
+                                       vendor_event))
+    {
+        hddLog(VOS_TRACE_LEVEL_ERROR,
+               FL("put_wifi_iface_stats fail") );
+        kfree_skb(vendor_event);
+        return;
+    }
+
     hddLog(VOS_TRACE_LEVEL_INFO,
            "WMI_LINK_STATS_IFACE Data");
 
@@ -1191,9 +1291,9 @@
            " mgmtRx %u "
            " mgmtActionRx  %u "
            " mgmtActionTx %u "
-           " rssiMgmt %u "
-           " rssiData %u "
-           " rssiAck  %u",
+           " rssiMgmt %d "
+           " rssiData %d "
+           " rssiAck  %d",
            pWifiIfaceStat->beaconRx,
            pWifiIfaceStat->mgmtRx,
            pWifiIfaceStat->mgmtActionRx,
@@ -1243,23 +1343,6 @@
         }
     }
 
-    if (FALSE == hdd_get_interface_info( pAdapter,
-                                        &pWifiIfaceStat->info))
-    {
-        hddLog(VOS_TRACE_LEVEL_ERROR,
-               FL("hdd_get_interface_info get fail") );
-        kfree_skb(vendor_event);
-        return;
-    }
-
-    if (FALSE == put_wifi_iface_stats( pWifiIfaceStat,
-                                       vendor_event))
-    {
-        hddLog(VOS_TRACE_LEVEL_ERROR,
-               FL("put_wifi_iface_stats fail") );
-        kfree_skb(vendor_event);
-        return;
-    }
     cfg80211_vendor_event(vendor_event, GFP_KERNEL);
 }