Browse Source

qcacld-3.0: Add new API to get connected sta rssi and data rate

Add new API for SON to get connected sta rssi and data rate.

Change-Id: Icd8ed9b6e4462b4898b32d28d9fa3f4e2fbc230d
CRs-Fixed: 3180267
Bing Sun 2 years ago
parent
commit
4397d7dc97
3 changed files with 62 additions and 1 deletions
  1. 36 1
      core/hdd/src/wlan_hdd_son.c
  2. 15 0
      os_if/son/inc/os_if_son.h
  3. 11 0
      os_if/son/src/os_if_son.c

+ 36 - 1
core/hdd/src/wlan_hdd_son.c

@@ -32,7 +32,7 @@
 #include <wlan_hdd_son.h>
 #include <wlan_hdd_object_manager.h>
 #include <wlan_hdd_stats.h>
-
+#include "wlan_cfg80211_mc_cp_stats.h"
 
 /**
  * hdd_son_is_acs_in_progress() - whether acs is in progress or not
@@ -2407,6 +2407,40 @@ uint32_t hdd_son_get_peer_max_mcs_idx(struct wlan_objmgr_vdev *vdev,
 	return ret;
 }
 
+/**
+ * hdd_son_sta_stats() - get connected sta rssi and estimated data rate
+ * @vdev: pointer to vdev
+ * @mac_addr: connected sta mac addr
+ * @stats: pointer to ieee80211_nodestats
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+static int hdd_son_get_sta_stats(struct wlan_objmgr_vdev *vdev,
+				 uint8_t *mac_addr,
+				 struct ieee80211_nodestats *stats)
+{
+	struct stats_event *stats_info;
+	int ret = 0;
+
+	stats_info = wlan_cfg80211_mc_cp_stats_get_peer_rssi(
+			vdev, mac_addr, &ret);
+	if (ret || !stats_info) {
+		hdd_err("get peer rssi fail");
+		wlan_cfg80211_mc_cp_stats_free_stats_event(stats_info);
+		return ret;
+	}
+	stats->ns_rssi = stats_info->peer_stats[0].peer_rssi;
+	stats->ns_last_tx_rate = stats_info->peer_stats[0].tx_rate;
+	stats->ns_last_rx_rate = stats_info->peer_stats[0].rx_rate;
+	hdd_debug("sta " QDF_MAC_ADDR_FMT " rssi %d tx %u kbps, rx %u kbps",
+		  QDF_MAC_ADDR_REF(mac_addr), stats->ns_rssi,
+		  stats->ns_last_tx_rate,
+		  stats->ns_last_rx_rate);
+	wlan_cfg80211_mc_cp_stats_free_stats_event(stats_info);
+
+	return ret;
+}
+
 void hdd_son_register_callbacks(struct hdd_context *hdd_ctx)
 {
 	struct son_callbacks cb_obj = {0};
@@ -2445,6 +2479,7 @@ void hdd_son_register_callbacks(struct hdd_context *hdd_ctx)
 	cb_obj.os_if_get_node_info = hdd_son_get_node_info;
 	cb_obj.os_if_get_peer_capability = hdd_son_get_peer_capability;
 	cb_obj.os_if_get_peer_max_mcs_idx = hdd_son_get_peer_max_mcs_idx;
+	cb_obj.os_if_get_sta_stats = hdd_son_get_sta_stats;
 
 	os_if_son_register_hdd_callbacks(hdd_ctx->psoc, &cb_obj);
 

+ 15 - 0
os_if/son/inc/os_if_son.h

@@ -69,6 +69,7 @@
  * @os_if_get_node_info: Gets the datarate info for node
  * @os_if_get_peer_capability: Gets peer capability
  * @os_if_get_peer_max_mcs_idx: Gets peer max MCS index
+ * @os_if_get_sta_stats: Get sta stats
  */
 struct son_callbacks {
 	uint32_t (*os_if_is_acs_in_progress)(struct wlan_objmgr_vdev *vdev);
@@ -136,6 +137,9 @@ struct son_callbacks {
 						wlan_peer_cap *cap);
 	uint32_t (*os_if_get_peer_max_mcs_idx)(struct wlan_objmgr_vdev *vdev,
 					       struct wlan_objmgr_peer *peer);
+	int (*os_if_get_sta_stats)(struct wlan_objmgr_vdev *vdev,
+				   uint8_t *mac_addr,
+				   struct ieee80211_nodestats *stats);
 };
 
 /**
@@ -777,4 +781,15 @@ QDF_STATUS os_if_son_get_node_datarate_info(struct wlan_objmgr_vdev *vdev,
  */
 uint32_t os_if_son_get_peer_max_mcs_idx(struct wlan_objmgr_vdev *vdev,
 					struct wlan_objmgr_peer *peer);
+
+/**
+ * os_if_son_get_sta_stats() - get connected sta rssi and estimated data rate
+ * @vdev: pointer to vdev
+ * @mac_addr: connected sta mac addr
+ * @stats: pointer to ieee80211_nodestats
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+int os_if_son_get_sta_stats(struct wlan_objmgr_vdev *vdev, uint8_t *mac_addr,
+			    struct ieee80211_nodestats *stats);
 #endif

+ 11 - 0
os_if/son/src/os_if_son.c

@@ -1791,3 +1791,14 @@ uint32_t os_if_son_get_peer_max_mcs_idx(struct wlan_objmgr_vdev *vdev,
 
 	return 0;
 }
+
+int os_if_son_get_sta_stats(struct wlan_objmgr_vdev *vdev, uint8_t *mac_addr,
+			    struct ieee80211_nodestats *stats)
+{
+	if (g_son_os_if_cb.os_if_get_sta_stats)
+		return g_son_os_if_cb.os_if_get_sta_stats(vdev, mac_addr,
+							  stats);
+
+	return 0;
+}
+qdf_export_symbol(os_if_son_get_sta_stats);