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> 2135be86a67db4ed82216c5c6e421ad2a1e386aea5Ahmad Kholaif#include <errno.h> 222d953ba14654205d59c3214217a1fa4e0cd0dc33Subhani Shaik#include <stdlib.h> 23b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 24b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "common.h" 25b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "cpp_bindings.h" 268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#include "gscancommand.h" 278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#include "gscan_event_handler.h" 28b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#define GSCAN_EVENT_WAIT_TIME_SECONDS 4 30b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 313561d2cc0bc4beeca22723dd7488f8af0c1211f4Subhani Shaik/* BSSID blacklist */ 323561d2cc0bc4beeca22723dd7488f8af0c1211f4Subhani Shaiktypedef struct { 333561d2cc0bc4beeca22723dd7488f8af0c1211f4Subhani Shaik int num_bssid; // number of blacklisted BSSIDs 343561d2cc0bc4beeca22723dd7488f8af0c1211f4Subhani Shaik mac_addr bssids[MAX_BLACKLIST_BSSID]; // blacklisted BSSIDs 353561d2cc0bc4beeca22723dd7488f8af0c1211f4Subhani Shaik} wifi_bssid_params; 363561d2cc0bc4beeca22723dd7488f8af0c1211f4Subhani Shaik 37864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam/* Used to handle gscan command events from driver/firmware.*/ 38864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyamtypedef struct gscan_event_handlers_s { 39864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gscanStartCmdEventHandler; 40864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanSetBssidHotlistCmdEventHandler; 41864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanSetSignificantChangeCmdEventHandler; 42864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanSetSsidHotlistCmdEventHandler; 43864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanSetPnoListCmdEventHandler; 44864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanPnoSetPasspointListCmdEventHandler; 45864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam} gscan_event_handlers; 46864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam 47864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyamwifi_error initializeGscanHandlers(hal_info *info) 48864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam{ 49864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam info->gscan_handlers = (gscan_event_handlers *)malloc(sizeof(gscan_event_handlers)); 50864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (info->gscan_handlers) { 51864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam memset(info->gscan_handlers, 0, sizeof(gscan_event_handlers)); 52864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam } 53864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam else { 54864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam ALOGE("%s: Allocation of gscan event handlers failed", 55864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam __FUNCTION__); 56864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam return WIFI_ERROR_OUT_OF_MEMORY; 57864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam } 58864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam return WIFI_SUCCESS; 59864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam} 60864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam 61864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyamwifi_error cleanupGscanHandlers(hal_info *info) 62864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam{ 63864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gscan_event_handlers* event_handlers; 64864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (info && info->gscan_handlers) { 65864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers = (gscan_event_handlers*) info->gscan_handlers; 66864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (event_handlers->gscanStartCmdEventHandler) { 67864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam delete event_handlers->gscanStartCmdEventHandler; 68864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam } 69864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (event_handlers->gScanSetBssidHotlistCmdEventHandler) { 70864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam delete event_handlers->gScanSetBssidHotlistCmdEventHandler; 71864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam } 72864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (event_handlers->gScanSetSignificantChangeCmdEventHandler) { 73864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam delete event_handlers->gScanSetSignificantChangeCmdEventHandler; 74864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam } 75864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (event_handlers->gScanSetSsidHotlistCmdEventHandler) { 76864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam delete event_handlers->gScanSetSsidHotlistCmdEventHandler; 77864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam } 78864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (event_handlers->gScanSetPnoListCmdEventHandler) { 79864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam delete event_handlers->gScanSetPnoListCmdEventHandler; 80864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam } 81864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (event_handlers->gScanPnoSetPasspointListCmdEventHandler) { 82864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam delete event_handlers->gScanPnoSetPasspointListCmdEventHandler; 83864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam } 84864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam memset(event_handlers, 0, sizeof(gscan_event_handlers)); 85864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam return WIFI_SUCCESS; 86864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam } 87864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam ALOGE ("%s: info or info->gscan_handlers NULL", __FUNCTION__); 88864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 89864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam} 90b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Implementation of the API functions exposed in gscan.h */ 928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_get_valid_channels(wifi_interface_handle handle, 938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int band, int max_channels, wifi_channel *channels, int *num_channels) 948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 950919dfde526ab1f2996334835cbd176906e89d0eSrinivas Girigowda int requestId, ret = 0; 968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(handle); 998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(handle); 100e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowi_cb_table_t *lowiWifiHalApi = NULL; 1014af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 102e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam /* Route GSCAN request through LOWI if supported */ 103e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi = getLowiCallbackTable(GSCAN_SUPPORTED); 104e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam if (lowiWifiHalApi == NULL || 105e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi->get_valid_channels == NULL) { 106b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal ALOGV("%s: Sending cmd directly to host", __FUNCTION__); 107e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } else { 108e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam ret = lowiWifiHalApi->get_valid_channels(handle, band, max_channels, 109e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam channels, num_channels); 1103ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: lowi get_valid_channels " 111e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam "returned: %d. Exit.", __FUNCTION__, ret); 112e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam return (wifi_error)ret; 113e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } 114e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam 1158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* No request id from caller, so generate one and pass it on to the driver. 1168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Generate one randomly. 1178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 1182d953ba14654205d59c3214217a1fa4e0cd0dc33Subhani Shaik requestId = get_requestid(); 1193ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: RequestId:%d band:%d max_channels:%d", __FUNCTION__, 1205ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik requestId, band, max_channels); 1215ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik 1225ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik if (channels == NULL) { 1235ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: NULL channels pointer provided. Exit.", 1245ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 1255ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik return WIFI_ERROR_INVALID_ARGS; 1265ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik } 1278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 1298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 1308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId, 1318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 1328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_VALID_CHANNELS); 1338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 1345ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error GScanCommand NULL", __FUNCTION__); 1358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 1368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 1388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 1398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 1408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 1438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 1448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 1458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 1488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 1498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 1508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_u32( 1538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 1548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId) || 1558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 1568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_GET_VALID_CHANNELS_CONFIG_PARAM_WIFI_BAND, 1578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam band) || 1588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 1598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_GET_VALID_CHANNELS_CONFIG_PARAM_MAX_CHANNELS, 1608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam max_channels) ) 1618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 1628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 1658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Populate the input received from caller/framework. */ 1668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->setMaxChannels(max_channels); 1678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->setChannels(channels); 1688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->setNumChannelsPtr(num_channels); 1698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Send the msg and wait for a response. */ 1718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->requestResponse(); 1728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret) { 1735ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error %d happened. ", __FUNCTION__, ret); 1748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 175b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 1778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 1788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 1798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 180b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_get_gscan_capabilities(wifi_interface_handle handle, 1828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_gscan_capabilities *capabilities) 1838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 184127a19b9711189fdee49643f035787c6ba59a8c3Subhani Shaik wifi_error ret = WIFI_SUCCESS; 1858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(handle); 1864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam hal_info *info = getHalInfo(wifiHandle); 187e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowi_cb_table_t *lowiWifiHalApi = NULL; 1884af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 1894af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!(info->supported_feature_set & WIFI_FEATURE_GSCAN)) { 190127a19b9711189fdee49643f035787c6ba59a8c3Subhani Shaik ALOGE("%s: GSCAN is not supported by driver", __FUNCTION__); 1914af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 192127a19b9711189fdee49643f035787c6ba59a8c3Subhani Shaik } 193127a19b9711189fdee49643f035787c6ba59a8c3Subhani Shaik 194127a19b9711189fdee49643f035787c6ba59a8c3Subhani Shaik if (capabilities == NULL) { 195127a19b9711189fdee49643f035787c6ba59a8c3Subhani Shaik ALOGE("%s: NULL capabilities pointer provided. Exit.", __FUNCTION__); 196127a19b9711189fdee49643f035787c6ba59a8c3Subhani Shaik return WIFI_ERROR_INVALID_ARGS; 1974af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 1984af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 199e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam /* Route GSCAN request through LOWI if supported */ 200e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi = getLowiCallbackTable(GSCAN_SUPPORTED); 201e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam if (lowiWifiHalApi == NULL || 202e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi->get_gscan_capabilities == NULL) { 203b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal ALOGV("%s: Sending cmd directly to host", __FUNCTION__); 204e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } else { 205127a19b9711189fdee49643f035787c6ba59a8c3Subhani Shaik ret = lowiWifiHalApi->get_gscan_capabilities(handle, capabilities); 206127a19b9711189fdee49643f035787c6ba59a8c3Subhani Shaik ALOGV("%s: lowi get_gscan_capabilities returned: %d. Exit.", __FUNCTION__, ret); 207127a19b9711189fdee49643f035787c6ba59a8c3Subhani Shaik return ret; 2088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 209b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 210127a19b9711189fdee49643f035787c6ba59a8c3Subhani Shaik memcpy(capabilities, &info->capa.gscan_capa, sizeof(wifi_gscan_capabilities)); 211b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 212127a19b9711189fdee49643f035787c6ba59a8c3Subhani Shaik return ret; 2138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 214b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_start_gscan(wifi_request_id id, 2168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_interface_handle iface, 2178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_scan_cmd_params params, 2188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_scan_result_handler handler) 219b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{ 2208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int ret = 0; 2218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 i, j; 2228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 2238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 2248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 2258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 2268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 num_scan_buckets, numChannelSpecs; 2278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_scan_bucket_spec bucketSpec; 2288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlBuckectSpecList; 2294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam hal_info *info = getHalInfo(wifiHandle); 230e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowi_cb_table_t *lowiWifiHalApi = NULL; 231864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gscan_event_handlers* event_handlers; 232864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanStartCmdEventHandler; 233864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam 234864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers = (gscan_event_handlers*)info->gscan_handlers; 235864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanStartCmdEventHandler = event_handlers->gscanStartCmdEventHandler; 2368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2374af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!(info->supported_feature_set & WIFI_FEATURE_GSCAN)) { 2384af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: GSCAN is not supported by driver", 2395ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 2404af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 241b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 242b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 243e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam /* Route GSCAN request through LOWI if supported */ 244e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi = getLowiCallbackTable(GSCAN_SUPPORTED); 245e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam if (lowiWifiHalApi == NULL || 246e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi->start_gscan == NULL) { 247b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal ALOGV("%s: Sending cmd directly to host", __FUNCTION__); 248e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } else { 249e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam ret = lowiWifiHalApi->start_gscan(id, iface, params, handler); 2503ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: lowi start_gscan " 251e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam "returned: %d. Exit.", __FUNCTION__, ret); 252e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam return (wifi_error)ret; 253e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } 254e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam 2553ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: RequestId:%d ", __FUNCTION__, id); 2564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam /* Wi-Fi HAL doesn't need to check if a similar request to start gscan was 2574af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * made earlier. If start_gscan() is called while another gscan is already 2584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * running, the request will be sent down to driver and firmware. If new 2594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * request is successfully honored, then Wi-Fi HAL will use the new request 260864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam * id for the gScanStartCmdEventHandler object. 2614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam */ 2628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 2638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 2648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 2658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 2668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_START); 2678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 2685ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error GScanCommand NULL", __FUNCTION__); 2698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 2708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 271b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 2738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 2748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 2758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 2768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 2788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 2798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 2808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 2818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 2838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 2848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 2858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 2868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam num_scan_buckets = (unsigned int)params.num_buckets > MAX_BUCKETS ? 2888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam MAX_BUCKETS : params.num_buckets; 2898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2903ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Base Period:%d Max_ap_per_scan:%d " 2915ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "Threshold_percent:%d Threshold_num_scans:%d " 2925ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "num_buckets:%d", __FUNCTION__, params.base_period, 2935ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik params.max_ap_per_scan, params.report_threshold_percent, 2945ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik params.report_threshold_num_scans, num_scan_buckets); 2958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_u32( 2968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 2978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id) || 2988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 2998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_BASE_PERIOD, 3008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam params.base_period) || 3018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 3028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_MAX_AP_PER_SCAN, 3038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam params.max_ap_per_scan) || 3048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 305261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_REPORT_THRESHOLD_PERCENT, 306930139593391038c89cb1e9f178fb15bd0e719b0Vinit Deshpande params.report_threshold_percent) || 3078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 308261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_REPORT_THRESHOLD_NUM_SCANS, 309261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam params.report_threshold_num_scans) || 3108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 3118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_NUM_BUCKETS, 3128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam num_scan_buckets)) 3138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 3148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 315b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 316b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 3178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlBuckectSpecList = 3188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_start(QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC); 3198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add NL attributes for scan bucket specs . */ 3208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam for (i = 0; i < num_scan_buckets; i++) { 3218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam bucketSpec = params.buckets[i]; 3228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam numChannelSpecs = (unsigned int)bucketSpec.num_channels > MAX_CHANNELS ? 3238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam MAX_CHANNELS : bucketSpec.num_channels; 3245ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik 3253ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Index: %d Bucket Id:%d Band:%d Period:%d ReportEvent:%d " 3267f2959f5a4565e5163d770b375e953a061440fa1Randy Pan "numChannelSpecs:%d max_period:%d base:%d step_count:%d", 3275ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, i, bucketSpec.bucket, bucketSpec.band, 3285ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik bucketSpec.period, bucketSpec.report_events, 3295ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik numChannelSpecs, bucketSpec.max_period, 3307f2959f5a4565e5163d770b375e953a061440fa1Randy Pan bucketSpec.base, bucketSpec.step_count); 3315ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik 3328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlBucketSpec = gScanCommand->attr_start(i); 3338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_u8( 3348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_INDEX, 3358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam bucketSpec.bucket) || 3368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 3378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_BAND, 3388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam bucketSpec.band) || 3398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 3408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_PERIOD, 3418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam bucketSpec.period) || 3428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 3438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_REPORT_EVENTS, 3448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam bucketSpec.report_events) || 3458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 3468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_NUM_CHANNEL_SPECS, 347261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam numChannelSpecs) || 348261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam gScanCommand->put_u32( 349261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_MAX_PERIOD, 350261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam bucketSpec.max_period) || 351261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam gScanCommand->put_u32( 3527f2959f5a4565e5163d770b375e953a061440fa1Randy Pan QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_BASE, 3537f2959f5a4565e5163d770b375e953a061440fa1Randy Pan bucketSpec.base) || 354261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam gScanCommand->put_u32( 355261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_STEP_COUNT, 356261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam bucketSpec.step_count)) 3578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 3588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 3598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 360b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 3618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nl_channelSpecList = 3628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_start(QCA_WLAN_VENDOR_ATTR_GSCAN_CHANNEL_SPEC); 3638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 3648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add NL attributes for scan channel specs . */ 3658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam for (j = 0; j < numChannelSpecs; j++) { 3668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nl_channelSpec = gScanCommand->attr_start(j); 3678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_scan_channel_spec channel_spec = bucketSpec.channels[j]; 3688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 3693ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Channel Spec Index:%d Channel:%d Dwell Time:%d " 3705ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "passive:%d", __FUNCTION__, j, channel_spec.channel, 3715ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik channel_spec.dwellTimeMs, channel_spec.passive); 3725ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik 3738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if ( gScanCommand->put_u32( 3748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_CHANNEL_SPEC_CHANNEL, 3758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam channel_spec.channel) || 3768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 3778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_CHANNEL_SPEC_DWELL_TIME, 3788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam channel_spec.dwellTimeMs) || 3798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 3808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_CHANNEL_SPEC_PASSIVE, 3818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam channel_spec.passive) ) 3828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 3838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 3848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 385b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 3868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nl_channelSpec); 387b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 3888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nl_channelSpecList); 3898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlBucketSpec); 3908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 3918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlBuckectSpecList); 3928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 3938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 394b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 3958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the callback handler functions for related events. */ 396ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif GScanCallbackHandler callbackHandler; 397ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif memset(&callbackHandler, 0, sizeof(callbackHandler)); 3988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.on_full_scan_result = handler.on_full_scan_result; 3998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.on_scan_event = handler.on_scan_event; 400ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 4018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create an object to handle the related events from firmware/driver. */ 402864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanStartCmdEventHandler == NULL) { 403864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanStartCmdEventHandler = new GScanCommandEventHandler( 4044af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam wifiHandle, 4054af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam id, 4064af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam OUI_QCA, 4074af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_START, 4084af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam callbackHandler); 409864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanStartCmdEventHandler == NULL) { 410864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam ALOGE("%s: Error gScanStartCmdEventHandler NULL", __FUNCTION__); 4114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ret = WIFI_ERROR_UNKNOWN; 4124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam goto cleanup; 4134af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 414864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers->gscanStartCmdEventHandler = gScanStartCmdEventHandler; 4154af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } else { 4167325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanStartCmdEventHandler->setCallbackHandler(callbackHandler); 4178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 418b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 419ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gScanCommand->requestResponse(); 4208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 4215ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s : requestResponse Error:%d", __FUNCTION__, ret); 4228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 4238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 424b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 425864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanStartCmdEventHandler != NULL) { 426864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanStartCmdEventHandler->set_request_id(id); 4277325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanStartCmdEventHandler->enableEventHandling(); 4284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 429b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 4318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 4327325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam /* Disable Event Handling if ret != 0 */ 4337325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (ret && gScanStartCmdEventHandler) { 4347325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam ALOGI("%s: Error ret:%d, disable event handling", 4355ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, ret); 4367325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanStartCmdEventHandler->disableEventHandling(); 437b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 4388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 439b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 441b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_stop_gscan(wifi_request_id id, 4438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_interface_handle iface) 4448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 4458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int ret = 0; 4468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 4478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 448e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowi_cb_table_t *lowiWifiHalApi = NULL; 449b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 4518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 4524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam hal_info *info = getHalInfo(wifiHandle); 453864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gscan_event_handlers* event_handlers; 454864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanStartCmdEventHandler; 455864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam 456864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers = (gscan_event_handlers*)info->gscan_handlers; 457864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanStartCmdEventHandler = event_handlers->gscanStartCmdEventHandler; 4584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 4594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!(info->supported_feature_set & WIFI_FEATURE_GSCAN)) { 4604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: GSCAN is not supported by driver", 4615ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 4624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 4634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 464b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 465e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam /* Route GSCAN request through LOWI if supported */ 466e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi = getLowiCallbackTable(GSCAN_SUPPORTED); 467e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam if (lowiWifiHalApi == NULL || 468e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi->stop_gscan == NULL) { 469b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal ALOGV("%s: Sending cmd directly to host", __FUNCTION__); 470e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } else { 471e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam ret = lowiWifiHalApi->stop_gscan(id, iface); 4723ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: lowi stop_gscan " 473e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam "returned: %d. Exit.", __FUNCTION__, ret); 474e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam return (wifi_error)ret; 475e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } 476e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam 4777325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (gScanStartCmdEventHandler == NULL || 4787325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanStartCmdEventHandler->isEventHandlingEnabled() == false) { 4795ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: GSCAN isn't running or already stopped. " 4805ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "Nothing to do. Exit", __FUNCTION__); 4818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_AVAILABLE; 482b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 483b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 4858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 4868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 4878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 4888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_STOP); 4898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 4905ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error GScanCommand NULL", __FUNCTION__); 4918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 492b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 493b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 4948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 4958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 4968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 4978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 4988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 4998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 5008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 5018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 5028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 5038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 5048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 5058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 5068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 5078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 5088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 5098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->put_u32( 5108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 5118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id); 5128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 5138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 5148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 5158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 5168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 517ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gScanCommand->requestResponse(); 5188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 5195ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: requestResponse Error:%d",__FUNCTION__, ret); 5208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 521b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 5227325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam /* Disable Event Handling. */ 5237325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (gScanStartCmdEventHandler) { 5247325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanStartCmdEventHandler->disableEventHandling(); 525b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 526b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 5278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 5288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 5298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 530b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 531b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 5328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Set the GSCAN BSSID Hotlist. */ 5338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_set_bssid_hotlist(wifi_request_id id, 5348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_interface_handle iface, 5358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_bssid_hotlist_params params, 5368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_hotlist_ap_found_handler handler) 5378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 5388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int i, numAp, ret = 0; 5398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 5408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData, *nlApThresholdParamList; 5418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 5428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 5434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam hal_info *info = getHalInfo(wifiHandle); 544e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowi_cb_table_t *lowiWifiHalApi = NULL; 545864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gscan_event_handlers* event_handlers; 546864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanSetBssidHotlistCmdEventHandler; 547864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam 548864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers = (gscan_event_handlers*)info->gscan_handlers; 549864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetBssidHotlistCmdEventHandler = 550864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers->gScanSetBssidHotlistCmdEventHandler; 5514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 5524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!(info->supported_feature_set & WIFI_FEATURE_GSCAN)) { 5534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: GSCAN is not supported by driver", 5545ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 5554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 5564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 558e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam /* Route request through LOWI if supported*/ 559e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi = getLowiCallbackTable(GSCAN_SUPPORTED); 560e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam if (lowiWifiHalApi == NULL || 561e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi->set_bssid_hotlist == NULL) { 562b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal ALOGV("%s: Sending cmd directly to host", __FUNCTION__); 563e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } else { 564e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam ret = lowiWifiHalApi->set_bssid_hotlist(id, iface, params,handler); 5653ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: lowi set_bssid_hotlist " 566e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam "returned: %d. Exit.", __FUNCTION__, ret); 567e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam return (wifi_error)ret; 568e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } 569e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam 5704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam /* Wi-Fi HAL doesn't need to check if a similar request to set bssid 5714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * hotlist was made earlier. If set_bssid_hotlist() is called while 5724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * another one is running, the request will be sent down to driver and 5734af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * firmware. If the new request is successfully honored, then Wi-Fi HAL 574864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam * will use the new request id for the gScanSetBssidHotlistCmdEventHandler 5754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * object. 5768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 577b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 5788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = 5798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam new GScanCommand( 5808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 5818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 5828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 5838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_BSSID_HOTLIST); 5848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 5855ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error GScanCommand NULL", __FUNCTION__); 5868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 587b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 588b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 5898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 5908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 5918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 5928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 5938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 5948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 5958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 5968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 5978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 5988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 5998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 6008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 6018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 6028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 6038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 604261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam numAp = (unsigned int)params.num_bssid > MAX_HOTLIST_APS ? 605261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam MAX_HOTLIST_APS : params.num_bssid; 6068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_u32( 6078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 6088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id) || 6098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 6104af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BSSID_HOTLIST_PARAMS_LOST_AP_SAMPLE_SIZE, 6114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam params.lost_ap_sample_size) || 6124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam gScanCommand->put_u32( 6138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_BSSID_HOTLIST_PARAMS_NUM_AP, 6148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam numAp)) 6158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 6168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 6178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 618b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6193ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: lost_ap_sample_size:%d numAp:%d", __FUNCTION__, 6205ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik params.lost_ap_sample_size, numAp); 6218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 6228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlApThresholdParamList = 6238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_start( 6248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM); 6258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlApThresholdParamList) 6268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 6278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 6288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add nested NL attributes for AP Threshold Param. */ 6298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam for (i = 0; i < numAp; i++) { 6308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ap_threshold_param apThreshold = params.ap[i]; 6318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlApThresholdParam = gScanCommand->attr_start(i); 6328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlApThresholdParam) 6338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 6348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_addr( 6358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_BSSID, 6368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam apThreshold.bssid) || 6378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_s32( 6388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_RSSI_LOW, 6398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam apThreshold.low) || 6408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_s32( 6418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_RSSI_HIGH, 642261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam apThreshold.high)) 6438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 6448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 645b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 6463ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Index:%d BssId: %hhx:%hhx:%hhx:%hhx:%hhx:%hhx " 6475ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "Threshold low:%d high:%d", __FUNCTION__, i, 6485ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik apThreshold.bssid[0], apThreshold.bssid[1], 6495ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik apThreshold.bssid[2], apThreshold.bssid[3], 6505ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik apThreshold.bssid[4], apThreshold.bssid[5], 6515ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik apThreshold.low, apThreshold.high); 6528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlApThresholdParam); 6538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 654b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlApThresholdParamList); 656b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 658b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 659ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif GScanCallbackHandler callbackHandler; 660ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif memset(&callbackHandler, 0, sizeof(callbackHandler)); 6618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.on_hotlist_ap_found = handler.on_hotlist_ap_found; 662261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam callbackHandler.on_hotlist_ap_lost = handler.on_hotlist_ap_lost; 663ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 6648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create an object of the event handler class to take care of the 6658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * asychronous events on the north-bound. 6668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 667864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanSetBssidHotlistCmdEventHandler == NULL) { 668864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetBssidHotlistCmdEventHandler = new GScanCommandEventHandler( 6698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 6708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 6718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 6728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_BSSID_HOTLIST, 6738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler); 674864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanSetBssidHotlistCmdEventHandler == NULL) { 6754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Error instantiating " 676864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam "gScanSetBssidHotlistCmdEventHandler.", __FUNCTION__); 6774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ret = WIFI_ERROR_UNKNOWN; 6784af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam goto cleanup; 6794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 680864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers->gScanSetBssidHotlistCmdEventHandler = 681864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetBssidHotlistCmdEventHandler; 6824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } else { 6837325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanSetBssidHotlistCmdEventHandler->setCallbackHandler(callbackHandler); 684b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 685b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 686ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gScanCommand->requestResponse(); 6878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 6885ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: requestResponse Error:%d",__FUNCTION__, ret); 6898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 690b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 691b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 692864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanSetBssidHotlistCmdEventHandler != NULL) { 693864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetBssidHotlistCmdEventHandler->set_request_id(id); 6947325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanSetBssidHotlistCmdEventHandler->enableEventHandling(); 6954af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 696b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 6978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 6988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 6997325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam /* Disable Event Handling if ret != 0 */ 7007325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (ret && gScanSetBssidHotlistCmdEventHandler) { 7017325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam ALOGI("%s: Error ret:%d, disable event handling", 7027325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam __FUNCTION__, ret); 7037325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanSetBssidHotlistCmdEventHandler->disableEventHandling(); 7048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 7058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 7068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 707b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_reset_bssid_hotlist(wifi_request_id id, 7098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_interface_handle iface) 7108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 7118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int ret = 0; 7128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 7138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 7148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 7158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 7164af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam hal_info *info = getHalInfo(wifiHandle); 717e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowi_cb_table_t *lowiWifiHalApi = NULL; 718864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gscan_event_handlers* event_handlers; 719864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanSetBssidHotlistCmdEventHandler; 720864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam 721864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers = (gscan_event_handlers*)info->gscan_handlers; 722864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetBssidHotlistCmdEventHandler = 723864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers->gScanSetBssidHotlistCmdEventHandler; 7244af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 7254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!(info->supported_feature_set & WIFI_FEATURE_GSCAN)) { 7264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: GSCAN is not supported by driver", 7275ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 7284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 7294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 7308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 731e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam /* Route request through LOWI if supported*/ 732e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi = getLowiCallbackTable(GSCAN_SUPPORTED); 733e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam if (lowiWifiHalApi == NULL || 734e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi->reset_bssid_hotlist == NULL) { 735b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal ALOGV("%s: Sending cmd directly to host", __FUNCTION__); 736e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } else { 737e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam ret = lowiWifiHalApi->reset_bssid_hotlist(id, iface); 7383ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: lowi reset_bssid_hotlist " 739e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam "returned: %d. Exit.", __FUNCTION__, ret); 740e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam return (wifi_error)ret; 741e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } 742e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam 7438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7447325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (gScanSetBssidHotlistCmdEventHandler == NULL || 7457325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam (gScanSetBssidHotlistCmdEventHandler->isEventHandlingEnabled() == 7467325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam false)) { 7474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("wifi_reset_bssid_hotlist: GSCAN bssid_hotlist isn't set. " 7484af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam "Nothing to do. Exit"); 7494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_AVAILABLE; 7508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 751b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 7538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 7548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 7558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 7568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_RESET_BSSID_HOTLIST); 757b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 7595ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error GScanCommand NULL", __FUNCTION__); 7608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 7618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 762b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 7648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 7658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 7668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 7678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 7698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 7708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 7718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 7728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 7748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 7758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 7768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 7778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->put_u32( 7798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, id); 7808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 7818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 7828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 7838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 7848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 785ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gScanCommand->requestResponse(); 7868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 7875ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: requestResponse Error:%d",__FUNCTION__, ret); 7888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 789b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7907325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam /* Disable Event Handling. */ 7917325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (gScanSetBssidHotlistCmdEventHandler) { 7927325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanSetBssidHotlistCmdEventHandler->disableEventHandling(); 793b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 794b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 7958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 7968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 7978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 7988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 7998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 8008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Set the GSCAN Significant AP Change list. */ 8018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_set_significant_change_handler(wifi_request_id id, 8028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_interface_handle iface, 8038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_significant_change_params params, 8048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_significant_change_handler handler) 8058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 8068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int i, numAp, ret = 0; 8078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 8088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData, *nlApThresholdParamList; 8098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 8108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 8114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam hal_info *info = getHalInfo(wifiHandle); 812e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowi_cb_table_t *lowiWifiHalApi = NULL; 813864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gscan_event_handlers* event_handlers; 814864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanSetSignificantChangeCmdEventHandler; 815864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam 816864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers = (gscan_event_handlers*)info->gscan_handlers; 817864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetSignificantChangeCmdEventHandler = 818864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers->gScanSetSignificantChangeCmdEventHandler; 8194af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 8204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!(info->supported_feature_set & WIFI_FEATURE_GSCAN)) { 8214af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: GSCAN is not supported by driver", 8225ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 8234af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 8244af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 8258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 826e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam /* Route request through LOWI if supported*/ 827e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi = getLowiCallbackTable(GSCAN_SUPPORTED); 828e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam if (lowiWifiHalApi == NULL || 829e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi->set_significant_change_handler == NULL) { 830b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal ALOGV("%s: Sending cmd directly to host", __FUNCTION__); 831e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } else { 832e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam ret = lowiWifiHalApi->set_significant_change_handler(id, 833e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam iface, 834e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam params, 835e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam handler); 8363ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: lowi set_significant_change_handler " 837e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam "returned: %d. Exit.", __FUNCTION__, ret); 838e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam return (wifi_error)ret; 839e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } 840e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam 8414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam /* Wi-Fi HAL doesn't need to check if a similar request to set significant 8424af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * change list was made earlier. If set_significant_change() is called while 8434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * another one is running, the request will be sent down to driver and 8444af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * firmware. If the new request is successfully honored, then Wi-Fi HAL 845864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam * will use the new request id for the gScanSetSignificantChangeCmdEventHandler 8464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * object. 8478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 848b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 8498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 8508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 8518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 8528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 8538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_SIGNIFICANT_CHANGE); 8548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 8555ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error GScanCommand NULL", __FUNCTION__); 8568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 857b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 858b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 8598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 8608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 8618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 8628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 8638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 8648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 8658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 8668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 8678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 8688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 8698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 8708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 8718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 8728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 8738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 874fccbb652cf217a07217306fcf1b2e3d34bd67c98Vinit Deshpande numAp = (unsigned int)params.num_bssid > MAX_SIGNIFICANT_CHANGE_APS ? 875fccbb652cf217a07217306fcf1b2e3d34bd67c98Vinit Deshpande MAX_SIGNIFICANT_CHANGE_APS : params.num_bssid; 8768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 8778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_u32( 8788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 8798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id) || 8808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 8818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SIGNIFICANT_CHANGE_PARAMS_RSSI_SAMPLE_SIZE, 8828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam params.rssi_sample_size) || 8838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 8848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SIGNIFICANT_CHANGE_PARAMS_LOST_AP_SAMPLE_SIZE, 8858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam params.lost_ap_sample_size) || 8868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 8878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SIGNIFICANT_CHANGE_PARAMS_MIN_BREACHING, 8888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam params.min_breaching) || 8898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 8908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SIGNIFICANT_CHANGE_PARAMS_NUM_AP, 8918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam numAp)) 8928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 8938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 894b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 895b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 8963ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Number of AP params:%d Rssi_sample_size:%d " 8975ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "lost_ap_sample_size:%d min_breaching:%d", __FUNCTION__, 8985ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik numAp, params.rssi_sample_size, params.lost_ap_sample_size, 8995ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik params.min_breaching); 9005ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik 9018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 9028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlApThresholdParamList = 9038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_start( 9048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM); 9058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlApThresholdParamList) 9068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 9078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 9088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add nested NL attributes for AP Threshold Param list. */ 9098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam for (i = 0; i < numAp; i++) { 9108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ap_threshold_param apThreshold = params.ap[i]; 9118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlApThresholdParam = gScanCommand->attr_start(i); 9128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlApThresholdParam) 9138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 9148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if ( gScanCommand->put_addr( 9158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_BSSID, 9168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam apThreshold.bssid) || 9178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_s32( 9188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_RSSI_LOW, 9198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam apThreshold.low) || 9208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_s32( 9218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_RSSI_HIGH, 922261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam apThreshold.high)) 9238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 9248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 9258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 9263ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: ap[%d].bssid:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx " 9275ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "ap[%d].low:%d ap[%d].high:%d", __FUNCTION__, 9285ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik i, 9295ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik apThreshold.bssid[0], apThreshold.bssid[1], 9305ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik apThreshold.bssid[2], apThreshold.bssid[3], 9315ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik apThreshold.bssid[4], apThreshold.bssid[5], 9325ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik i, apThreshold.low, i, apThreshold.high); 9338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlApThresholdParam); 9348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 935b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlApThresholdParamList); 937b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 939b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 940ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif GScanCallbackHandler callbackHandler; 941ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif memset(&callbackHandler, 0, sizeof(callbackHandler)); 9428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler.on_significant_change = handler.on_significant_change; 943ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 9448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create an object of the event handler class to take care of the 9458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * asychronous events on the north-bound. 9468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 947864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanSetSignificantChangeCmdEventHandler == NULL) { 948864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetSignificantChangeCmdEventHandler = 9494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam new GScanCommandEventHandler( 9508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 9518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 9528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 9538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_SIGNIFICANT_CHANGE, 9548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam callbackHandler); 955864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanSetSignificantChangeCmdEventHandler == NULL) { 9564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Error in instantiating, " 957864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam "gScanSetSignificantChangeCmdEventHandler.", 9585ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 9594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ret = WIFI_ERROR_UNKNOWN; 9604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam goto cleanup; 9614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 962864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers->gScanSetSignificantChangeCmdEventHandler = 963864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetSignificantChangeCmdEventHandler; 9644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } else { 9657325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanSetSignificantChangeCmdEventHandler->setCallbackHandler(callbackHandler); 9668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 967b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 968ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gScanCommand->requestResponse(); 9698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 9705ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: requestResponse Error:%d",__FUNCTION__, ret); 9718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 9728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 973b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 974864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanSetSignificantChangeCmdEventHandler != NULL) { 975864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetSignificantChangeCmdEventHandler->set_request_id(id); 9767325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanSetSignificantChangeCmdEventHandler->enableEventHandling(); 9774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 978b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 9807325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam /* Disable Event Handling if ret != 0 */ 9817325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (ret && gScanSetSignificantChangeCmdEventHandler) { 9827325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam ALOGI("%s: Error ret:%d, disable event handling", 9837325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam __FUNCTION__, ret); 9847325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanSetSignificantChangeCmdEventHandler->disableEventHandling(); 9858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 9868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 9878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 988b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 989b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 9908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Clear the GSCAN Significant AP change list. */ 9918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_reset_significant_change_handler(wifi_request_id id, 9928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_interface_handle iface) 9938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 9948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int ret = 0; 9958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 9968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 9978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 9988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 9994af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam hal_info *info = getHalInfo(wifiHandle); 1000e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowi_cb_table_t *lowiWifiHalApi = NULL; 1001864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gscan_event_handlers* event_handlers; 1002864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanSetSignificantChangeCmdEventHandler; 1003864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam 1004864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers = (gscan_event_handlers*)info->gscan_handlers; 1005864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetSignificantChangeCmdEventHandler = 1006864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers->gScanSetSignificantChangeCmdEventHandler; 10074af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 10084af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!(info->supported_feature_set & WIFI_FEATURE_GSCAN)) { 10094af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: GSCAN is not supported by driver", 10105ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 10114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 10124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 10138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1014e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam /* Route request through LOWI if supported*/ 1015e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi = getLowiCallbackTable(GSCAN_SUPPORTED); 1016e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam if (lowiWifiHalApi == NULL || 1017e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi->reset_significant_change_handler == NULL) { 1018b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal ALOGV("%s: Sending cmd directly to host", __FUNCTION__); 1019e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } else { 1020e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam ret = lowiWifiHalApi->reset_significant_change_handler(id, iface); 10213ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: lowi reset_significant_change_handler " 1022e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam "returned: %d. Exit.", __FUNCTION__, ret); 1023e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam return (wifi_error)ret; 1024e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } 1025e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam 10267325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (gScanSetSignificantChangeCmdEventHandler == NULL || 10277325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam (gScanSetSignificantChangeCmdEventHandler->isEventHandlingEnabled() == 10287325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam false)) { 10294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("wifi_reset_significant_change_handler: GSCAN significant_change" 10304af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam " isn't set. Nothing to do. Exit"); 10314af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_AVAILABLE; 10328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1033b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 10348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = 10358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam new GScanCommand 10368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ( 10378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 10388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id, 10398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 10408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_RESET_SIGNIFICANT_CHANGE); 10418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 10425ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error GScanCommand NULL", __FUNCTION__); 10438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 10448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1045b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 10468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 10478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 10488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 10498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 10508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 10528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 10538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 10548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 10558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 10578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 10588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 10598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 10608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->put_u32( 10628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 10638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam id); 10648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 10658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 10668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 10688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1069ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gScanCommand->requestResponse(); 10708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret != 0) { 10715ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: requestResponse Error:%d",__FUNCTION__, ret); 10728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1073b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 10747325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam /* Disable Event Handling. */ 10757325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (gScanSetSignificantChangeCmdEventHandler) { 10767325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanSetSignificantChangeCmdEventHandler->disableEventHandling(); 10778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1078b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 10798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 10808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 10818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 10828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1083b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 10848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Get the GSCAN cached scan results. */ 10858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_get_cached_gscan_results(wifi_interface_handle iface, 1086261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam byte flush, int max, 1087261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam wifi_cached_scan_results *results, 1088261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam int *num) 10898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 1090ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif int requestId, ret = 0, retRequestRsp = 0; 10918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam GScanCommand *gScanCommand; 10928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct nlattr *nlData; 1093e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowi_cb_table_t *lowiWifiHalApi = NULL; 10948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 10958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 10968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 10974af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam hal_info *info = getHalInfo(wifiHandle); 10984af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 10994af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!(info->supported_feature_set & WIFI_FEATURE_GSCAN)) { 11004af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: GSCAN is not supported by driver", 11015ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 11024af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 11034af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 11048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1105e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam /* Route GSCAN request through LOWI if supported */ 1106e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi = getLowiCallbackTable(GSCAN_SUPPORTED); 1107e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam if (lowiWifiHalApi == NULL || 1108e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam lowiWifiHalApi->get_cached_gscan_results == NULL) { 1109b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal ALOGV("%s: Sending cmd directly to host", __FUNCTION__); 1110e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } else { 1111e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam ret = lowiWifiHalApi->get_cached_gscan_results(iface, 1112e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam flush, 1113e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam max, 1114e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam results, 1115e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam num); 11163ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: lowi get_cached_gscan_results" 1117e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam "returned: %d. Exit.", __FUNCTION__, ret); 1118e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam return (wifi_error)ret; 1119e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam } 1120e0d30a0148b9a6fc9d54cc190f26b5b069e93647Amarnath Hullur Subramanyam 11218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* No request id from caller, so generate one and pass it on to the driver. */ 11228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Generate it randomly */ 11232d953ba14654205d59c3214217a1fa4e0cd0dc33Subhani Shaik requestId = get_requestid(); 11248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11255ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik if (results == NULL || num == NULL) { 11265ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: NULL pointer provided. Exit.", 11275ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 11285ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik return WIFI_ERROR_INVALID_ARGS; 11295ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik } 11308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand = new GScanCommand( 11328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifiHandle, 11338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId, 11348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam OUI_QCA, 11358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CACHED_RESULTS); 11368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand == NULL) { 11375ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error GScanCommand NULL", __FUNCTION__); 11388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 11398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1140b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1141ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gScanCommand->allocRspParams(eGScanGetCachedResultsRspParams); 1142ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (ret != 0) { 1143ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ALOGE("%s: Failed to allocate memory for response struct. Error:%d", 11445ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, ret); 1145ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif goto cleanup; 1146ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 11478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 1148ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gScanCommand->allocCachedResultsTemp(max, results); 1149ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (ret != 0) { 1150ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ALOGE("%s: Failed to allocate memory for temp gscan cached list. " 11515ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "Error:%d", __FUNCTION__, ret); 11528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1153ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1154ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 1155ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Clear the destination cached results list before copying results. */ 1156ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif memset(results, 0, max * sizeof(wifi_cached_scan_results)); 11578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Create the NL message. */ 11598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->create(); 11608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 11618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 11628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Set the interface Id of the message. */ 11648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 11658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 11668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 11678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 11698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 11708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!nlData) 11718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 11728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 11748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 11758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 11768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (gScanCommand->put_u32( 11778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 11788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam requestId) || 11798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u8( 11808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_GET_CACHED_SCAN_RESULTS_CONFIG_PARAM_FLUSH, 11818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam flush) || 11828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->put_u32( 11838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_GET_CACHED_SCAN_RESULTS_CONFIG_PARAM_MAX, 11848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam max)) 11858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 11868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 11878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1188261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 11893ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: flush:%d max:%d", __FUNCTION__, flush, max); 11908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 1191261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 1192ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif retRequestRsp = gScanCommand->requestResponse(); 1193ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (retRequestRsp != 0) { 1194ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ALOGE("%s: requestResponse Error:%d", 11955ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, retRequestRsp); 1196ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (retRequestRsp != -ETIMEDOUT) { 1197ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Proceed to cleanup & return no results */ 11988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto cleanup; 1199b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 12008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1201ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 1202261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam /* No more data, copy the parsed results into the caller's results array */ 1203ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gScanCommand->copyCachedScanResults(num, results); 12043ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: max: %d, num:%d", __FUNCTION__, max, *num); 1205261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 12068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!ret) { 1207ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* If requestResponse returned a TIMEOUT */ 1208ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (retRequestRsp == -ETIMEDOUT) { 1209ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (*num > 0) { 1210ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Mark scan results as incomplete for the last scan_id */ 1211ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif results[(*num)-1].flags = WIFI_SCAN_FLAG_INTERRUPTED; 1212b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal ALOGV("%s: Timeout happened. Mark scan results as incomplete " 12135ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "for scan_id:%d", __FUNCTION__, results[(*num)-1].scan_id); 1214ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = WIFI_SUCCESS; 1215ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } else 1216ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = WIFI_ERROR_TIMED_OUT; 1217b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 12188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 12198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup: 12208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gScanCommand->freeRspParams(eGScanGetCachedResultsRspParams); 12218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam delete gScanCommand; 12228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return (wifi_error)ret; 12238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1224b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam/* Random MAC OUI for PNO */ 12264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamwifi_error wifi_set_scanning_mac_oui(wifi_interface_handle handle, oui scan_oui) 1227930139593391038c89cb1e9f178fb15bd0e719b0Vinit Deshpande{ 12284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam int ret = 0; 12294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam struct nlattr *nlData; 12304af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam WifiVendorCommand *vCommand = NULL; 12314af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam interface_info *iinfo = getIfaceInfo(handle); 12324af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(handle); 1233930139593391038c89cb1e9f178fb15bd0e719b0Vinit Deshpande 12344af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam vCommand = new WifiVendorCommand(wifiHandle, 0, 12354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam OUI_QCA, 12364af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_SCANNING_MAC_OUI); 12374af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (vCommand == NULL) { 12385ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error vCommand NULL", __FUNCTION__); 1239930139593391038c89cb1e9f178fb15bd0e719b0Vinit Deshpande return WIFI_ERROR_OUT_OF_MEMORY; 1240930139593391038c89cb1e9f178fb15bd0e719b0Vinit Deshpande } 1241930139593391038c89cb1e9f178fb15bd0e719b0Vinit Deshpande 12424af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam /* create the message */ 12434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ret = vCommand->create(); 12444af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (ret < 0) 12454af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam goto cleanup; 1246930139593391038c89cb1e9f178fb15bd0e719b0Vinit Deshpande 12474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ret = vCommand->set_iface_id(iinfo->name); 12484af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (ret < 0) 12494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam goto cleanup; 1250930139593391038c89cb1e9f178fb15bd0e719b0Vinit Deshpande 12514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 12524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam nlData = vCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 12534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!nlData) 12544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam goto cleanup; 12558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 12563ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: MAC_OUI - %02x:%02x:%02x", __FUNCTION__, 125719f0819fa32aec7c330b4d7ca962700230c8acb1Amarnath Hullur Subramanyam scan_oui[0], scan_oui[1], scan_oui[2]); 1258b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam /* Add the fixed part of the mac_oui to the nl command */ 12604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ret = vCommand->put_bytes( 12614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_SET_SCANNING_MAC_OUI, 12624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (char *)scan_oui, 12634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam WIFI_SCANNING_MAC_OUI_LENGTH); 12644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (ret < 0) 12654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam goto cleanup; 1266b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam vCommand->attr_end(nlData); 1268b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ret = vCommand->requestResponse(); 12704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (ret != 0) { 12715ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: requestResponse Error:%d",__FUNCTION__, ret); 12724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam goto cleanup; 1273b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 1274b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamcleanup: 12764af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam delete vCommand; 12774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return (wifi_error)ret; 1278b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 1279b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1280b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur SubramanyamGScanCommand::GScanCommand(wifi_handle handle, int id, u32 vendor_id, 12828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam u32 subcmd) 12838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam : WifiVendorCommand(handle, id, vendor_id, subcmd) 12848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 12858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Initialize the member data variables here */ 12868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams = NULL; 12878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mChannels = NULL; 12888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mMaxChannels = 0; 12898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mNumChannelsPtr = NULL; 12908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 12918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mRequestId = id; 12928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam memset(&mHandler, 0,sizeof(mHandler)); 12938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1294b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 12958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur SubramanyamGScanCommand::~GScanCommand() 12968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 12978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam unregisterVendorHandler(mVendor_id, mSubcmd); 12988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 1299b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1300b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* This function implements creation of Vendor command */ 13028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::create() { 13038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int ret = mMsg.create(NL80211_CMD_VENDOR, 0, 0); 13048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) { 13058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return ret; 1306b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 1307b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Insert the oui in the msg */ 13098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = mMsg.put_u32(NL80211_ATTR_VENDOR_ID, mVendor_id); 13108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 13118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto out; 13128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam /* Insert the subcmd in the msg */ 13138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = mMsg.put_u32(NL80211_ATTR_VENDOR_SUBCMD, mSubcmd); 13148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (ret < 0) 13158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam goto out; 1316b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 13179f6b52c5f461fe01b9f266a3f1663a2acfb286d8mukesh agrawal ALOGV("%s: mVendor_id = %d, Subcmd = %d.", 13185ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, mVendor_id, mSubcmd); 13198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamout: 13208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return ret; 1321b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 1322b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1323ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaifint GScanCommand::requestResponse() 13248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 1325ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif return WifiCommand::requestResponse(mMsg); 1326ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif} 1327b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1328ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaifint GScanCommand::handleResponse(WifiEvent &reply) { 1329ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif int i = 0; 1330ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif int ret = WIFI_SUCCESS; 1331ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif u32 val; 1332b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1333ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif WifiVendorCommand::handleResponse(reply); 1334b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1335ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif struct nlattr *tbVendor[ 1336ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX + 1]; 1337ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif nla_parse(tbVendor, QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX, 1338ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif (struct nlattr *)mVendorData,mDataLen, NULL); 1339b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1340ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif switch(mSubcmd) 1341ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif { 1342ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_VALID_CHANNELS: 1343ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif { 1344ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (!tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_CHANNELS]) { 1345ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_CHANNELS" 13465ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik " not found", __FUNCTION__); 1347ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = WIFI_ERROR_INVALID_ARGS; 1348ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif break; 1349ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1350ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif val = nla_get_u32(tbVendor[ 1351ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_CHANNELS]); 1352ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 1353ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif val = val > (unsigned int)mMaxChannels ? 1354ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif (unsigned int)mMaxChannels : val; 1355ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif *mNumChannelsPtr = val; 1356ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 1357ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Extract the list of channels. */ 1358ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (*mNumChannelsPtr > 0 ) { 1359ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (!tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CHANNELS]) { 1360ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CHANNELS" 13615ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik " not found", __FUNCTION__); 1362ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = WIFI_ERROR_INVALID_ARGS; 1363ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif break; 1364ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1365ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif nla_memcpy(mChannels, 1366ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif tbVendor[ 1367ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CHANNELS], 1368ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif sizeof(wifi_channel) * (*mNumChannelsPtr)); 1369ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1370f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch char buf[256]; 137193022ce448414130b4241c6920797c1dc1df2250mukesh agrawal size_t len = 0; 137293022ce448414130b4241c6920797c1dc1df2250mukesh agrawal for (i = 0; i < *mNumChannelsPtr && len < sizeof(buf); i++) { 1373f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch len += snprintf(buf + len, sizeof(buf) - len, "%u ", 137493022ce448414130b4241c6920797c1dc1df2250mukesh agrawal *(mChannels + i)); 1375ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 137693022ce448414130b4241c6920797c1dc1df2250mukesh agrawal ALOGV("%s: Num Channels %d: List of valid channels are: %s", 137793022ce448414130b4241c6920797c1dc1df2250mukesh agrawal __FUNCTION__, *mNumChannelsPtr, buf); 137893022ce448414130b4241c6920797c1dc1df2250mukesh agrawal 1379ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1380ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif break; 1381ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CACHED_RESULTS: 1382ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif { 1383ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif wifi_request_id id; 1384ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif u32 numResults = 0; 1385ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif int firstScanIdInPatch = -1; 1386b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1387ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (!tbVendor[ 1388ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_REQUEST_ID]) { 1389ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ALOGE("%s: GSCAN_RESULTS_REQUEST_ID not" 13905ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "found", __FUNCTION__); 1391ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = WIFI_ERROR_INVALID_ARGS; 1392ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif break; 1393ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1394ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif id = nla_get_u32( 1395ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_REQUEST_ID] 1396ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ); 1397ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* If this is not for us, just ignore it. */ 1398ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (id != mRequestId) { 1399a58ccfb90f6608d378d04ee655113620afdf00bcmukesh agrawal ALOGV("%s: Event has Req. ID:%d <> ours:%d", 14005ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, id, mRequestId); 1401ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif break; 1402ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1403ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (!tbVendor[ 1404ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_RESULTS_AVAILABLE]) { 1405ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ALOGE("%s: GSCAN_RESULTS_NUM_RESULTS_AVAILABLE not" 14065ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "found", __FUNCTION__); 1407ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = WIFI_ERROR_INVALID_ARGS; 1408ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif break; 1409ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1410ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Read num of cached scan results in this data chunk. Note that 1411ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif * this value doesn't represent the number of unique gscan scan Ids 14120910ea7ebdb95e00b3173dee28a2f0b34f2a0233Amarnath Hullur Subramanyam * since the first scan id in this new chunk could be similar to 14130910ea7ebdb95e00b3173dee28a2f0b34f2a0233Amarnath Hullur Subramanyam * the last scan id in the previous chunk. 1414ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif */ 1415ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif numResults = nla_get_u32(tbVendor[ 1416ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_RESULTS_AVAILABLE]); 1417a58ccfb90f6608d378d04ee655113620afdf00bcmukesh agrawal ALOGV("%s: num Cached results in this fragment:%d", 14185ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, numResults); 1419b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1420ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (!mGetCachedResultsRspParams) { 1421ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ALOGE("%s: mGetCachedResultsRspParams is NULL, exit.", 14225ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 1423ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = WIFI_ERROR_INVALID_ARGS; 1424ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif break; 1425ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1426b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1427ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* To support fragmentation from firmware, monitor the 1428ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif * MORE_DATA flag and cache results until MORE_DATA = 0. 1429ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif */ 1430ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (!tbVendor[ 1431ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_MORE_DATA]) { 1432ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ALOGE("%s: GSCAN_RESULTS_NUM_RESULTS_MORE_DATA " 14335ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "not found", __FUNCTION__); 1434ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = WIFI_ERROR_INVALID_ARGS; 1435ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif break; 1436ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } else { 1437ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif mGetCachedResultsRspParams->more_data = nla_get_u8( 1438ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif tbVendor[ 1439ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_MORE_DATA]); 1440ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1441b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 1442ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* No data in this chunk so skip this chunk */ 1443ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (numResults == 0) { 1444ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif return NL_SKIP; 1445ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1446ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 1447ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (!tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_CACHED_RESULTS_SCAN_ID]) { 1448ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ALOGE("GSCAN_CACHED_RESULTS_SCAN_ID not found"); 1449ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = WIFI_ERROR_INVALID_ARGS; 1450ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif break; 1451ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1452ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 1453ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Get the first Scan-Id in this chuck of cached results. */ 1454ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif firstScanIdInPatch = nla_get_u32(tbVendor[ 1455ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif QCA_WLAN_VENDOR_ATTR_GSCAN_CACHED_RESULTS_SCAN_ID]); 1456ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 1457a58ccfb90f6608d378d04ee655113620afdf00bcmukesh agrawal ALOGV("More data: %d, firstScanIdInPatch: %d, lastProcessedScanId: %d", 14585ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik mGetCachedResultsRspParams->more_data, firstScanIdInPatch, 1459ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif mGetCachedResultsRspParams->lastProcessedScanId); 1460ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 1461ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (numResults) { 1462ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (firstScanIdInPatch != 1463ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif mGetCachedResultsRspParams->lastProcessedScanId) { 1464ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* New result scan Id block, update the starting index. */ 1465ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif mGetCachedResultsRspParams->cachedResultsStartingIndex++; 14668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1467ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 1468ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gscan_get_cached_results( 1469ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif mGetCachedResultsRspParams->cached_results, 1470ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif tbVendor); 1471ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* If a parsing error occurred, exit and proceed for cleanup. */ 1472ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (ret) 1473ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif break; 14748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1475ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1476ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif break; 1477ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif default: 1478ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Error case should not happen print log */ 14798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ALOGE("%s: Wrong GScan subcmd response received %d", 14805ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, mSubcmd); 14818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 1482ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 1483ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* A parsing error occurred, do the cleanup of gscan result lists. */ 1484ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (ret) { 1485ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif switch(mSubcmd) 1486ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif { 1487ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CACHED_RESULTS: 1488ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif { 1489ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ALOGE("%s: Parsing error, free CachedResultsRspParams", 14905ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 1491ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif freeRspParams(eGScanGetCachedResultsRspParams); 1492ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1493ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif break; 1494ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif default: 14955ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Wrong GScan subcmd received %d", __FUNCTION__, mSubcmd); 1496ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 1497ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif } 14988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return NL_SKIP; 1499b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 1500b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 15018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Called to parse and extract cached results. */ 1502ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaifint GScanCommand:: gscan_get_cached_results( 1503ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif wifi_cached_scan_results *cached_results, 1504ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif struct nlattr **tb_vendor) 1505b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{ 1506ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif u32 j = 0; 1507261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam struct nlattr *scanResultsInfo, *wifiScanResultsInfo; 15080910ea7ebdb95e00b3173dee28a2f0b34f2a0233Amarnath Hullur Subramanyam int rem = 0, remResults = 0; 1509ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif u32 len = 0, numScanResults = 0; 1510ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif u32 i = mGetCachedResultsRspParams->cachedResultsStartingIndex; 1511a58ccfb90f6608d378d04ee655113620afdf00bcmukesh agrawal ALOGV("%s: starting counter: %d", __FUNCTION__, i); 15128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 15138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam for (scanResultsInfo = (struct nlattr *) nla_data(tb_vendor[ 1514261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_CACHED_RESULTS_LIST]), 1515261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam rem = nla_len(tb_vendor[ 1516ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif QCA_WLAN_VENDOR_ATTR_GSCAN_CACHED_RESULTS_LIST]); 1517261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_ok(scanResultsInfo, rem) && i < mGetCachedResultsRspParams->max; 1518261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam scanResultsInfo = nla_next(scanResultsInfo, &(rem))) 1519261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam { 1520261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam struct nlattr *tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX + 1]; 1521261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_parse(tb2, QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX, 1522261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam (struct nlattr *) nla_data(scanResultsInfo), 1523261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_len(scanResultsInfo), NULL); 1524261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 1525261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (! 1526261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb2[ 1527261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_CACHED_RESULTS_SCAN_ID 1528261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ]) 1529261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam { 15305ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: GSCAN_CACHED_RESULTS_SCAN_ID" 15315ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik " not found", __FUNCTION__); 1532261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1533261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1534261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].scan_id = 1535261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_get_u32( 1536261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb2[ 1537261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_CACHED_RESULTS_SCAN_ID 1538261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ]); 1539261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 1540261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (! 1541261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb2[ 1542261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_CACHED_RESULTS_FLAGS 1543261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ]) 1544261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam { 15455ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: GSCAN_CACHED_RESULTS_FLAGS " 15465ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "not found", __FUNCTION__); 1547261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1548261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1549261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].flags = 1550261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_get_u32( 1551261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_CACHED_RESULTS_FLAGS]); 1552261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 15530562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik if (!tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_BUCKETS_SCANNED]) 15540562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik { 15550562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik ALOGI("%s: GSCAN_RESULTS_BUCKETS_SCANNED" 15560562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik "not found", __FUNCTION__); 15570562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik } else { 15580562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik cached_results[i].buckets_scanned = nla_get_u32( 15590562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_BUCKETS_SCANNED]); 15600562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik } 15610562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik 1562261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (! 1563261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb2[ 1564261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_RESULTS_AVAILABLE 1565261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ]) 1566261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam { 15675ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: RESULTS_NUM_RESULTS_AVAILABLE " 15685ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "not found", __FUNCTION__); 1569261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1570261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1571ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif numScanResults = 1572261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_get_u32( 1573261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_RESULTS_AVAILABLE]); 1574261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 1575261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (mGetCachedResultsRspParams->lastProcessedScanId != 1576261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].scan_id) { 1577ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif j = 0; /* reset wifi_scan_result counter */ 1578ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif cached_results[i].num_results = 0; 1579b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal ALOGV("parsing: *lastProcessedScanId [%d] !=" 15805ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik " cached_results[%d].scan_id:%d, j:%d " 15815ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "numScanResults: %d", 15825ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik mGetCachedResultsRspParams->lastProcessedScanId, i, 15835ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik cached_results[i].scan_id, j, numScanResults); 1584261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam mGetCachedResultsRspParams->lastProcessedScanId = 15855ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik cached_results[i].scan_id; 1586ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif mGetCachedResultsRspParams->wifiScanResultsStartingIndex = 0; 1587ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Increment the number of cached scan results received */ 1588ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif mGetCachedResultsRspParams->num_cached_results++; 1589261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } else { 1590261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam j = mGetCachedResultsRspParams->wifiScanResultsStartingIndex; 1591b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal ALOGV("parsing: *lastProcessedScanId [%d] == " 15925ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "cached_results[%d].scan_id:%d, j:%d " 15935ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "numScanResults:%d", 15945ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik mGetCachedResultsRspParams->lastProcessedScanId, i, 15955ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik cached_results[i].scan_id, j, numScanResults); 1596261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1597261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 1598be8f0785899b5f2305fb40e206a721baeecbc2f1mukesh agrawal ALOGV("%s: scan_id %d ", __FUNCTION__, 1599261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].scan_id); 1600be8f0785899b5f2305fb40e206a721baeecbc2f1mukesh agrawal ALOGV("%s: flags %u ", __FUNCTION__, 1601261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].flags); 1602261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 1603261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam for (wifiScanResultsInfo = (struct nlattr *) nla_data(tb2[ 1604261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_LIST]), 16050910ea7ebdb95e00b3173dee28a2f0b34f2a0233Amarnath Hullur Subramanyam remResults = nla_len(tb2[ 1606ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_LIST]); 16070910ea7ebdb95e00b3173dee28a2f0b34f2a0233Amarnath Hullur Subramanyam nla_ok(wifiScanResultsInfo, remResults); 16080910ea7ebdb95e00b3173dee28a2f0b34f2a0233Amarnath Hullur Subramanyam wifiScanResultsInfo = nla_next(wifiScanResultsInfo, &(remResults))) 1609261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam { 1610261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam struct nlattr *tb3[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX + 1]; 1611261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_parse(tb3, QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX, 1612261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam (struct nlattr *) nla_data(wifiScanResultsInfo), 1613261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_len(wifiScanResultsInfo), NULL); 1614261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (j < MAX_AP_CACHE_PER_SCAN) { 1615261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (! 1616261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[ 1617261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_TIME_STAMP 1618261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ]) 1619261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam { 16205ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: " 16215ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "RESULTS_SCAN_RESULT_TIME_STAMP not found", 16225ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 1623261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1624261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1625261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].ts = 1626261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_get_u64( 1627261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[ 1628261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_TIME_STAMP 1629261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ]); 1630261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (! 1631261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[ 1632261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_SSID 1633261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ]) 1634261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam { 16355ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: " 16365ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "RESULTS_SCAN_RESULT_SSID not found", 16375ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 1638261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1639261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1640261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam len = nla_len(tb3[ 1641261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_SSID]); 1642261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam len = 1643261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam sizeof(cached_results[i].results[j].ssid) <= len ? 1644261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam sizeof(cached_results[i].results[j].ssid) : len; 1645261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam memcpy((void *)&cached_results[i].results[j].ssid, 1646261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_data( 1647261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[ 1648261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_SSID]), 1649261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam len); 1650261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (! 1651261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[ 1652261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_BSSID 1653261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ]) 1654261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam { 16555ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: " 16565ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "RESULTS_SCAN_RESULT_BSSID not found", 16575ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 1658261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1659261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1660261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam len = nla_len( 1661261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[ 1662261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_BSSID]); 1663261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam len = 1664261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam sizeof(cached_results[i].results[j].bssid) <= len ? 1665261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam sizeof(cached_results[i].results[j].bssid) : len; 1666261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam memcpy(&cached_results[i].results[j].bssid, 1667261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_data( 1668261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[ 1669261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_BSSID]), 1670261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam len); 1671261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (! 1672261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[ 1673261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_CHANNEL 1674261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ]) 1675261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam { 16765ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: " 16775ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "RESULTS_SCAN_RESULT_CHANNEL not found", 16785ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 1679261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1680261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1681261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].channel = 1682261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_get_u32( 1683261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_CHANNEL]); 1684261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (! 1685261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[ 1686261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RSSI 1687261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ]) 1688261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam { 16895ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: " 16905ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "RESULTS_SCAN_RESULT_RSSI not found", 16915ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 1692261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1693261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1694261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].rssi = 1695261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam get_s32( 1696261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RSSI]); 1697261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (! 1698261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[ 1699261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RTT 1700261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ]) 1701261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam { 17025ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: " 17035ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "RESULTS_SCAN_RESULT_RTT not found", 17045ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 1705261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1706261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1707261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].rtt = 1708261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_get_u32( 1709261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RTT]); 1710261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (! 1711261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[ 1712261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RTT_SD 1713261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ]) 1714261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam { 17155ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: " 17165ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "RESULTS_SCAN_RESULT_RTT_SD not found", 17175ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 1718261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1719261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1720261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].rtt_sd = 1721261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam nla_get_u32( 1722261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam tb3[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RTT_SD]); 1723ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif#ifdef QC_HAL_DEBUG 1724ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Enable these prints for debugging if needed. */ 17255c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik ALOGD("%s: ts %" PRId64, __FUNCTION__, 1726261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].ts); 17275ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGD("%s: SSID %s ", __FUNCTION__, 1728261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].ssid); 17295c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik ALOGD("%s: BSSID: %02x:%02x:%02x:%02x:%02x:%02x \n", 17305c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik __FUNCTION__, cached_results[i].results[j].bssid[0], 1731261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].bssid[1], 1732261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].bssid[2], 1733261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].bssid[3], 1734261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].bssid[4], 1735261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].bssid[5]); 17365ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGD("%s: channel %d ", __FUNCTION__, 1737261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].channel); 17385ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGD("%s: rssi %d ", __FUNCTION__, 1739261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].rssi); 17405c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik ALOGD("%s: rtt %" PRId64, __FUNCTION__, 1741261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].rtt); 17425c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik ALOGD("%s: rtt_sd %" PRId64, __FUNCTION__, 1743261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].results[j].rtt_sd); 1744ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif#endif 1745ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Increment loop index for next record */ 1746ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif j++; 1747ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* For this scan id, update the wifiScanResultsStartingIndex 1748ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif * and number of cached results parsed so far. 1749ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif */ 1750ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif mGetCachedResultsRspParams->wifiScanResultsStartingIndex = j; 1751ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif cached_results[i].num_results++; 1752261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } else { 1753261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam /* We already parsed and stored up to max wifi_scan_results 1754261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam * specified by the caller. Now, continue to loop over NL 1755261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam * entries in order to properly update NL parsing pointer 1756261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam * so it points to the next scan_id results. 1757261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam */ 17585ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGD("%s: loop index:%d > max num" 1759261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam " of wifi_scan_results:%d for gscan cached results" 17605ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik " bucket:%d. Dummy loop", __FUNCTION__, 1761261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam j, MAX_AP_CACHE_PER_SCAN, i); 1762261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1763261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1764a58ccfb90f6608d378d04ee655113620afdf00bcmukesh agrawal ALOGV("%s: cached_results[%d].num_results: %d ", __FUNCTION__, 1765ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif i, cached_results[i].num_results); 1766ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Increment loop index for next cached scan result record */ 1767261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam i++; 1768261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 1769ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Increment starting index of filling cached results received */ 1770ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif if (mGetCachedResultsRspParams->num_cached_results) 1771ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif mGetCachedResultsRspParams->cachedResultsStartingIndex = 1772ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif mGetCachedResultsRspParams->num_cached_results - 1; 1773ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif return WIFI_SUCCESS; 1774e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam} 1775e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1776e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam/* Set the GSCAN BSSID Hotlist. */ 1777e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyamwifi_error wifi_set_epno_list(wifi_request_id id, 1778e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam wifi_interface_handle iface, 17790562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik const wifi_epno_params *epno_params, 1780e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam wifi_epno_handler handler) 1781e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam{ 17820562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik int i, ret = 0, num_networks; 1783e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam GScanCommand *gScanCommand; 1784e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam struct nlattr *nlData, *nlPnoParamList; 1785e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 1786e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 1787e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam hal_info *info = getHalInfo(wifiHandle); 1788864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gscan_event_handlers* event_handlers; 1789864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanSetPnoListCmdEventHandler; 1790864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam 1791864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers = (gscan_event_handlers*)info->gscan_handlers; 1792864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetPnoListCmdEventHandler = 1793864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers->gScanSetPnoListCmdEventHandler; 1794e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1795e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (!(info->supported_feature_set & WIFI_FEATURE_HAL_EPNO)) { 1796e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Enhanced PNO is not supported by the driver", 17975ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 1798e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 1799e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1800e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1801e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Wi-Fi HAL doesn't need to check if a similar request to set ePNO 1802e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam * list was made earlier. If wifi_set_epno_list() is called while 1803e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam * another one is running, the request will be sent down to driver and 1804e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam * firmware. If the new request is successfully honored, then Wi-Fi HAL 1805864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam * will use the new request id for the gScanSetPnoListCmdEventHandler 1806e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam * object. 1807e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam */ 1808e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1809e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand = 1810e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam new GScanCommand( 1811e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam wifiHandle, 1812e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam id, 1813e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam OUI_QCA, 1814e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_PNO_SET_LIST); 1815e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (gScanCommand == NULL) { 18165ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error GScanCommand NULL", __FUNCTION__); 1817e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 1818e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1819e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1820e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Create the NL message. */ 1821e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ret = gScanCommand->create(); 1822e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (ret < 0) { 18235ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Failed to create the NL msg. Error:%d", __FUNCTION__, ret); 1824e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 1825e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1826e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1827e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Set the interface Id of the message. */ 1828e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 1829e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (ret < 0) { 18305ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Failed to set iface id. Error:%d", __FUNCTION__, ret); 1831e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 1832e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1833e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1834e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 1835e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 1836e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (!nlData) { 1837e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Failed to add attribute NL80211_ATTR_VENDOR_DATA. Error:%d", 18385ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, ret); 1839e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 1840e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1841e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 18420562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik num_networks = (unsigned int)epno_params->num_networks > MAX_EPNO_NETWORKS ? 18430562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik MAX_EPNO_NETWORKS : epno_params->num_networks; 1844e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (gScanCommand->put_u32( 1845e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 1846e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam id) || 1847e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->put_u32( 18480562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik QCA_WLAN_VENDOR_ATTR_EPNO_MIN5GHZ_RSSI, 18490562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik epno_params->min5GHz_rssi) || 18500562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik gScanCommand->put_u32( 18510562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik QCA_WLAN_VENDOR_ATTR_EPNO_MIN24GHZ_RSSI, 18520562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik epno_params->min24GHz_rssi) || 18530562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik gScanCommand->put_u32( 18540562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik QCA_WLAN_VENDOR_ATTR_EPNO_INITIAL_SCORE_MAX, 18550562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik epno_params->initial_score_max) || 18560562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik gScanCommand->put_u32( 18570562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik QCA_WLAN_VENDOR_ATTR_EPNO_CURRENT_CONNECTION_BONUS, 18580562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik epno_params->current_connection_bonus) || 18590562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik gScanCommand->put_u32( 18600562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik QCA_WLAN_VENDOR_ATTR_EPNO_SAME_NETWORK_BONUS, 18610562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik epno_params->same_network_bonus) || 18620562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik gScanCommand->put_u32( 18630562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik QCA_WLAN_VENDOR_ATTR_EPNO_SECURE_BONUS, 18640562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik epno_params->secure_bonus) || 18650562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik gScanCommand->put_u32( 18660562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik QCA_WLAN_VENDOR_ATTR_EPNO_BAND5GHZ_BONUS, 18670562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik epno_params->band5GHz_bonus) || 18680562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik gScanCommand->put_u32( 1869e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_NUM_NETWORKS, 1870e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam num_networks)) 1871e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam { 18725ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Failed to add vendor atributes. Error:%d", __FUNCTION__, ret); 1873e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 1874e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1875e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1876e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 1877e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam nlPnoParamList = 1878e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->attr_start( 1879e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORKS_LIST); 1880e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (!nlPnoParamList) { 1881e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Failed to add attr. PNO_SET_LIST_PARAM_EPNO_NETWORKS_LIST. " 18825ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "Error:%d", __FUNCTION__, ret); 1883e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 1884e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1885e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1886e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Add nested NL attributes for ePno List. */ 1887e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam for (i = 0; i < num_networks; i++) { 18880562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik wifi_epno_network pnoNetwork = epno_params->networks[i]; 1889e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam struct nlattr *nlPnoNetwork = gScanCommand->attr_start(i); 1890e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (!nlPnoNetwork) { 1891e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Failed attr_start for nlPnoNetwork. Error:%d", 18925ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, ret); 1893e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 1894e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1895e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (gScanCommand->put_string( 1896e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_SSID, 1897e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam pnoNetwork.ssid) || 1898e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->put_u8( 1899e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_FLAGS, 1900e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam pnoNetwork.flags) || 1901e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->put_u8( 1902e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_AUTH_BIT, 1903e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam pnoNetwork.auth_bit_field)) 1904e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam { 1905e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Failed to add PNO_SET_LIST_PARAM_EPNO_NETWORK_*. " 19065ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "Error:%d", __FUNCTION__, ret); 1907e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 1908e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1909e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->attr_end(nlPnoNetwork); 1910e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1911e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1912e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->attr_end(nlPnoParamList); 1913e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1914e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 1915e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1916ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif GScanCallbackHandler callbackHandler; 1917ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif memset(&callbackHandler, 0, sizeof(callbackHandler)); 1918e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam callbackHandler.on_pno_network_found = handler.on_network_found; 1919e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1920e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Create an object of the event handler class to take care of the 1921e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam * asychronous events on the north-bound. 1922e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam */ 1923864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanSetPnoListCmdEventHandler == NULL) { 1924864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetPnoListCmdEventHandler = new GScanCommandEventHandler( 1925e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam wifiHandle, 1926e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam id, 1927e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam OUI_QCA, 1928e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_PNO_SET_LIST, 1929e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam callbackHandler); 1930864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanSetPnoListCmdEventHandler == NULL) { 1931e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Error instantiating " 1932864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam "gScanSetPnoListCmdEventHandler.", __FUNCTION__); 1933e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ret = WIFI_ERROR_UNKNOWN; 1934e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 1935e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1936864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers->gScanSetPnoListCmdEventHandler = 1937864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetPnoListCmdEventHandler; 1938e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } else { 19397325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanSetPnoListCmdEventHandler->setCallbackHandler(callbackHandler); 1940e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1941e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1942ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gScanCommand->requestResponse(); 1943e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (ret != 0) { 19445ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: requestResponse Error:%d",__FUNCTION__, ret); 1945e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 1946e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1947e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1948864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanSetPnoListCmdEventHandler != NULL) { 1949864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanSetPnoListCmdEventHandler->set_request_id(id); 19507325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanSetPnoListCmdEventHandler->enableEventHandling(); 1951e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1952e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 1953e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyamcleanup: 1954e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam delete gScanCommand; 19557325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam /* Disable Event Handling if ret != 0 */ 19567325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (ret && gScanSetPnoListCmdEventHandler) { 19577325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam ALOGI("%s: Error ret:%d, disable event handling", 19587325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam __FUNCTION__, ret); 19597325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanSetPnoListCmdEventHandler->disableEventHandling(); 1960e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 1961e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam return (wifi_error)ret; 1962e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam} 1963e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 19640562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik/* Reset the ePNO list - no ePNO networks should be matched after this */ 19650562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaikwifi_error wifi_reset_epno_list(wifi_request_id id, wifi_interface_handle iface) 19660562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik{ 19670562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik int ret = 0; 19680562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik GScanCommand *gScanCommand; 19690562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik struct nlattr *nlData; 19700562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik interface_info *ifaceInfo = getIfaceInfo(iface); 19710562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik wifi_handle wifiHandle = getWifiHandle(iface); 19720562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik hal_info *info = getHalInfo(wifiHandle); 19730562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik 19740562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik if (!(info->supported_feature_set & WIFI_FEATURE_HAL_EPNO)) { 19750562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik ALOGE("%s: Enhanced PNO is not supported by the driver", 19760562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik __FUNCTION__); 19770562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik return WIFI_ERROR_NOT_SUPPORTED; 19780562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik } 19790562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik 19800562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik gScanCommand = new GScanCommand(wifiHandle, 19810562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik id, 19820562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik OUI_QCA, 19830562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik QCA_NL80211_VENDOR_SUBCMD_PNO_SET_LIST); 19840562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik if (gScanCommand == NULL) { 19850562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik ALOGE("%s: Error GScanCommand NULL", __FUNCTION__); 19860562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik return WIFI_ERROR_UNKNOWN; 19870562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik } 19880562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik 19890562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik /* Create the NL message. */ 19900562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik ret = gScanCommand->create(); 19910562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik if (ret < 0) { 19920562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik ALOGE("%s: Failed to create the NL msg. Error:%d", __FUNCTION__, ret); 19930562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik goto cleanup; 19940562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik } 19950562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik 19960562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik /* Set the interface Id of the message. */ 19970562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik ret = gScanCommand->set_iface_id(ifaceInfo->name); 19980562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik if (ret < 0) { 19990562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik ALOGE("%s: Failed to set iface id. Error:%d", __FUNCTION__, ret); 20000562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik goto cleanup; 20010562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik } 20020562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik 20030562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik /* Add the vendor specific attributes for the NL command. */ 20040562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 20050562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik if (!nlData) { 20060562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik ALOGE("%s: Failed to add attribute NL80211_ATTR_VENDOR_DATA. Error:%d", 20070562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik __FUNCTION__, ret); 20080562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik goto cleanup; 20090562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik } 20100562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik 20110562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik if (gScanCommand->put_u32( 20120562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 20130562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik id) || 20140562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik gScanCommand->put_u32( 20150562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_NUM_NETWORKS, 20160562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik EPNO_NO_NETWORKS)) 20170562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik { 20180562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik ALOGE("%s: Failed to add vendor atributes Error:%d", __FUNCTION__, ret); 20190562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik goto cleanup; 20200562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik } 20210562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik 20220562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik gScanCommand->attr_end(nlData); 20230562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik 20240562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik ret = gScanCommand->requestResponse(); 20250562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik if (ret != 0) { 20260562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik ALOGE("%s: requestResponse Error:%d",__FUNCTION__, ret); 20270562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik } 20280562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik 20290562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaikcleanup: 20300562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik delete gScanCommand; 20310562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik return (wifi_error)ret; 20320562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik} 20330562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik 2034e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam/* Set the ePNO Passpoint List. */ 2035e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyamwifi_error wifi_set_passpoint_list(wifi_request_id id, 2036ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif wifi_interface_handle iface, int num, 2037ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif wifi_passpoint_network *networks, 2038ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif wifi_passpoint_event_handler handler) 2039e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam{ 20400919dfde526ab1f2996334835cbd176906e89d0eSrinivas Girigowda int i, ret = 0; 2041e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam GScanCommand *gScanCommand; 2042e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam struct nlattr *nlData, *nlPasspointNetworksParamList; 2043e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 2044e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 2045e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam hal_info *info = getHalInfo(wifiHandle); 2046864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gscan_event_handlers* event_handlers; 2047864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanPnoSetPasspointListCmdEventHandler; 2048864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam 2049864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers = (gscan_event_handlers*)info->gscan_handlers; 2050864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanPnoSetPasspointListCmdEventHandler = 2051864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers->gScanPnoSetPasspointListCmdEventHandler; 2052e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2053e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (!(info->supported_feature_set & WIFI_FEATURE_HAL_EPNO)) { 2054e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Enhanced PNO is not supported by the driver", 20555ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 2056e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 2057e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2058e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2059e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Wi-Fi HAL doesn't need to check if a similar request to set ePNO 2060e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam * passpoint list was made earlier. If wifi_set_passpoint_list() is called 2061e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam * while another one is running, the request will be sent down to driver and 2062e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam * firmware. If the new request is successfully honored, then Wi-Fi HAL 2063e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam * will use the new request id for the 2064864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam * gScanPnoSetPasspointListCmdEventHandler object. 2065e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam */ 2066e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand = 2067e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam new GScanCommand( 2068e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam wifiHandle, 2069e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam id, 2070e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam OUI_QCA, 2071e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_PNO_SET_PASSPOINT_LIST); 2072e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (gScanCommand == NULL) { 20735ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error GScanCommand NULL", __FUNCTION__); 2074e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 2075e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2076e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2077e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Create the NL message. */ 2078e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ret = gScanCommand->create(); 2079e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (ret < 0) { 20805ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Failed to create the NL msg. Error:%d", __FUNCTION__, ret); 2081e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2082e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2083e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2084e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Set the interface Id of the message. */ 2085e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 2086e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (ret < 0) { 20875ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Failed to set iface id. Error:%d", __FUNCTION__, ret); 2088e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2089e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2090e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2091e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 2092e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 2093e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (!nlData) { 2094e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Failed to add attribute NL80211_ATTR_VENDOR_DATA. Error:%d", 20955ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, ret); 2096e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2097e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2098e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2099e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (gScanCommand->put_u32( 2100e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, 2101e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam id) || 2102e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->put_u32( 2103e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_PNO_PASSPOINT_LIST_PARAM_NUM, 2104e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam num)) 2105e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam { 21065ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Failed to add vendor atributes. Error:%d", __FUNCTION__, ret); 2107e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2108e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2109e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2110e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 2111e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam nlPasspointNetworksParamList = 2112e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->attr_start( 2113e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_PNO_PASSPOINT_LIST_PARAM_NETWORK_ARRAY); 2114e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (!nlPasspointNetworksParamList) { 2115e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Failed attr_start for PASSPOINT_LIST_PARAM_NETWORK_ARRAY. " 21165ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "Error:%d", __FUNCTION__, ret); 2117e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2118e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2119e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2120e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Add nested NL attributes for Passpoint List param. */ 2121e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam for (i = 0; i < num; i++) { 2122e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam wifi_passpoint_network passpointNetwork = networks[i]; 2123e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam struct nlattr *nlPasspointNetworkParam = gScanCommand->attr_start(i); 2124e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (!nlPasspointNetworkParam) { 2125e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Failed attr_start for nlPasspointNetworkParam. " 21265ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "Error:%d", __FUNCTION__, ret); 2127e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2128e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2129e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (gScanCommand->put_u32( 2130e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_PNO_PASSPOINT_NETWORK_PARAM_ID, 2131e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam passpointNetwork.id) || 2132e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->put_string( 2133e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_PNO_PASSPOINT_NETWORK_PARAM_REALM, 2134e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam passpointNetwork.realm) || 2135e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->put_bytes( 2136e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_PNO_PASSPOINT_NETWORK_PARAM_ROAM_CNSRTM_ID, 2137e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam (char*)passpointNetwork.roamingConsortiumIds, 2138e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 16 * sizeof(int64_t)) || 2139e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->put_bytes( 2140e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_PNO_PASSPOINT_NETWORK_PARAM_ROAM_PLMN, 2141c31ec43dd246e3322b7248351eef561bb756e495Amarnath Hullur Subramanyam (char*)passpointNetwork.plmn, 3 * sizeof(u8))) 21428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 2143e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Failed to add PNO_PASSPOINT_NETWORK_PARAM_ROAM_* attr. " 21445ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "Error:%d", __FUNCTION__, ret); 2145e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2146b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 2147e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->attr_end(nlPasspointNetworkParam); 2148b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 2149e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2150e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->attr_end(nlPasspointNetworksParamList); 2151e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2152e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 2153e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2154ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif GScanCallbackHandler callbackHandler; 2155ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif memset(&callbackHandler, 0, sizeof(callbackHandler)); 2156e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam callbackHandler.on_passpoint_network_found = 2157e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam handler.on_passpoint_network_found; 2158ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 2159e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Create an object of the event handler class to take care of the 2160e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam * asychronous events on the north-bound. 2161e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam */ 2162864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanPnoSetPasspointListCmdEventHandler == NULL) { 2163864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanPnoSetPasspointListCmdEventHandler = new GScanCommandEventHandler( 2164e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam wifiHandle, 2165e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam id, 2166e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam OUI_QCA, 2167e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_PNO_SET_PASSPOINT_LIST, 2168e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam callbackHandler); 2169864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanPnoSetPasspointListCmdEventHandler == NULL) { 2170e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Error instantiating " 2171864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam "gScanPnoSetPasspointListCmdEventHandler.", __FUNCTION__); 2172e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ret = WIFI_ERROR_UNKNOWN; 2173e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2174e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2175864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers->gScanPnoSetPasspointListCmdEventHandler = 2176864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanPnoSetPasspointListCmdEventHandler; 2177e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } else { 21787325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanPnoSetPasspointListCmdEventHandler->setCallbackHandler(callbackHandler); 2179b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 2180e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2181ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gScanCommand->requestResponse(); 2182e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (ret != 0) { 21835ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: requestResponse Error:%d",__FUNCTION__, ret); 2184e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2185e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2186e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2187864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam if (gScanPnoSetPasspointListCmdEventHandler != NULL) { 2188864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanPnoSetPasspointListCmdEventHandler->set_request_id(id); 21897325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanPnoSetPasspointListCmdEventHandler->enableEventHandling(); 2190e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2191e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2192e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyamcleanup: 2193e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam delete gScanCommand; 21947325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam /* Disable Event Handling if ret != 0 */ 21957325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (ret && gScanPnoSetPasspointListCmdEventHandler) { 21967325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam ALOGI("%s: Error ret:%d, disable event handling", 21977325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam __FUNCTION__, ret); 21987325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanPnoSetPasspointListCmdEventHandler->disableEventHandling(); 2199e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2200e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam return (wifi_error)ret; 22018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2202b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2203e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyamwifi_error wifi_reset_passpoint_list(wifi_request_id id, 2204e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam wifi_interface_handle iface) 2205e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam{ 2206e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam int ret = 0; 2207e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam GScanCommand *gScanCommand; 2208e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam struct nlattr *nlData; 2209e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam interface_info *ifaceInfo = getIfaceInfo(iface); 2210e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam wifi_handle wifiHandle = getWifiHandle(iface); 2211e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam hal_info *info = getHalInfo(wifiHandle); 2212864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gscan_event_handlers* event_handlers; 2213864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam GScanCommandEventHandler *gScanPnoSetPasspointListCmdEventHandler; 2214864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam 2215864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers = (gscan_event_handlers*)info->gscan_handlers; 2216864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam gScanPnoSetPasspointListCmdEventHandler = 2217864f2a6901fe97d268d44c053b9fede65a821c51Amarnath Hullur Subramanyam event_handlers->gScanPnoSetPasspointListCmdEventHandler; 2218b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2219e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (!(info->supported_feature_set & WIFI_FEATURE_HAL_EPNO)) { 2220e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Enhanced PNO is not supported by the driver", 22215ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 2222e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam return WIFI_ERROR_NOT_SUPPORTED; 2223e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 22248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 22257325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (gScanPnoSetPasspointListCmdEventHandler == NULL || 22267325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam (gScanPnoSetPasspointListCmdEventHandler->isEventHandlingEnabled() == 22277325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam false)) { 2228e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("wifi_reset_passpoint_list: ePNO passpoint_list isn't set. " 222919f0819fa32aec7c330b4d7ca962700230c8acb1Amarnath Hullur Subramanyam "Nothing to do. Exit."); 2230e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam return WIFI_ERROR_NOT_AVAILABLE; 2231e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 22328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 2233e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand = new GScanCommand( 2234e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam wifiHandle, 2235e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam id, 2236e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam OUI_QCA, 2237e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_NL80211_VENDOR_SUBCMD_PNO_RESET_PASSPOINT_LIST); 2238b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2239e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (gScanCommand == NULL) { 22405ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Error GScanCommand NULL", __FUNCTION__); 2241e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam return WIFI_ERROR_UNKNOWN; 22428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 2243b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2244e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Create the NL message. */ 2245e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ret = gScanCommand->create(); 2246e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (ret < 0) { 22475ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Failed to create the NL msg. Error:%d", __FUNCTION__, ret); 2248e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2249e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2250e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2251e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Set the interface Id of the message. */ 2252e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ret = gScanCommand->set_iface_id(ifaceInfo->name); 2253e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (ret < 0) { 22545ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: Failed to set iface id. Error:%d", __FUNCTION__, ret); 2255e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2256e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2257e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2258e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam /* Add the vendor specific attributes for the NL command. */ 2259e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA); 2260e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (!nlData) { 2261e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Failed to add attribute NL80211_ATTR_VENDOR_DATA. Error:%d", 22625ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, ret); 2263e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2264e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2265e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2266e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ret = gScanCommand->put_u32( 2267e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, id); 2268e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (ret < 0) { 2269e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam ALOGE("%s: Failed to add vendor data attributes. Error:%d", 22705ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__, ret); 2271e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam goto cleanup; 2272e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2273e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2274e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam gScanCommand->attr_end(nlData); 2275e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2276ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif ret = gScanCommand->requestResponse(); 2277e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam if (ret != 0) { 22785ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: requestResponse Error:%d",__FUNCTION__, ret); 2279e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2280e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 22817325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam /* Disable Event Handling. */ 22827325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam if (gScanPnoSetPasspointListCmdEventHandler) { 22837325952cbfc88103197937b05c17c6e487e98cd9Amarnath Hullur Subramanyam gScanPnoSetPasspointListCmdEventHandler->disableEventHandling(); 2284e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam } 2285e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam 2286e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyamcleanup: 2287e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam delete gScanCommand; 2288e5c1439eb5547b792fb47905c0977bbed8d5d8acAmarnath Hullur Subramanyam return (wifi_error)ret; 22898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2290b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2291261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyamint GScanCommand::allocCachedResultsTemp(int max, 2292261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam wifi_cached_scan_results *cached_results) 2293261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam{ 2294261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam /* Alloc memory for "max" number of cached results. */ 2295261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam mGetCachedResultsRspParams->cached_results = 2296261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam (wifi_cached_scan_results*) 2297261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam malloc(max * sizeof(wifi_cached_scan_results)); 2298261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (!mGetCachedResultsRspParams->cached_results) { 2299261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam ALOGE("%s: Failed to allocate memory for " 23005ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik "mGetCachedResultsRspParams->cached_results.", 23015ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik __FUNCTION__); 2302261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam return WIFI_ERROR_OUT_OF_MEMORY; 2303261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 2304261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam memset(mGetCachedResultsRspParams->cached_results, 0, 2305261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam max * sizeof(wifi_cached_scan_results)); 2306261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 2307261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam mGetCachedResultsRspParams->max = max; 2308261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 2309261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam return WIFI_SUCCESS; 2310261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam} 2311261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 23128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* 23138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Allocates memory for the subCmd response struct and initializes status = -1 23148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 23158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::allocRspParams(eGScanRspRarams cmd) 23168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 23178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int ret = 0; 23188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam switch(cmd) 23198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 23208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanGetCachedResultsRspParams: 23218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams = (GScanGetCachedResultsRspParams *) 23228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam malloc(sizeof(GScanGetCachedResultsRspParams)); 23238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (!mGetCachedResultsRspParams) 23248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = -1; 23258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam else { 2326261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam mGetCachedResultsRspParams->num_cached_results = 0; 23278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams->more_data = false; 2328ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif mGetCachedResultsRspParams->cachedResultsStartingIndex = -1; 2329261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam mGetCachedResultsRspParams->lastProcessedScanId = -1; 2330261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam mGetCachedResultsRspParams->wifiScanResultsStartingIndex = -1; 2331261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam mGetCachedResultsRspParams->max = 0; 2332261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam mGetCachedResultsRspParams->cached_results = NULL; 23338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 23348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 23358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam default: 23365ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGD("%s: Wrong request for alloc.", __FUNCTION__); 23378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = -1; 2338b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 23398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return ret; 23408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2341b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 23428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::freeRspParams(eGScanRspRarams cmd) 23438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 23448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam switch(cmd) 23458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 23468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam case eGScanGetCachedResultsRspParams: 23478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if (mGetCachedResultsRspParams) { 2348261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (mGetCachedResultsRspParams->cached_results) { 2349261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam free(mGetCachedResultsRspParams->cached_results); 2350261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam mGetCachedResultsRspParams->cached_results = NULL; 23518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 23528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam free(mGetCachedResultsRspParams); 23538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mGetCachedResultsRspParams = NULL; 23548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 23558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam break; 23568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam default: 23575ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGD("%s: Wrong request for free.", __FUNCTION__); 23588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 23598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2360b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2361261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyamwifi_error GScanCommand::copyCachedScanResults( 2362ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif int *numResults, 2363261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam wifi_cached_scan_results *cached_results) 23648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{ 23658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam wifi_error ret = WIFI_SUCCESS; 2366261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam int i; 2367261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam wifi_cached_scan_results *cachedResultRsp; 2368b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 2369261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (mGetCachedResultsRspParams && cached_results) 23708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 2371ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif /* Populate the number of parsed cached results. */ 2372ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif *numResults = mGetCachedResultsRspParams->num_cached_results; 2373ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif 2374ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif for (i = 0; i < *numResults; i++) { 2375261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cachedResultRsp = &mGetCachedResultsRspParams->cached_results[i]; 2376261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].scan_id = cachedResultRsp->scan_id; 2377261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].flags = cachedResultRsp->flags; 2378261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].num_results = cachedResultRsp->num_results; 23790562eeb882b461595155d6ef3e10e563b0e451f5Subhani Shaik cached_results[i].buckets_scanned = cachedResultRsp->buckets_scanned; 2380261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 2381261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam if (!cached_results[i].num_results) { 23825ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGI("Error: cached_results[%d].num_results=0", i); 2383261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam continue; 2384261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 2385261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 23863ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("copyCachedScanResults: " 2387261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam "cached_results[%d].num_results : %d", 2388261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam i, cached_results[i].num_results); 2389261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam 2390261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam memcpy(cached_results[i].results, 2391261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cachedResultRsp->results, 2392261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam cached_results[i].num_results * sizeof(wifi_scan_result)); 2393261274640b093ef561076fe78a2c05cdaacda07aAmarnath Hullur Subramanyam } 23948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } else { 23955ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik ALOGE("%s: mGetCachedResultsRspParams is NULL", __FUNCTION__); 2396ebd0927520b5a5190c4b7f1b4e98fcfaea79ba6eAhmad Kholaif *numResults = 0; 23978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam ret = WIFI_ERROR_INVALID_ARGS; 23988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 23998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return ret; 24008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2401b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 24028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::setMaxChannels(int max_channels) { 24038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mMaxChannels = max_channels; 2404b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} 24058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 24068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::setChannels(int *channels) { 24078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mChannels = channels; 24088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 24098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 24108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::setNumChannelsPtr(int *num_channels) { 24118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam mNumChannelsPtr = num_channels; 24128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam} 2413