wlan: Add aggregate stats support for SAP
propagation from qcacld-3.0 to prima.
The cfg80211 get_station callback is not intended for use with
non-station device types. However, it is useful to expose aggregate
statistics for non-station type devices. Add support for returning
aggregate statistics when get_station is used with a soft access point
device.
Change-Id: I8ae32c307f241525a7d74467328d9d40dc805053
CRs-Fixed: 2077011
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 186c975..fe251da 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -16679,6 +16679,63 @@
return ret;
}
+/*
+ * wlan_hdd_fill_summary_stats() - populate station_info summary stats
+ * @stats: summary stats to use as a source
+ * @info: kernel station_info struct to use as a destination
+ *
+ * Return: None
+ */
+static void wlan_hdd_fill_summary_stats(tCsrSummaryStatsInfo *stats,
+ struct station_info *info)
+{
+ int i;
+
+ info->rx_packets = stats->rx_frm_cnt;
+ info->tx_packets = 0;
+ info->tx_retries = 0;
+ info->tx_failed = 0;
+
+ for (i = 0; i < 4; ++i) {
+ info->tx_packets += stats->tx_frm_cnt[i];
+ info->tx_retries += stats->multiple_retry_cnt[i];
+ info->tx_failed += stats->fail_cnt[i];
+ }
+
+ info->filled |= STATION_INFO_TX_PACKETS |
+ STATION_INFO_TX_RETRIES |
+ STATION_INFO_TX_FAILED |
+ STATION_INFO_RX_PACKETS;
+}
+
+/**
+ * wlan_hdd_get_sap_stats() - get aggregate SAP stats
+ * @adapter: sap adapter to get stats for
+ * @info: kernel station_info struct to populate
+ *
+ * Fetch the vdev-level aggregate stats for the given SAP adapter. This is to
+ * support "station dump" and "station get" for SAP vdevs, even though they
+ * aren't technically stations.
+ *
+ * Return: errno
+ */
+static int
+wlan_hdd_get_sap_stats(hdd_adapter_t *adapter, struct station_info *info)
+{
+ VOS_STATUS status;
+
+ status = wlan_hdd_get_station_stats(adapter);
+ if (!VOS_IS_STATUS_SUCCESS(status)) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "Failed to get SAP stats; status:%d", status);
+ return 0;
+ }
+
+ wlan_hdd_fill_summary_stats(&adapter->hdd_stats.summary_stat, info);
+
+ return 0;
+}
+
static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
const u8* mac,
@@ -16719,6 +16776,15 @@
ENTER();
+ status = wlan_hdd_validate_context(pHddCtx);
+ if (0 != status)
+ {
+ return status;
+ }
+
+ if (pAdapter->device_mode == WLAN_HDD_SOFTAP)
+ return wlan_hdd_get_sap_stats(pAdapter, sinfo);
+
if ((eConnectionState_Associated != pHddStaCtx->conn_info.connState) ||
(0 == ssidlen))
{
@@ -16737,12 +16803,6 @@
return 0;
}
- status = wlan_hdd_validate_context(pHddCtx);
- if (0 != status)
- {
- return status;
- }
-
wlan_hdd_get_station_stats(pAdapter);
rate_flags = pAdapter->hdd_stats.ClassA_stat.tx_rate_flags;