Wifi-HAL: Add GSCAN CAPABILITIES event

Add support for GSCAN CAPABILITIES event
as part of the Debug Framework.

Change-Id: I8c90e56637171a9719f97dc112042037a600e79e
diff --git a/qcwcn/wifi_hal/wifilogger_diag.cpp b/qcwcn/wifi_hal/wifilogger_diag.cpp
index 5e11271..d021541 100644
--- a/qcwcn/wifi_hal/wifilogger_diag.cpp
+++ b/qcwcn/wifi_hal/wifilogger_diag.cpp
@@ -107,6 +107,106 @@
     return WIFI_SUCCESS;
 }
 
+#define SCAN_CAP_ENTRY_SIZE 1024
+static wifi_error process_log_extscan_capabilities(hal_info *info,
+                                                   u8* buf, int length)
+{
+    wifi_ring_buffer_driver_connectivity_event *pConnectEvent;
+    wifi_ring_buffer_entry *pRingBufferEntry;
+    wlan_ext_scan_capabilities_payload_type *pScanCapabilities;
+    wifi_gscan_capabilities gscan_cap;
+    gscan_capabilities_vendor_data_t cap_vendor_data;
+    tlv_log *pTlv;
+    int tot_len = sizeof(wifi_ring_buffer_driver_connectivity_event);
+    u8 out_buf[SCAN_CAP_ENTRY_SIZE];
+    wifi_error status;
+
+    pRingBufferEntry = (wifi_ring_buffer_entry *)&out_buf[0];
+    memset(pRingBufferEntry, 0, SCAN_CAP_ENTRY_SIZE);
+    pConnectEvent = (wifi_ring_buffer_driver_connectivity_event *)
+                     (pRingBufferEntry + 1);
+
+    pConnectEvent->event = WIFI_EVENT_G_SCAN_CAPABILITIES;
+    pTlv = &pConnectEvent->tlvs[0];
+
+    pScanCapabilities = (wlan_ext_scan_capabilities_payload_type *)buf;
+    pTlv = addLoggerTlv(WIFI_TAG_REQUEST_ID,
+                        sizeof(pScanCapabilities->request_id),
+                        (u8 *)&pScanCapabilities->request_id, pTlv);
+    tot_len += sizeof(tlv_log) + sizeof(pScanCapabilities->request_id);
+
+    gscan_cap.max_scan_cache_size =
+        pScanCapabilities->extscan_cache_capabilities.scan_cache_entry_size;
+    gscan_cap.max_scan_buckets =
+        pScanCapabilities->extscan_cache_capabilities.max_buckets;
+    gscan_cap.max_ap_cache_per_scan =
+        pScanCapabilities->extscan_cache_capabilities.max_bssid_per_scan;
+    gscan_cap.max_rssi_sample_size = FEATURE_NOT_SUPPORTED;
+    gscan_cap.max_scan_reporting_threshold =
+        pScanCapabilities->extscan_cache_capabilities.max_table_usage_threshold;
+    gscan_cap.max_hotlist_bssids =
+        pScanCapabilities->extscan_hotlist_monitor_capabilities.max_hotlist_entries;
+    gscan_cap.max_hotlist_ssids =
+        pScanCapabilities->extscan_capabilities.num_extscan_hotlist_ssid;
+    gscan_cap.max_significant_wifi_change_aps = FEATURE_NOT_SUPPORTED;
+    gscan_cap.max_bssid_history_entries = FEATURE_NOT_SUPPORTED;
+    gscan_cap.max_number_epno_networks =
+        pScanCapabilities->extscan_capabilities.num_epno_networks;
+    gscan_cap.max_number_epno_networks_by_ssid =
+        pScanCapabilities->extscan_capabilities.num_epno_networks;
+    gscan_cap.max_number_of_white_listed_ssid =
+        pScanCapabilities->extscan_capabilities.num_roam_ssid_whitelist;
+
+    pTlv = addLoggerTlv(WIFI_TAG_GSCAN_CAPABILITIES,
+                        sizeof(wifi_gscan_capabilities),
+                        (u8 *)&gscan_cap, pTlv);
+    tot_len += sizeof(tlv_log) + sizeof(wifi_gscan_capabilities);
+
+    cap_vendor_data.hotlist_mon_table_id =
+        pScanCapabilities->extscan_hotlist_monitor_capabilities.table_id;
+    cap_vendor_data.wlan_hotlist_entry_size =
+        pScanCapabilities->extscan_hotlist_monitor_capabilities.wlan_hotlist_entry_size;
+    cap_vendor_data.cache_cap_table_id =
+        pScanCapabilities->extscan_cache_capabilities.table_id;
+    cap_vendor_data.requestor_id =
+        pScanCapabilities->extscan_capabilities.requestor_id;
+    cap_vendor_data.vdev_id =
+        pScanCapabilities->extscan_capabilities.vdev_id;
+    cap_vendor_data.num_extscan_cache_tables =
+        pScanCapabilities->extscan_capabilities.num_extscan_cache_tables;
+    cap_vendor_data.num_wlan_change_monitor_tables =
+        pScanCapabilities->extscan_capabilities.num_wlan_change_monitor_tables;
+    cap_vendor_data.num_hotlist_monitor_tables =
+        pScanCapabilities->extscan_capabilities.num_hotlist_monitor_tables;
+    cap_vendor_data.rtt_one_sided_supported =
+        pScanCapabilities->extscan_capabilities.rtt_one_sided_supported;
+    cap_vendor_data.rtt_11v_supported =
+        pScanCapabilities->extscan_capabilities.rtt_11v_supported;
+    cap_vendor_data.rtt_ftm_supported =
+        pScanCapabilities->extscan_capabilities.rtt_ftm_supported;
+    cap_vendor_data.num_extscan_cache_capabilities =
+        pScanCapabilities->extscan_capabilities.num_extscan_cache_capabilities;
+    cap_vendor_data.num_extscan_wlan_change_capabilities =
+        pScanCapabilities->extscan_capabilities.num_extscan_wlan_change_capabilities;
+    cap_vendor_data.num_extscan_hotlist_capabilities =
+        pScanCapabilities->extscan_capabilities.num_extscan_hotlist_capabilities;
+    cap_vendor_data.num_roam_bssid_blacklist =
+        pScanCapabilities->extscan_capabilities.num_roam_bssid_blacklist;
+    cap_vendor_data.num_roam_bssid_preferred_list =
+        pScanCapabilities->extscan_capabilities.num_roam_bssid_preferred_list;
+
+    pTlv = addLoggerTlv(WIFI_TAG_VENDOR_SPECIFIC,
+                        sizeof(gscan_capabilities_vendor_data_t),
+                        (u8 *)&cap_vendor_data, pTlv);
+    tot_len += sizeof(tlv_log) + sizeof(gscan_capabilities_vendor_data_t);
+
+    status = update_connectivity_ring_buf(info, pRingBufferEntry, tot_len);
+    if (status != WIFI_SUCCESS) {
+        ALOGE("Failed to write ext scan capabilities event into ring buffer");
+    }
+    return status;
+}
+
 static wifi_error process_bt_coex_scan_event(hal_info *info,
                                              u32 id, u8* buf, int length)
 {
@@ -781,6 +881,22 @@
             break;
             case WLAN_DIAG_TYPE_LOG:
             {
+                id = diag_msg_hdr->diag_id;
+                payloadlen = diag_msg_hdr->u.payload_len;
+
+                switch (id) {
+                case LOG_WLAN_EXTSCAN_CAPABILITIES:
+                    status = process_log_extscan_capabilities(info,
+                                                    diag_msg_hdr->payload,
+                                                    payloadlen);
+                    if (status != WIFI_SUCCESS) {
+                        ALOGE("Failed to process extscan capabilities");
+                        return status;
+                    }
+                    break;
+                default:
+                    return WIFI_SUCCESS;
+                }
             }
             break;
             case WLAN_DIAG_TYPE_MSG:
diff --git a/qcwcn/wifi_hal/wifilogger_diag.h b/qcwcn/wifi_hal/wifilogger_diag.h
index 6bba3db..38bbde9 100644
--- a/qcwcn/wifi_hal/wifilogger_diag.h
+++ b/qcwcn/wifi_hal/wifilogger_diag.h
@@ -45,6 +45,7 @@
 #define ANI_NL_MSG_LOG_HOST_PRINT_TYPE 89
 
 #define WLAN_PKT_LOG_STATS            0x18E0
+#define FEATURE_NOT_SUPPORTED         0xFF
 
 /*
  *  - verbose_level 0 corresponds to no collection
diff --git a/qcwcn/wifi_hal/wifilogger_event_defs.h b/qcwcn/wifi_hal/wifilogger_event_defs.h
index a02fdad..baf9bee 100644
--- a/qcwcn/wifi_hal/wifilogger_event_defs.h
+++ b/qcwcn/wifi_hal/wifilogger_event_defs.h
@@ -324,7 +324,7 @@
     u16 Tsco;
     u8 Rsco;
 } __attribute__((packed)) wlan_bt_coex_bt_sco_stop_payload_type;
-/*End EVENT_WLAN_BT_COEX_BT_SCO_STOP*/
+/* End EVENT_WLAN_BT_COEX_BT_SCO_STOP */
 
 /* EVENT_WLAN_BT_COEX_BT_SCAN_START */
 typedef struct {
@@ -332,16 +332,16 @@
     u8 scan_bitmap;
 } __attribute__((packed)) wlan_bt_coex_bt_scan_start_payload_type;
 
-/*End EVENT_WLAN_BT_COEX_BT_SCAN_START*/
+/* End EVENT_WLAN_BT_COEX_BT_SCAN_START */
 
 /* EVENT_WLAN_BT_COEX_BT_SCAN_STOP */
 typedef struct {
     u8 scan_type;
     u8 scan_bitmap;
 } __attribute__((packed)) wlan_bt_coex_bt_scan_stop_payload_type;
-/*End EVENT_WLAN_BT_COEX_BT_SCAN_STOP*/
+/* End EVENT_WLAN_BT_COEX_BT_SCAN_STOP */
 
-/*EVENT_WIFI_BT_COEX_BT_HID_START */
+/* EVENT_WIFI_BT_COEX_BT_HID_START */
 typedef struct {
     u8 link_id;
     u8 link_state;
@@ -349,7 +349,7 @@
     u8 Tsniff;
     u8 attempts;
 } __attribute__((packed)) wlan_bt_coex_bt_hid_start_payload_type;
-/*End EVENT_WIFI_BT_COEX_BT_HID_START */
+/* End EVENT_WIFI_BT_COEX_BT_HID_START */
 
 /* EVENT_WIFI_BT_COEX_BT_HID_STOP */
 typedef struct {
@@ -378,7 +378,7 @@
 } __attribute__((packed)) wlan_ext_scan_results_available_payload_type;
 /* End EVENT_WLAN_EXTSCAN_RESULTS_AVAILABLE */
 
-/* EVENT_WLAN_EXTSCAN_CAPABILITIES */
+/* Log LOG_WLAN_EXTSCAN_CAPABILITIES */
 typedef struct {
     u32 header;
     u32 request_id;
@@ -423,7 +423,7 @@
     wlan_extscan_cache_capabilities extscan_cache_capabilities;
     wlan_extscan_hotlist_monitor_capabilities extscan_hotlist_monitor_capabilities;
 } __attribute__((packed)) wlan_ext_scan_capabilities_payload_type;
-/* End EVENT_WLAN_EXTSCAN_CAPABILITIES*/
+/* End LOG_WLAN_EXTSCAN_CAPABILITIES */
 
 /* EVENT_WLAN_BEACON_RECEIVED */
 typedef struct {
diff --git a/qcwcn/wifi_hal/wifilogger_vendor_tag_defs.h b/qcwcn/wifi_hal/wifilogger_vendor_tag_defs.h
index 8b8aadf..148e3d5 100644
--- a/qcwcn/wifi_hal/wifilogger_vendor_tag_defs.h
+++ b/qcwcn/wifi_hal/wifilogger_vendor_tag_defs.h
@@ -108,4 +108,23 @@
     u8 fInitiator;
 } __attribute__((packed)) addba_failed_vendor_data_t;
 
+typedef struct {
+    u32 hotlist_mon_table_id;
+    u32 wlan_hotlist_entry_size;
+    u32 cache_cap_table_id;
+    u32 max_scan_cache_entries;
+    u32 requestor_id;
+    u32 vdev_id;
+    u32 num_extscan_cache_tables;
+    u32 num_wlan_change_monitor_tables;
+    u32 num_hotlist_monitor_tables;
+    u32 rtt_one_sided_supported;
+    u32 rtt_11v_supported;
+    u32 rtt_ftm_supported;
+    u32 num_extscan_cache_capabilities;
+    u32 num_extscan_wlan_change_capabilities;
+    u32 num_extscan_hotlist_capabilities;
+    u32 num_roam_bssid_blacklist;
+    u32 num_roam_bssid_preferred_list;
+} __attribute__((packed)) gscan_capabilities_vendor_data_t;
 #endif /* __WIFI_HAL_WIFILOGGER_VENDOR_EVENTS_H__ */