wlan: A method by which metrics related to roaming can be reported
This change will help in reporting three main steps in 11r/Legacy roaming
mechanism. These steps are pre-authentication initiation, pre-authentication
completion and reassociation.
Change-Id: Ibeadd5aaed9e87be5731a28f099153145b674f81
CRs-fixed: 458524
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 3abd444..73db6ad 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -4332,6 +4332,121 @@
}
#endif //FEATURE_WLAN_LFR
+#ifdef FEATURE_WLAN_LFR_METRICS
+/*
+ * FUNCTION: wlan_hdd_cfg80211_roam_metrics_preauth
+ * 802.11r/LFR metrics reporting function to report preauth initiation
+ *
+ */
+#define MAX_LFR_METRICS_EVENT_LENGTH 100
+VOS_STATUS wlan_hdd_cfg80211_roam_metrics_preauth(hdd_adapter_t *pAdapter,
+ tCsrRoamInfo *pRoamInfo)
+{
+ unsigned char metrics_notification[MAX_LFR_METRICS_EVENT_LENGTH + 1];
+ union iwreq_data wrqu;
+
+ ENTER();
+
+ if (NULL == pAdapter)
+ {
+ hddLog(LOGE, "%s: pAdapter is NULL!", __func__);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ /* create the event */
+ memset(&wrqu, 0, sizeof(wrqu));
+ memset(metrics_notification, 0, sizeof(metrics_notification));
+
+ wrqu.data.pointer = metrics_notification;
+ wrqu.data.length = scnprintf(metrics_notification,
+ sizeof(metrics_notification), "QCOM: LFR_PREAUTH_INIT "
+ MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pRoamInfo->bssid));
+
+ wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, metrics_notification);
+
+ EXIT();
+
+ return VOS_STATUS_SUCCESS;
+}
+
+/*
+ * FUNCTION: wlan_hdd_cfg80211_roam_metrics_preauth_status
+ * 802.11r/LFR metrics reporting function to report preauth completion
+ * or failure
+ */
+VOS_STATUS wlan_hdd_cfg80211_roam_metrics_preauth_status(
+ hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo, bool preauth_status)
+{
+ unsigned char metrics_notification[MAX_LFR_METRICS_EVENT_LENGTH + 1];
+ union iwreq_data wrqu;
+
+ ENTER();
+
+ if (NULL == pAdapter)
+ {
+ hddLog(LOGE, "%s: pAdapter is NULL!", __func__);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ /* create the event */
+ memset(&wrqu, 0, sizeof(wrqu));
+ memset(metrics_notification, 0, sizeof(metrics_notification));
+
+ scnprintf(metrics_notification, sizeof(metrics_notification),
+ "QCOM: LFR_PREAUTH_STATUS "MAC_ADDRESS_STR,
+ MAC_ADDR_ARRAY(pRoamInfo->bssid));
+
+ if (1 == preauth_status)
+ strncat(metrics_notification, " TRUE", 5);
+ else
+ strncat(metrics_notification, " FALSE", 6);
+
+ wrqu.data.pointer = metrics_notification;
+ wrqu.data.length = strlen(metrics_notification);
+
+ wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, metrics_notification);
+
+ EXIT();
+
+ return VOS_STATUS_SUCCESS;
+}
+
+/*
+ * FUNCTION: wlan_hdd_cfg80211_roam_metrics_handover
+ * 802.11r/LFR metrics reporting function to report handover initiation
+ *
+ */
+VOS_STATUS wlan_hdd_cfg80211_roam_metrics_handover(hdd_adapter_t * pAdapter,
+ tCsrRoamInfo *pRoamInfo)
+{
+ unsigned char metrics_notification[MAX_LFR_METRICS_EVENT_LENGTH + 1];
+ union iwreq_data wrqu;
+
+ ENTER();
+
+ if (NULL == pAdapter)
+ {
+ hddLog(LOGE, "%s: pAdapter is NULL!", __func__);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ /* create the event */
+ memset(&wrqu, 0, sizeof(wrqu));
+ memset(metrics_notification, 0, sizeof(metrics_notification));
+
+ wrqu.data.pointer = metrics_notification;
+ wrqu.data.length = scnprintf(metrics_notification,
+ sizeof(metrics_notification), "QCOM: LFR_PREAUTH_HANDOVER "
+ MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pRoamInfo->bssid));
+
+ wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, metrics_notification);
+
+ EXIT();
+
+ return VOS_STATUS_SUCCESS;
+}
+#endif
+
/*
* FUNCTION: hdd_cfg80211_scan_done_callback
* scanning callback function, called after finishing scan
@@ -4365,7 +4480,7 @@
goto allow_suspend;
}
- if(pScanInfo->mScanPending != VOS_TRUE)
+ if (pScanInfo->mScanPending != VOS_TRUE)
{
VOS_ASSERT(pScanInfo->mScanPending);
goto allow_suspend;