gscan.h revision b80d32d2a1ba28f2b5dda7315e136a9ea14eda26
1b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
2b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde#include "wifi_hal.h"
3b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
4b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde#ifndef __WIFI_HAL_GSCAN_H__
5b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde#define __WIFI_HAL_GSCAN_H__
6b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
7b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde/* AP Scans */
8b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
9b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndetypedef enum {
10b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    WIFI_BAND_UNSPECIFIED,
11b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    WIFI_BAND_BG,                       // 2.4 GHz
12b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    WIFI_BAND_A,                        // 5 GHz without DFS
13b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    WIFI_BAND_A_WITH_DFS,               // 5 GHz with DFS
14b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    WIFI_BAND_ABG,                      // 2.4 GHz + 5 GHz; no DFS
15b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    WIFI_BAND_ABG_WITH_DFS,             // 2.4 GHz + 5 GHz with DFS
16b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde} wifi_band;
17b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
18b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndewifi_error wifi_get_valid_channels(wifi_interface_handle handle,
19b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde        int band, int size, wifi_channel *channels, int *num);
20b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
21b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndetypedef struct {
22b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int max_scan_cache_size;                 // in number of scan results??
23b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int max_scan_buckets;
24b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int max_ap_cache_per_scan;
25b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int max_rssi_sample_size;
26b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int max_scan_reporting_threshold;        // in number of scan results??
27b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int max_hotlist_aps;
28b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int max_significant_wifi_change_aps;
29b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde} wifi_gscan_capabilities;
30b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
31b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndewifi_error wifi_get_gscan_capabilities(wifi_interface_handle handle,
32b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde        wifi_gscan_capabilities *capabilities);
33b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
34b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndetypedef struct {
35b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    wifi_timestamp ts;                  // Time of discovery
36b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    char ssid[32+1];                    // null terminated
37b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    mac_addr bssid;
38b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    wifi_channel channel;               // channel frequency in MHz
39b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    wifi_rssi rssi;                     // in db
40b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    wifi_timespan rtt;                  // in nanoseconds
41b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    wifi_timespan rtt_sd;               // standard deviation in rtt
42b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
43b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    // other fields
44b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde} wifi_scan_result;
45b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
46b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndetypedef struct {
47b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    void (*on_scan_results_available) (wifi_request_id id, unsigned num_results_available);
48b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde} wifi_scan_result_handler;
49b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
50b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndetypedef struct {
51b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    wifi_channel channel;               // frequency
52b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int dwellTimeMs;                    // dwell time hint
53b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int passive;                        // 0 => active, 1 => passive scan; ignored for DFS
54b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    /* Add channel class */
55b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde} wifi_scan_channel_spec;
56b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
57b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndetypedef struct {
58b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int bucket;                         // bucket index, 0 based
59b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    wifi_band band;                     // when UNSPECIFIED, use channel list
60b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int period;                         // desired period, in millisecond; if this is too
61b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde                                        // low, the firmware should choose to generate results as
62b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde                                        // fast as it can instead of failing the command
63b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    byte report_events;                 // 1 => report events after each scan
64b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int num_channels;
65b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    wifi_scan_channel_spec channels[8]; // channels to scan; these may include DFS channels
66b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde} wifi_scan_bucket_spec;
67b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
68b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndetypedef struct {
69b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int base_period;                    // base timer period in ms
70b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int max_ap_per_scan;
71b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int report_threshold;               // in %, when buffer is this much full, wake up AP
72b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int num_buckets;                    // maximum 8
73b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    wifi_scan_bucket_spec buckets[8];
74b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde} wifi_scan_cmd_params;
75b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
76b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndewifi_error wifi_start_gscan(wifi_request_id id, wifi_interface_handle iface,
77b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde        wifi_scan_cmd_params params, wifi_scan_result_handler handler);
78b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndewifi_error wifi_stop_gscan(wifi_request_id id, wifi_interface_handle iface);
79b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
80b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndewifi_error wifi_get_cached_gscan_results(wifi_interface_handle iface, byte flush,
81b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde        wifi_scan_result *results, int *num);
82b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
83b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
84b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde/* BSSID Hotlist */
85b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndetypedef struct {
86b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    void (*on_hotlist_ap_found)(wifi_request_id id,
87b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde            unsigned num_results, wifi_scan_result *results);
88b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde} wifi_hotlist_ap_found_handler;
89b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
90b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndetypedef struct {
91b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    mac_addr  bssid;                    // AP BSSID
92b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    wifi_rssi low;                      // low threshold
93b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    wifi_rssi high;                     // high threshold
94b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde} ap_threshold_param;
95b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
96b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndetypedef struct {
97b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int num;                            // max??
98b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    ap_threshold_param bssids[64];
99b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde} wifi_bssid_hotlist_params;
100b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
101b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndewifi_error wifi_set_bssid_hotlist(wifi_request_id id, wifi_interface_handle iface,
102b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde        wifi_bssid_hotlist_params params, wifi_hotlist_ap_found_handler handler);
103b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndewifi_error wifi_reset_bssid_hotlist(wifi_request_id id, wifi_interface_handle iface);
104b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
105b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde/* Significant wifi change*/
106b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
107b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndetypedef struct {
108b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    void (*on_significant_change)(wifi_request_id id,
109b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde            unsigned num_results, wifi_scan_result *results);
110b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde} wifi_significant_change_handler;
111b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
112b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndetypedef struct {
113b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int rssi_sample_size;               // number of samples for averaging RSSI
114b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int lost_ap_sample_size;            // number of samples to confirm AP loss
115b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int min_breaching;                  // number of APs breaching threshold
116b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    int num;                            // max 64
117b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde    ap_threshold_param bssids[64];
118b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde} wifi_significant_change_params;
119b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
120b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndewifi_error wifi_set_significant_change_handler(wifi_request_id id, wifi_interface_handle iface,
121b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde        wifi_significant_change_params params, wifi_significant_change_handler handler);
122b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapndewifi_error wifi_reset_significant_change_handler(wifi_request_id id, wifi_interface_handle iface);
123b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
124b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde#endif
125b80d32d2a1ba28f2b5dda7315e136a9ea14eda26Vinit Deshapnde
126