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