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