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 */ 16b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 17b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "sync.h" 18b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define LOG_TAG "WifiHAL" 19b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <utils/Log.h> 208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#include <time.h> 21b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 22b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "common.h" 23b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "cpp_bindings.h" 248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#include "gscancommand.h" 258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#include "gscan_event_handler.h" 26b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#define GSCAN_EVENT_WAIT_TIME_SECONDS 4 28b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Used to handle gscan command events from driver/firmware. */ 308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur SubramanyamGScanCommandEventHandler *GScanStartCmdEventHandler = NULL; 318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur SubramanyamGScanCommandEventHandler *GScanSetBssidHotlistCmdEventHandler = NULL; 328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur SubramanyamGScanCommandEventHandler *GScanSetSignificantChangeCmdEventHandler = NULL; 33b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Implementation of the API functions exposed in gscan.h */ 358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_get_valid_channels(wifi_interface_handle handle, 368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int band, int max_channels, wifi_channel *channels, int *num_channels) 378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int requestId, ret = 0; 398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(handle); 428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(handle); 438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (channels == NULL) { 458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: NULL channels pointer provided. Exit.", 468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__); 478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 49b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* No request id from caller, so generate one and pass it on to the driver. 518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Generate one randomly. 528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam srand( time(NULL) ); 548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId = rand(); 558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId, 598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_VALID_CHANNELS); 618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Error GScanCommand NULL", __func__); 638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_u32( 818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId) || 838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_GET_VALID_CHANNELS_CONFIG_PARAM_WIFI_BAND, 858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam band) || 868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_GET_VALID_CHANNELS_CONFIG_PARAM_MAX_CHANNELS, 888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam max_channels) ) 898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Populate the input received from caller/framework. */ 948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->setMaxChannels(max_channels); 958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->setChannels(channels); 968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->setNumChannelsPtr(num_channels); 978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Send the msg and wait for a response. */ 998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->requestResponse(); 1008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret) { 1018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Error %d happened. ", __func__, ret); 1028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 103b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 1058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("%s: Delete object.", __func__); 1068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 1078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 1088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 109b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid get_gscan_capabilities_cb(int status, wifi_gscan_capabilities capa) 1118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 1128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Status = %d.", __func__, status); 1138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Capabilities. max_ap_cache_per_scan:%d, " 1148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "max_bssid_history_entries:%d, max_hotlist_aps:%d, " 1158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "max_rssi_sample_size:%d, max_scan_buckets:%d, " 1168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "max_scan_cache_size:%d, max_scan_reporting_threshold:%d, " 1178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "max_significant_wifi_change_aps:%d.", 1188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__, capa.max_ap_cache_per_scan, 1198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam capa.max_bssid_history_entries, 1208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam capa.max_hotlist_aps, capa.max_rssi_sample_size, 1218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam capa.max_scan_buckets, 1228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam capa.max_scan_cache_size, capa.max_scan_reporting_threshold, 1238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam capa.max_significant_wifi_change_aps); 1248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 125b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_get_gscan_capabilities(wifi_interface_handle handle, 1278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_gscan_capabilities *capabilities) 1288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 1298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int requestId, ret = 0; 1308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 1318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 1328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_gscan_capabilities tCapabilities; 1338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(handle); 1348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(handle); 1358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (capabilities == NULL) { 1378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: NULL capabilities pointer provided. Exit.", 1388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__); 1398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 141b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* No request id from caller, so generate one and pass it on to the driver. 1438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Generate it randomly. 1448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 1458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam srand(time(NULL)); 1468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId = rand(); 1478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 1498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 1508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId, 1518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 1528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CAPABILITIES); 1538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 1548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Error GScanCommand NULL", __func__); 1558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 1568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 157b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCallbackHandler callbackHandler; 1598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memset(&callbackHandler, 0, sizeof(callbackHandler)); 1608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.get_capabilities = get_gscan_capabilities_cb; 1618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->setCallbackHandler(callbackHandler); 1638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 1648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 1678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 1688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 1698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 1728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 1738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 1748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 1778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 1788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 1798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->put_u32( 1828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 1838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId); 1848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 1858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 1888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->allocRspParams(eGScanGetCapabilitiesRspParams); 1898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 1908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Failed to allocate memory fo response struct. Error:%d", 1918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__, ret); 1928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 194b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 19586a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam gScanCommand->waitForRsp(true); 1968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->requestEvent(); 1978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 1988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: requestEvent Error:%d",__func__, ret); 1998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 2008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 201b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->getGetCapabilitiesRspParams(capabilities, (u32 *)&ret); 203b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 2058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->freeRspParams(eGScanGetCapabilitiesRspParams); 2068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("%s: Delete object.", __func__); 2078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 2088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 2098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 210b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid start_gscan_cb(int status) 2128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 2138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Status = %d.", __func__, status); 2148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 215b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_start_gscan(wifi_request_id id, 2178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_interface_handle iface, 2188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_scan_cmd_params params, 2198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_scan_result_handler handler) 220b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{ 2218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int ret = 0; 2228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 i, j; 2238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 2248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 2258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 2268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 2278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 num_scan_buckets, numChannelSpecs; 2288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_scan_bucket_spec bucketSpec; 2298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlBuckectSpecList; 2308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Check if a similar request to start gscan was made earlier. 2328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Right now we don't differentiate between the case where (i) the new 2338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Request Id is different from the current one vs (ii) case where both 2348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * new and Request IDs are the same. 2358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 2368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (GScanStartCmdEventHandler) { 2378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (id == GScanStartCmdEventHandler->get_request_id()) { 2388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("wifi_start_gscan(): GSCAN Start for request Id %d is still " 2398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "running. Exit", id); 2408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_TOO_MANY_REQUESTS; 2418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 2428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("wifi_start_gscan(): GSCAN Start for a different request " 2438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "Id %d is requested. Not supported. Exit", id); 2448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 2458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 246b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 247b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 2498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 2508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 2518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 2528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_START); 2538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 2548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("wifi_start_gscan(): Error GScanCommand NULL"); 2558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 2568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 257b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCallbackHandler callbackHandler; 2598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memset(&callbackHandler, 0, sizeof(callbackHandler)); 2608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.start = start_gscan_cb; 2618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->setCallbackHandler(callbackHandler); 2638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 2648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 2658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 2678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 2688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 2698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 2708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 2728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 2738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 2748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 2758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 2778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 2788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 2798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 2808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam num_scan_buckets = (unsigned int)params.num_buckets > MAX_BUCKETS ? 2828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam MAX_BUCKETS : params.num_buckets; 2838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_u32( 2858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 2868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id) || 2878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 2888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_BASE_PERIOD, 2898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam params.base_period) || 2908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 2918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_MAX_AP_PER_SCAN, 2928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam params.max_ap_per_scan) || 2938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 2948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_REPORT_THRESHOLD, 2958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam params.report_threshold) || 2968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 2978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_NUM_BUCKETS, 2988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam num_scan_buckets)) 2998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 3008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 301b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 302b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 3038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlBuckectSpecList = 3048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_start(QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC); 3058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add NL attributes for scan bucket specs . */ 3068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam for (i = 0; i < num_scan_buckets; i++) { 3078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam bucketSpec = params.buckets[i]; 3088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam numChannelSpecs = (unsigned int)bucketSpec.num_channels > MAX_CHANNELS ? 3098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam MAX_CHANNELS : bucketSpec.num_channels; 3108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlBucketSpec = gScanCommand->attr_start(i); 3118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_u8( 3128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_INDEX, 3138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam bucketSpec.bucket) || 3148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 3158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_BAND, 3168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam bucketSpec.band) || 3178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 3188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_PERIOD, 3198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam bucketSpec.period) || 3208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 3218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_REPORT_EVENTS, 3228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam bucketSpec.report_events) || 3238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 3248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_NUM_CHANNEL_SPECS, 3258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam numChannelSpecs)) 3268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 3278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 3288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 329b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 3308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nl_channelSpecList = 3318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_start(QCA_WLAN_VENDOR_ATTR_GSCAN_CHANNEL_SPEC); 3328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 3338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add NL attributes for scan channel specs . */ 3348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam for (j = 0; j < numChannelSpecs; j++) { 3358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nl_channelSpec = gScanCommand->attr_start(j); 3368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_scan_channel_spec channel_spec = bucketSpec.channels[j]; 3378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 3388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if ( gScanCommand->put_u32( 3398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_CHANNEL_SPEC_CHANNEL, 3408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam channel_spec.channel) || 3418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 3428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_CHANNEL_SPEC_DWELL_TIME, 3438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam channel_spec.dwellTimeMs) || 3448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 3458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_CHANNEL_SPEC_PASSIVE, 3468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam channel_spec.passive) ) 3478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 3488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 3498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 350b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 3518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nl_channelSpec); 352b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 3538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nl_channelSpecList); 3548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlBucketSpec); 3558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 3568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlBuckectSpecList); 3578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 3588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 359b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 3608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->allocRspParams(eGScanStartRspParams); 3618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 3628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("wifi_start_gscan(): Failed to allocate memory to the response " 3638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "struct. Error:%d", ret); 3648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 3658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 366b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 3678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the callback handler functions for related events. */ 3688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.on_scan_results_available = 3698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam handler.on_scan_results_available; 3708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.on_full_scan_result = handler.on_full_scan_result; 3718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.on_scan_event = handler.on_scan_event; 3728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create an object to handle the related events from firmware/driver. */ 3738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanStartCmdEventHandler = new GScanCommandEventHandler( 3748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 3758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 3768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 3778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_START, 3788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler); 3798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (GScanStartCmdEventHandler == NULL) { 3808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("wifi_start_gscan(): Error GScanStartCmdEventHandler NULL"); 3818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_UNKNOWN; 3828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 3838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 384b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 38586a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam gScanCommand->waitForRsp(true); 3868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->requestEvent(); 3878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 3888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("wifi_start_gscan(): requestEvent Error:%d", ret); 3898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 3908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 391b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 3928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->getStartGScanRspParams((u32 *)&ret); 3938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) 3948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 3958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 3968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 397b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 3988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 3998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->freeRspParams(eGScanStartRspParams); 4008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("wifi_start_gscan(): Delete object."); 4018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 4028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Delete the command event handler object if ret != 0 */ 4038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret && GScanStartCmdEventHandler) { 4048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("wifi_start_gscan(): Error ret:%d, delete event handler object.", 4058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret); 4068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete GScanStartCmdEventHandler; 4078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanStartCmdEventHandler = NULL; 408b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 4098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 410b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 412b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid stop_gscan_cb(int status) 414b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{ 4158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Status = %d.", __func__, status); 416b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 417b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_stop_gscan(wifi_request_id id, 4198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_interface_handle iface) 4208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 4218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int ret = 0; 4228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 4238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 424b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 4268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 427b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("Stopping GScan, halHandle = %p", wifiHandle); 429b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (GScanStartCmdEventHandler) { 4318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (id != GScanStartCmdEventHandler->get_request_id()) { 4328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("wifi_stop_gscan: GSCAN Stop requested for request Id %d " 4338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "not matching that of existing GScan Start:%d. Exit", 4348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, GScanStartCmdEventHandler->get_request_id()); 4358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_REQUEST_ID; 436b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 4378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 4388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("wifi_stop_gscan: GSCAN isn't running or already stopped. " 4398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "Nothing to do. Exit"); 4408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_AVAILABLE; 441b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 442b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 4448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 4458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 4468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 4478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_STOP); 4488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 4498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Error GScanCommand NULL", __func__); 4508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 451b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 452b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCallbackHandler callbackHandler; 4548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memset(&callbackHandler, 0, sizeof(callbackHandler)); 4558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.stop = stop_gscan_cb; 4568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 4578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->setCallbackHandler(callbackHandler); 4588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 4598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 4608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 4618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 4628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 4638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 4648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 4658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 4668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 4678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 4688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 4698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 4708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 4718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 4728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 4738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 4748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 4758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 4768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->put_u32( 4778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 4788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id); 4798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 4808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 4818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 4828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 4838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 4848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->allocRspParams(eGScanStopRspParams); 4858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 4868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Failed to allocate memory to the response struct. " 4878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "Error:%d", __func__, ret); 4888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 4898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 490b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 49186a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam gScanCommand->waitForRsp(true); 4928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->requestEvent(); 4938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 4948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: requestEvent Error:%d",__func__, ret); 4958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 4968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 497b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->getStopGScanRspParams((u32 *)&ret); 4998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) 5008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 5018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 502b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 503b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 5048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Delete different GSCAN event handlers for the specified Request ID. */ 5058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (GScanStartCmdEventHandler) { 5068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete GScanStartCmdEventHandler; 5078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanStartCmdEventHandler = NULL; 508b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 509b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 5108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 5118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->freeRspParams(eGScanStopRspParams); 5128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("%s: Delete object.", __func__); 5138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 5148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 515b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 516b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 5178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid set_bssid_hotlist_cb(int status) 518b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{ 5198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Status = %d.", __func__, status); 5208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 521b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 5228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Set the GSCAN BSSID Hotlist. */ 5238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_set_bssid_hotlist(wifi_request_id id, 5248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_interface_handle iface, 5258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_bssid_hotlist_params params, 5268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_hotlist_ap_found_handler handler) 5278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 5288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int i, numAp, ret = 0; 5298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 5308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData, *nlApThresholdParamList; 5318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 5328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 5338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 5348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("Setting GScan BSSID Hotlist, halHandle = %p", wifiHandle); 5358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 5368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Check if a similar request to set bssid hotlist was made earlier. 5378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Right now we don't differentiate between the case where (i) the new 5388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Request Id is different from the current one vs (ii) case where both 5398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * new and Request IDs are the same. 5408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 5418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (GScanSetBssidHotlistCmdEventHandler) 5428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (id == GScanSetBssidHotlistCmdEventHandler->get_request_id()) { 5438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: GSCAN Set BSSID Hotlist for request Id %d is still" 5448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "running. Exit", __func__, id); 5458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_TOO_MANY_REQUESTS; 5468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 5478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: GSCAN Set BSSID Hotlist for a different Request Id:%d" 5488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "is requested. Not supported. Exit", __func__, id); 5498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 550b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 551b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 5528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = 5538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam new GScanCommand( 5548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 5558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 5568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 5578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_BSSID_HOTLIST); 5588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 5598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Error GScanCommand NULL", __func__); 5608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 561b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 562b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 5638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCallbackHandler callbackHandler; 5648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memset(&callbackHandler, 0, sizeof(callbackHandler)); 5658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.set_bssid_hotlist = set_bssid_hotlist_cb, 5668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 5678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->setCallbackHandler(callbackHandler); 5688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 5698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 5708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 5718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 5728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 5738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 5748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 5758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 5768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 5778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 5788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 5798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 5808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 5818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 5828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 5838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 5848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 5858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 5868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam numAp = (unsigned int)params.num_ap > MAX_HOTLIST_APS ? MAX_HOTLIST_APS : params.num_ap; 5878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_u32( 5888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 5898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id) || 5908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 5918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BSSID_HOTLIST_PARAMS_NUM_AP, 5928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam numAp)) 5938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 5948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 5958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 596b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 5978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 5988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlApThresholdParamList = 5998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_start( 6008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM); 6018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlApThresholdParamList) 6028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 6038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 6048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add nested NL attributes for AP Threshold Param. */ 6058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam for (i = 0; i < numAp; i++) { 6068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ap_threshold_param apThreshold = params.ap[i]; 6078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlApThresholdParam = gScanCommand->attr_start(i); 6088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlApThresholdParam) 6098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 6108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_addr( 6118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_BSSID, 6128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam apThreshold.bssid) || 6138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_s32( 6148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_RSSI_LOW, 6158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam apThreshold.low) || 6168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_s32( 6178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_RSSI_HIGH, 6188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam apThreshold.high) || 6198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 6208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_CHANNEL, 6218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam apThreshold.channel)) 6228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 6238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 624b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 6258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlApThresholdParam); 6268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 627b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlApThresholdParamList); 629b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 631b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->allocRspParams(eGScanSetBssidHotlistRspParams); 6338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 6348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Failed to allocate memory to the response struct. " 6358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "Error:%d", __func__, ret); 6368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 637b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 638b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.on_hotlist_ap_found = handler.on_hotlist_ap_found; 6408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create an object of the event handler class to take care of the 6418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * asychronous events on the north-bound. 6428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 6438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanSetBssidHotlistCmdEventHandler = new GScanCommandEventHandler( 6448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 6458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 6468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 6478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_BSSID_HOTLIST, 6488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler); 6498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (GScanSetBssidHotlistCmdEventHandler == NULL) { 6508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Error instantiating GScanSetBssidHotlistCmdEventHandler.", 6518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__); 6528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_UNKNOWN; 6538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 654b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 655b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Handler object was created for HOTLIST_AP_FOUND.", __func__); 6578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 65886a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam gScanCommand->waitForRsp(true); 6598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->requestEvent(); 6608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 6618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: requestEvent Error:%d",__func__, ret); 6628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 663b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 664b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->getSetBssidHotlistRspParams((u32 *)&ret); 6668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) 6678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 6688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 6698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 670b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 6728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->freeRspParams(eGScanSetBssidHotlistRspParams); 6738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("%s: Delete object. ", __func__); 6748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 6758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Delete the command event handler object if ret != 0 */ 6768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret && GScanSetBssidHotlistCmdEventHandler) { 6778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete GScanSetBssidHotlistCmdEventHandler; 6788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanSetBssidHotlistCmdEventHandler = NULL; 6798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 6808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 6818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 682b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid reset_bssid_hotlist_cb(int status) 6848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 6858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Status = %d.", __func__, status); 6868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 687b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_reset_bssid_hotlist(wifi_request_id id, 6898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_interface_handle iface) 6908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 6918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int ret = 0; 6928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 6938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 6948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 6958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 6968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 6978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("Resetting GScan BSSID Hotlist, halHandle = %p", wifiHandle); 6988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 6998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (GScanSetBssidHotlistCmdEventHandler) { 7008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (id != GScanSetBssidHotlistCmdEventHandler->get_request_id()) { 7018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: GSCAN Reset Hotlist BSSID requested for request Id %d" 7028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "not matching that of existing GScan Set Hotlist BSSID:%d. " 7038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "Exit", __func__, id, 7048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanSetBssidHotlistCmdEventHandler->get_request_id()); 7058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_REQUEST_ID; 706b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 7078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 708b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 7108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 7118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 7128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 7138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_RESET_BSSID_HOTLIST); 714b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 7168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Error GScanCommand NULL", __func__); 7178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 7188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 719b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCallbackHandler callbackHandler; 7218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memset(&callbackHandler, 0, sizeof(callbackHandler)); 7228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.reset_bssid_hotlist = reset_bssid_hotlist_cb; 7238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->setCallbackHandler(callbackHandler); 7258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 7268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 7278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 7298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 7308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 7318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 7328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 7348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 7358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 7368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 7378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 7398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 7408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 7418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 7428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->put_u32( 7448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, id); 7458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 7468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 7478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 7498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->allocRspParams(eGScanResetBssidHotlistRspParams); 7518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 7528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Failed to allocate memory to the response struct. " 7538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "Error:%d", __func__, ret); 7548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 7558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 756b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 75786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam gScanCommand->waitForRsp(true); 7588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->requestEvent(); 7598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 7608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: requestEvent Error:%d",__func__, ret); 7618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 7628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 763b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->getResetBssidHotlistRspParams((u32 *)&ret); 7658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) 7668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 7678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 7688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 769b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (GScanSetBssidHotlistCmdEventHandler) { 7718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete GScanSetBssidHotlistCmdEventHandler; 7728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanSetBssidHotlistCmdEventHandler = NULL; 773b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 774b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 7768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->freeRspParams(eGScanResetBssidHotlistRspParams); 7778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("%s: Delete object.", __func__); 7788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 7798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 7808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 7818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid set_significant_change_cb(int status) 7838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 7848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Status = %d.", __func__, status); 7858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 786b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Set the GSCAN Significant AP Change list. */ 7888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_set_significant_change_handler(wifi_request_id id, 7898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_interface_handle iface, 7908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_significant_change_params params, 7918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_significant_change_handler handler) 7928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 7938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int i, numAp, ret = 0; 7948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 7958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData, *nlApThresholdParamList; 7968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 7978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 7988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("Setting GScan Significant Change, halHandle = %p", wifiHandle); 8008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 8018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Check if a similar request to set significant change was made earlier. 8028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Right now we don't differentiate between the case where (i) the new 8038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Request Id is different from the current one vs (ii) both new and 8048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Request Ids are the same. 8058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 8068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (GScanSetSignificantChangeCmdEventHandler) 8078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (id == GScanSetSignificantChangeCmdEventHandler->get_request_id()) { 8088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: GSCAN Set Significant Change for request Id %d is still" 8098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "running. Exit", __func__, id); 8108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_TOO_MANY_REQUESTS; 811b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } else { 8128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: GSCAN Set Significant Change for a different Request " 8138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "Id:%d is requested. Not supported. Exit", __func__, id); 8148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 815b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 816b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 8178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 8188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 8198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 8208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 8218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_SIGNIFICANT_CHANGE); 8228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 8238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Error GScanCommand NULL", __func__); 8248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 825b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 826b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 8278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCallbackHandler callbackHandler; 8288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memset(&callbackHandler, 0, sizeof(callbackHandler)); 8298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.set_significant_change = set_significant_change_cb; 8308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 8318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->setCallbackHandler(callbackHandler); 8328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 8338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 8348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 8358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 8368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 8378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 8388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 8398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 8408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 8418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 8428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 8438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 8448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 8458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 8468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 8478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 8488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 8498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 8508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam numAp = (unsigned int)params.num_ap > MAX_SIGNIFICANT_CHANGE_APS ? 8518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam MAX_SIGNIFICANT_CHANGE_APS : params.num_ap; 8528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 8538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_u32( 8548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 8558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id) || 8568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 8578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SIGNIFICANT_CHANGE_PARAMS_RSSI_SAMPLE_SIZE, 8588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam params.rssi_sample_size) || 8598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 8608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SIGNIFICANT_CHANGE_PARAMS_LOST_AP_SAMPLE_SIZE, 8618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam params.lost_ap_sample_size) || 8628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 8638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SIGNIFICANT_CHANGE_PARAMS_MIN_BREACHING, 8648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam params.min_breaching) || 8658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 8668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SIGNIFICANT_CHANGE_PARAMS_NUM_AP, 8678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam numAp)) 8688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 8698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 870b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 871b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 8728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 8738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlApThresholdParamList = 8748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_start( 8758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM); 8768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlApThresholdParamList) 8778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 8788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 8798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add nested NL attributes for AP Threshold Param list. */ 8808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam for (i = 0; i < numAp; i++) { 8818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ap_threshold_param apThreshold = params.ap[i]; 8828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlApThresholdParam = gScanCommand->attr_start(i); 8838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlApThresholdParam) 8848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 8858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if ( gScanCommand->put_addr( 8868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_BSSID, 8878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam apThreshold.bssid) || 8888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_s32( 8898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_RSSI_LOW, 8908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam apThreshold.low) || 8918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_s32( 8928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_RSSI_HIGH, 8938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam apThreshold.high) || 8948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 8958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_CHANNEL, 8968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam apThreshold.channel) ) 8978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 8988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 8998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 9008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlApThresholdParam); 9018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 902b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlApThresholdParamList); 904b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 906b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->allocRspParams(eGScanSetSignificantChangeRspParams); 9088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 9098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Failed to allocate memory to the response struct. " 9108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "Error:%d", __func__, ret); 9118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 912b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 913b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.on_significant_change = handler.on_significant_change; 9158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create an object of the event handler class to take care of the 9168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * asychronous events on the north-bound. 9178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 9188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanSetSignificantChangeCmdEventHandler = new GScanCommandEventHandler( 9198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 9208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 9218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 9228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_SIGNIFICANT_CHANGE, 9238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler); 9248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (GScanSetSignificantChangeCmdEventHandler == NULL) { 9258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Error in instantiating, " 9268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "GScanSetSignificantChangeCmdEventHandler.", 9278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__); 9288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_UNKNOWN; 9298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 9308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 931b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Event handler object was created for SIGNIFICANT_CHANGE.", 9338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__); 934b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 93586a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam gScanCommand->waitForRsp(true); 9368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->requestEvent(); 9378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 9388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: requestEvent Error:%d",__func__, ret); 9398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 9408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 941b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->getSetSignificantChangeRspParams((u32 *)&ret); 9438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) 9448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 9458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 946b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 947b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 9498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->freeRspParams(eGScanSetSignificantChangeRspParams); 9508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("%s: Delete object.", __func__); 9518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Delete the command event handler object if ret != 0 */ 9528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret && GScanSetSignificantChangeCmdEventHandler) { 9538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete GScanSetSignificantChangeCmdEventHandler; 9548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanSetSignificantChangeCmdEventHandler = NULL; 9558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 9568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 9578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 958b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 959b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid reset_significant_change_cb(int status) 9618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 9628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Status = %d.", __func__, status); 9638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 964b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Clear the GSCAN Significant AP change list. */ 9668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_reset_significant_change_handler(wifi_request_id id, 9678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_interface_handle iface) 9688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 9698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int ret = 0; 9708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 9718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 9728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 9738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 9748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 9758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("Resetting GScan Significant Change, halHandle = %p", wifiHandle); 9768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 9778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (GScanSetSignificantChangeCmdEventHandler) { 9788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (id != GScanSetSignificantChangeCmdEventHandler->get_request_id()) { 9798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: GSCAN Reset Significant Change requested for request " 9808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "Id %d not matching that of existing GScan Set Hotlist " 9818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "BSSID:%d. Exit", __func__, id, 9828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanSetSignificantChangeCmdEventHandler->get_request_id()); 9838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_REQUEST_ID; 984b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 9858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 986b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = 9888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam new GScanCommand 9898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ( 9908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 9918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 9928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 9938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_RESET_SIGNIFICANT_CHANGE); 9948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 9958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Error GScanCommand NULL", __func__); 9968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 9978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 998b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCallbackHandler callbackHandler; 10008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memset(&callbackHandler, 0, sizeof(callbackHandler)); 10018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.reset_significant_change = reset_significant_change_cb; 10028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->setCallbackHandler(callbackHandler); 10048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 10058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 10068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 10088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 10098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 10108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 10118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 10138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 10148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 10158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 10168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 10188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 10198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 10208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 10218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->put_u32( 10238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 10248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id); 10258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 10268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 10278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 10298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->allocRspParams(eGScanResetSignificantChangeRspParams); 10318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 10328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Failed to allocate memory to the response struct. " 10338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "Error:%d", __func__, ret); 10348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1035b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 1036b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 103786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam gScanCommand->waitForRsp(true); 10388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->requestEvent(); 10398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 10408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: requestEvent Error:%d",__func__, ret); 10418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 10428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1043b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 10448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->getResetSignificantChangeRspParams((u32 *)&ret); 10458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) 10468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 10478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 10488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1049b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 10508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (GScanSetSignificantChangeCmdEventHandler) { 10518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete GScanSetSignificantChangeCmdEventHandler; 10528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanSetSignificantChangeCmdEventHandler = NULL; 10538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1054b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 10558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 10568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->freeRspParams(eGScanResetSignificantChangeRspParams); 10578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("%s: Delete object.", __func__); 10588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 10598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 10608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1061b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 10628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid get_gscan_cached_results_cb(u8 moreData, u32 numResults) 10638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 10648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: More data = %d.", __func__, moreData); 10658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Number of cached results = %d.", __func__, numResults); 10668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1067b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 10688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Get the GSCAN cached scan results. */ 10698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_get_cached_gscan_results(wifi_interface_handle iface, 10708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam byte flush, int max, 10718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_scan_result *results, 10728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int *num) 10738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 10748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int requestId, ret = 0; 10758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_scan_result *result = results; 10768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 j = 0; 10778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int i = 0; 10788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u8 moreData = 0; 10798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u16 waitTime = GSCAN_EVENT_WAIT_TIME_SECONDS; 10808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 10818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 10828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 10848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 10858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (results == NULL) { 10878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: NULL results pointer provided. Exit.", 10888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__); 10898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 10908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1091b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 10928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* No request id from caller, so generate one and pass it on to the driver. */ 10938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Generate it randomly */ 10948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam srand(time(NULL)); 10958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId = rand(); 10968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("Getting GScan Cached Results, halHandle = %p", wifiHandle); 10988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 11008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 11018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId, 11028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 11038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CACHED_RESULTS); 11048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 11058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Error GScanCommand NULL", __func__); 11068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 11078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1108b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 11098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCallbackHandler callbackHandler; 11108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memset(&callbackHandler, 0, sizeof(callbackHandler)); 11118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.get_cached_results = get_gscan_cached_results_cb; 11128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->setCallbackHandler(callbackHandler); 11148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 11158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 11168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 11188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 11198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 11208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 11218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 11238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 11248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 11258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 11268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 11288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 11298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 11308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 11318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 11338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 11348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_u32( 11368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 11378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId) || 11388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 11398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_GET_CACHED_SCAN_RESULTS_CONFIG_PARAM_FLUSH, 11408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam flush) || 11418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 11428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_GET_CACHED_SCAN_RESULTS_CONFIG_PARAM_MAX, 11438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam max)) 11448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 11458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 11468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 11478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 11488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->allocRspParams(eGScanGetCachedResultsRspParams); 11498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 11508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Failed to allocate memory fo response struct. Error:%d", 11518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__, ret); 11528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1153b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 1154b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 115586a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam gScanCommand->waitForRsp(true); 11568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->requestEvent(); 11578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 11588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: requestEvent Error:%d",__func__, ret); 11598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 11608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1161b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 11628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Read more data flag and number of results of retrieved cached results 11638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * from driver/firmware. 11648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * If more data is 0 or numResults >= max, return with results populated. 11658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Otherwise, loop in 4s wait for next results fragment(s). 11668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 11678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->getGetCachedResultsRspParams(max, 11688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (u8 *)&moreData, 11698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam num, 11708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam results); 11718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam while (!ret && moreData && (*num < max)) { 11728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int res = gScanCommand->timed_wait(waitTime); 11738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (res == ETIMEDOUT) { 11748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Time out happened.", __func__); 11758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /*Proceed to cleanup & return whatever data avaiable at this time*/ 11768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1177b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 11788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Command invoked return value:%d",__func__, res); 11798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Read the moreData and numResults again and possibly append new 11808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * cached results to the list. 11818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 11828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->getGetCachedResultsRspParams(max, 11838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (u8 *)&moreData, 11848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam num, 11858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam results); 11868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 11878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!ret) { 11888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam for(i=0; i< *num; i++) 11898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 11908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("HAL: Result : %d\n", i+1); 11918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("HAL: ts %lld \n", result->ts); 11928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("HAL: SSID %s \n", result->ssid); 11938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("HAL: BSSID: " 11948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "%02x:%02x:%02x:%02x:%02x:%02x \n", 11958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam result->bssid[0], result->bssid[1], result->bssid[2], 11968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam result->bssid[3], result->bssid[4], result->bssid[5]); 11978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("HAL: channel %d \n", result->channel); 11988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("HAL: rssi %d \n", result->rssi); 11998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("HAL: rtt %lld \n", result->rtt); 12008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("HAL: rtt_sd %lld \n", result->rtt_sd); 12018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("HAL: beacon period %d \n", 12028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam result->beacon_period); 12038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("HAL: capability %d \n", result->capability); 12048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("HAL: IE length %d \n", result->ie_length); 12058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("HAL: IE Data \n"); 12068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam hexdump(result->ie_data, result->ie_length); 12078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam result = (wifi_scan_result *) 12088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ((u8 *)&results[i] + sizeof(wifi_scan_result) + 12098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam result->ie_length); 1210b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 12118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 12128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 12138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->freeRspParams(eGScanGetCachedResultsRspParams); 12148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("%s: Delete object.", __func__); 12158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 12168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 12178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1218b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur SubramanyamGScanCommand::GScanCommand(wifi_handle handle, int id, u32 vendor_id, 12208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 subcmd) 12218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam : WifiVendorCommand(handle, id, vendor_id, subcmd) 12228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 12238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("GScanCommand %p constructed", this); 12248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Initialize the member data variables here */ 12258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mStartGScanRspParams = NULL; 12268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mStopGScanRspParams = NULL; 12278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mSetBssidHotlistRspParams = NULL; 12288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mResetBssidHotlistRspParams = NULL; 12298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mSetSignificantChangeRspParams = NULL; 12308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mResetSignificantChangeRspParams = NULL; 12318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams = NULL; 12328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams = NULL; 12338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsNumResults = 0; 12348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mChannels = NULL; 12358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mMaxChannels = 0; 12368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mNumChannelsPtr = NULL; 123786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam mWaitforRsp = false; 12388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 12398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mRequestId = id; 12408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memset(&mHandler, 0,sizeof(mHandler)); 12418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1242b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur SubramanyamGScanCommand::~GScanCommand() 12448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 12458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("GScanCommand %p destructor", this); 12468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam unregisterVendorHandler(mVendor_id, mSubcmd); 12478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1248b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1249b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* This function implements creation of Vendor command */ 12518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::create() { 12528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int ret = mMsg.create(NL80211_CMD_VENDOR, 0, 0); 12538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) { 12548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return ret; 1255b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 1256b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Insert the oui in the msg */ 12588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = mMsg.put_u32(NL80211_ATTR_VENDOR_ID, mVendor_id); 12598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 12608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto out; 12618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Insert the subcmd in the msg */ 12628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = mMsg.put_u32(NL80211_ATTR_VENDOR_SUBCMD, mSubcmd); 12638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 12648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto out; 1265b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("%s: mVendor_id = %d, Subcmd = %d.", 12678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__, mVendor_id, mSubcmd); 1268b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamout: 12708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return ret; 1271b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 1272b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Callback handlers registered for nl message send */ 12748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamstatic int error_handler_gscan(struct sockaddr_nl *nla, struct nlmsgerr *err, 12758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam void *arg) 1276b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{ 12778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct sockaddr_nl *tmp; 12788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int *ret = (int *)arg; 12798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tmp = nla; 12808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *ret = err->error; 12818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Error code:%d (%s)", __func__, *ret, strerror(-(*ret))); 12828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return NL_STOP; 12838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1284b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Callback handlers registered for nl message send */ 12868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamstatic int ack_handler_gscan(struct nl_msg *msg, void *arg) 12878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 12888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int *ret = (int *)arg; 12898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nl_msg * a; 1290b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: called", __func__); 12928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam a = msg; 12938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *ret = 0; 12948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return NL_STOP; 12958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1296b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Callback handlers registered for nl message send */ 12988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamstatic int finish_handler_gscan(struct nl_msg *msg, void *arg) 12998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 13008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int *ret = (int *)arg; 13018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nl_msg * a; 1302b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: called", __func__); 13048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam a = msg; 13058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *ret = 0; 13068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return NL_SKIP; 13078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1308b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* 13108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Override base class requestEvent and implement little differently here. 13118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * This will send the request message. 13128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * We don't wait for any response back in case of gscan as it is asynchronous, 13138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * thus no wait for condition. 13148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 13158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::requestEvent() 13168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 13178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int res = -1; 13188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nl_cb *cb; 1319b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Entry.", __func__); 1321b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam cb = nl_cb_alloc(NL_CB_DEFAULT); 13238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!cb) { 13248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Callback allocation failed",__func__); 13258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam res = -1; 13268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto out; 1327b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 1328b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Send message */ 13308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s:Handle:%p Socket Value:%p", __func__, mInfo, mInfo->cmd_sock); 13318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam res = nl_send_auto_complete(mInfo->cmd_sock, mMsg.getMessage()); 13328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (res < 0) 13338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto out; 13348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam res = 1; 1335b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nl_cb_err(cb, NL_CB_CUSTOM, error_handler_gscan, &res); 13378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler_gscan, &res); 13388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler_gscan, &res); 1339b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Err is populated as part of finish_handler. */ 13418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam while (res > 0){ 13428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nl_recvmsgs(mInfo->cmd_sock, cb); 1343b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 1344b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 134586a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam ALOGD("%s: Msg sent, res=%d, mWaitForRsp=%d", __func__, res, mWaitforRsp); 13468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Only wait for the asynchronous event if HDD returns success, res=0 */ 134786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam if (!res && (mWaitforRsp == true)) { 13488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct timespec abstime; 13498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam abstime.tv_sec = 4; 13508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam abstime.tv_nsec = 0; 13518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam res = mCondition.wait(abstime); 13528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (res == ETIMEDOUT) 13538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 13548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Time out happened.", __func__); 1355b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 135686a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam ALOGD("%s: Command invoked return value:%d, mWaitForRsp=%d", 135786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam __func__, res, mWaitforRsp); 1358b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 13598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamout: 13608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Free the VendorData */ 13618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mVendorData) { 13628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam free(mVendorData); 1363b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 13648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mVendorData = NULL; 13658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Cleanup the mMsg */ 13668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mMsg.destroy(); 13678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return res; 13688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1369b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::requestResponse() 1371b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{ 13728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: request a response", __func__); 13738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WifiCommand::requestResponse(mMsg); 1374b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 1375b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::handleResponse(WifiEvent &reply) { 13778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("Received a GScan response message from Driver"); 13788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 status; 13798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int i = 0; 13808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam WifiVendorCommand::handleResponse(reply); 1381b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam switch(mSubcmd) 13838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 13848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_VALID_CHANNELS: 13858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 13868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *tb_vendor[ 13878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX + 1]; 13888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX, 13898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (struct nlattr *)mVendorData,mDataLen, NULL); 13908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 13918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (tb_vendor[ 13928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_CHANNELS]) { 13938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 val; 13948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam val = nla_get_u32( 13958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb_vendor[ 13968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_CHANNELS]); 13978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 13988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Num channels : %d", __func__, val); 13998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam val = val > (unsigned int)mMaxChannels ? 14008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (unsigned int)mMaxChannels : val; 14018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *mNumChannelsPtr = val; 14028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 14038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Extract the list of channels. */ 14048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (*mNumChannelsPtr > 0 && 14058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb_vendor[ 14068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CHANNELS]) { 14078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_memcpy(mChannels, 14088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb_vendor[ 14098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CHANNELS], 14108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam sizeof(wifi_channel) * (*mNumChannelsPtr)); 14118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1412b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 14138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Get valid channels response received.", 14148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__); 14158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Num channels : %d", 14168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__, *mNumChannelsPtr); 14178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: List of valid channels is: ", __func__); 14188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam for(i = 0; i < *mNumChannelsPtr; i++) 14198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 14208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%u", *(mChannels + i)); 14218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 14228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 14238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 14248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 14258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam default : 14268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Wrong GScan subcmd response received %d", 14278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__, mSubcmd); 14288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 14298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return NL_SKIP; 1430b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 1431b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 14328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Called to parse and extract cached results. */ 14338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamstatic int gscan_get_cached_results(u32 num_results, 14348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_scan_result *results, 14358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 starting_index, 14368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr **tb_vendor) 1437b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{ 14388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 i = starting_index; 14398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *scanResultsInfo; 14408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int rem = 0; 14418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 len = 0; 14428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("starting counter: %d", i); 14438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 14448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam for (scanResultsInfo = (struct nlattr *) nla_data(tb_vendor[ 14458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_LIST]), 14468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam rem = nla_len(tb_vendor[ 14478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_LIST 14488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]); 14498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_ok(scanResultsInfo, rem); 14508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam scanResultsInfo = nla_next(scanResultsInfo, &(rem))) 14518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 14528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *tb2[ QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX + 1]; 14538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_parse(tb2, QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX, 14548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (struct nlattr *) nla_data(scanResultsInfo), 14558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_len(scanResultsInfo), NULL); 14568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 14578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (! 14588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[ 14598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_TIME_STAMP 14608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) 14618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 14628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_TIME_STAMP" 14638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam " not found"); 14648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1465b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 14668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam results[i].ts = 14678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u64( 14688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[ 14698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_TIME_STAMP 14708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]); 14718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (! 14728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[ 14738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_SSID 14748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) 14758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 14768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_SSID " 14778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "not found"); 14788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1479b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 14808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam len = nla_len(tb2[ 14818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_SSID]); 14828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam len = 14838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam sizeof(results->ssid) <= len ? sizeof(results->ssid) : len; 14848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memcpy((void *)&results[i].ssid, 14858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_data( 14868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_SSID]), len); 14878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (! 14888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[ 14898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_BSSID 14908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) 14918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 14928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_BSSID " 14938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "not found"); 14948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1495b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 14968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam len = nla_len( 14978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_BSSID]); 14988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam len = 14998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam sizeof(results->bssid) <= len ? sizeof(results->bssid) : len; 15008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memcpy(&results[i].bssid, 15018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_data( 15028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_BSSID]), len); 15038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (! 15048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[ 15058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_CHANNEL 15068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) 15078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 15088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_CHANNEL " 15098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "not found"); 15108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1511b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 15128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam results[i].channel = 15138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32( 15148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_CHANNEL]); 15158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (! 15168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[ 15178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RSSI 15188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) 15198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 15208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_RSSI " 15218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "not found"); 15228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1523b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 15248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam results[i].rssi = 15258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32( 15268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RSSI]); 15278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (! 15288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[ 15298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RTT 15308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) 15318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 15328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_RTT " 15338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "not found"); 15348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 15358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 15368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam results[i].rtt = 15378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32( 15388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RTT]); 15398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (! 15408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[ 15418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RTT_SD 15428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) 15438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 15448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_RTT_SD " 15458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "not found"); 15468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 15478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 15488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam results[i].rtt_sd = 15498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32( 15508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RTT_SD]); 15518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 15528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: ts %lld ", results[i].ts); 15538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: SSID %s ", results[i].ssid); 15548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: " 15558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "BSSID: %02x:%02x:%02x:%02x:%02x:%02x \n", 15568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam results[i].bssid[0], results[i].bssid[1], results[i].bssid[2], 15578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]); 15588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: channel %d ", results[i].channel); 15598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: rssi %d ", results[i].rssi); 15608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: rtt %lld ", results[i].rtt); 15618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("gscan_get_cached_results: rtt_sd %lld ", results[i].rtt_sd); 15628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Increment loop index for next record */ 15638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam i++; 15648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 15658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Exited the for loop", __func__); 15668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_SUCCESS; 15678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1568b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 15698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* This function will be the main handler for incoming (from driver) GSscan_SUBCMD. 15708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Calls the appropriate callback handler after parsing the vendor data. 15718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 15728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::handleEvent(WifiEvent &event) 15738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 15748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGI("Got a GSCAN Event message from the Driver."); 15758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam unsigned i = 0; 15768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 status; 157786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam int ret = WIFI_SUCCESS; 15788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam WifiVendorCommand::handleEvent(event); 15798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 15808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *tbVendor[ 15818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX + 1]; 15828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_parse(tbVendor, QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX, 15838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (struct nlattr *)mVendorData, 15848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mDataLen, NULL); 15858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 15868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam switch(mSubcmd) 15878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 15888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case QCA_NL80211_VENDOR_SUBCMD_GSCAN_START: 15898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 15908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mStartGScanRspParams){ 15918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mStartGScanRspParams->status = 15928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]); 15938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mHandler.start) 15948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (*mHandler.start)(mStartGScanRspParams->status); 1595b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 159686a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam waitForRsp(false); 15978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 15988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 15998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 16008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case QCA_NL80211_VENDOR_SUBCMD_GSCAN_STOP: 16018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 16028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mStopGScanRspParams){ 16038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mStopGScanRspParams->status = 16048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]); 16058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mHandler.stop) 16068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (*mHandler.stop)(mStopGScanRspParams->status); 1607b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 160886a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam waitForRsp(false); 16098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 16108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 16118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 16128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_BSSID_HOTLIST: 16138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 16148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mSetBssidHotlistRspParams){ 16158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mSetBssidHotlistRspParams->status = 16168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]); 16178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mHandler.set_bssid_hotlist) 16188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (*mHandler.set_bssid_hotlist) 16198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (mSetBssidHotlistRspParams->status); 1620b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 162186a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam waitForRsp(false); 16228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 16238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 16248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 16258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case QCA_NL80211_VENDOR_SUBCMD_GSCAN_RESET_BSSID_HOTLIST: 16268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 16278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mResetBssidHotlistRspParams){ 16288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mResetBssidHotlistRspParams->status = 16298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]); 16308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mHandler.reset_bssid_hotlist) 16318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (*mHandler.reset_bssid_hotlist) 16328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (mResetBssidHotlistRspParams->status); 1633b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 163486a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam waitForRsp(false); 1635b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 16368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 16378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 16388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_SIGNIFICANT_CHANGE: 16398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 16408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mSetSignificantChangeRspParams){ 16418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mSetSignificantChangeRspParams->status = 16428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]); 16438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mHandler.set_significant_change) 16448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (*mHandler.set_significant_change) 16458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (mSetSignificantChangeRspParams->status); 16468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 164786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam waitForRsp(false); 1648b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 16498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 16508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 16518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case QCA_NL80211_VENDOR_SUBCMD_GSCAN_RESET_SIGNIFICANT_CHANGE: 16528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 16538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mResetSignificantChangeRspParams){ 16548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mResetSignificantChangeRspParams->status = 16558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]); 16568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mHandler.reset_significant_change) 16578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (*mHandler.reset_significant_change) 16588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (mResetSignificantChangeRspParams->status); 16598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 166086a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam waitForRsp(false); 1661b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 16628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 1663b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 16648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CAPABILITIES: 16658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 16668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!mGetCapabilitiesRspParams){ 16678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: mGetCapabilitiesRspParams ptr is NULL. Exit. ", 16688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__); 16698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 16708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1671b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 16728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]) { 16738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS " 16748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "not found", __func__); 16758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_INVALID_ARGS; 16768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 16778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 16788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams->status = 16798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]); 16808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 16818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!tbVendor[ 16828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SCAN_CACHE_SIZE 16838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) { 16848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_" 16858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "CAPABILITIES_MAX_SCAN_CACHE_SIZE not found", __func__); 16868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_INVALID_ARGS; 16878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 16888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 16898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams->capabilities.max_scan_cache_size = 16908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[ 16918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SCAN_CACHE_SIZE]); 16928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 16938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!tbVendor[ 16948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SCAN_BUCKETS 16958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) { 16968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX" 16978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "_SCAN_BUCKETS not found", __func__); 16988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_INVALID_ARGS; 16998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 17008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 17018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams->capabilities.max_scan_buckets = 17028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[ 17038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SCAN_BUCKETS] 17048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ); 17058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 17068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!tbVendor[ 17078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_AP_CACHE_PER_SCAN 17088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) { 17098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX" 17108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "_AP_CACHE_PER_SCAN not found", __func__); 17118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_INVALID_ARGS; 17128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 17138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 17148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams->capabilities.max_ap_cache_per_scan = 17158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[ 17168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_AP_CACHE_PER_SCAN]); 17178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 17188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!tbVendor[ 17198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_RSSI_SAMPLE_SIZE 17208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) { 17218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX" 17228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "_RSSI_SAMPLE_SIZE not found", __func__); 17238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_INVALID_ARGS; 17248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 17258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 17268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams->capabilities.max_rssi_sample_size = 17278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[ 17288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_RSSI_SAMPLE_SIZE]); 17298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 17308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!tbVendor[ 17318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SCAN_REPORTING_THRESHOLD 17328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) { 17338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_" 17348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "MAX_SCAN_REPORTING_THRESHOLD not found", __func__); 17358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_INVALID_ARGS; 17368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 17378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 17388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams->capabilities.max_scan_reporting_threshold = 17398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[ 17408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SCAN_REPORTING_THRESHOLD 17418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]); 17428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 17438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!tbVendor[ 17448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_HOTLIST_APS 17458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) { 17468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_" 17478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "MAX_HOTLIST_APS not found", __func__); 17488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_INVALID_ARGS; 17498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 17508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 17518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams->capabilities.max_hotlist_aps = 17528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[ 17538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_HOTLIST_APS]); 17548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 17558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!tbVendor[ 17568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SIGNIFICANT_WIFI_CHANGE_APS 17578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) { 17588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX" 17598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "_SIGNIFICANT_WIFI_CHANGE_APS not found", __func__); 17608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_INVALID_ARGS; 17618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 17628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 17638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams->capabilities.max_significant_wifi_change_aps = 17648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[ 17658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SIGNIFICANT_WIFI_CHANGE_APS]); 17668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 17678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!tbVendor[ 17688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_BSSID_HISTORY_ENTRIES 17698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]) { 17708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX" 17718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "_BSSID_HISTORY_ENTRIES not found", __func__); 17728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_INVALID_ARGS; 17738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 17748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 17758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams->capabilities.max_bssid_history_entries = 17768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nla_get_u32(tbVendor[ 17778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_BSSID_HISTORY_ENTRIES 17788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ]); 17798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Call the call back handler func. */ 17808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mHandler.get_capabilities) 17818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (*mHandler.get_capabilities) 17828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (mGetCapabilitiesRspParams->status, 17838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams->capabilities); 178486a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam waitForRsp(false); 1785b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 17868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 17878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 17888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CACHED_RESULTS: 17898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 17908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_request_id id; 17918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 resultsBufSize = 0; 17928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 numResults = 0; 17938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 startingIndex, sizeOfObtainedScanResults; 17948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 179586a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam if (!tbVendor[ 179686a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_REQUEST_ID]) { 179786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam ALOGE("%s: GSCAN_RESULTS_REQUEST_ID not" 179886a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam "found", __func__); 179986a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam break; 180086a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam } 18018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id = nla_get_u32( 18028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_REQUEST_ID] 18038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ); 18048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Event has Req. ID:%d, ours:%d", 18058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__, id, mRequestId); 18068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* If this is not for us, just ignore it. */ 18078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (id != mRequestId) { 18088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Event has Req. ID:%d <> ours:%d", 18098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__, id, mRequestId); 18108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 18118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 18128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!tbVendor[ 18138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_RESULTS_AVAILABLE]) { 181486a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam ALOGE("%s: GSCAN_RESULTS_NUM_RESULTS_AVAILABLE not" 18158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "found", __func__); 18168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 18178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 18188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam numResults = nla_get_u32(tbVendor[ 18198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_RESULTS_AVAILABLE]); 18208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: number of results:%d", __func__, 18218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam numResults); 18228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 18238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!mGetCachedResultsRspParams) { 18248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: mGetCachedResultsRspParams is NULL, exit.", 18258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__); 18268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 18278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1828b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 18298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Get the memory size of previous fragments, if any. */ 18308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam sizeOfObtainedScanResults = mGetCachedResultsNumResults * 18318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam sizeof(wifi_scan_result); 18328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 18338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsNumResults += numResults; 18348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam resultsBufSize += mGetCachedResultsNumResults * 18358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam sizeof(wifi_scan_result); 18368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Check if this chunck of cached scan results is a continuation of 18378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * a previous one, i.e., a new results fragment. 18388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 18398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mGetCachedResultsRspParams->more_data) { 18408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->results = (wifi_scan_result *) 18418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam realloc (mGetCachedResultsRspParams->results, 18428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam resultsBufSize); 18438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 18448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->results = (wifi_scan_result *) 18458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam malloc (resultsBufSize); 18468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1847b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 18488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Total num of cached results received: %d. \n", 18498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__, mGetCachedResultsNumResults); 1850b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 18518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!mGetCachedResultsRspParams->results) { 18528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Failed to alloc memory for results array. Exit.\n", 18538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__); 18548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_OUT_OF_MEMORY; 18558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 18568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1857b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 18588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("(u8 *)mGetCachedResultsRspParams->results : %p " 18598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "resultsBufSize :%d oldSizeResults : %d . \n", 18608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (u8 *)mGetCachedResultsRspParams->results, 18618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam resultsBufSize, sizeOfObtainedScanResults); 18628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Initialize the newly allocated memory area with 0. */ 18638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memset((u8 *)mGetCachedResultsRspParams->results + 18648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam sizeOfObtainedScanResults, 18658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 0, 18668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam resultsBufSize - sizeOfObtainedScanResults); 18678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 18688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* To support fragmentation from firmware, monitor the 18698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * MORE_DTATA flag and cache results until MORE_DATA = 0. 18708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 18718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!tbVendor[ 18728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_MORE_DATA]) { 18738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: GSCAN_RESULTS_NUM_RESULTS_MORE_DATA " 18748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam "not found", __func__); 18758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_INVALID_ARGS; 18768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 18778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 18788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->more_data = nla_get_u8( 18798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tbVendor[ 18808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_MORE_DATA]); 18818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: More data = %d. \n", __func__, 18828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->more_data); 18838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1884b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 18858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->num_results = 18868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsNumResults; 18878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (numResults) { 18888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Extract cached results received.\n", __func__); 18898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam startingIndex = 18908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsNumResults - numResults; 18918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: starting_index:%d", 18928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__, startingIndex); 18938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gscan_get_cached_results(numResults, 18948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->results, 18958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam startingIndex, 18968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam tbVendor); 18978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* If a parsing error occurred, exit and proceed for cleanup. */ 18988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret) 18998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 19008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 19018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Send the results if no more result data fragments are expected. */ 19028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mHandler.get_cached_results) { 19038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (*mHandler.get_cached_results) 19048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (mGetCachedResultsRspParams->more_data, 19058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->num_results); 19068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 190786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam waitForRsp(false); 1908b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 19098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 1910b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 19118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam default: 19128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Error case should not happen print log */ 19138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Wrong GScan subcmd received %d", __func__, mSubcmd); 1914b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 1915b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 19168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* A parsing error occurred, do the cleanup of gscan result lists. */ 19178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret) { 19188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam switch(mSubcmd) 19198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 19208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CACHED_RESULTS: 19218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 19228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam freeRspParams(eGScanGetCachedResultsRspParams); 19238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 19248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 1925b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 19268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CAPABILITIES: 19278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 1928b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 19298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam default: 19308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Wrong GScan subcmd received %d", __func__, mSubcmd); 1931b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 19328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1933b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 193486a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam return NL_SKIP; 19358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1936b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 19378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::setCallbackHandler(GScanCallbackHandler nHandler) 19388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 19398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int res = 0; 19408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mHandler = nHandler; 19418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam res = registerVendorHandler(mVendor_id, mSubcmd); 19428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (res != 0) { 19438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Error case: should not happen, so print a log when it does. */ 19448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Unable to register Vendor Handler Vendor Id=0x%x subcmd=%u", 19458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam __func__, mVendor_id, mSubcmd); 1946b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 19478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return res; 19488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1949b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 19508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* 19518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Allocates memory for the subCmd response struct and initializes status = -1 19528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 19538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::allocRspParams(eGScanRspRarams cmd) 19548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 19558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int ret = 0; 19568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam switch(cmd) 19578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 19588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanStartRspParams: 19598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mStartGScanRspParams = (GScanStartRspParams *) 19608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam malloc(sizeof(GScanStartRspParams)); 19618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!mStartGScanRspParams) 19628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = -1; 19638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam else 19648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mStartGScanRspParams->status = -1; 19658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 19668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanStopRspParams: 19678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mStopGScanRspParams = (GScanStopRspParams *) 19688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam malloc(sizeof(GScanStopRspParams)); 19698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!mStopGScanRspParams) 19708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = -1; 19718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam else 19728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mStopGScanRspParams->status = -1; 19738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 19748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanSetBssidHotlistRspParams: 19758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mSetBssidHotlistRspParams = (GScanSetBssidHotlistRspParams *) 19768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam malloc(sizeof(GScanSetBssidHotlistRspParams)); 19778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!mSetBssidHotlistRspParams) 19788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = -1; 19798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam else 19808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mSetBssidHotlistRspParams->status = -1; 19818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 19828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanResetBssidHotlistRspParams: 19838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mResetBssidHotlistRspParams = (GScanResetBssidHotlistRspParams *) 19848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam malloc(sizeof(GScanResetBssidHotlistRspParams)); 19858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!mResetBssidHotlistRspParams) 19868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = -1; 19878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam else 19888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mResetBssidHotlistRspParams->status = -1; 19898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 19908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanSetSignificantChangeRspParams: 19918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mSetSignificantChangeRspParams = 19928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (GScanSetSignificantChangeRspParams *) 19938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam malloc(sizeof(GScanSetSignificantChangeRspParams)); 19948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!mSetSignificantChangeRspParams) 19958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = -1; 19968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam else 19978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mSetSignificantChangeRspParams->status = -1; 19988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 19998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanResetSignificantChangeRspParams: 20008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mResetSignificantChangeRspParams = 20018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam (GScanResetSignificantChangeRspParams *) 20028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam malloc(sizeof(GScanResetSignificantChangeRspParams)); 20038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!mResetSignificantChangeRspParams) 20048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = -1; 20058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam else 20068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mResetSignificantChangeRspParams->status = -1; 20078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 20088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanGetCapabilitiesRspParams: 20098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams = (GScanGetCapabilitiesRspParams *) 20108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam malloc(sizeof(GScanGetCapabilitiesRspParams)); 20118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!mGetCapabilitiesRspParams) 20128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = -1; 20138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam else { 20148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memset(&mGetCapabilitiesRspParams->capabilities, 0, 20158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam sizeof(wifi_gscan_capabilities)); 20168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams->status = -1; 20178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 20188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 20198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanGetCachedResultsRspParams: 20208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams = (GScanGetCachedResultsRspParams *) 20218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam malloc(sizeof(GScanGetCachedResultsRspParams)); 20228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!mGetCachedResultsRspParams) 20238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = -1; 20248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam else { 20258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->num_results = 0; 20268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->more_data = false; 20278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->results = NULL; 20288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 20298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 20308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam default: 20318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Wrong request for alloc.", __func__); 20328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = -1; 2033b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 20348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return ret; 20358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2036b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 20378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::freeRspParams(eGScanRspRarams cmd) 20388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 20398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam switch(cmd) 20408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 20418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanStartRspParams: 20428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mStartGScanRspParams) { 20438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam free(mStartGScanRspParams); 20448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mStartGScanRspParams = NULL; 20458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 20468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 20478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanStopRspParams: 20488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mStopGScanRspParams) { 20498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam free(mStopGScanRspParams); 20508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mStopGScanRspParams = NULL; 20518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 20528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 20538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanSetBssidHotlistRspParams: 20548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mSetBssidHotlistRspParams) { 20558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam free(mSetBssidHotlistRspParams); 20568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mSetBssidHotlistRspParams = NULL; 20578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 20588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 20598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanResetBssidHotlistRspParams: 20608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mResetBssidHotlistRspParams) { 20618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam free(mResetBssidHotlistRspParams); 20628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mResetBssidHotlistRspParams = NULL; 20638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 20648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 20658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanSetSignificantChangeRspParams: 20668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mSetSignificantChangeRspParams) { 20678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam free(mSetSignificantChangeRspParams); 20688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mSetSignificantChangeRspParams = NULL; 20698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 20708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 20718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanResetSignificantChangeRspParams: 20728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mResetSignificantChangeRspParams) { 20738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam free(mResetSignificantChangeRspParams); 20748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mResetSignificantChangeRspParams = NULL; 20758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 20768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 20778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanGetCapabilitiesRspParams: 20788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mGetCapabilitiesRspParams) { 20798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam free(mGetCapabilitiesRspParams); 20808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCapabilitiesRspParams = NULL; 20818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 20828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 20838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanGetCachedResultsRspParams: 20848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mGetCachedResultsRspParams) { 20858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mGetCachedResultsRspParams->results) { 20868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam free(mGetCachedResultsRspParams->results); 20878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->results = NULL; 20888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 20898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam free(mGetCachedResultsRspParams); 20908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams = NULL; 20918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 20928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 2093b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 20948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam default: 20958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: Wrong request for free.", __func__); 20968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 20978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2098b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 20998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error GScanCommand::getGetCachedResultsRspParams( 21008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int max, 21018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u8 *moreData, 21028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int *numResults, 21038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_scan_result *results) 21048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 21058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_error ret = WIFI_SUCCESS; 2106b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 21078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mGetCachedResultsRspParams && results) 21088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 21098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *moreData = mGetCachedResultsRspParams->more_data; 21108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *numResults = mGetCachedResultsRspParams->num_results > (unsigned int)max ? 21118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam max : mGetCachedResultsRspParams->num_results; 21128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memcpy(results, 21138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->results, 21148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *numResults * sizeof(wifi_scan_result)); 21158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 21168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: mGetCachedResultsRspParams is NULL", __func__); 21178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_INVALID_ARGS; 21188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 21198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return ret; 21208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2121b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 21228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getGetCapabilitiesRspParams( 21238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_gscan_capabilities *capabilities, 21248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 *status) 21258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 21268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mGetCapabilitiesRspParams && capabilities) 21278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 21288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *status = mGetCapabilitiesRspParams->status; 21298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memcpy(capabilities, 21308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam &mGetCapabilitiesRspParams->capabilities, 21318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam sizeof(wifi_gscan_capabilities)); 21328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 21338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: mGetCapabilitiesRspParams is NULL", __func__); 21348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 21358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2136b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 21378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getStartGScanRspParams(u32 *status) 21388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 21398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mStartGScanRspParams) 21408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 21418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *status = mStartGScanRspParams->status; 21428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 21438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: mStartGScanRspParams is NULL", __func__); 21448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 21458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2146b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 21478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getStopGScanRspParams(u32 *status) 21488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 21498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mStopGScanRspParams) 21508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 21518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *status = mStopGScanRspParams->status; 21528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 21538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: mStopGScanRspParams is NULL", __func__); 2154b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 21558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2156b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 21578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getSetBssidHotlistRspParams(u32 *status) 2158b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{ 21598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mSetBssidHotlistRspParams) 21608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 21618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *status = mSetBssidHotlistRspParams->status; 21628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 21638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: mSetBssidHotlistRspParams is NULL", __func__); 21648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 21658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2166b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 21678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getResetBssidHotlistRspParams(u32 *status) 21688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 21698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mResetBssidHotlistRspParams) 21708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 21718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *status = mResetBssidHotlistRspParams->status; 21728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 21738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: mResetBssidHotlistRspParams is NULL", __func__); 21748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 2175b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 2176b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 21778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getSetSignificantChangeRspParams(u32 *status) 2178b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{ 21798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mSetSignificantChangeRspParams) 21808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 21818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *status = mSetSignificantChangeRspParams->status; 21828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 21838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: mSetSignificantChangeRspParams is NULL", __func__); 21848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 21858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2186b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 21878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getResetSignificantChangeRspParams(u32 *status) 21888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 21898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mResetSignificantChangeRspParams) 21908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 21918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *status = mResetSignificantChangeRspParams->status; 21928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 21938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGD("%s: mResetSignificantChangeRspParams is NULL", __func__); 2194b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 21958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 21968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 21978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::timed_wait(u16 wait_time) 21988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 21998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct timespec absTime; 22008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int res; 22018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam absTime.tv_sec = wait_time; 22028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam absTime.tv_nsec = 0; 22038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return mCondition.wait(absTime); 22048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2205b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 220686a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyamvoid GScanCommand::waitForRsp(bool wait) 220786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam{ 220886a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam mWaitforRsp = wait; 220986a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam} 221086a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam 22118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::setMaxChannels(int max_channels) { 22128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mMaxChannels = max_channels; 2213b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 22148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 22158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::setChannels(int *channels) { 22168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mChannels = channels; 22178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 22188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 22198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::setNumChannelsPtr(int *num_channels) { 22208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mNumChannelsPtr = num_channels; 22218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 22228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2223