18abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/*
28abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Copyright (C) 2014 The Android Open Source Project
38abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *
48abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Licensed under the Apache License, Version 2.0 (the "License");
58abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * you may not use this file except in compliance with the License.
68abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * You may obtain a copy of the License at
78abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *
88abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *     http://www.apache.org/licenses/LICENSE-2.0
98abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *
108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Unless required by applicable law or agreed to in writing, software
118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * distributed under the License is distributed on an "AS IS" BASIS,
128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * See the License for the specific language governing permissions and
148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * limitations under the License.
158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */
168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#ifndef __WIFI_HAL_GSCAN_COMMAND_H__
188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#define __WIFI_HAL_GSCAN_COMMAND_H__
198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#include "common.h"
218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#include "cpp_bindings.h"
228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#ifdef __GNUC__
238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b))))
248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#define STRUCT_PACKED __attribute__ ((packed))
258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#else
268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#define PRINTF_FORMAT(a,b)
278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#define STRUCT_PACKED
288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#endif
298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#include "vendor_definitions.h"
308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#include "gscan.h"
318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#ifdef __cplusplus
338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamextern "C"
348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#endif /* __cplusplus */
368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamtypedef struct{
388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    u32 status;
398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    u32 num_channels;
408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_channel channels[];
418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} GScanGetValidChannelsRspParams;
428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamtypedef struct{
448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_gscan_capabilities capabilities;
458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} GScanGetCapabilitiesRspParams;
468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamtypedef struct{
488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    u8  more_data;
49261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam    u32 num_cached_results;
50ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif    u32 cachedResultsStartingIndex; /* Used in filling cached scan results */
51261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam    int lastProcessedScanId; /* Last scan id in gscan cached results block */
52261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam    u32 wifiScanResultsStartingIndex; /* For the lastProcessedScanId */
53261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam    u32 max;                /* max num of cached results specified by caller */
54261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam    wifi_cached_scan_results *cached_results;
558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} GScanGetCachedResultsRspParams;
568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamtypedef struct {
588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int max_channels;
598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_channel *channels;
608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int *number_channels;
618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} GScan_get_valid_channels_cb_data;
628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamtypedef enum{
648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    eGScanRspParamsInvalid = 0,
658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    eGScanGetValidChannelsRspParams,
668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    eGScanGetCapabilitiesRspParams,
678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    eGScanGetCachedResultsRspParams,
688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} eGScanRspRarams;
698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Response and Event Callbacks */
718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamtypedef struct {
728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Various Events Callback */
738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    void (*on_hotlist_ap_found)(wifi_request_id id,
748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        unsigned num_results, wifi_scan_result *results);
75261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam    void (*on_hotlist_ap_lost)(wifi_request_id id,
76261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam        unsigned num_results, wifi_scan_result *results);
778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    void (*on_significant_change)(wifi_request_id id,
788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                unsigned num_results,
798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                wifi_significant_change_result **results);
808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Reported when each probe response is received, if report_events
818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * enabled in wifi_scan_cmd_params
828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     */
830562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik    void (*on_full_scan_result) (wifi_request_id id, wifi_scan_result *result,
840562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik                                                   unsigned buckets_scanned);
858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Optional event - indicates progress of scanning statemachine */
860562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik    void (*on_scan_event) (wifi_request_id id, wifi_scan_event event);
87261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam    void (*on_hotlist_ssid_found)(wifi_request_id id,
88261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam            unsigned num_results, wifi_scan_result *results);
89261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam    void (*on_hotlist_ssid_lost)(wifi_request_id id,
904af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            unsigned num_results, wifi_scan_result *results);
91e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam    void (*on_pno_network_found)(wifi_request_id id,
92e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam            unsigned num_results, wifi_scan_result *results);
93e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam    void (*on_passpoint_network_found)(wifi_request_id id,
94c31ec43dd246e3322b7248351eef561bb756e495Amarnath Hullur Subramanyam                                       int net_id,
95c31ec43dd246e3322b7248351eef561bb756e495Amarnath Hullur Subramanyam                                       wifi_scan_result *result,
96c31ec43dd246e3322b7248351eef561bb756e495Amarnath Hullur Subramanyam                                       int anqp_len,
97c31ec43dd246e3322b7248351eef561bb756e495Amarnath Hullur Subramanyam                                       byte *anqp
98c31ec43dd246e3322b7248351eef561bb756e495Amarnath Hullur Subramanyam                                       );
998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} GScanCallbackHandler;
1008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
1018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamclass GScanCommand: public WifiVendorCommand
1028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
1038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamprivate:
1048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanGetCapabilitiesRspParams       *mGetCapabilitiesRspParams;
1058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanGetCachedResultsRspParams      *mGetCachedResultsRspParams;
1068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCallbackHandler                mHandler;
1078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int                                 mRequestId;
1088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int                                 *mChannels;
1098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int                                 mMaxChannels;
1108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int                                 *mNumChannelsPtr;
1118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
1128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyampublic:
1138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCommand(wifi_handle handle, int id, u32 vendor_id, u32 subcmd);
1148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    virtual ~GScanCommand();
1158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
1168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* This function implements creation of GSCAN specific Request
1178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * based on  the request type.
1188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     */
1198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    virtual int create();
1208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    virtual int requestResponse();
1218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    virtual int handleResponse(WifiEvent &reply);
1228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    virtual void setMaxChannels(int max_channels);
1238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    virtual void setChannels(int *channels);
1248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    virtual void setNumChannelsPtr(int *num_channels);
1258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    virtual int allocRspParams(eGScanRspRarams cmd);
1268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    virtual void freeRspParams(eGScanRspRarams cmd);
1270eb820e5aa5689413367985d056e8f66d08ca30bSubhani Shaik    virtual wifi_error getGetCapabilitiesRspParams(
128ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif                    wifi_gscan_capabilities *capabilities);
129ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif    virtual wifi_error copyCachedScanResults(int *numResults,
130261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam                                             wifi_cached_scan_results *cached_results);
131ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif    virtual int gscan_get_cached_results(wifi_cached_scan_results *results,
1324af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                                         struct nlattr **tb_vendor);
133f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch    wifi_error validateGscanConfig(wifi_scan_cmd_params params);
134f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch    wifi_error validateSignificantChangeParams(
135f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch            wifi_significant_change_params params);
136261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam    virtual int allocCachedResultsTemp(int max,
137261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam                                       wifi_cached_scan_results *results);
138ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif    virtual int gscan_parse_capabilities(struct nlattr **tbVendor);
1398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam};
1408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
141f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define GSCAN_BASE_PERIOD_MIN 1
142f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define GSCAN_MAX_AP_PER_SCAN_MIN 1
143f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define GSCAN_REPORT_THRESHOLD_MIN 1
144f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define GSCAN_NUM_BUCKETS_MIN 1
145f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define GSCAN_BUCKET_INDEX_MIN 0
146f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define GSCAN_REPORT_EVENT0 0
147f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define GSCAN_REPORT_EVENT1 1
148f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define GSCAN_REPORT_EVENT2 2
149f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define GSCAN_MIN_CHANNELS 0
150f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define GSCAN_ACTIVE_SCAN 0
151f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define GSCAN_PASSIVE_SCAN 1
152f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch
153f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define BSSID_HOTLIST_NUM_AP_MIN 1
154f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch
155f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define RSSI_SAMPLE_SIZE_MIN 1
156f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define LOSTAP_SAMPLE_SIZE_MIN 1
157f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define MIN_BREACHING_MIN 1
158f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#define SIGNIFICANT_CHANGE_NUM_AP_MIN 1
159f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch
1608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#ifdef __cplusplus
1618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#endif /* __cplusplus */
1638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#endif
164